domflax 0.1.2 → 0.1.4

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 (46) hide show
  1. package/README.md +25 -8
  2. package/dist/{chunk-DNHOGPYV.js → chunk-3Z5ZWLXX.js} +407 -51
  3. package/dist/chunk-3Z5ZWLXX.js.map +1 -0
  4. package/dist/{chunk-DOQEBGWB.js → chunk-5FWENSD2.js} +63 -8
  5. package/dist/chunk-5FWENSD2.js.map +1 -0
  6. package/dist/chunk-EVENAJYI.js +336 -0
  7. package/dist/chunk-EVENAJYI.js.map +1 -0
  8. package/dist/{chunk-DWLB7FRR.js → chunk-H5KTGI3A.js} +153 -7
  9. package/dist/chunk-H5KTGI3A.js.map +1 -0
  10. package/dist/{chunk-6WVVF6AD.js → chunk-U5GOONKV.js} +5 -2
  11. package/dist/{chunk-6WVVF6AD.js.map → chunk-U5GOONKV.js.map} +1 -1
  12. package/dist/cli.cjs +995 -166
  13. package/dist/cli.cjs.map +1 -1
  14. package/dist/cli.js +245 -229
  15. package/dist/cli.js.map +1 -1
  16. package/dist/index.cjs +614 -68
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.cts +34 -18
  19. package/dist/index.d.ts +34 -18
  20. package/dist/index.js +4 -4
  21. package/dist/{pattern-F5xBtIE-.d.cts → pattern-CP9_HpVK.d.cts} +1 -1
  22. package/dist/{pattern-CV607P87.d.ts → pattern-CYgsv-jO.d.ts} +1 -1
  23. package/dist/pattern-kit.cjs.map +1 -1
  24. package/dist/pattern-kit.d.cts +2 -2
  25. package/dist/pattern-kit.d.ts +2 -2
  26. package/dist/pattern-kit.js +2 -2
  27. package/dist/{resolve-ops-DIwEelH-.d.ts → resolve-ops-Ci7LgYHC.d.cts} +9 -0
  28. package/dist/{resolve-ops-DIwEelH-.d.cts → resolve-ops-Ci7LgYHC.d.ts} +9 -0
  29. package/dist/verify.d.cts +1 -1
  30. package/dist/verify.d.ts +1 -1
  31. package/dist/verify.js +1 -1
  32. package/dist/webpack-loader.cjs +614 -68
  33. package/dist/webpack-loader.cjs.map +1 -1
  34. package/dist/webpack-loader.d.cts +2 -2
  35. package/dist/webpack-loader.d.ts +2 -2
  36. package/dist/webpack-loader.js +4 -4
  37. package/dist/worker.cjs +5955 -0
  38. package/dist/worker.cjs.map +1 -0
  39. package/dist/worker.d.cts +2 -0
  40. package/dist/worker.d.ts +2 -0
  41. package/dist/worker.js +72 -0
  42. package/dist/worker.js.map +1 -0
  43. package/package.json +4 -2
  44. package/dist/chunk-DNHOGPYV.js.map +0 -1
  45. package/dist/chunk-DOQEBGWB.js.map +0 -1
  46. package/dist/chunk-DWLB7FRR.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/webpack-loader.ts","../../../node_modules/tsup/assets/cjs_shims.js","../../core/src/builders.ts","../../core/src/ops/runtime.ts","../../core/src/ops/apply.ts","../../core/src/pass-context.ts","../../core/src/flatten-safety.ts","../../core/src/pass-manager.ts","../../core/src/pipeline.ts","../../core/src/reverse-emit.ts","../../pattern-kit/src/normalize.ts","../../pattern-kit/src/combinators.ts","../../pattern-kit/src/define.ts","../../pattern-kit/src/pattern.ts","../../patterns/src/library/flatten/display-contents-wrapper.pattern.ts","../../patterns/src/library/flatten/empty-style-div.pattern.ts","../../patterns/src/library/flatten/flex-center-wrapper.pattern.ts","../../patterns/src/library/flatten/inline-flex-center-wrapper.pattern.ts","../../patterns/src/library/flatten/nested-flex-merge.pattern.ts","../../patterns/src/library/flatten/nested-grid-merge.pattern.ts","../../patterns/src/library/flatten/passthrough-wrapper.pattern.ts","../../patterns/src/library/flatten/redundant-fragment.pattern.ts","../../patterns/src/library/flatten/redundant-inline-wrapper.pattern.ts","../../patterns/src/library/compress/border-radius-shorthand.pattern.ts","../../patterns/src/library/compress/border-shorthand.pattern.ts","../../patterns/src/library/compress/dedupe-classes.pattern.ts","../../patterns/src/library/compress/gap-shorthand.pattern.ts","../../patterns/src/library/compress/inset-shorthand.pattern.ts","../../patterns/src/library/compress/margin-shorthand.pattern.ts","../../patterns/src/library/compress/overflow-shorthand.pattern.ts","../../patterns/src/library/compress/overscroll-behavior-shorthand.pattern.ts","../../patterns/src/library/compress/padding-shorthand.pattern.ts","../../patterns/src/library/compress/place-shorthand.pattern.ts","../../patterns/src/library/compress/scroll-margin-shorthand.pattern.ts","../../patterns/src/library/compress/scroll-padding-shorthand.pattern.ts","../../patterns/src/library/compress/size-shorthand.pattern.ts","../../patterns/src/_registry.generated.ts","../../resolver-tailwind/src/tailwind/fingerprint.ts","../../resolver-tailwind/src/tailwind/emit.ts","../../resolver-tailwind/src/tailwind/engine.ts","../../resolver-tailwind/src/tailwind/selector.ts","../../resolver-tailwind/src/tailwind/extract.ts","../../resolver-tailwind/src/tailwind/serialize.ts","../../resolver-tailwind/src/tailwind/stylemap.ts","../../resolver-tailwind/src/tailwind/usage.ts","../../resolver-tailwind/src/tailwind/resolver.ts","../../resolver-css/src/constants.ts","../../resolver-css/src/engine.ts","../../resolver-css/src/postcss-helpers.ts","../../resolver-css/src/misc-helpers.ts","../../resolver-css/src/selector-helpers.ts","../../resolver-css/src/resolver.ts","../src/index.ts","../../frontend-jsx/src/frontend-ast.ts","../../frontend-jsx/src/frontend-parse.ts","../../frontend-jsx/src/frontend.ts","../../frontend-jsx/src/backend.ts","../src/pipeline-run.ts"],"sourcesContent":["/**\n * domflax webpack loader.\n *\n * A genuine webpack loader module: webpack requires this file by absolute path (wired by the\n * `domflax.webpack()` plugin, see {@link ./index.webpack}) and invokes the default export once per\n * matched `.jsx`/`.tsx` module. It runs the SAME single-file engine as {@link createDomflax} — so the\n * heavy Tailwind/postcss engines stay LAZY (constructed on first transform, only for the selected\n * provider), exactly as in the Vite adapter and the programmatic API.\n *\n * The loader is intentionally synchronous (the transform is a pure CPU function with no source map\n * yet) and structurally typed against webpack: it depends only on a minimal local `LoaderContext`\n * shape, never on the `webpack` package itself.\n */\nimport { createDomflax } from './index';\nimport type { Domflax, DomflaxOptions } from './index';\n\n/**\n * The slice of webpack's `LoaderContext` the domflax loader touches. Declared locally so this module\n * does not hard-depend on `webpack` types.\n */\nexport interface DomflaxLoaderContext {\n /** Absolute path of the module being transformed (no query suffix). */\n readonly resourcePath: string;\n /** Loader options passed via the `module.rule` `use[].options` entry. */\n getOptions?(): DomflaxOptions | undefined;\n}\n\n/**\n * Engine cache keyed by the serialized options, so a build reuses one configured engine (and its\n * one lazily-loaded resolver) across every transformed file instead of rebuilding per module.\n */\nconst engines = new Map<string, Domflax>();\n\nfunction engineFor(options: DomflaxOptions): Domflax {\n const key = JSON.stringify(options ?? {});\n let engine = engines.get(key);\n if (!engine) {\n engine = createDomflax(options);\n engines.set(key, engine);\n }\n return engine;\n}\n\n/**\n * webpack loader entry point. Returns the (possibly rewritten) source; non-jsx/tsx or unchanged\n * modules round-trip through {@link Domflax.transform} unchanged.\n */\nexport default function domflaxLoader(this: DomflaxLoaderContext, source: string): string {\n const options = this.getOptions?.() ?? {};\n const engine = engineFor(options);\n return engine.transform(source, this.resourcePath).code;\n}\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","/**\n * @domflax/core — runtime builders + traversal.\n *\n * Pure, dependency-free helpers to construct IR nodes, assemble an {@link IRDocument},\n * and walk the tree honouring {@link VisitSignal}. No heavy third-party deps: only the\n * type contract in `./types`.\n */\n\nimport type {\n AttrMap,\n Backref,\n BackrefTable,\n ClassList,\n ConditionKey,\n CssProperty,\n ExprRecord,\n ExprRef,\n ExprRegistry,\n FrontendKind,\n IdAllocator,\n IRComment,\n IRDocument,\n IRElement,\n IRExpr,\n IRFragment,\n IRNamespace,\n IRNode,\n IRNodeId,\n IRText,\n InlineStyle,\n NodeMeta,\n SafetyLevel,\n SourceSpan,\n StyleBlock,\n StyleCondition,\n StyleMap,\n Visitor,\n VisitContext,\n VisitSignal,\n} from './types';\n\n/* ───────────────────────── id / registry primitives ───────────────────────── */\n\n/** Monotonic IRNodeId allocator. `peek` reports the id `next()` would return. */\nexport function createIdAllocator(start = 1): IdAllocator {\n let n = start;\n return {\n next(): IRNodeId {\n const id = n;\n n += 1;\n return id as IRNodeId;\n },\n get peek(): IRNodeId {\n return n as IRNodeId;\n },\n };\n}\n\n/** Minimal in-memory ExprRegistry. */\nexport function createExprRegistry(start = 1): ExprRegistry {\n const map = new Map<ExprRef, ExprRecord>();\n let n = start;\n return {\n get(r: ExprRef): ExprRecord | undefined {\n return map.get(r);\n },\n intern(rec: Omit<ExprRecord, 'ref'>): ExprRef {\n const ref = n as ExprRef;\n n += 1;\n map.set(ref, { ...rec, ref });\n return ref;\n },\n releasePayloads(): void {\n for (const [k, v] of map) map.set(k, { ...v, payload: undefined });\n },\n };\n}\n\n/** Mutable BackrefTable: frontends register backrefs as they parse. */\nexport interface MutableBackrefTable extends BackrefTable {\n set(id: IRNodeId, backref: Backref): void;\n}\n\nexport function createBackrefTable(): MutableBackrefTable {\n const map = new Map<IRNodeId, Backref>();\n return {\n get(id: IRNodeId): Backref | undefined {\n return map.get(id);\n },\n span(id: IRNodeId): SourceSpan | null {\n return map.get(id)?.span ?? null;\n },\n childrenSpan(id: IRNodeId): SourceSpan | null {\n return map.get(id)?.innerSpan ?? null;\n },\n set(id: IRNodeId, backref: Backref): void {\n map.set(id, backref);\n },\n };\n}\n\n/* ───────────────────────── default sub-structures ───────────────────────── */\n\n/** A NodeMeta with every barrier/flag cleared. */\nexport function defaultMeta(safetyFloor: SafetyLevel = 0): NodeMeta {\n return {\n hasRef: false,\n hasEventHandlers: false,\n hasKey: false,\n hasSpreadAttrs: false,\n hasDynamicChildren: false,\n isComponent: false,\n hasDangerousHtml: false,\n targetedByCombinator: false,\n targetedByStructuralPseudo: false,\n selectorDependents: 0,\n hasOwnVisualStyle: false,\n establishesBox: false,\n establishesStackingContext: false,\n isContainingBlock: false,\n establishesFormattingContext: false,\n declaresCustomProperties: false,\n whitespaceSensitive: false,\n touched: false,\n synthetic: false,\n safetyFloor,\n };\n}\n\n/** Canonical base style condition (`media:'' states:[] pseudoElement:''`). */\nexport const BASE_CONDITION: StyleCondition = { media: '', states: [], pseudoElement: '' };\n\n/** Stable serialization of a StyleCondition into a ConditionKey. */\nexport function conditionKey(c: StyleCondition): ConditionKey {\n const states = [...c.states].sort().join(',');\n return `${c.media}|${states}|${c.pseudoElement}` as ConditionKey;\n}\n\nexport const BASE_CONDITION_KEY: ConditionKey = conditionKey(BASE_CONDITION);\n\n/** An empty StyleMap (no blocks). */\nexport function emptyStyleMap(): StyleMap {\n return { blocks: new Map<ConditionKey, StyleBlock>() };\n}\n\n/** An empty (absent) ClassList. */\nexport function emptyClassList(): ClassList {\n return {\n form: 'absent',\n segments: [],\n valueSpan: null,\n hasDynamic: false,\n opaque: false,\n rewritable: false,\n };\n}\n\n/** An empty AttrMap. */\nexport function emptyAttrMap(): AttrMap {\n return { entries: new Map(), spreads: [], order: [] };\n}\n\n/** An empty InlineStyle. */\nexport function emptyInlineStyle(): InlineStyle {\n return { decls: new Map<CssProperty, never>() as InlineStyle['decls'], dynamic: null };\n}\n\n/* ───────────────────────── node factories ───────────────────────── */\n\nexport interface ElementInit {\n readonly tag: string;\n readonly namespace?: IRNamespace;\n readonly isComponent?: boolean;\n readonly selfClosing?: boolean;\n readonly classes?: ClassList;\n readonly inlineStyle?: InlineStyle;\n readonly computed?: StyleMap;\n readonly attrs?: AttrMap;\n readonly children?: IRNodeId[];\n readonly parent?: IRNodeId | null;\n readonly span?: SourceSpan | null;\n readonly meta?: NodeMeta;\n}\n\nexport function createElement(id: IRNodeId, init: ElementInit): IRElement {\n return {\n id,\n kind: 'element',\n parent: init.parent ?? null,\n span: init.span ?? null,\n meta: init.meta ?? defaultMeta(),\n tag: init.tag,\n namespace: init.namespace ?? 'html',\n isComponent: init.isComponent ?? false,\n selfClosing: init.selfClosing ?? false,\n classes: init.classes ?? emptyClassList(),\n inlineStyle: init.inlineStyle ?? emptyInlineStyle(),\n computed: init.computed ?? emptyStyleMap(),\n attrs: init.attrs ?? emptyAttrMap(),\n children: init.children ?? [],\n };\n}\n\nexport function createText(\n id: IRNodeId,\n value: string,\n opts?: { collapsible?: boolean; parent?: IRNodeId | null; span?: SourceSpan | null },\n): IRText {\n return {\n id,\n kind: 'text',\n parent: opts?.parent ?? null,\n span: opts?.span ?? null,\n meta: defaultMeta(),\n value,\n collapsible: opts?.collapsible ?? true,\n };\n}\n\nexport function createExpr(\n id: IRNodeId,\n expr: ExprRef,\n opts?: { parent?: IRNodeId | null; span?: SourceSpan | null },\n): IRExpr {\n return {\n id,\n kind: 'expr',\n parent: opts?.parent ?? null,\n span: opts?.span ?? null,\n meta: defaultMeta(),\n expr,\n };\n}\n\nexport function createFragment(\n id: IRNodeId,\n opts?: { children?: IRNodeId[]; parent?: IRNodeId | null; span?: SourceSpan | null },\n): IRFragment {\n return {\n id,\n kind: 'fragment',\n parent: opts?.parent ?? null,\n span: opts?.span ?? null,\n meta: defaultMeta(),\n children: opts?.children ?? [],\n };\n}\n\nexport function createComment(\n id: IRNodeId,\n value: string,\n opts?: { parent?: IRNodeId | null; span?: SourceSpan | null },\n): IRComment {\n return {\n id,\n kind: 'comment',\n parent: opts?.parent ?? null,\n span: opts?.span ?? null,\n meta: defaultMeta(),\n value,\n };\n}\n\n/** Build an empty document whose root is a fresh fragment. */\nexport function createDocument(frontend: FrontendKind): IRDocument {\n const alloc = createIdAllocator();\n const rootId = alloc.next();\n const root = createFragment(rootId);\n const nodes = new Map<IRNodeId, IRNode>([[rootId, root]]);\n return {\n root: rootId,\n nodes,\n exprs: createExprRegistry(),\n sources: new Map(),\n backref: createBackrefTable(),\n frontend,\n alloc,\n };\n}\n\n/* ───────────────────────── tree accessors ───────────────────────── */\n\n/** Returns the child id list for container nodes, or an empty array. */\nexport function childIds(node: IRNode): readonly IRNodeId[] {\n return node.kind === 'element' || node.kind === 'fragment' ? node.children : [];\n}\n\n/** Returns the node, or undefined. */\nexport function getNode(doc: IRDocument, id: IRNodeId): IRNode | undefined {\n return doc.nodes.get(id);\n}\n\n/** Returns the node iff it is an element. */\nexport function getElement(doc: IRDocument, id: IRNodeId): IRElement | undefined {\n const n = doc.nodes.get(id);\n return n && n.kind === 'element' ? n : undefined;\n}\n\n/** Pre-order list of every element id reachable from the root. */\nexport function elementIds(doc: IRDocument): IRNodeId[] {\n const out: IRNodeId[] = [];\n const visit = (id: IRNodeId): void => {\n const n = doc.nodes.get(id);\n if (!n) return;\n if (n.kind === 'element') out.push(id);\n for (const c of childIds(n)) visit(c);\n };\n visit(doc.root);\n return out;\n}\n\n/* ───────────────────────── traversal ───────────────────────── */\n\n/**\n * Depth-first pre/post-order walk. `enter` may return `'skip'` (don't descend) or `'stop'`\n * (abort the whole walk); `exit` may return `'stop'`. The visitor receives a live {@link IRNode}\n * plus a {@link VisitContext} exposing depth and the parent node.\n */\nexport function walk(doc: IRDocument, visitor: Visitor): void {\n const roDoc = doc as unknown as VisitContext['doc'];\n let stopped = false;\n\n const visit = (id: IRNodeId, depth: number): void => {\n if (stopped) return;\n const node = doc.nodes.get(id);\n if (!node) return;\n\n const ctx: VisitContext = {\n doc: roDoc,\n depth,\n parent(): IRNode | null {\n return node.parent == null ? null : doc.nodes.get(node.parent) ?? null;\n },\n };\n\n const entered: VisitSignal = visitor.enter ? visitor.enter(node, ctx) : undefined;\n if (entered === 'stop') {\n stopped = true;\n return;\n }\n if (entered !== 'skip') {\n for (const child of childIds(node)) {\n visit(child, depth + 1);\n if (stopped) return;\n }\n }\n\n const exited: VisitSignal = visitor.exit ? visitor.exit(node, ctx) : undefined;\n if (exited === 'stop') stopped = true;\n };\n\n visit(doc.root, 0);\n}\n","/**\n * @domflax/core — applier runtime helpers (shared by the per-op handlers in `./apply`).\n *\n * Pure, dependency-free building blocks for the trusted mutator: input-preserving cloning, the\n * mutable apply state, small tree helpers, detached-spec materialization, and style merging.\n * Only depends on the `../types` contract and `../builders` runtime helpers.\n */\n\nimport type {\n ApplyContext,\n ApplyResult,\n AttrMap,\n AttrValue,\n ConditionKey,\n CssProperty,\n Diagnostic,\n DiagnosticCode,\n ElementSpec,\n IRDocument,\n IRNode,\n IRNodeId,\n NodeSpec,\n RewriteOp,\n SkippedOpGroup,\n StyleBlock,\n StyleConflictPolicy,\n StyleDecl,\n StyleMap,\n} from '../types';\n\nimport {\n createComment,\n createElement,\n createExpr,\n createFragment,\n createText,\n defaultMeta,\n} from '../builders';\n\n/* ───────────────────────── result of an apply run ───────────────────────── */\n\nexport interface ApplyOutcome {\n /** The new document (the input doc is never mutated). */\n readonly doc: IRDocument;\n readonly result: ApplyResult;\n}\n\nexport interface MutState {\n readonly doc: IRDocument;\n readonly touched: Set<IRNodeId>;\n readonly removed: Set<IRNodeId>;\n readonly created: Set<IRNodeId>;\n readonly diagnostics: Diagnostic[];\n readonly skipped: SkippedOpGroup[];\n appliedGroups: number;\n readonly ceiling: number;\n readonly ctx: ApplyContext;\n}\n\n/* ───────────────────────── cloning (keep input pure) ───────────────────────── */\n\nexport function cloneStyleMap(sm: StyleMap): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n blocks.set(key, {\n condition: block.condition,\n decls: new Map<CssProperty, StyleDecl>(block.decls),\n });\n }\n return { blocks };\n}\n\nfunction cloneNode(node: IRNode): IRNode {\n const meta = { ...node.meta };\n switch (node.kind) {\n case 'element':\n return {\n ...node,\n meta,\n children: [...node.children],\n computed: cloneStyleMap(node.computed),\n };\n case 'fragment':\n return { ...node, meta, children: [...node.children] };\n default:\n return { ...node, meta };\n }\n}\n\n/** Shallow-immutable clone: input doc and its node objects are never mutated. */\nexport function cloneDocument(doc: IRDocument): IRDocument {\n const nodes = new Map<IRNodeId, IRNode>();\n for (const [id, n] of doc.nodes) nodes.set(id, cloneNode(n));\n return {\n root: doc.root,\n nodes,\n exprs: doc.exprs,\n sources: doc.sources,\n backref: doc.backref,\n frontend: doc.frontend,\n alloc: doc.alloc,\n };\n}\n\n/* ───────────────────────── small helpers ───────────────────────── */\n\nexport function diag(\n code: DiagnosticCode,\n message: string,\n extra?: Partial<Diagnostic>,\n): Diagnostic {\n return { code, severity: 'warn', message, ...extra };\n}\n\nexport function getParentChildren(doc: IRDocument, id: IRNodeId): IRNodeId[] | null {\n const node = doc.nodes.get(id);\n if (!node || node.parent == null) return null;\n const parent = doc.nodes.get(node.parent);\n if (!parent) return null;\n if (parent.kind === 'element' || parent.kind === 'fragment') return parent.children;\n return null;\n}\n\nexport function indexInParent(doc: IRDocument, id: IRNodeId): number {\n const siblings = getParentChildren(doc, id);\n return siblings ? siblings.indexOf(id) : -1;\n}\n\nexport function markTouched(state: MutState, id: IRNodeId): void {\n const n = state.doc.nodes.get(id);\n if (n) {\n n.meta.touched = true;\n state.touched.add(id);\n }\n}\n\nexport function removeSubtree(state: MutState, id: IRNodeId): void {\n const node = state.doc.nodes.get(id);\n if (!node) return;\n if (node.kind === 'element' || node.kind === 'fragment') {\n for (const child of [...node.children]) removeSubtree(state, child);\n }\n state.doc.nodes.delete(id);\n state.removed.add(id);\n}\n\nexport function precond(op: RewriteOp, nodeId: IRNodeId, message: string): Diagnostic {\n return diag('DF_OP_PRECONDITION_FAILED', message, {\n nodeId,\n pattern: op.origin.pattern,\n severity: 'error',\n });\n}\n\nexport function primaryTarget(op: RewriteOp): IRNodeId | null {\n switch (op.op) {\n case 'removeNode':\n case 'unwrap':\n case 'replaceWith':\n case 'wrap':\n case 'moveNode':\n case 'setClassList':\n case 'mergeStyle':\n return op.target;\n case 'insertBefore':\n case 'insertAfter':\n return op.anchor;\n case 'mergeSiblings':\n return op.first;\n case 'foldInheritedStyles':\n return op.from;\n }\n}\n\n/* ───────────────────────── spec materialization ───────────────────────── */\n\nfunction specToAttrs(map: ReadonlyMap<string, string | boolean> | undefined): AttrMap {\n if (!map || map.size === 0) return { entries: new Map(), spreads: [], order: [] };\n const entries = new Map<string, AttrValue>();\n const order: string[] = [];\n for (const [k, v] of map) {\n entries.set(k, { kind: 'static', value: v });\n order.push(k);\n }\n return { entries, spreads: [], order };\n}\n\n/** Materialize a detached {@link NodeSpec} into live nodes; returns the new (or reused) id. */\nexport function materialize(state: MutState, spec: NodeSpec, parent: IRNodeId | null): IRNodeId {\n const { doc } = state;\n if (spec.kind === 'ref') {\n const existing = doc.nodes.get(spec.ref);\n if (existing) existing.parent = parent;\n return spec.ref;\n }\n\n const id = doc.alloc.next();\n state.created.add(id);\n switch (spec.kind) {\n case 'element': {\n const childIds: IRNodeId[] = [];\n const el = createElement(id, {\n tag: spec.tag,\n namespace: spec.namespace,\n selfClosing: spec.selfClosing,\n attrs: specToAttrs(spec.attrs),\n parent,\n meta: { ...defaultMeta(), synthetic: true },\n });\n if (spec.classes) el.computed = cloneStyleMap(spec.classes);\n doc.nodes.set(id, el);\n for (const child of spec.children ?? []) {\n childIds.push(materialize(state, child, id));\n }\n el.children = childIds;\n return id;\n }\n case 'text': {\n const t = createText(id, spec.value, { parent });\n t.meta.synthetic = true;\n doc.nodes.set(id, t);\n return id;\n }\n case 'expr': {\n const e = createExpr(id, spec.expr, { parent });\n e.meta.synthetic = true;\n doc.nodes.set(id, e);\n return id;\n }\n case 'comment': {\n const c = createComment(id, spec.value, { parent });\n c.meta.synthetic = true;\n doc.nodes.set(id, c);\n return id;\n }\n case 'fragment': {\n const frag = createFragment(id, { parent });\n frag.meta.synthetic = true;\n doc.nodes.set(id, frag);\n const childIds: IRNodeId[] = [];\n for (const child of spec.children) childIds.push(materialize(state, child, id));\n frag.children = childIds;\n return id;\n }\n }\n}\n\nexport function elementSpecToNode(\n state: MutState,\n spec: ElementSpec,\n parent: IRNodeId | null,\n): IRNodeId {\n return materialize(state, spec, parent);\n}\n\n/* ───────────────────────── style merging ───────────────────────── */\n\nexport function isInherited(state: MutState, decl: StyleDecl): boolean {\n if (decl.inherited) return true;\n const table = state.ctx.normalizer?.inherited;\n if (table) {\n try {\n return table.isInherited(decl.property);\n } catch {\n return decl.inherited;\n }\n }\n return decl.inherited;\n}\n\nexport interface MergeReport {\n readonly map: StyleMap;\n readonly conflict: boolean;\n}\n\n/** Merge `source` decls into `target`, condition-by-condition, per the conflict policy. */\nexport function mergeStyleMaps(\n target: StyleMap,\n source: StyleMap,\n policy: StyleConflictPolicy,\n): MergeReport {\n // Mutable working copy; returned (widened) as an immutable StyleMap.\n const blocks = new Map<ConditionKey, StyleBlock>(cloneStyleMap(target).blocks);\n let conflict = false;\n\n for (const [key, srcBlock] of source.blocks) {\n const existing = blocks.get(key);\n if (!existing) {\n blocks.set(key, {\n condition: srcBlock.condition,\n decls: new Map<CssProperty, StyleDecl>(srcBlock.decls),\n });\n continue;\n }\n const decls = new Map<CssProperty, StyleDecl>(existing.decls);\n for (const [prop, srcDecl] of srcBlock.decls) {\n const had = decls.get(prop);\n if (had && had.value !== srcDecl.value) {\n conflict = true;\n if (policy === 'target-wins') continue;\n // 'abort' is handled by the caller before commit; 'source-wins' falls through.\n }\n if (policy === 'target-wins' && had) continue;\n decls.set(prop, srcDecl);\n }\n blocks.set(key, { condition: existing.condition, decls });\n }\n return { map: { blocks }, conflict };\n}\n","/**\n * @domflax/core — the per-op handlers + public apply entry points.\n *\n * {@link applyOps} validates each {@link RewriteOp} against the safety ceiling / node-local floor\n * and commits it to a clone of the document; {@link applyGroups} commits whole {@link RewriteGroup}s\n * atomically. Rejected ops are collected into {@link ApplyResult.skipped} rather than throwing.\n */\n\nimport type {\n ApplyContext,\n ApplyResult,\n ConditionKey,\n CssProperty,\n Diagnostic,\n IRDocument,\n IRNodeId,\n RewriteGroup,\n RewriteOp,\n SkippedOpGroup,\n StyleBlock,\n StyleDecl,\n} from '../types';\n\nimport { BASE_CONDITION_KEY } from '../builders';\n\nimport {\n cloneDocument,\n cloneStyleMap,\n diag,\n elementSpecToNode,\n getParentChildren,\n isInherited,\n markTouched,\n materialize,\n mergeStyleMaps,\n precond,\n primaryTarget,\n removeSubtree,\n type ApplyOutcome,\n type MutState,\n} from './runtime';\n\nexport type { ApplyOutcome } from './runtime';\nexport { cloneDocument } from './runtime';\n\n/* ───────────────────────── per-op handlers ───────────────────────── */\n\nfunction safetyOk(state: MutState, op: RewriteOp, targetId: IRNodeId): Diagnostic | null {\n const opSafety = op.origin.safety;\n if (opSafety > state.ceiling) {\n return diag(\n 'DF_SAFETY_CEILING_EXCEEDED',\n `op '${op.op}' safety ${opSafety} exceeds ceiling ${state.ceiling}`,\n { nodeId: targetId, pattern: op.origin.pattern, severity: 'error' },\n );\n }\n const node = state.doc.nodes.get(targetId);\n if (node && opSafety > node.meta.safetyFloor) {\n return diag(\n 'DF_SAFETY_CEILING_EXCEEDED',\n `op '${op.op}' safety ${opSafety} exceeds node ${targetId} floor ${node.meta.safetyFloor}`,\n { nodeId: targetId, pattern: op.origin.pattern, severity: 'error' },\n );\n }\n return null;\n}\n\n/** Returns a list of validation issues; empty ⇒ the op was applied. */\nfunction applyOne(state: MutState, op: RewriteOp): Diagnostic[] {\n const { doc } = state;\n\n const primary = primaryTarget(op);\n if (primary != null) {\n if (!doc.nodes.get(primary)) {\n return [\n diag('DF_OP_PRECONDITION_FAILED', `target node ${primary} not found`, {\n nodeId: primary,\n pattern: op.origin.pattern,\n severity: 'error',\n }),\n ];\n }\n const safety = safetyOk(state, op, primary);\n if (safety) return [safety];\n }\n\n switch (op.op) {\n case 'removeNode': {\n const siblings = getParentChildren(doc, op.target);\n if (siblings) {\n const i = siblings.indexOf(op.target);\n if (i >= 0) siblings.splice(i, 1);\n }\n removeSubtree(state, op.target);\n return [];\n }\n\n case 'unwrap': {\n const node = doc.nodes.get(op.target);\n if (!node || (node.kind !== 'element' && node.kind !== 'fragment')) {\n return [precond(op, op.target, 'unwrap target is not a container')];\n }\n const siblings = getParentChildren(doc, op.target);\n if (!siblings) return [precond(op, op.target, 'unwrap target has no parent')];\n const at = siblings.indexOf(op.target);\n const kids = node.children;\n for (const k of kids) {\n const kn = doc.nodes.get(k);\n if (kn) kn.parent = node.parent;\n }\n siblings.splice(at, 1, ...kids);\n doc.nodes.delete(op.target);\n state.removed.add(op.target);\n if (node.parent != null) markTouched(state, node.parent);\n return [];\n }\n\n case 'replaceWith': {\n const siblings = getParentChildren(doc, op.target);\n if (!siblings) return [precond(op, op.target, 'replaceWith target has no parent')];\n const at = siblings.indexOf(op.target);\n const parentId = doc.nodes.get(op.target)?.parent ?? null;\n const newId = materialize(state, op.replacement, parentId);\n siblings.splice(at, 1, newId);\n removeSubtree(state, op.target);\n if (parentId != null) markTouched(state, parentId);\n return [];\n }\n\n case 'wrap': {\n const siblings = getParentChildren(doc, op.target);\n if (!siblings) return [precond(op, op.target, 'wrap target has no parent')];\n const at = siblings.indexOf(op.target);\n const parentId = doc.nodes.get(op.target)?.parent ?? null;\n const wrapperId = elementSpecToNode(state, op.wrapper, parentId);\n const wrapper = doc.nodes.get(wrapperId);\n const targetNode = doc.nodes.get(op.target);\n if (wrapper && (wrapper.kind === 'element' || wrapper.kind === 'fragment')) {\n wrapper.children.push(op.target);\n }\n if (targetNode) targetNode.parent = wrapperId;\n siblings.splice(at, 1, wrapperId);\n return [];\n }\n\n case 'insertBefore':\n case 'insertAfter': {\n const siblings = getParentChildren(doc, op.anchor);\n if (!siblings) return [precond(op, op.anchor, 'insert anchor has no parent')];\n const at = siblings.indexOf(op.anchor);\n const parentId = doc.nodes.get(op.anchor)?.parent ?? null;\n const newId = materialize(state, op.node, parentId);\n siblings.splice(op.op === 'insertBefore' ? at : at + 1, 0, newId);\n if (parentId != null) markTouched(state, parentId);\n return [];\n }\n\n case 'moveNode': {\n const newParent = doc.nodes.get(op.newParent);\n if (!newParent || (newParent.kind !== 'element' && newParent.kind !== 'fragment')) {\n return [precond(op, op.newParent, 'moveNode newParent is not a container')];\n }\n const siblings = getParentChildren(doc, op.target);\n if (siblings) {\n const i = siblings.indexOf(op.target);\n if (i >= 0) siblings.splice(i, 1);\n }\n const target = doc.nodes.get(op.target);\n if (target) target.parent = op.newParent;\n const idx = Math.max(0, Math.min(op.index, newParent.children.length));\n newParent.children.splice(idx, 0, op.target);\n markTouched(state, op.newParent);\n return [];\n }\n\n case 'mergeSiblings': {\n const first = doc.nodes.get(op.first);\n const second = doc.nodes.get(op.second);\n if (!first || !second) return [precond(op, op.first, 'mergeSiblings node missing')];\n if (\n (first.kind === 'element' || first.kind === 'fragment') &&\n (second.kind === 'element' || second.kind === 'fragment')\n ) {\n for (const c of second.children) {\n const cn = doc.nodes.get(c);\n if (cn) cn.parent = op.first;\n first.children.push(c);\n }\n second.children = [];\n }\n const siblings = getParentChildren(doc, op.second);\n if (siblings) {\n const i = siblings.indexOf(op.second);\n if (i >= 0) siblings.splice(i, 1);\n }\n doc.nodes.delete(op.second);\n state.removed.add(op.second);\n markTouched(state, op.first);\n return [];\n }\n\n case 'setClassList': {\n const el = doc.nodes.get(op.target);\n if (!el || el.kind !== 'element') {\n return [precond(op, op.target, 'setClassList target is not an element')];\n }\n el.computed = cloneStyleMap(op.style);\n markTouched(state, op.target);\n return [];\n }\n\n case 'mergeStyle': {\n const el = doc.nodes.get(op.target);\n if (!el || el.kind !== 'element') {\n return [precond(op, op.target, 'mergeStyle target is not an element')];\n }\n const report = mergeStyleMaps(el.computed, op.style, op.onConflict);\n if (report.conflict && op.onConflict === 'abort') {\n return [\n diag('DF_STYLE_CONFLICT_UNRESOLVED', `mergeStyle aborted on conflict at ${op.target}`, {\n nodeId: op.target,\n pattern: op.origin.pattern,\n severity: 'error',\n }),\n ];\n }\n el.computed = report.map;\n if (op.source != null) {\n const src = doc.nodes.get(op.source);\n if (src) markTouched(state, op.source);\n }\n markTouched(state, op.target);\n return [];\n }\n\n case 'foldInheritedStyles':\n return applyFold(state, op);\n }\n}\n\nfunction applyFold(\n state: MutState,\n op: Extract<RewriteOp, { op: 'foldInheritedStyles' }>,\n): Diagnostic[] {\n const { doc } = state;\n const from = doc.nodes.get(op.from);\n if (!from || from.kind !== 'element') {\n return [precond(op, op.from, 'fold source is not an element')];\n }\n const issues: Diagnostic[] = [];\n const onlyProps: ReadonlySet<CssProperty> | null =\n op.properties === 'all-inherited' ? null : new Set(op.properties);\n\n const conditionKeys =\n op.conditions === 'all'\n ? [...from.computed.blocks.keys()]\n : [BASE_CONDITION_KEY];\n\n for (const intoId of op.into) {\n const into = doc.nodes.get(intoId);\n if (!into || into.kind !== 'element') {\n issues.push(precond(op, intoId, 'fold target is not an element'));\n continue;\n }\n // Mutable working copy; assigned back (widened) as an immutable StyleMap.\n const nextBlocks = new Map<ConditionKey, StyleBlock>(cloneStyleMap(into.computed).blocks);\n let folded = false;\n\n for (const key of conditionKeys) {\n const srcBlock = from.computed.blocks.get(key);\n if (!srcBlock) continue;\n const dstBlock = nextBlocks.get(key);\n const decls = dstBlock\n ? new Map<CssProperty, StyleDecl>(dstBlock.decls)\n : new Map<CssProperty, StyleDecl>();\n\n for (const [prop, decl] of srcBlock.decls) {\n if (onlyProps && !onlyProps.has(prop)) continue;\n if (!isInherited(state, decl)) continue;\n if (decl.relativeToParent) {\n issues.push(\n diag(\n 'DF_RELATIVE_UNIT_FOLD',\n `refused to fold relative-unit declaration '${decl.property}' onto ${intoId}`,\n { nodeId: intoId, pattern: op.origin.pattern, severity: 'warn' },\n ),\n );\n continue;\n }\n if (!decls.has(prop)) {\n decls.set(prop, decl);\n folded = true;\n }\n }\n nextBlocks.set(key, { condition: srcBlock.condition, decls });\n }\n\n if (folded) {\n into.computed = { blocks: nextBlocks };\n markTouched(state, intoId);\n }\n }\n // Non-blocking (DF_RELATIVE_UNIT_FOLD) diagnostics are recorded but do not skip the op.\n for (const d of issues) state.diagnostics.push(d);\n return [];\n}\n\n/* ───────────────────────── public entry points ───────────────────────── */\n\n/**\n * Apply a flat list of ops to a copy of `doc`. The input document is never mutated.\n * Each op is independently validated; failing ops are skipped (collected in\n * {@link ApplyResult.skipped}) instead of throwing.\n */\nexport function applyOps(\n doc: IRDocument,\n ops: readonly RewriteOp[],\n ctx?: Partial<ApplyContext>,\n): ApplyOutcome {\n const cloned = cloneDocument(doc);\n const state: MutState = {\n doc: cloned,\n touched: new Set(),\n removed: new Set(),\n created: new Set(),\n diagnostics: [],\n skipped: [],\n appliedGroups: 0,\n ceiling: ctx?.safetyCeiling ?? 3,\n ctx: { doc: cloned, safetyCeiling: ctx?.safetyCeiling ?? 3, ...ctx } as ApplyContext,\n };\n\n for (const op of ops) {\n const issues = applyOne(state, op);\n if (issues.length > 0) {\n state.skipped.push({\n group: { pattern: op.origin.pattern, anchor: primaryTarget(op) ?? doc.root, ops: [op] },\n issues: issues.map((d) => ({ op, code: d.code, message: d.message })),\n });\n for (const d of issues) state.diagnostics.push(d);\n } else {\n state.appliedGroups += 1;\n }\n }\n\n return { doc: cloned, result: finalize(state) };\n}\n\n/**\n * Apply pre-grouped ops (each {@link RewriteGroup} is committed atomically: if ANY op in the group\n * fails validation, the whole group is skipped and none of its ops mutate the tree).\n */\nexport function applyGroups(\n doc: IRDocument,\n groups: readonly RewriteGroup[],\n ctx?: Partial<ApplyContext>,\n): ApplyOutcome {\n // Group-atomicity is realized by working on a throwaway clone per group, then committing.\n let current = cloneDocument(doc);\n const touched = new Set<IRNodeId>();\n const removed = new Set<IRNodeId>();\n const created = new Set<IRNodeId>();\n const diagnostics: Diagnostic[] = [];\n const skipped: SkippedOpGroup[] = [];\n let appliedGroups = 0;\n\n for (const group of groups) {\n const attempt = applyOps(current, group.ops, ctx);\n if (attempt.result.skipped.length > 0) {\n skipped.push({\n group,\n issues: attempt.result.skipped.flatMap((s) => s.issues),\n });\n for (const s of attempt.result.skipped) for (const i of s.issues) {\n diagnostics.push(diag(i.code, i.message, { pattern: group.pattern }));\n }\n continue; // discard the attempt — group is atomic\n }\n current = attempt.doc;\n appliedGroups += 1;\n for (const id of attempt.result.touched) touched.add(id);\n for (const id of attempt.result.removed) removed.add(id);\n for (const id of attempt.result.created) created.add(id);\n for (const d of attempt.result.diagnostics) diagnostics.push(d);\n }\n\n const result: ApplyResult = {\n touched,\n removed,\n created,\n appliedGroups,\n skipped,\n journal: [],\n diagnostics,\n };\n return { doc: current, result };\n}\n\nfunction finalize(state: MutState): ApplyResult {\n return {\n touched: state.touched,\n removed: state.removed,\n created: state.created,\n appliedGroups: state.appliedGroups,\n skipped: state.skipped,\n journal: [],\n diagnostics: state.diagnostics,\n };\n}\n","/**\n * @domflax/core — pass-manager supporting contexts (resolvers, selector index, rewrite factory,\n * match context).\n *\n * Split out of `pass-manager.ts` so the sync engine, the async verifier-gated engine, and the\n * classification module can all share the same context construction without any of those files\n * exceeding the module-size budget. Dependency-free: only the `./types` contract + `./builders`.\n */\n\nimport type {\n DeepReadonly,\n ElementLike,\n ElementSpec,\n EmitContext,\n EmitResult,\n IRDocument,\n IRElement,\n IRNode,\n IRNodeId,\n MatchContext,\n NodeLike,\n NodeSpec,\n PassPhase,\n ResolveInput,\n ResolveResult,\n RewriteFactory,\n RewriteOpDraft,\n SelectorIndex,\n SelectorUsage,\n StyleConflictPolicy,\n StyleMap,\n StyleResolver,\n} from './types';\n\nimport { elementIds, emptyStyleMap, getElement } from './builders';\n\n/* ───────────────────────── default resolvers / selector index ───────────────────────── */\n\n/** A no-op resolver: owns nothing, resolves to empty styles. Useful as an injection default. */\nexport function createNullResolver(): StyleResolver {\n const empty: ResolveResult = {\n styles: emptyStyleMap(),\n resolved: [],\n unknown: [],\n opaque: [],\n warnings: [],\n };\n const usage: SelectorUsage = {\n asSubject: false,\n asAncestor: false,\n asCompound: false,\n asSibling: false,\n asHasArgument: false,\n asStructural: false,\n droppable: true,\n };\n return {\n id: 'null',\n provider: 'null@0.0.0',\n fingerprint: 'null',\n owns(): boolean {\n return false;\n },\n resolve(_input: ResolveInput): ResolveResult {\n return empty;\n },\n emit(_styles: StyleMap, _ctx: EmitContext): EmitResult {\n return { classes: [], exact: true, warnings: [] };\n },\n selectorUsage(): SelectorUsage {\n return usage;\n },\n };\n}\n\n/** A SelectorIndex that reports zero CSS-targeting (no combinator/structural coupling). */\nexport function createNullSelectorIndex(): SelectorIndex {\n const none: ReadonlySet<IRNodeId> = new Set();\n return {\n targetedByCombinator(): boolean {\n return false;\n },\n targetedByStructuralPseudo(): boolean {\n return false;\n },\n reparentImpact(): ReadonlySet<IRNodeId> {\n return none;\n },\n };\n}\n\n/** Resolvers that can enumerate the project's COMPLEX selectors (the custom-CSS resolver) expose this. */\ninterface ComplexSelectorCapable {\n complexSelectors(): readonly string[];\n}\n\nfunction hasComplexSelectors(r: StyleResolver): r is StyleResolver & ComplexSelectorCapable {\n return typeof (r as Partial<ComplexSelectorCapable>).complexSelectors === 'function';\n}\n\n/**\n * Build a real {@link SelectorIndex} from the active resolver.\n *\n * For a resolver that reports project COMPLEX selectors — anything with a combinator (`>`/`+`/`~`/\n * descendant) or a structural pseudo, i.e. the custom-CSS resolver — every element whose static class\n * participates in such a selector is flagged so the flatten/compress guards (`targetedByCombinator` /\n * `affectsSelectorMatching`) fire and a wrapper a selector depends on is NOT flattened. An element is\n * combinator-coupled when one of its classes is used as a descendant/child ancestor, as a sibling\n * subject, or as a `:has()` argument; structural-coupled when used in `:nth-child(...)` etc.\n *\n * For a combinator-free resolver (Tailwind utilities — no `complexSelectors()`), this degrades to the\n * null index so behaviour is unchanged.\n */\nexport function buildSelectorIndex(doc: IRDocument, resolver: StyleResolver): SelectorIndex {\n if (!hasComplexSelectors(resolver) || resolver.complexSelectors().length === 0) {\n return createNullSelectorIndex();\n }\n\n const combinator = new Set<IRNodeId>();\n const structural = new Set<IRNodeId>();\n\n for (const id of elementIds(doc)) {\n const el = getElement(doc, id);\n if (!el) continue;\n for (const seg of el.classes.segments) {\n if (seg.kind !== 'static') continue;\n for (const t of seg.tokens) {\n const u = resolver.selectorUsage(t.value);\n // Combinator coupling: descendant/child ancestor, sibling subject, or `:has()` argument —\n // reparenting/removing the element would change a combinator match-set.\n if (u.asAncestor || u.asSibling || u.asHasArgument) combinator.add(id);\n if (u.asStructural) structural.add(id);\n }\n }\n }\n\n // reparentImpact(id): non-empty when removing/unwrapping `id` would change a combinator/structural\n // match-set — `id` itself is coupled (its own match), or it is the matched ancestor of a child\n // (removing it reparents that child out of the relation). Self + element children is conservative\n // and sufficient for the flatten guard.\n const impact = new Map<IRNodeId, Set<IRNodeId>>();\n for (const id of elementIds(doc)) {\n const el = getElement(doc, id);\n if (!el) continue;\n if (!combinator.has(id) && !structural.has(id)) continue;\n const set = new Set<IRNodeId>([id]);\n for (const c of el.children) {\n const cn = doc.nodes.get(c);\n if (cn && cn.kind === 'element') set.add(c);\n }\n impact.set(id, set);\n }\n\n const empty: ReadonlySet<IRNodeId> = new Set();\n return {\n targetedByCombinator: (id: IRNodeId): boolean => combinator.has(id),\n targetedByStructuralPseudo: (id: IRNodeId): boolean => structural.has(id),\n reparentImpact: (id: IRNodeId): ReadonlySet<IRNodeId> => impact.get(id) ?? empty,\n };\n}\n\n/* ───────────────────────── rewrite factory (emits origin-free drafts) ───────────────────────── */\n\n/** Every {@link NodeLike}/{@link ElementLike} carries a readonly `id`. */\nfunction idOf(n: ElementLike | NodeLike): IRNodeId {\n return (n as IRElement).id;\n}\n\n/** The pattern-kit factory: produces op DRAFTS and detached NodeSpecs without any allocation. */\nexport function createRewriteFactory(): RewriteFactory {\n return {\n unwrap(target: ElementLike): RewriteOpDraft {\n return { op: 'unwrap', target: idOf(target) };\n },\n removeNode(target: NodeLike): RewriteOpDraft {\n return { op: 'removeNode', target: idOf(target) };\n },\n replaceWith(target: NodeLike, replacement: NodeSpec): RewriteOpDraft {\n return { op: 'replaceWith', target: idOf(target), replacement };\n },\n wrap(target: NodeLike, wrapper: ElementSpec): RewriteOpDraft {\n return { op: 'wrap', target: idOf(target), wrapper };\n },\n insertBefore(anchor: NodeLike, node: NodeSpec): RewriteOpDraft {\n return { op: 'insertBefore', anchor: idOf(anchor), node };\n },\n insertAfter(anchor: NodeLike, node: NodeSpec): RewriteOpDraft {\n return { op: 'insertAfter', anchor: idOf(anchor), node };\n },\n moveNode(target: NodeLike, newParent: ElementLike, index: number): RewriteOpDraft {\n return { op: 'moveNode', target: idOf(target), newParent: idOf(newParent), index };\n },\n mergeSiblings(first: NodeLike, second: NodeLike): RewriteOpDraft {\n return { op: 'mergeSiblings', first: idOf(first), second: idOf(second) };\n },\n setClassList(target: ElementLike, style: StyleMap, preserveOpaque = true): RewriteOpDraft {\n return { op: 'setClassList', target: idOf(target), style, preserveOpaque };\n },\n mergeStyle(\n target: ElementLike,\n source: ElementLike | null,\n style: StyleMap,\n onConflict: StyleConflictPolicy = 'abort',\n ): RewriteOpDraft {\n return {\n op: 'mergeStyle',\n target: idOf(target),\n source: source ? idOf(source) : null,\n style,\n onConflict,\n };\n },\n foldInheritedStyles(\n from: ElementLike,\n into: ElementLike | readonly ElementLike[],\n opts?: { only?: readonly import('./types').CssProperty[]; conditions?: 'base' | 'all' },\n ): RewriteOpDraft {\n const list: readonly ElementLike[] = Array.isArray(into)\n ? (into as readonly ElementLike[])\n : [into as ElementLike];\n return {\n op: 'foldInheritedStyles',\n from: idOf(from),\n into: list.map((t) => idOf(t)),\n properties: opts?.only ?? 'all-inherited',\n conditions: opts?.conditions ?? 'base',\n };\n },\n element(spec: ElementSpec): NodeSpec {\n return spec;\n },\n text(value: string): NodeSpec {\n return { kind: 'text', value };\n },\n keep(node: NodeLike): NodeSpec {\n return { kind: 'ref', ref: idOf(node) };\n },\n };\n}\n\n/* ───────────────────────── match context ───────────────────────── */\n\nfunction ro<T>(v: T): DeepReadonly<T> {\n return v as DeepReadonly<T>;\n}\n\n/** Build the read-only {@link MatchContext} a pattern's `evaluate` receives for one element. */\nexport function buildMatchContext(\n doc: IRDocument,\n elementId: IRNodeId,\n resolver: StyleResolver,\n selectors: SelectorIndex,\n safety: import('./types').SafetyLevel,\n phase: PassPhase,\n iteration: number,\n): MatchContext {\n const self = getElement(doc, elementId)!;\n\n const parentEl = (): DeepReadonly<IRElement> | null => {\n if (self.parent == null) return null;\n const p = doc.nodes.get(self.parent);\n return p && p.kind === 'element' ? ro(p) : null;\n };\n\n const elementChildren = (): readonly DeepReadonly<IRElement>[] => {\n const out: DeepReadonly<IRElement>[] = [];\n for (const c of self.children) {\n const cn = doc.nodes.get(c);\n if (cn && cn.kind === 'element') out.push(ro(cn));\n }\n return out;\n };\n\n const ancestors = (): readonly DeepReadonly<IRElement>[] => {\n const out: DeepReadonly<IRElement>[] = [];\n let cur: IRNodeId | null = self.parent;\n while (cur != null) {\n const n: IRNode | undefined = doc.nodes.get(cur);\n if (!n) break;\n if (n.kind === 'element') out.push(ro(n));\n cur = n.parent;\n }\n return out;\n };\n\n const siblingAt = (delta: number): DeepReadonly<IRNode> | null => {\n if (self.parent == null) return null;\n const p = doc.nodes.get(self.parent);\n if (!p || (p.kind !== 'element' && p.kind !== 'fragment')) return null;\n const i = p.children.indexOf(elementId);\n const sib = p.children[i + delta];\n if (sib == null) return null;\n const sn = doc.nodes.get(sib);\n return sn ? ro(sn) : null;\n };\n\n const computedOf = (n: NodeLike): StyleMap => {\n const node = doc.nodes.get((n as IRNode).id);\n return node && node.kind === 'element' ? node.computed : emptyStyleMap();\n };\n\n return {\n node: ro(self),\n doc: ro(doc),\n resolver,\n selectors,\n safety,\n phase,\n iteration,\n parent: parentEl,\n elementChildren,\n onlyElementChild(): DeepReadonly<IRElement> | null {\n const els = elementChildren();\n return els.length === 1 ? els[0]! : null;\n },\n computed(): StyleMap {\n return self.computed;\n },\n computedOf,\n isOpaque(n?: ElementLike): boolean {\n const target = n ? doc.nodes.get((n as IRElement).id) : self;\n if (!target || target.kind !== 'element') return true;\n return target.classes.opaque || target.meta.hasSpreadAttrs;\n },\n ancestors,\n closest(pred): DeepReadonly<IRElement> | null {\n for (const a of ancestors()) if (pred(a)) return a;\n return null;\n },\n prevSibling(): DeepReadonly<IRNode> | null {\n return siblingAt(-1);\n },\n nextSibling(): DeepReadonly<IRNode> | null {\n return siblingAt(1);\n },\n nthChildIndex(): number {\n if (self.parent == null) return 1;\n const p = doc.nodes.get(self.parent);\n if (!p || (p.kind !== 'element' && p.kind !== 'fragment')) return 1;\n let idx = 0;\n for (const c of p.children) {\n const cn = doc.nodes.get(c);\n if (cn && cn.kind === 'element') {\n idx += 1;\n if (c === elementId) return idx;\n }\n }\n return idx;\n },\n };\n}\n","/**\n * @domflax/core — static classification of a flatten (the VERIFIER-GATED safety core).\n *\n * A flatten pattern matches on `paintsNothing` + a structural/style signature, but unwrapping a\n * wrapper can still change rendering: a wrapper with non-paint layout styles (e.g. `px-4 py-4`) drops\n * that padding when removed (it is NOT reproduced on the surviving child), and a centering wrapper\n * collapsed to `place-self:center` only stays centered when the child's NEW parent is flex/grid. The\n * existing emittability revert only checks the ADDED style is re-emittable — not that the wrapper's\n * own styles survive, nor that the parent context holds.\n *\n * {@link classifyFlattenOps} answers, for one applied flatten op-group, whether it is:\n *\n * • `'provably-safe'` — removing the wrapper changes NOTHING renderable: the wrapper\n * establishes no box/formatting/stacking context, has no non-inherited\n * own declaration that the rewrite does not reproduce on the surviving\n * child, AND the rewrite adds no parent-context-dependent self-alignment\n * (unless the new parent is statically flex/grid). Examples: passthrough\n * / empty-style / display-contents / redundant-fragment wrappers.\n * • `'needs-verification'` — anything else (drops/relies on a style, or centering→place-self).\n *\n * Pure + dependency-free: only the `./types` contract + `./builders` accessors.\n */\n\nimport { conditionKey, getElement } from './builders';\nimport type {\n CssProperty,\n IRDocument,\n IRElement,\n IRNodeId,\n RewriteOp,\n StyleDecl,\n StyleMap,\n StyleNormalizer,\n} from './types';\n\n/** The static verdict for one flatten op-group. */\nexport type FlattenClass = 'provably-safe' | 'needs-verification';\n\n/** A classified flatten plus the structural anchors a verifier needs to render before/after. */\nexport interface FlattenClassification {\n readonly kind: FlattenClass;\n /** The unwrapped wrapper (in the BEFORE doc), or null when the group removes no element box. */\n readonly wrapperId: IRNodeId | null;\n /** The surviving child styles fold onto (the AFTER subtree root), or null. */\n readonly childId: IRNodeId | null;\n}\n\n/* ───────────────────────── display / context reasoning ───────────────────────── */\n\nconst DISPLAY = 'display' as CssProperty;\nconst POSITION = 'position' as CssProperty;\nconst TRANSFORM = 'transform' as CssProperty;\n\n/** Displays that generate no independent formatting context for the wrapper's children. */\nconst CONTEXT_SAFE_DISPLAYS: ReadonlySet<string> = new Set(['block', 'contents', '']);\n/** `position` values that neither establish a containing block nor offset the element. */\nconst STATIC_POSITIONS: ReadonlySet<string> = new Set(['static', '']);\n\n/** Self-alignment properties whose effect depends on the parent being a flex/grid container. */\nconst SELF_ALIGN_PROPS: readonly CssProperty[] = [\n 'place-self' as CssProperty,\n 'align-self' as CssProperty,\n 'justify-self' as CssProperty,\n];\n/** Self-alignment values that are no-ops (so adding them assumes nothing about the parent). */\nconst NEUTRAL_ALIGN: ReadonlySet<string> = new Set(['auto', 'normal', 'auto auto', '']);\n/** Parent displays under which `place-self`/`*-self` centering actually takes effect. */\nconst FLEX_GRID_DISPLAYS: ReadonlySet<string> = new Set(['flex', 'inline-flex', 'grid', 'inline-grid']);\n\n/**\n * True when the wrapper establishes a box/formatting/stacking context that positions or sizes its\n * children — so removing its box could move/resize the surviving child. Derived from the COMPUTED\n * style (the frontend leaves the `meta.establishes*` flags unset for class-resolved styles), exactly\n * how `hasOwnVisualStyle` reasons over the computed map.\n */\nfunction establishesChildContext(sm: StyleMap): boolean {\n for (const block of sm.blocks.values()) {\n const display = block.decls.get(DISPLAY);\n if (display && !CONTEXT_SAFE_DISPLAYS.has(String(display.value))) return true;\n const position = block.decls.get(POSITION);\n if (position && !STATIC_POSITIONS.has(String(position.value))) return true;\n const transform = block.decls.get(TRANSFORM);\n if (transform && String(transform.value) !== 'none') return true;\n }\n return false;\n}\n\n/* ───────────────────────── declaration reasoning ───────────────────────── */\n\nfunction isInherited(decl: StyleDecl, norm: StyleNormalizer): boolean {\n if (decl.inherited) return true;\n try {\n return norm.inherited.isInherited(decl.property);\n } catch {\n return false;\n }\n}\n\n/** True when the child reproduces this exact declaration (same property + value) in the same condition. */\nfunction childReproduces(\n childComputed: StyleMap | null,\n conditionK: string,\n prop: CssProperty,\n value: string,\n): boolean {\n if (!childComputed) return false;\n const block = childComputed.blocks.get(conditionK as never);\n if (!block) return false;\n const d = block.decls.get(prop);\n return d != null && String(d.value) === value;\n}\n\n/**\n * True when the wrapper carries a non-inherited declaration that is NOT reproduced on the surviving\n * child — i.e. flattening would DROP a renderable style. `display`/`position`/`transform` are skipped\n * because {@link establishesChildContext} already governs them (and when it passed they are no-ops).\n */\nfunction dropsOwnStyle(\n wrapperComputed: StyleMap,\n childComputed: StyleMap | null,\n norm: StyleNormalizer,\n): boolean {\n for (const block of wrapperComputed.blocks.values()) {\n const ck = conditionKey(block.condition);\n for (const [prop, decl] of block.decls) {\n if (prop === DISPLAY || prop === POSITION || prop === TRANSFORM) continue;\n if (isInherited(decl, norm)) continue; // folded onto the child by foldInheritedStyles\n if (!childReproduces(childComputed, ck, prop, String(decl.value))) return true;\n }\n }\n return false;\n}\n\n/* ───────────────────────── parent-context reasoning ───────────────────────── */\n\n/** The element's base-condition `display` value (normalized), or '' when unset/not an element. */\nfunction displayOf(el: IRElement | undefined, norm: StyleNormalizer): string {\n if (!el) return '';\n for (const block of norm.normalizeStyleMap(el.computed).blocks.values()) {\n if (block.condition.media === '' && block.condition.states.length === 0 && block.condition.pseudoElement === '') {\n const d = block.decls.get(DISPLAY);\n if (d) return String(d.value);\n }\n }\n return '';\n}\n\n/** True when unwrapping `wrapper` reparents the child UNDER a flex/grid container in the before-tree. */\nfunction newParentIsFlexOrGrid(before: IRDocument, wrapper: IRElement, norm: StyleNormalizer): boolean {\n if (wrapper.parent == null) return false;\n const p = before.nodes.get(wrapper.parent);\n if (!p || p.kind !== 'element') return false;\n return FLEX_GRID_DISPLAYS.has(displayOf(p, norm));\n}\n\n/**\n * True when the rewrite GRANTS the child a parent-context-dependent self-alignment (place-self /\n * align-self / justify-self with a non-neutral value) that was not already on it — centering that only\n * holds if the new parent is flex/grid.\n */\nfunction addsParentContextStyle(\n childBefore: StyleMap | null,\n childAfter: StyleMap | null,\n norm: StyleNormalizer,\n): boolean {\n if (!childAfter) return false;\n const before = childBefore ? norm.normalizeStyleMap(childBefore) : null;\n const after = norm.normalizeStyleMap(childAfter);\n for (const block of after.blocks.values()) {\n const ck = conditionKey(block.condition);\n for (const prop of SELF_ALIGN_PROPS) {\n const d = block.decls.get(prop);\n if (!d || NEUTRAL_ALIGN.has(String(d.value))) continue;\n const prev = before?.blocks.get(ck as never)?.decls.get(prop);\n if (!prev || String(prev.value) !== String(d.value)) return true;\n }\n }\n return false;\n}\n\n/* ───────────────────────── op-group anchors ───────────────────────── */\n\n/** The wrapper the group unwraps (the structural removal), or null when the group removes no box. */\nfunction unwrapTargetOf(ops: readonly RewriteOp[]): IRNodeId | null {\n for (const op of ops) if (op.op === 'unwrap') return op.target;\n return null;\n}\n\n/** The surviving child styles fold onto: the mergeStyle/fold target, else the wrapper's sole element child. */\nfunction survivingChildOf(ops: readonly RewriteOp[], wrapper: IRElement, before: IRDocument): IRNodeId | null {\n for (const op of ops) if (op.op === 'mergeStyle') return op.target;\n for (const op of ops) if (op.op === 'foldInheritedStyles' && op.into.length > 0) return op.into[0]!;\n for (const c of wrapper.children) {\n const n = before.nodes.get(c);\n if (n && n.kind === 'element') return c;\n }\n return null;\n}\n\n/* ───────────────────────── the classifier ───────────────────────── */\n\n/**\n * Statically classify one applied flatten op-group. `before` is the doc as it was BEFORE the group's\n * ops; `after` is the result of applying them.\n *\n * A group that unwraps no element box (e.g. {@link redundant-fragment}, or a style-only flatten) is\n * `provably-safe` — there is no box whose removal could move/resize anything. Otherwise the three\n * criteria above decide.\n */\nexport function classifyFlattenOps(\n before: IRDocument,\n after: IRDocument,\n ops: readonly RewriteOp[],\n norm: StyleNormalizer,\n): FlattenClassification {\n const wrapperId = unwrapTargetOf(ops);\n if (wrapperId == null) return { kind: 'provably-safe', wrapperId: null, childId: null };\n\n const wrapper = before.nodes.get(wrapperId);\n // A fragment carries no box and no computed style — unwrapping it is always layout-identical.\n if (!wrapper || wrapper.kind !== 'element') {\n return { kind: 'provably-safe', wrapperId: null, childId: null };\n }\n\n const childId = survivingChildOf(ops, wrapper, before);\n const wrapperComputed = norm.normalizeStyleMap(wrapper.computed);\n const childAfter = childId != null ? getElement(after, childId)?.computed ?? null : null;\n const childBefore = childId != null ? getElement(before, childId)?.computed ?? null : null;\n\n // (A) wrapper positions/sizes its children → removing its box can move/resize them.\n if (establishesChildContext(wrapperComputed)) {\n return { kind: 'needs-verification', wrapperId, childId };\n }\n // (B) wrapper drops a non-inherited own style the child does not reproduce.\n if (dropsOwnStyle(wrapperComputed, childAfter ? norm.normalizeStyleMap(childAfter) : null, norm)) {\n return { kind: 'needs-verification', wrapperId, childId };\n }\n // (C) rewrite adds parent-context-dependent centering, but the new parent is not statically flex/grid.\n if (addsParentContextStyle(childBefore, childAfter, norm) && !newParentIsFlexOrGrid(before, wrapper, norm)) {\n return { kind: 'needs-verification', wrapperId, childId };\n }\n\n return { kind: 'provably-safe', wrapperId, childId };\n}\n","/**\n * @domflax/core — pass manager (the sync, static flatten driver).\n *\n * Runs {@link Pattern}s grouped by {@link PassPhase} in declared order, driving the `flatten` phase to\n * a fixpoint under a max-iteration budget, isolating per-node pattern errors into {@link Diagnostic}s\n * (a thrown pattern never aborts the run — it becomes `DF_PATTERN_THREW`), and applying the static\n * flatten policy ({@link ApplyContext.gate}) — under `'provably-safe'` only provably layout-neutral\n * flattens commit, so the transform never changes rendering and never launches a browser.\n *\n * The supporting contexts (resolvers, selector index, rewrite factory, match context) live in\n * `./pass-context`; the static flatten classifier in `./flatten-safety`. Dependency-free: only the\n * `./types` contract + sibling runtime helpers.\n */\n\nimport type {\n ApplyContext,\n Diagnostic,\n FixpointConfig,\n HaltReason,\n IRDocument,\n IRNodeId,\n Pass,\n PassManager,\n PassPhase,\n Pattern,\n PhaseRunResult,\n RewriteFactory,\n RewriteOp,\n RewriteOpDraft,\n StyleMap,\n StyleNormalizer,\n StyleResolver,\n SyntheticSink,\n EmitContext,\n} from './types';\n\nimport { childIds, elementIds, getElement } from './builders';\nimport { applyOps } from './ops';\nimport { buildMatchContext, createRewriteFactory } from './pass-context';\nimport { classifyFlattenOps } from './flatten-safety';\n\n// Re-export the supporting contexts so `@domflax/core` consumers keep importing them from here / the\n// barrel exactly as before this module was split.\nexport {\n buildMatchContext,\n buildSelectorIndex,\n createNullResolver,\n createNullSelectorIndex,\n createRewriteFactory,\n} from './pass-context';\n\n/* ───────────────────────── defaults ───────────────────────── */\n\nexport const DEFAULT_FIXPOINT: FixpointConfig = {\n maxIterations: 16,\n phases: { flatten: 16, compress: 8, extract: 4 },\n onBudgetExhausted: 'warn',\n detectOscillation: true,\n};\n\nexport const PHASE_ORDER: readonly PassPhase[] = ['flatten', 'compress', 'extract'];\n\n/* ───────────────────────── op stamping + phase grouping ───────────────────────── */\n\nexport function stampOrigin(draft: RewriteOpDraft, pattern: Pattern): RewriteOp {\n return {\n ...draft,\n origin: { pattern: pattern.name, category: pattern.category, safety: pattern.safety },\n } as RewriteOp;\n}\n\nexport function patternsForPhase(passes: readonly Pass[], phase: PassPhase): Pattern[] {\n const out: Pattern[] = [];\n for (const pass of passes) {\n if (pass.phase !== phase) continue;\n for (const p of pass.patterns) out.push(p);\n }\n out.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n return out;\n}\n\nexport interface RunState {\n doc: IRDocument;\n}\n\n/* ───────────────────────── flatten residual-skip (never drop an unreproducible style) ───────────────────────── */\n\n/** A throwaway {@link SyntheticSink} for the emit exactness probe (registrations are discarded). */\nfunction probeSink(): SyntheticSink {\n return {\n register(s): string {\n return s.className;\n },\n drain(): readonly never[] {\n return [];\n },\n };\n}\n\n/** Nodes a group writes STYLE onto (the survivors a flatten transfers declarations to). */\nfunction styleWriteTargets(ops: readonly RewriteOp[]): IRNodeId[] {\n const ids: IRNodeId[] = [];\n for (const op of ops) {\n if (op.op === 'mergeStyle' || op.op === 'setClassList') ids.push(op.target);\n else if (op.op === 'foldInheritedStyles') ids.push(...op.into);\n }\n return ids;\n}\n\n/** True iff the resolver can EXACTLY reverse-emit `sm` (no residual). An empty map is trivially exact. */\nfunction emitIsExact(resolver: StyleResolver, normalizer: StyleNormalizer, sm: StyleMap): boolean {\n if (sm.blocks.size === 0) return true;\n try {\n const ctx: EmitContext = { normalizer, sink: probeSink() };\n const r = resolver.emit(sm, ctx);\n return r.exact && r.residual == null;\n } catch {\n return true; // a throwing resolver must never block a flatten\n }\n}\n\n/**\n * T5 — flatten must never DROP a style it can't reproduce. After a flatten transfers declarations onto\n * a surviving (rewritable) element, if the resolver can no longer EXACTLY reverse-emit that element's\n * computed style — and it could before — the flatten would silently lose the residual declarations\n * during reverse-emit, so the whole flatten is reverted (the wrapper is kept). Pre-existing residue\n * (already non-exact before the flatten) is not blamed on the flatten and does not trigger a revert.\n */\nexport function flattenWouldDropStyle(\n before: IRDocument,\n after: IRDocument,\n ops: readonly RewriteOp[],\n resolver: StyleResolver,\n normalizer: StyleNormalizer,\n): boolean {\n for (const id of styleWriteTargets(ops)) {\n const newEl = getElement(after, id);\n if (!newEl) continue; // target was itself removed — its style lives on the survivor we also check\n // Opaque / dynamic class lists are kept verbatim by reverse-emit, so no style is dropped there.\n if (newEl.classes.opaque || newEl.classes.hasDynamic) continue;\n if (emitIsExact(resolver, normalizer, newEl.computed)) continue;\n const oldEl = getElement(before, id);\n const wasExact = !oldEl || emitIsExact(resolver, normalizer, oldEl.computed);\n if (wasExact) return true; // the flatten introduced an unreproducible style → revert\n }\n return false;\n}\n\n/* ───────────────────────── flatten gate decision (shared sync core) ───────────────────────── */\n\nexport type FlattenVerdict = 'commit' | 'revert';\n\n/**\n * Decide what to do with a freshly-applied flatten op-group, given the gate. Returns:\n * • `'commit'` — keep the outcome (the historical path for `'all'`, and provably-safe flattens).\n * • `'revert'` — discard + bar the node (residual-drop, or a needs-verification flatten under the\n * `'provably-safe'` gate).\n *\n * `before`/`after` are the docs immediately around the group's application.\n */\nexport function flattenVerdict(\n before: IRDocument,\n after: IRDocument,\n ops: readonly RewriteOp[],\n ctx: ApplyContext,\n): FlattenVerdict {\n // T5 (independent of the gate): a flatten must never drop a style the resolver can't re-emit.\n if (flattenWouldDropStyle(before, after, ops, ctx.resolver, ctx.normalizer)) return 'revert';\n\n const gate = ctx.gate ?? 'all';\n if (gate === 'all') return 'commit';\n\n const cls = classifyFlattenOps(before, after, ops, ctx.normalizer);\n return cls.kind === 'provably-safe' ? 'commit' : 'revert';\n}\n\n/* ───────────────────────── per-element pattern evaluation (shared) ───────────────────────── */\n\n/**\n * Evaluate every pattern against `elId` until one produces ops; returns the stamped op list (and its\n * pattern), or null when no pattern matched. Pattern throws become `DF_PATTERN_THREW` diagnostics.\n */\nexport function evaluateElement(\n doc: IRDocument,\n elId: IRNodeId,\n patterns: readonly Pattern[],\n ctx: ApplyContext,\n factory: RewriteFactory,\n phase: PassPhase,\n iteration: number,\n diagnostics: Diagnostic[],\n): { ops: RewriteOp[]; pattern: Pattern } | null {\n for (const pattern of patterns) {\n if (pattern.safety > ctx.safetyCeiling) continue;\n let drafts: readonly RewriteOpDraft[] = [];\n try {\n const mctx = buildMatchContext(doc, elId, ctx.resolver, ctx.selectors, ctx.safetyCeiling, phase, iteration);\n const result = pattern.evaluate(mctx, factory);\n if (!result) continue;\n drafts = result.ops;\n if (result.diagnostics) for (const d of result.diagnostics) diagnostics.push(d);\n } catch (err) {\n diagnostics.push({\n code: 'DF_PATTERN_THREW',\n severity: 'error',\n message: `pattern '${pattern.name}' threw: ${String((err as Error)?.message ?? err)}`,\n nodeId: elId,\n pattern: pattern.name,\n phase,\n iteration,\n cause: err,\n });\n continue;\n }\n if (drafts.length === 0) continue;\n return { ops: drafts.map((d) => stampOrigin(d, pattern)), pattern };\n }\n return null;\n}\n\n/** Emit the diagnostic recorded when a flatten is reverted by the gate / residual guard. */\nexport function revertDiagnostic(\n pattern: Pattern,\n elId: IRNodeId,\n phase: PassPhase,\n iteration: number,\n resolverId: string,\n): Diagnostic {\n return {\n code: 'DF_VERIFY_REVERTED',\n severity: 'warn',\n message:\n `flatten '${pattern.name}' reverted on node ${elId}: it would change rendering (drops a style, ` +\n `establishes layout context, or assumes a parent context) and was not proven safe by resolver ` +\n `'${resolverId}'`,\n nodeId: elId,\n pattern: pattern.name,\n phase,\n iteration,\n };\n}\n\n/* ───────────────────────── one sweep (sync) ───────────────────────── */\n\n/**\n * One sweep of a phase: evaluate every pattern against every live element, collect op drafts, stamp\n * origin, apply, then commit/revert per {@link flattenVerdict}. Returns the number of ops applied\n * (0 ⇒ fixpoint for this phase). Under the `'provably-safe'` gate, any flatten that is not provably\n * safe is reverted — the transform is fully static and never changes rendering.\n */\nfunction runSweep(\n state: RunState,\n patterns: readonly Pattern[],\n ctx: ApplyContext,\n factory: RewriteFactory,\n phase: PassPhase,\n iteration: number,\n touched: Set<IRNodeId>,\n diagnostics: Diagnostic[],\n flattenBarred: Set<IRNodeId>,\n): number {\n let appliedOps = 0;\n\n for (const elId of elementIds(state.doc)) {\n const el = getElement(state.doc, elId);\n if (!el) continue; // removed earlier in this sweep\n if (phase === 'flatten' && flattenBarred.has(elId)) continue;\n\n const evaluated = evaluateElement(state.doc, elId, patterns, ctx, factory, phase, iteration, diagnostics);\n if (!evaluated) continue;\n const { ops, pattern } = evaluated;\n\n const outcome = applyOps(state.doc, ops, ctx);\n for (const d of outcome.result.diagnostics) diagnostics.push(d);\n if (outcome.result.appliedGroups === 0) continue;\n\n if (phase === 'flatten') {\n const verdict = flattenVerdict(state.doc, outcome.doc, ops, ctx);\n if (verdict !== 'commit') {\n // Discard the outcome (keep the wrapper) AND bar this node from any further flatten this run.\n diagnostics.push(revertDiagnostic(pattern, elId, phase, iteration, ctx.resolver.id));\n flattenBarred.add(elId);\n continue;\n }\n }\n\n state.doc = outcome.doc;\n appliedOps += outcome.result.appliedGroups;\n for (const id of outcome.result.touched) touched.add(id);\n for (const id of outcome.result.created) touched.add(id);\n }\n return appliedOps;\n}\n\n/* ───────────────────────── oscillation fingerprint ───────────────────────── */\n\n/** Cheap structural fingerprint of the document for oscillation detection. */\nexport function docFingerprint(doc: IRDocument): string {\n const parts: string[] = [];\n const visit = (id: IRNodeId): void => {\n const n = doc.nodes.get(id);\n if (!n) return;\n parts.push(`${id}:${n.kind}`);\n for (const c of childIds(n)) visit(c);\n };\n visit(doc.root);\n return parts.join('|');\n}\n\n/* ───────────────────────── the fixpoint driver (sync) ───────────────────────── */\n\n/** A single phase's terminal result, built from the loop's accounting. */\nexport interface PhaseLoopState {\n iterations: number;\n converged: boolean;\n haltReason: HaltReason;\n readonly touched: Set<IRNodeId>;\n readonly diagnostics: Diagnostic[];\n readonly seen: Set<string>;\n}\n\n/** Record the budget-exhausted diagnostic + finalize a phase result. Shared by sync + async drivers. */\nexport function finalizePhase(\n phase: PassPhase,\n s: PhaseLoopState,\n budget: number,\n onBudgetExhausted: 'warn' | 'error',\n): PhaseRunResult {\n if (!s.converged && s.haltReason !== 'oscillation') {\n s.haltReason = 'budget';\n s.diagnostics.push({\n code: 'DF_FIXPOINT_BUDGET',\n severity: onBudgetExhausted === 'error' ? 'error' : 'warn',\n message: `phase '${phase}' exhausted ${budget}-iteration budget`,\n phase,\n iteration: s.iterations,\n });\n }\n return {\n phase,\n iterations: s.iterations,\n converged: s.converged,\n haltReason: s.haltReason,\n touched: s.touched,\n diagnostics: s.diagnostics,\n };\n}\n\n/**\n * Runs `passes` over `doc` to a per-phase fixpoint (synchronous). This is the concrete entry the\n * pipeline calls. Under the `'provably-safe'` gate, flattens that are not provably layout-neutral are\n * reverted — the transform is fully static and never changes rendering.\n */\nexport function runPasses(\n doc: IRDocument,\n passes: readonly Pass[],\n ctx: ApplyContext,\n config?: FixpointConfig,\n): { readonly doc: IRDocument; readonly results: readonly PhaseRunResult[] } {\n const cfg: FixpointConfig = { ...DEFAULT_FIXPOINT, ...config };\n const factory = createRewriteFactory();\n const state: RunState = { doc };\n const results: PhaseRunResult[] = [];\n // Nodes barred from flattening after a revert — persists across sweeps/phases.\n const flattenBarred = new Set<IRNodeId>();\n\n for (const phase of PHASE_ORDER) {\n const patterns = patternsForPhase(passes, phase);\n const budget = cfg.phases[phase] ?? cfg.maxIterations;\n const s: PhaseLoopState = {\n iterations: 0,\n converged: false,\n haltReason: 'converged',\n touched: new Set(),\n diagnostics: [],\n seen: new Set(),\n };\n\n if (patterns.length === 0) {\n s.converged = true;\n results.push(finalizePhase(phase, s, budget, cfg.onBudgetExhausted));\n continue;\n }\n\n while (s.iterations < budget) {\n s.iterations += 1;\n const applied = runSweep(\n state,\n patterns,\n ctx,\n factory,\n phase,\n s.iterations,\n s.touched,\n s.diagnostics,\n flattenBarred,\n );\n\n if (applied === 0) {\n s.converged = true;\n break;\n }\n\n if (cfg.detectOscillation) {\n const fp = docFingerprint(state.doc);\n if (s.seen.has(fp)) {\n s.haltReason = 'oscillation';\n s.diagnostics.push({\n code: 'DF_FIXPOINT_OSCILLATION',\n severity: 'warn',\n message: `phase '${phase}' oscillated; halting`,\n phase,\n iteration: s.iterations,\n });\n break;\n }\n s.seen.add(fp);\n }\n }\n\n results.push(finalizePhase(phase, s, budget, cfg.onBudgetExhausted));\n }\n\n return { doc: state.doc, results };\n}\n\n/** A {@link PassManager} that runs the given passes (carried on the manager instance). */\nexport function createPassManager(passes: readonly Pass[]): PassManager {\n return {\n run(doc: IRDocument, ctx: ApplyContext, config?: FixpointConfig): readonly PhaseRunResult[] {\n return runPasses(doc, passes, ctx, config).results;\n },\n };\n}\n","/**\n * @domflax/core — the pure, single-file pipeline.\n *\n * Wires injected interfaces together: {@link Frontend} → resolve → {@link PassManager} →\n * {@link Backend}. Core itself stays dependency-free; the resolver, frontend, and backend are all\n * supplied by the caller, so no heavy third-party libs ever reach this package.\n */\n\nimport type {\n ApplyContext,\n Backend,\n BackendContext,\n CodegenResult,\n Diagnostic,\n EditPlan,\n Frontend,\n FrontendParseContext,\n IRDocument,\n IRElement,\n PassPhase,\n Pipeline,\n PipelineInput,\n PipelineOutput,\n PipelineStats,\n SourceSpan,\n StyleMap,\n SyntheticClass,\n SyntheticSink,\n} from './types';\n\nimport { elementIds, getElement } from './builders';\nimport { createNullSelectorIndex, runPasses } from './pass-manager';\n\n/* ───────────────────────── synthetic sink ───────────────────────── */\n\n/** A minimal in-memory {@link SyntheticSink}: dedupes by className, drains in insertion order. */\nexport function createSyntheticSink(): SyntheticSink {\n const map = new Map<string, SyntheticClass>();\n return {\n register(s: SyntheticClass): string {\n if (!map.has(s.className)) map.set(s.className, s);\n return s.className;\n },\n drain(): readonly SyntheticClass[] {\n return [...map.values()];\n },\n };\n}\n\n/* ───────────────────────── resolve step ───────────────────────── */\n\nfunction staticClassTokens(el: IRElement): string[] {\n const out: string[] = [];\n for (const seg of el.classes.segments) {\n if (seg.kind === 'static') for (const t of seg.tokens) out.push(t.value);\n }\n return out;\n}\n\n/**\n * Populate each element's `computed` StyleMap from its author classes via the injected resolver.\n * Opaque/spread elements and elements without static classes are left untouched. Resolver throws\n * are isolated into diagnostics (a stub resolver may legitimately be NotImplemented).\n */\nfunction resolveStyles(\n doc: IRDocument,\n input: PipelineInput,\n diagnostics: Diagnostic[],\n): void {\n const { resolver, normalizer } = input;\n for (const id of elementIds(doc)) {\n const el = getElement(doc, id);\n if (!el || el.classes.opaque) continue;\n const tokens = staticClassTokens(el);\n if (tokens.length === 0) continue;\n try {\n const result = resolver.resolve({\n classes: tokens,\n element: {\n tagName: el.tag,\n namespace: el.namespace === 'svg' ? 'svg' : 'html',\n },\n });\n let styles: StyleMap = result.styles;\n try {\n styles = normalizer.normalizeStyleMap(styles);\n } catch {\n /* normalizer is optional/stubbed — keep raw styles */\n }\n el.computed = styles;\n for (const w of result.warnings) {\n diagnostics.push({\n code: 'DF_STYLE_CONFLICT_UNRESOLVED',\n severity: w.severity,\n message: w.message,\n nodeId: id,\n });\n }\n } catch (err) {\n diagnostics.push({\n code: 'DF_OP_PRECONDITION_FAILED',\n severity: 'debug',\n message: `resolve skipped for <${el.tag}>: ${String((err as Error)?.message ?? err)}`,\n nodeId: id,\n cause: err,\n });\n }\n }\n}\n\n/* ───────────────────────── the pipeline ───────────────────────── */\n\nconst ZERO_ITERATIONS: Readonly<Record<PassPhase, number>> = {\n flatten: 0,\n compress: 0,\n extract: 0,\n};\n\nclass DefaultPipeline implements Pipeline {\n run(input: PipelineInput): PipelineOutput {\n const startedAt = now();\n const diagnostics: Diagnostic[] = [];\n const report = (d: Diagnostic): void => {\n diagnostics.push(d);\n input.reporter?.report(d);\n };\n\n // 1. PARSE ────────────────────────────────────────────────────────────\n const parseCtx: FrontendParseContext = {\n id: input.id,\n kind: input.kind,\n resolver: input.resolver,\n normalizer: input.normalizer,\n config: { preserveComments: input.config?.preserveComments ?? true },\n onDiagnostic: report,\n };\n if (input.babelAst !== undefined) parseCtx.babelAst = input.babelAst;\n\n const parsed = input.frontend.parse(input.code, parseCtx);\n for (const d of parsed.diagnostics) report(d);\n const doc = parsed.doc;\n const nodesIn = doc.nodes.size;\n\n // 2. RESOLVE ──────────────────────────────────────────────────────────\n resolveStyles(doc, input, diagnostics);\n\n // 3. PASSES (fixpoint per phase) ──────────────────────────────────────\n const ctx: ApplyContext = {\n doc,\n safetyCeiling: input.config?.safety ?? 2,\n normalizer: input.normalizer,\n selectors: createNullSelectorIndex(),\n resolver: input.resolver,\n };\n const { doc: optimized, results } = runPasses(doc, input.passes, ctx, fixpointFrom(input));\n\n let opsApplied = 0;\n const iterations: Record<PassPhase, number> = { ...ZERO_ITERATIONS };\n for (const r of results) {\n iterations[r.phase] = r.iterations;\n for (const d of r.diagnostics) {\n diagnostics.push(d);\n input.reporter?.report(d);\n }\n opsApplied += r.touched.size;\n }\n\n // 4. PRINT ────────────────────────────────────────────────────────────\n const editPlan: EditPlan = {\n moduleId: input.id,\n ops: [],\n provenance: new Map(),\n };\n const backendCtx: BackendContext = {\n normalizer: input.normalizer,\n resolver: input.resolver,\n sink: createSyntheticSink(),\n eol: eolOf(optimized),\n onDiagnostic: report,\n };\n const printed: CodegenResult = input.backend.print(optimized, editPlan, backendCtx);\n for (const d of printed.diagnostics) {\n diagnostics.push(d);\n input.reporter?.report(d);\n }\n\n // 5. ASSEMBLE OUTPUT ──────────────────────────────────────────────────\n const stats: PipelineStats = {\n nodesIn,\n nodesOut: optimized.nodes.size,\n opsApplied,\n iterations,\n durationMs: now() - startedAt,\n };\n const touched: readonly SourceSpan[] = printed.edits.map((e) => e.span);\n\n return {\n code: printed.code,\n map: printed.map,\n changed: printed.code !== input.code,\n touched,\n diagnostics,\n stats,\n doc: optimized,\n editPlan,\n };\n }\n}\n\nfunction fixpointFrom(input: PipelineInput): import('./types').FixpointConfig | undefined {\n const fp = input.config?.fixpoint;\n if (!fp) return undefined;\n return {\n maxIterations: fp.maxIterations ?? 16,\n phases: fp.phases ?? {},\n onBudgetExhausted: fp.onBudgetExhausted ?? 'warn',\n detectOscillation: fp.detectOscillation ?? true,\n };\n}\n\nfunction eolOf(doc: IRDocument): '\\n' | '\\r\\n' {\n for (const src of doc.sources.values()) return src.eol;\n return '\\n';\n}\n\n// `performance` is a host global (node20 / browser) not covered by the ES2023 lib;\n// declared minimally so the runtime feature-detection below stays type-safe.\ndeclare const performance: { now(): number } | undefined;\n\nfunction now(): number {\n return typeof performance !== 'undefined' && typeof performance.now === 'function'\n ? performance.now()\n : Date.now();\n}\n\n/** Build the pure single-file {@link Pipeline}. */\nexport function createPipeline(): Pipeline {\n return new DefaultPipeline();\n}\n","/**\n * @domflax/core — the shared reverse-emit step (computed → className).\n *\n * The backend re-prints `className` from each element's {@link ClassList}, but the pass manager\n * records optimized styles on `computed`. This module folds those optimized computed styles back\n * into the element's static class tokens, and is the SINGLE source of truth shared by every\n * orchestrator (the `domflax` meta package, `@domflax/cli`, and the pattern auto-test harness) so\n * their pipelines cannot diverge.\n *\n * ## REPLACE, not append\n *\n * For every TOUCHED, rewritable (non-opaque, non-dynamic) element we ask the resolver for the\n * MINIMAL class set reproducing the element's FULL computed style (`resolver.emit(el.computed)`),\n * then REPLACE the element's static tokens with it — rather than appending. Replacing is what lets\n * a compress pass actually shorten output: `px-4 py-4` collapses to `p-4`, equal `w/h` to `size-*`,\n * the four insets to `inset-0`, and fully-overridden duplicates simply disappear.\n *\n * ## Droppability gate (never lose a load-bearing class)\n *\n * A token is only removed when `resolver.selectorUsage(token).droppable` is true — i.e. it is a\n * plain, resolver-owned utility whose entire contribution is reproducible from `computed`. Tokens\n * that are unknown to the resolver, opaque (combinator/at-rule utilities whose effect never folds\n * onto the element's own box), variant-bound, or referenced by a custom-CSS selector are NOT\n * droppable and are preserved verbatim. As a safety net, if `emit` produces nothing at all we leave\n * the element's tokens untouched (a resolver that failed to load must never erase classes).\n */\n\nimport { elementIds, getElement } from './builders';\nimport { createSyntheticSink } from './pipeline';\nimport type {\n ClassList,\n ClassSegment,\n ClassToken,\n EmitContext,\n IRDocument,\n StyleNormalizer,\n StyleResolver,\n} from './types';\n\n/** All static class tokens of a {@link ClassList}, in source order. */\nfunction staticTokensOf(cl: ClassList): string[] {\n const out: string[] = [];\n for (const seg of cl.segments) {\n if (seg.kind === 'static') for (const t of seg.tokens) out.push(t.value);\n }\n return out;\n}\n\n/** A rewritable static {@link ClassList} over `tokens`, preserving the previous list's spans. */\nfunction staticClassList(prev: ClassList, tokens: readonly string[]): ClassList {\n const classTokens: ClassToken[] = tokens.map((value) => ({ value }));\n const seg: ClassSegment = { kind: 'static', tokens: classTokens };\n return {\n form: 'string-literal',\n segments: [seg],\n valueSpan: prev.valueSpan,\n attrSpan: prev.attrSpan,\n hasDynamic: false,\n opaque: false,\n rewritable: true,\n };\n}\n\n/** Two token lists are equal iff same length and same tokens in the same order. */\nfunction sameTokens(a: readonly string[], b: readonly string[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i += 1) if (a[i] !== b[i]) return false;\n return true;\n}\n\n/**\n * Fold every TOUCHED, rewritable element's optimized computed style back into the MINIMAL static\n * class-token set (see module docs). Mutates `doc` in place.\n */\nexport function syncClassesFromComputed(\n doc: IRDocument,\n resolver: StyleResolver,\n norm: StyleNormalizer,\n): void {\n const sink = createSyntheticSink();\n for (const id of elementIds(doc)) {\n const el = getElement(doc, id);\n if (!el || !el.meta.touched) continue;\n if (el.classes.opaque || el.classes.hasDynamic) continue;\n\n const tokens = staticTokensOf(el.classes);\n\n // Minimal class set reproducing the FULL computed style.\n const ctx: EmitContext = { normalizer: norm, sink };\n const emitted = resolver.emit(el.computed, ctx).classes;\n // A resolver that reverse-synthesized nothing must never erase the element's classes.\n if (emitted.length === 0) continue;\n\n const emittedSet = new Set(emitted);\n const next: string[] = [];\n const seen = new Set<string>();\n\n // 1. Keep each existing token that is either NOT droppable (unknown / opaque / variant /\n // selector-bound) or still part of the emitted minimal set — preserving source order.\n for (const t of tokens) {\n if (seen.has(t)) continue;\n const keep = emittedSet.has(t) || !resolver.selectorUsage(t).droppable;\n if (keep) {\n next.push(t);\n seen.add(t);\n }\n }\n // 2. Append any newly-emitted classes not already present, in emit order.\n for (const c of emitted) {\n if (seen.has(c)) continue;\n next.push(c);\n seen.add(c);\n }\n\n if (sameTokens(next, tokens)) continue; // no churn when nothing actually changed\n el.classes = staticClassList(el.classes, next);\n }\n}\n","/**\n * @domflax/pattern-kit — the shared StyleMap normalizer.\n *\n * A single, syntactic-only {@link StyleNormalizer} implementation that core, the patterns, and the\n * verifier all reuse so they agree, byte-for-byte, on what two style declarations \"mean\". It NEVER\n * resolves initial/inherited/computed defaults (that is the verifier's job) — it only:\n *\n * • canonicalizes colors (`transparent` ⇒ `rgba(0, 0, 0, 0)`, hex lower-cased + 3→6 expanded,\n * `rgb()/rgba()/hsl()/hsla()` argument spacing normalized),\n * • canonicalizes units (whitespace collapsed, zero-lengths `0px`/`0%`/… ⇒ `0`),\n * • expands a fixed set of box shorthands to longhands (`padding`/`margin`/`inset`/`border-width`\n * into their four sides, `gap` into `row-gap`/`column-gap`),\n * • orders declarations by property for stable comparison.\n *\n * Dependency-free: only `@domflax/core` (types + the StyleMap builder helpers).\n */\n\nimport type {\n CssProperty,\n CssValue,\n ConditionKey,\n InheritedPropertyTable,\n StyleBlock,\n StyleDecl,\n StyleMap,\n StyleNormalizer,\n} from '@domflax/core';\n\nimport { conditionKey, emptyStyleMap } from '@domflax/core';\n\n/* ───────────────────────── inherited-property table ───────────────────────── */\n\n/**\n * Canonical, versioned set of inherited CSS longhands. Any author custom property (`--*`) is\n * also treated as inherited via the `isInherited` predicate.\n */\nconst INHERITED_PROPERTIES: readonly string[] = [\n 'azimuth',\n 'border-collapse',\n 'border-spacing',\n 'caption-side',\n 'color',\n 'cursor',\n 'direction',\n 'empty-cells',\n 'font-family',\n 'font-feature-settings',\n 'font-kerning',\n 'font-size',\n 'font-size-adjust',\n 'font-stretch',\n 'font-style',\n 'font-variant',\n 'font-variant-caps',\n 'font-variant-numeric',\n 'font-weight',\n 'hyphens',\n 'letter-spacing',\n 'line-height',\n 'list-style-image',\n 'list-style-position',\n 'list-style-type',\n 'orphans',\n 'overflow-wrap',\n 'quotes',\n 'tab-size',\n 'text-align',\n 'text-align-last',\n 'text-decoration-color',\n 'text-indent',\n 'text-justify',\n 'text-rendering',\n 'text-shadow',\n 'text-transform',\n 'text-underline-position',\n 'visibility',\n 'white-space',\n 'widows',\n 'word-break',\n 'word-spacing',\n 'writing-mode',\n '-webkit-font-smoothing',\n];\n\nfunction createInheritedTable(): InheritedPropertyTable {\n const properties = new Set<CssProperty>(INHERITED_PROPERTIES as unknown as CssProperty[]);\n return {\n version: 'domflax-inherited@1',\n properties,\n isInherited(property: CssProperty): boolean {\n // Author custom properties (`--*`) inherit by definition.\n return String(property).startsWith('--') || properties.has(property);\n },\n };\n}\n\n/* ───────────────────────── value canonicalization ───────────────────────── */\n\nconst ZERO_LENGTH_RE =\n /\\b0(?:px|em|rem|ex|ch|vh|vw|vmin|vmax|vi|vb|pt|pc|cm|mm|in|q|lh|rlh|fr|deg|rad|turn|s|ms|%)\\b/g;\n\nconst FUNC_ARGS_RE = /\\b(rgba?|hsla?|hwb|lab|lch|oklab|oklch)\\(([^()]*)\\)/gi;\n\nconst RELATIVE_UNIT_RE = /(?:\\d*\\.?\\d+)(?:em|ex|ch|lh)\\b|%/i;\n\n/**\n * Pure, syntactic value canonicalization. Idempotent: `canon(canon(v)) === canon(v)`.\n */\nfunction canonValue(raw: string): string {\n let v = raw.trim().replace(/\\s+/g, ' ');\n\n // Lower-case hex colors (#abc / #aabbcc / #aabbccff).\n v = v.replace(/#([0-9a-fA-F]{3,8})\\b/g, (_m, hex: string) => '#' + hex.toLowerCase());\n\n // Expand 3-digit hex (#abc → #aabbcc) — only when exactly 3 hex digits.\n v = v.replace(\n /#([0-9a-f])([0-9a-f])([0-9a-f])(?![0-9a-f])/g,\n (_m, r: string, g: string, b: string) => `#${r}${r}${g}${g}${b}${b}`,\n );\n\n // Canonical fully-transparent color.\n v = v.replace(/\\btransparent\\b/gi, 'rgba(0, 0, 0, 0)');\n v = v.replace(/#00000000\\b/g, 'rgba(0, 0, 0, 0)');\n\n // Collapse zero lengths/angles/times to a bare `0`.\n v = v.replace(ZERO_LENGTH_RE, '0');\n\n // Normalize the argument spacing of color/space functions: single space after each comma.\n v = v.replace(FUNC_ARGS_RE, (_m, fn: string, args: string) => {\n const parts = args\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n return `${fn.toLowerCase()}(${parts.join(', ')})`;\n });\n\n return v;\n}\n\n/** True when the (canonicalized) value uses a parent-relative unit (em/ex/ch/lh/%). */\nfunction isRelativeValue(value: string): boolean {\n return RELATIVE_UNIT_RE.test(value);\n}\n\n/* ───────────────────────── shorthand expansion ───────────────────────── */\n\n/** Box-model shorthands whose 1–4 value form expands to four explicit sides. */\nconst BOX_SIDES: Readonly<Record<string, readonly [string, string, string, string]>> = {\n padding: ['padding-top', 'padding-right', 'padding-bottom', 'padding-left'],\n margin: ['margin-top', 'margin-right', 'margin-bottom', 'margin-left'],\n inset: ['top', 'right', 'bottom', 'left'],\n 'border-width': [\n 'border-top-width',\n 'border-right-width',\n 'border-bottom-width',\n 'border-left-width',\n ],\n 'border-style': [\n 'border-top-style',\n 'border-right-style',\n 'border-bottom-style',\n 'border-left-style',\n ],\n 'border-color': [\n 'border-top-color',\n 'border-right-color',\n 'border-bottom-color',\n 'border-left-color',\n ],\n};\n\n/** Split on top-level whitespace, keeping `fn(a, b)` groups intact. */\nfunction splitTopLevel(value: string): string[] {\n const out: string[] = [];\n let depth = 0;\n let cur = '';\n for (const ch of value) {\n if (ch === '(') depth += 1;\n else if (ch === ')') depth = Math.max(0, depth - 1);\n if (depth === 0 && /\\s/.test(ch)) {\n if (cur.length > 0) {\n out.push(cur);\n cur = '';\n }\n continue;\n }\n cur += ch;\n }\n if (cur.length > 0) out.push(cur);\n return out;\n}\n\n/** Map a 1–4 value box shorthand onto its [top, right, bottom, left] sides. */\nfunction boxFourSides(values: readonly string[]): [string, string, string, string] {\n const [a, b, c, d] = values;\n switch (values.length) {\n case 1:\n return [a!, a!, a!, a!];\n case 2:\n return [a!, b!, a!, b!];\n case 3:\n return [a!, b!, c!, b!];\n default:\n return [a!, b!, c!, d!];\n }\n}\n\n/** Expand one declaration into longhand `[property, value]` pairs (single pair if not shorthand). */\nfunction expandShorthand(prop: string, value: string): Array<[string, string]> {\n const box = BOX_SIDES[prop];\n if (box) {\n const parts = splitTopLevel(value);\n if (parts.length >= 1 && parts.length <= 4) {\n const sides = boxFourSides(parts);\n return box.map((p, i) => [p, sides[i]!] as [string, string]);\n }\n return [[prop, value]];\n }\n\n if (prop === 'gap' || prop === 'grid-gap') {\n const parts = splitTopLevel(value);\n if (parts.length === 1) {\n return [\n ['row-gap', parts[0]!],\n ['column-gap', parts[0]!],\n ];\n }\n if (parts.length === 2) {\n return [\n ['row-gap', parts[0]!],\n ['column-gap', parts[1]!],\n ];\n }\n return [[prop, value]];\n }\n\n return [[prop, value]];\n}\n\n/* ───────────────────────── the normalizer ───────────────────────── */\n\nfunction makeDecl(\n table: InheritedPropertyTable,\n prop: string,\n rawValue: string,\n important: boolean,\n): StyleDecl {\n const property = prop.trim().toLowerCase() as CssProperty;\n const value = canonValue(rawValue) as CssValue;\n return {\n property,\n value,\n important,\n relativeToParent: isRelativeValue(value),\n inherited: table.isInherited(property),\n };\n}\n\nexport function createNormalizer(): StyleNormalizer {\n const inherited = createInheritedTable();\n\n const normalizeDeclaration = (\n prop: string,\n value: string,\n important: boolean,\n ): readonly StyleDecl[] => {\n const p = prop.trim().toLowerCase();\n const expanded = expandShorthand(p, value.trim());\n return expanded.map(([lp, lv]) => makeDecl(inherited, lp, lv, important));\n };\n\n const normalizeValue = (prop: CssProperty, raw: string): CssValue => {\n void prop;\n return canonValue(raw) as CssValue;\n };\n\n const normalizeStyleMap = (sm: StyleMap): StyleMap => {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const block of sm.blocks.values()) {\n const decls = new Map<CssProperty, StyleDecl>();\n // Re-canonicalize every value and re-key (the decls are already longhand).\n for (const decl of block.decls.values()) {\n const next: StyleDecl = {\n ...decl,\n value: canonValue(String(decl.value)) as CssValue,\n relativeToParent: isRelativeValue(String(decl.value)),\n inherited: inherited.isInherited(decl.property),\n };\n decls.set(next.property, next);\n }\n // Property-sorted for deterministic iteration/serialization.\n const sorted = new Map<CssProperty, StyleDecl>(\n [...decls.entries()].sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0)),\n );\n const key = conditionKey(block.condition);\n blocks.set(key, { condition: block.condition, decls: sorted });\n }\n return { blocks };\n };\n\n const equals = (a: StyleMap, b: StyleMap): boolean => {\n const na = normalizeStyleMap(a);\n const nb = normalizeStyleMap(b);\n if (na.blocks.size !== nb.blocks.size) return false;\n for (const [key, blockA] of na.blocks) {\n const blockB = nb.blocks.get(key);\n if (!blockB) return false;\n if (blockA.decls.size !== blockB.decls.size) return false;\n for (const [prop, declA] of blockA.decls) {\n const declB = blockB.decls.get(prop);\n if (!declB) return false;\n if (declA.value !== declB.value || declA.important !== declB.important) return false;\n }\n }\n return true;\n };\n\n return {\n version: 'domflax-normalizer@1',\n normalizeDeclaration,\n normalizeValue,\n normalizeStyleMap,\n equals,\n inherited,\n };\n}\n\n/** The shared, process-wide normalizer instance reused by core / patterns / verify. */\nexport const normalizer: StyleNormalizer = createNormalizer();\n\n/* ───────────────────────── superset helper (used by `computed()` matcher) ───────────────────────── */\n\n/**\n * True when `full` contains every declaration of `partial` with an equal normalized value\n * (a per-condition, per-declaration superset test). Both maps are normalized first so the\n * comparison is meaning-based, not string-based. Empty `partial` ⇒ always `true`.\n */\nexport function isStyleSuperset(\n full: StyleMap,\n partial: StyleMap,\n norm: StyleNormalizer = normalizer,\n): boolean {\n const nf = norm.normalizeStyleMap(full);\n const np = norm.normalizeStyleMap(partial);\n for (const [key, want] of np.blocks) {\n const have = nf.blocks.get(key) ?? nf.blocks.get(conditionKey(want.condition));\n if (!have) return false;\n for (const [prop, decl] of want.decls) {\n const got = have.decls.get(prop);\n if (!got || got.value !== decl.value) return false;\n }\n }\n return true;\n}\n\n/** Re-exported for callers that want to (de)construct keys without importing core directly. */\nexport { emptyStyleMap };\n","/**\n * @domflax/pattern-kit — composable matcher vocabulary.\n *\n * A {@link Matcher} is a PURE predicate over a node + its {@link MatchContext}. Matchers never\n * mutate; they only read the (DeepReadonly) IR and the precomputed targeting/selector facts the\n * context exposes. Authors compose them with {@link and}/{@link or}/{@link not} and feed the\n * result into a pattern's `evaluate`.\n *\n * Style-aware matchers (`computed`, `hasOwnVisualStyle`) reason over the NORMALIZED StyleMap via\n * the shared normalizer in `./normalize`, so they query meaning, not raw CSS strings.\n */\n\nimport type {\n DeepReadonly,\n ElementLike,\n IRElement,\n IRNode,\n IRNodeId,\n MatchContext,\n NodeLike,\n StyleMap,\n} from '@domflax/core';\n\nimport { isStyleSuperset, normalizer } from './normalize';\n\n/** A pure predicate: does `node` satisfy this condition in the given match context? */\nexport type Matcher = (node: NodeLike, ctx: MatchContext) => boolean;\n\n/* ───────────────────────── internal helpers ───────────────────────── */\n\nfunction asElement(node: NodeLike): DeepReadonly<IRElement> | null {\n const n = node as DeepReadonly<IRNode>;\n return n.kind === 'element' ? (n as DeepReadonly<IRElement>) : null;\n}\n\nfunction elementChildrenOf(\n el: DeepReadonly<IRElement>,\n ctx: MatchContext,\n): DeepReadonly<IRElement>[] {\n const out: DeepReadonly<IRElement>[] = [];\n for (const childId of el.children) {\n const child = ctx.doc.nodes.get(childId);\n if (child && child.kind === 'element') out.push(child as DeepReadonly<IRElement>);\n }\n return out;\n}\n\n/* ───────────────────────── boolean combinators ───────────────────────── */\n\n/** Logical AND. Empty list ⇒ always matches. Short-circuits on the first failure. */\nexport function and(...matchers: readonly Matcher[]): Matcher {\n return (node, ctx) => matchers.every((m) => m(node, ctx));\n}\n\n/** Logical OR. Empty list ⇒ never matches. Short-circuits on the first success. */\nexport function or(...matchers: readonly Matcher[]): Matcher {\n return (node, ctx) => matchers.some((m) => m(node, ctx));\n}\n\n/** Logical NOT. */\nexport function not(matcher: Matcher): Matcher {\n return (node, ctx) => !matcher(node, ctx);\n}\n\n/* ───────────────────────── structural matchers ───────────────────────── */\n\n/** Matches any element; with `tag`, only elements whose (case-insensitive) tag equals it. */\nexport function isElement(tag?: string): Matcher {\n const want = tag?.toLowerCase();\n return (node) => {\n const el = asElement(node);\n if (!el) return false;\n return want === undefined || el.tag.toLowerCase() === want;\n };\n}\n\n/** Matches an element with exactly one ELEMENT child (text/expr/comment children ignored). */\nexport const hasSingleElementChild: Matcher = (node, ctx) => {\n const el = asElement(node);\n if (!el) return false;\n return elementChildrenOf(el, ctx).length === 1;\n};\n\n/* ───────────────────────── style matchers ───────────────────────── */\n\n/**\n * Matches when the node's computed StyleMap is a SUPERSET of `partial` — i.e. every declaration\n * in `partial` is present in `node.computed` with an equal normalized value. Comparison is\n * meaning-based (both sides normalized first). Empty `partial` always matches.\n */\nexport function computed(partial: StyleMap): Matcher {\n return (node, ctx) => {\n const el = asElement(node);\n if (!el) return false;\n const full = ctx.computedOf(el as unknown as NodeLike) ?? (el.computed as StyleMap);\n return isStyleSuperset(full as StyleMap, partial, normalizer);\n };\n}\n\n/** Visual (paint-establishing) properties that count as \"own visual style\", beyond pure layout. */\nconst VISUAL_PROPERTIES: ReadonlySet<string> = new Set<string>([\n 'background',\n 'background-color',\n 'background-image',\n 'border-top-width',\n 'border-right-width',\n 'border-bottom-width',\n 'border-left-width',\n 'border-top-style',\n 'border-right-style',\n 'border-bottom-style',\n 'border-left-style',\n 'border-top-color',\n 'border-right-color',\n 'border-bottom-color',\n 'border-left-color',\n 'border-radius',\n 'box-shadow',\n 'outline',\n 'outline-width',\n 'outline-style',\n 'outline-color',\n 'text-shadow',\n 'filter',\n 'backdrop-filter',\n 'mix-blend-mode',\n 'opacity',\n]);\n\n/** Values that mean \"no paint\" — a visual property set to one of these does NOT count. */\nconst EMPTY_VISUAL_VALUES: ReadonlySet<string> = new Set<string>([\n 'none',\n '0',\n 'normal',\n 'transparent',\n 'rgba(0, 0, 0, 0)',\n 'initial',\n 'unset',\n 'auto',\n]);\n\n/**\n * Matches when the element paints something of its own: a meaningful background, border, shadow,\n * outline, filter, etc. across ANY style condition. Honours the frontend-set `meta.hasOwnVisualStyle`\n * fast-path, then falls back to scanning the normalized computed StyleMap.\n */\nexport const hasOwnVisualStyle: Matcher = (node, ctx) => {\n const el = asElement(node);\n if (!el) return false;\n if (el.meta.hasOwnVisualStyle) return true;\n\n const computedMap = ctx.computedOf(el as unknown as NodeLike) ?? (el.computed as StyleMap);\n const norm = normalizer.normalizeStyleMap(computedMap as StyleMap);\n for (const block of norm.blocks.values()) {\n for (const decl of block.decls.values()) {\n if (!VISUAL_PROPERTIES.has(String(decl.property))) continue;\n if (!EMPTY_VISUAL_VALUES.has(String(decl.value))) return true;\n }\n }\n return false;\n};\n\n/* ───────────────────────── opacity-barrier / meta matchers ───────────────────────── */\n\n/** Element carries a `ref` (hard opacity barrier). */\nexport const hasRef: Matcher = (node) => asElement(node)?.meta.hasRef ?? false;\n\n/** Element has event handlers (onClick, …). */\nexport const hasEventHandlers: Matcher = (node) => asElement(node)?.meta.hasEventHandlers ?? false;\n\n/** Element has dynamic children (mapped/conditional islands). */\nexport const hasDynamicChildren: Matcher = (node) =>\n asElement(node)?.meta.hasDynamicChildren ?? false;\n\n/** Element's class list contains a dynamic segment (template/expr) → not freely rewritable. */\nexport const hasDynamicClasses: Matcher = (node) => asElement(node)?.classes.hasDynamic ?? false;\n\n/**\n * Element's class list is wholly dynamic / spread-derived (`classes.opaque`, or spread attrs) — its\n * concrete tokens can't be seen or statically rewritten, so a class-rewriting (compress) pattern\n * must decline. Delegates to the context's authoritative {@link MatchContext.isOpaque}.\n */\nexport const opaque: Matcher = (node, ctx) => {\n const el = asElement(node);\n if (!el) return false;\n return ctx.isOpaque(el as unknown as ElementLike);\n};\n\n/**\n * Element is the subject of a combinator selector (`>`/`+`/`~`). Honours the frontend-set meta\n * flag and the precomputed {@link SelectorIndex} in the context.\n */\nexport const targetedByCombinator: Matcher = (node, ctx) => {\n const el = asElement(node);\n if (!el) return false;\n if (el.meta.targetedByCombinator) return true;\n // `el.id` is a branded number; DeepReadonly widens the brand, so re-narrow for the index call.\n return ctx.selectors.targetedByCombinator(el.id as unknown as IRNodeId);\n};\n","/**\n * @domflax/pattern-kit — `validatePattern` (INTERNAL).\n *\n * A small, eager validator + identity wrapper that turns a lowered {@link Pattern} spec into a\n * frozen, contract-checked Pattern. Catching shape errors here (bad category/phase, missing\n * `evaluate`, out-of-range safety) keeps the pass-manager's hot loop free of defensive checks and\n * gives authors an immediate, actionable error at module-load time.\n *\n * This is the PRIVATE lower-level core: it is consumed only by the declarative\n * {@link import('./pattern').definePattern} authoring surface (which compiles a high-level config\n * down to a {@link Pattern} and then runs it through this validator). It is intentionally NOT part\n * of the public package surface — authors use `definePattern` instead.\n */\n\nimport type { PassPhase, Pattern, SafetyLevel } from '@domflax/core';\n\nconst PHASES: ReadonlySet<PassPhase> = new Set<PassPhase>(['flatten', 'compress', 'extract']);\nconst SAFETY_LEVELS: ReadonlySet<SafetyLevel> = new Set<SafetyLevel>([0, 1, 2, 3]);\n\nfunction fail(name: string, why: string): never {\n throw new Error(`definePattern(${name || '<anonymous>'}): ${why}`);\n}\n\n/**\n * Validate and freeze a {@link Pattern}. Throws on any contract violation; otherwise returns the\n * (shallow-frozen) spec unchanged so it can be registered into a {@link Pass}. INTERNAL — see the\n * module header; authors call the declarative {@link import('./pattern').definePattern}.\n */\nexport function validatePattern(spec: Pattern): Pattern {\n if (spec == null || typeof spec !== 'object') {\n throw new Error('definePattern: spec must be an object');\n }\n\n const name = spec.name;\n if (typeof name !== 'string' || name.length === 0) {\n fail(String(name), 'name must be a non-empty string');\n }\n\n if (typeof spec.category !== 'string' || !spec.category.includes('/')) {\n fail(name, `category must be a \"<phase>/<slug>\" string (got ${JSON.stringify(spec.category)})`);\n }\n\n const phase = spec.category.split('/', 1)[0] as PassPhase;\n if (!PHASES.has(phase)) {\n fail(name, `category phase must be one of flatten|compress|extract (got \"${phase}\")`);\n }\n\n if (!SAFETY_LEVELS.has(spec.safety)) {\n fail(name, `safety must be 0|1|2|3 (got ${JSON.stringify(spec.safety)})`);\n }\n\n if (typeof spec.evaluate !== 'function') {\n fail(name, 'evaluate must be a function');\n }\n\n if (spec.priority !== undefined && !Number.isFinite(spec.priority)) {\n fail(name, 'priority must be a finite number when provided');\n }\n\n return Object.freeze({ ...spec });\n}\n","/**\n * @domflax/pattern-kit — `definePattern()`: THE declarative pattern-authoring surface.\n *\n * `definePattern(config)` is the single public way to author a rewrite pattern: definition AND its\n * tests are co-located in one call. It compiles down to the private lower-level\n * {@link import('./define').validatePattern}/{@link Pattern} contract (it never replaces the\n * engine). Authors describe the match as a plain DATA object and the rewrite as a named RECIPE; this\n * module maps each key to the existing matcher combinators and op-draft factories, auto-applies the\n * phase-appropriate safety guards (the full opacity-barrier + selector set for `flatten/*`; the\n * narrower class-rewrite-safety set for `compress/*`) so authors never hand-write them, and threads\n * `doc`/`test` through. Two escape hatches — a `match` predicate and a `rewrite` function — keep\n * exotic patterns (e.g. ones anchored on a parent fragment) expressible.\n *\n * The co-located {@link PatternTest} (`provider`/`cssFiles`/`cases`/`noMatch`/`custom`) is carried on\n * the compiled {@link AuthoredPattern} as `.test`, where the generic harness (`./testing`) reads it:\n * each `case` asserts `before → after`, each `noMatch` asserts the input is left unchanged, and the\n * optional `custom` hook runs arbitrary assertions against the built transform.\n *\n * `style` blocks in the declarative match (and in `childGains`/`mergeStyle` recipes) are PLAIN\n * objects (camelCase or kebab keys) auto-normalized into a superset StyleMap via the shared\n * normalizer — authors never import the normalizer or hand-build a StyleMap.\n *\n * `pattern` remains exported as a DEPRECATED alias of `definePattern` for backward compatibility.\n */\n\nimport type {\n Captures,\n ConditionKey,\n CssProperty,\n DeepReadonly,\n IRElement,\n IRNode,\n IRNodeId,\n MatchContext,\n MatchResult,\n NodeLike,\n NodeMeta,\n PassCategory,\n PassPhase,\n Pattern,\n PatternDoc,\n PreconditionSketch,\n RewriteFactory,\n RewriteOpDraft,\n SafetyLevel,\n StyleBlock,\n StyleDecl,\n StyleMap,\n StyleOrigin,\n StyleConflictPolicy,\n} from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport {\n and,\n computed,\n hasDynamicChildren,\n hasDynamicClasses,\n hasEventHandlers,\n hasOwnVisualStyle,\n hasRef,\n hasSingleElementChild,\n isElement,\n not,\n opaque,\n targetedByCombinator,\n type Matcher,\n} from './combinators';\nimport { validatePattern } from './define';\nimport { normalizer } from './normalize';\n\n/* ───────────────────────── public config shapes ───────────────────────── */\n\n/** A plain CSS style object: camelCase or kebab-case keys, string or number values. */\nexport type PlainStyle = Readonly<Record<string, string | number>>;\n\n/**\n * Declarative match as DATA. Every key maps to one of the existing matcher combinators; an empty\n * object matches any element. Use the `match` FUNCTION escape hatch for anything not expressible\n * here (relational/ancestor/sibling shapes, parent-anchored patterns, …).\n */\nexport interface DeclarativeMatch {\n /** Restrict to a tag (case-insensitive). Omit to match any element. */\n readonly tag?: string;\n /** Computed style the node must be a SUPERSET of (plain object, auto-normalized). */\n readonly style?: PlainStyle;\n /** Require exactly one ELEMENT child. */\n readonly onlyChild?: 'element';\n /** Require the element to paint nothing of its own (no own visual style). */\n readonly paintsNothing?: boolean;\n /** Extra, hand-written predicate AND-ed into the declarative match. */\n readonly where?: Matcher | readonly Matcher[];\n}\n\n/** Escape hatch: a raw match predicate (no auto-guards are added). */\nexport type MatchFn = (node: NodeLike, ctx: MatchContext) => boolean;\n\n/**\n * Flatten recipe: fold inherited styles onto the sole element child (default on), optionally merge\n * `childGains` onto it, then unwrap the node (id-preserving). Mirrors the flatten exemplars.\n */\nexport interface FlattenIntoRecipe {\n readonly flattenInto: 'child';\n /** Plain style merged onto the surviving child (source-wins) before unwrap. */\n readonly childGains?: PlainStyle;\n /** Fold inheritable declarations onto the child first. Default `true`. */\n readonly foldInherited?: boolean;\n}\n\n/** Compress recipe: rebuild the element's class StyleMap; return `null` to decline. */\nexport interface RewriteClassesRecipe {\n readonly rewriteClasses: (computed: StyleMap, ctx: MatchContext) => StyleMap | null;\n /** Keep opaque/selector-bound tokens verbatim. Default `true`. */\n readonly preserveOpaque?: boolean;\n}\n\n/** Compress recipe: drop fully-overridden class tokens (provenance is pruned automatically). */\nexport interface DropClassesRecipe {\n readonly dropClasses: (computed: StyleMap, ctx: MatchContext) => Iterable<string>;\n /** Keep opaque/selector-bound tokens verbatim. Default `true`. */\n readonly preserveOpaque?: boolean;\n}\n\n/** Merge a literal plain style onto the matched element. */\nexport interface MergeStyleRecipe {\n readonly mergeStyle: PlainStyle;\n readonly onConflict?: StyleConflictPolicy;\n}\n\nexport type RewriteRecipe =\n | FlattenIntoRecipe\n | RewriteClassesRecipe\n | DropClassesRecipe\n | MergeStyleRecipe;\n\n/** Escape hatch: a raw rewrite that returns op drafts (or `null`/`[]` for no-op). */\nexport type RewriteFn = (\n ctx: MatchContext,\n rw: RewriteFactory,\n) => readonly RewriteOpDraft[] | null;\n\n/** A single positive before→after assertion run through the pattern's built transform. */\nexport interface PatternTestCase {\n readonly name?: string;\n readonly before: string;\n readonly after: string;\n}\n\n/** Helpers handed to a {@link PatternTest.custom} hook (the built transform + expectation sugar). */\nexport interface TestHelpers {\n /** Run the pattern's transform on `code` (default filename `'X.tsx'`). */\n readonly transform: (code: string, filename?: string) => string;\n /** Assert `before` transforms to `after` (whitespace-normalized). */\n readonly expectTransforms: (before: string, after: string) => void;\n /** Assert `code` is left unchanged (whitespace-normalized). */\n readonly expectUnchanged: (code: string) => void;\n}\n\n/**\n * Co-located test spec for a pattern. The generic harness (`./testing`) builds a transform for the\n * declared `provider` (default `'tailwind'`; `'custom'` resolves the listed `cssFiles`), then runs\n * every `case` (`before → after`), every `noMatch` (left unchanged), and the optional `custom` hook.\n */\nexport interface PatternTest {\n /** Which style provider the harness builds the transform from. Default `'tailwind'`. */\n readonly provider?: 'tailwind' | 'custom';\n /** For `provider: 'custom'` — the project stylesheet paths backing the CSS resolver. */\n readonly cssFiles?: readonly string[];\n /** Positive before→after assertions. */\n readonly cases?: readonly PatternTestCase[];\n /** Inputs the pattern must leave UNCHANGED (barriers, non-matching shapes, safety reverts). */\n readonly noMatch?: readonly string[];\n /** Arbitrary extra assertions against the built transform. */\n readonly custom?: (h: TestHelpers) => void;\n}\n\nexport interface PatternConfig {\n readonly name: string;\n readonly category: PassCategory;\n readonly safety: SafetyLevel;\n readonly priority?: number;\n readonly precondition?: PreconditionSketch;\n readonly doc?: PatternDoc;\n /** Co-located tests consumed by the generic harness (`./testing`). */\n readonly test?: PatternTest;\n /** Declarative match DATA, or a raw predicate escape hatch. Defaults to \"any element\". */\n readonly match?: DeclarativeMatch | MatchFn;\n /** A named rewrite recipe, or a raw op-draft factory escape hatch. */\n readonly rewrite: RewriteRecipe | RewriteFn;\n}\n\n/** A {@link Pattern} that also carries its co-located {@link PatternTest} for the test harness. */\nexport interface AuthoredPattern<C extends Captures = Captures> extends Pattern {\n readonly test?: PatternTest;\n evaluate(ctx: MatchContext, rw: RewriteFactory): MatchResult<C> | null;\n}\n\n/* ───────────────────────── plain-style → StyleMap ───────────────────────── */\n\nfunction camelToKebab(key: string): string {\n if (key.startsWith('--')) return key; // custom property — leave verbatim\n return key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n}\n\n/** Build a single-(base-)condition StyleMap from a plain style object via the shared normalizer. */\nfunction plainToStyleMap(style: PlainStyle): StyleMap {\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [rawKey, rawValue] of Object.entries(style)) {\n const prop = camelToKebab(rawKey);\n for (const decl of normalizer.normalizeDeclaration(prop, String(rawValue), false)) {\n decls.set(decl.property, decl);\n }\n }\n const block: StyleBlock = { condition: BASE_CONDITION, decls };\n return { blocks: new Map<ConditionKey, StyleBlock>([[conditionKey(BASE_CONDITION), block]]) };\n}\n\n/* ───────────────────────── local meta / selector matchers ───────────────────────── */\n\nfunction asElement(node: NodeLike): DeepReadonly<IRElement> | null {\n const n = node as DeepReadonly<IRNode>;\n return n.kind === 'element' ? (n as DeepReadonly<IRElement>) : null;\n}\n\nfunction metaFlag(flag: keyof NodeMeta): Matcher {\n return (node) => Boolean(asElement(node)?.meta[flag]);\n}\n\n/** Element renders raw/`dangerouslySetInnerHTML` markup — a hard opacity barrier. */\nconst hasRawHtml: Matcher = metaFlag('hasDangerousHtml');\n\n/**\n * Unwrapping/removing this node would change the combinator / structural-pseudo match-set of itself,\n * its child, or a former sibling. Empty `reparentImpact` ⇒ structurally safe to hoist.\n */\nconst affectsSelectorMatching: Matcher = (node, ctx) => {\n const el = asElement(node);\n if (!el) return false;\n return ctx.selectors.reparentImpact(el.id as unknown as IRNodeId).size > 0;\n};\n\n/**\n * The opacity-barrier + selector-safety guards every `flatten/*` pattern must carry. Auto-applied to\n * the declarative match so authors never hand-write them (the flatten exemplars spell them out).\n *\n * Flatten UNWRAPS the element (moving its children into a new parent and dropping its box), so every\n * opacity barrier matters: a ref, event handler, dynamic child, or raw HTML on the wrapper — or any\n * selector the reparent would disturb — makes the flatten unsafe.\n */\nconst FLATTEN_GUARDS: Matcher = and(\n not(hasRef),\n not(hasEventHandlers),\n not(hasDynamicChildren),\n not(hasRawHtml),\n not(targetedByCombinator),\n not(affectsSelectorMatching),\n);\n\n/**\n * The guards every `compress/*` pattern must carry. Compress ONLY ever rewrites the element's OWN\n * class tokens (e.g. `px-4 py-4 → p-4`) — it never touches the element's structure, children, or\n * identity. A dynamic `{expr}` child, a ref, an event handler, or `dangerouslySetInnerHTML` is\n * therefore wholly unaffected by a class-only change, so — unlike flatten — those opacity barriers\n * must NOT gate compress. Compress is gated ONLY on what actually makes a class rewrite unsafe:\n * • a className we can't statically rewrite — a dynamic segment ({@link hasDynamicClasses}) or a\n * wholly dynamic / spread-derived list ({@link opaque}); and\n * • the selector-safety guard — a class a CSS combinator selector structurally depends on\n * ({@link targetedByCombinator}) must not be dropped or rewritten.\n */\nconst COMPRESS_GUARDS: Matcher = and(\n not(hasDynamicClasses),\n not(opaque),\n not(targetedByCombinator),\n);\n\n/* ───────────────────────── match compilation ───────────────────────── */\n\n/** The auto-applied guard set for a pattern's phase (compress vs flatten get different barriers). */\nfunction autoGuardsFor(category: PassCategory): Matcher | null {\n switch (category.split('/', 1)[0] as PassPhase) {\n case 'flatten':\n return FLATTEN_GUARDS;\n case 'compress':\n return COMPRESS_GUARDS;\n default:\n return null;\n }\n}\n\nfunction compileDeclarativeMatch(m: DeclarativeMatch): Matcher {\n const parts: Matcher[] = [isElement(m.tag)];\n if (m.style) parts.push(computed(plainToStyleMap(m.style)));\n if (m.onlyChild === 'element') parts.push(hasSingleElementChild);\n if (m.paintsNothing) parts.push(not(hasOwnVisualStyle));\n if (m.where) {\n const extra = Array.isArray(m.where) ? (m.where as readonly Matcher[]) : [m.where as Matcher];\n for (const w of extra) parts.push(w);\n }\n return and(...parts);\n}\n\nfunction compileMatch(\n match: DeclarativeMatch | MatchFn | undefined,\n category: PassCategory,\n): MatchFn {\n // Escape hatch: a raw predicate takes full control (no auto-guards).\n if (typeof match === 'function') return match;\n\n const declarative = compileDeclarativeMatch(match ?? {});\n const guards = autoGuardsFor(category);\n const guarded = guards ? and(declarative, guards) : declarative;\n return (node, ctx) => guarded(node, ctx);\n}\n\n/* ───────────────────────── rewrite compilation ───────────────────────── */\n\n/** Clone `sm`, pruning every `shadowed` provenance entry that references a dropped class token. */\nfunction pruneShadowed(sm: StyleMap, drop: ReadonlySet<string>): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n const filtered = (decl.shadowed ?? []).filter(\n (o) => !(o.kind === 'class' && drop.has(o.className)),\n );\n const rest: StyleDecl = { ...decl };\n delete (rest as { shadowed?: readonly StyleOrigin[] }).shadowed;\n const next: StyleDecl = filtered.length > 0 ? { ...rest, shadowed: filtered } : rest;\n decls.set(prop, next);\n }\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\nfunction compileFlattenInto(recipe: FlattenIntoRecipe): RewriteFn {\n const childGains = recipe.childGains ? plainToStyleMap(recipe.childGains) : null;\n const fold = recipe.foldInherited !== false;\n return (ctx, rw) => {\n const wrapper = ctx.node;\n const child = ctx.onlyElementChild();\n if (!child) return null;\n const ops: RewriteOpDraft[] = [];\n if (fold) ops.push(rw.foldInheritedStyles(wrapper, child, { conditions: 'all' }));\n if (childGains) ops.push(rw.mergeStyle(child, null, childGains, 'source-wins'));\n ops.push(rw.unwrap(wrapper));\n return ops;\n };\n}\n\nfunction compileRewrite(rewrite: RewriteRecipe | RewriteFn): RewriteFn {\n if (typeof rewrite === 'function') return rewrite;\n\n if ('flattenInto' in rewrite) return compileFlattenInto(rewrite);\n\n if ('rewriteClasses' in rewrite) {\n const preserveOpaque = rewrite.preserveOpaque ?? true;\n return (ctx, rw) => {\n const next = rewrite.rewriteClasses(ctx.computed(), ctx);\n if (!next) return null;\n return [rw.setClassList(ctx.node, next, preserveOpaque)];\n };\n }\n\n if ('dropClasses' in rewrite) {\n const preserveOpaque = rewrite.preserveOpaque ?? true;\n return (ctx, rw) => {\n const drop = new Set<string>(rewrite.dropClasses(ctx.computed(), ctx));\n if (drop.size === 0) return null;\n return [rw.setClassList(ctx.node, pruneShadowed(ctx.computed(), drop), preserveOpaque)];\n };\n }\n\n // MergeStyleRecipe\n const style = plainToStyleMap(rewrite.mergeStyle);\n const onConflict = rewrite.onConflict ?? 'abort';\n return (ctx, rw) => [rw.mergeStyle(ctx.node, null, style, onConflict)];\n}\n\n/* ───────────────────────── the public factory ───────────────────────── */\n\n/**\n * THE declarative pattern-authoring function. Compile a {@link PatternConfig} (definition + co-located\n * {@link PatternTest}) into a validated {@link AuthoredPattern}: a normal {@link Pattern} (registerable\n * into any {@link import('@domflax/core').Pass}) that also exposes its `test` for the generic harness.\n */\nexport function definePattern(config: PatternConfig): AuthoredPattern {\n const matchFn = compileMatch(config.match, config.category);\n const rewriteFn = compileRewrite(config.rewrite);\n\n const spec: AuthoredPattern = {\n name: config.name,\n category: config.category,\n safety: config.safety,\n priority: config.priority,\n precondition: config.precondition,\n doc: config.doc,\n test: config.test,\n evaluate(ctx: MatchContext, rw: RewriteFactory): MatchResult | null {\n if (!matchFn(ctx.node as unknown as NodeLike, ctx)) return null;\n const ops = rewriteFn(ctx, rw);\n if (!ops || ops.length === 0) return null;\n return { ops };\n },\n };\n\n // `validatePattern` validates + freezes; the spread preserves `test` at runtime.\n return validatePattern(spec) as AuthoredPattern;\n}\n\n/**\n * @deprecated Use {@link definePattern}. Retained as a thin alias for backward compatibility.\n */\nexport const pattern = definePattern;\n","/**\n * @domflax/patterns — flatten pattern: `display-contents-wrapper`.\n *\n * Collapses a wrapper that has explicitly opted OUT of generating a box:\n *\n * <div style=\"display:contents\"><Child/></div> → <Child/>\n *\n * `display:contents` makes an element generate NO box of its own — its children render exactly as if\n * they were direct children of the element's parent. A `display:contents` wrapper with a single\n * element child is therefore already a layout passthrough: it contributes nothing to flow, paint\n * (a contents box paints nothing), formatting, stacking, or containing-block resolution. Removing it\n * and hoisting the child produces a tree that is layout-identical — the wrapper's only remaining\n * effect was inheritance, which is preserved by folding inheritable declarations onto the child first.\n *\n * This is the safest possible wrapper-elimination: the box being removed provably did not exist.\n * The opacity-barrier + selector-safety guards (ref/handlers/dynamic-children/raw-html/combinator/\n * reparent-impact) are auto-applied for every `flatten/*` pattern; the `where` predicates add the\n * passthrough-specific requirements (no own attrs / dynamic-or-spread classes, no `var()` coupling,\n * not a component, not a structural-pseudo subject).\n *\n * (Chosen as the safe variant of the size-hoisting \"full-size passthrough\" idea: hoisting an explicit\n * `width/height:100%` onto a child is only sound when the child is block-level and unsized, which is\n * not knowable from the wrapper alone — whereas a `display:contents` box is a passthrough by definition.)\n */\n\nimport type {\n DeepReadonly,\n IRElement,\n IRNode,\n IRNodeId,\n NodeLike,\n NodeMeta,\n} from '@domflax/core';\n\nimport { definePattern, hasDynamicClasses, not, type Matcher } from '@domflax/pattern-kit';\n\n/* ───────────────────────── local meta/attr/selector matchers ───────────────────────── */\n\nfunction asEl(node: NodeLike): DeepReadonly<IRElement> | null {\n const n = node as DeepReadonly<IRNode>;\n return n.kind === 'element' ? (n as DeepReadonly<IRElement>) : null;\n}\n\nfunction metaOf(node: NodeLike): DeepReadonly<NodeMeta> | null {\n return asEl(node)?.meta ?? null;\n}\n\n/**\n * Element exposes custom properties to a descendant — removing its box could sever a `var()` coupling,\n * so it is NOT a free passthrough. (A `display:contents` box establishes no formatting/stacking/box\n * context and is no containing block, so those flags need not be checked.)\n */\nconst declaresCustomProperties: Matcher = (node) => metaOf(node)?.declaresCustomProperties ?? false;\n\n/** Hard opacity barriers beyond the auto-applied set: spread attrs, component identity. */\nconst hasSpreadAttrs: Matcher = (node) => metaOf(node)?.hasSpreadAttrs ?? false;\nconst isComponentNode: Matcher = (node) => metaOf(node)?.isComponent ?? false;\n\n/** Element carries own attributes (id / data-* / …) beyond its class list — possible selector/JS hook. */\nconst hasOwnAttrs: Matcher = (node) => {\n const el = asEl(node);\n if (!el) return false;\n return el.attrs.entries.size > 0 || el.attrs.spreads.length > 0;\n};\n\n/**\n * Element is the subject of a structural pseudo (`:first/:last/:only/:nth-*`). Honours the meta flag\n * and the precomputed {@link SelectorIndex}.\n */\nconst targetedByStructuralPseudo: Matcher = (node, ctx) => {\n const el = asEl(node);\n if (!el) return false;\n if (el.meta.targetedByStructuralPseudo) return true;\n return ctx.selectors.targetedByStructuralPseudo(el.id as unknown as IRNodeId);\n};\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/**\n * Flatten a `display:contents` wrapper (a box that generates no box) into its sole element child,\n * folding any inheritable styles down first so inherited values survive the removal.\n */\nexport const displayContentsWrapper = definePattern({\n name: 'display-contents-wrapper',\n category: 'flatten/display-contents-wrapper',\n safety: 2,\n doc: {\n title: 'Flatten display:contents wrapper',\n summary:\n 'A div with display:contents (which generates no box) wrapping a single element child, with ' +\n 'no own visual style, no attributes beyond an inert class, and no opacity barriers, is removed; ' +\n 'its sole child is hoisted in its place.',\n before: '<div style=\"display:contents\"><Child/></div>',\n after: '<Child/>',\n safetyRationale:\n 'A display:contents element generates no box at all, so its children already render as direct ' +\n \"children of its parent; removing it is layout-identical. It paints nothing, establishes no \" +\n 'formatting/stacking/box context, is no containing block, carries no ' +\n 'ref/handlers/dynamic-children/html/spread/component identity, owns no targetable attrs / ' +\n 'custom-property coupling, and is not a combinator/structural-pseudo subject; inheritable ' +\n 'styles are folded onto the child before removal.',\n },\n match: {\n tag: 'div',\n style: { display: 'contents' },\n onlyChild: 'element',\n paintsNothing: true,\n where: [\n not(declaresCustomProperties),\n not(hasOwnAttrs),\n not(hasDynamicClasses),\n not(hasSpreadAttrs),\n not(isComponentNode),\n not(targetedByStructuralPseudo),\n ],\n },\n rewrite: { flattenInto: 'child' },\n test: {\n cases: [\n {\n // `display:contents` generates no box, so removing it is provably layout-identical → the\n // wrapper is flattened even under the conservative gate; the child is hoisted.\n before: '<div className=\"contents\"><a className=\"text-blue-500\">Link</a></div>',\n after: '<a className=\"text-blue-500\">Link</a>',\n },\n ],\n noMatch: [\n // A ref pins the wrapper's element identity (a hard opacity barrier) → not a passthrough.\n '<div className=\"contents\" ref={rootRef}><a className=\"text-blue-500\">Link</a></div>',\n ],\n },\n});\n","/**\n * @domflax/patterns — flatten pattern: `empty-style-div`.\n *\n * Collapses the most common piece of structural noise of all: a `<div>` whose ONLY role is to wrap\n * a single child while contributing nothing to layout or paint —\n *\n * <div><Child/></div> (no styles at all)\n * <div style=\"display:block\"><Child/></div> (the default; still a no-op box)\n *\n * Such a div is layout-neutral: it is a plain block box with no own visual style, establishes no\n * box / formatting / stacking context, is not a containing block, and declares no custom properties\n * a descendant might read. Its box is therefore indistinguishable from \"not being there\", so it can\n * be unwrapped into its sole child.\n *\n * Authored with the declarative {@link definePattern} API. The opacity-barrier + selector-safety\n * guards (ref/handlers/dynamic-children/raw-html/combinator/reparent-impact) are applied\n * automatically for every `flatten/*` pattern; the `where` predicates below add the LAYOUT-neutrality\n * requirements specific to this pattern (no non-block display, no box/formatting/stacking context, no\n * containing block, no custom-property coupling, no structural-pseudo targeting).\n */\n\nimport type {\n CssProperty,\n DeepReadonly,\n IRElement,\n IRNode,\n IRNodeId,\n NodeLike,\n NodeMeta,\n StyleMap,\n} from '@domflax/core';\n\nimport { definePattern, not, type Matcher } from '@domflax/pattern-kit';\n\n/* ───────────────────────── local matcher helpers ───────────────────────── */\n\n/** Narrow a NodeLike to a (readonly) element, or null. */\nfunction asEl(node: NodeLike): DeepReadonly<IRElement> | null {\n const n = node as DeepReadonly<IRNode>;\n return n.kind === 'element' ? (n as DeepReadonly<IRElement>) : null;\n}\n\n/** A boolean `meta` flag, lifted into a {@link Matcher}. Mirrors how core's combinators read meta. */\nfunction metaFlag(flag: keyof NodeMeta): Matcher {\n return (node) => Boolean(asEl(node)?.meta[flag]);\n}\n\n/** Wrapper establishes an intrinsic/explicit box (sizing) — NOT layout-neutral. */\nconst establishesBox = metaFlag('establishesBox');\n/** Wrapper establishes a formatting context (flex/grid/flow-root/…) — NOT layout-neutral. */\nconst establishesFormattingContext = metaFlag('establishesFormattingContext');\n/** Wrapper establishes a stacking context (transform/opacity<1/z-index/…) — NOT layout-neutral. */\nconst establishesStackingContext = metaFlag('establishesStackingContext');\n/** Wrapper is the containing block for abs/fixed descendants — removing it would reposition them. */\nconst isContainingBlock = metaFlag('isContainingBlock');\n/** Wrapper sets `--*` custom properties a descendant reads (author-var coupling). */\nconst declaresCustomProperties = metaFlag('declaresCustomProperties');\n\n/**\n * Wrapper is a structural-pseudo target (:first/:last/:only/:nth-child/-of-type). Honours the\n * frontend-set meta flag and the precomputed {@link SelectorIndex}. Unwrapping such a node would\n * change a selector's match-set.\n */\nconst targetedByStructuralPseudo: Matcher = (node, ctx) => {\n const el = asEl(node);\n if (!el) return false;\n if (el.meta.targetedByStructuralPseudo) return true;\n return ctx.selectors.targetedByStructuralPseudo(el.id as unknown as IRNodeId);\n};\n\nconst DISPLAY = 'display' as CssProperty;\n\n/**\n * True when the wrapper sets `display` to anything other than the block default in ANY condition.\n * An `inline`/`inline-block`/`flex`/`grid`/`contents`/`none` div is NOT layout-neutral — its box (or\n * lack of one) participates in layout differently from its surviving child.\n */\nconst hasNonBlockDisplay: Matcher = (node, ctx) => {\n const el = asEl(node);\n if (!el) return false;\n const sm: StyleMap = ctx.computedOf(el as unknown as NodeLike) ?? (el.computed as StyleMap);\n for (const block of sm.blocks.values()) {\n const decl = block.decls.get(DISPLAY);\n if (decl && String(decl.value) !== 'block') return true;\n }\n return false;\n};\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/**\n * Flatten a layout-neutral, style-free `<div>` wrapper into its sole element child.\n */\nexport const emptyStyleDiv = definePattern({\n name: 'empty-style-div',\n category: 'flatten/empty-style-div',\n safety: 1,\n doc: {\n title: 'Flatten empty-style div wrapper',\n summary:\n 'A layout-neutral div (display:block default, no box/visual styles) that wraps a single ' +\n 'child is removed; the child is hoisted into its place.',\n before: '<div><Child/></div>',\n after: '<Child/>',\n safetyRationale:\n 'Wrapper is a plain block box that paints nothing, establishes no box/formatting/stacking ' +\n 'context, is no containing block, has no custom-property coupling, carries no ' +\n 'ref/handlers/dynamic children/raw HTML, and is neither a combinator subject nor a ' +\n 'structural-pseudo target; inheritable styles are folded onto the child before removal.',\n },\n match: {\n tag: 'div',\n onlyChild: 'element',\n paintsNothing: true,\n where: [\n not(hasNonBlockDisplay),\n not(establishesBox),\n not(establishesFormattingContext),\n not(establishesStackingContext),\n not(isContainingBlock),\n not(declaresCustomProperties),\n not(targetedByStructuralPseudo),\n ],\n },\n rewrite: { flattenInto: 'child' },\n test: {\n cases: [\n {\n // A layout-neutral, style-free block div is a provably-safe flatten → removed, child hoisted.\n before: '<div><span className=\"bg-red-200\">Hi</span></div>',\n after: '<span className=\"bg-red-200\">Hi</span>',\n },\n ],\n noMatch: [\n // The wrapper paints its own background (own visual style) → not layout-neutral, kept.\n '<div className=\"bg-blue-500\"><span className=\"bg-red-200\">Hi</span></div>',\n ],\n },\n});\n","/**\n * @domflax/patterns — flatten pattern: `flex-center-wrapper`.\n *\n * Collapses the ubiquitous \"centering wrapper\" idiom\n *\n * <div style=\"display:flex; align-items:center; justify-content:center\"><Child/></div>\n *\n * into its sole child, pushing the centering intent down onto the child as `place-self: center`.\n * The wrapper only exists to center one element; once `place-self:center` lives on the child the\n * wrapper is pure structural noise and can go.\n *\n * Authored with the declarative {@link definePattern} API: the match is the flex-centering\n * computed-style signature on a single-element-child `<div>` that paints nothing of its own; the\n * recipe folds inheritable styles onto the child, grants it `place-self:center`, then unwraps the\n * wrapper (id-preserving). The opacity-barrier + selector-safety guards are applied automatically by\n * the `definePattern` factory for every `flatten/*` pattern.\n */\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/**\n * Flatten a flex-centering `<div>` wrapper into its sole element child, granting the child\n * `place-self:center`.\n */\nexport const flexCenterWrapper = definePattern({\n name: 'flex-center-wrapper',\n category: 'flatten/flex-center-wrapper',\n safety: 2,\n doc: {\n title: 'Flatten flex-centering wrapper',\n summary:\n 'A div that only centers a single child (display:flex; align-items:center; ' +\n 'justify-content:center) is removed; the child gains place-self:center.',\n before: '<div style=\"display:flex;align-items:center;justify-content:center\"><Child/></div>',\n after: '<Child style=\"place-self:center\"/>',\n safetyRationale:\n 'Wrapper paints nothing, carries no ref/handlers/dynamic children, and is not a combinator ' +\n 'subject; inheritable styles are folded onto the child before removal.',\n },\n match: {\n tag: 'div',\n style: { display: 'flex', alignItems: 'center', justifyContent: 'center' },\n onlyChild: 'element',\n paintsNothing: true,\n },\n rewrite: {\n flattenInto: 'child',\n childGains: { placeSelf: 'center' },\n },\n // Collapsing a flex-centering wrapper to `place-self:center` on the child only stays centered when\n // the child's NEW parent is flex/grid; moreover the wrapper's own `display:flex` establishes a\n // formatting context. Both make this a `needs-verification` flatten, which the conservative\n // production gate (`'provably-safe'`, used by the harness) intentionally REVERTS — so every case\n // here is a no-match: the wrapper is preserved. Op-level rewrite correctness (purity, id-preserving\n // unwrap, opacity-barrier safety) is still asserted by the invariant suite over every pattern.\n test: {\n noMatch: [\n // Even under a static flex/grid parent the centering flatten is not provably layout-neutral\n // (the wrapper itself establishes a flex formatting context) → left unchanged.\n '<div className=\"grid\">' +\n '<div className=\"flex items-center justify-center\"><span className=\"bg-red-200\">x</span></div>' +\n '</div>',\n // Non-flex/grid parent (document root): place-self centering would not hold → left unchanged.\n '<div className=\"flex justify-center items-center\"><div className=\"bg-red-200\">Hello</div></div>',\n // onClick is a hard opacity barrier → the wrapper is load-bearing regardless of the gate.\n '<div className=\"flex justify-center items-center\" onClick={handleClick}>' +\n '<div className=\"bg-red-200\">Hello</div>' +\n '</div>',\n ],\n },\n});\n","/**\n * @domflax/patterns — flatten pattern: `inline-flex-center-wrapper`.\n *\n * Collapses the inline-flex flavour of the \"centering wrapper\" idiom\n *\n * <div style=\"display:inline-flex; align-items:center; justify-content:center\"><Child/></div>\n *\n * into its sole child, pushing the centering intent down onto the child as `place-self: center`.\n * Like its block-level `flex-center-wrapper` sibling the wrapper only exists to center one element;\n * once `place-self:center` lives on the child the wrapper is pure structural noise and can go.\n *\n * Authored with the declarative {@link definePattern} API: the match is the inline-flex-centering\n * computed-style signature on a single-element-child `<div>` that paints nothing of its own; the\n * recipe folds inheritable styles onto the child, grants it `place-self:center`, then unwraps the\n * wrapper (id-preserving). The opacity-barrier + selector-safety guards are applied automatically by\n * the `definePattern` factory for every `flatten/*` pattern.\n */\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/**\n * Flatten an inline-flex-centering `<div>` wrapper into its sole element child, granting the child\n * `place-self:center`.\n */\nexport const inlineFlexCenterWrapper = definePattern({\n name: 'inline-flex-center-wrapper',\n category: 'flatten/inline-flex-center-wrapper',\n safety: 2,\n doc: {\n title: 'Flatten inline-flex-centering wrapper',\n summary:\n 'A div that only centers a single child (display:inline-flex; align-items:center; ' +\n 'justify-content:center) is removed; the child gains place-self:center.',\n before:\n '<div style=\"display:inline-flex;align-items:center;justify-content:center\"><Child/></div>',\n after: '<Child style=\"place-self:center\"/>',\n safetyRationale:\n 'Wrapper paints nothing, carries no ref/handlers/dynamic children, and is not a combinator ' +\n 'subject; inheritable styles are folded onto the child before removal.',\n },\n match: {\n tag: 'div',\n style: { display: 'inline-flex', alignItems: 'center', justifyContent: 'center' },\n onlyChild: 'element',\n paintsNothing: true,\n },\n rewrite: {\n flattenInto: 'child',\n childGains: { placeSelf: 'center' },\n },\n // Like its block-level sibling, this centering flatten is `needs-verification` (the wrapper's own\n // `display:inline-flex` establishes a formatting context, and place-self centering only holds under\n // a flex/grid parent), so the conservative production gate (`'provably-safe'`) REVERTS it — every\n // case here is a no-match. Op-level correctness is covered by the invariant suite.\n test: {\n noMatch: [\n // Even under a static flex/grid parent the centering flatten is not provably layout-neutral.\n '<div className=\"grid\">' +\n '<div className=\"inline-flex items-center justify-center\"><span className=\"bg-red-200\">x</span></div>' +\n '</div>',\n // Non-flex/grid parent (document root) → left unchanged.\n '<div className=\"inline-flex justify-center items-center\"><div className=\"bg-red-200\">Hello</div></div>',\n // onClick is a hard opacity barrier → the wrapper is load-bearing regardless of the gate.\n '<div className=\"inline-flex justify-center items-center\" onClick={handleClick}>' +\n '<div className=\"bg-red-200\">Hello</div>' +\n '</div>',\n ],\n },\n});\n","/**\n * @domflax/patterns — flatten pattern: `nested-flex-merge`.\n *\n * Collapses a redundant nesting of two flex containers\n *\n * <div style=\"display:flex; align-items:center; gap:8px\">\n * <div style=\"display:flex; flex-direction:column\"> … </div>\n * </div>\n *\n * where the OUTER flex container's sole element child is ITSELF a flex container, into a single\n * flex container that carries the union of both elements' flex declarations. The outer wrapper's\n * box is then structural noise (it paints nothing and only establishes a flex context that the\n * merged child now also establishes), so it is removed.\n *\n * Authored with the declarative {@link pattern} API: the match is a flex `<div>` with a single\n * element child painting nothing of its own (auto-guarded against opacity barriers / combinator\n * targeting like every `flatten/*` pattern). The value-relational reasoning — the child must also\n * be a (non-combinator) flex container, the wrapper must carry only transferable flex/inheritable\n * declarations, and the two must not conflict on any shared flex property — lives in the `rewrite`\n * op-draft factory escape hatch, which folds inherited styles, transfers the wrapper's flex\n * declarations onto the child (target-wins), then unwraps the wrapper.\n */\n\nimport type {\n ConditionKey,\n CssProperty,\n MatchContext,\n NodeLike,\n RewriteFactory,\n RewriteOpDraft,\n StyleBlock,\n StyleDecl,\n StyleMap,\n} from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport {\n and,\n computed,\n definePattern,\n isElement,\n normalizer,\n not,\n targetedByCombinator,\n type Matcher,\n} from '@domflax/pattern-kit';\n\n/* ───────────────────────── style fixtures ───────────────────────── */\n\n/** Build a single-(base-)condition StyleMap from raw `[property, value]` pairs via the shared normalizer. */\nfunction baseConditionStyleMap(decls: readonly (readonly [string, string])[]): StyleMap {\n const map = new Map<CssProperty, StyleDecl>();\n for (const [prop, value] of decls) {\n for (const decl of normalizer.normalizeDeclaration(prop, value, false)) {\n map.set(decl.property, decl);\n }\n }\n const block: StyleBlock = { condition: BASE_CONDITION, decls: map };\n const blocks = new Map<ConditionKey, StyleBlock>([[conditionKey(BASE_CONDITION), block]]);\n return { blocks };\n}\n\n/** Both containers must declare `display:flex` (the matched signature). */\nconst DISPLAY_FLEX: StyleMap = baseConditionStyleMap([['display', 'flex']]);\n\n/**\n * The flex-CONTAINER property set this pattern is allowed to transfer from the wrapper onto the\n * child. (Longhands only, since the shared normalizer expands `gap` → `row-gap`/`column-gap`.)\n */\nconst FLEX_CONTAINER_PROPERTIES: ReadonlySet<string> = new Set<string>([\n 'display',\n 'flex-direction',\n 'flex-wrap',\n 'justify-content',\n 'align-items',\n 'align-content',\n 'place-content',\n 'place-items',\n 'row-gap',\n 'column-gap',\n]);\n\n/* ───────────────────────── style reasoning helpers (pure) ───────────────────────── */\n\n/**\n * True iff every declaration on the wrapper is either a transferable flex-container property or an\n * inheritable property (which we fold onto the child). If the wrapper carries anything else\n * (padding/margin/sizing/position/…), removing its box would change layout, so the merge is unsafe.\n */\nfunction outerMergeSafe(sm: StyleMap): boolean {\n const norm = normalizer.normalizeStyleMap(sm);\n for (const block of norm.blocks.values()) {\n for (const decl of block.decls.values()) {\n if (FLEX_CONTAINER_PROPERTIES.has(String(decl.property))) continue;\n if (decl.inherited) continue;\n return false;\n }\n }\n return true;\n}\n\n/**\n * True iff the two containers disagree on any shared flex-container property (in any matching\n * condition) — e.g. `flex-direction:row` vs `flex-direction:column`. Such a conflict makes the\n * merge ambiguous, so the pattern skips.\n */\nfunction flexConflict(outer: StyleMap, inner: StyleMap): boolean {\n const a = normalizer.normalizeStyleMap(outer);\n const b = normalizer.normalizeStyleMap(inner);\n for (const [key, blockA] of a.blocks) {\n const blockB = b.blocks.get(key);\n if (!blockB) continue;\n for (const [prop, declA] of blockA.decls) {\n if (!FLEX_CONTAINER_PROPERTIES.has(String(prop))) continue;\n const declB = blockB.decls.get(prop);\n if (declB && declB.value !== declA.value) return true;\n }\n }\n return false;\n}\n\n/** Project the wrapper's transferable flex-container declarations into a fresh StyleMap. */\nfunction extractFlexStyle(sm: StyleMap): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n if (FLEX_CONTAINER_PROPERTIES.has(String(prop))) decls.set(prop, decl);\n }\n if (decls.size > 0) blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/** The inner (surviving) flex container: also a flex `<div>`, and not a combinator subject (it is reparented). */\nconst isInnerFlex: Matcher = and(\n isElement('div'),\n computed(DISPLAY_FLEX),\n not(targetedByCombinator),\n);\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/**\n * Flatten a flex container whose sole child is a compatible flex container into a single container.\n */\nexport const nestedFlexMerge = definePattern({\n name: 'nested-flex-merge',\n category: 'flatten/nested-flex-merge',\n safety: 2,\n doc: {\n title: 'Merge nested flex containers',\n summary:\n 'A flex container whose only child is itself a flex container with non-conflicting flex ' +\n 'properties is collapsed into one; the wrapper is removed and its flex declarations merge ' +\n 'onto the surviving child.',\n before:\n '<div style=\"display:flex;align-items:center;gap:8px\">' +\n '<div style=\"display:flex;flex-direction:column\"/></div>',\n after: '<div style=\"display:flex;flex-direction:column;align-items:center;gap:8px\"/>',\n safetyRationale:\n 'The wrapper paints nothing, declares only flex-container/inheritable properties, carries no ' +\n 'ref/handlers/dynamic children, and is not a combinator subject; the two containers do not ' +\n 'conflict on any flex property, so the union is unambiguous and lossless.',\n },\n match: {\n tag: 'div',\n style: { display: 'flex' },\n onlyChild: 'element',\n paintsNothing: true,\n },\n rewrite: (ctx: MatchContext, rw: RewriteFactory): readonly RewriteOpDraft[] | null => {\n const outer = ctx.node;\n const inner = ctx.onlyElementChild();\n if (!inner) return null;\n if (!isInnerFlex(inner as unknown as NodeLike, ctx)) return null;\n\n const outerStyle = ctx.computed();\n const innerStyle = ctx.computedOf(inner as unknown as NodeLike);\n\n // The wrapper must carry nothing that would be lost when its box is removed …\n if (!outerMergeSafe(outerStyle)) return null;\n // … and the two containers must agree on every shared flex property.\n if (flexConflict(outerStyle, innerStyle)) return null;\n\n return [\n // 1. Preserve inheritable values (color/font/…) by folding them onto the child first.\n rw.foldInheritedStyles(outer, inner, { conditions: 'all' }),\n // 2. Transfer the wrapper's flex-container declarations onto the child (target-wins keeps the\n // child's value for any shared property — identical anyway, we proved non-conflict).\n rw.mergeStyle(inner, null, extractFlexStyle(outerStyle), 'target-wins'),\n // 3. Remove the wrapper (structural-safe; hoists the child and preserves its IRNodeId).\n rw.unwrap(outer),\n ];\n },\n // Merging the outer flex container into the inner removes the outer's box, but a `display:flex`\n // wrapper establishes a formatting context, so this is a `needs-verification` flatten that the\n // conservative production gate (`'provably-safe'`) REVERTS — every case here is a no-match. The\n // merge's op-level correctness (purity, id-preserving unwrap, opacity-barrier safety) is asserted\n // by the invariant suite over every pattern.\n test: {\n noMatch: [\n // The merge is real but not provably layout-neutral (the wrapper establishes a flex context),\n // so under the conservative gate the nested containers are left in place.\n '<div className=\"flex items-center gap-2\" data-x=\"1\"><div className=\"flex flex-col\">X</div></div>',\n // A non-flex wrapper does not match the flex-container signature → left unchanged anyway.\n '<div className=\"block bg-blue-500\"><div className=\"flex flex-col\">X</div></div>',\n ],\n },\n});\n","/**\n * @domflax/patterns — flatten pattern: `nested-grid-merge`.\n *\n * Collapses a redundant nesting of two grid containers\n *\n * <div style=\"display:grid; gap:8px\">\n * <div style=\"display:grid; grid-template-columns:1fr 1fr\"> … </div>\n * </div>\n *\n * where the OUTER grid container's sole element child is ITSELF a grid container, into a single grid\n * container carrying the union of both elements' grid declarations. The outer wrapper's box is then\n * structural noise (it paints nothing and only establishes a grid context the merged child now also\n * establishes), so it is removed.\n *\n * This is the grid analogue of `nested-flex-merge`. The declarative match is a grid `<div>` with a\n * single element child painting nothing of its own (auto-guarded against opacity barriers / combinator\n * targeting like every `flatten/*` pattern). The value-relational reasoning — the child must also be a\n * (non-combinator) grid container, the wrapper must carry only transferable grid/inheritable\n * declarations, and the two must not conflict on any shared grid property — lives in the `rewrite`\n * op-draft factory escape hatch, which folds inherited styles, transfers the wrapper's grid\n * declarations onto the child (target-wins), then unwraps the wrapper.\n */\n\nimport type {\n ConditionKey,\n CssProperty,\n MatchContext,\n NodeLike,\n RewriteFactory,\n RewriteOpDraft,\n StyleBlock,\n StyleDecl,\n StyleMap,\n} from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport {\n and,\n computed,\n definePattern,\n isElement,\n normalizer,\n not,\n targetedByCombinator,\n type Matcher,\n} from '@domflax/pattern-kit';\n\n/* ───────────────────────── style fixtures ───────────────────────── */\n\n/** Build a single-(base-)condition StyleMap from raw `[property, value]` pairs via the shared normalizer. */\nfunction baseConditionStyleMap(decls: readonly (readonly [string, string])[]): StyleMap {\n const map = new Map<CssProperty, StyleDecl>();\n for (const [prop, value] of decls) {\n for (const decl of normalizer.normalizeDeclaration(prop, value, false)) {\n map.set(decl.property, decl);\n }\n }\n const block: StyleBlock = { condition: BASE_CONDITION, decls: map };\n const blocks = new Map<ConditionKey, StyleBlock>([[conditionKey(BASE_CONDITION), block]]);\n return { blocks };\n}\n\n/** Both containers must declare `display:grid` (the matched signature). */\nconst DISPLAY_GRID: StyleMap = baseConditionStyleMap([['display', 'grid']]);\n\n/**\n * The grid-CONTAINER property set this pattern is allowed to transfer from the wrapper onto the child.\n * (Longhands only, since the shared normalizer expands `gap` → `row-gap`/`column-gap`.)\n */\nconst GRID_CONTAINER_PROPERTIES: ReadonlySet<string> = new Set<string>([\n 'display',\n 'grid-template-columns',\n 'grid-template-rows',\n 'grid-template-areas',\n 'grid-auto-columns',\n 'grid-auto-rows',\n 'grid-auto-flow',\n 'justify-content',\n 'align-content',\n 'place-content',\n 'justify-items',\n 'align-items',\n 'place-items',\n 'row-gap',\n 'column-gap',\n]);\n\n/* ───────────────────────── style reasoning helpers (pure) ───────────────────────── */\n\n/**\n * True iff every declaration on the wrapper is either a transferable grid-container property or an\n * inheritable property (which we fold onto the child). If the wrapper carries anything else\n * (padding/margin/sizing/position/…), removing its box would change layout, so the merge is unsafe.\n */\nfunction outerMergeSafe(sm: StyleMap): boolean {\n const norm = normalizer.normalizeStyleMap(sm);\n for (const block of norm.blocks.values()) {\n for (const decl of block.decls.values()) {\n if (GRID_CONTAINER_PROPERTIES.has(String(decl.property))) continue;\n if (decl.inherited) continue;\n return false;\n }\n }\n return true;\n}\n\n/**\n * True iff the two containers disagree on any shared grid-container property (in any matching\n * condition) — e.g. `grid-template-columns:1fr` vs `1fr 1fr`. Such a conflict makes the merge\n * ambiguous, so the pattern skips.\n */\nfunction gridConflict(outer: StyleMap, inner: StyleMap): boolean {\n const a = normalizer.normalizeStyleMap(outer);\n const b = normalizer.normalizeStyleMap(inner);\n for (const [key, blockA] of a.blocks) {\n const blockB = b.blocks.get(key);\n if (!blockB) continue;\n for (const [prop, declA] of blockA.decls) {\n if (!GRID_CONTAINER_PROPERTIES.has(String(prop))) continue;\n const declB = blockB.decls.get(prop);\n if (declB && declB.value !== declA.value) return true;\n }\n }\n return false;\n}\n\n/** Project the wrapper's transferable grid-container declarations into a fresh StyleMap. */\nfunction extractGridStyle(sm: StyleMap): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n if (GRID_CONTAINER_PROPERTIES.has(String(prop))) decls.set(prop, decl);\n }\n if (decls.size > 0) blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/** The inner (surviving) grid container: also a grid `<div>`, and not a combinator subject (it is reparented). */\nconst isInnerGrid: Matcher = and(\n isElement('div'),\n computed(DISPLAY_GRID),\n not(targetedByCombinator),\n);\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/**\n * Flatten a grid container whose sole child is a compatible grid container into a single container.\n */\nexport const nestedGridMerge = definePattern({\n name: 'nested-grid-merge',\n category: 'flatten/nested-grid-merge',\n safety: 2,\n doc: {\n title: 'Merge nested grid containers',\n summary:\n 'A grid container whose only child is itself a grid container with non-conflicting grid ' +\n 'properties is collapsed into one; the wrapper is removed and its grid declarations merge ' +\n 'onto the surviving child.',\n before:\n '<div style=\"display:grid;gap:8px\">' +\n '<div style=\"display:grid;grid-template-columns:1fr 1fr\"/></div>',\n after: '<div style=\"display:grid;grid-template-columns:1fr 1fr;gap:8px\"/>',\n safetyRationale:\n 'The wrapper paints nothing, declares only grid-container/inheritable properties, carries no ' +\n 'ref/handlers/dynamic children, and is not a combinator subject; the two containers do not ' +\n 'conflict on any grid property, so the union is unambiguous and lossless.',\n },\n match: {\n tag: 'div',\n style: { display: 'grid' },\n onlyChild: 'element',\n paintsNothing: true,\n },\n rewrite: (ctx: MatchContext, rw: RewriteFactory): readonly RewriteOpDraft[] | null => {\n const outer = ctx.node;\n const inner = ctx.onlyElementChild();\n if (!inner) return null;\n if (!isInnerGrid(inner as unknown as NodeLike, ctx)) return null;\n\n const outerStyle = ctx.computed();\n const innerStyle = ctx.computedOf(inner as unknown as NodeLike);\n\n // The wrapper must carry nothing that would be lost when its box is removed …\n if (!outerMergeSafe(outerStyle)) return null;\n // … and the two containers must agree on every shared grid property.\n if (gridConflict(outerStyle, innerStyle)) return null;\n\n return [\n // 1. Preserve inheritable values (color/font/…) by folding them onto the child first.\n rw.foldInheritedStyles(outer, inner, { conditions: 'all' }),\n // 2. Transfer the wrapper's grid-container declarations onto the child (target-wins keeps the\n // child's value for any shared property — identical anyway, we proved non-conflict).\n rw.mergeStyle(inner, null, extractGridStyle(outerStyle), 'target-wins'),\n // 3. Remove the wrapper (structural-safe; hoists the child and preserves its IRNodeId).\n rw.unwrap(outer),\n ];\n },\n // Like its flex sibling, this merge removes the outer container's box, but a `display:grid` wrapper\n // establishes a formatting context, so it is a `needs-verification` flatten that the conservative\n // production gate (`'provably-safe'`) REVERTS — every case here is a no-match. Op-level correctness\n // is asserted by the invariant suite over every pattern.\n test: {\n noMatch: [\n // The merge is real but not provably layout-neutral (the wrapper establishes a grid context),\n // so under the conservative gate the nested containers are left in place.\n '<div className=\"grid gap-2\" data-x=\"1\"><div className=\"grid grid-cols-2\">X</div></div>',\n // A non-grid wrapper does not match the grid-container signature → left unchanged anyway.\n '<div className=\"block bg-blue-500\"><div className=\"grid grid-cols-2\">X</div></div>',\n ],\n },\n});\n","/**\n * @domflax/patterns — flatten pattern: `passthrough-wrapper`.\n *\n * Collapses a purely-structural wrapper that exists for no reason at all:\n *\n * <div><Child/></div>\n *\n * The wrapper paints nothing, establishes no box / formatting / stacking context, carries no\n * attributes beyond an (optional) inert class, holds exactly one element child, and is free of every\n * opacity barrier (ref / event-handlers / dynamic children / dangerous html / spread / component).\n * Such a `<div>` is pure DOM noise: removing it and hoisting the child is invisible to both paint\n * and layout.\n *\n * Authored with the declarative {@link definePattern} API. The opacity-barrier + selector-safety\n * guards (ref/handlers/dynamic-children/raw-html/combinator/reparent-impact) are applied\n * automatically for every `flatten/*` pattern; the `where` predicates add the passthrough-specific\n * requirements (no box/formatting/stacking context, no own attrs, no dynamic/spread classes, not a\n * component, not a structural-pseudo subject).\n */\n\nimport type {\n DeepReadonly,\n IRElement,\n IRNode,\n IRNodeId,\n NodeLike,\n NodeMeta,\n} from '@domflax/core';\n\nimport { definePattern, hasDynamicClasses, not, type Matcher } from '@domflax/pattern-kit';\n\n/* ───────────────────────── local meta/attr/selector matchers ───────────────────────── */\n\nfunction metaOf(node: NodeLike): DeepReadonly<NodeMeta> | null {\n const n = node as DeepReadonly<IRNode>;\n return n.kind === 'element' ? (n as DeepReadonly<IRElement>).meta : null;\n}\n\nfunction elementOf(node: NodeLike): DeepReadonly<IRElement> | null {\n const n = node as DeepReadonly<IRNode>;\n return n.kind === 'element' ? (n as DeepReadonly<IRElement>) : null;\n}\n\n/**\n * Element establishes some box / formatting / stacking context, is a containing block, or exposes\n * custom properties to a descendant — any of which means removing its box could shift layout or\n * break a `var()` coupling, so it is NOT a passthrough.\n */\nconst establishesContext: Matcher = (node) => {\n const m = metaOf(node);\n if (!m) return false;\n return (\n m.establishesBox ||\n m.establishesFormattingContext ||\n m.establishesStackingContext ||\n m.isContainingBlock ||\n m.declaresCustomProperties\n );\n};\n\n/** Hard opacity barriers beyond the auto-applied set: spread attrs, component identity. */\nconst hasSpreadAttrs: Matcher = (node) => metaOf(node)?.hasSpreadAttrs ?? false;\nconst isComponentNode: Matcher = (node) => metaOf(node)?.isComponent ?? false;\n\n/** Element carries own attributes (id / data-* / …) beyond its class list — possible selector/JS hook. */\nconst hasOwnAttrs: Matcher = (node) => {\n const el = elementOf(node);\n if (!el) return false;\n return el.attrs.entries.size > 0 || el.attrs.spreads.length > 0;\n};\n\n/**\n * Element is the subject of a structural pseudo (`:first/:last/:only/:nth-*`). Honours the meta flag\n * and the precomputed {@link SelectorIndex}.\n */\nconst targetedByStructuralPseudo: Matcher = (node, ctx) => {\n const el = elementOf(node);\n if (!el) return false;\n if (el.meta.targetedByStructuralPseudo) return true;\n return ctx.selectors.targetedByStructuralPseudo(el.id as unknown as IRNodeId);\n};\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/**\n * Flatten a do-nothing `<div>` wrapper into its sole element child, folding any inheritable styles\n * down first so inherited values survive the box removal.\n */\nexport const passthroughWrapper = definePattern({\n name: 'passthrough-wrapper',\n category: 'flatten/passthrough-wrapper',\n safety: 2,\n doc: {\n title: 'Flatten passthrough wrapper',\n summary:\n 'A div with no own visual/box style, no attributes beyond an inert class, exactly one ' +\n 'element child, and no opacity barriers is removed; its sole child is hoisted in its place.',\n before: '<div><Child/></div>',\n after: '<Child/>',\n safetyRationale:\n 'Wrapper paints nothing and establishes no layout/paint/var context, carries no ' +\n 'ref/handlers/dynamic-children/html/spread/component identity, owns no targetable attrs, ' +\n 'and is not a combinator/structural-pseudo subject (reparenting changes no match-set); ' +\n 'inheritable styles are folded onto the child before removal.',\n },\n match: {\n tag: 'div',\n onlyChild: 'element',\n paintsNothing: true,\n where: [\n not(establishesContext),\n not(hasOwnAttrs),\n not(hasDynamicClasses),\n not(hasSpreadAttrs),\n not(isComponentNode),\n not(targetedByStructuralPseudo),\n ],\n },\n rewrite: { flattenInto: 'child' },\n test: {\n cases: [\n {\n // A plain, style-free wrapper paints nothing and establishes no context → a provably-safe\n // flatten under the conservative gate: the wrapper is removed and its sole child hoisted.\n before: '<div><a className=\"bg-red-200\">Link</a></div>',\n after: '<a className=\"bg-red-200\">Link</a>',\n },\n ],\n noMatch: [\n // A ref pins the wrapper's element identity (a hard opacity barrier) → not a passthrough.\n '<div ref={rootRef}><a className=\"bg-red-200\">Link</a></div>',\n // A `display:flex` wrapper establishes a formatting context, so removing its box is NOT\n // provably layout-neutral → the conservative gate leaves it in place.\n '<div className=\"flex\"><a className=\"bg-red-200\">Link</a></div>',\n ],\n },\n});\n","/**\n * @domflax/patterns — flatten pattern: `redundant-fragment`.\n *\n * Collapses a fragment that wraps exactly one child\n *\n * <><Child/></> → <Child/>\n *\n * A fragment renders no box of its own, so a fragment whose sole purpose is to wrap a single node\n * is pure structural noise: splicing the child up into the fragment's slot is invisible in both\n * the rendered DOM and the project's CSS cascade.\n *\n * Anchoring: the pass manager only visits ELEMENT nodes (see core's `elementIds`), never fragments,\n * so this pattern is anchored on the fragment's sole *element* child and removes the PARENT fragment.\n * Because the match is PARENT-anchored (and reads a fragment's `meta`, which the element-only\n * combinator vocabulary cannot inspect), it uses the declarative API's two escape hatches: a raw\n * `match` predicate and a raw `rewrite` op-draft factory.\n */\n\nimport type {\n DeepReadonly,\n ElementLike,\n IRNode,\n IRNodeId,\n MatchContext,\n NodeLike,\n RewriteFactory,\n RewriteOpDraft,\n} from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── match predicate (escape hatch) ───────────────────────── */\n\n/**\n * Matches an element whose PARENT is a redundant, unwrappable fragment: a non-root fragment with\n * exactly one child (this element), free of every opacity barrier and CSS-targeting coupling.\n */\nfunction parentIsRedundantFragment(node: NodeLike, ctx: MatchContext): boolean {\n const el = node as DeepReadonly<IRNode>;\n if (el.kind !== 'element') return false;\n\n const parentId = el.parent;\n if (parentId == null) return false;\n\n const parent = ctx.doc.nodes.get(parentId);\n if (!parent || parent.kind !== 'fragment') return false;\n\n // Never unwrap the document root (it must always be a fragment — IRDocument invariant).\n if (parent.parent == null) return false;\n\n // Exactly one child (counting EVERY kind) ⇒ the anchor element is the fragment's sole child.\n if (parent.children.length !== 1) return false;\n\n // Hard opacity barriers on the fragment: keyed `<Fragment key>`, ref/handlers/dynamic children/\n // dangerous HTML/spread/component identity. Any of these means the fragment is load-bearing.\n const m = parent.meta;\n if (\n m.hasKey ||\n m.hasRef ||\n m.hasEventHandlers ||\n m.hasDynamicChildren ||\n m.hasDangerousHtml ||\n m.hasSpreadAttrs ||\n m.isComponent\n ) {\n return false;\n }\n\n // CSS-selector safety: the fragment (or its reparented child) must not move any combinator /\n // structural-pseudo match-set. Honour both the frontend-set meta flags and the SelectorIndex.\n if (m.targetedByCombinator || m.targetedByStructuralPseudo) return false;\n const fid = parentId as unknown as IRNodeId;\n if (ctx.selectors.targetedByCombinator(fid) || ctx.selectors.targetedByStructuralPseudo(fid)) {\n return false;\n }\n if (ctx.selectors.reparentImpact(fid).size > 0) return false;\n\n return true;\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/**\n * Flatten a fragment that wraps exactly one child into that child.\n *\n * Safety level 1 (`safe`): a purely structural, style-free, selector-transparent cleanup.\n */\nexport const redundantFragment = definePattern({\n name: 'redundant-fragment',\n category: 'flatten/redundant-fragment',\n safety: 1,\n doc: {\n title: 'Flatten redundant single-child fragment',\n summary:\n 'A fragment whose only child is a single node is removed; the child is spliced up into the ' +\n \"fragment's slot, preserving its IRNodeId, siblings, attributes and the CSS cascade.\",\n before: '<><Child/></>',\n after: '<Child/>',\n safetyRationale:\n 'A fragment paints nothing and renders no box; with exactly one child its removal changes ' +\n 'no sibling/structural-pseudo match-set. Keyed fragments and fragments carrying ' +\n 'ref/handlers/dynamic-children/raw-html/spread are excluded as opacity barriers.',\n },\n match: parentIsRedundantFragment,\n rewrite: (ctx: MatchContext, rw: RewriteFactory): readonly RewriteOpDraft[] | null => {\n const parentId = ctx.node.parent;\n if (parentId == null) return null;\n const fragment = ctx.doc.nodes.get(parentId);\n if (!fragment || fragment.kind !== 'fragment') return null;\n // Splice the sole child up into the fragment's slot, deleting ONLY the fragment node.\n return [rw.unwrap(fragment as unknown as ElementLike)];\n },\n test: {\n cases: [\n {\n // A fragment renders no box, so unwrapping a single-child fragment is always layout-identical\n // → a provably-safe flatten: the child is spliced up into the fragment's slot.\n before: '<><span className=\"bg-red-200\">Hi</span></>',\n after: '<span className=\"bg-red-200\">Hi</span>',\n },\n ],\n noMatch: [\n // Two children ⇒ not a single-child fragment, so the fragment is load-bearing and stays.\n '<><span className=\"bg-red-200\">A</span><span className=\"bg-green-200\">B</span></>',\n ],\n },\n});\n","/**\n * @domflax/patterns — flatten pattern: `redundant-inline-wrapper`.\n *\n * Collapses a purely-structural INLINE wrapper:\n *\n * <span><Child/></span> (display:inline, no own style)\n *\n * An inline `<span>` that paints nothing, establishes no box / formatting / stacking context, carries\n * no attributes beyond an (optional) inert class, declares no custom properties, and holds exactly one\n * element child is pure inline noise. An empty inline box merely wraps its child's box; removing it and\n * hoisting the child leaves both paint and layout untouched (the surviving child folds the inheritable\n * declarations the span carried).\n *\n * This is the inline sibling of `passthrough-wrapper` (which targets `<div>`): the same opacity-barrier\n * + selector-safety guards are auto-applied by the `pattern()` factory for every `flatten/*` pattern;\n * the `where` predicates add the inline-passthrough requirements (display must be the inline default,\n * no box/formatting/stacking context or var coupling, no own attrs / dynamic-or-spread classes, not a\n * component, not a structural-pseudo subject).\n */\n\nimport type {\n CssProperty,\n DeepReadonly,\n IRElement,\n IRNode,\n IRNodeId,\n NodeLike,\n NodeMeta,\n StyleMap,\n} from '@domflax/core';\n\nimport { definePattern, hasDynamicClasses, not, type Matcher } from '@domflax/pattern-kit';\n\n/* ───────────────────────── local meta/attr/selector matchers ───────────────────────── */\n\nfunction asEl(node: NodeLike): DeepReadonly<IRElement> | null {\n const n = node as DeepReadonly<IRNode>;\n return n.kind === 'element' ? (n as DeepReadonly<IRElement>) : null;\n}\n\nfunction metaOf(node: NodeLike): DeepReadonly<NodeMeta> | null {\n return asEl(node)?.meta ?? null;\n}\n\n/**\n * Element establishes some box / formatting / stacking context, is a containing block, or exposes\n * custom properties to a descendant — removing its box could shift layout or sever a `var()` coupling,\n * so it is NOT an inline passthrough.\n */\nconst establishesContext: Matcher = (node) => {\n const m = metaOf(node);\n if (!m) return false;\n return (\n m.establishesBox ||\n m.establishesFormattingContext ||\n m.establishesStackingContext ||\n m.isContainingBlock ||\n m.declaresCustomProperties\n );\n};\n\n/** Hard opacity barriers beyond the auto-applied set: spread attrs, component identity. */\nconst hasSpreadAttrs: Matcher = (node) => metaOf(node)?.hasSpreadAttrs ?? false;\nconst isComponentNode: Matcher = (node) => metaOf(node)?.isComponent ?? false;\n\n/** Element carries own attributes (id / data-* / …) beyond its class list — possible selector/JS hook. */\nconst hasOwnAttrs: Matcher = (node) => {\n const el = asEl(node);\n if (!el) return false;\n return el.attrs.entries.size > 0 || el.attrs.spreads.length > 0;\n};\n\n/**\n * Element is the subject of a structural pseudo (`:first/:last/:only/:nth-*`). Honours the meta flag\n * and the precomputed {@link SelectorIndex}.\n */\nconst targetedByStructuralPseudo: Matcher = (node, ctx) => {\n const el = asEl(node);\n if (!el) return false;\n if (el.meta.targetedByStructuralPseudo) return true;\n return ctx.selectors.targetedByStructuralPseudo(el.id as unknown as IRNodeId);\n};\n\nconst DISPLAY = 'display' as CssProperty;\n\n/**\n * Element sets `display` to anything other than the inline default in ANY condition. An\n * inline-block / block / flex / grid / contents span is NOT an inline passthrough — its box (or lack\n * of one) participates in layout differently from a bare inline box.\n */\nconst hasNonInlineDisplay: Matcher = (node, ctx) => {\n const el = asEl(node);\n if (!el) return false;\n const sm: StyleMap = ctx.computedOf(el as unknown as NodeLike) ?? (el.computed as StyleMap);\n for (const block of sm.blocks.values()) {\n const decl = block.decls.get(DISPLAY);\n if (decl && String(decl.value) !== 'inline') return true;\n }\n return false;\n};\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/**\n * Flatten a do-nothing inline `<span>` wrapper into its sole element child, folding any inheritable\n * styles down first so inherited values survive the box removal.\n */\nexport const redundantInlineWrapper = definePattern({\n name: 'redundant-inline-wrapper',\n category: 'flatten/redundant-inline-wrapper',\n safety: 2,\n doc: {\n title: 'Flatten redundant inline wrapper',\n summary:\n 'An inline span with no own visual/box style, no attributes beyond an inert class, exactly ' +\n 'one element child, and no opacity barriers is removed; its sole child is hoisted in its place.',\n before: '<span><Child/></span>',\n after: '<Child/>',\n safetyRationale:\n 'An empty inline box paints nothing and establishes no layout/paint/var context; with the ' +\n 'inline default display and a single element child its removal changes no paint and no flow. ' +\n 'The span carries no ref/handlers/dynamic-children/html/spread/component identity, owns no ' +\n 'targetable attrs, and is not a combinator/structural-pseudo subject; inheritable styles are ' +\n 'folded onto the child before removal.',\n },\n match: {\n tag: 'span',\n onlyChild: 'element',\n paintsNothing: true,\n where: [\n not(hasNonInlineDisplay),\n not(establishesContext),\n not(hasOwnAttrs),\n not(hasDynamicClasses),\n not(hasSpreadAttrs),\n not(isComponentNode),\n not(targetedByStructuralPseudo),\n ],\n },\n rewrite: { flattenInto: 'child' },\n test: {\n cases: [\n {\n // An empty inline span paints nothing and establishes no context → a provably-safe flatten:\n // the span is removed and its sole child hoisted in place.\n before: '<span><a className=\"text-blue-500\">Link</a></span>',\n after: '<a className=\"text-blue-500\">Link</a>',\n },\n ],\n noMatch: [\n // A ref pins the span's element identity (a hard opacity barrier) → not a passthrough.\n '<span ref={spanRef}><a className=\"text-blue-500\">Link</a></span>',\n // The span paints its own background (own visual style) → kept.\n '<span className=\"bg-green-200\"><a className=\"text-blue-500\">Link</a></span>',\n // Non-inline display (inline-block) participates in layout differently → kept.\n '<span className=\"inline-block\"><a className=\"text-blue-500\">Link</a></span>',\n ],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `border-radius-shorthand`.\n *\n * Collapses an element whose four corner radii are expressed as separate longhand declarations and\n * are ALL EQUAL into the single CSS `border-radius` shorthand:\n *\n * border-top-left-radius:0.5rem; border-top-right-radius:0.5rem;\n * border-bottom-right-radius:0.5rem; border-bottom-left-radius:0.5rem\n * ⇒ border-radius:0.5rem (Tailwind `rounded-lg`)\n *\n * The IR's computed StyleMap keeps each corner as its own longhand (Tailwind's `rounded-tl-*` /\n * `rounded-tr-*` / … each resolve to one corner property). This pass runs the collapse in reverse on\n * the computed map ONLY when all four corners share one value — the single case that maps cleanly to\n * a single Tailwind utility (the CSS 2-value `border-radius` form is DIAGONAL, which has no clean\n * `rounded-*` edge utility, so per-corner differences are intentionally left alone). Rebuilding the\n * map with one `border-radius` decl lets the minimizing reverse-emit pick the single `rounded-*`\n * token covering all four corners instead of two edge tokens.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the\n * `rewriteClasses` recipe rebuilds the class StyleMap, declining (`null`) unless the four corners are\n * present, concrete, equal, and share an `!important` flag.\n */\n\nimport type { ConditionKey, CssProperty, CssValue, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── corner analysis ───────────────────────── */\n\n/** The four corner-radius longhands. */\nconst CORNERS = [\n 'border-top-left-radius',\n 'border-top-right-radius',\n 'border-bottom-right-radius',\n 'border-bottom-left-radius',\n] as const satisfies readonly string[];\n\nconst CORNER_SET: ReadonlySet<string> = new Set<string>(CORNERS);\n\nconst BASE_KEY: ConditionKey = conditionKey(BASE_CONDITION);\n\nconst RADIUS = 'border-radius' as CssProperty;\n\n/** CSS-wide keywords for which a corner collapse is pointless or unsound. */\nconst NON_COLLAPSIBLE_VALUES: ReadonlySet<string> = new Set<string>([\n 'initial',\n 'inherit',\n 'unset',\n 'revert',\n 'revert-layer',\n]);\n\n/** The single value all four corners fold into (carrying important / relative-unit flags). */\ninterface RadiusFold {\n readonly value: string;\n readonly important: boolean;\n readonly relative: boolean;\n}\n\n/**\n * Inspect the BASE-condition block of `sm` and, iff all four corner longhands are present, share a\n * uniform `!important` flag, hold a concrete (non-keyword) value, and are ALL EQUAL, return that\n * value. Returns `null` when the corners cannot fold to one `border-radius`.\n */\nfunction analyzeRadius(sm: StyleMap): RadiusFold | null {\n const block = sm.blocks.get(BASE_KEY);\n if (!block) return null;\n\n const corners: StyleDecl[] = [];\n for (const corner of CORNERS) {\n const decl = block.decls.get(corner as CssProperty);\n if (!decl) return null;\n corners.push(decl);\n }\n\n // A shorthand cannot carry per-corner `!important`; only fold a uniform flag.\n const important = corners[0]!.important;\n if (!corners.every((d) => d.important === important)) return null;\n\n const value = String(corners[0]!.value);\n if (NON_COLLAPSIBLE_VALUES.has(value)) return null;\n if (!corners.every((d) => String(d.value) === value)) return null;\n\n const relative = corners.some((d) => d.relativeToParent);\n return { value, important, relative };\n}\n\n/* ───────────────────────── style rebuild ───────────────────────── */\n\n/** Rebuild `sm` with the four BASE-block corner longhands replaced by one `border-radius` decl. */\nfunction withFoldedRadius(sm: StyleMap, fold: RadiusFold): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n if (key !== BASE_KEY) {\n blocks.set(key, block);\n continue;\n }\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n if (CORNER_SET.has(String(prop))) continue; // drop the four corner longhands\n decls.set(prop, decl);\n }\n const shorthand: StyleDecl = {\n property: RADIUS,\n value: fold.value as CssValue,\n important: fold.important,\n relativeToParent: fold.relative,\n inherited: false, // border-radius is never inherited\n };\n decls.set(shorthand.property, shorthand);\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/** Fold four equal corner radii into the single `border-radius` shorthand. */\nexport const borderRadiusShorthand = definePattern({\n name: 'border-radius-shorthand',\n category: 'compress/border-radius-shorthand',\n safety: 1,\n doc: {\n title: 'Collapse equal corner radii into border-radius',\n summary:\n 'An element whose four corner radii (border-*-radius longhands) are all equal is rewritten to ' +\n 'the single Tailwind rounded-* utility (border-radius === the four equal corners).',\n before: '<div class=\"rounded-tl-lg rounded-tr-lg rounded-br-lg rounded-bl-lg\"/>',\n after: '<div class=\"rounded-lg\"/>',\n safetyRationale:\n '`border-radius` is value-identical to four equal corner radii — a class-only change. It is safe ' +\n 'even on an element with a ref, event handler, dynamic child, or dangerouslySetInnerHTML — a ' +\n 'className rewrite touches none of them; only a dynamic/opaque class list or a combinator-subject ' +\n 'class is excluded, so no behaviour or project selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const fold = analyzeRadius(computed);\n return fold ? withFoldedRadius(computed, fold) : null;\n },\n },\n test: {\n cases: [\n {\n // The four equal corner longhands collapse to a `border-radius` decl at the IR level; the\n // minimizing reverse-emit then picks the single shortest utility (`rounded-lg`) that reproduces\n // it, replacing the four `rounded-{tl,tr,br,bl}-lg` tokens. `bg-red-200` is preserved.\n before: '<div className=\"rounded-tl-lg rounded-tr-lg rounded-br-lg rounded-bl-lg bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 rounded-lg\">box</div>',\n },\n ],\n // Corners differ (top corners vs bottom corners) → no all-equal collapse.\n noMatch: ['<div className=\"rounded-t-lg rounded-b-sm bg-red-200\">box</div>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `border-shorthand`.\n *\n * Collapses an element whose four border-side WIDTHS are expressed as separate longhand declarations\n * back into the shortest equivalent `border-width` shorthand:\n *\n * border-top-width:2px; border-right-width:2px; border-bottom-width:2px; border-left-width:2px\n * ⇒ border-width:2px (Tailwind `border-2`)\n *\n * border-top-width:2px; border-bottom-width:2px; border-left-width:4px; border-right-width:4px\n * ⇒ border-width:2px 4px (Tailwind `border-y-2 border-x-4`)\n *\n * Tailwind's per-side / per-axis width utilities (`border-t-*`, `border-x-*`, …) each resolve to the\n * matching `border-*-width` longhand(s); the shared normalizer keeps them longhand. This pass runs\n * the expansion in reverse on the computed map ONLY when the four widths fold cleanly into a 1- or\n * 2-value form — i.e. `top===bottom` AND `left===right`. Rebuilding the map with one `border-width`\n * shorthand lets the minimizing reverse-emit pick the single/paired utility (`border-2`, or\n * `border-x-* border-y-*`) instead of four per-side tokens. Only WIDTH is folded — border style and\n * color are independent longhands the resolver carries separately, so this never disturbs them.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the `rewriteClasses`\n * recipe rebuilds the class StyleMap, declining (`null`) unless the four widths fold cleanly.\n */\n\nimport type { ConditionKey, CssProperty, CssValue, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── border-width analysis ───────────────────────── */\n\n/** The four border-width longhands, in CSS shorthand order: top, right, bottom, left. */\nconst WIDTH_SIDES = [\n 'border-top-width',\n 'border-right-width',\n 'border-bottom-width',\n 'border-left-width',\n] as const satisfies readonly string[];\n\nconst WIDTH_SIDE_SET: ReadonlySet<string> = new Set<string>(WIDTH_SIDES);\n\nconst BASE_KEY: ConditionKey = conditionKey(BASE_CONDITION);\n\nconst BORDER_WIDTH = 'border-width' as CssProperty;\n\n/** The collapsed shorthand the four widths fold into (carrying important / relative-unit flags). */\ninterface WidthFold {\n readonly value: string; // 1-value (`2px`) or 2-value (`2px 4px`) form\n readonly important: boolean;\n readonly relative: boolean;\n}\n\n/**\n * Inspect the BASE-condition block of `sm` and, iff all four border-width longhands are present,\n * share a uniform `!important` flag, and form matching x/y pairs (`top===bottom` AND `left===right`),\n * return the shortest equivalent shorthand value. Returns `null` when the sides cannot fold.\n */\nfunction analyzeWidth(sm: StyleMap): WidthFold | null {\n const block = sm.blocks.get(BASE_KEY);\n if (!block) return null;\n\n const sides: StyleDecl[] = [];\n for (const side of WIDTH_SIDES) {\n const decl = block.decls.get(side as CssProperty);\n if (!decl) return null;\n sides.push(decl);\n }\n const [top, right, bottom, left] = sides as [StyleDecl, StyleDecl, StyleDecl, StyleDecl];\n\n // A shorthand cannot carry per-side `!important`; only fold a uniform flag.\n if (\n !(\n top.important === right.important &&\n right.important === bottom.important &&\n bottom.important === left.important\n )\n ) {\n return null;\n }\n\n const tv = String(top.value);\n const rv = String(right.value);\n const bv = String(bottom.value);\n const lv = String(left.value);\n\n // Only the `border-*` (all equal) and `border-x-* border-y-*` (matching pairs) shapes are in scope.\n if (tv !== bv || lv !== rv) return null;\n\n const value = tv === lv ? tv : `${tv} ${lv}`;\n const relative = sides.some((d) => d.relativeToParent);\n return { value, important: top.important, relative };\n}\n\n/* ───────────────────────── style rebuild ───────────────────────── */\n\n/** Rebuild `sm` with the four BASE-block border-width longhands replaced by one shorthand. */\nfunction withFoldedWidth(sm: StyleMap, fold: WidthFold): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n if (key !== BASE_KEY) {\n blocks.set(key, block);\n continue;\n }\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n if (WIDTH_SIDE_SET.has(String(prop))) continue; // drop the four width longhands\n decls.set(prop, decl);\n }\n const shorthand: StyleDecl = {\n property: BORDER_WIDTH,\n value: fold.value as CssValue,\n important: fold.important,\n relativeToParent: fold.relative,\n inherited: false, // border-width is never inherited\n };\n decls.set(shorthand.property, shorthand);\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/** Compress an element's four equal/paired border-width longhands into the shortest shorthand. */\nexport const borderShorthand = definePattern({\n name: 'border-shorthand',\n category: 'compress/border-shorthand',\n safety: 1,\n doc: {\n title: 'Collapse border-width longhands to shorthand',\n summary:\n 'Equal border width on all four sides (or matching x/y pairs) expressed as separate longhand ' +\n 'declarations is collapsed to the shortest equivalent border-width shorthand (border-* / ' +\n 'border-x-* border-y-*).',\n before: '<div class=\"border-t-2 border-r-2 border-b-2 border-l-2\"/>',\n after: '<div class=\"border-2\"/>',\n safetyRationale:\n 'A value-preserving re-serialization of the same computed border widths (style/color longhands ' +\n 'untouched) — a class-only change. It is safe even on an element with a ref, event handler, dynamic ' +\n 'child, or dangerouslySetInnerHTML — a className rewrite touches none of them; only a ' +\n 'dynamic/opaque class list or a combinator-subject class is excluded, so no behaviour or project ' +\n 'selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const fold = analyzeWidth(computed);\n return fold ? withFoldedWidth(computed, fold) : null;\n },\n },\n test: {\n cases: [\n {\n // The four equal width longhands collapse to a `border-width` shorthand at the IR level, and the\n // minimizing reverse-emit picks the single shortest utility (`border-2`) that reproduces it,\n // replacing the four `border-{t,r,b,l}-2` tokens. `bg-red-200` is preserved.\n before: '<div className=\"border-t-2 border-r-2 border-b-2 border-l-2 bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 border-2\">box</div>',\n },\n ],\n // Asymmetric widths (top != bottom) cannot fold into a shorthand.\n noMatch: ['<div className=\"border-t-2 border-r-4 border-b-8 border-l-4 bg-red-200\">box</div>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `dedupe-classes`.\n *\n * Removes duplicate / fully-overridden class tokens that resolve to the same property where a\n * LATER token wins, leaving the minimal set of tokens with an IDENTICAL computed style. The\n * canonical case:\n *\n * <p class=\"text-sm text-lg\">…</p> → <p class=\"text-lg\">…</p>\n *\n * Both `text-sm` and `text-lg` set `font-size`; resolution already made `text-lg` win, so the\n * computed `font-size` is `text-lg`'s value and `text-sm` contributes NOTHING to the final\n * computed style. The earlier token is pure noise and can be dropped without changing a pixel.\n *\n * How redundancy is detected (purely from the already-resolved, normalized computed StyleMap):\n * • every declaration carries provenance — `origin` (the winning token) and `shadowed`\n * (the tokens it overrode);\n * • a class token is FULLY OVERRIDDEN iff it appears in some declaration's `shadowed` list but\n * is NOT the winning `origin` of any declaration across ANY style condition. Such a token can\n * be deleted with zero effect on the computed style.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the `dropClasses` recipe returns the set of\n * fully-overridden, resolver-droppable tokens to delete (their `shadowed` provenance is pruned\n * automatically before the minimal class StyleMap is re-installed).\n */\n\nimport type { MatchContext, StyleMap } from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── provenance analysis ───────────────────────── */\n\n/** Winners (tokens that win some declaration) and shadowed (tokens overridden somewhere). */\nfunction findRedundantClasses(computed: StyleMap): {\n winners: ReadonlySet<string>;\n shadowed: ReadonlySet<string>;\n} {\n const winners = new Set<string>();\n const shadowed = new Set<string>();\n for (const block of computed.blocks.values()) {\n for (const decl of block.decls.values()) {\n if (decl.origin && decl.origin.kind === 'class') winners.add(decl.origin.className);\n for (const o of decl.shadowed ?? []) {\n if (o.kind === 'class') shadowed.add(o.className);\n }\n }\n }\n return { winners, shadowed };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/**\n * Collapse a class list to the minimal token set that yields an identical computed style, by\n * dropping tokens whose declarations are fully overridden by later tokens.\n */\nexport const dedupeClasses = definePattern({\n name: 'dedupe-classes',\n category: 'compress/dedupe-classes',\n safety: 1,\n doc: {\n title: 'Dedupe fully-overridden class tokens',\n summary:\n 'Drops class tokens whose every declaration is overridden by a later token resolving to the ' +\n 'same property; the surviving token set produces a byte-for-byte identical computed style.',\n before: '<p class=\"text-sm text-lg\" />',\n after: '<p class=\"text-lg\" />',\n safetyRationale:\n 'A fully-overridden token contributes nothing to the computed style in any condition, so removing ' +\n 'it changes no pixels — a class-only change. It is safe even on an element with a ref, event ' +\n 'handler, dynamic child, or dangerouslySetInnerHTML — a className rewrite touches none of them; ' +\n 'only a dynamic/opaque class list or a combinator-subject class is excluded, so no behaviour or ' +\n 'project selector is disturbed.',\n },\n rewrite: {\n dropClasses(computed: StyleMap, ctx: MatchContext): Iterable<string> {\n const { winners, shadowed } = findRedundantClasses(computed);\n const drop = new Set<string>();\n for (const cls of shadowed) {\n // A token that still wins SOME property elsewhere is not redundant — keep it.\n if (winners.has(cls)) continue;\n // Selector-membership safety: only drop a token referenced purely as a plain subject.\n if (!ctx.resolver.selectorUsage(cls).droppable) continue;\n drop.add(cls);\n }\n return drop;\n },\n },\n test: {\n cases: [\n {\n // `text-sm` is fully overridden by `text-lg` (both set font-size + line-height). The resolver\n // records that shadowing in provenance and reports the Tailwind utility as droppable, so the\n // pattern drops `text-sm`; the reverse-emit then re-derives the minimal set (`text-lg`).\n before: '<p className=\"text-sm text-lg\">Hi</p>',\n after: '<p className=\"text-lg\">Hi</p>',\n },\n ],\n // Both tokens win a distinct property (no full override) → nothing to dedupe.\n noMatch: ['<p className=\"text-lg font-bold\">Hi</p>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `gap-shorthand`.\n *\n * Collapses an element whose grid/flex gutters are expressed as two equal axis longhands back into\n * the single `gap` shorthand:\n *\n * row-gap:16px; column-gap:16px ⇒ gap:16px (Tailwind `gap-x-4 gap-y-4` → `gap-4`)\n *\n * The IR's computed StyleMap is canonically LONGHAND (the shared normalizer expands the `gap`\n * shorthand into `row-gap` + `column-gap` at parse time). This pass runs the expansion in reverse on\n * the computed map ONLY when both axes carry the SAME value and `!important` flag — i.e. when the two\n * gutters genuinely fold into a single-value `gap`. When the axes differ it declines, leaving the two\n * longhands verbatim (an asymmetric gutter has no equivalent single-value shorthand).\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the\n * `rewriteClasses` recipe rebuilds the class StyleMap, declining (`null`) unless the two axis gaps\n * are present, equal, and share an `!important` flag.\n */\n\nimport type { ConditionKey, CssProperty, CssValue, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── property handles ───────────────────────── */\n\nconst ROW_GAP = 'row-gap' as CssProperty;\nconst COLUMN_GAP = 'column-gap' as CssProperty;\nconst GAP = 'gap' as CssProperty;\n\nconst BASE_KEY: ConditionKey = conditionKey(BASE_CONDITION);\n\n/* ───────────────────────── helpers ───────────────────────── */\n\n/**\n * Rebuild the computed StyleMap with the BASE block's `row-gap`/`column-gap` pair replaced by a\n * single `gap` declaration; all other conditions/blocks are preserved verbatim. The synthesized\n * `gap` decl is set LITERALLY (not via the normalizer, which would re-expand it back into the two\n * axis longhands), so the emit side re-expands and matches the single `gap-*` utility.\n */\nfunction withGapShorthand(sm: StyleMap, gapDecl: StyleDecl): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n if (key !== BASE_KEY) {\n blocks.set(key, block);\n continue;\n }\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n if (prop === ROW_GAP || prop === COLUMN_GAP) continue; // drop the two axis longhands\n decls.set(prop, decl);\n }\n decls.set(gapDecl.property, gapDecl);\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/** Fold an equal `row-gap`/`column-gap` pair into the single `gap` shorthand. */\nexport const gapShorthand = definePattern({\n name: 'gap-shorthand',\n category: 'compress/gap-shorthand',\n safety: 1,\n doc: {\n title: 'Collapse equal row/column gap into the `gap` shorthand',\n summary:\n 'An element whose computed row-gap and column-gap are equal has the two axis longhands ' +\n 'collapsed into a single-value `gap` shorthand (Tailwind gap-x-* gap-y-* → gap-*).',\n before: '<div style=\"row-gap:16px;column-gap:16px\"/>',\n after: '<div style=\"gap:16px\"/>',\n safetyRationale:\n 'A single-value `gap` is value-identical to an equal row-gap+column-gap pair — a class-only change. ' +\n 'It is safe even on an element with a ref, event handler, dynamic child, or dangerouslySetInnerHTML ' +\n '— a className rewrite touches none of them; only a dynamic/opaque class list or a ' +\n 'combinator-subject class is excluded, so no behaviour or project selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const base = computed.blocks.get(BASE_KEY);\n if (!base) return null;\n\n const rowGap = base.decls.get(ROW_GAP);\n const colGap = base.decls.get(COLUMN_GAP);\n if (!rowGap || !colGap) return null;\n\n // A single-value `gap` cannot carry per-axis `!important` or differing values.\n if (rowGap.important !== colGap.important) return null;\n if (rowGap.value !== colGap.value) return null;\n\n const gapDecl: StyleDecl = {\n property: GAP,\n value: rowGap.value as CssValue,\n important: rowGap.important,\n relativeToParent: rowGap.relativeToParent || colGap.relativeToParent,\n inherited: false, // gap is not an inherited property\n };\n return withGapShorthand(computed, gapDecl);\n },\n },\n test: {\n cases: [\n {\n // Equal row/column gap collapse to a `gap` decl at the IR level; the minimizing reverse-emit\n // re-expands `gap` to row-gap+column-gap and picks the single utility covering both (`gap-4`),\n // replacing the `gap-x-4`+`gap-y-4` pair. `bg-red-200` is preserved.\n before: '<div className=\"gap-x-4 gap-y-4 bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 gap-4\">box</div>',\n },\n ],\n // Unequal axes (row-gap != column-gap) have no single-value `gap` equivalent → not collapsed.\n noMatch: ['<div className=\"gap-x-2 gap-y-4 bg-red-200\">box</div>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `inset-shorthand`.\n *\n * Recompacts the four physical inset longhands (`top`/`right`/`bottom`/`left`) on an element's\n * computed style back into the tightest CSS shorthand the values allow:\n *\n * • all four equal → `inset: <v>`\n * • top == bottom (a matching pair) → `inset-block: <v>` (Tailwind `inset-y-*`)\n * • left == right (a matching pair) → `inset-inline: <v>` (Tailwind `inset-x-*`)\n *\n * The two axis collapses are independent: an element whose `top == bottom` but `left != right`\n * collapses only the block axis and keeps the `left`/`right` longhands verbatim. When nothing\n * collapses (all four distinct, or fewer than a full pair present) the pattern declines.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the `rewriteClasses` recipe rebuilds the class\n * StyleMap, declining (`null`) unless at least one inset axis collapses.\n */\n\nimport type { ConditionKey, CssProperty, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION_KEY } from '@domflax/core';\n\nimport { normalizer, definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── property handles ───────────────────────── */\n\nconst TOP = 'top' as CssProperty;\nconst RIGHT = 'right' as CssProperty;\nconst BOTTOM = 'bottom' as CssProperty;\nconst LEFT = 'left' as CssProperty;\nconst INSET = 'inset' as CssProperty;\nconst INSET_BLOCK = 'inset-block' as CssProperty; // top + bottom (Tailwind inset-y)\nconst INSET_INLINE = 'inset-inline' as CssProperty; // left + right (Tailwind inset-x)\n\n/* ───────────────────────── value helpers ───────────────────────── */\n\n/** Two side-decls collapse only if they agree on BOTH normalized value and `!important`. */\nfunction sameSide(a: StyleDecl | undefined, b: StyleDecl | undefined): boolean {\n return a !== undefined && b !== undefined && a.value === b.value && a.important === b.important;\n}\n\n/** Re-key a decl onto a new property, recomputing its inherited flag for that property. */\nfunction asProperty(src: StyleDecl, property: CssProperty): StyleDecl {\n return { ...src, property, inherited: normalizer.inherited.isInherited(property) };\n}\n\n/** Rebuild `src` with the base block's decls replaced; all other condition blocks pass through. */\nfunction withBaseDecls(src: StyleMap, baseDecls: ReadonlyMap<CssProperty, StyleDecl>): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of src.blocks) {\n const decls =\n key === BASE_CONDITION_KEY ? baseDecls : new Map<CssProperty, StyleDecl>(block.decls);\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/**\n * Collapse equal/paired physical inset longhands into the `inset` / `inset-block` / `inset-inline`\n * shorthands on an element's computed style.\n */\nexport const insetShorthand = definePattern({\n name: 'inset-shorthand',\n category: 'compress/inset-shorthand',\n safety: 2,\n doc: {\n title: 'Compress inset longhands into a shorthand',\n summary:\n 'top/right/bottom/left set to one value collapse to `inset`; a matching top/bottom or ' +\n 'left/right pair collapses to `inset-block` / `inset-inline` (Tailwind inset-y / inset-x).',\n before: '<div style=\"top:10px;right:10px;bottom:10px;left:10px\"/>',\n after: '<div style=\"inset:10px\"/>',\n safetyRationale:\n 'Meaning-preserving inset shorthand compaction — a class-only change. It is safe even on an element ' +\n 'with a ref, event handler, dynamic child, or dangerouslySetInnerHTML — a className rewrite touches ' +\n 'none of them; only a dynamic/opaque class list or a combinator-subject class is excluded, so no ' +\n 'behaviour or project selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const base = computed.blocks.get(BASE_CONDITION_KEY);\n if (!base) return null;\n\n const top = base.decls.get(TOP);\n const right = base.decls.get(RIGHT);\n const bottom = base.decls.get(BOTTOM);\n const left = base.decls.get(LEFT);\n\n const next = new Map<CssProperty, StyleDecl>(base.decls);\n\n // 1. All four sides equal → single `inset`.\n if (top && sameSide(top, right) && sameSide(top, bottom) && sameSide(top, left)) {\n next.delete(TOP);\n next.delete(RIGHT);\n next.delete(BOTTOM);\n next.delete(LEFT);\n next.set(INSET, asProperty(top, INSET));\n } else {\n let collapsed = false;\n // 2a. Block axis: top == bottom → `inset-block`.\n if (sameSide(top, bottom)) {\n next.delete(TOP);\n next.delete(BOTTOM);\n next.set(INSET_BLOCK, asProperty(top!, INSET_BLOCK));\n collapsed = true;\n }\n // 2b. Inline axis: left == right → `inset-inline`.\n if (sameSide(left, right)) {\n next.delete(LEFT);\n next.delete(RIGHT);\n next.set(INSET_INLINE, asProperty(left!, INSET_INLINE));\n collapsed = true;\n }\n if (!collapsed) return null; // nothing to compress — decline\n }\n\n return withBaseDecls(computed, next);\n },\n },\n test: {\n cases: [\n {\n // The four equal inset longhands collapse to an `inset` shorthand at the IR level; the\n // minimizing reverse-emit expands it back to top/right/bottom/left and picks the single utility\n // covering all four (`inset-0`), replacing the four physical-side tokens. `bg-red-200` survives.\n before: '<div className=\"top-0 right-0 bottom-0 left-0 bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 inset-0\">box</div>',\n },\n ],\n // No matching inset pair (all four distinct) → nothing collapses.\n noMatch: ['<div className=\"top-0 right-1 bottom-2 left-3 bg-red-200\">box</div>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `margin-shorthand`.\n *\n * Collapses the four explicit margin longhands\n *\n * margin-top / margin-right / margin-bottom / margin-left\n *\n * back into a single CSS `margin` shorthand declaration on the SAME element (the margin analogue of\n * `padding-shorthand`, covering the `m` / `mx` / `my` collapse), choosing the shortest legal\n * 1–4-value form:\n *\n * • all four equal → `margin: <v>` (the `m` case)\n * • top==bottom and left==right → `margin: <y> <x>` (the `my`/`mx` case)\n * • left==right (top!=bottom) → `margin: <t> <x> <b>`\n * • otherwise → `margin: <t> <r> <b> <l>`\n *\n * It is a pure representation change: the resolved box model is identical, only the declaration\n * count shrinks from four to one, which the backend can then re-emit as a single shorthand utility.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the `rewriteClasses` recipe rebuilds the class\n * StyleMap, declining (`null`) unless all four margin longhands are present with a uniform\n * (non-)`!important` flag.\n */\n\nimport type { ConditionKey, CssProperty, CssValue, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── constants / helpers ───────────────────────── */\n\n/** The four margin longhands, in CSS shorthand order (top, right, bottom, left). */\nconst MARGIN_SIDES = [\n 'margin-top',\n 'margin-right',\n 'margin-bottom',\n 'margin-left',\n] as const satisfies readonly string[];\n\nconst MARGIN_SIDE_SET: ReadonlySet<string> = new Set(MARGIN_SIDES);\n\nconst BASE_KEY: ConditionKey = conditionKey(BASE_CONDITION);\n\n/** Collapse four side values into the shortest legal CSS `margin` shorthand value string. */\nfunction collapseMarginValue(top: string, right: string, bottom: string, left: string): string {\n if (right === left) {\n if (top === bottom) {\n return top === right ? top : `${top} ${right}`;\n }\n return `${top} ${right} ${bottom}`;\n }\n return `${top} ${right} ${bottom} ${left}`;\n}\n\n/** Rebuild the computed StyleMap with the four BASE-block margin longhands replaced by `margin`. */\nfunction withFoldedMargin(sm: StyleMap, marginDecl: StyleDecl): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n if (key !== BASE_KEY) {\n blocks.set(key, block);\n continue;\n }\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n if (!MARGIN_SIDE_SET.has(String(prop))) decls.set(prop, decl);\n }\n decls.set(marginDecl.property, marginDecl);\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/**\n * Fold four margin longhands into one `margin` shorthand on the element's base style block.\n */\nexport const marginShorthand = definePattern({\n name: 'margin-shorthand',\n category: 'compress/margin-shorthand',\n safety: 2,\n doc: {\n title: 'Compress margin longhands into the `margin` shorthand',\n summary:\n 'An element with margin-top/right/bottom/left all set has them collapsed into the shortest ' +\n 'legal `margin` shorthand (the m / mx / my forms); meaning is preserved, declaration count drops.',\n before: '<div style=\"margin-top:8px;margin-right:8px;margin-bottom:8px;margin-left:8px\"/>',\n after: '<div style=\"margin:8px\"/>',\n safetyRationale:\n 'A pure representation change of the same computed margins (no pixels move) — a class-only change. ' +\n 'It is safe even on an element with a ref, event handler, dynamic child, or dangerouslySetInnerHTML ' +\n '— a className rewrite touches none of them; only a dynamic/opaque class list or a ' +\n 'combinator-subject class is excluded, so no behaviour or project selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const base = computed.blocks.get(BASE_KEY);\n if (!base) return null;\n\n // Require all four longhands present in the base block (the `m` collapse only touches base).\n const sides = MARGIN_SIDES.map((p) => base.decls.get(p as CssProperty));\n if (sides.some((d) => d === undefined)) return null;\n const [mt, mr, mb, ml] = sides as readonly StyleDecl[];\n\n // A shorthand can only carry a uniform `!important`; mixing would change cascade behaviour.\n if (mt.important || mr.important || mb.important || ml.important) return null;\n\n const value = collapseMarginValue(\n String(mt.value),\n String(mr.value),\n String(mb.value),\n String(ml.value),\n );\n\n const marginDecl: StyleDecl = {\n property: 'margin' as CssProperty,\n value: value as CssValue,\n important: false,\n relativeToParent:\n mt.relativeToParent || mr.relativeToParent || mb.relativeToParent || ml.relativeToParent,\n inherited: false, // margin is not an inherited property\n };\n\n return withFoldedMargin(computed, marginDecl);\n },\n },\n test: {\n cases: [\n {\n // The four equal margin longhands collapse to a `margin` shorthand at the IR level, and the\n // minimizing reverse-emit picks the single shortest utility (`m-2`) reproducing it, replacing\n // the four `m{t,r,b,l}-2` tokens. `bg-red-200` is preserved.\n before: '<div className=\"mt-2 mr-2 mb-2 ml-2 bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 m-2\">box</div>',\n },\n ],\n // Only two margin sides set → the four-longhand `margin` collapse does not apply.\n noMatch: ['<div className=\"mt-2 mb-2 bg-red-200\">box</div>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `overflow-shorthand`.\n *\n * Collapses an element whose two overflow axes are expressed as equal longhands back into the single\n * `overflow` shorthand:\n *\n * overflow-x:auto; overflow-y:auto ⇒ overflow:auto (Tailwind `overflow-x-auto overflow-y-auto`\n * → `overflow-auto`)\n *\n * Unlike the box shorthands, the shared normalizer leaves `overflow-x` / `overflow-y` as independent\n * longhands (it does not synthesize an `overflow` shorthand), so an element styled with two equal\n * axis utilities keeps two separate declarations until this pass folds them. The fold runs ONLY when\n * both axes carry the SAME value and `!important` flag; an asymmetric pair (`overflow-x !==\n * overflow-y`) has no single-keyword `overflow` equivalent and is declined.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the\n * `rewriteClasses` recipe rebuilds the class StyleMap, declining (`null`) unless both overflow axes\n * are present, equal, and share an `!important` flag.\n */\n\nimport type { ConditionKey, CssProperty, CssValue, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── property handles ───────────────────────── */\n\nconst OVERFLOW_X = 'overflow-x' as CssProperty;\nconst OVERFLOW_Y = 'overflow-y' as CssProperty;\nconst OVERFLOW = 'overflow' as CssProperty;\n\nconst BASE_KEY: ConditionKey = conditionKey(BASE_CONDITION);\n\n/* ───────────────────────── helpers ───────────────────────── */\n\n/**\n * Rebuild the computed StyleMap with the BASE block's `overflow-x`/`overflow-y` pair replaced by a\n * single `overflow` declaration; all other conditions/blocks are preserved verbatim.\n */\nfunction withOverflowShorthand(sm: StyleMap, overflowDecl: StyleDecl): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n if (key !== BASE_KEY) {\n blocks.set(key, block);\n continue;\n }\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n if (prop === OVERFLOW_X || prop === OVERFLOW_Y) continue; // drop the two axis longhands\n decls.set(prop, decl);\n }\n decls.set(overflowDecl.property, overflowDecl);\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/** Fold an equal `overflow-x`/`overflow-y` pair into the single `overflow` shorthand. */\nexport const overflowShorthand = definePattern({\n name: 'overflow-shorthand',\n category: 'compress/overflow-shorthand',\n safety: 1,\n doc: {\n title: 'Collapse equal overflow axes into the `overflow` shorthand',\n summary:\n 'An element whose computed overflow-x and overflow-y are equal has the two axis longhands ' +\n 'collapsed into a single `overflow` shorthand (Tailwind overflow-x-* overflow-y-* → overflow-*).',\n before: '<div style=\"overflow-x:auto;overflow-y:auto\"/>',\n after: '<div style=\"overflow:auto\"/>',\n safetyRationale:\n 'A single-keyword `overflow` is value-identical to equal overflow-x+overflow-y — a class-only ' +\n 'change. It is safe even on an element with a ref, event handler, dynamic child, or ' +\n 'dangerouslySetInnerHTML — a className rewrite touches none of them; only a dynamic/opaque class ' +\n 'list or a combinator-subject class is excluded, so no behaviour or project selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const base = computed.blocks.get(BASE_KEY);\n if (!base) return null;\n\n const overflowX = base.decls.get(OVERFLOW_X);\n const overflowY = base.decls.get(OVERFLOW_Y);\n if (!overflowX || !overflowY) return null;\n\n // The single-keyword shorthand cannot carry per-axis `!important` or differing values.\n if (overflowX.important !== overflowY.important) return null;\n if (overflowX.value !== overflowY.value) return null;\n\n const overflowDecl: StyleDecl = {\n property: OVERFLOW,\n value: overflowX.value as CssValue,\n important: overflowX.important,\n relativeToParent: overflowX.relativeToParent || overflowY.relativeToParent,\n inherited: false, // overflow is not an inherited property\n };\n return withOverflowShorthand(computed, overflowDecl);\n },\n },\n test: {\n cases: [\n {\n // Equal overflow axes collapse to an `overflow` decl at the IR level; the minimizing\n // reverse-emit picks the single utility covering both (`overflow-auto`), replacing the\n // `overflow-x-auto`+`overflow-y-auto` pair. `bg-red-200` is preserved.\n before: '<div className=\"overflow-x-auto overflow-y-auto bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 overflow-auto\">box</div>',\n },\n ],\n // Mismatched axes (overflow-x != overflow-y) have no single-keyword equivalent → not collapsed.\n noMatch: ['<div className=\"overflow-x-auto overflow-y-hidden bg-red-200\">box</div>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `overscroll-behavior-shorthand`.\n *\n * Collapses an element whose two overscroll-behavior axes are expressed as separate longhand\n * declarations and are EQUAL into the single CSS `overscroll-behavior` shorthand:\n *\n * overscroll-behavior-x:contain; overscroll-behavior-y:contain\n * ⇒ overscroll-behavior:contain (Tailwind `overscroll-x-contain overscroll-y-contain` → `overscroll-contain`)\n *\n * Tailwind's `overscroll-x-*` / `overscroll-y-*` utilities each resolve to the matching\n * `overscroll-behavior-{x,y}` axis longhand, and the shared normalizer keeps `overscroll-behavior`\n * un-expanded (it is NOT one of the box/gap shorthands the normalizer splits). So only the equal-axis\n * form maps cleanly to a single `overscroll-*` utility. This pass runs the collapse in reverse on the\n * computed map ONLY when both axes carry the SAME value and `!important` flag, replacing them with one\n * `overscroll-behavior` decl so the minimizing reverse-emit can pick a single `overscroll-*` token\n * instead of two axis tokens. When the axes differ it declines, leaving the two longhands verbatim.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the\n * `rewriteClasses` recipe rebuilds the class StyleMap, declining (`null`) unless both axes are\n * present, concrete, equal, and share an `!important` flag.\n */\n\nimport type { ConditionKey, CssProperty, CssValue, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── property handles ───────────────────────── */\n\nconst OVERSCROLL_X = 'overscroll-behavior-x' as CssProperty;\nconst OVERSCROLL_Y = 'overscroll-behavior-y' as CssProperty;\nconst OVERSCROLL = 'overscroll-behavior' as CssProperty;\n\nconst BASE_KEY: ConditionKey = conditionKey(BASE_CONDITION);\n\n/** CSS-wide keywords for which an axis collapse is pointless or unsound. */\nconst NON_COLLAPSIBLE_VALUES: ReadonlySet<string> = new Set<string>([\n 'initial',\n 'inherit',\n 'unset',\n 'revert',\n 'revert-layer',\n]);\n\n/* ───────────────────────── helpers ───────────────────────── */\n\n/**\n * Rebuild the computed StyleMap with the BASE block's overscroll-behavior x/y pair replaced by a\n * single `overscroll-behavior` declaration; all other conditions/blocks are preserved verbatim. The\n * synthesized shorthand decl is set LITERALLY (the normalizer leaves `overscroll-behavior` intact),\n * so the emit side matches the single `overscroll-*` utility.\n */\nfunction withOverscrollShorthand(sm: StyleMap, shorthand: StyleDecl): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n if (key !== BASE_KEY) {\n blocks.set(key, block);\n continue;\n }\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n if (prop === OVERSCROLL_X || prop === OVERSCROLL_Y) continue; // drop the two axis longhands\n decls.set(prop, decl);\n }\n decls.set(shorthand.property, shorthand);\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/** Fold an equal overscroll-behavior x/y pair into the single `overscroll-behavior` shorthand. */\nexport const overscrollBehaviorShorthand = definePattern({\n name: 'overscroll-behavior-shorthand',\n category: 'compress/overscroll-behavior-shorthand',\n safety: 1,\n doc: {\n title: 'Collapse equal overscroll-behavior axes into overscroll-behavior',\n summary:\n 'An element whose computed overscroll-behavior-x and overscroll-behavior-y are equal has the ' +\n 'two axis longhands collapsed into a single `overscroll-behavior` shorthand (Tailwind ' +\n 'overscroll-x-* overscroll-y-* → overscroll-*).',\n before: '<div style=\"overscroll-behavior-x:contain;overscroll-behavior-y:contain\"/>',\n after: '<div class=\"overscroll-contain\"/>',\n safetyRationale:\n '`overscroll-behavior` is value-identical to an equal x+y axis pair — a class-only change. It is ' +\n 'safe even on an element with a ref, event handler, dynamic child, or dangerouslySetInnerHTML — a ' +\n 'className rewrite touches none of them; only a dynamic/opaque class list or a combinator-subject ' +\n 'class is excluded, so no behaviour or project selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const base = computed.blocks.get(BASE_KEY);\n if (!base) return null;\n\n const x = base.decls.get(OVERSCROLL_X);\n const y = base.decls.get(OVERSCROLL_Y);\n if (!x || !y) return null;\n\n // A single shorthand cannot carry per-axis `!important` or differing values.\n if (x.important !== y.important) return null;\n const value = String(x.value);\n if (NON_COLLAPSIBLE_VALUES.has(value)) return null;\n if (value !== String(y.value)) return null;\n\n const shorthand: StyleDecl = {\n property: OVERSCROLL,\n value: x.value as CssValue,\n important: x.important,\n relativeToParent: x.relativeToParent || y.relativeToParent,\n inherited: false, // overscroll-behavior is not an inherited property\n };\n return withOverscrollShorthand(computed, shorthand);\n },\n },\n test: {\n cases: [\n {\n // Equal x/y axes collapse to an `overscroll-behavior` decl at the IR level; the minimizing\n // reverse-emit picks the single utility covering both (`overscroll-contain`), replacing the\n // `overscroll-x-contain`+`overscroll-y-contain` pair. `bg-red-200` is preserved.\n before: '<div className=\"overscroll-x-contain overscroll-y-contain bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 overscroll-contain\">box</div>',\n },\n ],\n // Axes differ (x != y) → no equal-axis collapse.\n noMatch: ['<div className=\"overscroll-x-contain overscroll-y-auto bg-red-200\">box</div>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `padding-shorthand`.\n *\n * Collapses an element whose four padding sides are expressed as separate longhand declarations\n * back into the shortest equivalent shorthand:\n *\n * padding-top:16px; padding-right:16px; padding-bottom:16px; padding-left:16px\n * ⇒ padding:16px (Tailwind `p-4`)\n *\n * padding-top:8px; padding-bottom:8px; padding-left:16px; padding-right:16px\n * ⇒ padding:8px 16px (Tailwind `px-4 py-2`)\n *\n * The IR's computed StyleMap is canonically LONGHAND (the shared normalizer expands every box\n * shorthand at parse time). This pass runs the expansion in reverse on the computed map ONLY when\n * the four sides fold cleanly into a 1- or 2-value form — i.e. `top===bottom` AND `left===right`.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the `rewriteClasses`\n * recipe rebuilds the class StyleMap, declining (`null`) unless the four sides fold cleanly.\n */\n\nimport type { ConditionKey, CssProperty, CssValue, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── padding analysis ───────────────────────── */\n\n/** The four padding longhands, in CSS shorthand order: top, right, bottom, left. */\nconst PADDING_SIDES = [\n 'padding-top',\n 'padding-right',\n 'padding-bottom',\n 'padding-left',\n] as const;\n\nconst PADDING_SIDE_SET: ReadonlySet<string> = new Set<string>(PADDING_SIDES);\n\nconst BASE_KEY: ConditionKey = conditionKey(BASE_CONDITION);\n\n/** The collapsed shorthand the four sides fold into (carrying important / relative-unit flags). */\ninterface PaddingFold {\n readonly value: string; // 1-value (`16px`) or 2-value (`8px 16px`) form\n readonly important: boolean;\n readonly relative: boolean;\n}\n\n/**\n * Inspect the BASE-condition block of `sm` and, iff all four padding longhands are present, share a\n * uniform `!important` flag, and form matching x/y pairs (`top===bottom` AND `left===right`), return\n * the shortest equivalent shorthand value. Returns `null` when the sides cannot fold.\n */\nfunction analyzePadding(sm: StyleMap): PaddingFold | null {\n const block = sm.blocks.get(BASE_KEY);\n if (!block) return null;\n\n const sides: StyleDecl[] = [];\n for (const side of PADDING_SIDES) {\n const decl = block.decls.get(side as CssProperty);\n if (!decl) return null;\n sides.push(decl);\n }\n const [top, right, bottom, left] = sides as [StyleDecl, StyleDecl, StyleDecl, StyleDecl];\n\n // A shorthand cannot carry per-side `!important`; only fold a uniform flag.\n if (\n !(\n top.important === right.important &&\n right.important === bottom.important &&\n bottom.important === left.important\n )\n ) {\n return null;\n }\n\n const tv = String(top.value);\n const rv = String(right.value);\n const bv = String(bottom.value);\n const lv = String(left.value);\n\n // Only the `p-*` (all equal) and `px-* py-*` (matching pairs) shapes are in scope.\n if (tv !== bv || lv !== rv) return null;\n\n const value = tv === lv ? tv : `${tv} ${lv}`;\n const relative = sides.some((d) => d.relativeToParent);\n return { value, important: top.important, relative };\n}\n\n/* ───────────────────────── style rebuild ───────────────────────── */\n\n/** Rebuild `sm` with the four BASE-block padding longhands replaced by one `padding` shorthand. */\nfunction withFoldedPadding(sm: StyleMap, fold: PaddingFold): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n if (key !== BASE_KEY) {\n blocks.set(key, block);\n continue;\n }\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n if (PADDING_SIDE_SET.has(String(prop))) continue; // drop the four longhands\n decls.set(prop, decl);\n }\n const shorthand: StyleDecl = {\n property: 'padding' as CssProperty,\n value: fold.value as CssValue,\n important: fold.important,\n relativeToParent: fold.relative,\n inherited: false, // padding is never inherited\n };\n decls.set(shorthand.property, shorthand);\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/**\n * Compress an element's four equal/paired padding longhands into the shortest `padding` shorthand.\n */\nexport const paddingShorthand = definePattern({\n name: 'padding-shorthand',\n category: 'compress/padding-shorthand',\n safety: 1,\n doc: {\n title: 'Collapse padding longhands to shorthand',\n summary:\n 'Equal padding on all four sides (or matching x/y pairs) expressed as separate longhand ' +\n 'declarations is collapsed to the shortest equivalent padding shorthand (p-* / px-* py-*).',\n before: '<div class=\"pt-4 pr-4 pb-4 pl-4\"/>',\n after: '<div class=\"p-4\"/>',\n safetyRationale:\n 'A value-preserving re-serialization of the same computed padding on the same node — a class-only ' +\n 'change. It is safe even on an element with a ref, event handler, dynamic child, or ' +\n 'dangerouslySetInnerHTML — a className rewrite touches none of them; only a dynamic/opaque class ' +\n 'list or a combinator-subject class is excluded, so no behaviour or project selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const fold = analyzePadding(computed);\n return fold ? withFoldedPadding(computed, fold) : null;\n },\n },\n test: {\n cases: [\n {\n // The four equal padding longhands collapse to a `padding` shorthand at the IR level, and the\n // minimizing reverse-emit picks the single shortest utility (`p-4`) that reproduces it,\n // replacing the four `p{t,r,b,l}-4` tokens. `bg-red-200` is preserved (its order is stable).\n before: '<div className=\"pt-4 pr-4 pb-4 pl-4 bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 p-4\">box</div>',\n },\n {\n // A dynamic `{x}` child no longer blocks compress: only the element's OWN class tokens are\n // rewritten (px-4 py-4 → p-4); the dynamic child is untouched by a class-only change. This is\n // the real-app common case (most elements have dynamic content).\n before: '<div className=\"px-4 py-4\">{x}</div>',\n after: '<div className=\"p-4\">{x}</div>',\n },\n ],\n // Asymmetric padding (top != bottom) cannot fold into a shorthand → left unchanged.\n noMatch: ['<div className=\"pt-2 pr-4 pb-8 pl-4 bg-red-200\">box</div>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `place-shorthand`.\n *\n * Recompacts the grid/flex alignment longhands on an element's computed style into the CSS `place-*`\n * shorthands whenever the two axes of a pair agree:\n *\n * • align-items == justify-items → `place-items: <v>` (Tailwind `items-* justify-items-*`)\n * • align-content == justify-content → `place-content: <v>` (Tailwind `content-* justify-*`)\n *\n * The two collapses are INDEPENDENT: an element whose items pair agrees but whose content pair does\n * not collapses only `place-items` and keeps the content longhands verbatim. The shared normalizer\n * leaves all four alignment properties as independent longhands (it synthesizes no `place-*`\n * shorthand), so an element styled with two matching axis utilities keeps the longhands until this\n * pass folds them. When neither pair agrees the pattern declines.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the\n * `rewriteClasses` recipe rebuilds the class StyleMap, declining (`null`) unless at least one\n * alignment pair collapses.\n */\n\nimport type { ConditionKey, CssProperty, CssValue, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── property handles ───────────────────────── */\n\nconst ALIGN_ITEMS = 'align-items' as CssProperty;\nconst JUSTIFY_ITEMS = 'justify-items' as CssProperty;\nconst PLACE_ITEMS = 'place-items' as CssProperty;\n\nconst ALIGN_CONTENT = 'align-content' as CssProperty;\nconst JUSTIFY_CONTENT = 'justify-content' as CssProperty;\nconst PLACE_CONTENT = 'place-content' as CssProperty;\n\nconst BASE_KEY: ConditionKey = conditionKey(BASE_CONDITION);\n\n/* ───────────────────────── helpers ───────────────────────── */\n\n/** Two alignment decls collapse only if they agree on BOTH normalized value and `!important`. */\nfunction samePair(a: StyleDecl | undefined, b: StyleDecl | undefined): boolean {\n return a !== undefined && b !== undefined && a.value === b.value && a.important === b.important;\n}\n\n/** Build a `place-*` shorthand decl carrying the (uniform) value/`!important` of its axis pair. */\nfunction placeDecl(property: CssProperty, align: StyleDecl): StyleDecl {\n return {\n property,\n value: align.value as CssValue,\n important: align.important,\n relativeToParent: false, // alignment keywords (center/start/stretch/…) are not length-relative\n inherited: false, // none of the place-* alignment properties are inherited\n };\n}\n\n/** Rebuild `sm` with the base block's decls replaced; all other condition blocks pass through. */\nfunction withBaseDecls(sm: StyleMap, baseDecls: ReadonlyMap<CssProperty, StyleDecl>): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n const decls =\n key === BASE_KEY ? new Map<CssProperty, StyleDecl>(baseDecls) : block.decls;\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/** Fold matching align/justify pairs into the `place-items` / `place-content` shorthands. */\nexport const placeShorthand = definePattern({\n name: 'place-shorthand',\n category: 'compress/place-shorthand',\n safety: 1,\n doc: {\n title: 'Collapse matching alignment pairs into `place-*` shorthands',\n summary:\n 'When align-items equals justify-items they collapse to `place-items`; when align-content ' +\n 'equals justify-content they collapse to `place-content`. The two collapses are independent.',\n before: '<div style=\"align-items:center;justify-items:center\"/>',\n after: '<div style=\"place-items:center\"/>',\n safetyRationale:\n 'A `place-*` shorthand is value-identical to its equal align/justify pair — a class-only change. It ' +\n 'is safe even on an element with a ref, event handler, dynamic child, or dangerouslySetInnerHTML — ' +\n 'a className rewrite touches none of them; only a dynamic/opaque class list or a combinator-subject ' +\n 'class is excluded, so no behaviour or project selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const base = computed.blocks.get(BASE_KEY);\n if (!base) return null;\n\n const alignItems = base.decls.get(ALIGN_ITEMS);\n const justifyItems = base.decls.get(JUSTIFY_ITEMS);\n const alignContent = base.decls.get(ALIGN_CONTENT);\n const justifyContent = base.decls.get(JUSTIFY_CONTENT);\n\n const next = new Map<CssProperty, StyleDecl>(base.decls);\n let collapsed = false;\n\n // 1. Items axis: align-items == justify-items → `place-items`.\n if (samePair(alignItems, justifyItems)) {\n next.delete(ALIGN_ITEMS);\n next.delete(JUSTIFY_ITEMS);\n next.set(PLACE_ITEMS, placeDecl(PLACE_ITEMS, alignItems!));\n collapsed = true;\n }\n // 2. Content axis: align-content == justify-content → `place-content`.\n if (samePair(alignContent, justifyContent)) {\n next.delete(ALIGN_CONTENT);\n next.delete(JUSTIFY_CONTENT);\n next.set(PLACE_CONTENT, placeDecl(PLACE_CONTENT, alignContent!));\n collapsed = true;\n }\n\n if (!collapsed) return null; // nothing to compress — decline\n return withBaseDecls(computed, next);\n },\n },\n test: {\n cases: [\n {\n // The matching items pair collapses to a `place-items` decl at the IR level; the minimizing\n // reverse-emit picks the single utility covering both (`place-items-center`), replacing the\n // `items-center`+`justify-items-center` pair. `bg-red-200` is preserved.\n before: '<div className=\"items-center justify-items-center bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 place-items-center\">box</div>',\n },\n ],\n // Mismatched alignment (align-items != justify-items, no content pair) → nothing collapses.\n noMatch: ['<div className=\"items-center justify-items-start bg-red-200\">box</div>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `scroll-margin-shorthand`.\n *\n * Collapses an element whose four scroll-margin sides are expressed as separate longhand\n * declarations and are ALL EQUAL into the single CSS `scroll-margin` shorthand:\n *\n * scroll-margin-top:1rem; scroll-margin-right:1rem;\n * scroll-margin-bottom:1rem; scroll-margin-left:1rem\n * ⇒ scroll-margin:1rem (Tailwind `scroll-m-4`)\n *\n * Tailwind's `scroll-mt-*` / `scroll-mx-*` / … utilities each resolve to the matching\n * `scroll-margin-*` longhand(s), and the shared normalizer keeps `scroll-margin` un-expanded (it is\n * NOT one of the box shorthands the normalizer splits). So only the all-equal (1-value) form maps\n * cleanly to a single `scroll-m-*` utility — the 2-value (`scroll-mx`/`scroll-my`) shape is left to\n * the resolver's own reverse-emit. This pass runs the collapse in reverse on the computed map ONLY\n * when all four sides share one value, replacing them with one `scroll-margin` decl so the minimizing\n * reverse-emit can pick a single `scroll-m-*` token instead of two axis tokens.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the\n * `rewriteClasses` recipe rebuilds the class StyleMap, declining (`null`) unless the four sides are\n * present, concrete, equal, and share an `!important` flag.\n */\n\nimport type { ConditionKey, CssProperty, CssValue, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── scroll-margin analysis ───────────────────────── */\n\n/** The four scroll-margin longhands. */\nconst SCROLL_MARGIN_SIDES = [\n 'scroll-margin-top',\n 'scroll-margin-right',\n 'scroll-margin-bottom',\n 'scroll-margin-left',\n] as const satisfies readonly string[];\n\nconst SIDE_SET: ReadonlySet<string> = new Set<string>(SCROLL_MARGIN_SIDES);\n\nconst BASE_KEY: ConditionKey = conditionKey(BASE_CONDITION);\n\nconst SCROLL_MARGIN = 'scroll-margin' as CssProperty;\n\n/** CSS-wide keywords for which a side collapse is pointless or unsound. */\nconst NON_COLLAPSIBLE_VALUES: ReadonlySet<string> = new Set<string>([\n 'initial',\n 'inherit',\n 'unset',\n 'revert',\n 'revert-layer',\n]);\n\n/** The single value all four sides fold into (carrying important / relative-unit flags). */\ninterface ScrollMarginFold {\n readonly value: string;\n readonly important: boolean;\n readonly relative: boolean;\n}\n\n/**\n * Inspect the BASE-condition block of `sm` and, iff all four scroll-margin longhands are present,\n * share a uniform `!important` flag, hold a concrete (non-keyword) value, and are ALL EQUAL, return\n * that value. Returns `null` when the sides cannot fold to one `scroll-margin`.\n */\nfunction analyzeScrollMargin(sm: StyleMap): ScrollMarginFold | null {\n const block = sm.blocks.get(BASE_KEY);\n if (!block) return null;\n\n const sides: StyleDecl[] = [];\n for (const side of SCROLL_MARGIN_SIDES) {\n const decl = block.decls.get(side as CssProperty);\n if (!decl) return null;\n sides.push(decl);\n }\n\n // A shorthand cannot carry per-side `!important`; only fold a uniform flag.\n const important = sides[0]!.important;\n if (!sides.every((d) => d.important === important)) return null;\n\n const value = String(sides[0]!.value);\n if (NON_COLLAPSIBLE_VALUES.has(value)) return null;\n if (!sides.every((d) => String(d.value) === value)) return null;\n\n const relative = sides.some((d) => d.relativeToParent);\n return { value, important, relative };\n}\n\n/* ───────────────────────── style rebuild ───────────────────────── */\n\n/** Rebuild `sm` with the four BASE-block scroll-margin longhands replaced by one shorthand decl. */\nfunction withFoldedScrollMargin(sm: StyleMap, fold: ScrollMarginFold): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n if (key !== BASE_KEY) {\n blocks.set(key, block);\n continue;\n }\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n if (SIDE_SET.has(String(prop))) continue; // drop the four longhands\n decls.set(prop, decl);\n }\n const shorthand: StyleDecl = {\n property: SCROLL_MARGIN,\n value: fold.value as CssValue,\n important: fold.important,\n relativeToParent: fold.relative,\n inherited: false, // scroll-margin is never inherited\n };\n decls.set(shorthand.property, shorthand);\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/** Fold four equal scroll-margin sides into the single `scroll-margin` shorthand. */\nexport const scrollMarginShorthand = definePattern({\n name: 'scroll-margin-shorthand',\n category: 'compress/scroll-margin-shorthand',\n safety: 1,\n doc: {\n title: 'Collapse equal scroll-margin sides into scroll-margin',\n summary:\n 'An element whose four scroll-margin sides are all equal is rewritten to the single Tailwind ' +\n 'scroll-m-* utility (scroll-margin === the four equal sides).',\n before: '<div class=\"scroll-mt-4 scroll-mr-4 scroll-mb-4 scroll-ml-4\"/>',\n after: '<div class=\"scroll-m-4\"/>',\n safetyRationale:\n '`scroll-margin` is value-identical to four equal scroll-margin sides — a class-only change. It is ' +\n 'safe even on an element with a ref, event handler, dynamic child, or dangerouslySetInnerHTML — a ' +\n 'className rewrite touches none of them; only a dynamic/opaque class list or a combinator-subject ' +\n 'class is excluded, so no behaviour or project selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const fold = analyzeScrollMargin(computed);\n return fold ? withFoldedScrollMargin(computed, fold) : null;\n },\n },\n test: {\n cases: [\n {\n // The four equal scroll-margin longhands collapse to a `scroll-margin` decl at the IR level; the\n // minimizing reverse-emit then picks the single shortest utility (`scroll-m-4`) that reproduces\n // it, replacing the four `scroll-m{t,r,b,l}-4` tokens. `bg-red-200` is preserved.\n before: '<div className=\"scroll-mt-4 scroll-mr-4 scroll-mb-4 scroll-ml-4 bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 scroll-m-4\">box</div>',\n },\n ],\n // Sides differ (top != bottom) → no all-equal collapse.\n noMatch: ['<div className=\"scroll-mt-2 scroll-mr-4 scroll-mb-8 scroll-ml-4 bg-red-200\">box</div>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `scroll-padding-shorthand`.\n *\n * Collapses an element whose four scroll-padding sides are expressed as separate longhand\n * declarations and are ALL EQUAL into the single CSS `scroll-padding` shorthand:\n *\n * scroll-padding-top:1rem; scroll-padding-right:1rem;\n * scroll-padding-bottom:1rem; scroll-padding-left:1rem\n * ⇒ scroll-padding:1rem (Tailwind `scroll-p-4`)\n *\n * Tailwind's `scroll-pt-*` / `scroll-px-*` / … utilities each resolve to the matching\n * `scroll-padding-*` longhand(s), and the shared normalizer keeps `scroll-padding` un-expanded (it is\n * NOT one of the box shorthands the normalizer splits). So only the all-equal (1-value) form maps\n * cleanly to a single `scroll-p-*` utility — the 2-value (`scroll-px`/`scroll-py`) shape is left to\n * the resolver's own reverse-emit. This pass runs the collapse in reverse on the computed map ONLY\n * when all four sides share one value, replacing them with one `scroll-padding` decl so the minimizing\n * reverse-emit can pick a single `scroll-p-*` token instead of two axis tokens.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the\n * `rewriteClasses` recipe rebuilds the class StyleMap, declining (`null`) unless the four sides are\n * present, concrete, equal, and share an `!important` flag.\n */\n\nimport type { ConditionKey, CssProperty, CssValue, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── scroll-padding analysis ───────────────────────── */\n\n/** The four scroll-padding longhands. */\nconst SCROLL_PADDING_SIDES = [\n 'scroll-padding-top',\n 'scroll-padding-right',\n 'scroll-padding-bottom',\n 'scroll-padding-left',\n] as const satisfies readonly string[];\n\nconst SIDE_SET: ReadonlySet<string> = new Set<string>(SCROLL_PADDING_SIDES);\n\nconst BASE_KEY: ConditionKey = conditionKey(BASE_CONDITION);\n\nconst SCROLL_PADDING = 'scroll-padding' as CssProperty;\n\n/** CSS-wide keywords for which a side collapse is pointless or unsound. */\nconst NON_COLLAPSIBLE_VALUES: ReadonlySet<string> = new Set<string>([\n 'initial',\n 'inherit',\n 'unset',\n 'revert',\n 'revert-layer',\n]);\n\n/** The single value all four sides fold into (carrying important / relative-unit flags). */\ninterface ScrollPaddingFold {\n readonly value: string;\n readonly important: boolean;\n readonly relative: boolean;\n}\n\n/**\n * Inspect the BASE-condition block of `sm` and, iff all four scroll-padding longhands are present,\n * share a uniform `!important` flag, hold a concrete (non-keyword) value, and are ALL EQUAL, return\n * that value. Returns `null` when the sides cannot fold to one `scroll-padding`.\n */\nfunction analyzeScrollPadding(sm: StyleMap): ScrollPaddingFold | null {\n const block = sm.blocks.get(BASE_KEY);\n if (!block) return null;\n\n const sides: StyleDecl[] = [];\n for (const side of SCROLL_PADDING_SIDES) {\n const decl = block.decls.get(side as CssProperty);\n if (!decl) return null;\n sides.push(decl);\n }\n\n // A shorthand cannot carry per-side `!important`; only fold a uniform flag.\n const important = sides[0]!.important;\n if (!sides.every((d) => d.important === important)) return null;\n\n const value = String(sides[0]!.value);\n if (NON_COLLAPSIBLE_VALUES.has(value)) return null;\n if (!sides.every((d) => String(d.value) === value)) return null;\n\n const relative = sides.some((d) => d.relativeToParent);\n return { value, important, relative };\n}\n\n/* ───────────────────────── style rebuild ───────────────────────── */\n\n/** Rebuild `sm` with the four BASE-block scroll-padding longhands replaced by one shorthand decl. */\nfunction withFoldedScrollPadding(sm: StyleMap, fold: ScrollPaddingFold): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n if (key !== BASE_KEY) {\n blocks.set(key, block);\n continue;\n }\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n if (SIDE_SET.has(String(prop))) continue; // drop the four longhands\n decls.set(prop, decl);\n }\n const shorthand: StyleDecl = {\n property: SCROLL_PADDING,\n value: fold.value as CssValue,\n important: fold.important,\n relativeToParent: fold.relative,\n inherited: false, // scroll-padding is never inherited\n };\n decls.set(shorthand.property, shorthand);\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/** Fold four equal scroll-padding sides into the single `scroll-padding` shorthand. */\nexport const scrollPaddingShorthand = definePattern({\n name: 'scroll-padding-shorthand',\n category: 'compress/scroll-padding-shorthand',\n safety: 1,\n doc: {\n title: 'Collapse equal scroll-padding sides into scroll-padding',\n summary:\n 'An element whose four scroll-padding sides are all equal is rewritten to the single Tailwind ' +\n 'scroll-p-* utility (scroll-padding === the four equal sides).',\n before: '<div class=\"scroll-pt-4 scroll-pr-4 scroll-pb-4 scroll-pl-4\"/>',\n after: '<div class=\"scroll-p-4\"/>',\n safetyRationale:\n '`scroll-padding` is value-identical to four equal scroll-padding sides — a class-only change. It ' +\n 'is safe even on an element with a ref, event handler, dynamic child, or dangerouslySetInnerHTML — ' +\n 'a className rewrite touches none of them; only a dynamic/opaque class list or a combinator-subject ' +\n 'class is excluded, so no behaviour or project selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const fold = analyzeScrollPadding(computed);\n return fold ? withFoldedScrollPadding(computed, fold) : null;\n },\n },\n test: {\n cases: [\n {\n // The four equal scroll-padding longhands collapse to a `scroll-padding` decl at the IR level;\n // the minimizing reverse-emit then picks the single shortest utility (`scroll-p-4`) that\n // reproduces it, replacing the four `scroll-p{t,r,b,l}-4` tokens. `bg-red-200` is preserved.\n before: '<div className=\"scroll-pt-4 scroll-pr-4 scroll-pb-4 scroll-pl-4 bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 scroll-p-4\">box</div>',\n },\n ],\n // Sides differ (top != bottom) → no all-equal collapse.\n noMatch: ['<div className=\"scroll-pt-2 scroll-pr-4 scroll-pb-8 scroll-pl-4 bg-red-200\">box</div>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `size-shorthand`.\n *\n * Collapses an element whose computed `width` and `height` are EQUAL into the single Tailwind\n * `size-*` utility:\n *\n * <div style=\"width:1rem; height:1rem\"/> → <div class=\"size-4\"/>\n *\n * At the IR level we work over the normalized computed StyleMap (CSS longhands), so the pattern\n * recognizes the `width === height` shape in the BASE condition and rebuilds the element's class\n * StyleMap with a single `size` declaration (the resolver reverse-emits the concrete `size-*` token\n * at codegen). Both longhands are removed and replaced by the merged `size` decl, so the rewrite is\n * idempotent — once collapsed there is no `width`+`height` pair left to re-match.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the\n * `rewriteClasses` recipe rebuilds the class StyleMap, returning `null` (decline) unless the BASE\n * width/height are equal, concrete, and share an `!important` flag.\n */\n\nimport type { ConditionKey, CssProperty, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport { normalizer, definePattern } from '@domflax/pattern-kit';\n\nconst WIDTH = 'width' as CssProperty;\nconst HEIGHT = 'height' as CssProperty;\nconst SIZE = 'size' as CssProperty;\n\n/** Values for which collapsing the two axes is pointless or unsound (no concrete equal extent). */\nconst NON_COLLAPSIBLE_VALUES: ReadonlySet<string> = new Set<string>(['auto', 'initial', 'unset']);\n\n/* ───────────────────────── helpers ───────────────────────── */\n\n/** Read the BASE-condition block of the node's normalized computed StyleMap, if any. */\nfunction baseBlock(sm: StyleMap): StyleBlock | undefined {\n return sm.blocks.get(conditionKey(BASE_CONDITION));\n}\n\n/**\n * Rebuild the computed StyleMap with the BASE block's `width`/`height` pair replaced by a single\n * `size` declaration; all other conditions/blocks are preserved verbatim.\n */\nfunction withSizeShorthand(sm: StyleMap, value: string, important: boolean): StyleMap {\n const baseKey = conditionKey(BASE_CONDITION);\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n if (key !== baseKey) {\n blocks.set(key, block);\n continue;\n }\n const decls = new Map<CssProperty, StyleDecl>(block.decls);\n decls.delete(WIDTH);\n decls.delete(HEIGHT);\n for (const decl of normalizer.normalizeDeclaration(String(SIZE), value, important)) {\n decls.set(decl.property, decl);\n }\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/** Fold equal `width`/`height` into the `size-*` utility. */\nexport const sizeShorthand = definePattern({\n name: 'size-shorthand',\n category: 'compress/size-shorthand',\n safety: 2,\n doc: {\n title: 'Collapse equal width/height into size-*',\n summary:\n 'An element whose computed width and height are equal is rewritten to the single Tailwind ' +\n 'size-* utility (size-* === width + height at the same value).',\n before: '<div style=\"width:1rem;height:1rem\"/>',\n after: '<div class=\"size-4\"/>',\n safetyRationale:\n '`size-*` is value-identical to equal width+height — a class-only change. It is safe even on an ' +\n 'element with a ref, event handler, dynamic child, or dangerouslySetInnerHTML — a className rewrite ' +\n 'touches none of them; only a dynamic/opaque class list or a combinator-subject class is excluded, ' +\n 'so no behaviour or project selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const base = baseBlock(computed);\n const w = base?.decls.get(WIDTH);\n const h = base?.decls.get(HEIGHT);\n if (!w || !h) return null;\n if (w.important !== h.important) return null;\n if (NON_COLLAPSIBLE_VALUES.has(String(w.value))) return null;\n if (w.value !== h.value) return null;\n return withSizeShorthand(computed, String(w.value), w.important);\n },\n },\n test: {\n cases: [\n {\n // Equal width/height collapse to a `size` decl at the IR level; the minimizing reverse-emit\n // expands `size` back to width+height, finds the single utility covering both (`size-10`), and\n // replaces the `h-10`+`w-10` pair with it. `bg-red-200` is preserved.\n before: '<div className=\"h-10 w-10 bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 size-10\">box</div>',\n },\n ],\n // Width and height differ → no equal-axis collapse.\n noMatch: ['<div className=\"h-10 w-20 bg-red-200\">box</div>'],\n },\n});\n","/**\n * AUTO-GENERATED by `scripts/gen-registry.mjs` — DO NOT EDIT BY HAND.\n *\n * Regenerate with `npm run generate` (also runs automatically before build/typecheck/test).\n * Patterns are discovered by the `*.pattern.ts` file convention under `src/library/flatten`\n * and `src/library/compress`; the array below is sorted flatten-before-compress.\n */\n\nimport type { Pattern } from '@domflax/core';\n\nimport { displayContentsWrapper } from './library/flatten/display-contents-wrapper.pattern';\nimport { emptyStyleDiv } from './library/flatten/empty-style-div.pattern';\nimport { flexCenterWrapper } from './library/flatten/flex-center-wrapper.pattern';\nimport { inlineFlexCenterWrapper } from './library/flatten/inline-flex-center-wrapper.pattern';\nimport { nestedFlexMerge } from './library/flatten/nested-flex-merge.pattern';\nimport { nestedGridMerge } from './library/flatten/nested-grid-merge.pattern';\nimport { passthroughWrapper } from './library/flatten/passthrough-wrapper.pattern';\nimport { redundantFragment } from './library/flatten/redundant-fragment.pattern';\nimport { redundantInlineWrapper } from './library/flatten/redundant-inline-wrapper.pattern';\nimport { borderRadiusShorthand } from './library/compress/border-radius-shorthand.pattern';\nimport { borderShorthand } from './library/compress/border-shorthand.pattern';\nimport { dedupeClasses } from './library/compress/dedupe-classes.pattern';\nimport { gapShorthand } from './library/compress/gap-shorthand.pattern';\nimport { insetShorthand } from './library/compress/inset-shorthand.pattern';\nimport { marginShorthand } from './library/compress/margin-shorthand.pattern';\nimport { overflowShorthand } from './library/compress/overflow-shorthand.pattern';\nimport { overscrollBehaviorShorthand } from './library/compress/overscroll-behavior-shorthand.pattern';\nimport { paddingShorthand } from './library/compress/padding-shorthand.pattern';\nimport { placeShorthand } from './library/compress/place-shorthand.pattern';\nimport { scrollMarginShorthand } from './library/compress/scroll-margin-shorthand.pattern';\nimport { scrollPaddingShorthand } from './library/compress/scroll-padding-shorthand.pattern';\nimport { sizeShorthand } from './library/compress/size-shorthand.pattern';\n\nexport {\n displayContentsWrapper,\n emptyStyleDiv,\n flexCenterWrapper,\n inlineFlexCenterWrapper,\n nestedFlexMerge,\n nestedGridMerge,\n passthroughWrapper,\n redundantFragment,\n redundantInlineWrapper,\n borderRadiusShorthand,\n borderShorthand,\n dedupeClasses,\n gapShorthand,\n insetShorthand,\n marginShorthand,\n overflowShorthand,\n overscrollBehaviorShorthand,\n paddingShorthand,\n placeShorthand,\n scrollMarginShorthand,\n scrollPaddingShorthand,\n sizeShorthand,\n};\n\n/** Every built-in pattern, in registration order (flatten patterns before compress). */\nexport const builtinPatterns: readonly Pattern[] = [\n displayContentsWrapper,\n emptyStyleDiv,\n flexCenterWrapper,\n inlineFlexCenterWrapper,\n nestedFlexMerge,\n nestedGridMerge,\n passthroughWrapper,\n redundantFragment,\n redundantInlineWrapper,\n borderRadiusShorthand,\n borderShorthand,\n dedupeClasses,\n gapShorthand,\n insetShorthand,\n marginShorthand,\n overflowShorthand,\n overscrollBehaviorShorthand,\n paddingShorthand,\n placeShorthand,\n scrollMarginShorthand,\n scrollPaddingShorthand,\n sizeShorthand,\n];\n\nexport default builtinPatterns;\n","/**\n * @domflax/resolver-tailwind — tiny dependency-free hash for cache-busting fingerprints.\n */\n\n/** Tiny, dependency-free FNV-1a string hash (hex). Used to derive the cache-busting fingerprint. */\nexport function fnv1a(input: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < input.length; i += 1) {\n h ^= input.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return (h >>> 0).toString(16).padStart(8, '0');\n}\n","/**\n * @domflax/resolver-tailwind — emit-side shorthand expansion + residual synthesis.\n */\n\nimport type {\n CssProperty,\n EmitContext,\n StyleBlock,\n StyleDecl,\n StyleMap,\n SyntheticClass,\n} from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\nimport { normalizer } from '@domflax/pattern-kit';\n\nimport { fnv1a } from './fingerprint';\n\n/**\n * Expand a single computed declaration into the canonical LONGHAND `[property, value]` pairs the\n * reverse index is keyed on. The shared normalizer already expands the physical box shorthands\n * (`padding`/`margin`/`inset`/`border-*`); we additionally expand the few logical shorthands the\n * compress passes synthesize that the normalizer leaves intact (`size`, `inset-block`,\n * `inset-inline`). Values are re-canonicalized via the normalizer so they match the index exactly.\n */\nexport function expandForEmit(\n norm: { normalizeDeclaration: typeof normalizer.normalizeDeclaration },\n prop: string,\n value: string,\n important: boolean,\n): Array<readonly [CssProperty, string]> {\n const pairsFor = (p: string, v: string): Array<readonly [CssProperty, string]> =>\n norm.normalizeDeclaration(p, v, important).map((d) => [d.property, String(d.value)] as const);\n\n if (prop === 'size') {\n return [...pairsFor('width', value), ...pairsFor('height', value)];\n }\n if (prop === 'inset-block' || prop === 'inset-inline') {\n const parts = value.split(/\\s+/).filter((s) => s.length > 0);\n const a = parts[0] ?? value;\n const b = parts[1] ?? a;\n const sides = prop === 'inset-block' ? (['top', 'bottom'] as const) : (['left', 'right'] as const);\n return [...pairsFor(sides[0], a), ...pairsFor(sides[1], b)];\n }\n return pairsFor(prop, value);\n}\n\n/** Build a residual {@link SyntheticClass} for declarations no utility covered; `null` on failure. */\nexport function synthesizeResidual(\n remaining: ReadonlyMap<CssProperty, string>,\n ctx: EmitContext,\n): SyntheticClass | undefined {\n if (remaining.size === 0) return undefined;\n const norm = ctx.normalizer ?? normalizer;\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, value] of remaining) {\n for (const decl of norm.normalizeDeclaration(String(prop), value, false)) {\n decls.set(decl.property, decl);\n }\n }\n const block: StyleBlock = { condition: BASE_CONDITION, decls };\n const styleMap: StyleMap = { blocks: new Map([[conditionKey(BASE_CONDITION), block]]) };\n const css = [...remaining].map(([p, v]) => `${p}:${v}`).join(';');\n const className = `df-${fnv1a(css)}`;\n const synthetic: SyntheticClass = { className, decls: styleMap, css: `.${className}{${css}}` };\n try {\n ctx.sink.register(synthetic);\n } catch {\n /* a sink that rejects registration must not break emit */\n }\n return synthetic;\n}\n","/**\n * @domflax/resolver-tailwind — engine loading (synchronous v3 internals).\n *\n * The forward/reverse engine lives in tailwindcss' CommonJS internals. We load them through\n * `createRequire` (rather than `import`) so the exact same code path works whether this module is\n * bundled to ESM or CJS, and so the untyped internal subpaths don't need ambient declarations.\n *\n * CRITICAL (bundling): tailwindcss must be resolved from the CONSUMER'S project, NOT from the file\n * this module happens to live in. When `domflax` inlines this resolver into its own bundle\n * (`noExternal: [/^@domflax\\//]`), a require based on the bundle's location (`__filename`) would\n * look for `tailwindcss` next to `domflax/dist`, where it does not exist — so the engine silently\n * failed to load and `emit`'s reverse index came up empty. Instead we root the require in the user's\n * project (an explicit project root, then `process.cwd()`), exactly how prettier-plugin-tailwindcss\n * and the Tailwind IntelliSense engine locate a project's Tailwind. The bundle/source location is\n * kept only as a last-resort fallback (covers the non-bundled / in-repo dev case). The first base\n * from which `tailwindcss/package.json` resolves wins.\n */\n\nimport { createRequire } from 'node:module';\nimport * as path from 'node:path';\n\nimport type { TailwindResolverConfig } from './config';\nimport type { TwContext, TwEngine, TwNode } from './types';\n\n/**\n * This module's own location, used as a last-resort require base. esbuild substitutes a real\n * `__filename` in a CJS bundle; in an ESM bundle `__filename` is undefined and we fall back to\n * `import.meta.url` (a `file://` URL, which `createRequire` accepts).\n */\nfunction moduleBase(): string {\n return typeof __filename === 'string' ? __filename : import.meta.url;\n}\n\n/**\n * Build a `require` rooted in the consumer's project so engine resolution is independent of where\n * this (possibly bundled) module physically lives. Returns `null` if `tailwindcss` resolves from no\n * candidate base.\n */\nfunction projectRequire(projectRoot?: string): NodeRequire | null {\n const bases: string[] = [];\n // A real file name is irrelevant — `createRequire` only uses the containing directory for\n // resolution; the file need not exist.\n if (projectRoot) bases.push(path.join(projectRoot, '__domflax__.js'));\n bases.push(path.join(process.cwd(), '__domflax__.js'));\n bases.push(moduleBase());\n for (const base of bases) {\n try {\n const candidate = createRequire(base);\n candidate.resolve('tailwindcss/package.json');\n return candidate;\n } catch {\n /* try the next base */\n }\n }\n return null;\n}\n\n/** Build a synchronous Tailwind v3 engine for the given resolved config; returns `null` on failure. */\nexport function loadEngine(options: TailwindResolverConfig): TwEngine | null {\n const req = projectRequire(options.projectRoot);\n if (!req) return null;\n try {\n const resolveConfig = req('tailwindcss/resolveConfig.js') as (c: unknown) => unknown;\n const { createContext } = req('tailwindcss/lib/lib/setupContextUtils.js') as {\n createContext: (config: unknown) => TwContext;\n };\n const { generateRules } = req('tailwindcss/lib/lib/generateRules.js') as {\n generateRules: (candidates: Set<string>, context: TwContext) => Array<[number, TwNode]>;\n };\n const pkg = req('tailwindcss/package.json') as { version: string };\n\n let userConfig: unknown = options.config ?? { content: [{ raw: '' }] };\n if (options.configPath !== undefined) {\n const loadConfig = req('tailwindcss/loadConfig.js') as (p: string) => unknown;\n userConfig = loadConfig(options.configPath);\n }\n const resolved = resolveConfig(userConfig);\n const context = createContext(resolved);\n\n return {\n version: pkg.version,\n context,\n generate(candidates: readonly string[]): TwNode[] {\n const rules = generateRules(new Set(candidates), context);\n return rules.map(([, node]) => node);\n },\n };\n } catch {\n return null;\n }\n}\n","/**\n * @domflax/resolver-tailwind — selector / condition parsing.\n */\n\nimport type { StyleCondition } from '@domflax/core';\n\n/** Pseudo-elements that Tailwind may emit with a legacy single colon. */\nconst LEGACY_PSEUDO_ELEMENTS = new Set([\n ':before',\n ':after',\n ':first-line',\n ':first-letter',\n]);\n\nexport type ParsedSelector =\n | { readonly kind: 'simple'; readonly states: readonly string[]; readonly pseudoElement: string }\n | { readonly kind: 'complex' };\n\n/**\n * Parse a generated selector into a {@link StyleCondition} fragment. Accepts ONLY a single class\n * selector optionally followed by pseudo-class / pseudo-element parts (`.x`, `.x:hover`,\n * `.x::before`, `.x:focus:hover`). Anything with a combinator, a second compound class, an attribute\n * selector, or a selector list is `complex` (⇒ opaque) because its declarations do not apply to the\n * element's own box.\n */\nexport function parseSelector(selector: string): ParsedSelector {\n const sel = selector.trim();\n if (sel.length === 0 || sel[0] !== '.') return { kind: 'complex' };\n\n // Consume the class identifier, honoring CSS backslash escapes (`\\:`, `\\/`, `\\[`, …).\n let i = 1;\n for (; i < sel.length; i += 1) {\n const c = sel[i]!;\n if (c === '\\\\') {\n i += 1; // skip the escaped char\n continue;\n }\n if (c === ':' || c === '.' || c === '[' || c === ' ' || c === '>' || c === '+' || c === '~' || c === ',') {\n break;\n }\n }\n\n const remainder = sel.slice(i);\n if (remainder.length === 0) {\n return { kind: 'simple', states: [], pseudoElement: '' };\n }\n // The remainder must be EXCLUSIVELY pseudo parts — no combinator / compound / attribute follows.\n if (!/^(?:::?[-a-z]+(?:\\([^()]*\\))?)+$/i.test(remainder)) {\n return { kind: 'complex' };\n }\n\n const parts = remainder.match(/::?[-a-z]+(?:\\([^()]*\\))?/gi) ?? [];\n const states: string[] = [];\n let pseudoElement = '';\n for (const part of parts) {\n if (part.startsWith('::') || LEGACY_PSEUDO_ELEMENTS.has(part)) {\n pseudoElement = part.startsWith('::') ? part : `:${part}`;\n } else {\n states.push(part);\n }\n }\n return { kind: 'simple', states, pseudoElement };\n}\n\nexport function makeCondition(media: string, states: readonly string[], pseudoElement: string): StyleCondition {\n return {\n media,\n states: [...new Set(states)].sort(),\n pseudoElement,\n };\n}\n\n/** Recover a class name from a simple `.escaped-class` selector, or `null` if it isn't simple. */\nexport function unescapeClass(selector: string): string | null {\n const sel = selector.trim();\n if (sel[0] !== '.') return null;\n let out = '';\n for (let i = 1; i < sel.length; i += 1) {\n const c = sel[i]!;\n if (c === '\\\\') {\n i += 1;\n if (i < sel.length) out += sel[i];\n continue;\n }\n if (c === ':' || c === '.' || c === '[' || c === ' ' || c === '>' || c === '+' || c === '~' || c === ',') {\n return null; // not a bare single-class selector\n }\n out += c;\n }\n return out.length > 0 ? out : null;\n}\n","/**\n * @domflax/resolver-tailwind — rule extraction (engine nodes → usable blocks).\n */\n\nimport type { OpaqueToken, StyleCondition } from '@domflax/core';\n\nimport { makeCondition, parseSelector } from './selector';\nimport type { TwGeneratedAtRule, TwGeneratedDecl, TwGeneratedRule, TwNode } from './types';\n\nexport interface ExtractedBlock {\n readonly condition: StyleCondition;\n readonly decls: ReadonlyArray<readonly [string, string, boolean]>;\n}\n\nexport interface ExtractedToken {\n /** Usable (BASE + supported-variant) blocks. */\n readonly blocks: readonly ExtractedBlock[];\n /** True if the engine emitted at least one rule for the token (even an opaque one). */\n readonly produced: boolean;\n /** Set when the token only resolves via combinator / unsupported at-rule selectors. */\n readonly opaque?: OpaqueToken;\n}\n\n/** Collect every leaf `rule` node together with the `@media` stack that wraps it. */\nfunction collectRules(\n node: TwNode,\n mediaStack: readonly string[],\n inUnsupportedAtRule: boolean,\n out: Array<{ rule: TwGeneratedRule; media: readonly string[]; unsupported: boolean }>,\n): void {\n if (node.type === 'rule') {\n out.push({ rule: node as TwGeneratedRule, media: mediaStack, unsupported: inUnsupportedAtRule });\n return;\n }\n if (node.type === 'atrule') {\n const at = node as TwGeneratedAtRule;\n const children = at.nodes ?? [];\n if (at.name === 'media') {\n const nextStack = at.params ? [...mediaStack, at.params] : mediaStack;\n for (const child of children) collectRules(child, nextStack, inUnsupportedAtRule, out);\n } else {\n // @supports / @container / etc. — recurse but flag as unsupported (⇒ opaque).\n for (const child of children) collectRules(child, mediaStack, true, out);\n }\n }\n}\n\n/** Extract usable blocks + opacity info for a single candidate token from its generated nodes. */\nexport function extractToken(token: string, nodes: readonly TwNode[]): ExtractedToken {\n if (nodes.length === 0) return { blocks: [], produced: false };\n\n const leaves: Array<{ rule: TwGeneratedRule; media: readonly string[]; unsupported: boolean }> = [];\n for (const node of nodes) collectRules(node, [], false, leaves);\n\n const blocks: ExtractedBlock[] = [];\n let sawComplex = false;\n\n for (const { rule, media, unsupported } of leaves) {\n const parsed = parseSelector(rule.selector);\n if (parsed.kind === 'complex' || unsupported) {\n sawComplex = true;\n continue;\n }\n const decls: Array<readonly [string, string, boolean]> = [];\n for (const child of rule.nodes ?? []) {\n if (child.type !== 'decl') continue; // skip @defaults markers, comments, nested rules\n const d = child as TwGeneratedDecl;\n if (typeof d.value !== 'string') continue;\n decls.push([d.prop, d.value, d.important === true]);\n }\n if (decls.length === 0) continue;\n const mediaQuery = media.join(' and ');\n blocks.push({ condition: makeCondition(mediaQuery, parsed.states, parsed.pseudoElement), decls });\n }\n\n const opaque: OpaqueToken | undefined =\n sawComplex && blocks.length === 0\n ? { token, reason: 'combinator-variant', detail: 'utility targets descendants/siblings, not its own box' }\n : undefined;\n\n return { blocks, produced: true, opaque };\n}\n","/**\n * @domflax/resolver-tailwind — CSS serialization for `cssFor`.\n */\n\nimport type { TwGeneratedAtRule, TwGeneratedDecl, TwGeneratedRule, TwNode } from './types';\n\n/** Serialize one engine-emitted node (rule / atrule / decl) into plain CSS text. */\nexport function serializeCssNode(node: TwNode): string {\n if (node.type === 'decl') {\n const d = node as TwGeneratedDecl;\n if (typeof d.value !== 'string') return '';\n return `${d.prop}:${d.value}${d.important === true ? ' !important' : ''}`;\n }\n if (node.type === 'rule') {\n const r = node as TwGeneratedRule;\n const body = (r.nodes ?? [])\n .map((c) => serializeCssNode(c))\n .filter((s) => s.length > 0)\n .join(';');\n return `${r.selector}{${body}}`;\n }\n if (node.type === 'atrule') {\n const a = node as TwGeneratedAtRule;\n const body = (a.nodes ?? [])\n .map((c) => serializeCssNode(c))\n .filter((s) => s.length > 0)\n .join('');\n return `@${a.name} ${a.params}{${body}}`;\n }\n return '';\n}\n","/**\n * @domflax/resolver-tailwind — StyleMap assembly + provenance helpers.\n */\n\nimport type {\n CssProperty,\n StyleBlock,\n StyleCondition,\n StyleDecl,\n StyleMap,\n StyleOrigin,\n} from '@domflax/core';\nimport { conditionKey, emptyStyleMap } from '@domflax/core';\nimport { normalizer } from '@domflax/pattern-kit';\n\nexport function buildStyleMap(\n blockMaps: Map<string, { condition: StyleCondition; decls: Map<CssProperty, StyleDecl> }>,\n): StyleMap {\n if (blockMaps.size === 0) return emptyStyleMap();\n const blocks = new Map<ReturnType<typeof conditionKey>, StyleBlock>();\n for (const { condition, decls } of blockMaps.values()) {\n if (decls.size === 0) continue;\n blocks.set(conditionKey(condition), { condition, decls });\n }\n if (blocks.size === 0) return emptyStyleMap();\n return normalizer.normalizeStyleMap({ blocks });\n}\n\n/**\n * The shadow chain a newly-winning declaration inherits when it overrides `prev` on the same\n * property: everything `prev` already shadowed, plus `prev`'s own origin (now shadowed too). Deduped\n * by class name and restricted to class origins (the only kind `dedupe-classes` acts on).\n */\nexport function shadowedBy(prev: StyleDecl): readonly StyleOrigin[] | undefined {\n const out: StyleOrigin[] = [];\n const seen = new Set<string>();\n const add = (o: StyleOrigin | undefined): void => {\n if (!o || o.kind !== 'class' || seen.has(o.className)) return;\n seen.add(o.className);\n out.push(o);\n };\n for (const o of prev.shadowed ?? []) add(o);\n add(prev.origin);\n return out.length > 0 ? out : undefined;\n}\n","/**\n * @domflax/resolver-tailwind — conservative {@link SelectorUsage} constants.\n */\n\nimport type { SelectorUsage } from '@domflax/core';\n\n/**\n * A conservative, never-droppable {@link SelectorUsage}. Until a real project selector graph exists\n * we must assume a class could be referenced in any unsafe position, so nothing is safe to rewrite.\n */\nexport const OPAQUE_USAGE: SelectorUsage = {\n asSubject: true,\n asAncestor: true,\n asCompound: true,\n asSibling: true,\n asHasArgument: true,\n asStructural: true,\n droppable: false,\n};\n\n/**\n * A plain-subject {@link SelectorUsage}: the class is a resolver-owned, base-only utility whose\n * whole effect is reproducible from `computed`, so it is safe to drop/replace during reverse-emit.\n */\nexport const DROPPABLE_USAGE: SelectorUsage = {\n asSubject: true,\n asAncestor: false,\n asCompound: false,\n asSibling: false,\n asHasArgument: false,\n asStructural: false,\n droppable: true,\n};\n","/**\n * @domflax/resolver-tailwind — the {@link StyleResolver} implementation + public factory.\n */\n\nimport type {\n CssProperty,\n EmitContext,\n EmitResult,\n OpaqueToken,\n ResolveInput,\n ResolveResult,\n SelectorUsage,\n StyleCondition,\n StyleDecl,\n StyleMap,\n StyleOrigin,\n StyleResolver,\n} from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\nimport { normalizer } from '@domflax/pattern-kit';\n\nimport type { TailwindResolverConfig } from './config';\nimport { expandForEmit, synthesizeResidual } from './emit';\nimport { loadEngine } from './engine';\nimport type { ExtractedToken } from './extract';\nimport { extractToken } from './extract';\nimport { fnv1a } from './fingerprint';\nimport { parseSelector, unescapeClass } from './selector';\nimport { serializeCssNode } from './serialize';\nimport { buildStyleMap, shadowedBy } from './stylemap';\nimport type { TwEngine, TwGeneratedDecl, TwGeneratedRule } from './types';\nimport { DROPPABLE_USAGE, OPAQUE_USAGE } from './usage';\n\nclass TailwindResolver implements StyleResolver {\n readonly id = 'tailwind';\n readonly provider: string;\n readonly fingerprint: string;\n\n readonly #engine: TwEngine | null;\n /** Per-token extraction cache (engine output is pure for a fixed config). */\n readonly #tokenCache = new Map<string, ExtractedToken>();\n /** Per-class-set forward-resolution cache. */\n readonly #resolveCache = new Map<string, ResolveResult>();\n /** Lazily built reverse index for {@link emit}. */\n #reverseIndex: ReadonlyArray<readonly [string, ReadonlyMap<CssProperty, string>]> | null = null;\n\n constructor(config: TailwindResolverConfig = {}) {\n this.#engine = loadEngine(config);\n this.provider =\n config.provider ?? (this.#engine ? `tailwindcss@${this.#engine.version}` : 'tailwindcss');\n const seed = JSON.stringify(config.config ?? {}) + (config.configPath ?? '');\n this.fingerprint = config.fingerprint ?? `${this.provider}/${fnv1a(seed)}`;\n }\n\n /** Engine-backed, cached single-token extraction. */\n #extract(token: string): ExtractedToken {\n const cached = this.#tokenCache.get(token);\n if (cached) return cached;\n let result: ExtractedToken;\n if (!this.#engine) {\n result = { blocks: [], produced: false };\n } else {\n try {\n result = extractToken(token, this.#engine.generate([token]));\n } catch {\n result = { blocks: [], produced: false };\n }\n }\n this.#tokenCache.set(token, result);\n return result;\n }\n\n owns(token: string): boolean {\n if (token.length === 0) return false;\n return this.#extract(token).produced;\n }\n\n resolve(input: ResolveInput): ResolveResult {\n const key = JSON.stringify(input.classes);\n const cached = this.#resolveCache.get(key);\n if (cached) return cached;\n\n // condition-key → { condition, longhand decls }. Iterating classes in source order means later\n // utilities overwrite earlier ones on the same property (equal-specificity cascade).\n const blockMaps = new Map<\n string,\n { condition: StyleCondition; decls: Map<CssProperty, StyleDecl> }\n >();\n const resolved: string[] = [];\n const unknown: string[] = [];\n const opaque: OpaqueToken[] = [];\n\n input.classes.forEach((token, tokenIndex) => {\n const extracted = this.#extract(token);\n if (!extracted.produced) {\n unknown.push(token);\n return;\n }\n if (extracted.opaque) opaque.push(extracted.opaque);\n if (extracted.blocks.length === 0) return; // produced only opaque rules\n\n const origin: StyleOrigin = { kind: 'class', tokenIndex, className: token };\n let contributed = false;\n for (const block of extracted.blocks) {\n const ck = conditionKey(block.condition);\n let bucket = blockMaps.get(ck);\n if (!bucket) {\n bucket = { condition: block.condition, decls: new Map() };\n blockMaps.set(ck, bucket);\n }\n for (const [prop, value, important] of block.decls) {\n for (const decl of normalizer.normalizeDeclaration(prop, value, important)) {\n // Record provenance: a LATER token on the same property shadows the earlier one. The\n // overridden origin (plus anything it already shadowed) is carried in `shadowed`, which\n // is exactly what the `dedupe-classes` pattern reads to find fully-overridden tokens.\n // This only enriches decl metadata — the resolved VALUES are unchanged.\n const prev = bucket.decls.get(decl.property);\n const shadowed = prev ? shadowedBy(prev) : undefined;\n bucket.decls.set(decl.property, shadowed ? { ...decl, origin, shadowed } : { ...decl, origin });\n contributed = true;\n }\n }\n }\n if (contributed) resolved.push(token);\n });\n\n const result: ResolveResult = {\n styles: buildStyleMap(blockMaps),\n resolved,\n unknown,\n opaque,\n warnings: [],\n };\n this.#resolveCache.set(key, result);\n return result;\n }\n\n /**\n * Lazily build the reverse index from the engine's own enumerable class list. Each indexable\n * utility maps to its NORMALIZED BASE longhand declarations (property → canonical value). Utilities\n * with variant conditions, combinator selectors, or no BASE declarations are skipped. Sorted by\n * declaration count (desc) so greedier (shorthand-like) utilities are tried first.\n */\n #buildReverseIndex(): ReadonlyArray<readonly [string, ReadonlyMap<CssProperty, string>]> {\n if (this.#reverseIndex) return this.#reverseIndex;\n const index: Array<readonly [string, Map<CssProperty, string>]> = [];\n if (this.#engine) {\n try {\n const classes = this.#engine.context\n .getClassList()\n .filter((c): c is string => typeof c === 'string');\n const nodes = this.#engine.generate(classes);\n // Re-extract per class would be costly; instead group decls by their (single) class selector.\n for (const node of nodes) {\n if (node.type !== 'rule') continue; // skip @media / @keyframes wrappers (⇒ variants only)\n const rule = node as TwGeneratedRule;\n const parsed = parseSelector(rule.selector);\n if (parsed.kind !== 'simple' || parsed.states.length > 0 || parsed.pseudoElement !== '') {\n continue; // BASE-only\n }\n const className = unescapeClass(rule.selector);\n if (className === null) continue;\n const decls = new Map<CssProperty, string>();\n for (const child of rule.nodes ?? []) {\n if (child.type !== 'decl') continue;\n const d = child as TwGeneratedDecl;\n if (typeof d.value !== 'string') continue;\n for (const decl of normalizer.normalizeDeclaration(d.prop, d.value, d.important === true)) {\n decls.set(decl.property, String(decl.value));\n }\n }\n if (decls.size > 0) index.push([className, decls]);\n }\n } catch {\n /* leave index empty on failure — emit degrades to a no-op */\n }\n }\n index.sort((a, b) => b[1].size - a[1].size || (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0));\n this.#reverseIndex = index;\n return index;\n }\n\n emit(styles: StyleMap, ctx: EmitContext): EmitResult {\n const norm = ctx.normalizer ?? normalizer;\n const normalized = norm.normalizeStyleMap(styles);\n const base = normalized.blocks.get(conditionKey(BASE_CONDITION));\n if (!base || base.decls.size === 0) return { classes: [], exact: true, warnings: [] };\n\n // Only the BASE block is reverse-synthesized (see module LIMITATION). Any non-base condition\n // present in the target means we cannot be exact.\n const hasNonBase = normalized.blocks.size > 1;\n\n // The target longhand map. The IR's compress passes hand us SHORTHAND properties (`padding`,\n // `margin`, `inset`, `inset-block`, `inset-inline`, `size`); we expand them to the same longhand\n // basis the reverse index is keyed on, so a single shorthand utility (`p-4`, `size-4`, `inset-0`)\n // can cover them.\n const target = new Map<CssProperty, string>();\n for (const [prop, decl] of base.decls) {\n for (const [lp, lv] of expandForEmit(norm, String(prop), String(decl.value), decl.important)) {\n target.set(lp, lv);\n }\n }\n\n // Keep only utilities every one of whose declarations matches the target (an exact-fit subset);\n // emitting a utility that sets an unwanted property/value would change the computed style.\n const candidates: Array<readonly [string, ReadonlyMap<CssProperty, string>]> = [];\n for (const entry of this.#buildReverseIndex()) {\n const [, declMap] = entry;\n if (declMap.size === 0 || declMap.size > target.size) continue;\n let fits = true;\n for (const [prop, value] of declMap) {\n if (target.get(prop) !== value) {\n fits = false;\n break;\n }\n }\n if (fits) candidates.push(entry);\n }\n\n // Greedy set-cover: repeatedly take the candidate covering the MOST still-needed declarations,\n // so a shorthand (`p-4`, 4 decls) beats `px-4`+`py-4`. Ties break toward the tighter decl-set\n // then lexicographically, for deterministic output.\n const remaining = new Map(target);\n const classes: string[] = [];\n while (remaining.size > 0) {\n let best: readonly [string, ReadonlyMap<CssProperty, string>] | null = null;\n let bestCover = 0;\n for (const entry of candidates) {\n const [token, declMap] = entry;\n let cover = 0;\n for (const prop of declMap.keys()) if (remaining.has(prop)) cover += 1;\n if (cover === 0) continue;\n const better =\n best === null ||\n cover > bestCover ||\n (cover === bestCover && declMap.size < best[1].size) ||\n (cover === bestCover && declMap.size === best[1].size && token < best[0]);\n if (better) {\n best = entry;\n bestCover = cover;\n }\n }\n if (!best) break; // nothing covers any still-needed declaration → residual\n classes.push(best[0]);\n for (const prop of best[1].keys()) remaining.delete(prop);\n }\n\n const exact = remaining.size === 0 && !hasNonBase;\n if (remaining.size === 0) return { classes, exact, warnings: [] };\n\n // Surface what no utility could cover as a residual synthetic (never thrown, never invented).\n const residual = synthesizeResidual(remaining, ctx);\n return residual\n ? { classes, residual, exact, warnings: [] }\n : { classes, exact, warnings: [] };\n }\n\n /**\n * Generate a CSS stylesheet that defines `classes`, so a verifier can render a subtree with the\n * real Tailwind styling applied. Backed by the same engine `resolve` uses (`generate(candidates)`),\n * serialized to plain CSS. Returns `''` when the engine is unavailable or generates nothing.\n */\n cssFor(classes: readonly string[]): string {\n if (!this.#engine) return '';\n const tokens = [...new Set(classes)].filter((c) => c.length > 0);\n if (tokens.length === 0) return '';\n try {\n return this.#engine\n .generate(tokens)\n .map((n) => serializeCssNode(n))\n .filter((s) => s.length > 0)\n .join('\\n');\n } catch {\n return '';\n }\n }\n\n selectorUsage(token: string): SelectorUsage {\n // No project selector graph yet, so we cannot know how a CUSTOM (non-Tailwind) class is\n // referenced — treat it as load-bearing (preserved verbatim). A resolver-OWNED utility, by\n // contrast, is safe to drop/replace iff its whole effect is reproducible from `computed`: it\n // must be a plain (non-opaque) utility contributing ONLY base-condition declarations. Opaque\n // (combinator/at-rule) and variant-bound utilities are kept, because `emit` cannot rebuild them.\n const ex = this.#extract(token);\n if (!ex.produced || ex.opaque) return OPAQUE_USAGE;\n const baseOnly =\n ex.blocks.length > 0 &&\n ex.blocks.every((b) => conditionKey(b.condition) === conditionKey(BASE_CONDITION));\n if (!baseOnly) return OPAQUE_USAGE;\n return DROPPABLE_USAGE;\n }\n}\n\n/** Factory: build a Tailwind-backed {@link StyleResolver}. */\nexport function createTailwindResolver(config?: TailwindResolverConfig): StyleResolver {\n return new TailwindResolver(config);\n}\n","/* ────────────────────────────────────────────────────────────────────────── *\n * Resolver identity + selector classification constants\n * ────────────────────────────────────────────────────────────────────────── */\n\n/** Stable resolver id surfaced on {@link StyleResolver.id}. */\nexport const CSS_RESOLVER_ID = 'css';\n\n/** Provider tag surfaced on {@link StyleResolver.provider}. */\nexport const CSS_RESOLVER_PROVIDER = 'custom-css';\n\n/** Version stamp for the index/cascade machinery; bump when its semantics change (cache-busting). */\nexport const ENGINE_VERSION = 'css-index@1';\n\n/** Structural pseudo-classes — their presence makes a class structurally targeted (review-1 blocker). */\nexport const STRUCTURAL_PSEUDOS: ReadonlySet<string> = new Set([\n ':nth-child',\n ':nth-last-child',\n ':first-child',\n ':last-child',\n ':only-child',\n ':nth-of-type',\n ':nth-last-of-type',\n ':first-of-type',\n ':last-of-type',\n ':only-of-type',\n]);\n\n/** Functional pseudos whose argument is itself a selector list — opaque to forward resolution. */\nexport const FUNCTIONAL_PSEUDOS: ReadonlySet<string> = new Set([\n ':not',\n ':is',\n ':where',\n ':has',\n ':matches',\n]);\n\n/** Legacy single-colon pseudo-ELEMENTS that the parser may not flag via `isPseudoElement`. */\nexport const LEGACY_PSEUDO_ELEMENTS: ReadonlySet<string> = new Set([\n ':before',\n ':after',\n ':first-line',\n ':first-letter',\n]);\n","import { createRequire } from 'node:module';\nimport * as path from 'node:path';\nimport type { Root as PostcssRoot } from 'postcss';\nimport type selectorParser from 'postcss-selector-parser';\n\n/* ────────────────────────────────────────────────────────────────────────── *\n * Lazy engine loading (postcss + postcss-selector-parser)\n * ────────────────────────────────────────────────────────────────────────── *\n *\n * postcss and postcss-selector-parser are OPTIONAL peers of the published `domflax` package: a\n * Tailwind-only user need not install them. They must therefore be loaded LAZILY (only when this\n * resolver is actually constructed) and from the CONSUMER'S project — never via a static top-level\n * `import`, which would (a) crash on module load for a postcss-less install and (b), once this\n * resolver is inlined into domflax's bundle, resolve relative to `domflax/dist` instead of the\n * user's project. We root the require in `process.cwd()` (or an explicit project root), exactly as\n * the Tailwind resolver does, with the bundle/source location as a last-resort fallback.\n */\n\n/** This module's own location — esbuild fills `__filename` in CJS; ESM falls back to `import.meta.url`. */\nexport function moduleBase(): string {\n return typeof __filename === 'string' ? __filename : import.meta.url;\n}\n\n/** The single postcss entry point this resolver calls at runtime. */\nexport type PostcssParseApi = (css: string, opts?: { from?: string }) => PostcssRoot;\n\n/** The subset of the postcss-selector-parser API this resolver calls at runtime (guards preserve narrowing). */\nexport interface SelectorParserApi {\n (): { astSync(selector: string): selectorParser.Root };\n isClassName(n: selectorParser.Node): n is selectorParser.ClassName;\n isTag(n: selectorParser.Node): n is selectorParser.Tag;\n isIdentifier(n: selectorParser.Node): n is selectorParser.Identifier;\n isAttribute(n: selectorParser.Node): n is selectorParser.Attribute;\n isUniversal(n: selectorParser.Node): n is selectorParser.Universal;\n isNesting(n: selectorParser.Node): n is selectorParser.Nesting;\n isPseudo(n: selectorParser.Node): n is selectorParser.Pseudo;\n isPseudoClass(n: selectorParser.Node): n is selectorParser.Pseudo;\n isPseudoElement(n: selectorParser.Node): n is selectorParser.Pseudo;\n isCombinator(n: selectorParser.Node): n is selectorParser.Combinator;\n}\n\nexport interface PostcssEngine {\n readonly parse: PostcssParseApi;\n readonly selectorParser: SelectorParserApi;\n}\n\n/** Resolve postcss + postcss-selector-parser from the consumer's project; `null` if unavailable. */\nexport function loadPostcssEngine(projectRoot?: string): PostcssEngine | null {\n const bases: string[] = [];\n if (projectRoot) bases.push(path.join(projectRoot, '__domflax__.js'));\n bases.push(path.join(process.cwd(), '__domflax__.js'));\n bases.push(moduleBase());\n for (const base of bases) {\n try {\n const req = createRequire(base);\n req.resolve('postcss');\n req.resolve('postcss-selector-parser');\n const postcss = req('postcss') as { parse: PostcssParseApi };\n const raw = req('postcss-selector-parser') as SelectorParserApi & { default?: SelectorParserApi };\n // postcss-selector-parser is CJS with a default export under interop; accept both shapes.\n const selector = raw.default ?? raw;\n return { parse: postcss.parse, selectorParser: selector };\n } catch {\n /* try the next base */\n }\n }\n return null;\n}\n\n/* ────────────────────────────────────────────────────────────────────────── *\n * Lazily-loaded postcss engine (module singleton)\n * ────────────────────────────────────────────────────────────────────────── */\n\n/** Runtime postcss `parse`, populated on first resolver construction. */\nexport let pc: PostcssParseApi | null = null;\n/** Runtime postcss-selector-parser, populated on first resolver construction. */\nexport let sp: SelectorParserApi | null = null;\n\n/** Ensure the postcss engine is loaded; throws a clear error if the optional peers are absent. */\nexport function ensurePostcss(projectRoot?: string): void {\n if (pc && sp) return;\n const engine = loadPostcssEngine(projectRoot);\n if (!engine) {\n throw new Error(\n '@domflax/resolver-css requires \"postcss\" and \"postcss-selector-parser\" to be installed in ' +\n 'your project (they are optional peer dependencies of domflax, loaded only when the custom-CSS ' +\n 'provider is used). Install them with: npm install postcss postcss-selector-parser',\n );\n }\n pc = engine.parse;\n sp = engine.selectorParser;\n}\n","import type { AtRule, Rule } from 'postcss';\nimport type { RawDecl } from './types';\n\n/* ────────────────────────────────────────────────────────────────────────── *\n * postcss helpers\n * ────────────────────────────────────────────────────────────────────────── */\n\ninterface MediaContext {\n readonly media: string;\n /** True when the rule lives under an at-rule that is not a style context (keyframes/font-face). */\n readonly skip: boolean;\n}\n\n/** Walk a rule's at-rule ancestry, collecting `@media` params and detecting non-style contexts. */\nexport function mediaContext(rule: Rule): MediaContext {\n const parts: string[] = [];\n let skip = false;\n let parent = rule.parent;\n while (parent && parent.type === 'atrule') {\n const at = parent as AtRule;\n const name = at.name.toLowerCase();\n if (name === 'media') parts.unshift(at.params.trim().replace(/\\s+/g, ' '));\n else if (name === 'keyframes' || name.endsWith('keyframes') || name === 'font-face') skip = true;\n parent = parent.parent;\n }\n return { media: parts.join(' and '), skip };\n}\n\n/** A rule's direct declarations, in source order, as raw `[prop, value, important]` triples. */\nexport function collectDecls(rule: Rule): RawDecl[] {\n const out: RawDecl[] = [];\n for (const node of rule.nodes) {\n if (node.type === 'decl') out.push([node.prop, node.value, node.important === true]);\n }\n return out;\n}\n","import { readFileSync } from 'node:fs';\nimport { ENGINE_VERSION } from './constants';\nimport type { CssFile } from './types';\n\n/* ────────────────────────────────────────────────────────────────────────── *\n * Misc helpers\n * ────────────────────────────────────────────────────────────────────────── */\n\n/** Cheap, allocation-free CSS-identifier check used by {@link CustomCSSResolver.owns}. */\nexport function isPlainClassToken(token: string): boolean {\n return token.length > 0 && !/[\\s.#>+~:[\\]()]/.test(token);\n}\n\n/** Read a CSS file from disk; surfaces unreadable paths as a clear input error. */\nexport function readCssPath(path: string): CssFile {\n try {\n return { id: path, css: readFileSync(path, 'utf8') };\n } catch (cause) {\n throw new Error(`resolver-css: cannot read CSS file \"${path}\"`, { cause });\n }\n}\n\n/**\n * Derive a deterministic fingerprint from the provider tag, engine version, and each file's id +\n * length. Cheap and good enough to bust downstream caches when the source CSS set changes.\n */\nexport function deriveFingerprint(provider: string, files: readonly CssFile[]): string {\n const parts = files.map((f) => `${f.id}:${f.css.length}`).sort();\n return `${provider}/${ENGINE_VERSION}::${parts.join('|')}`;\n}\n","import type selectorParser from 'postcss-selector-parser';\nimport { LEGACY_PSEUDO_ELEMENTS } from './constants';\nimport { sp } from './engine';\n\n/* ────────────────────────────────────────────────────────────────────────── *\n * Selector helpers\n * ────────────────────────────────────────────────────────────────────────── */\n\nexport interface Compound {\n /** The combinator immediately to this compound's LEFT (`null` for the first compound). */\n readonly leftCombinator: string | null;\n readonly nodes: readonly selectorParser.Node[];\n}\n\n/** Split a selector's flat node list into compounds delimited by combinator nodes. */\nexport function splitCompounds(selector: selectorParser.Selector): Compound[] {\n const compounds: Compound[] = [];\n let current: selectorParser.Node[] = [];\n let leftCombinator: string | null = null;\n for (const node of selector.nodes) {\n if (sp!.isCombinator(node)) {\n compounds.push({ leftCombinator, nodes: current });\n current = [];\n leftCombinator = combinatorValue(node);\n } else {\n current.push(node);\n }\n }\n compounds.push({ leftCombinator, nodes: current });\n return compounds;\n}\n\n/** A combinator's normalized value — descendant combinators are a single space. */\nfunction combinatorValue(node: selectorParser.Combinator): string {\n const v = node.value;\n return v.trim() === '' ? ' ' : v.trim();\n}\n\n/** The pseudo's lower-cased name including its leading colon(s), without any argument. */\nexport function pseudoName(node: selectorParser.Pseudo): string {\n return node.value.toLowerCase();\n}\n\nexport function isPseudoElement(node: selectorParser.Pseudo): boolean {\n return sp!.isPseudoElement(node) || LEGACY_PSEUDO_ELEMENTS.has(pseudoName(node));\n}\n\n/** Canonicalize a pseudo-element to the modern double-colon form (e.g. `:before` → `::before`). */\nexport function normalizePseudoElement(node: selectorParser.Pseudo): string {\n const name = pseudoName(node);\n return name.startsWith('::') ? name : `::${name.replace(/^:/, '')}`;\n}\n","import type {\n ConditionKey,\n CssProperty,\n EmitContext,\n EmitResult,\n ResolveInput,\n ResolveResult,\n SelectorUsage,\n StyleBlock,\n StyleCondition,\n StyleDecl,\n StyleMap,\n StyleOrigin,\n StyleResolver,\n} from '@domflax/core';\nimport { conditionKey, emptyStyleMap } from '@domflax/core';\nimport { normalizer } from '@domflax/pattern-kit';\nimport type selectorParser from 'postcss-selector-parser';\nimport {\n CSS_RESOLVER_ID,\n CSS_RESOLVER_PROVIDER,\n FUNCTIONAL_PSEUDOS,\n STRUCTURAL_PSEUDOS,\n} from './constants';\nimport { ensurePostcss, pc, sp } from './engine';\nimport { collectDecls, mediaContext } from './postcss-helpers';\nimport { deriveFingerprint, isPlainClassToken, readCssPath } from './misc-helpers';\nimport {\n isPseudoElement,\n normalizePseudoElement,\n pseudoName,\n splitCompounds,\n} from './selector-helpers';\nimport type {\n CssFile,\n CssResolverOptions,\n MutableUsage,\n RawDecl,\n ReverseEntry,\n RuleEntry,\n} from './types';\n\n/* ────────────────────────────────────────────────────────────────────────── *\n * CustomCSSResolver\n * ────────────────────────────────────────────────────────────────────────── */\n\n/**\n * Resolves plain CSS classes against a fixed set of project stylesheets parsed with postcss.\n */\nexport class CustomCSSResolver implements StyleResolver {\n public readonly id: string = CSS_RESOLVER_ID;\n public readonly provider: string = CSS_RESOLVER_PROVIDER;\n public readonly fingerprint: string;\n\n readonly #files: readonly CssFile[];\n /** Forward map: class token → simple-`.class` rule contributions (source order). */\n readonly #classIndex = new Map<string, RuleEntry[]>();\n /** Selector-participation facts per class token. */\n readonly #usage = new Map<string, MutableUsage>();\n /** Every class referenced anywhere in the stylesheets (forward-resolvable or not). */\n readonly #known = new Set<string>();\n /** Distinct COMPLEX selectors (combinator or structural pseudo), sorted. */\n readonly #complex: readonly string[];\n\n #reverse: readonly ReverseEntry[] | null = null;\n\n public constructor(cssFiles: readonly CssFile[] = [], options: CssResolverOptions = {}) {\n ensurePostcss(options.projectRoot);\n const fromDisk = (options.files ?? []).map(readCssPath);\n this.#files = [...cssFiles, ...fromDisk];\n this.fingerprint = options.fingerprint ?? deriveFingerprint(this.provider, this.#files);\n\n const complex = new Set<string>();\n let order = 0;\n for (const file of this.#files) {\n order = this.#indexFile(file, order, complex);\n }\n this.#complex = [...complex].sort();\n }\n\n /** The stylesheets this resolver was constructed with (raw sources + any read from disk). */\n public get files(): readonly CssFile[] {\n return this.#files;\n }\n\n /** Owns any plain class token referenced by one of {@link files}. */\n public owns(token: string): boolean {\n return isPlainClassToken(token) && this.#known.has(token);\n }\n\n public resolve(input: ResolveInput): ResolveResult {\n const styles = this.#resolveTokens(input.classes, input.classes);\n const resolved: string[] = [];\n const unknown: string[] = [];\n for (const token of input.classes) {\n if (this.#classIndex.has(token)) resolved.push(token);\n else unknown.push(token);\n }\n return { styles, resolved, unknown, opaque: [], warnings: [] };\n }\n\n public emit(styles: StyleMap, ctx: EmitContext): EmitResult {\n const norm = ctx.normalizer ?? normalizer;\n const remaining = new Map<string, string>();\n for (const [ck, block] of norm.normalizeStyleMap(styles).blocks) {\n for (const [prop, decl] of block.decls) {\n remaining.set(`${ck} ${prop}`, String(decl.value));\n }\n }\n if (remaining.size === 0) return { classes: [], exact: true, warnings: [] };\n\n const classes: string[] = [];\n // Greedy set-cover: larger classes first so the emitted set stays minimal.\n for (const { token, keyed } of this.#reverseIndex()) {\n let matches = true;\n for (const [key, value] of keyed) {\n if (remaining.get(key) !== value) {\n matches = false;\n break;\n }\n }\n if (!matches) continue;\n classes.push(token);\n for (const key of keyed.keys()) remaining.delete(key);\n if (remaining.size === 0) break;\n }\n\n // Unmatched declarations are left as-is (no synthetic residual) — surfaced via `exact:false`.\n return { classes, exact: remaining.size === 0, warnings: [] };\n }\n\n /**\n * Return a CSS stylesheet defining the given class tokens, so a verifier can render a subtree with\n * the project's real styling applied. The source stylesheets ARE the definition, so we hand back\n * their concatenation verbatim (every relevant rule — including combinator/structural selectors —\n * is preserved). `classes` is accepted for interface parity but the full source is always returned.\n */\n public cssFor(_classes: readonly string[]): string {\n return this.#files.map((f) => f.css).join('\\n');\n }\n\n public selectorUsage(token: string): SelectorUsage {\n const u = this.#usage.get(token);\n if (!u) {\n return {\n asSubject: false,\n asAncestor: false,\n asCompound: false,\n asSibling: false,\n asHasArgument: false,\n asStructural: false,\n droppable: true,\n };\n }\n return {\n asSubject: u.asSubject,\n asAncestor: u.asAncestor,\n asCompound: u.asCompound,\n asSibling: u.asSibling,\n asHasArgument: u.asHasArgument,\n asStructural: u.asStructural,\n // Safe to drop/rename only when every reference is the lone subject of a bare `.x {}`.\n droppable: u.referenced && !u.loadBearing,\n };\n }\n\n /**\n * The distinct COMPLEX selectors found across all stylesheets — anything containing a combinator\n * (descendant / `>` / `+` / `~`) or a structural pseudo (`:nth-child`, `:first-child`, …). Feeds\n * domflax's CSS-selector-safety guard.\n */\n public complexSelectors(): readonly string[] {\n return this.#complex;\n }\n\n /* ─────────────────────────── internals ─────────────────────────── */\n\n /** Parse one stylesheet and fold its rules into the indexes. Returns the advanced order counter. */\n #indexFile(file: CssFile, startOrder: number, complex: Set<string>): number {\n let order = startOrder;\n let root;\n try {\n root = pc!(file.css, { from: file.id });\n } catch {\n // Malformed CSS contributes nothing (never throws — only clear input errors do).\n return order;\n }\n\n root.walkRules((rule) => {\n const media = mediaContext(rule);\n if (media.skip) return; // inside @keyframes / @font-face etc. — not class rules\n const decls = collectDecls(rule);\n\n let ast;\n try {\n ast = sp!().astSync(rule.selector);\n } catch {\n return;\n }\n\n for (const sel of ast.nodes) {\n const thisOrder = order;\n this.#analyzeSelector(sel as selectorParser.Selector, media.media, decls, thisOrder, complex);\n }\n order += 1;\n });\n\n return order;\n }\n\n /** Analyze one comma-segment selector: forward indexing, usage facts, complex detection. */\n #analyzeSelector(\n selector: selectorParser.Selector,\n media: string,\n decls: readonly RawDecl[],\n order: number,\n complex: Set<string>,\n ): void {\n const compounds = splitCompounds(selector);\n let hasCombinator = false;\n let hasStructural = false;\n\n compounds.forEach((compound, index) => {\n const isSubject = index === compounds.length - 1;\n const rightCombinator = index < compounds.length - 1 ? compounds[index + 1]!.leftCombinator : null;\n if (rightCombinator) hasCombinator = true;\n\n const classes = compound.nodes.filter((n) => sp!.isClassName(n));\n const otherSimple = compound.nodes.some(\n (n) =>\n sp!.isTag(n) ||\n sp!.isIdentifier(n) ||\n sp!.isAttribute(n) ||\n sp!.isUniversal(n) ||\n sp!.isNesting(n),\n );\n const pseudos = compound.nodes.filter((n) => sp!.isPseudo(n));\n const structuralPseudo = pseudos.some((p) => STRUCTURAL_PSEUDOS.has(pseudoName(p)));\n const functionalPseudo = pseudos.some((p) => FUNCTIONAL_PSEUDOS.has(pseudoName(p)));\n const statePseudos = pseudos.filter(\n (p) =>\n sp!.isPseudoClass(p) &&\n !STRUCTURAL_PSEUDOS.has(pseudoName(p)) &&\n !FUNCTIONAL_PSEUDOS.has(pseudoName(p)),\n );\n const elementPseudos = pseudos.filter((p) => isPseudoElement(p));\n const qualified = classes.length > 1 || otherSimple || functionalPseudo || statePseudos.length > 0;\n\n if (structuralPseudo) hasStructural = true;\n\n for (const cls of classes) {\n const token = cls.value;\n this.#known.add(token);\n const u = this.#getUsage(token);\n u.referenced = true;\n if (isSubject) u.asSubject = true;\n if (rightCombinator === ' ' || rightCombinator === '>') u.asAncestor = true;\n if (rightCombinator === '+' || rightCombinator === '~') u.asSibling = true;\n if (qualified) u.asCompound = true;\n if (structuralPseudo) u.asStructural = true;\n if (rightCombinator !== null || qualified || structuralPseudo || elementPseudos.length > 0) {\n u.loadBearing = true;\n }\n\n // Forward indexing: a single bare `.class` compound, optionally qualified by state\n // pseudo-classes and/or a pseudo-element, with NO other simple selector and NO\n // structural/functional pseudo and NO combinator on this compound's right edge.\n const forwardEligible =\n compounds.length === 1 &&\n classes.length === 1 &&\n !otherSimple &&\n !structuralPseudo &&\n !functionalPseudo &&\n elementPseudos.length <= 1;\n if (forwardEligible && decls.length > 0) {\n const condition: StyleCondition = {\n media,\n states: statePseudos.map(pseudoName).sort(),\n pseudoElement: elementPseudos.length === 1 ? normalizePseudoElement(elementPseudos[0]!) : '',\n };\n this.#addRuleEntry(token, { order, token, condition, decls });\n }\n }\n\n // Classes nested inside selector-argument pseudos (:has/:is/:where/:not) are references too.\n for (const p of pseudos) {\n const isHas = pseudoName(p) === ':has';\n p.walkClasses((inner) => {\n const token = inner.value;\n this.#known.add(token);\n const u = this.#getUsage(token);\n u.referenced = true;\n u.loadBearing = true;\n if (isHas) u.asHasArgument = true;\n });\n }\n });\n\n if (hasCombinator || hasStructural) {\n complex.add(selector.toString().trim());\n }\n }\n\n #addRuleEntry(token: string, entry: RuleEntry): void {\n const list = this.#classIndex.get(token);\n if (list) list.push(entry);\n else this.#classIndex.set(token, [entry]);\n }\n\n #getUsage(token: string): MutableUsage {\n let u = this.#usage.get(token);\n if (!u) {\n u = {\n referenced: false,\n asSubject: false,\n asAncestor: false,\n asCompound: false,\n asSibling: false,\n asHasArgument: false,\n asStructural: false,\n loadBearing: false,\n };\n this.#usage.set(token, u);\n }\n return u;\n }\n\n /**\n * Resolve a set of tokens into a normalized condition-keyed StyleMap. `tokenList` is the original\n * class list (for per-declaration `tokenIndex` provenance); `request` is the set being resolved.\n */\n #resolveTokens(request: readonly string[], tokenList: readonly string[]): StyleMap {\n const entries: RuleEntry[] = [];\n for (const token of new Set(request)) {\n const list = this.#classIndex.get(token);\n if (list) entries.push(...list);\n }\n if (entries.length === 0) return emptyStyleMap();\n\n // Equal-specificity single-class rules cascade by source order — later wins.\n entries.sort((a, b) => a.order - b.order);\n\n const acc = new Map<ConditionKey, { condition: StyleCondition; decls: Map<CssProperty, StyleDecl> }>();\n for (const entry of entries) {\n const key = conditionKey(entry.condition);\n let block = acc.get(key);\n if (!block) {\n block = { condition: entry.condition, decls: new Map() };\n acc.set(key, block);\n }\n const tokenIndex = tokenList.indexOf(entry.token);\n const origin: StyleOrigin = { kind: 'class', tokenIndex, className: entry.token };\n for (const [prop, value, important] of entry.decls) {\n for (const decl of normalizer.normalizeDeclaration(prop, value, important)) {\n block.decls.set(decl.property, { ...decl, origin });\n }\n }\n }\n\n const rawBlocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of acc) {\n if (block.decls.size === 0) continue;\n rawBlocks.set(key, { condition: block.condition, decls: block.decls });\n }\n if (rawBlocks.size === 0) return emptyStyleMap();\n return normalizer.normalizeStyleMap({ blocks: rawBlocks });\n }\n\n /** Build (once) the reverse index used by {@link emit}. */\n #reverseIndex(): readonly ReverseEntry[] {\n if (this.#reverse) return this.#reverse;\n const out: ReverseEntry[] = [];\n for (const token of this.#classIndex.keys()) {\n const styles = this.#resolveTokens([token], [token]);\n const keyed = new Map<string, string>();\n for (const [ck, block] of styles.blocks) {\n for (const [prop, decl] of block.decls) keyed.set(`${ck} ${prop}`, String(decl.value));\n }\n if (keyed.size > 0) out.push({ token, keyed });\n }\n // Larger declaration sets first → greedy minimal cover in `emit`.\n out.sort((a, b) => b.keyed.size - a.keyed.size);\n this.#reverse = out;\n return out;\n }\n}\n\n/* ────────────────────────────────────────────────────────────────────────── *\n * Factory\n * ────────────────────────────────────────────────────────────────────────── */\n\n/**\n * Construct a {@link CustomCSSResolver} from raw CSS sources and/or file paths.\n *\n * @param cssFiles raw stylesheets (`{ id, css }`) — pass `[]` when loading only from disk.\n * @param options optional disk paths (`files`) and/or an explicit `fingerprint`.\n */\nexport function createCssResolver(\n cssFiles: readonly CssFile[] = [],\n options?: CssResolverOptions,\n): StyleResolver {\n return new CustomCSSResolver(cssFiles, options);\n}\n","/**\n * domflax — public meta package.\n *\n * Re-exports the entire `@domflax/core` public API (types + reference runtime) and the built-in\n * `@domflax/patterns` library, then layers thin, framework-agnostic build adapters on top\n * (`vite()` / `webpack()`) plus a programmatic `createDomflax()` factory.\n *\n * Each adapter runs the SAME single-file engine as {@link createDomflax} (JSX/TSX frontend + lazy\n * Tailwind/CSS resolver → core pass manager → reverse-emit → JSX backend). The adapters are\n * structurally typed against their bundlers — they never hard-depend on `vite` or `webpack`.\n *\n * Future deps (intentionally NOT imported yet — they land in a later stage):\n * - `@domflax/frontend-html` — HTML / Astro-static frontend feeding the pipeline.\n * - `@domflax/backend-*` — additional surgical codegen backends.\n */\n\nimport { createPipeline } from '@domflax/core';\nimport type {\n EncodedSourceMap,\n Pattern,\n Pipeline,\n SafetyLevel,\n StyleResolver,\n} from '@domflax/core';\nimport { builtinPatterns } from '@domflax/patterns';\nimport { createTailwindResolver } from '@domflax/resolver-tailwind';\nimport { createCssResolver } from '@domflax/resolver-css';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { jsxKindOf, runJsxPipeline } from './pipeline-run';\n\n// ── Re-export the public surface ──────────────────────────────────────────────────────────────\nexport * from '@domflax/core';\nexport * from '@domflax/patterns';\n\n/* ────────────────────────────────────────────────────────────────────────── *\n * Options\n * ────────────────────────────────────────────────────────────────────────── */\n\n/** How class names resolve to computed styles. */\nexport type DomflaxProvider = 'auto' | 'tailwind' | 'custom';\n\n/** Public adapter/factory options (mirrors the documented `domflax({...})` surface). */\nexport interface DomflaxOptions {\n /** Resolution strategy. Defaults to `'auto'`. */\n readonly provider?: DomflaxProvider;\n /** Stylesheets to parse when `provider` is `'custom'`. */\n readonly cssFiles?: readonly string[];\n /** Preview changes without rewriting source. */\n readonly dryRun?: boolean;\n /** Optimization aggressiveness handed to the pass manager (0 lint … 3 aggressive). */\n readonly safety?: SafetyLevel;\n /** File globs/extensions the adapters should consider. Defaults to jsx/tsx/html. */\n readonly include?: readonly string[];\n}\n\n/** Fully-resolved options with defaults applied. */\nexport interface ResolvedDomflaxOptions {\n readonly provider: DomflaxProvider;\n readonly cssFiles: readonly string[];\n readonly dryRun: boolean;\n readonly safety: SafetyLevel;\n readonly include: readonly string[];\n}\n\nconst DEFAULT_INCLUDE: readonly string[] = ['.jsx', '.tsx', '.html'];\n\nfunction resolveOptions(options: DomflaxOptions): ResolvedDomflaxOptions {\n return {\n provider: options.provider ?? 'auto',\n cssFiles: options.cssFiles ?? [],\n dryRun: options.dryRun ?? false,\n safety: options.safety ?? 2,\n include: options.include ?? DEFAULT_INCLUDE,\n };\n}\n\n/** True when `id` is a file domflax knows how to transform. */\nfunction isSupported(id: string, include: readonly string[]): boolean {\n // Strip query suffixes bundlers append (e.g. `App.tsx?used`).\n const clean = id.split('?', 1)[0] ?? id;\n return include.some((ext) => clean.endsWith(ext));\n}\n\n/* ────────────────────────────────────────────────────────────────────────── *\n * Programmatic instance\n * ────────────────────────────────────────────────────────────────────────── */\n\n/** Result of a single-file transform. `map` is null until codegen lands. */\nexport interface DomflaxTransformResult {\n readonly code: string;\n readonly map: EncodedSourceMap | null;\n}\n\n/**\n * A configured domflax engine. Holds the wired core {@link Pipeline}, the passthrough\n * {@link StyleResolver}, and the built-in {@link Pattern} set, and exposes a single-file\n * `transform`.\n */\nexport interface Domflax {\n readonly options: ResolvedDomflaxOptions;\n readonly pipeline: Pipeline;\n readonly resolver: StyleResolver;\n readonly patterns: readonly Pattern[];\n /**\n * Transform one file (SYNCHRONOUS, fully static, never launches a browser). For `.jsx`/`.tsx` this\n * runs the full pipeline (parse → resolve → flatten[provably-safe only] → reverse-emit → print);\n * every other (or unsupported) file is returned unchanged. Only provably layout-neutral flattens are\n * applied — domflax never changes rendering.\n */\n transform(code: string, id: string): DomflaxTransformResult;\n}\n\n/**\n * Build a configured domflax engine.\n *\n * Wires a real single-file pipeline: the JSX/TSX frontend + a Tailwind resolver feed the core pass\n * manager (running {@link builtinPatterns}), whose output is reverse-emitted back to class tokens\n * and re-printed by the JSX backend. Non-jsx/tsx files pass through unchanged.\n */\n/**\n * Build the {@link StyleResolver} for the chosen provider. The heavy engine each resolver wraps\n * (Tailwind v3 / postcss) is loaded LAZILY — at the moment this factory runs — and resolved from the\n * CONSUMER'S project, NOT from domflax's (possibly bundled) location. Both engines are OPTIONAL peer\n * dependencies of the published `domflax`: a Tailwind-only user never triggers a postcss load, and a\n * custom-CSS-only user never triggers a Tailwind load, because only the selected branch constructs.\n */\nfunction createResolver(resolved: ResolvedDomflaxOptions): StyleResolver {\n if (resolved.provider === 'custom') {\n return createCssResolver([], { files: resolved.cssFiles });\n }\n // 'auto' and 'tailwind' both resolve against the project's Tailwind engine.\n return createTailwindResolver();\n}\n\nexport function createDomflax(options: DomflaxOptions = {}): Domflax {\n const resolved = resolveOptions(options);\n const pipeline = createPipeline();\n const patterns = builtinPatterns;\n\n // Construct the resolver lazily so neither optional engine (Tailwind / postcss) is loaded until a\n // file is actually transformed (and only the engine for the selected provider is ever loaded).\n let cachedResolver: StyleResolver | null = null;\n const getResolver = (): StyleResolver => (cachedResolver ??= createResolver(resolved));\n\n return {\n options: resolved,\n pipeline,\n get resolver(): StyleResolver {\n return getResolver();\n },\n patterns,\n transform(code: string, id: string): DomflaxTransformResult {\n if (!isSupported(id, resolved.include)) return { code, map: null };\n const kind = jsxKindOf(id);\n // Non-jsx/tsx supported files (e.g. .html) stay passthrough — no HTML frontend wired yet.\n if (kind === null) return { code, map: null };\n const out = runJsxPipeline(code, id, kind, getResolver(), patterns, resolved.safety);\n return { code: out, map: null };\n },\n };\n}\n\n/* ────────────────────────────────────────────────────────────────────────── *\n * Build adapters (framework-agnostic, structurally-typed shapes)\n * ────────────────────────────────────────────────────────────────────────── */\n\n/**\n * Minimal Vite-plugin shape. Declared locally so this adapter does NOT depend on `vite`'s types\n * (an optional, type-only peer). Structurally compatible with Vite's `Plugin` for the hooks domflax\n * uses: `enforce: 'pre'` runs domflax before Vite's JSX→`createElement` transform, and `transform`\n * is Vite's per-file source hook. Returning `null` is Vite's \"no change\" signal.\n */\nexport interface DomflaxVitePlugin {\n readonly name: string;\n readonly enforce: 'pre';\n /** Vite's per-file source hook. Fully synchronous and browser-free. */\n transform(code: string, id: string): DomflaxTransformResult | null;\n}\n\n/**\n * Vite adapter. Returns a real Vite `Plugin` (`enforce: 'pre'`) whose `transform` runs the domflax\n * engine on `.jsx`/`.tsx` modules — strips any bundler query suffix (e.g. `App.tsx?used`) before\n * matching, returns `{ code, map }` when the source changed, and `null` (Vite's unchanged signal)\n * for unchanged sources and for any non-jsx/tsx module.\n *\n * @example\n * ```js\n * // vite.config.js\n * import domflax from 'domflax';\n * export default { plugins: [domflax.vite({ provider: 'tailwind' })] };\n * ```\n */\nexport function vite(options: DomflaxOptions = {}): DomflaxVitePlugin {\n const engine = createDomflax(options);\n return {\n name: 'domflax',\n enforce: 'pre',\n transform(code: string, id: string): DomflaxTransformResult | null {\n if (!isSupported(id, engine.options.include)) return null;\n const out = engine.transform(code, id);\n // Signal \"no change\" to Vite when the source round-tripped unchanged.\n return out.code === code ? null : out;\n },\n };\n}\n\n/* ── webpack / Next.js ──────────────────────────────────────────────────────────────────────── */\n\n/** A `module.rule` `use` entry: an absolute loader path plus the options forwarded to it. */\ninterface DomflaxRuleUse {\n readonly loader: string;\n readonly options: DomflaxOptions;\n}\n\n/** The slice of a webpack `module.rule` domflax appends. */\ninterface DomflaxModuleRule {\n readonly test: RegExp;\n readonly enforce: 'pre';\n readonly exclude: RegExp;\n readonly use: readonly DomflaxRuleUse[];\n}\n\n/** Anything carrying a `module.rules` array — both a webpack `Compiler.options` and Next's bare config. */\ninterface DomflaxWebpackModuleHost {\n module?: { rules?: unknown[] };\n}\n\n/**\n * Minimal webpack-compiler shape. Declared locally so this adapter does NOT depend on `webpack`'s\n * types. domflax only needs to push a rule onto the host's `module.rules`.\n *\n * `apply` accepts BOTH shapes: a real webpack `Compiler` (rules live under `compiler.options.module`)\n * AND the bare `config` object Next.js hands you from `webpack(config)` (rules live directly under\n * `config.module`). It duck-types `compiler.options ?? compiler` to find the right host.\n */\nexport interface DomflaxWebpackCompiler extends DomflaxWebpackModuleHost {\n options?: DomflaxWebpackModuleHost;\n}\n\n/**\n * Minimal webpack-plugin shape. `apply(compiler)` is the webpack plugin entry point.\n */\nexport interface DomflaxWebpackPlugin {\n readonly name: string;\n apply(compiler: DomflaxWebpackCompiler): void;\n}\n\n/** `.jsx`/`.tsx` modules only (combinator-free with the JSX frontend; `.js`/`.ts` are skipped). */\nconst WEBPACK_JSX_TEST = /\\.[jt]sx$/;\n\n/**\n * Absolute path to the bundled webpack loader (`./webpack-loader`). Resolved lazily against THIS\n * module's location so it works whether `domflax` is loaded as ESM (`dist/index.js`) or CJS\n * (`dist/index.cjs`) — both sit beside `dist/webpack-loader.cjs`. webpack requires loaders via\n * CommonJS, so we always point at the `.cjs` output.\n */\nfunction webpackLoaderPath(): string {\n const here = dirname(fileURLToPath(import.meta.url));\n return join(here, 'webpack-loader.cjs');\n}\n\n/**\n * webpack adapter (also the Next.js path). Returns a plugin whose `apply(compiler)` injects a\n * pre-enforced `module.rule` that invokes the domflax {@link ./webpack-loader loader} on every\n * `.jsx`/`.tsx` module. The loader runs the SAME lazy engine as {@link createDomflax} (no eager\n * Tailwind/postcss load).\n *\n * Next.js wiring (`next.config.js`) — Next exposes the underlying webpack config via `webpack(config)`:\n * ```js\n * // next.config.js\n * const domflax = require('domflax');\n * module.exports = {\n * webpack(config) {\n * domflax.webpack({ provider: 'tailwind' }).apply(config);\n * return config;\n * },\n * };\n * ```\n * `apply(compiler)` is intentionally duck-typed on `compiler.options.module.rules`, so it accepts\n * both a real webpack `Compiler` and the bare `config` object Next.js hands you.\n *\n * Caveat: this targets the webpack builder only. **Turbopack is not yet supported** — it does not\n * accept arbitrary webpack loaders, so the `next.config.js` wiring above is a no-op under\n * `next dev --turbopack`. Run domflax through the webpack builder until Turbopack exposes a loader API.\n */\nexport function webpack(options: DomflaxOptions = {}): DomflaxWebpackPlugin {\n // Validate options eagerly (parity with the other adapters); the resolver stays lazy.\n createDomflax(options);\n return {\n name: 'domflax',\n apply(compiler: DomflaxWebpackCompiler): void {\n // Real webpack passes a `Compiler` (rules under `.options.module`); Next's `webpack(config)`\n // passes the bare config (rules under `.module`). Duck-type to the right host.\n const host: DomflaxWebpackModuleHost = compiler.options ?? compiler;\n const mod = (host.module ??= {});\n const rules = (mod.rules ??= []);\n const rule: DomflaxModuleRule = {\n test: WEBPACK_JSX_TEST,\n enforce: 'pre',\n exclude: /node_modules/,\n use: [{ loader: webpackLoaderPath(), options }],\n };\n rules.push(rule);\n },\n };\n}\n\n/**\n * The default-export namespace. Exposes the build adapters and the programmatic factory as an OBJECT\n * so the documented `import domflax from 'domflax'; domflax.vite()` / `domflax.webpack()` works (and a\n * CommonJS `const domflax = require('domflax'); domflax.vite()` too). The named exports\n * (`createDomflax`, `vite`, `webpack`, …) remain available for direct import.\n */\nexport interface DomflaxDefault {\n createDomflax(options?: DomflaxOptions): Domflax;\n vite(options?: DomflaxOptions): DomflaxVitePlugin;\n webpack(options?: DomflaxOptions): DomflaxWebpackPlugin;\n}\n\n/** Default export: an object exposing `vite`, `webpack`, and the programmatic `createDomflax`. */\nconst domflax: DomflaxDefault = { createDomflax, vite, webpack };\nexport default domflax;\n","/**\n * @domflax/frontend-jsx — AST interop, constants, and pure classification helpers.\n *\n * Stateless building blocks shared by the JSX parse pass: the `@babel/traverse`\n * default-export normalization, the frontend's fixed constants, and the pure\n * name/classification/JSX-discovery helpers (no closure state, no document mutation).\n */\n\nimport babelTraverse from '@babel/traverse';\nimport type {\n JSXAttribute,\n JSXElement,\n JSXFragment,\n JSXIdentifier,\n JSXMemberExpression,\n JSXNamespacedName,\n Node as BabelNode,\n} from '@babel/types';\n\nimport type { ClassListForm, ExprKind, FileKind, SourceFileId } from '@domflax/core';\n\n/* ───────────────────────── @babel/traverse interop ───────────────────────── */\n\n// `@babel/traverse` is published as CJS (`module.exports = traverse; exports.default = traverse`).\n// Under an ESM default import the value may be the function OR `{ default: fn }` depending on the\n// interop layer (Node ESM vs. esbuild vs. tsup), so normalize defensively.\nexport const traverse = (\n typeof babelTraverse === 'function'\n ? babelTraverse\n : (babelTraverse as unknown as { default: typeof babelTraverse }).default\n) as typeof babelTraverse;\n\n/** Languages this frontend claims. JSX/TSX only; HTML is owned by a sibling frontend. */\nexport const JSX_LANGS: readonly FileKind[] = ['jsx', 'tsx'];\n\n/** The single registered source file id (one parse == one module). */\nexport const FILE_ID = 1 as SourceFileId;\n\n/** Marker payload stored for every interned expression so the backend can re-print it. */\nexport interface ExprPayload {\n readonly text: string;\n readonly spread: boolean;\n}\n\n/* ───────────────────────── name + classification helpers ───────────────────────── */\n\nexport type JSXName = JSXIdentifier | JSXMemberExpression | JSXNamespacedName;\n\nexport function jsxName(node: JSXName): string {\n switch (node.type) {\n case 'JSXIdentifier':\n return node.name;\n case 'JSXMemberExpression':\n return `${jsxName(node.object)}.${node.property.name}`;\n case 'JSXNamespacedName':\n return `${node.namespace.name}:${node.name.name}`;\n }\n}\n\n/** Component vs. intrinsic: capitalized identifier or member expression ⇒ component. */\nexport function isComponentName(node: JSXName): boolean {\n if (node.type === 'JSXMemberExpression') return true;\n if (node.type === 'JSXNamespacedName') return false;\n return /^[A-Z]/.test(node.name);\n}\n\nexport function attrName(name: JSXAttribute['name']): string {\n return name.type === 'JSXNamespacedName'\n ? `${name.namespace.name}:${name.name.name}`\n : name.name;\n}\n\nexport function exprKind(node: BabelNode): ExprKind {\n switch (node.type) {\n case 'CallExpression':\n case 'OptionalCallExpression':\n return 'call';\n case 'MemberExpression':\n case 'OptionalMemberExpression':\n return 'member';\n case 'ConditionalExpression':\n case 'LogicalExpression':\n return 'conditional';\n case 'TemplateLiteral':\n case 'TaggedTemplateExpression':\n return 'template';\n case 'Identifier':\n return 'identifier';\n case 'SpreadElement':\n return 'spread';\n default:\n return 'other';\n }\n}\n\n/** Map a dynamic className expression to the closest {@link ClassListForm}. */\nexport function classFormOf(node: BabelNode): ClassListForm {\n switch (node.type) {\n case 'TemplateLiteral':\n case 'TaggedTemplateExpression':\n return 'template-literal';\n case 'CallExpression':\n case 'OptionalCallExpression':\n return 'call';\n case 'ConditionalExpression':\n case 'LogicalExpression':\n return 'conditional';\n case 'MemberExpression':\n case 'OptionalMemberExpression':\n case 'Identifier':\n return 'member';\n default:\n return 'call';\n }\n}\n\n/**\n * Find the OUTERMOST JSXElement/JSXFragment nodes that a dynamic expression renders, so the frontend\n * can lower JSX nested inside `{…}` holes — `.map`/`.filter`/`.forEach((x) => <jsx/>)` callbacks,\n * `&&`/`||` logical expressions, ternaries, and parenthesized/cast wrappers — into REAL IR element\n * nodes. The dynamic scaffolding around them (the call itself, the conditions, `{expr}` holes) stays\n * opaque; only the renderable JSX is surfaced so the pass manager descends into and optimizes it.\n *\n * Only the outermost JSX is collected: `buildElement`/`buildFragment` recurse into the\n * descendants themselves, so we must NOT descend past a JSX boundary here (that would double-register\n * inner elements).\n */\nexport function findNestedJsxRoots(root: BabelNode): (JSXElement | JSXFragment)[] {\n const out: (JSXElement | JSXFragment)[] = [];\n const seen = new Set<BabelNode>();\n\n const visit = (n: BabelNode | null | undefined): void => {\n if (!n || seen.has(n)) return;\n seen.add(n);\n switch (n.type) {\n case 'JSXElement':\n case 'JSXFragment':\n out.push(n); // outermost renderable JSX — buildElement/buildFragment recurse from here\n return;\n case 'ParenthesizedExpression':\n case 'TSNonNullExpression':\n case 'TSAsExpression':\n case 'TSSatisfiesExpression':\n case 'TSTypeAssertion':\n visit(n.expression);\n return;\n case 'LogicalExpression':\n visit(n.left);\n visit(n.right);\n return;\n case 'ConditionalExpression':\n visit(n.consequent);\n visit(n.alternate);\n return;\n case 'SequenceExpression':\n for (const e of n.expressions) visit(e);\n return;\n case 'CallExpression':\n case 'OptionalCallExpression':\n // `.map`/`.filter`/`.forEach(cb)` etc. — descend into the call arguments (the callbacks),\n // never the callee (that is the `items.map` member access, which renders nothing).\n for (const a of n.arguments) visit(a as BabelNode);\n return;\n case 'ArrowFunctionExpression':\n case 'FunctionExpression':\n visit(n.body);\n return;\n case 'BlockStatement':\n for (const s of n.body) visit(s);\n return;\n case 'ReturnStatement':\n visit(n.argument);\n return;\n case 'IfStatement':\n visit(n.consequent);\n visit(n.alternate);\n return;\n case 'ArrayExpression':\n for (const el of n.elements) visit(el as BabelNode);\n return;\n default:\n return;\n }\n };\n\n visit(root);\n return out;\n}\n\nexport function looksLikeJsx(id: string, code: string): boolean {\n if (/\\.[jt]sx$/i.test(id)) return true;\n return /<\\/?[A-Za-z][\\w.-]*|<>/.test(code);\n}\n","/**\n * @domflax/frontend-jsx — the JSX/TSX → IR parse pass.\n *\n * Walks a Babel AST (`@babel/parser` → `@babel/traverse`) and lowers JSXElement /\n * JSXFragment / JSXText / JSXExpressionContainer / JSXSpreadChild nodes into the\n * `@domflax/core` IR. ALL dynamic JavaScript stays out of the structural IR: every\n * expression container, spread, and dynamic className/child is interned into the\n * document's {@link ExprRegistry} as an opaque {@link ExprRef} (with its verbatim source\n * slice as payload), and only its source span survives in the tree.\n *\n * Static `class`/`className` literals are split into {@link ClassToken}s on a static\n * {@link ClassSegment}; a non-string-literal className becomes a single dynamic segment\n * (opaque, never optimized). Static classes are resolved through the supplied\n * {@link StyleResolver} + {@link StyleNormalizer} into `element.computed` so downstream\n * patterns can match on resolved style.\n *\n * NodeMeta opacity barriers populated here: hasRef (`ref=`), hasEventHandlers (`on*=`),\n * hasKey (`key=`), hasSpreadAttrs (`{...x}`), hasDangerousHtml\n * (`dangerouslySetInnerHTML=`), hasDynamicChildren (any expression / spread child),\n * isComponent (capitalized / member tag). \"hasDynamicClasses\" is carried on the\n * {@link ClassList} itself (`hasDynamic` / `opaque`), not on NodeMeta.\n */\n\nimport { parse as babelParse } from '@babel/parser';\nimport type { NodePath } from '@babel/traverse';\nimport type {\n Expression,\n JSXAttribute,\n JSXElement,\n JSXEmptyExpression,\n JSXFragment,\n JSXOpeningElement,\n Node as BabelNode,\n} from '@babel/types';\n\nimport type {\n AttrMap,\n AttrValue,\n ClassList,\n ClassSegment,\n ClassToken,\n Diagnostic,\n ExprRef,\n FrontendParseContext,\n IRDocument,\n IRElement,\n IRFragment,\n IRNamespace,\n IRNodeId,\n MutableBackrefTable,\n NodeMeta,\n ParseResult,\n SourceFile,\n SourceSpan,\n StyleMap,\n} from '@domflax/core';\nimport {\n createDocument,\n createElement,\n createExpr,\n createFragment,\n createText,\n defaultMeta,\n emptyClassList,\n emptyStyleMap,\n} from '@domflax/core';\n\nimport type { ExprPayload } from './frontend-ast';\nimport {\n FILE_ID,\n attrName,\n classFormOf,\n exprKind,\n findNestedJsxRoots,\n isComponentName,\n jsxName,\n traverse,\n} from './frontend-ast';\n\nexport function doParse(code: string, ctx: FrontendParseContext): ParseResult {\n const diagnostics: Diagnostic[] = [];\n const doc: IRDocument = createDocument('jsx');\n const backref = doc.backref as MutableBackrefTable;\n\n const ast = babelParse(code, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript'],\n });\n\n const eol: '\\n' | '\\r\\n' = code.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const sourceFile: SourceFile = {\n id: FILE_ID,\n path: ctx.id,\n text: code,\n frontend: 'jsx',\n eol,\n indentUnit: ' ',\n native: ast,\n };\n doc.sources.set(FILE_ID, sourceFile);\n\n /* ----- span helpers (close over `code`) ----- */\n\n const spanOf = (node: BabelNode): SourceSpan | null => {\n if (node.start == null || node.end == null) return null;\n const span: SourceSpan = {\n file: FILE_ID,\n start: node.start,\n end: node.end,\n startLoc: node.loc\n ? { line: node.loc.start.line, column: node.loc.start.column }\n : undefined,\n endLoc: node.loc ? { line: node.loc.end.line, column: node.loc.end.column } : undefined,\n };\n return span;\n };\n\n const sliceOf = (node: BabelNode): string =>\n node.start == null || node.end == null ? '' : code.slice(node.start, node.end);\n\n /** Intern an expression as an opaque ExprRef, recording its verbatim source slice. */\n const internExpr = (node: Expression | JSXEmptyExpression, spread: boolean): ExprRef => {\n const payload: ExprPayload = { text: sliceOf(node), spread };\n return doc.exprs.intern({\n span: spanOf(node) ?? { file: FILE_ID, start: 0, end: 0 },\n kind: exprKind(node),\n payload,\n });\n };\n\n /* ----- class list ----- */\n\n const splitTokens = (raw: string): ClassToken[] =>\n raw\n .split(/\\s+/)\n .filter((t) => t.length > 0)\n .map((value) => ({ value }) as ClassToken);\n\n const buildClassList = (attr: JSXAttribute): ClassList => {\n const attrSpan = spanOf(attr) ?? undefined;\n const v = attr.value;\n\n const staticList = (tokens: ClassToken[], valueSpan: SourceSpan | null): ClassList => {\n const seg: ClassSegment = { kind: 'static', span: valueSpan ?? undefined, tokens };\n return {\n form: 'string-literal',\n segments: [seg],\n valueSpan,\n attrSpan,\n hasDynamic: false,\n opaque: false,\n rewritable: true,\n };\n };\n\n if (v == null) return staticList([], null);\n\n if (v.type === 'StringLiteral') {\n return staticList(splitTokens(v.value), spanOf(v));\n }\n\n if (v.type === 'JSXExpressionContainer') {\n const expr = v.expression;\n // `className={\"a b\"}` is still a static string literal.\n if (expr.type === 'StringLiteral') {\n return staticList(splitTokens(expr.value), spanOf(expr));\n }\n if (expr.type === 'JSXEmptyExpression') return staticList([], null);\n const ref = internExpr(expr, false);\n const valueSpan = spanOf(expr);\n const seg: ClassSegment = { kind: 'dynamic', span: valueSpan ?? undefined, expr: ref };\n return {\n form: classFormOf(expr),\n segments: [seg],\n valueSpan,\n attrSpan,\n hasDynamic: true,\n opaque: true,\n rewritable: false,\n };\n }\n\n return emptyClassList();\n };\n\n const staticTokensOf = (classes: ClassList): string[] => {\n const out: string[] = [];\n for (const seg of classes.segments) {\n if (seg.kind === 'static') for (const t of seg.tokens) out.push(t.value);\n }\n return out;\n };\n\n /* ----- attribute value ----- */\n\n const buildAttrValue = (attr: JSXAttribute): AttrValue => {\n const v = attr.value;\n if (v == null) return { kind: 'static', value: true, span: spanOf(attr) ?? undefined };\n if (v.type === 'StringLiteral') {\n return { kind: 'static', value: v.value, span: spanOf(v) ?? undefined };\n }\n if (v.type === 'JSXExpressionContainer') {\n if (v.expression.type === 'JSXEmptyExpression') {\n return { kind: 'static', value: true, span: spanOf(v) ?? undefined };\n }\n return { kind: 'dynamic', expr: internExpr(v.expression, false), span: spanOf(v) ?? undefined };\n }\n // JSXElement / JSXFragment used as an attribute value → opaque expression.\n return { kind: 'dynamic', expr: internExpr(v as Expression, false), span: spanOf(v) ?? undefined };\n };\n\n /* ----- node builders ----- */\n\n const buildNestedRoot = (jsx: JSXElement | JSXFragment, parentId: IRNodeId): IRNodeId =>\n jsx.type === 'JSXFragment' ? buildFragment(jsx, parentId) : buildElement(jsx, parentId);\n\n /** Lower a single JSX child, appending the resulting IR node id(s) onto `out`. */\n const appendChild = (\n node: JSXElement['children'][number],\n parentId: IRNodeId,\n out: IRNodeId[],\n ): void => {\n switch (node.type) {\n case 'JSXText': {\n const id = doc.alloc.next();\n doc.nodes.set(\n id,\n createText(id, node.value, {\n parent: parentId,\n span: spanOf(node),\n collapsible: /^\\s*$/.test(node.value),\n }),\n );\n out.push(id);\n return;\n }\n case 'JSXExpressionContainer': {\n const expr = node.expression;\n if (expr.type === 'JSXEmptyExpression') return; // `{/* comment */}`\n // A container whose WHOLE expression is a JSX node (`{<X/>}`) renders that node directly —\n // lower it as a real element so passes can optimize it (no opaque wrapper needed).\n if (expr.type === 'JSXElement' || expr.type === 'JSXFragment') {\n out.push(buildNestedRoot(expr, parentId));\n return;\n }\n // Otherwise the expression itself stays OPAQUE — the `.map`/condition/`{expr}` hole is\n // interned and preserved verbatim by the backend …\n const id = doc.alloc.next();\n const ref = internExpr(expr, false);\n doc.nodes.set(id, createExpr(id, ref, { parent: parentId, span: spanOf(node) }));\n out.push(id);\n // … but any JSX nested INSIDE it (map/filter callbacks, `&&`/`||`, ternary, parens) is\n // lowered to real element nodes (with their true source spans) so the pass manager descends\n // into and optimizes them too.\n for (const jsx of findNestedJsxRoots(expr)) out.push(buildNestedRoot(jsx, parentId));\n return;\n }\n case 'JSXSpreadChild': {\n const id = doc.alloc.next();\n const ref = internExpr(node.expression, true);\n doc.nodes.set(id, createExpr(id, ref, { parent: parentId, span: spanOf(node) }));\n out.push(id);\n for (const jsx of findNestedJsxRoots(node.expression)) {\n out.push(buildNestedRoot(jsx, parentId));\n }\n return;\n }\n case 'JSXElement':\n out.push(buildElement(node, parentId));\n return;\n case 'JSXFragment':\n out.push(buildFragment(node, parentId));\n return;\n default:\n return;\n }\n };\n\n const buildFragment = (node: JSXFragment, parentId: IRNodeId): IRNodeId => {\n const id = doc.alloc.next();\n const children: IRNodeId[] = [];\n for (const c of node.children) appendChild(c, id, children);\n doc.nodes.set(id, createFragment(id, { children, parent: parentId, span: spanOf(node) }));\n backref.set(id, {\n nodeId: id,\n span: spanOf(node) ?? { file: FILE_ID, start: 0, end: 0 },\n openTagSpan: spanOf(node.openingFragment),\n closeTagSpan: spanOf(node.closingFragment),\n innerSpan: null,\n selfClosing: false,\n });\n return id;\n };\n\n const buildElement = (node: JSXElement, parentId: IRNodeId): IRNodeId => {\n const id = doc.alloc.next();\n const opening: JSXOpeningElement = node.openingElement;\n const tag = jsxName(opening.name);\n const component = isComponentName(opening.name);\n\n const meta: NodeMeta = defaultMeta();\n meta.isComponent = component;\n\n let classes: ClassList = emptyClassList();\n const entries = new Map<string, AttrValue>();\n const order: string[] = [];\n const spreads: ExprRef[] = [];\n\n for (const attr of opening.attributes) {\n if (attr.type === 'JSXSpreadAttribute') {\n spreads.push(internExpr(attr.argument, true));\n meta.hasSpreadAttrs = true;\n continue;\n }\n const name = attrName(attr.name);\n if (name === 'className' || name === 'class') {\n classes = buildClassList(attr);\n continue;\n }\n if (name === 'ref') meta.hasRef = true;\n else if (name === 'key') meta.hasKey = true;\n else if (name === 'dangerouslySetInnerHTML') meta.hasDangerousHtml = true;\n else if (/^on[A-Z]/.test(name)) meta.hasEventHandlers = true;\n entries.set(name, buildAttrValue(attr));\n order.push(name);\n }\n\n const attrs: AttrMap = { entries, spreads, order };\n\n const children: IRNodeId[] = [];\n for (const c of node.children) appendChild(c, id, children);\n for (const cid of children) {\n const cn = doc.nodes.get(cid);\n if (cn && cn.kind === 'expr') {\n meta.hasDynamicChildren = true;\n break;\n }\n }\n\n // Resolve static classes (+ tag) into computed style via the injected resolver/normalizer.\n let computed: StyleMap = emptyStyleMap();\n if (!classes.hasDynamic) {\n const tokens = staticTokensOf(classes);\n if (tokens.length > 0) {\n const res = ctx.resolver.resolve({\n classes: tokens,\n element: { tagName: tag, namespace: component ? undefined : 'html' },\n });\n computed = ctx.normalizer.normalizeStyleMap(res.styles);\n for (const w of res.warnings) {\n diagnostics.push({\n code: 'DF_STYLE_CONFLICT_UNRESOLVED',\n severity: w.severity,\n message: w.message,\n nodeId: id,\n });\n }\n }\n }\n\n const namespace: IRNamespace = component ? 'component' : 'html';\n const el: IRElement = createElement(id, {\n tag,\n namespace,\n isComponent: component,\n selfClosing: opening.selfClosing,\n classes,\n computed,\n attrs,\n children,\n parent: parentId,\n span: spanOf(node),\n meta,\n });\n doc.nodes.set(id, el);\n\n const inner =\n children.length > 0\n ? spanOf(node.children[0]! as BabelNode) && spanOf(node.children.at(-1)! as BabelNode)\n ? {\n file: FILE_ID,\n start: spanOf(node.children[0]! as BabelNode)!.start,\n end: spanOf(node.children.at(-1)! as BabelNode)!.end,\n }\n : null\n : null;\n backref.set(id, {\n nodeId: id,\n span: spanOf(node) ?? { file: FILE_ID, start: 0, end: 0 },\n openTagSpan: spanOf(opening),\n closeTagSpan: node.closingElement ? spanOf(node.closingElement) : null,\n innerSpan: inner,\n selfClosing: opening.selfClosing,\n });\n return id;\n };\n\n /* ----- collect the outermost JSX islands and attach them to the root fragment ----- */\n\n const roots: (JSXElement | JSXFragment)[] = [];\n traverse(ast, {\n JSXElement(path: NodePath<JSXElement>) {\n roots.push(path.node);\n path.skip();\n },\n JSXFragment(path: NodePath<JSXFragment>) {\n roots.push(path.node);\n path.skip();\n },\n });\n\n const rootFrag = doc.nodes.get(doc.root) as IRFragment;\n for (const r of roots) {\n const id = r.type === 'JSXFragment' ? buildFragment(r, doc.root) : buildElement(r, doc.root);\n rootFrag.children.push(id);\n }\n\n return { doc, diagnostics };\n}\n","/**\n * @domflax/frontend-jsx — Babel JSX/TSX → IR frontend.\n *\n * Walks a Babel AST (`@babel/parser` → `@babel/traverse`) and lowers JSXElement /\n * JSXFragment / JSXText / JSXExpressionContainer / JSXSpreadChild nodes into the\n * `@domflax/core` IR. ALL dynamic JavaScript stays out of the structural IR: every\n * expression container, spread, and dynamic className/child is interned into the\n * document's {@link ExprRegistry} as an opaque {@link ExprRef} (with its verbatim source\n * slice as payload), and only its source span survives in the tree.\n *\n * Static `class`/`className` literals are split into {@link ClassToken}s on a static\n * {@link ClassSegment}; a non-string-literal className becomes a single dynamic segment\n * (opaque, never optimized). Static classes are resolved through the supplied\n * {@link StyleResolver} + {@link StyleNormalizer} into `element.computed` so downstream\n * patterns can match on resolved style.\n *\n * NodeMeta opacity barriers populated here: hasRef (`ref=`), hasEventHandlers (`on*=`),\n * hasKey (`key=`), hasSpreadAttrs (`{...x}`), hasDangerousHtml\n * (`dangerouslySetInnerHTML=`), hasDynamicChildren (any expression / spread child),\n * isComponent (capitalized / member tag). \"hasDynamicClasses\" is carried on the\n * {@link ClassList} itself (`hasDynamic` / `opaque`), not on NodeMeta.\n *\n * The pure AST/classification helpers live in `./frontend-ast`; the parse pass itself\n * lives in `./frontend-parse`. This module is the public assembly point.\n */\n\nimport type { Frontend, FrontendParseContext, ParseResult } from '@domflax/core';\n\nimport { JSX_LANGS, looksLikeJsx } from './frontend-ast';\nimport { doParse } from './frontend-parse';\n\nexport const jsxFrontend: Frontend = {\n name: 'babel-jsx',\n langs: JSX_LANGS,\n canParse(id: string, code: string): boolean {\n return looksLikeJsx(id, code);\n },\n parse(code: string, ctx: FrontendParseContext): ParseResult {\n return doParse(code, ctx);\n },\n};\n\n/** Factory mirror — returns a fresh handle to the (stateless) JSX frontend. */\nexport function createJsxFrontend(): Frontend {\n return jsxFrontend;\n}\n","/**\n * @domflax/frontend-jsx — IR → JSX/TSX backend (SURGICAL, full-module round-trip).\n *\n * The pass manager mutates a tree of JSX *islands* that were lowered from a complete module\n * (imports, `export default function`, hooks, `return (…)`, `{expr}` holes, comments, …). The\n * backend's job is to emit a COMPLETE, valid module — not just the JSX subtree. It does this by\n * starting from the element's ORIGINAL verbatim source (retained on {@link SourceFile.text}) and\n * applying ONLY the diffs the passes produced, via `magic-string`:\n *\n * • CLASS CHANGE — for every surviving element whose static class list differs from its source\n * text, overwrite just the `class`/`className` attribute VALUE span (quotes included) with the\n * new tokens. If the element gained classes but had no class attribute, insert one on the\n * opening tag.\n * • UNWRAP (flatten) — when a wrapper element/fragment was removed but its children survived,\n * delete ONLY the wrapper's open- and close-tag spans; the children (and their entire subtrees,\n * including dynamic `{expr}` holes and `key=`) are preserved verbatim.\n * • FULL REMOVAL — when a node was removed with no surviving descendant, delete its whole span.\n *\n * Every other byte — imports, exports, function declarations, returns, hooks, `{expr}` holes,\n * whitespace, comments, attribute ordering — is left exactly as authored. Output is\n * `magicString.toString()`: a complete module.\n *\n * Fallback: a document with no retained source (e.g. a hand-synthesized IR) cannot be spliced, so\n * it falls back to a clean structural re-print ({@link rePrint}).\n */\n\nimport MagicString from 'magic-string';\n\nimport type {\n AttrValue,\n Backend,\n BackendContext,\n Backref,\n ClassList,\n CodegenResult,\n EditPlan,\n ExprRef,\n FileKind,\n IRDocument,\n IRElement,\n IRNode,\n IRNodeId,\n SourceFile,\n SourceSpan,\n} from '@domflax/core';\n\nconst JSX_LANGS: readonly FileKind[] = ['jsx', 'tsx'];\n\ninterface ExprPayload {\n readonly text: string;\n readonly spread: boolean;\n}\n\n/* ───────────────────────── shared expr/class helpers ───────────────────────── */\n\n/** Recover an interned expression's source text (payload first, span-slice fallback). */\nfunction exprText(doc: IRDocument, ref: ExprRef): ExprPayload {\n const rec = doc.exprs.get(ref);\n const payload = rec?.payload as Partial<ExprPayload> | undefined;\n if (payload && typeof payload.text === 'string') {\n return { text: payload.text, spread: payload.spread === true };\n }\n if (rec) {\n const sf = doc.sources.get(rec.span.file);\n if (sf) return { text: sf.text.slice(rec.span.start, rec.span.end), spread: false };\n }\n return { text: '', spread: false };\n}\n\n/** All static class tokens of a {@link ClassList}, in order. */\nfunction staticTokensOf(classes: ClassList): string[] {\n const out: string[] = [];\n for (const seg of classes.segments) {\n if (seg.kind === 'static') for (const t of seg.tokens) out.push(t.value);\n }\n return out;\n}\n\n/* ───────────────────────── surgical (magic-string) codegen ───────────────────────── */\n\n/** Pick the single retained source file this document was parsed from (if any). */\nfunction primarySource(doc: IRDocument): SourceFile | null {\n for (const sf of doc.sources.values()) {\n if (typeof sf.text === 'string' && sf.text.length > 0) return sf;\n }\n return null;\n}\n\n/** Collect every node reachable from the root of the (mutated) tree. */\nfunction collectKept(doc: IRDocument): IRNode[] {\n const out: IRNode[] = [];\n const seen = new Set<IRNodeId>();\n const visit = (id: IRNodeId): void => {\n if (seen.has(id)) return;\n seen.add(id);\n const n = doc.nodes.get(id);\n if (!n) return;\n out.push(n);\n if (n.kind === 'element' || n.kind === 'fragment') for (const c of n.children) visit(c);\n };\n visit(doc.root);\n return out;\n}\n\n/** Span `a` strictly contains span `b` (same file, b nested inside, not identical). */\nfunction strictlyContains(a: SourceSpan, b: SourceSpan): boolean {\n if (a.file !== b.file) return false;\n if (a.start <= b.start && b.end <= a.end) return !(a.start === b.start && a.end === b.end);\n return false;\n}\n\ninterface RemovedRegion {\n readonly backref: Backref;\n /** A surviving node nested inside this region ⇒ this was an UNWRAP (keep inner, drop tags). */\n readonly unwrapped: boolean;\n}\n\n/**\n * Apply the class-list diff for a single surviving element. Returns true if an edit was made.\n */\nfunction editClasses(ms: MagicString, doc: IRDocument, sf: SourceFile, el: IRElement): boolean {\n const classes = el.classes;\n // Wholly dynamic / opaque class lists are never rewritten by the passes — leave verbatim.\n if (classes.hasDynamic || classes.opaque) return false;\n\n const tokens = staticTokensOf(classes);\n const valueSpan = classes.valueSpan;\n\n if (valueSpan && valueSpan.file === sf.id) {\n const current = sf.text.slice(valueSpan.start, valueSpan.end);\n // Preserve the original quote style; default to double quotes when we can't detect one.\n const quote = current.startsWith(\"'\") ? \"'\" : '\"';\n const next = `${quote}${tokens.join(' ')}${quote}`;\n if (current !== next) {\n ms.overwrite(valueSpan.start, valueSpan.end, next);\n return true;\n }\n return false;\n }\n\n // No class attribute originally, but the passes added classes ⇒ insert one on the opening tag.\n if (tokens.length === 0) return false;\n if (el.isComponent) return false; // never synthesize className onto an opaque component\n const back = doc.backref.get(el.id);\n const openTag = back?.openTagSpan;\n if (!openTag || openTag.file !== sf.id) return false;\n // Insert immediately after the tag name: `<tag‸ …`.\n const insertAt = openTag.start + 1 + el.tag.length;\n ms.appendLeft(insertAt, ` className=\"${tokens.join(' ')}\"`);\n return true;\n}\n\n/**\n * Extract a `key=…` attribute (verbatim, e.g. `key={f.id}` or `key=\"row\"`) from an opening-tag's\n * source text, or null when the tag carries no key. Brace/quote-aware so `key={f.id}` with nested\n * braces is captured whole. Requires whitespace before `key` so `data-key=` / `aria-keyshortcuts=`\n * never false-match.\n */\nfunction extractKeyAttr(openTag: string): string | null {\n const m = /(^|\\s)key\\s*=\\s*/.exec(openTag);\n if (!m) return null;\n const keyStart = m.index + m[1].length;\n let i = m.index + m[0].length;\n const ch = openTag[i];\n if (ch === '{') {\n let depth = 0;\n for (; i < openTag.length; i += 1) {\n const c = openTag[i];\n if (c === '{') depth += 1;\n else if (c === '}') {\n depth -= 1;\n if (depth === 0) {\n i += 1;\n break;\n }\n }\n }\n } else if (ch === '\"' || ch === \"'\") {\n const q = ch;\n i += 1;\n for (; i < openTag.length; i += 1) {\n if (openTag[i] === q) {\n i += 1;\n break;\n }\n }\n } else {\n for (; i < openTag.length; i += 1) {\n if (/[\\s>/]/.test(openTag[i]!)) break;\n }\n }\n return openTag.slice(keyStart, i);\n}\n\n/**\n * KEY SAFETY: when an UNWRAPPED wrapper carried a React `key`, that key must not vanish with the\n * deleted tags. If the wrapper had exactly one surviving (maximal) element child and that child has\n * no key of its own, transfer the wrapper's `key=…` verbatim onto the survivor's opening tag.\n * Conservative: anything ambiguous (no surviving element child, multiple survivors, child already\n * keyed) is left untouched (the flatten pattern is expected to have refused such a case).\n */\nfunction transferKeyOnUnwrap(\n ms: MagicString,\n doc: IRDocument,\n sf: SourceFile,\n region: Backref,\n kept: readonly IRNode[],\n): void {\n const open = region.openTagSpan;\n if (!open || open.file !== sf.id) return;\n const keyAttr = extractKeyAttr(sf.text.slice(open.start, open.end));\n if (!keyAttr) return;\n\n const inside: IRElement[] = [];\n for (const n of kept) {\n if (n.kind !== 'element' || !n.span || n.span.file !== sf.id) continue;\n if (strictlyContains(region.span, n.span)) inside.push(n);\n }\n // Keep only the topmost survivors (not nested inside another survivor of this region).\n const maximal = inside.filter(\n (n) => !inside.some((o) => o !== n && o.span && n.span && strictlyContains(o.span, n.span)),\n );\n if (maximal.length !== 1) return;\n\n const child = maximal[0]!;\n const childOpen = doc.backref.get(child.id)?.openTagSpan;\n if (!childOpen || childOpen.file !== sf.id) return;\n if (extractKeyAttr(sf.text.slice(childOpen.start, childOpen.end))) return; // already keyed\n\n // Insert immediately after the child's tag name: `<tag‸ …`.\n ms.appendLeft(childOpen.start + 1 + child.tag.length, ` ${keyAttr}`);\n}\n\n/** Surgical full-module codegen. Returns null when the document has no retained source. */\nfunction surgicalPrint(doc: IRDocument): string | null {\n const sf = primarySource(doc);\n if (!sf) return null;\n\n const ms = new MagicString(sf.text);\n\n const kept = collectKept(doc);\n const keptSpans: SourceSpan[] = [];\n for (const n of kept) if (n.span && n.span.file === sf.id) keptSpans.push(n.span);\n\n // 1) Structural removals. A node present in the backref table but absent from the live node map\n // was removed by the passes. Classify each as an UNWRAP (a surviving node nests inside it) or\n // a FULL removal (nothing survived inside).\n const removed: RemovedRegion[] = [];\n for (const id of backrefIds(doc)) {\n if (doc.nodes.has(id)) continue; // still live\n const back = doc.backref.get(id);\n if (!back || back.span.file !== sf.id) continue;\n const unwrapped = keptSpans.some((k) => strictlyContains(back.span, k));\n removed.push({ backref: back, unwrapped });\n }\n\n // Skip any removed region nested inside a FULL-removal region (its bytes are already deleted by\n // the ancestor) — this keeps every delete disjoint, which magic-string requires.\n const fullRemovals = removed.filter((r) => !r.unwrapped).map((r) => r.backref.span);\n for (const r of removed) {\n const span = r.backref.span;\n const coveredByFull = fullRemovals.some((f) => f !== span && strictlyContains(f, span));\n if (coveredByFull) continue;\n\n if (r.unwrapped) {\n // KEY SAFETY: salvage a `key=…` off the wrapper onto its surviving child before deleting tags.\n transferKeyOnUnwrap(ms, doc, sf, r.backref, kept);\n // Delete only the wrapper's tags; keep its (surviving) inner content verbatim.\n const open = r.backref.openTagSpan;\n const close = r.backref.closeTagSpan;\n if (open && open.file === sf.id && open.end > open.start) ms.remove(open.start, open.end);\n if (close && close.file === sf.id && close.end > close.start) {\n ms.remove(close.start, close.end);\n }\n } else {\n ms.remove(span.start, span.end);\n }\n }\n\n // 2) Class-list diffs on every surviving element.\n for (const n of kept) {\n if (n.kind === 'element') editClasses(ms, doc, sf, n);\n }\n\n return ms.toString();\n}\n\n/** All ids the backref table knows about (every originally-parsed element / fragment). */\nfunction backrefIds(doc: IRDocument): IRNodeId[] {\n // The backref table is shared verbatim from parse time; collect ids by scanning original spans we\n // recorded for live + removed nodes. We don't have a public iterator, so reconstruct the universe\n // from the live nodes plus their (now-removed) original ancestry isn't possible directly — instead\n // ask the table for each id we can reach. The table exposes `get`; the set of candidate ids is the\n // contiguous allocation range [1, alloc.peek). Scanning that range is O(n) and dependency-free.\n const out: IRNodeId[] = [];\n const max = doc.alloc.peek as unknown as number;\n for (let i = 1; i < max; i += 1) {\n const id = i as IRNodeId;\n if (doc.backref.get(id)) out.push(id);\n }\n return out;\n}\n\n/* ───────────────────────── structural re-print (fallback) ───────────────────────── */\n\n/** Re-build the `className=…` attribute (or null when the element has no class list). */\nfunction classText(doc: IRDocument, classes: ClassList): string | null {\n if (classes.form === 'absent' || classes.segments.length === 0) return null;\n\n const dynamic = classes.segments.find((s) => s.kind === 'dynamic');\n if (dynamic && dynamic.kind === 'dynamic') {\n return `className={${exprText(doc, dynamic.expr).text}}`;\n }\n\n const tokens = staticTokensOf(classes);\n return `className=\"${tokens.join(' ')}\"`;\n}\n\nfunction attrText(doc: IRDocument, name: string, value: AttrValue): string {\n if (value.kind === 'static') {\n if (value.value === true) return name;\n if (value.value === false) return '';\n return `${name}=\"${String(value.value)}\"`;\n }\n return `${name}={${exprText(doc, value.expr).text}}`;\n}\n\nfunction printElement(doc: IRDocument, el: IRElement): string {\n const parts: string[] = [];\n\n const cls = classText(doc, el.classes);\n if (cls !== null) parts.push(cls);\n\n for (const name of el.attrs.order) {\n const v = el.attrs.entries.get(name);\n if (!v) continue;\n const text = attrText(doc, name, v);\n if (text.length > 0) parts.push(text);\n }\n\n for (const ref of el.attrs.spreads) parts.push(`{...${exprText(doc, ref).text}}`);\n\n const attrStr = parts.length > 0 ? ` ${parts.join(' ')}` : '';\n const tag = el.tag;\n\n if (el.children.length === 0) {\n return el.selfClosing ? `<${tag}${attrStr} />` : `<${tag}${attrStr}></${tag}>`;\n }\n\n const inner = el.children.map((c) => printNode(doc, c)).join('');\n return `<${tag}${attrStr}>${inner}</${tag}>`;\n}\n\nfunction printNode(doc: IRDocument, id: IRNodeId): string {\n const node = doc.nodes.get(id);\n if (!node) return '';\n switch (node.kind) {\n case 'text':\n return node.value;\n case 'comment':\n return `{/*${node.value}*/}`;\n case 'expr': {\n const { text, spread } = exprText(doc, node.expr);\n return spread ? `{...${text}}` : `{${text}}`;\n }\n case 'fragment':\n return `<>${node.children.map((c) => printNode(doc, c)).join('')}</>`;\n case 'element':\n return printElement(doc, node);\n }\n}\n\nfunction rePrint(doc: IRDocument): string {\n const root = doc.nodes.get(doc.root);\n if (!root || root.kind !== 'fragment') return printNode(doc, doc.root);\n return root.children.map((c) => printNode(doc, c)).join('');\n}\n\n/* ───────────────────────── public backend ───────────────────────── */\n\nfunction doPrint(doc: IRDocument): string {\n const surgical = surgicalPrint(doc);\n return surgical ?? rePrint(doc);\n}\n\nexport const jsxBackend: Backend = {\n name: 'babel-jsx',\n langs: JSX_LANGS,\n print(doc: IRDocument, _plan: EditPlan, _ctx: BackendContext): CodegenResult {\n const code = doPrint(doc);\n return { code, map: null, edits: [], diagnostics: [] };\n },\n};\n\n/** Factory mirror — returns a fresh handle to the (stateless) JSX backend. */\nexport function createJsxBackend(): Backend {\n return jsxBackend;\n}\n","/**\n * domflax — the single-file JSX/TSX pipeline runner (parse → resolve → flatten → reverse-emit →\n * print), split out of `index.ts` so the meta package's barrel + adapters stay focused.\n *\n * {@link runJsxPipeline} is SYNC and fully static (gate `'provably-safe'`): it never changes rendering\n * and never launches a browser.\n */\n\nimport {\n buildSelectorIndex,\n createSyntheticSink,\n runPasses,\n syncClassesFromComputed,\n} from '@domflax/core';\nimport type {\n ApplyContext,\n FileKind,\n FlattenGate,\n IRDocument,\n Pass,\n PassCategory,\n PassPhase,\n Pattern,\n SafetyLevel,\n StyleResolver,\n} from '@domflax/core';\nimport { createJsxBackend, createJsxFrontend } from '@domflax/frontend-jsx';\nimport { normalizer } from '@domflax/pattern-kit';\n\n/** `.tsx`/`.jsx` ⇒ the matching {@link FileKind}; anything else ⇒ null (no JSX frontend). */\nexport function jsxKindOf(id: string): FileKind | null {\n const clean = id.split('?', 1)[0] ?? id;\n if (clean.endsWith('.tsx')) return 'tsx';\n if (clean.endsWith('.jsx')) return 'jsx';\n return null;\n}\n\n/** First registered source's EOL, defaulting to `\\n`. */\nfunction eolOf(doc: IRDocument): '\\n' | '\\r\\n' {\n for (const src of doc.sources.values()) return src.eol;\n return '\\n';\n}\n\n/** Group the flat pattern list into one {@link Pass} per {@link PassPhase} (derived from category). */\nfunction buildPasses(patterns: readonly Pattern[]): Pass[] {\n const byPhase = new Map<PassPhase, Pattern[]>();\n for (const p of patterns) {\n const phase = (p.category.split('/', 1)[0] ?? 'flatten') as PassPhase;\n let bucket = byPhase.get(phase);\n if (!bucket) {\n bucket = [];\n byPhase.set(phase, bucket);\n }\n bucket.push(p);\n }\n const passes: Pass[] = [];\n for (const [phase, pats] of byPhase) {\n passes.push({ phase, category: `${phase}/builtin` as PassCategory, patterns: pats });\n }\n return passes;\n}\n\n/** The parsed, authorized doc + the apply context + grouped passes, shared by sync + async runs. */\ninterface PreparedRun {\n readonly doc: IRDocument;\n readonly ctx: ApplyContext;\n readonly passes: readonly Pass[];\n}\n\n/** PARSE (JSX → IR, resolving classes onto `computed`) + AUTHORIZE + build the apply context. */\nfunction preparePipeline(\n code: string,\n id: string,\n kind: FileKind,\n resolver: StyleResolver,\n patterns: readonly Pattern[],\n safety: SafetyLevel,\n gate: FlattenGate,\n): PreparedRun {\n const parsed = createJsxFrontend().parse(code, {\n id,\n kind,\n resolver,\n normalizer,\n config: {},\n onDiagnostic: () => {},\n });\n const doc = parsed.doc;\n\n // AUTHORIZE — the JSX frontend defaults every node's safety floor to 0. The orchestrator opens the\n // floor to the max; the configured ceiling + each pattern's opacity predicates are the real gate.\n for (const node of doc.nodes.values()) node.meta.safetyFloor = 3;\n\n const ctx: ApplyContext = {\n doc,\n safetyCeiling: safety,\n normalizer,\n // Real CSS-selector-safety index from the active resolver: a wrapper a combinator/structural\n // selector depends on is flagged so the flatten guards refuse to flatten it. Tailwind (no\n // complexSelectors) degrades to the null index — behaviour unchanged.\n selectors: buildSelectorIndex(doc, resolver),\n resolver,\n gate,\n };\n return { doc, ctx, passes: buildPasses(patterns) };\n}\n\n/** REVERSE-EMIT optimized computed styles back into class tokens, then PRINT IR → JSX/TSX text. */\nfunction finishPipeline(optimized: IRDocument, id: string, resolver: StyleResolver): string {\n syncClassesFromComputed(optimized, resolver, normalizer);\n const printed = createJsxBackend().print(\n optimized,\n { moduleId: id, ops: [], provenance: new Map() },\n {\n normalizer,\n resolver,\n sink: createSyntheticSink(),\n eol: eolOf(optimized),\n onDiagnostic: () => {},\n },\n );\n return printed.code;\n}\n\n/** SYNC full pipeline (gate `'provably-safe'` — never changes rendering, never launches a browser). */\nexport function runJsxPipeline(\n code: string,\n id: string,\n kind: FileKind,\n resolver: StyleResolver,\n patterns: readonly Pattern[],\n safety: SafetyLevel,\n): string {\n const { doc, ctx, passes } = preparePipeline(code, id, kind, resolver, patterns, safety, 'provably-safe');\n const { doc: optimized } = runPasses(doc, passes, ctx);\n return finishPipeline(optimized, id, resolver);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACKA,IAAM,mBAAmB,MACvB,OAAO,aAAa,cAChB,IAAI,IAAI,QAAQ,UAAU,EAAE,EAAE,OAC7B,SAAS,iBAAiB,SAAS,cAAc,QAAQ,YAAY,MAAM,WAC1E,SAAS,cAAc,MACvB,IAAI,IAAI,WAAW,SAAS,OAAO,EAAE;AAEtC,IAAM,gBAAgC,iCAAiB;;;ACgCvD,SAAS,kBAAkB,QAAQ,GAAgB;AACxD,MAAI,IAAI;AACR,SAAO;AAAA,IACL,OAAiB;AACf,YAAM,KAAK;AACX,WAAK;AACL,aAAO;AAAA,IACT;AAAA,IACA,IAAI,OAAiB;AACnB,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAGO,SAAS,mBAAmB,QAAQ,GAAiB;AAC1D,QAAM,MAAM,oBAAI,IAAyB;AACzC,MAAI,IAAI;AACR,SAAO;AAAA,IACL,IAAI,GAAoC;AACtC,aAAO,IAAI,IAAI,CAAC;AAAA,IAClB;AAAA,IACA,OAAO,KAAuC;AAC5C,YAAM,MAAM;AACZ,WAAK;AACL,UAAI,IAAI,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;AAC5B,aAAO;AAAA,IACT;AAAA,IACA,kBAAwB;AACtB,iBAAW,CAAC,GAAG,CAAC,KAAK,IAAK,KAAI,IAAI,GAAG,EAAE,GAAG,GAAG,SAAS,OAAU,CAAC;AAAA,IACnE;AAAA,EACF;AACF;AAOO,SAAS,qBAA0C;AACxD,QAAM,MAAM,oBAAI,IAAuB;AACvC,SAAO;AAAA,IACL,IAAI,IAAmC;AACrC,aAAO,IAAI,IAAI,EAAE;AAAA,IACnB;AAAA,IACA,KAAK,IAAiC;AACpC,aAAO,IAAI,IAAI,EAAE,GAAG,QAAQ;AAAA,IAC9B;AAAA,IACA,aAAa,IAAiC;AAC5C,aAAO,IAAI,IAAI,EAAE,GAAG,aAAa;AAAA,IACnC;AAAA,IACA,IAAI,IAAc,SAAwB;AACxC,UAAI,IAAI,IAAI,OAAO;AAAA,IACrB;AAAA,EACF;AACF;AAKO,SAAS,YAAY,cAA2B,GAAa;AAClE,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,kBAAkB;AAAA,IAClB,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,sBAAsB;AAAA,IACtB,4BAA4B;AAAA,IAC5B,oBAAoB;AAAA,IACpB,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,4BAA4B;AAAA,IAC5B,mBAAmB;AAAA,IACnB,8BAA8B;AAAA,IAC9B,0BAA0B;AAAA,IAC1B,qBAAqB;AAAA,IACrB,SAAS;AAAA,IACT,WAAW;AAAA,IACX;AAAA,EACF;AACF;AAGO,IAAM,iBAAiC,EAAE,OAAO,IAAI,QAAQ,CAAC,GAAG,eAAe,GAAG;AAGlF,SAAS,aAAa,GAAiC;AAC5D,QAAM,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG;AAC5C,SAAO,GAAG,EAAE,KAAK,IAAI,MAAM,IAAI,EAAE,aAAa;AAChD;AAEO,IAAM,qBAAmC,aAAa,cAAc;AAGpE,SAAS,gBAA0B;AACxC,SAAO,EAAE,QAAQ,oBAAI,IAA8B,EAAE;AACvD;AAGO,SAAS,iBAA4B;AAC1C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,CAAC;AAAA,IACX,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AACF;AAGO,SAAS,eAAwB;AACtC,SAAO,EAAE,SAAS,oBAAI,IAAI,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,EAAE;AACtD;AAGO,SAAS,mBAAgC;AAC9C,SAAO,EAAE,OAAO,oBAAI,IAAwB,GAA2B,SAAS,KAAK;AACvF;AAmBO,SAAS,cAAc,IAAc,MAA8B;AACxE,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,QAAQ,KAAK,UAAU;AAAA,IACvB,MAAM,KAAK,QAAQ;AAAA,IACnB,MAAM,KAAK,QAAQ,YAAY;AAAA,IAC/B,KAAK,KAAK;AAAA,IACV,WAAW,KAAK,aAAa;AAAA,IAC7B,aAAa,KAAK,eAAe;AAAA,IACjC,aAAa,KAAK,eAAe;AAAA,IACjC,SAAS,KAAK,WAAW,eAAe;AAAA,IACxC,aAAa,KAAK,eAAe,iBAAiB;AAAA,IAClD,UAAU,KAAK,YAAY,cAAc;AAAA,IACzC,OAAO,KAAK,SAAS,aAAa;AAAA,IAClC,UAAU,KAAK,YAAY,CAAC;AAAA,EAC9B;AACF;AAEO,SAAS,WACd,IACA,OACA,MACQ;AACR,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,QAAQ,MAAM,UAAU;AAAA,IACxB,MAAM,MAAM,QAAQ;AAAA,IACpB,MAAM,YAAY;AAAA,IAClB;AAAA,IACA,aAAa,MAAM,eAAe;AAAA,EACpC;AACF;AAEO,SAAS,WACd,IACA,MACA,MACQ;AACR,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,QAAQ,MAAM,UAAU;AAAA,IACxB,MAAM,MAAM,QAAQ;AAAA,IACpB,MAAM,YAAY;AAAA,IAClB;AAAA,EACF;AACF;AAEO,SAAS,eACd,IACA,MACY;AACZ,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,QAAQ,MAAM,UAAU;AAAA,IACxB,MAAM,MAAM,QAAQ;AAAA,IACpB,MAAM,YAAY;AAAA,IAClB,UAAU,MAAM,YAAY,CAAC;AAAA,EAC/B;AACF;AAEO,SAAS,cACd,IACA,OACA,MACW;AACX,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,QAAQ,MAAM,UAAU;AAAA,IACxB,MAAM,MAAM,QAAQ;AAAA,IACpB,MAAM,YAAY;AAAA,IAClB;AAAA,EACF;AACF;AAGO,SAAS,eAAe,UAAoC;AACjE,QAAM,QAAQ,kBAAkB;AAChC,QAAM,SAAS,MAAM,KAAK;AAC1B,QAAM,OAAO,eAAe,MAAM;AAClC,QAAM,QAAQ,oBAAI,IAAsB,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;AACxD,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,OAAO,mBAAmB;AAAA,IAC1B,SAAS,oBAAI,IAAI;AAAA,IACjB,SAAS,mBAAmB;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AACF;AAKO,SAAS,SAAS,MAAmC;AAC1D,SAAO,KAAK,SAAS,aAAa,KAAK,SAAS,aAAa,KAAK,WAAW,CAAC;AAChF;AAQO,SAAS,WAAW,KAAiB,IAAqC;AAC/E,QAAM,IAAI,IAAI,MAAM,IAAI,EAAE;AAC1B,SAAO,KAAK,EAAE,SAAS,YAAY,IAAI;AACzC;AAGO,SAAS,WAAW,KAA6B;AACtD,QAAM,MAAkB,CAAC;AACzB,QAAM,QAAQ,CAAC,OAAuB;AACpC,UAAM,IAAI,IAAI,MAAM,IAAI,EAAE;AAC1B,QAAI,CAAC,EAAG;AACR,QAAI,EAAE,SAAS,UAAW,KAAI,KAAK,EAAE;AACrC,eAAW,KAAK,SAAS,CAAC,EAAG,OAAM,CAAC;AAAA,EACtC;AACA,QAAM,IAAI,IAAI;AACd,SAAO;AACT;;;ACxPO,SAAS,cAAc,IAAwB;AACpD,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,WAAO,IAAI,KAAK;AAAA,MACd,WAAW,MAAM;AAAA,MACjB,OAAO,IAAI,IAA4B,MAAM,KAAK;AAAA,IACpD,CAAC;AAAA,EACH;AACA,SAAO,EAAE,OAAO;AAClB;AAEA,SAAS,UAAU,MAAsB;AACvC,QAAM,OAAO,EAAE,GAAG,KAAK,KAAK;AAC5B,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA,UAAU,CAAC,GAAG,KAAK,QAAQ;AAAA,QAC3B,UAAU,cAAc,KAAK,QAAQ;AAAA,MACvC;AAAA,IACF,KAAK;AACH,aAAO,EAAE,GAAG,MAAM,MAAM,UAAU,CAAC,GAAG,KAAK,QAAQ,EAAE;AAAA,IACvD;AACE,aAAO,EAAE,GAAG,MAAM,KAAK;AAAA,EAC3B;AACF;AAGO,SAAS,cAAc,KAA6B;AACzD,QAAM,QAAQ,oBAAI,IAAsB;AACxC,aAAW,CAAC,IAAI,CAAC,KAAK,IAAI,MAAO,OAAM,IAAI,IAAI,UAAU,CAAC,CAAC;AAC3D,SAAO;AAAA,IACL,MAAM,IAAI;AAAA,IACV;AAAA,IACA,OAAO,IAAI;AAAA,IACX,SAAS,IAAI;AAAA,IACb,SAAS,IAAI;AAAA,IACb,UAAU,IAAI;AAAA,IACd,OAAO,IAAI;AAAA,EACb;AACF;AAIO,SAAS,KACd,MACA,SACA,OACY;AACZ,SAAO,EAAE,MAAM,UAAU,QAAQ,SAAS,GAAG,MAAM;AACrD;AAEO,SAAS,kBAAkB,KAAiB,IAAiC;AAClF,QAAM,OAAO,IAAI,MAAM,IAAI,EAAE;AAC7B,MAAI,CAAC,QAAQ,KAAK,UAAU,KAAM,QAAO;AACzC,QAAM,SAAS,IAAI,MAAM,IAAI,KAAK,MAAM;AACxC,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,OAAO,SAAS,aAAa,OAAO,SAAS,WAAY,QAAO,OAAO;AAC3E,SAAO;AACT;AAOO,SAAS,YAAY,OAAiB,IAAoB;AAC/D,QAAM,IAAI,MAAM,IAAI,MAAM,IAAI,EAAE;AAChC,MAAI,GAAG;AACL,MAAE,KAAK,UAAU;AACjB,UAAM,QAAQ,IAAI,EAAE;AAAA,EACtB;AACF;AAEO,SAAS,cAAc,OAAiB,IAAoB;AACjE,QAAM,OAAO,MAAM,IAAI,MAAM,IAAI,EAAE;AACnC,MAAI,CAAC,KAAM;AACX,MAAI,KAAK,SAAS,aAAa,KAAK,SAAS,YAAY;AACvD,eAAW,SAAS,CAAC,GAAG,KAAK,QAAQ,EAAG,eAAc,OAAO,KAAK;AAAA,EACpE;AACA,QAAM,IAAI,MAAM,OAAO,EAAE;AACzB,QAAM,QAAQ,IAAI,EAAE;AACtB;AAEO,SAAS,QAAQ,IAAe,QAAkB,SAA6B;AACpF,SAAO,KAAK,6BAA6B,SAAS;AAAA,IAChD;AAAA,IACA,SAAS,GAAG,OAAO;AAAA,IACnB,UAAU;AAAA,EACZ,CAAC;AACH;AAEO,SAAS,cAAc,IAAgC;AAC5D,UAAQ,GAAG,IAAI;AAAA,IACb,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,GAAG;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AACH,aAAO,GAAG;AAAA,IACZ,KAAK;AACH,aAAO,GAAG;AAAA,IACZ,KAAK;AACH,aAAO,GAAG;AAAA,EACd;AACF;AAIA,SAAS,YAAY,KAAiE;AACpF,MAAI,CAAC,OAAO,IAAI,SAAS,EAAG,QAAO,EAAE,SAAS,oBAAI,IAAI,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,EAAE;AAChF,QAAM,UAAU,oBAAI,IAAuB;AAC3C,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,GAAG,CAAC,KAAK,KAAK;AACxB,YAAQ,IAAI,GAAG,EAAE,MAAM,UAAU,OAAO,EAAE,CAAC;AAC3C,UAAM,KAAK,CAAC;AAAA,EACd;AACA,SAAO,EAAE,SAAS,SAAS,CAAC,GAAG,MAAM;AACvC;AAGO,SAAS,YAAY,OAAiB,MAAgB,QAAmC;AAC9F,QAAM,EAAE,IAAI,IAAI;AAChB,MAAI,KAAK,SAAS,OAAO;AACvB,UAAM,WAAW,IAAI,MAAM,IAAI,KAAK,GAAG;AACvC,QAAI,SAAU,UAAS,SAAS;AAChC,WAAO,KAAK;AAAA,EACd;AAEA,QAAM,KAAK,IAAI,MAAM,KAAK;AAC1B,QAAM,QAAQ,IAAI,EAAE;AACpB,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK,WAAW;AACd,YAAMA,YAAuB,CAAC;AAC9B,YAAM,KAAK,cAAc,IAAI;AAAA,QAC3B,KAAK,KAAK;AAAA,QACV,WAAW,KAAK;AAAA,QAChB,aAAa,KAAK;AAAA,QAClB,OAAO,YAAY,KAAK,KAAK;AAAA,QAC7B;AAAA,QACA,MAAM,EAAE,GAAG,YAAY,GAAG,WAAW,KAAK;AAAA,MAC5C,CAAC;AACD,UAAI,KAAK,QAAS,IAAG,WAAW,cAAc,KAAK,OAAO;AAC1D,UAAI,MAAM,IAAI,IAAI,EAAE;AACpB,iBAAW,SAAS,KAAK,YAAY,CAAC,GAAG;AACvC,QAAAA,UAAS,KAAK,YAAY,OAAO,OAAO,EAAE,CAAC;AAAA,MAC7C;AACA,SAAG,WAAWA;AACd,aAAO;AAAA,IACT;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,IAAI,WAAW,IAAI,KAAK,OAAO,EAAE,OAAO,CAAC;AAC/C,QAAE,KAAK,YAAY;AACnB,UAAI,MAAM,IAAI,IAAI,CAAC;AACnB,aAAO;AAAA,IACT;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,IAAI,WAAW,IAAI,KAAK,MAAM,EAAE,OAAO,CAAC;AAC9C,QAAE,KAAK,YAAY;AACnB,UAAI,MAAM,IAAI,IAAI,CAAC;AACnB,aAAO;AAAA,IACT;AAAA,IACA,KAAK,WAAW;AACd,YAAM,IAAI,cAAc,IAAI,KAAK,OAAO,EAAE,OAAO,CAAC;AAClD,QAAE,KAAK,YAAY;AACnB,UAAI,MAAM,IAAI,IAAI,CAAC;AACnB,aAAO;AAAA,IACT;AAAA,IACA,KAAK,YAAY;AACf,YAAM,OAAO,eAAe,IAAI,EAAE,OAAO,CAAC;AAC1C,WAAK,KAAK,YAAY;AACtB,UAAI,MAAM,IAAI,IAAI,IAAI;AACtB,YAAMA,YAAuB,CAAC;AAC9B,iBAAW,SAAS,KAAK,SAAU,CAAAA,UAAS,KAAK,YAAY,OAAO,OAAO,EAAE,CAAC;AAC9E,WAAK,WAAWA;AAChB,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAAS,kBACd,OACA,MACA,QACU;AACV,SAAO,YAAY,OAAO,MAAM,MAAM;AACxC;AAIO,SAAS,YAAY,OAAiB,MAA0B;AACrE,MAAI,KAAK,UAAW,QAAO;AAC3B,QAAM,QAAQ,MAAM,IAAI,YAAY;AACpC,MAAI,OAAO;AACT,QAAI;AACF,aAAO,MAAM,YAAY,KAAK,QAAQ;AAAA,IACxC,QAAQ;AACN,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AACA,SAAO,KAAK;AACd;AAQO,SAAS,eACd,QACA,QACA,QACa;AAEb,QAAM,SAAS,IAAI,IAA8B,cAAc,MAAM,EAAE,MAAM;AAC7E,MAAI,WAAW;AAEf,aAAW,CAAC,KAAK,QAAQ,KAAK,OAAO,QAAQ;AAC3C,UAAM,WAAW,OAAO,IAAI,GAAG;AAC/B,QAAI,CAAC,UAAU;AACb,aAAO,IAAI,KAAK;AAAA,QACd,WAAW,SAAS;AAAA,QACpB,OAAO,IAAI,IAA4B,SAAS,KAAK;AAAA,MACvD,CAAC;AACD;AAAA,IACF;AACA,UAAM,QAAQ,IAAI,IAA4B,SAAS,KAAK;AAC5D,eAAW,CAAC,MAAM,OAAO,KAAK,SAAS,OAAO;AAC5C,YAAM,MAAM,MAAM,IAAI,IAAI;AAC1B,UAAI,OAAO,IAAI,UAAU,QAAQ,OAAO;AACtC,mBAAW;AACX,YAAI,WAAW,cAAe;AAAA,MAEhC;AACA,UAAI,WAAW,iBAAiB,IAAK;AACrC,YAAM,IAAI,MAAM,OAAO;AAAA,IACzB;AACA,WAAO,IAAI,KAAK,EAAE,WAAW,SAAS,WAAW,MAAM,CAAC;AAAA,EAC1D;AACA,SAAO,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS;AACrC;;;ACrQA,SAAS,SAAS,OAAiB,IAAe,UAAuC;AACvF,QAAM,WAAW,GAAG,OAAO;AAC3B,MAAI,WAAW,MAAM,SAAS;AAC5B,WAAO;AAAA,MACL;AAAA,MACA,OAAO,GAAG,EAAE,YAAY,QAAQ,oBAAoB,MAAM,OAAO;AAAA,MACjE,EAAE,QAAQ,UAAU,SAAS,GAAG,OAAO,SAAS,UAAU,QAAQ;AAAA,IACpE;AAAA,EACF;AACA,QAAM,OAAO,MAAM,IAAI,MAAM,IAAI,QAAQ;AACzC,MAAI,QAAQ,WAAW,KAAK,KAAK,aAAa;AAC5C,WAAO;AAAA,MACL;AAAA,MACA,OAAO,GAAG,EAAE,YAAY,QAAQ,iBAAiB,QAAQ,UAAU,KAAK,KAAK,WAAW;AAAA,MACxF,EAAE,QAAQ,UAAU,SAAS,GAAG,OAAO,SAAS,UAAU,QAAQ;AAAA,IACpE;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,SAAS,OAAiB,IAA6B;AAC9D,QAAM,EAAE,IAAI,IAAI;AAEhB,QAAM,UAAU,cAAc,EAAE;AAChC,MAAI,WAAW,MAAM;AACnB,QAAI,CAAC,IAAI,MAAM,IAAI,OAAO,GAAG;AAC3B,aAAO;AAAA,QACL,KAAK,6BAA6B,eAAe,OAAO,cAAc;AAAA,UACpE,QAAQ;AAAA,UACR,SAAS,GAAG,OAAO;AAAA,UACnB,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AACA,UAAM,SAAS,SAAS,OAAO,IAAI,OAAO;AAC1C,QAAI,OAAQ,QAAO,CAAC,MAAM;AAAA,EAC5B;AAEA,UAAQ,GAAG,IAAI;AAAA,IACb,KAAK,cAAc;AACjB,YAAM,WAAW,kBAAkB,KAAK,GAAG,MAAM;AACjD,UAAI,UAAU;AACZ,cAAM,IAAI,SAAS,QAAQ,GAAG,MAAM;AACpC,YAAI,KAAK,EAAG,UAAS,OAAO,GAAG,CAAC;AAAA,MAClC;AACA,oBAAc,OAAO,GAAG,MAAM;AAC9B,aAAO,CAAC;AAAA,IACV;AAAA,IAEA,KAAK,UAAU;AACb,YAAM,OAAO,IAAI,MAAM,IAAI,GAAG,MAAM;AACpC,UAAI,CAAC,QAAS,KAAK,SAAS,aAAa,KAAK,SAAS,YAAa;AAClE,eAAO,CAAC,QAAQ,IAAI,GAAG,QAAQ,kCAAkC,CAAC;AAAA,MACpE;AACA,YAAM,WAAW,kBAAkB,KAAK,GAAG,MAAM;AACjD,UAAI,CAAC,SAAU,QAAO,CAAC,QAAQ,IAAI,GAAG,QAAQ,6BAA6B,CAAC;AAC5E,YAAM,KAAK,SAAS,QAAQ,GAAG,MAAM;AACrC,YAAM,OAAO,KAAK;AAClB,iBAAW,KAAK,MAAM;AACpB,cAAM,KAAK,IAAI,MAAM,IAAI,CAAC;AAC1B,YAAI,GAAI,IAAG,SAAS,KAAK;AAAA,MAC3B;AACA,eAAS,OAAO,IAAI,GAAG,GAAG,IAAI;AAC9B,UAAI,MAAM,OAAO,GAAG,MAAM;AAC1B,YAAM,QAAQ,IAAI,GAAG,MAAM;AAC3B,UAAI,KAAK,UAAU,KAAM,aAAY,OAAO,KAAK,MAAM;AACvD,aAAO,CAAC;AAAA,IACV;AAAA,IAEA,KAAK,eAAe;AAClB,YAAM,WAAW,kBAAkB,KAAK,GAAG,MAAM;AACjD,UAAI,CAAC,SAAU,QAAO,CAAC,QAAQ,IAAI,GAAG,QAAQ,kCAAkC,CAAC;AACjF,YAAM,KAAK,SAAS,QAAQ,GAAG,MAAM;AACrC,YAAM,WAAW,IAAI,MAAM,IAAI,GAAG,MAAM,GAAG,UAAU;AACrD,YAAM,QAAQ,YAAY,OAAO,GAAG,aAAa,QAAQ;AACzD,eAAS,OAAO,IAAI,GAAG,KAAK;AAC5B,oBAAc,OAAO,GAAG,MAAM;AAC9B,UAAI,YAAY,KAAM,aAAY,OAAO,QAAQ;AACjD,aAAO,CAAC;AAAA,IACV;AAAA,IAEA,KAAK,QAAQ;AACX,YAAM,WAAW,kBAAkB,KAAK,GAAG,MAAM;AACjD,UAAI,CAAC,SAAU,QAAO,CAAC,QAAQ,IAAI,GAAG,QAAQ,2BAA2B,CAAC;AAC1E,YAAM,KAAK,SAAS,QAAQ,GAAG,MAAM;AACrC,YAAM,WAAW,IAAI,MAAM,IAAI,GAAG,MAAM,GAAG,UAAU;AACrD,YAAM,YAAY,kBAAkB,OAAO,GAAG,SAAS,QAAQ;AAC/D,YAAM,UAAU,IAAI,MAAM,IAAI,SAAS;AACvC,YAAM,aAAa,IAAI,MAAM,IAAI,GAAG,MAAM;AAC1C,UAAI,YAAY,QAAQ,SAAS,aAAa,QAAQ,SAAS,aAAa;AAC1E,gBAAQ,SAAS,KAAK,GAAG,MAAM;AAAA,MACjC;AACA,UAAI,WAAY,YAAW,SAAS;AACpC,eAAS,OAAO,IAAI,GAAG,SAAS;AAChC,aAAO,CAAC;AAAA,IACV;AAAA,IAEA,KAAK;AAAA,IACL,KAAK,eAAe;AAClB,YAAM,WAAW,kBAAkB,KAAK,GAAG,MAAM;AACjD,UAAI,CAAC,SAAU,QAAO,CAAC,QAAQ,IAAI,GAAG,QAAQ,6BAA6B,CAAC;AAC5E,YAAM,KAAK,SAAS,QAAQ,GAAG,MAAM;AACrC,YAAM,WAAW,IAAI,MAAM,IAAI,GAAG,MAAM,GAAG,UAAU;AACrD,YAAM,QAAQ,YAAY,OAAO,GAAG,MAAM,QAAQ;AAClD,eAAS,OAAO,GAAG,OAAO,iBAAiB,KAAK,KAAK,GAAG,GAAG,KAAK;AAChE,UAAI,YAAY,KAAM,aAAY,OAAO,QAAQ;AACjD,aAAO,CAAC;AAAA,IACV;AAAA,IAEA,KAAK,YAAY;AACf,YAAM,YAAY,IAAI,MAAM,IAAI,GAAG,SAAS;AAC5C,UAAI,CAAC,aAAc,UAAU,SAAS,aAAa,UAAU,SAAS,YAAa;AACjF,eAAO,CAAC,QAAQ,IAAI,GAAG,WAAW,uCAAuC,CAAC;AAAA,MAC5E;AACA,YAAM,WAAW,kBAAkB,KAAK,GAAG,MAAM;AACjD,UAAI,UAAU;AACZ,cAAM,IAAI,SAAS,QAAQ,GAAG,MAAM;AACpC,YAAI,KAAK,EAAG,UAAS,OAAO,GAAG,CAAC;AAAA,MAClC;AACA,YAAM,SAAS,IAAI,MAAM,IAAI,GAAG,MAAM;AACtC,UAAI,OAAQ,QAAO,SAAS,GAAG;AAC/B,YAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,UAAU,SAAS,MAAM,CAAC;AACrE,gBAAU,SAAS,OAAO,KAAK,GAAG,GAAG,MAAM;AAC3C,kBAAY,OAAO,GAAG,SAAS;AAC/B,aAAO,CAAC;AAAA,IACV;AAAA,IAEA,KAAK,iBAAiB;AACpB,YAAM,QAAQ,IAAI,MAAM,IAAI,GAAG,KAAK;AACpC,YAAM,SAAS,IAAI,MAAM,IAAI,GAAG,MAAM;AACtC,UAAI,CAAC,SAAS,CAAC,OAAQ,QAAO,CAAC,QAAQ,IAAI,GAAG,OAAO,4BAA4B,CAAC;AAClF,WACG,MAAM,SAAS,aAAa,MAAM,SAAS,gBAC3C,OAAO,SAAS,aAAa,OAAO,SAAS,aAC9C;AACA,mBAAW,KAAK,OAAO,UAAU;AAC/B,gBAAM,KAAK,IAAI,MAAM,IAAI,CAAC;AAC1B,cAAI,GAAI,IAAG,SAAS,GAAG;AACvB,gBAAM,SAAS,KAAK,CAAC;AAAA,QACvB;AACA,eAAO,WAAW,CAAC;AAAA,MACrB;AACA,YAAM,WAAW,kBAAkB,KAAK,GAAG,MAAM;AACjD,UAAI,UAAU;AACZ,cAAM,IAAI,SAAS,QAAQ,GAAG,MAAM;AACpC,YAAI,KAAK,EAAG,UAAS,OAAO,GAAG,CAAC;AAAA,MAClC;AACA,UAAI,MAAM,OAAO,GAAG,MAAM;AAC1B,YAAM,QAAQ,IAAI,GAAG,MAAM;AAC3B,kBAAY,OAAO,GAAG,KAAK;AAC3B,aAAO,CAAC;AAAA,IACV;AAAA,IAEA,KAAK,gBAAgB;AACnB,YAAM,KAAK,IAAI,MAAM,IAAI,GAAG,MAAM;AAClC,UAAI,CAAC,MAAM,GAAG,SAAS,WAAW;AAChC,eAAO,CAAC,QAAQ,IAAI,GAAG,QAAQ,uCAAuC,CAAC;AAAA,MACzE;AACA,SAAG,WAAW,cAAc,GAAG,KAAK;AACpC,kBAAY,OAAO,GAAG,MAAM;AAC5B,aAAO,CAAC;AAAA,IACV;AAAA,IAEA,KAAK,cAAc;AACjB,YAAM,KAAK,IAAI,MAAM,IAAI,GAAG,MAAM;AAClC,UAAI,CAAC,MAAM,GAAG,SAAS,WAAW;AAChC,eAAO,CAAC,QAAQ,IAAI,GAAG,QAAQ,qCAAqC,CAAC;AAAA,MACvE;AACA,YAAM,SAAS,eAAe,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU;AAClE,UAAI,OAAO,YAAY,GAAG,eAAe,SAAS;AAChD,eAAO;AAAA,UACL,KAAK,gCAAgC,qCAAqC,GAAG,MAAM,IAAI;AAAA,YACrF,QAAQ,GAAG;AAAA,YACX,SAAS,GAAG,OAAO;AAAA,YACnB,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF;AACA,SAAG,WAAW,OAAO;AACrB,UAAI,GAAG,UAAU,MAAM;AACrB,cAAM,MAAM,IAAI,MAAM,IAAI,GAAG,MAAM;AACnC,YAAI,IAAK,aAAY,OAAO,GAAG,MAAM;AAAA,MACvC;AACA,kBAAY,OAAO,GAAG,MAAM;AAC5B,aAAO,CAAC;AAAA,IACV;AAAA,IAEA,KAAK;AACH,aAAO,UAAU,OAAO,EAAE;AAAA,EAC9B;AACF;AAEA,SAAS,UACP,OACA,IACc;AACd,QAAM,EAAE,IAAI,IAAI;AAChB,QAAM,OAAO,IAAI,MAAM,IAAI,GAAG,IAAI;AAClC,MAAI,CAAC,QAAQ,KAAK,SAAS,WAAW;AACpC,WAAO,CAAC,QAAQ,IAAI,GAAG,MAAM,+BAA+B,CAAC;AAAA,EAC/D;AACA,QAAM,SAAuB,CAAC;AAC9B,QAAM,YACJ,GAAG,eAAe,kBAAkB,OAAO,IAAI,IAAI,GAAG,UAAU;AAElE,QAAM,gBACJ,GAAG,eAAe,QACd,CAAC,GAAG,KAAK,SAAS,OAAO,KAAK,CAAC,IAC/B,CAAC,kBAAkB;AAEzB,aAAW,UAAU,GAAG,MAAM;AAC5B,UAAM,OAAO,IAAI,MAAM,IAAI,MAAM;AACjC,QAAI,CAAC,QAAQ,KAAK,SAAS,WAAW;AACpC,aAAO,KAAK,QAAQ,IAAI,QAAQ,+BAA+B,CAAC;AAChE;AAAA,IACF;AAEA,UAAM,aAAa,IAAI,IAA8B,cAAc,KAAK,QAAQ,EAAE,MAAM;AACxF,QAAI,SAAS;AAEb,eAAW,OAAO,eAAe;AAC/B,YAAM,WAAW,KAAK,SAAS,OAAO,IAAI,GAAG;AAC7C,UAAI,CAAC,SAAU;AACf,YAAM,WAAW,WAAW,IAAI,GAAG;AACnC,YAAM,QAAQ,WACV,IAAI,IAA4B,SAAS,KAAK,IAC9C,oBAAI,IAA4B;AAEpC,iBAAW,CAAC,MAAM,IAAI,KAAK,SAAS,OAAO;AACzC,YAAI,aAAa,CAAC,UAAU,IAAI,IAAI,EAAG;AACvC,YAAI,CAAC,YAAY,OAAO,IAAI,EAAG;AAC/B,YAAI,KAAK,kBAAkB;AACzB,iBAAO;AAAA,YACL;AAAA,cACE;AAAA,cACA,8CAA8C,KAAK,QAAQ,UAAU,MAAM;AAAA,cAC3E,EAAE,QAAQ,QAAQ,SAAS,GAAG,OAAO,SAAS,UAAU,OAAO;AAAA,YACjE;AAAA,UACF;AACA;AAAA,QACF;AACA,YAAI,CAAC,MAAM,IAAI,IAAI,GAAG;AACpB,gBAAM,IAAI,MAAM,IAAI;AACpB,mBAAS;AAAA,QACX;AAAA,MACF;AACA,iBAAW,IAAI,KAAK,EAAE,WAAW,SAAS,WAAW,MAAM,CAAC;AAAA,IAC9D;AAEA,QAAI,QAAQ;AACV,WAAK,WAAW,EAAE,QAAQ,WAAW;AACrC,kBAAY,OAAO,MAAM;AAAA,IAC3B;AAAA,EACF;AAEA,aAAW,KAAK,OAAQ,OAAM,YAAY,KAAK,CAAC;AAChD,SAAO,CAAC;AACV;AASO,SAAS,SACd,KACA,KACA,KACc;AACd,QAAM,SAAS,cAAc,GAAG;AAChC,QAAM,QAAkB;AAAA,IACtB,KAAK;AAAA,IACL,SAAS,oBAAI,IAAI;AAAA,IACjB,SAAS,oBAAI,IAAI;AAAA,IACjB,SAAS,oBAAI,IAAI;AAAA,IACjB,aAAa,CAAC;AAAA,IACd,SAAS,CAAC;AAAA,IACV,eAAe;AAAA,IACf,SAAS,KAAK,iBAAiB;AAAA,IAC/B,KAAK,EAAE,KAAK,QAAQ,eAAe,KAAK,iBAAiB,GAAG,GAAG,IAAI;AAAA,EACrE;AAEA,aAAW,MAAM,KAAK;AACpB,UAAM,SAAS,SAAS,OAAO,EAAE;AACjC,QAAI,OAAO,SAAS,GAAG;AACrB,YAAM,QAAQ,KAAK;AAAA,QACjB,OAAO,EAAE,SAAS,GAAG,OAAO,SAAS,QAAQ,cAAc,EAAE,KAAK,IAAI,MAAM,KAAK,CAAC,EAAE,EAAE;AAAA,QACtF,QAAQ,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,MAAM,EAAE,MAAM,SAAS,EAAE,QAAQ,EAAE;AAAA,MACtE,CAAC;AACD,iBAAW,KAAK,OAAQ,OAAM,YAAY,KAAK,CAAC;AAAA,IAClD,OAAO;AACL,YAAM,iBAAiB;AAAA,IACzB;AAAA,EACF;AAEA,SAAO,EAAE,KAAK,QAAQ,QAAQ,SAAS,KAAK,EAAE;AAChD;AAoDA,SAAS,SAAS,OAA8B;AAC9C,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IACf,SAAS,MAAM;AAAA,IACf,SAAS,MAAM;AAAA,IACf,eAAe,MAAM;AAAA,IACrB,SAAS,MAAM;AAAA,IACf,SAAS,CAAC;AAAA,IACV,aAAa,MAAM;AAAA,EACrB;AACF;;;AC5UO,SAAS,0BAAyC;AACvD,QAAM,OAA8B,oBAAI,IAAI;AAC5C,SAAO;AAAA,IACL,uBAAgC;AAC9B,aAAO;AAAA,IACT;AAAA,IACA,6BAAsC;AACpC,aAAO;AAAA,IACT;AAAA,IACA,iBAAwC;AACtC,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAOA,SAAS,oBAAoB,GAA+D;AAC1F,SAAO,OAAQ,EAAsC,qBAAqB;AAC5E;AAeO,SAAS,mBAAmB,KAAiB,UAAwC;AAC1F,MAAI,CAAC,oBAAoB,QAAQ,KAAK,SAAS,iBAAiB,EAAE,WAAW,GAAG;AAC9E,WAAO,wBAAwB;AAAA,EACjC;AAEA,QAAM,aAAa,oBAAI,IAAc;AACrC,QAAM,aAAa,oBAAI,IAAc;AAErC,aAAW,MAAM,WAAW,GAAG,GAAG;AAChC,UAAM,KAAK,WAAW,KAAK,EAAE;AAC7B,QAAI,CAAC,GAAI;AACT,eAAW,OAAO,GAAG,QAAQ,UAAU;AACrC,UAAI,IAAI,SAAS,SAAU;AAC3B,iBAAW,KAAK,IAAI,QAAQ;AAC1B,cAAM,IAAI,SAAS,cAAc,EAAE,KAAK;AAGxC,YAAI,EAAE,cAAc,EAAE,aAAa,EAAE,cAAe,YAAW,IAAI,EAAE;AACrE,YAAI,EAAE,aAAc,YAAW,IAAI,EAAE;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAMA,QAAM,SAAS,oBAAI,IAA6B;AAChD,aAAW,MAAM,WAAW,GAAG,GAAG;AAChC,UAAM,KAAK,WAAW,KAAK,EAAE;AAC7B,QAAI,CAAC,GAAI;AACT,QAAI,CAAC,WAAW,IAAI,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE,EAAG;AAChD,UAAM,MAAM,oBAAI,IAAc,CAAC,EAAE,CAAC;AAClC,eAAW,KAAK,GAAG,UAAU;AAC3B,YAAM,KAAK,IAAI,MAAM,IAAI,CAAC;AAC1B,UAAI,MAAM,GAAG,SAAS,UAAW,KAAI,IAAI,CAAC;AAAA,IAC5C;AACA,WAAO,IAAI,IAAI,GAAG;AAAA,EACpB;AAEA,QAAM,QAA+B,oBAAI,IAAI;AAC7C,SAAO;AAAA,IACL,sBAAsB,CAAC,OAA0B,WAAW,IAAI,EAAE;AAAA,IAClE,4BAA4B,CAAC,OAA0B,WAAW,IAAI,EAAE;AAAA,IACxE,gBAAgB,CAAC,OAAwC,OAAO,IAAI,EAAE,KAAK;AAAA,EAC7E;AACF;AAKA,SAAS,KAAK,GAAqC;AACjD,SAAQ,EAAgB;AAC1B;AAGO,SAAS,uBAAuC;AACrD,SAAO;AAAA,IACL,OAAO,QAAqC;AAC1C,aAAO,EAAE,IAAI,UAAU,QAAQ,KAAK,MAAM,EAAE;AAAA,IAC9C;AAAA,IACA,WAAW,QAAkC;AAC3C,aAAO,EAAE,IAAI,cAAc,QAAQ,KAAK,MAAM,EAAE;AAAA,IAClD;AAAA,IACA,YAAY,QAAkB,aAAuC;AACnE,aAAO,EAAE,IAAI,eAAe,QAAQ,KAAK,MAAM,GAAG,YAAY;AAAA,IAChE;AAAA,IACA,KAAK,QAAkB,SAAsC;AAC3D,aAAO,EAAE,IAAI,QAAQ,QAAQ,KAAK,MAAM,GAAG,QAAQ;AAAA,IACrD;AAAA,IACA,aAAa,QAAkB,MAAgC;AAC7D,aAAO,EAAE,IAAI,gBAAgB,QAAQ,KAAK,MAAM,GAAG,KAAK;AAAA,IAC1D;AAAA,IACA,YAAY,QAAkB,MAAgC;AAC5D,aAAO,EAAE,IAAI,eAAe,QAAQ,KAAK,MAAM,GAAG,KAAK;AAAA,IACzD;AAAA,IACA,SAAS,QAAkB,WAAwB,OAA+B;AAChF,aAAO,EAAE,IAAI,YAAY,QAAQ,KAAK,MAAM,GAAG,WAAW,KAAK,SAAS,GAAG,MAAM;AAAA,IACnF;AAAA,IACA,cAAc,OAAiB,QAAkC;AAC/D,aAAO,EAAE,IAAI,iBAAiB,OAAO,KAAK,KAAK,GAAG,QAAQ,KAAK,MAAM,EAAE;AAAA,IACzE;AAAA,IACA,aAAa,QAAqB,OAAiB,iBAAiB,MAAsB;AACxF,aAAO,EAAE,IAAI,gBAAgB,QAAQ,KAAK,MAAM,GAAG,OAAO,eAAe;AAAA,IAC3E;AAAA,IACA,WACE,QACA,QACA,OACA,aAAkC,SAClB;AAChB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ,KAAK,MAAM;AAAA,QACnB,QAAQ,SAAS,KAAK,MAAM,IAAI;AAAA,QAChC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,oBACE,MACA,MACA,MACgB;AAChB,YAAM,OAA+B,MAAM,QAAQ,IAAI,IAClD,OACD,CAAC,IAAmB;AACxB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,KAAK,IAAI;AAAA,QACf,MAAM,KAAK,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;AAAA,QAC7B,YAAY,MAAM,QAAQ;AAAA,QAC1B,YAAY,MAAM,cAAc;AAAA,MAClC;AAAA,IACF;AAAA,IACA,QAAQ,MAA6B;AACnC,aAAO;AAAA,IACT;AAAA,IACA,KAAK,OAAyB;AAC5B,aAAO,EAAE,MAAM,QAAQ,MAAM;AAAA,IAC/B;AAAA,IACA,KAAK,MAA0B;AAC7B,aAAO,EAAE,MAAM,OAAO,KAAK,KAAK,IAAI,EAAE;AAAA,IACxC;AAAA,EACF;AACF;AAIA,SAAS,GAAM,GAAuB;AACpC,SAAO;AACT;AAGO,SAAS,kBACd,KACA,WACA,UACA,WACA,QACA,OACA,WACc;AACd,QAAM,OAAO,WAAW,KAAK,SAAS;AAEtC,QAAM,WAAW,MAAsC;AACrD,QAAI,KAAK,UAAU,KAAM,QAAO;AAChC,UAAM,IAAI,IAAI,MAAM,IAAI,KAAK,MAAM;AACnC,WAAO,KAAK,EAAE,SAAS,YAAY,GAAG,CAAC,IAAI;AAAA,EAC7C;AAEA,QAAM,kBAAkB,MAA0C;AAChE,UAAM,MAAiC,CAAC;AACxC,eAAW,KAAK,KAAK,UAAU;AAC7B,YAAM,KAAK,IAAI,MAAM,IAAI,CAAC;AAC1B,UAAI,MAAM,GAAG,SAAS,UAAW,KAAI,KAAK,GAAG,EAAE,CAAC;AAAA,IAClD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,MAA0C;AAC1D,UAAM,MAAiC,CAAC;AACxC,QAAI,MAAuB,KAAK;AAChC,WAAO,OAAO,MAAM;AAClB,YAAM,IAAwB,IAAI,MAAM,IAAI,GAAG;AAC/C,UAAI,CAAC,EAAG;AACR,UAAI,EAAE,SAAS,UAAW,KAAI,KAAK,GAAG,CAAC,CAAC;AACxC,YAAM,EAAE;AAAA,IACV;AACA,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,CAAC,UAA+C;AAChE,QAAI,KAAK,UAAU,KAAM,QAAO;AAChC,UAAM,IAAI,IAAI,MAAM,IAAI,KAAK,MAAM;AACnC,QAAI,CAAC,KAAM,EAAE,SAAS,aAAa,EAAE,SAAS,WAAa,QAAO;AAClE,UAAM,IAAI,EAAE,SAAS,QAAQ,SAAS;AACtC,UAAM,MAAM,EAAE,SAAS,IAAI,KAAK;AAChC,QAAI,OAAO,KAAM,QAAO;AACxB,UAAM,KAAK,IAAI,MAAM,IAAI,GAAG;AAC5B,WAAO,KAAK,GAAG,EAAE,IAAI;AAAA,EACvB;AAEA,QAAM,aAAa,CAAC,MAA0B;AAC5C,UAAM,OAAO,IAAI,MAAM,IAAK,EAAa,EAAE;AAC3C,WAAO,QAAQ,KAAK,SAAS,YAAY,KAAK,WAAW,cAAc;AAAA,EACzE;AAEA,SAAO;AAAA,IACL,MAAM,GAAG,IAAI;AAAA,IACb,KAAK,GAAG,GAAG;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,mBAAmD;AACjD,YAAM,MAAM,gBAAgB;AAC5B,aAAO,IAAI,WAAW,IAAI,IAAI,CAAC,IAAK;AAAA,IACtC;AAAA,IACA,WAAqB;AACnB,aAAO,KAAK;AAAA,IACd;AAAA,IACA;AAAA,IACA,SAAS,GAA0B;AACjC,YAAM,SAAS,IAAI,IAAI,MAAM,IAAK,EAAgB,EAAE,IAAI;AACxD,UAAI,CAAC,UAAU,OAAO,SAAS,UAAW,QAAO;AACjD,aAAO,OAAO,QAAQ,UAAU,OAAO,KAAK;AAAA,IAC9C;AAAA,IACA;AAAA,IACA,QAAQ,MAAsC;AAC5C,iBAAW,KAAK,UAAU,EAAG,KAAI,KAAK,CAAC,EAAG,QAAO;AACjD,aAAO;AAAA,IACT;AAAA,IACA,cAA2C;AACzC,aAAO,UAAU,EAAE;AAAA,IACrB;AAAA,IACA,cAA2C;AACzC,aAAO,UAAU,CAAC;AAAA,IACpB;AAAA,IACA,gBAAwB;AACtB,UAAI,KAAK,UAAU,KAAM,QAAO;AAChC,YAAM,IAAI,IAAI,MAAM,IAAI,KAAK,MAAM;AACnC,UAAI,CAAC,KAAM,EAAE,SAAS,aAAa,EAAE,SAAS,WAAa,QAAO;AAClE,UAAI,MAAM;AACV,iBAAW,KAAK,EAAE,UAAU;AAC1B,cAAM,KAAK,IAAI,MAAM,IAAI,CAAC;AAC1B,YAAI,MAAM,GAAG,SAAS,WAAW;AAC/B,iBAAO;AACP,cAAI,MAAM,UAAW,QAAO;AAAA,QAC9B;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC7SA,IAAM,UAAU;AAChB,IAAM,WAAW;AACjB,IAAM,YAAY;AAGlB,IAAM,wBAA6C,oBAAI,IAAI,CAAC,SAAS,YAAY,EAAE,CAAC;AAEpF,IAAM,mBAAwC,oBAAI,IAAI,CAAC,UAAU,EAAE,CAAC;AAGpE,IAAM,mBAA2C;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,gBAAqC,oBAAI,IAAI,CAAC,QAAQ,UAAU,aAAa,EAAE,CAAC;AAEtF,IAAM,qBAA0C,oBAAI,IAAI,CAAC,QAAQ,eAAe,QAAQ,aAAa,CAAC;AAQtG,SAAS,wBAAwB,IAAuB;AACtD,aAAW,SAAS,GAAG,OAAO,OAAO,GAAG;AACtC,UAAM,UAAU,MAAM,MAAM,IAAI,OAAO;AACvC,QAAI,WAAW,CAAC,sBAAsB,IAAI,OAAO,QAAQ,KAAK,CAAC,EAAG,QAAO;AACzE,UAAM,WAAW,MAAM,MAAM,IAAI,QAAQ;AACzC,QAAI,YAAY,CAAC,iBAAiB,IAAI,OAAO,SAAS,KAAK,CAAC,EAAG,QAAO;AACtE,UAAM,YAAY,MAAM,MAAM,IAAI,SAAS;AAC3C,QAAI,aAAa,OAAO,UAAU,KAAK,MAAM,OAAQ,QAAO;AAAA,EAC9D;AACA,SAAO;AACT;AAIA,SAASC,aAAY,MAAiB,MAAgC;AACpE,MAAI,KAAK,UAAW,QAAO;AAC3B,MAAI;AACF,WAAO,KAAK,UAAU,YAAY,KAAK,QAAQ;AAAA,EACjD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,SAAS,gBACP,eACA,YACA,MACA,OACS;AACT,MAAI,CAAC,cAAe,QAAO;AAC3B,QAAM,QAAQ,cAAc,OAAO,IAAI,UAAmB;AAC1D,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,IAAI,MAAM,MAAM,IAAI,IAAI;AAC9B,SAAO,KAAK,QAAQ,OAAO,EAAE,KAAK,MAAM;AAC1C;AAOA,SAAS,cACP,iBACA,eACA,MACS;AACT,aAAW,SAAS,gBAAgB,OAAO,OAAO,GAAG;AACnD,UAAM,KAAK,aAAa,MAAM,SAAS;AACvC,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAI,SAAS,WAAW,SAAS,YAAY,SAAS,UAAW;AACjE,UAAIA,aAAY,MAAM,IAAI,EAAG;AAC7B,UAAI,CAAC,gBAAgB,eAAe,IAAI,MAAM,OAAO,KAAK,KAAK,CAAC,EAAG,QAAO;AAAA,IAC5E;AAAA,EACF;AACA,SAAO;AACT;AAKA,SAAS,UAAU,IAA2B,MAA+B;AAC3E,MAAI,CAAC,GAAI,QAAO;AAChB,aAAW,SAAS,KAAK,kBAAkB,GAAG,QAAQ,EAAE,OAAO,OAAO,GAAG;AACvE,QAAI,MAAM,UAAU,UAAU,MAAM,MAAM,UAAU,OAAO,WAAW,KAAK,MAAM,UAAU,kBAAkB,IAAI;AAC/G,YAAM,IAAI,MAAM,MAAM,IAAI,OAAO;AACjC,UAAI,EAAG,QAAO,OAAO,EAAE,KAAK;AAAA,IAC9B;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,sBAAsB,QAAoB,SAAoB,MAAgC;AACrG,MAAI,QAAQ,UAAU,KAAM,QAAO;AACnC,QAAM,IAAI,OAAO,MAAM,IAAI,QAAQ,MAAM;AACzC,MAAI,CAAC,KAAK,EAAE,SAAS,UAAW,QAAO;AACvC,SAAO,mBAAmB,IAAI,UAAU,GAAG,IAAI,CAAC;AAClD;AAOA,SAAS,uBACP,aACA,YACA,MACS;AACT,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,SAAS,cAAc,KAAK,kBAAkB,WAAW,IAAI;AACnE,QAAM,QAAQ,KAAK,kBAAkB,UAAU;AAC/C,aAAW,SAAS,MAAM,OAAO,OAAO,GAAG;AACzC,UAAM,KAAK,aAAa,MAAM,SAAS;AACvC,eAAW,QAAQ,kBAAkB;AACnC,YAAM,IAAI,MAAM,MAAM,IAAI,IAAI;AAC9B,UAAI,CAAC,KAAK,cAAc,IAAI,OAAO,EAAE,KAAK,CAAC,EAAG;AAC9C,YAAM,OAAO,QAAQ,OAAO,IAAI,EAAW,GAAG,MAAM,IAAI,IAAI;AAC5D,UAAI,CAAC,QAAQ,OAAO,KAAK,KAAK,MAAM,OAAO,EAAE,KAAK,EAAG,QAAO;AAAA,IAC9D;AAAA,EACF;AACA,SAAO;AACT;AAKA,SAAS,eAAe,KAA4C;AAClE,aAAW,MAAM,IAAK,KAAI,GAAG,OAAO,SAAU,QAAO,GAAG;AACxD,SAAO;AACT;AAGA,SAAS,iBAAiB,KAA2B,SAAoB,QAAqC;AAC5G,aAAW,MAAM,IAAK,KAAI,GAAG,OAAO,aAAc,QAAO,GAAG;AAC5D,aAAW,MAAM,IAAK,KAAI,GAAG,OAAO,yBAAyB,GAAG,KAAK,SAAS,EAAG,QAAO,GAAG,KAAK,CAAC;AACjG,aAAW,KAAK,QAAQ,UAAU;AAChC,UAAM,IAAI,OAAO,MAAM,IAAI,CAAC;AAC5B,QAAI,KAAK,EAAE,SAAS,UAAW,QAAO;AAAA,EACxC;AACA,SAAO;AACT;AAYO,SAAS,mBACd,QACA,OACA,KACA,MACuB;AACvB,QAAM,YAAY,eAAe,GAAG;AACpC,MAAI,aAAa,KAAM,QAAO,EAAE,MAAM,iBAAiB,WAAW,MAAM,SAAS,KAAK;AAEtF,QAAM,UAAU,OAAO,MAAM,IAAI,SAAS;AAE1C,MAAI,CAAC,WAAW,QAAQ,SAAS,WAAW;AAC1C,WAAO,EAAE,MAAM,iBAAiB,WAAW,MAAM,SAAS,KAAK;AAAA,EACjE;AAEA,QAAM,UAAU,iBAAiB,KAAK,SAAS,MAAM;AACrD,QAAM,kBAAkB,KAAK,kBAAkB,QAAQ,QAAQ;AAC/D,QAAM,aAAa,WAAW,OAAO,WAAW,OAAO,OAAO,GAAG,YAAY,OAAO;AACpF,QAAM,cAAc,WAAW,OAAO,WAAW,QAAQ,OAAO,GAAG,YAAY,OAAO;AAGtF,MAAI,wBAAwB,eAAe,GAAG;AAC5C,WAAO,EAAE,MAAM,sBAAsB,WAAW,QAAQ;AAAA,EAC1D;AAEA,MAAI,cAAc,iBAAiB,aAAa,KAAK,kBAAkB,UAAU,IAAI,MAAM,IAAI,GAAG;AAChG,WAAO,EAAE,MAAM,sBAAsB,WAAW,QAAQ;AAAA,EAC1D;AAEA,MAAI,uBAAuB,aAAa,YAAY,IAAI,KAAK,CAAC,sBAAsB,QAAQ,SAAS,IAAI,GAAG;AAC1G,WAAO,EAAE,MAAM,sBAAsB,WAAW,QAAQ;AAAA,EAC1D;AAEA,SAAO,EAAE,MAAM,iBAAiB,WAAW,QAAQ;AACrD;;;AC9LO,IAAM,mBAAmC;AAAA,EAC9C,eAAe;AAAA,EACf,QAAQ,EAAE,SAAS,IAAI,UAAU,GAAG,SAAS,EAAE;AAAA,EAC/C,mBAAmB;AAAA,EACnB,mBAAmB;AACrB;AAEO,IAAM,cAAoC,CAAC,WAAW,YAAY,SAAS;AAI3E,SAAS,YAAY,OAAuB,SAA6B;AAC9E,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,EAAE,SAAS,QAAQ,MAAM,UAAU,QAAQ,UAAU,QAAQ,QAAQ,OAAO;AAAA,EACtF;AACF;AAEO,SAAS,iBAAiB,QAAyB,OAA6B;AACrF,QAAM,MAAiB,CAAC;AACxB,aAAW,QAAQ,QAAQ;AACzB,QAAI,KAAK,UAAU,MAAO;AAC1B,eAAW,KAAK,KAAK,SAAU,KAAI,KAAK,CAAC;AAAA,EAC3C;AACA,MAAI,KAAK,CAAC,GAAG,OAAO,EAAE,YAAY,MAAM,EAAE,YAAY,EAAE;AACxD,SAAO;AACT;AASA,SAAS,YAA2B;AAClC,SAAO;AAAA,IACL,SAAS,GAAW;AAClB,aAAO,EAAE;AAAA,IACX;AAAA,IACA,QAA0B;AACxB,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AACF;AAGA,SAAS,kBAAkB,KAAuC;AAChE,QAAM,MAAkB,CAAC;AACzB,aAAW,MAAM,KAAK;AACpB,QAAI,GAAG,OAAO,gBAAgB,GAAG,OAAO,eAAgB,KAAI,KAAK,GAAG,MAAM;AAAA,aACjE,GAAG,OAAO,sBAAuB,KAAI,KAAK,GAAG,GAAG,IAAI;AAAA,EAC/D;AACA,SAAO;AACT;AAGA,SAAS,YAAY,UAAyBC,aAA6B,IAAuB;AAChG,MAAI,GAAG,OAAO,SAAS,EAAG,QAAO;AACjC,MAAI;AACF,UAAM,MAAmB,EAAE,YAAAA,aAAY,MAAM,UAAU,EAAE;AACzD,UAAM,IAAI,SAAS,KAAK,IAAI,GAAG;AAC/B,WAAO,EAAE,SAAS,EAAE,YAAY;AAAA,EAClC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AASO,SAAS,sBACd,QACA,OACA,KACA,UACAA,aACS;AACT,aAAW,MAAM,kBAAkB,GAAG,GAAG;AACvC,UAAM,QAAQ,WAAW,OAAO,EAAE;AAClC,QAAI,CAAC,MAAO;AAEZ,QAAI,MAAM,QAAQ,UAAU,MAAM,QAAQ,WAAY;AACtD,QAAI,YAAY,UAAUA,aAAY,MAAM,QAAQ,EAAG;AACvD,UAAM,QAAQ,WAAW,QAAQ,EAAE;AACnC,UAAM,WAAW,CAAC,SAAS,YAAY,UAAUA,aAAY,MAAM,QAAQ;AAC3E,QAAI,SAAU,QAAO;AAAA,EACvB;AACA,SAAO;AACT;AAcO,SAAS,eACd,QACA,OACA,KACA,KACgB;AAEhB,MAAI,sBAAsB,QAAQ,OAAO,KAAK,IAAI,UAAU,IAAI,UAAU,EAAG,QAAO;AAEpF,QAAM,OAAO,IAAI,QAAQ;AACzB,MAAI,SAAS,MAAO,QAAO;AAE3B,QAAM,MAAM,mBAAmB,QAAQ,OAAO,KAAK,IAAI,UAAU;AACjE,SAAO,IAAI,SAAS,kBAAkB,WAAW;AACnD;AAQO,SAAS,gBACd,KACA,MACA,UACA,KACA,SACA,OACA,WACA,aAC+C;AAC/C,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,SAAS,IAAI,cAAe;AACxC,QAAI,SAAoC,CAAC;AACzC,QAAI;AACF,YAAM,OAAO,kBAAkB,KAAK,MAAM,IAAI,UAAU,IAAI,WAAW,IAAI,eAAe,OAAO,SAAS;AAC1G,YAAM,SAAS,QAAQ,SAAS,MAAM,OAAO;AAC7C,UAAI,CAAC,OAAQ;AACb,eAAS,OAAO;AAChB,UAAI,OAAO,YAAa,YAAW,KAAK,OAAO,YAAa,aAAY,KAAK,CAAC;AAAA,IAChF,SAAS,KAAK;AACZ,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,YAAY,QAAQ,IAAI,YAAY,OAAQ,KAAe,WAAW,GAAG,CAAC;AAAA,QACnF,QAAQ;AAAA,QACR,SAAS,QAAQ;AAAA,QACjB;AAAA,QACA;AAAA,QACA,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AACA,QAAI,OAAO,WAAW,EAAG;AACzB,WAAO,EAAE,KAAK,OAAO,IAAI,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,QAAQ;AAAA,EACpE;AACA,SAAO;AACT;AAGO,SAAS,iBACd,SACA,MACA,OACA,WACA,YACY;AACZ,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SACE,YAAY,QAAQ,IAAI,sBAAsB,IAAI,6IAE9C,UAAU;AAAA,IAChB,QAAQ;AAAA,IACR,SAAS,QAAQ;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AACF;AAUA,SAAS,SACP,OACA,UACA,KACA,SACA,OACA,WACA,SACA,aACA,eACQ;AACR,MAAI,aAAa;AAEjB,aAAW,QAAQ,WAAW,MAAM,GAAG,GAAG;AACxC,UAAM,KAAK,WAAW,MAAM,KAAK,IAAI;AACrC,QAAI,CAAC,GAAI;AACT,QAAI,UAAU,aAAa,cAAc,IAAI,IAAI,EAAG;AAEpD,UAAM,YAAY,gBAAgB,MAAM,KAAK,MAAM,UAAU,KAAK,SAAS,OAAO,WAAW,WAAW;AACxG,QAAI,CAAC,UAAW;AAChB,UAAM,EAAE,KAAK,QAAQ,IAAI;AAEzB,UAAM,UAAU,SAAS,MAAM,KAAK,KAAK,GAAG;AAC5C,eAAW,KAAK,QAAQ,OAAO,YAAa,aAAY,KAAK,CAAC;AAC9D,QAAI,QAAQ,OAAO,kBAAkB,EAAG;AAExC,QAAI,UAAU,WAAW;AACvB,YAAM,UAAU,eAAe,MAAM,KAAK,QAAQ,KAAK,KAAK,GAAG;AAC/D,UAAI,YAAY,UAAU;AAExB,oBAAY,KAAK,iBAAiB,SAAS,MAAM,OAAO,WAAW,IAAI,SAAS,EAAE,CAAC;AACnF,sBAAc,IAAI,IAAI;AACtB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,MAAM,QAAQ;AACpB,kBAAc,QAAQ,OAAO;AAC7B,eAAW,MAAM,QAAQ,OAAO,QAAS,SAAQ,IAAI,EAAE;AACvD,eAAW,MAAM,QAAQ,OAAO,QAAS,SAAQ,IAAI,EAAE;AAAA,EACzD;AACA,SAAO;AACT;AAKO,SAAS,eAAe,KAAyB;AACtD,QAAM,QAAkB,CAAC;AACzB,QAAM,QAAQ,CAAC,OAAuB;AACpC,UAAM,IAAI,IAAI,MAAM,IAAI,EAAE;AAC1B,QAAI,CAAC,EAAG;AACR,UAAM,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;AAC5B,eAAW,KAAK,SAAS,CAAC,EAAG,OAAM,CAAC;AAAA,EACtC;AACA,QAAM,IAAI,IAAI;AACd,SAAO,MAAM,KAAK,GAAG;AACvB;AAeO,SAAS,cACd,OACA,GACA,QACA,mBACgB;AAChB,MAAI,CAAC,EAAE,aAAa,EAAE,eAAe,eAAe;AAClD,MAAE,aAAa;AACf,MAAE,YAAY,KAAK;AAAA,MACjB,MAAM;AAAA,MACN,UAAU,sBAAsB,UAAU,UAAU;AAAA,MACpD,SAAS,UAAU,KAAK,eAAe,MAAM;AAAA,MAC7C;AAAA,MACA,WAAW,EAAE;AAAA,IACf,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL;AAAA,IACA,YAAY,EAAE;AAAA,IACd,WAAW,EAAE;AAAA,IACb,YAAY,EAAE;AAAA,IACd,SAAS,EAAE;AAAA,IACX,aAAa,EAAE;AAAA,EACjB;AACF;AAOO,SAAS,UACd,KACA,QACA,KACA,QAC2E;AAC3E,QAAM,MAAsB,EAAE,GAAG,kBAAkB,GAAG,OAAO;AAC7D,QAAM,UAAU,qBAAqB;AACrC,QAAM,QAAkB,EAAE,IAAI;AAC9B,QAAM,UAA4B,CAAC;AAEnC,QAAM,gBAAgB,oBAAI,IAAc;AAExC,aAAW,SAAS,aAAa;AAC/B,UAAM,WAAW,iBAAiB,QAAQ,KAAK;AAC/C,UAAM,SAAS,IAAI,OAAO,KAAK,KAAK,IAAI;AACxC,UAAM,IAAoB;AAAA,MACxB,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,SAAS,oBAAI,IAAI;AAAA,MACjB,aAAa,CAAC;AAAA,MACd,MAAM,oBAAI,IAAI;AAAA,IAChB;AAEA,QAAI,SAAS,WAAW,GAAG;AACzB,QAAE,YAAY;AACd,cAAQ,KAAK,cAAc,OAAO,GAAG,QAAQ,IAAI,iBAAiB,CAAC;AACnE;AAAA,IACF;AAEA,WAAO,EAAE,aAAa,QAAQ;AAC5B,QAAE,cAAc;AAChB,YAAM,UAAU;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE;AAAA,QACF,EAAE;AAAA,QACF,EAAE;AAAA,QACF;AAAA,MACF;AAEA,UAAI,YAAY,GAAG;AACjB,UAAE,YAAY;AACd;AAAA,MACF;AAEA,UAAI,IAAI,mBAAmB;AACzB,cAAM,KAAK,eAAe,MAAM,GAAG;AACnC,YAAI,EAAE,KAAK,IAAI,EAAE,GAAG;AAClB,YAAE,aAAa;AACf,YAAE,YAAY,KAAK;AAAA,YACjB,MAAM;AAAA,YACN,UAAU;AAAA,YACV,SAAS,UAAU,KAAK;AAAA,YACxB;AAAA,YACA,WAAW,EAAE;AAAA,UACf,CAAC;AACD;AAAA,QACF;AACA,UAAE,KAAK,IAAI,EAAE;AAAA,MACf;AAAA,IACF;AAEA,YAAQ,KAAK,cAAc,OAAO,GAAG,QAAQ,IAAI,iBAAiB,CAAC;AAAA,EACrE;AAEA,SAAO,EAAE,KAAK,MAAM,KAAK,QAAQ;AACnC;;;ACpYO,SAAS,sBAAqC;AACnD,QAAM,MAAM,oBAAI,IAA4B;AAC5C,SAAO;AAAA,IACL,SAAS,GAA2B;AAClC,UAAI,CAAC,IAAI,IAAI,EAAE,SAAS,EAAG,KAAI,IAAI,EAAE,WAAW,CAAC;AACjD,aAAO,EAAE;AAAA,IACX;AAAA,IACA,QAAmC;AACjC,aAAO,CAAC,GAAG,IAAI,OAAO,CAAC;AAAA,IACzB;AAAA,EACF;AACF;AAIA,SAAS,kBAAkB,IAAyB;AAClD,QAAM,MAAgB,CAAC;AACvB,aAAW,OAAO,GAAG,QAAQ,UAAU;AACrC,QAAI,IAAI,SAAS,SAAU,YAAW,KAAK,IAAI,OAAQ,KAAI,KAAK,EAAE,KAAK;AAAA,EACzE;AACA,SAAO;AACT;AAOA,SAAS,cACP,KACA,OACA,aACM;AACN,QAAM,EAAE,UAAU,YAAAC,YAAW,IAAI;AACjC,aAAW,MAAM,WAAW,GAAG,GAAG;AAChC,UAAM,KAAK,WAAW,KAAK,EAAE;AAC7B,QAAI,CAAC,MAAM,GAAG,QAAQ,OAAQ;AAC9B,UAAM,SAAS,kBAAkB,EAAE;AACnC,QAAI,OAAO,WAAW,EAAG;AACzB,QAAI;AACF,YAAM,SAAS,SAAS,QAAQ;AAAA,QAC9B,SAAS;AAAA,QACT,SAAS;AAAA,UACP,SAAS,GAAG;AAAA,UACZ,WAAW,GAAG,cAAc,QAAQ,QAAQ;AAAA,QAC9C;AAAA,MACF,CAAC;AACD,UAAI,SAAmB,OAAO;AAC9B,UAAI;AACF,iBAASA,YAAW,kBAAkB,MAAM;AAAA,MAC9C,QAAQ;AAAA,MAER;AACA,SAAG,WAAW;AACd,iBAAW,KAAK,OAAO,UAAU;AAC/B,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,UAAU,EAAE;AAAA,UACZ,SAAS,EAAE;AAAA,UACX,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF,SAAS,KAAK;AACZ,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,wBAAwB,GAAG,GAAG,MAAM,OAAQ,KAAe,WAAW,GAAG,CAAC;AAAA,QACnF,QAAQ;AAAA,QACR,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAIA,IAAM,kBAAuD;AAAA,EAC3D,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS;AACX;AAEA,IAAM,kBAAN,MAA0C;AAAA,EACxC,IAAI,OAAsC;AACxC,UAAM,YAAY,IAAI;AACtB,UAAM,cAA4B,CAAC;AACnC,UAAM,SAAS,CAAC,MAAwB;AACtC,kBAAY,KAAK,CAAC;AAClB,YAAM,UAAU,OAAO,CAAC;AAAA,IAC1B;AAGA,UAAM,WAAiC;AAAA,MACrC,IAAI,MAAM;AAAA,MACV,MAAM,MAAM;AAAA,MACZ,UAAU,MAAM;AAAA,MAChB,YAAY,MAAM;AAAA,MAClB,QAAQ,EAAE,kBAAkB,MAAM,QAAQ,oBAAoB,KAAK;AAAA,MACnE,cAAc;AAAA,IAChB;AACA,QAAI,MAAM,aAAa,OAAW,UAAS,WAAW,MAAM;AAE5D,UAAM,SAAS,MAAM,SAAS,MAAM,MAAM,MAAM,QAAQ;AACxD,eAAW,KAAK,OAAO,YAAa,QAAO,CAAC;AAC5C,UAAM,MAAM,OAAO;AACnB,UAAM,UAAU,IAAI,MAAM;AAG1B,kBAAc,KAAK,OAAO,WAAW;AAGrC,UAAM,MAAoB;AAAA,MACxB;AAAA,MACA,eAAe,MAAM,QAAQ,UAAU;AAAA,MACvC,YAAY,MAAM;AAAA,MAClB,WAAW,wBAAwB;AAAA,MACnC,UAAU,MAAM;AAAA,IAClB;AACA,UAAM,EAAE,KAAK,WAAW,QAAQ,IAAI,UAAU,KAAK,MAAM,QAAQ,KAAK,aAAa,KAAK,CAAC;AAEzF,QAAI,aAAa;AACjB,UAAM,aAAwC,EAAE,GAAG,gBAAgB;AACnE,eAAW,KAAK,SAAS;AACvB,iBAAW,EAAE,KAAK,IAAI,EAAE;AACxB,iBAAW,KAAK,EAAE,aAAa;AAC7B,oBAAY,KAAK,CAAC;AAClB,cAAM,UAAU,OAAO,CAAC;AAAA,MAC1B;AACA,oBAAc,EAAE,QAAQ;AAAA,IAC1B;AAGA,UAAM,WAAqB;AAAA,MACzB,UAAU,MAAM;AAAA,MAChB,KAAK,CAAC;AAAA,MACN,YAAY,oBAAI,IAAI;AAAA,IACtB;AACA,UAAM,aAA6B;AAAA,MACjC,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,MAChB,MAAM,oBAAoB;AAAA,MAC1B,KAAK,MAAM,SAAS;AAAA,MACpB,cAAc;AAAA,IAChB;AACA,UAAM,UAAyB,MAAM,QAAQ,MAAM,WAAW,UAAU,UAAU;AAClF,eAAW,KAAK,QAAQ,aAAa;AACnC,kBAAY,KAAK,CAAC;AAClB,YAAM,UAAU,OAAO,CAAC;AAAA,IAC1B;AAGA,UAAM,QAAuB;AAAA,MAC3B;AAAA,MACA,UAAU,UAAU,MAAM;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,YAAY,IAAI,IAAI;AAAA,IACtB;AACA,UAAM,UAAiC,QAAQ,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI;AAEtE,WAAO;AAAA,MACL,MAAM,QAAQ;AAAA,MACd,KAAK,QAAQ;AAAA,MACb,SAAS,QAAQ,SAAS,MAAM;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,aAAa,OAAoE;AACxF,QAAM,KAAK,MAAM,QAAQ;AACzB,MAAI,CAAC,GAAI,QAAO;AAChB,SAAO;AAAA,IACL,eAAe,GAAG,iBAAiB;AAAA,IACnC,QAAQ,GAAG,UAAU,CAAC;AAAA,IACtB,mBAAmB,GAAG,qBAAqB;AAAA,IAC3C,mBAAmB,GAAG,qBAAqB;AAAA,EAC7C;AACF;AAEA,SAAS,MAAM,KAAgC;AAC7C,aAAW,OAAO,IAAI,QAAQ,OAAO,EAAG,QAAO,IAAI;AACnD,SAAO;AACT;AAMA,SAAS,MAAc;AACrB,SAAO,OAAO,gBAAgB,eAAe,OAAO,YAAY,QAAQ,aACpE,YAAY,IAAI,IAChB,KAAK,IAAI;AACf;AAGO,SAAS,iBAA2B;AACzC,SAAO,IAAI,gBAAgB;AAC7B;;;ACtMA,SAAS,eAAe,IAAyB;AAC/C,QAAM,MAAgB,CAAC;AACvB,aAAW,OAAO,GAAG,UAAU;AAC7B,QAAI,IAAI,SAAS,SAAU,YAAW,KAAK,IAAI,OAAQ,KAAI,KAAK,EAAE,KAAK;AAAA,EACzE;AACA,SAAO;AACT;AAGA,SAAS,gBAAgB,MAAiB,QAAsC;AAC9E,QAAM,cAA4B,OAAO,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE;AACnE,QAAM,MAAoB,EAAE,MAAM,UAAU,QAAQ,YAAY;AAChE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,CAAC,GAAG;AAAA,IACd,WAAW,KAAK;AAAA,IAChB,UAAU,KAAK;AAAA,IACf,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AACF;AAGA,SAAS,WAAW,GAAsB,GAA+B;AACvE,MAAI,EAAE,WAAW,EAAE,OAAQ,QAAO;AAClC,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,EAAG,KAAI,EAAE,CAAC,MAAM,EAAE,CAAC,EAAG,QAAO;AAChE,SAAO;AACT;AAMO,SAAS,wBACd,KACA,UACA,MACM;AACN,QAAM,OAAO,oBAAoB;AACjC,aAAW,MAAM,WAAW,GAAG,GAAG;AAChC,UAAM,KAAK,WAAW,KAAK,EAAE;AAC7B,QAAI,CAAC,MAAM,CAAC,GAAG,KAAK,QAAS;AAC7B,QAAI,GAAG,QAAQ,UAAU,GAAG,QAAQ,WAAY;AAEhD,UAAM,SAAS,eAAe,GAAG,OAAO;AAGxC,UAAM,MAAmB,EAAE,YAAY,MAAM,KAAK;AAClD,UAAM,UAAU,SAAS,KAAK,GAAG,UAAU,GAAG,EAAE;AAEhD,QAAI,QAAQ,WAAW,EAAG;AAE1B,UAAM,aAAa,IAAI,IAAI,OAAO;AAClC,UAAM,OAAiB,CAAC;AACxB,UAAM,OAAO,oBAAI,IAAY;AAI7B,eAAW,KAAK,QAAQ;AACtB,UAAI,KAAK,IAAI,CAAC,EAAG;AACjB,YAAM,OAAO,WAAW,IAAI,CAAC,KAAK,CAAC,SAAS,cAAc,CAAC,EAAE;AAC7D,UAAI,MAAM;AACR,aAAK,KAAK,CAAC;AACX,aAAK,IAAI,CAAC;AAAA,MACZ;AAAA,IACF;AAEA,eAAW,KAAK,SAAS;AACvB,UAAI,KAAK,IAAI,CAAC,EAAG;AACjB,WAAK,KAAK,CAAC;AACX,WAAK,IAAI,CAAC;AAAA,IACZ;AAEA,QAAI,WAAW,MAAM,MAAM,EAAG;AAC9B,OAAG,UAAU,gBAAgB,GAAG,SAAS,IAAI;AAAA,EAC/C;AACF;;;ACjFA,IAAM,uBAA0C;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,uBAA+C;AACtD,QAAM,aAAa,IAAI,IAAiB,oBAAgD;AACxF,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,YAAY,UAAgC;AAE1C,aAAO,OAAO,QAAQ,EAAE,WAAW,IAAI,KAAK,WAAW,IAAI,QAAQ;AAAA,IACrE;AAAA,EACF;AACF;AAIA,IAAM,iBACJ;AAEF,IAAM,eAAe;AAErB,IAAM,mBAAmB;AAKzB,SAAS,WAAW,KAAqB;AACvC,MAAI,IAAI,IAAI,KAAK,EAAE,QAAQ,QAAQ,GAAG;AAGtC,MAAI,EAAE,QAAQ,0BAA0B,CAAC,IAAI,QAAgB,MAAM,IAAI,YAAY,CAAC;AAGpF,MAAI,EAAE;AAAA,IACJ;AAAA,IACA,CAAC,IAAI,GAAW,GAAW,MAAc,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAAA,EACpE;AAGA,MAAI,EAAE,QAAQ,qBAAqB,kBAAkB;AACrD,MAAI,EAAE,QAAQ,gBAAgB,kBAAkB;AAGhD,MAAI,EAAE,QAAQ,gBAAgB,GAAG;AAGjC,MAAI,EAAE,QAAQ,cAAc,CAAC,IAAI,IAAY,SAAiB;AAC5D,UAAM,QAAQ,KACX,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC7B,WAAO,GAAG,GAAG,YAAY,CAAC,IAAI,MAAM,KAAK,IAAI,CAAC;AAAA,EAChD,CAAC;AAED,SAAO;AACT;AAGA,SAAS,gBAAgB,OAAwB;AAC/C,SAAO,iBAAiB,KAAK,KAAK;AACpC;AAKA,IAAM,YAAiF;AAAA,EACrF,SAAS,CAAC,eAAe,iBAAiB,kBAAkB,cAAc;AAAA,EAC1E,QAAQ,CAAC,cAAc,gBAAgB,iBAAiB,aAAa;AAAA,EACrE,OAAO,CAAC,OAAO,SAAS,UAAU,MAAM;AAAA,EACxC,gBAAgB;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAGA,SAAS,cAAc,OAAyB;AAC9C,QAAM,MAAgB,CAAC;AACvB,MAAI,QAAQ;AACZ,MAAI,MAAM;AACV,aAAW,MAAM,OAAO;AACtB,QAAI,OAAO,IAAK,UAAS;AAAA,aAChB,OAAO,IAAK,SAAQ,KAAK,IAAI,GAAG,QAAQ,CAAC;AAClD,QAAI,UAAU,KAAK,KAAK,KAAK,EAAE,GAAG;AAChC,UAAI,IAAI,SAAS,GAAG;AAClB,YAAI,KAAK,GAAG;AACZ,cAAM;AAAA,MACR;AACA;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,MAAI,IAAI,SAAS,EAAG,KAAI,KAAK,GAAG;AAChC,SAAO;AACT;AAGA,SAAS,aAAa,QAA6D;AACjF,QAAM,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI;AACrB,UAAQ,OAAO,QAAQ;AAAA,IACrB,KAAK;AACH,aAAO,CAAC,GAAI,GAAI,GAAI,CAAE;AAAA,IACxB,KAAK;AACH,aAAO,CAAC,GAAI,GAAI,GAAI,CAAE;AAAA,IACxB,KAAK;AACH,aAAO,CAAC,GAAI,GAAI,GAAI,CAAE;AAAA,IACxB;AACE,aAAO,CAAC,GAAI,GAAI,GAAI,CAAE;AAAA,EAC1B;AACF;AAGA,SAAS,gBAAgB,MAAc,OAAwC;AAC7E,QAAM,MAAM,UAAU,IAAI;AAC1B,MAAI,KAAK;AACP,UAAM,QAAQ,cAAc,KAAK;AACjC,QAAI,MAAM,UAAU,KAAK,MAAM,UAAU,GAAG;AAC1C,YAAM,QAAQ,aAAa,KAAK;AAChC,aAAO,IAAI,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,CAAE,CAAqB;AAAA,IAC7D;AACA,WAAO,CAAC,CAAC,MAAM,KAAK,CAAC;AAAA,EACvB;AAEA,MAAI,SAAS,SAAS,SAAS,YAAY;AACzC,UAAM,QAAQ,cAAc,KAAK;AACjC,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO;AAAA,QACL,CAAC,WAAW,MAAM,CAAC,CAAE;AAAA,QACrB,CAAC,cAAc,MAAM,CAAC,CAAE;AAAA,MAC1B;AAAA,IACF;AACA,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO;AAAA,QACL,CAAC,WAAW,MAAM,CAAC,CAAE;AAAA,QACrB,CAAC,cAAc,MAAM,CAAC,CAAE;AAAA,MAC1B;AAAA,IACF;AACA,WAAO,CAAC,CAAC,MAAM,KAAK,CAAC;AAAA,EACvB;AAEA,SAAO,CAAC,CAAC,MAAM,KAAK,CAAC;AACvB;AAIA,SAAS,SACP,OACA,MACA,UACA,WACW;AACX,QAAM,WAAW,KAAK,KAAK,EAAE,YAAY;AACzC,QAAM,QAAQ,WAAW,QAAQ;AACjC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB,gBAAgB,KAAK;AAAA,IACvC,WAAW,MAAM,YAAY,QAAQ;AAAA,EACvC;AACF;AAEO,SAAS,mBAAoC;AAClD,QAAM,YAAY,qBAAqB;AAEvC,QAAM,uBAAuB,CAC3B,MACA,OACA,cACyB;AACzB,UAAM,IAAI,KAAK,KAAK,EAAE,YAAY;AAClC,UAAM,WAAW,gBAAgB,GAAG,MAAM,KAAK,CAAC;AAChD,WAAO,SAAS,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,SAAS,WAAW,IAAI,IAAI,SAAS,CAAC;AAAA,EAC1E;AAEA,QAAM,iBAAiB,CAAC,MAAmB,QAA0B;AACnE,SAAK;AACL,WAAO,WAAW,GAAG;AAAA,EACvB;AAEA,QAAM,oBAAoB,CAAC,OAA2B;AACpD,UAAM,SAAS,oBAAI,IAA8B;AACjD,eAAW,SAAS,GAAG,OAAO,OAAO,GAAG;AACtC,YAAM,QAAQ,oBAAI,IAA4B;AAE9C,iBAAW,QAAQ,MAAM,MAAM,OAAO,GAAG;AACvC,cAAM,OAAkB;AAAA,UACtB,GAAG;AAAA,UACH,OAAO,WAAW,OAAO,KAAK,KAAK,CAAC;AAAA,UACpC,kBAAkB,gBAAgB,OAAO,KAAK,KAAK,CAAC;AAAA,UACpD,WAAW,UAAU,YAAY,KAAK,QAAQ;AAAA,QAChD;AACA,cAAM,IAAI,KAAK,UAAU,IAAI;AAAA,MAC/B;AAEA,YAAM,SAAS,IAAI;AAAA,QACjB,CAAC,GAAG,MAAM,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAO,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,CAAE;AAAA,MAC9E;AACA,YAAM,MAAM,aAAa,MAAM,SAAS;AACxC,aAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,OAAO,OAAO,CAAC;AAAA,IAC/D;AACA,WAAO,EAAE,OAAO;AAAA,EAClB;AAEA,QAAM,SAAS,CAAC,GAAa,MAAyB;AACpD,UAAM,KAAK,kBAAkB,CAAC;AAC9B,UAAM,KAAK,kBAAkB,CAAC;AAC9B,QAAI,GAAG,OAAO,SAAS,GAAG,OAAO,KAAM,QAAO;AAC9C,eAAW,CAAC,KAAK,MAAM,KAAK,GAAG,QAAQ;AACrC,YAAM,SAAS,GAAG,OAAO,IAAI,GAAG;AAChC,UAAI,CAAC,OAAQ,QAAO;AACpB,UAAI,OAAO,MAAM,SAAS,OAAO,MAAM,KAAM,QAAO;AACpD,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,OAAO;AACxC,cAAM,QAAQ,OAAO,MAAM,IAAI,IAAI;AACnC,YAAI,CAAC,MAAO,QAAO;AACnB,YAAI,MAAM,UAAU,MAAM,SAAS,MAAM,cAAc,MAAM,UAAW,QAAO;AAAA,MACjF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAGO,IAAM,aAA8B,iBAAiB;AASrD,SAAS,gBACd,MACA,SACA,OAAwB,YACf;AACT,QAAM,KAAK,KAAK,kBAAkB,IAAI;AACtC,QAAM,KAAK,KAAK,kBAAkB,OAAO;AACzC,aAAW,CAAC,KAAK,IAAI,KAAK,GAAG,QAAQ;AACnC,UAAM,OAAO,GAAG,OAAO,IAAI,GAAG,KAAK,GAAG,OAAO,IAAI,aAAa,KAAK,SAAS,CAAC;AAC7E,QAAI,CAAC,KAAM,QAAO;AAClB,eAAW,CAAC,MAAM,IAAI,KAAK,KAAK,OAAO;AACrC,YAAM,MAAM,KAAK,MAAM,IAAI,IAAI;AAC/B,UAAI,CAAC,OAAO,IAAI,UAAU,KAAK,MAAO,QAAO;AAAA,IAC/C;AAAA,EACF;AACA,SAAO;AACT;;;ACnUA,SAAS,UAAU,MAAgD;AACjE,QAAM,IAAI;AACV,SAAO,EAAE,SAAS,YAAa,IAAgC;AACjE;AAEA,SAAS,kBACP,IACA,KAC2B;AAC3B,QAAM,MAAiC,CAAC;AACxC,aAAW,WAAW,GAAG,UAAU;AACjC,UAAM,QAAQ,IAAI,IAAI,MAAM,IAAI,OAAO;AACvC,QAAI,SAAS,MAAM,SAAS,UAAW,KAAI,KAAK,KAAgC;AAAA,EAClF;AACA,SAAO;AACT;AAKO,SAAS,OAAO,UAAuC;AAC5D,SAAO,CAAC,MAAM,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC;AAC1D;AAQO,SAAS,IAAI,SAA2B;AAC7C,SAAO,CAAC,MAAM,QAAQ,CAAC,QAAQ,MAAM,GAAG;AAC1C;AAKO,SAAS,UAAU,KAAuB;AAC/C,QAAM,OAAO,KAAK,YAAY;AAC9B,SAAO,CAAC,SAAS;AACf,UAAM,KAAK,UAAU,IAAI;AACzB,QAAI,CAAC,GAAI,QAAO;AAChB,WAAO,SAAS,UAAa,GAAG,IAAI,YAAY,MAAM;AAAA,EACxD;AACF;AAGO,IAAM,wBAAiC,CAAC,MAAM,QAAQ;AAC3D,QAAM,KAAK,UAAU,IAAI;AACzB,MAAI,CAAC,GAAI,QAAO;AAChB,SAAO,kBAAkB,IAAI,GAAG,EAAE,WAAW;AAC/C;AASO,SAAS,SAAS,SAA4B;AACnD,SAAO,CAAC,MAAM,QAAQ;AACpB,UAAM,KAAK,UAAU,IAAI;AACzB,QAAI,CAAC,GAAI,QAAO;AAChB,UAAM,OAAO,IAAI,WAAW,EAAyB,KAAM,GAAG;AAC9D,WAAO,gBAAgB,MAAkB,SAAS,UAAU;AAAA,EAC9D;AACF;AAGA,IAAM,oBAAyC,oBAAI,IAAY;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGD,IAAM,sBAA2C,oBAAI,IAAY;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAOM,IAAM,oBAA6B,CAAC,MAAM,QAAQ;AACvD,QAAM,KAAK,UAAU,IAAI;AACzB,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,GAAG,KAAK,kBAAmB,QAAO;AAEtC,QAAM,cAAc,IAAI,WAAW,EAAyB,KAAM,GAAG;AACrE,QAAM,OAAO,WAAW,kBAAkB,WAAuB;AACjE,aAAW,SAAS,KAAK,OAAO,OAAO,GAAG;AACxC,eAAW,QAAQ,MAAM,MAAM,OAAO,GAAG;AACvC,UAAI,CAAC,kBAAkB,IAAI,OAAO,KAAK,QAAQ,CAAC,EAAG;AACnD,UAAI,CAAC,oBAAoB,IAAI,OAAO,KAAK,KAAK,CAAC,EAAG,QAAO;AAAA,IAC3D;AAAA,EACF;AACA,SAAO;AACT;AAKO,IAAM,SAAkB,CAAC,SAAS,UAAU,IAAI,GAAG,KAAK,UAAU;AAGlE,IAAM,mBAA4B,CAAC,SAAS,UAAU,IAAI,GAAG,KAAK,oBAAoB;AAGtF,IAAM,qBAA8B,CAAC,SAC1C,UAAU,IAAI,GAAG,KAAK,sBAAsB;AAGvC,IAAM,oBAA6B,CAAC,SAAS,UAAU,IAAI,GAAG,QAAQ,cAAc;AAOpF,IAAM,SAAkB,CAAC,MAAM,QAAQ;AAC5C,QAAM,KAAK,UAAU,IAAI;AACzB,MAAI,CAAC,GAAI,QAAO;AAChB,SAAO,IAAI,SAAS,EAA4B;AAClD;AAMO,IAAM,uBAAgC,CAAC,MAAM,QAAQ;AAC1D,QAAM,KAAK,UAAU,IAAI;AACzB,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,GAAG,KAAK,qBAAsB,QAAO;AAEzC,SAAO,IAAI,UAAU,qBAAqB,GAAG,EAAyB;AACxE;;;ACtLA,IAAM,SAAiC,oBAAI,IAAe,CAAC,WAAW,YAAY,SAAS,CAAC;AAC5F,IAAM,gBAA0C,oBAAI,IAAiB,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;AAEjF,SAAS,KAAK,MAAc,KAAoB;AAC9C,QAAM,IAAI,MAAM,iBAAiB,QAAQ,aAAa,MAAM,GAAG,EAAE;AACnE;AAOO,SAAS,gBAAgB,MAAwB;AACtD,MAAI,QAAQ,QAAQ,OAAO,SAAS,UAAU;AAC5C,UAAM,IAAI,MAAM,uCAAuC;AAAA,EACzD;AAEA,QAAM,OAAO,KAAK;AAClB,MAAI,OAAO,SAAS,YAAY,KAAK,WAAW,GAAG;AACjD,SAAK,OAAO,IAAI,GAAG,iCAAiC;AAAA,EACtD;AAEA,MAAI,OAAO,KAAK,aAAa,YAAY,CAAC,KAAK,SAAS,SAAS,GAAG,GAAG;AACrE,SAAK,MAAM,mDAAmD,KAAK,UAAU,KAAK,QAAQ,CAAC,GAAG;AAAA,EAChG;AAEA,QAAM,QAAQ,KAAK,SAAS,MAAM,KAAK,CAAC,EAAE,CAAC;AAC3C,MAAI,CAAC,OAAO,IAAI,KAAK,GAAG;AACtB,SAAK,MAAM,gEAAgE,KAAK,IAAI;AAAA,EACtF;AAEA,MAAI,CAAC,cAAc,IAAI,KAAK,MAAM,GAAG;AACnC,SAAK,MAAM,+BAA+B,KAAK,UAAU,KAAK,MAAM,CAAC,GAAG;AAAA,EAC1E;AAEA,MAAI,OAAO,KAAK,aAAa,YAAY;AACvC,SAAK,MAAM,6BAA6B;AAAA,EAC1C;AAEA,MAAI,KAAK,aAAa,UAAa,CAAC,OAAO,SAAS,KAAK,QAAQ,GAAG;AAClE,SAAK,MAAM,gDAAgD;AAAA,EAC7D;AAEA,SAAO,OAAO,OAAO,EAAE,GAAG,KAAK,CAAC;AAClC;;;AC2IA,SAAS,aAAa,KAAqB;AACzC,MAAI,IAAI,WAAW,IAAI,EAAG,QAAO;AACjC,SAAO,IAAI,QAAQ,UAAU,CAAC,MAAM,IAAI,EAAE,YAAY,CAAC,EAAE;AAC3D;AAGA,SAAS,gBAAgB,OAA6B;AACpD,QAAM,QAAQ,oBAAI,IAA4B;AAC9C,aAAW,CAAC,QAAQ,QAAQ,KAAK,OAAO,QAAQ,KAAK,GAAG;AACtD,UAAM,OAAO,aAAa,MAAM;AAChC,eAAW,QAAQ,WAAW,qBAAqB,MAAM,OAAO,QAAQ,GAAG,KAAK,GAAG;AACjF,YAAM,IAAI,KAAK,UAAU,IAAI;AAAA,IAC/B;AAAA,EACF;AACA,QAAM,QAAoB,EAAE,WAAW,gBAAgB,MAAM;AAC7D,SAAO,EAAE,QAAQ,oBAAI,IAA8B,CAAC,CAAC,aAAa,cAAc,GAAG,KAAK,CAAC,CAAC,EAAE;AAC9F;AAIA,SAASC,WAAU,MAAgD;AACjE,QAAM,IAAI;AACV,SAAO,EAAE,SAAS,YAAa,IAAgC;AACjE;AAEA,SAAS,SAAS,MAA+B;AAC/C,SAAO,CAAC,SAAS,QAAQA,WAAU,IAAI,GAAG,KAAK,IAAI,CAAC;AACtD;AAGA,IAAM,aAAsB,SAAS,kBAAkB;AAMvD,IAAM,0BAAmC,CAAC,MAAM,QAAQ;AACtD,QAAM,KAAKA,WAAU,IAAI;AACzB,MAAI,CAAC,GAAI,QAAO;AAChB,SAAO,IAAI,UAAU,eAAe,GAAG,EAAyB,EAAE,OAAO;AAC3E;AAUA,IAAM,iBAA0B;AAAA,EAC9B,IAAI,MAAM;AAAA,EACV,IAAI,gBAAgB;AAAA,EACpB,IAAI,kBAAkB;AAAA,EACtB,IAAI,UAAU;AAAA,EACd,IAAI,oBAAoB;AAAA,EACxB,IAAI,uBAAuB;AAC7B;AAaA,IAAM,kBAA2B;AAAA,EAC/B,IAAI,iBAAiB;AAAA,EACrB,IAAI,MAAM;AAAA,EACV,IAAI,oBAAoB;AAC1B;AAKA,SAAS,cAAc,UAAwC;AAC7D,UAAQ,SAAS,MAAM,KAAK,CAAC,EAAE,CAAC,GAAgB;AAAA,IAC9C,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,wBAAwB,GAA8B;AAC7D,QAAM,QAAmB,CAAC,UAAU,EAAE,GAAG,CAAC;AAC1C,MAAI,EAAE,MAAO,OAAM,KAAK,SAAS,gBAAgB,EAAE,KAAK,CAAC,CAAC;AAC1D,MAAI,EAAE,cAAc,UAAW,OAAM,KAAK,qBAAqB;AAC/D,MAAI,EAAE,cAAe,OAAM,KAAK,IAAI,iBAAiB,CAAC;AACtD,MAAI,EAAE,OAAO;AACX,UAAM,QAAQ,MAAM,QAAQ,EAAE,KAAK,IAAK,EAAE,QAA+B,CAAC,EAAE,KAAgB;AAC5F,eAAW,KAAK,MAAO,OAAM,KAAK,CAAC;AAAA,EACrC;AACA,SAAO,IAAI,GAAG,KAAK;AACrB;AAEA,SAAS,aACP,OACA,UACS;AAET,MAAI,OAAO,UAAU,WAAY,QAAO;AAExC,QAAM,cAAc,wBAAwB,SAAS,CAAC,CAAC;AACvD,QAAM,SAAS,cAAc,QAAQ;AACrC,QAAM,UAAU,SAAS,IAAI,aAAa,MAAM,IAAI;AACpD,SAAO,CAAC,MAAM,QAAQ,QAAQ,MAAM,GAAG;AACzC;AAKA,SAAS,cAAc,IAAc,MAAqC;AACxE,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,YAAM,YAAY,KAAK,YAAY,CAAC,GAAG;AAAA,QACrC,CAAC,MAAM,EAAE,EAAE,SAAS,WAAW,KAAK,IAAI,EAAE,SAAS;AAAA,MACrD;AACA,YAAM,OAAkB,EAAE,GAAG,KAAK;AAClC,aAAQ,KAA+C;AACvD,YAAM,OAAkB,SAAS,SAAS,IAAI,EAAE,GAAG,MAAM,UAAU,SAAS,IAAI;AAChF,YAAM,IAAI,MAAM,IAAI;AAAA,IACtB;AACA,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAEA,SAAS,mBAAmB,QAAsC;AAChE,QAAM,aAAa,OAAO,aAAa,gBAAgB,OAAO,UAAU,IAAI;AAC5E,QAAM,OAAO,OAAO,kBAAkB;AACtC,SAAO,CAAC,KAAK,OAAO;AAClB,UAAM,UAAU,IAAI;AACpB,UAAM,QAAQ,IAAI,iBAAiB;AACnC,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,MAAwB,CAAC;AAC/B,QAAI,KAAM,KAAI,KAAK,GAAG,oBAAoB,SAAS,OAAO,EAAE,YAAY,MAAM,CAAC,CAAC;AAChF,QAAI,WAAY,KAAI,KAAK,GAAG,WAAW,OAAO,MAAM,YAAY,aAAa,CAAC;AAC9E,QAAI,KAAK,GAAG,OAAO,OAAO,CAAC;AAC3B,WAAO;AAAA,EACT;AACF;AAEA,SAAS,eAAe,SAA+C;AACrE,MAAI,OAAO,YAAY,WAAY,QAAO;AAE1C,MAAI,iBAAiB,QAAS,QAAO,mBAAmB,OAAO;AAE/D,MAAI,oBAAoB,SAAS;AAC/B,UAAM,iBAAiB,QAAQ,kBAAkB;AACjD,WAAO,CAAC,KAAK,OAAO;AAClB,YAAM,OAAO,QAAQ,eAAe,IAAI,SAAS,GAAG,GAAG;AACvD,UAAI,CAAC,KAAM,QAAO;AAClB,aAAO,CAAC,GAAG,aAAa,IAAI,MAAM,MAAM,cAAc,CAAC;AAAA,IACzD;AAAA,EACF;AAEA,MAAI,iBAAiB,SAAS;AAC5B,UAAM,iBAAiB,QAAQ,kBAAkB;AACjD,WAAO,CAAC,KAAK,OAAO;AAClB,YAAM,OAAO,IAAI,IAAY,QAAQ,YAAY,IAAI,SAAS,GAAG,GAAG,CAAC;AACrE,UAAI,KAAK,SAAS,EAAG,QAAO;AAC5B,aAAO,CAAC,GAAG,aAAa,IAAI,MAAM,cAAc,IAAI,SAAS,GAAG,IAAI,GAAG,cAAc,CAAC;AAAA,IACxF;AAAA,EACF;AAGA,QAAM,QAAQ,gBAAgB,QAAQ,UAAU;AAChD,QAAM,aAAa,QAAQ,cAAc;AACzC,SAAO,CAAC,KAAK,OAAO,CAAC,GAAG,WAAW,IAAI,MAAM,MAAM,OAAO,UAAU,CAAC;AACvE;AASO,SAAS,cAAc,QAAwC;AACpE,QAAM,UAAU,aAAa,OAAO,OAAO,OAAO,QAAQ;AAC1D,QAAM,YAAY,eAAe,OAAO,OAAO;AAE/C,QAAM,OAAwB;AAAA,IAC5B,MAAM,OAAO;AAAA,IACb,UAAU,OAAO;AAAA,IACjB,QAAQ,OAAO;AAAA,IACf,UAAU,OAAO;AAAA,IACjB,cAAc,OAAO;AAAA,IACrB,KAAK,OAAO;AAAA,IACZ,MAAM,OAAO;AAAA,IACb,SAAS,KAAmB,IAAwC;AAClE,UAAI,CAAC,QAAQ,IAAI,MAA6B,GAAG,EAAG,QAAO;AAC3D,YAAM,MAAM,UAAU,KAAK,EAAE;AAC7B,UAAI,CAAC,OAAO,IAAI,WAAW,EAAG,QAAO;AACrC,aAAO,EAAE,IAAI;AAAA,IACf;AAAA,EACF;AAGA,SAAO,gBAAgB,IAAI;AAC7B;;;AClXA,SAAS,KAAK,MAAgD;AAC5D,QAAM,IAAI;AACV,SAAO,EAAE,SAAS,YAAa,IAAgC;AACjE;AAEA,SAAS,OAAO,MAA+C;AAC7D,SAAO,KAAK,IAAI,GAAG,QAAQ;AAC7B;AAOA,IAAM,2BAAoC,CAAC,SAAS,OAAO,IAAI,GAAG,4BAA4B;AAG9F,IAAM,iBAA0B,CAAC,SAAS,OAAO,IAAI,GAAG,kBAAkB;AAC1E,IAAM,kBAA2B,CAAC,SAAS,OAAO,IAAI,GAAG,eAAe;AAGxE,IAAM,cAAuB,CAAC,SAAS;AACrC,QAAM,KAAK,KAAK,IAAI;AACpB,MAAI,CAAC,GAAI,QAAO;AAChB,SAAO,GAAG,MAAM,QAAQ,OAAO,KAAK,GAAG,MAAM,QAAQ,SAAS;AAChE;AAMA,IAAM,6BAAsC,CAAC,MAAM,QAAQ;AACzD,QAAM,KAAK,KAAK,IAAI;AACpB,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,GAAG,KAAK,2BAA4B,QAAO;AAC/C,SAAO,IAAI,UAAU,2BAA2B,GAAG,EAAyB;AAC9E;AAQO,IAAM,yBAAyB,cAAc;AAAA,EAClD,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAGF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAMJ;AAAA,EACA,OAAO;AAAA,IACL,KAAK;AAAA,IACL,OAAO,EAAE,SAAS,WAAW;AAAA,IAC7B,WAAW;AAAA,IACX,eAAe;AAAA,IACf,OAAO;AAAA,MACL,IAAI,wBAAwB;AAAA,MAC5B,IAAI,WAAW;AAAA,MACf,IAAI,iBAAiB;AAAA,MACrB,IAAI,cAAc;AAAA,MAClB,IAAI,eAAe;AAAA,MACnB,IAAI,0BAA0B;AAAA,IAChC;AAAA,EACF;AAAA,EACA,SAAS,EAAE,aAAa,QAAQ;AAAA,EAChC,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA,QAGE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,SAAS;AAAA;AAAA,MAEP;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AC9FD,SAASC,MAAK,MAAgD;AAC5D,QAAM,IAAI;AACV,SAAO,EAAE,SAAS,YAAa,IAAgC;AACjE;AAGA,SAASC,UAAS,MAA+B;AAC/C,SAAO,CAAC,SAAS,QAAQD,MAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AACjD;AAGA,IAAM,iBAAiBC,UAAS,gBAAgB;AAEhD,IAAM,+BAA+BA,UAAS,8BAA8B;AAE5E,IAAM,6BAA6BA,UAAS,4BAA4B;AAExE,IAAM,oBAAoBA,UAAS,mBAAmB;AAEtD,IAAMC,4BAA2BD,UAAS,0BAA0B;AAOpE,IAAME,8BAAsC,CAAC,MAAM,QAAQ;AACzD,QAAM,KAAKH,MAAK,IAAI;AACpB,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,GAAG,KAAK,2BAA4B,QAAO;AAC/C,SAAO,IAAI,UAAU,2BAA2B,GAAG,EAAyB;AAC9E;AAEA,IAAMI,WAAU;AAOhB,IAAM,qBAA8B,CAAC,MAAM,QAAQ;AACjD,QAAM,KAAKJ,MAAK,IAAI;AACpB,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,KAAe,IAAI,WAAW,EAAyB,KAAM,GAAG;AACtE,aAAW,SAAS,GAAG,OAAO,OAAO,GAAG;AACtC,UAAM,OAAO,MAAM,MAAM,IAAII,QAAO;AACpC,QAAI,QAAQ,OAAO,KAAK,KAAK,MAAM,QAAS,QAAO;AAAA,EACrD;AACA,SAAO;AACT;AAOO,IAAM,gBAAgB,cAAc;AAAA,EACzC,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,OAAO;AAAA,IACL,KAAK;AAAA,IACL,WAAW;AAAA,IACX,eAAe;AAAA,IACf,OAAO;AAAA,MACL,IAAI,kBAAkB;AAAA,MACtB,IAAI,cAAc;AAAA,MAClB,IAAI,4BAA4B;AAAA,MAChC,IAAI,0BAA0B;AAAA,MAC9B,IAAI,iBAAiB;AAAA,MACrB,IAAIF,yBAAwB;AAAA,MAC5B,IAAIC,2BAA0B;AAAA,IAChC;AAAA,EACF;AAAA,EACA,SAAS,EAAE,aAAa,QAAQ;AAAA,EAChC,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA,QAEE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,SAAS;AAAA;AAAA,MAEP;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AClHM,IAAM,oBAAoB,cAAc;AAAA,EAC7C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAEJ;AAAA,EACA,OAAO;AAAA,IACL,KAAK;AAAA,IACL,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,SAAS;AAAA,IACzE,WAAW;AAAA,IACX,eAAe;AAAA,EACjB;AAAA,EACA,SAAS;AAAA,IACP,aAAa;AAAA,IACb,YAAY,EAAE,WAAW,SAAS;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM;AAAA,IACJ,SAAS;AAAA;AAAA;AAAA,MAGP;AAAA;AAAA,MAIA;AAAA;AAAA,MAEA;AAAA,IAGF;AAAA,EACF;AACF,CAAC;;;AC9CM,IAAM,0BAA0B,cAAc;AAAA,EACnD,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QACE;AAAA,IACF,OAAO;AAAA,IACP,iBACE;AAAA,EAEJ;AAAA,EACA,OAAO;AAAA,IACL,KAAK;AAAA,IACL,OAAO,EAAE,SAAS,eAAe,YAAY,UAAU,gBAAgB,SAAS;AAAA,IAChF,WAAW;AAAA,IACX,eAAe;AAAA,EACjB;AAAA,EACA,SAAS;AAAA,IACP,aAAa;AAAA,IACb,YAAY,EAAE,WAAW,SAAS;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM;AAAA,IACJ,SAAS;AAAA;AAAA,MAEP;AAAA;AAAA,MAIA;AAAA;AAAA,MAEA;AAAA,IAGF;AAAA,EACF;AACF,CAAC;;;AClBD,SAAS,sBAAsB,OAAyD;AACtF,QAAM,MAAM,oBAAI,IAA4B;AAC5C,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO;AACjC,eAAW,QAAQ,WAAW,qBAAqB,MAAM,OAAO,KAAK,GAAG;AACtE,UAAI,IAAI,KAAK,UAAU,IAAI;AAAA,IAC7B;AAAA,EACF;AACA,QAAM,QAAoB,EAAE,WAAW,gBAAgB,OAAO,IAAI;AAClE,QAAM,SAAS,oBAAI,IAA8B,CAAC,CAAC,aAAa,cAAc,GAAG,KAAK,CAAC,CAAC;AACxF,SAAO,EAAE,OAAO;AAClB;AAGA,IAAM,eAAyB,sBAAsB,CAAC,CAAC,WAAW,MAAM,CAAC,CAAC;AAM1E,IAAM,4BAAiD,oBAAI,IAAY;AAAA,EACrE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AASD,SAAS,eAAe,IAAuB;AAC7C,QAAM,OAAO,WAAW,kBAAkB,EAAE;AAC5C,aAAW,SAAS,KAAK,OAAO,OAAO,GAAG;AACxC,eAAW,QAAQ,MAAM,MAAM,OAAO,GAAG;AACvC,UAAI,0BAA0B,IAAI,OAAO,KAAK,QAAQ,CAAC,EAAG;AAC1D,UAAI,KAAK,UAAW;AACpB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAOA,SAAS,aAAa,OAAiB,OAA0B;AAC/D,QAAM,IAAI,WAAW,kBAAkB,KAAK;AAC5C,QAAM,IAAI,WAAW,kBAAkB,KAAK;AAC5C,aAAW,CAAC,KAAK,MAAM,KAAK,EAAE,QAAQ;AACpC,UAAM,SAAS,EAAE,OAAO,IAAI,GAAG;AAC/B,QAAI,CAAC,OAAQ;AACb,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,OAAO;AACxC,UAAI,CAAC,0BAA0B,IAAI,OAAO,IAAI,CAAC,EAAG;AAClD,YAAM,QAAQ,OAAO,MAAM,IAAI,IAAI;AACnC,UAAI,SAAS,MAAM,UAAU,MAAM,MAAO,QAAO;AAAA,IACnD;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,iBAAiB,IAAwB;AAChD,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAI,0BAA0B,IAAI,OAAO,IAAI,CAAC,EAAG,OAAM,IAAI,MAAM,IAAI;AAAA,IACvE;AACA,QAAI,MAAM,OAAO,EAAG,QAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EAC3E;AACA,SAAO,EAAE,OAAO;AAClB;AAGA,IAAM,cAAuB;AAAA,EAC3B,UAAU,KAAK;AAAA,EACf,SAAS,YAAY;AAAA,EACrB,IAAI,oBAAoB;AAC1B;AAOO,IAAM,kBAAkB,cAAc;AAAA,EAC3C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAGF,QACE;AAAA,IAEF,OAAO;AAAA,IACP,iBACE;AAAA,EAGJ;AAAA,EACA,OAAO;AAAA,IACL,KAAK;AAAA,IACL,OAAO,EAAE,SAAS,OAAO;AAAA,IACzB,WAAW;AAAA,IACX,eAAe;AAAA,EACjB;AAAA,EACA,SAAS,CAAC,KAAmB,OAAyD;AACpF,UAAM,QAAQ,IAAI;AAClB,UAAM,QAAQ,IAAI,iBAAiB;AACnC,QAAI,CAAC,MAAO,QAAO;AACnB,QAAI,CAAC,YAAY,OAA8B,GAAG,EAAG,QAAO;AAE5D,UAAM,aAAa,IAAI,SAAS;AAChC,UAAM,aAAa,IAAI,WAAW,KAA4B;AAG9D,QAAI,CAAC,eAAe,UAAU,EAAG,QAAO;AAExC,QAAI,aAAa,YAAY,UAAU,EAAG,QAAO;AAEjD,WAAO;AAAA;AAAA,MAEL,GAAG,oBAAoB,OAAO,OAAO,EAAE,YAAY,MAAM,CAAC;AAAA;AAAA;AAAA,MAG1D,GAAG,WAAW,OAAO,MAAM,iBAAiB,UAAU,GAAG,aAAa;AAAA;AAAA,MAEtE,GAAG,OAAO,KAAK;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM;AAAA,IACJ,SAAS;AAAA;AAAA;AAAA,MAGP;AAAA;AAAA,MAEA;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AC/JD,SAASE,uBAAsB,OAAyD;AACtF,QAAM,MAAM,oBAAI,IAA4B;AAC5C,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO;AACjC,eAAW,QAAQ,WAAW,qBAAqB,MAAM,OAAO,KAAK,GAAG;AACtE,UAAI,IAAI,KAAK,UAAU,IAAI;AAAA,IAC7B;AAAA,EACF;AACA,QAAM,QAAoB,EAAE,WAAW,gBAAgB,OAAO,IAAI;AAClE,QAAM,SAAS,oBAAI,IAA8B,CAAC,CAAC,aAAa,cAAc,GAAG,KAAK,CAAC,CAAC;AACxF,SAAO,EAAE,OAAO;AAClB;AAGA,IAAM,eAAyBA,uBAAsB,CAAC,CAAC,WAAW,MAAM,CAAC,CAAC;AAM1E,IAAM,4BAAiD,oBAAI,IAAY;AAAA,EACrE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AASD,SAASC,gBAAe,IAAuB;AAC7C,QAAM,OAAO,WAAW,kBAAkB,EAAE;AAC5C,aAAW,SAAS,KAAK,OAAO,OAAO,GAAG;AACxC,eAAW,QAAQ,MAAM,MAAM,OAAO,GAAG;AACvC,UAAI,0BAA0B,IAAI,OAAO,KAAK,QAAQ,CAAC,EAAG;AAC1D,UAAI,KAAK,UAAW;AACpB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAOA,SAAS,aAAa,OAAiB,OAA0B;AAC/D,QAAM,IAAI,WAAW,kBAAkB,KAAK;AAC5C,QAAM,IAAI,WAAW,kBAAkB,KAAK;AAC5C,aAAW,CAAC,KAAK,MAAM,KAAK,EAAE,QAAQ;AACpC,UAAM,SAAS,EAAE,OAAO,IAAI,GAAG;AAC/B,QAAI,CAAC,OAAQ;AACb,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,OAAO;AACxC,UAAI,CAAC,0BAA0B,IAAI,OAAO,IAAI,CAAC,EAAG;AAClD,YAAM,QAAQ,OAAO,MAAM,IAAI,IAAI;AACnC,UAAI,SAAS,MAAM,UAAU,MAAM,MAAO,QAAO;AAAA,IACnD;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,iBAAiB,IAAwB;AAChD,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAI,0BAA0B,IAAI,OAAO,IAAI,CAAC,EAAG,OAAM,IAAI,MAAM,IAAI;AAAA,IACvE;AACA,QAAI,MAAM,OAAO,EAAG,QAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EAC3E;AACA,SAAO,EAAE,OAAO;AAClB;AAGA,IAAM,cAAuB;AAAA,EAC3B,UAAU,KAAK;AAAA,EACf,SAAS,YAAY;AAAA,EACrB,IAAI,oBAAoB;AAC1B;AAOO,IAAM,kBAAkB,cAAc;AAAA,EAC3C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAGF,QACE;AAAA,IAEF,OAAO;AAAA,IACP,iBACE;AAAA,EAGJ;AAAA,EACA,OAAO;AAAA,IACL,KAAK;AAAA,IACL,OAAO,EAAE,SAAS,OAAO;AAAA,IACzB,WAAW;AAAA,IACX,eAAe;AAAA,EACjB;AAAA,EACA,SAAS,CAAC,KAAmB,OAAyD;AACpF,UAAM,QAAQ,IAAI;AAClB,UAAM,QAAQ,IAAI,iBAAiB;AACnC,QAAI,CAAC,MAAO,QAAO;AACnB,QAAI,CAAC,YAAY,OAA8B,GAAG,EAAG,QAAO;AAE5D,UAAM,aAAa,IAAI,SAAS;AAChC,UAAM,aAAa,IAAI,WAAW,KAA4B;AAG9D,QAAI,CAACA,gBAAe,UAAU,EAAG,QAAO;AAExC,QAAI,aAAa,YAAY,UAAU,EAAG,QAAO;AAEjD,WAAO;AAAA;AAAA,MAEL,GAAG,oBAAoB,OAAO,OAAO,EAAE,YAAY,MAAM,CAAC;AAAA;AAAA;AAAA,MAG1D,GAAG,WAAW,OAAO,MAAM,iBAAiB,UAAU,GAAG,aAAa;AAAA;AAAA,MAEtE,GAAG,OAAO,KAAK;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM;AAAA,IACJ,SAAS;AAAA;AAAA;AAAA,MAGP;AAAA;AAAA,MAEA;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;ACpLD,SAASC,QAAO,MAA+C;AAC7D,QAAM,IAAI;AACV,SAAO,EAAE,SAAS,YAAa,EAA8B,OAAO;AACtE;AAEA,SAAS,UAAU,MAAgD;AACjE,QAAM,IAAI;AACV,SAAO,EAAE,SAAS,YAAa,IAAgC;AACjE;AAOA,IAAM,qBAA8B,CAAC,SAAS;AAC5C,QAAM,IAAIA,QAAO,IAAI;AACrB,MAAI,CAAC,EAAG,QAAO;AACf,SACE,EAAE,kBACF,EAAE,gCACF,EAAE,8BACF,EAAE,qBACF,EAAE;AAEN;AAGA,IAAMC,kBAA0B,CAAC,SAASD,QAAO,IAAI,GAAG,kBAAkB;AAC1E,IAAME,mBAA2B,CAAC,SAASF,QAAO,IAAI,GAAG,eAAe;AAGxE,IAAMG,eAAuB,CAAC,SAAS;AACrC,QAAM,KAAK,UAAU,IAAI;AACzB,MAAI,CAAC,GAAI,QAAO;AAChB,SAAO,GAAG,MAAM,QAAQ,OAAO,KAAK,GAAG,MAAM,QAAQ,SAAS;AAChE;AAMA,IAAMC,8BAAsC,CAAC,MAAM,QAAQ;AACzD,QAAM,KAAK,UAAU,IAAI;AACzB,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,GAAG,KAAK,2BAA4B,QAAO;AAC/C,SAAO,IAAI,UAAU,2BAA2B,GAAG,EAAyB;AAC9E;AAQO,IAAM,qBAAqB,cAAc;AAAA,EAC9C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,OAAO;AAAA,IACL,KAAK;AAAA,IACL,WAAW;AAAA,IACX,eAAe;AAAA,IACf,OAAO;AAAA,MACL,IAAI,kBAAkB;AAAA,MACtB,IAAID,YAAW;AAAA,MACf,IAAI,iBAAiB;AAAA,MACrB,IAAIF,eAAc;AAAA,MAClB,IAAIC,gBAAe;AAAA,MACnB,IAAIE,2BAA0B;AAAA,IAChC;AAAA,EACF;AAAA,EACA,SAAS,EAAE,aAAa,QAAQ;AAAA,EAChC,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA,QAGE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,SAAS;AAAA;AAAA,MAEP;AAAA;AAAA;AAAA,MAGA;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;ACnGD,SAAS,0BAA0B,MAAgB,KAA4B;AAC7E,QAAM,KAAK;AACX,MAAI,GAAG,SAAS,UAAW,QAAO;AAElC,QAAM,WAAW,GAAG;AACpB,MAAI,YAAY,KAAM,QAAO;AAE7B,QAAM,SAAS,IAAI,IAAI,MAAM,IAAI,QAAQ;AACzC,MAAI,CAAC,UAAU,OAAO,SAAS,WAAY,QAAO;AAGlD,MAAI,OAAO,UAAU,KAAM,QAAO;AAGlC,MAAI,OAAO,SAAS,WAAW,EAAG,QAAO;AAIzC,QAAM,IAAI,OAAO;AACjB,MACE,EAAE,UACF,EAAE,UACF,EAAE,oBACF,EAAE,sBACF,EAAE,oBACF,EAAE,kBACF,EAAE,aACF;AACA,WAAO;AAAA,EACT;AAIA,MAAI,EAAE,wBAAwB,EAAE,2BAA4B,QAAO;AACnE,QAAM,MAAM;AACZ,MAAI,IAAI,UAAU,qBAAqB,GAAG,KAAK,IAAI,UAAU,2BAA2B,GAAG,GAAG;AAC5F,WAAO;AAAA,EACT;AACA,MAAI,IAAI,UAAU,eAAe,GAAG,EAAE,OAAO,EAAG,QAAO;AAEvD,SAAO;AACT;AASO,IAAM,oBAAoB,cAAc;AAAA,EAC7C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAGJ;AAAA,EACA,OAAO;AAAA,EACP,SAAS,CAAC,KAAmB,OAAyD;AACpF,UAAM,WAAW,IAAI,KAAK;AAC1B,QAAI,YAAY,KAAM,QAAO;AAC7B,UAAM,WAAW,IAAI,IAAI,MAAM,IAAI,QAAQ;AAC3C,QAAI,CAAC,YAAY,SAAS,SAAS,WAAY,QAAO;AAEtD,WAAO,CAAC,GAAG,OAAO,QAAkC,CAAC;AAAA,EACvD;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA,QAGE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,SAAS;AAAA;AAAA,MAEP;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AC3FD,SAASC,MAAK,MAAgD;AAC5D,QAAM,IAAI;AACV,SAAO,EAAE,SAAS,YAAa,IAAgC;AACjE;AAEA,SAASC,QAAO,MAA+C;AAC7D,SAAOD,MAAK,IAAI,GAAG,QAAQ;AAC7B;AAOA,IAAME,sBAA8B,CAAC,SAAS;AAC5C,QAAM,IAAID,QAAO,IAAI;AACrB,MAAI,CAAC,EAAG,QAAO;AACf,SACE,EAAE,kBACF,EAAE,gCACF,EAAE,8BACF,EAAE,qBACF,EAAE;AAEN;AAGA,IAAME,kBAA0B,CAAC,SAASF,QAAO,IAAI,GAAG,kBAAkB;AAC1E,IAAMG,mBAA2B,CAAC,SAASH,QAAO,IAAI,GAAG,eAAe;AAGxE,IAAMI,eAAuB,CAAC,SAAS;AACrC,QAAM,KAAKL,MAAK,IAAI;AACpB,MAAI,CAAC,GAAI,QAAO;AAChB,SAAO,GAAG,MAAM,QAAQ,OAAO,KAAK,GAAG,MAAM,QAAQ,SAAS;AAChE;AAMA,IAAMM,8BAAsC,CAAC,MAAM,QAAQ;AACzD,QAAM,KAAKN,MAAK,IAAI;AACpB,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,GAAG,KAAK,2BAA4B,QAAO;AAC/C,SAAO,IAAI,UAAU,2BAA2B,GAAG,EAAyB;AAC9E;AAEA,IAAMO,WAAU;AAOhB,IAAM,sBAA+B,CAAC,MAAM,QAAQ;AAClD,QAAM,KAAKP,MAAK,IAAI;AACpB,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,KAAe,IAAI,WAAW,EAAyB,KAAM,GAAG;AACtE,aAAW,SAAS,GAAG,OAAO,OAAO,GAAG;AACtC,UAAM,OAAO,MAAM,MAAM,IAAIO,QAAO;AACpC,QAAI,QAAQ,OAAO,KAAK,KAAK,MAAM,SAAU,QAAO;AAAA,EACtD;AACA,SAAO;AACT;AAQO,IAAM,yBAAyB,cAAc;AAAA,EAClD,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAKJ;AAAA,EACA,OAAO;AAAA,IACL,KAAK;AAAA,IACL,WAAW;AAAA,IACX,eAAe;AAAA,IACf,OAAO;AAAA,MACL,IAAI,mBAAmB;AAAA,MACvB,IAAIL,mBAAkB;AAAA,MACtB,IAAIG,YAAW;AAAA,MACf,IAAI,iBAAiB;AAAA,MACrB,IAAIF,eAAc;AAAA,MAClB,IAAIC,gBAAe;AAAA,MACnB,IAAIE,2BAA0B;AAAA,IAChC;AAAA,EACF;AAAA,EACA,SAAS,EAAE,aAAa,QAAQ;AAAA,EAChC,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA,QAGE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,SAAS;AAAA;AAAA,MAEP;AAAA;AAAA,MAEA;AAAA;AAAA,MAEA;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AC7HD,IAAM,UAAU;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,aAAkC,IAAI,IAAY,OAAO;AAE/D,IAAM,WAAyB,aAAa,cAAc;AAE1D,IAAM,SAAS;AAGf,IAAM,yBAA8C,oBAAI,IAAY;AAAA,EAClE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAcD,SAAS,cAAc,IAAiC;AACtD,QAAM,QAAQ,GAAG,OAAO,IAAI,QAAQ;AACpC,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,UAAuB,CAAC;AAC9B,aAAW,UAAU,SAAS;AAC5B,UAAM,OAAO,MAAM,MAAM,IAAI,MAAqB;AAClD,QAAI,CAAC,KAAM,QAAO;AAClB,YAAQ,KAAK,IAAI;AAAA,EACnB;AAGA,QAAM,YAAY,QAAQ,CAAC,EAAG;AAC9B,MAAI,CAAC,QAAQ,MAAM,CAAC,MAAM,EAAE,cAAc,SAAS,EAAG,QAAO;AAE7D,QAAM,QAAQ,OAAO,QAAQ,CAAC,EAAG,KAAK;AACtC,MAAI,uBAAuB,IAAI,KAAK,EAAG,QAAO;AAC9C,MAAI,CAAC,QAAQ,MAAM,CAAC,MAAM,OAAO,EAAE,KAAK,MAAM,KAAK,EAAG,QAAO;AAE7D,QAAM,WAAW,QAAQ,KAAK,CAAC,MAAM,EAAE,gBAAgB;AACvD,SAAO,EAAE,OAAO,WAAW,SAAS;AACtC;AAKA,SAAS,iBAAiB,IAAc,MAA4B;AAClE,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,QAAI,QAAQ,UAAU;AACpB,aAAO,IAAI,KAAK,KAAK;AACrB;AAAA,IACF;AACA,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAI,WAAW,IAAI,OAAO,IAAI,CAAC,EAAG;AAClC,YAAM,IAAI,MAAM,IAAI;AAAA,IACtB;AACA,UAAM,YAAuB;AAAA,MAC3B,UAAU;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK;AAAA,MAChB,kBAAkB,KAAK;AAAA,MACvB,WAAW;AAAA;AAAA,IACb;AACA,UAAM,IAAI,UAAU,UAAU,SAAS;AACvC,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAKO,IAAM,wBAAwB,cAAc;AAAA,EACjD,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeE,WAAqC;AAClD,YAAM,OAAO,cAAcA,SAAQ;AACnC,aAAO,OAAO,iBAAiBA,WAAU,IAAI,IAAI;AAAA,IACnD;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,iEAAiE;AAAA,EAC7E;AACF,CAAC;;;AC3HD,IAAM,cAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,iBAAsC,IAAI,IAAY,WAAW;AAEvE,IAAMC,YAAyB,aAAa,cAAc;AAE1D,IAAM,eAAe;AAcrB,SAAS,aAAa,IAAgC;AACpD,QAAM,QAAQ,GAAG,OAAO,IAAIA,SAAQ;AACpC,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,QAAqB,CAAC;AAC5B,aAAW,QAAQ,aAAa;AAC9B,UAAM,OAAO,MAAM,MAAM,IAAI,IAAmB;AAChD,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,QAAM,CAAC,KAAK,OAAO,QAAQ,IAAI,IAAI;AAGnC,MACE,EACE,IAAI,cAAc,MAAM,aACxB,MAAM,cAAc,OAAO,aAC3B,OAAO,cAAc,KAAK,YAE5B;AACA,WAAO;AAAA,EACT;AAEA,QAAM,KAAK,OAAO,IAAI,KAAK;AAC3B,QAAM,KAAK,OAAO,MAAM,KAAK;AAC7B,QAAM,KAAK,OAAO,OAAO,KAAK;AAC9B,QAAM,KAAK,OAAO,KAAK,KAAK;AAG5B,MAAI,OAAO,MAAM,OAAO,GAAI,QAAO;AAEnC,QAAM,QAAQ,OAAO,KAAK,KAAK,GAAG,EAAE,IAAI,EAAE;AAC1C,QAAM,WAAW,MAAM,KAAK,CAAC,MAAM,EAAE,gBAAgB;AACrD,SAAO,EAAE,OAAO,WAAW,IAAI,WAAW,SAAS;AACrD;AAKA,SAAS,gBAAgB,IAAc,MAA2B;AAChE,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,QAAI,QAAQA,WAAU;AACpB,aAAO,IAAI,KAAK,KAAK;AACrB;AAAA,IACF;AACA,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAI,eAAe,IAAI,OAAO,IAAI,CAAC,EAAG;AACtC,YAAM,IAAI,MAAM,IAAI;AAAA,IACtB;AACA,UAAM,YAAuB;AAAA,MAC3B,UAAU;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK;AAAA,MAChB,kBAAkB,KAAK;AAAA,MACvB,WAAW;AAAA;AAAA,IACb;AACA,UAAM,IAAI,UAAU,UAAU,SAAS;AACvC,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAKO,IAAM,kBAAkB,cAAc;AAAA,EAC3C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAGF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAKJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeC,WAAqC;AAClD,YAAM,OAAO,aAAaA,SAAQ;AAClC,aAAO,OAAO,gBAAgBA,WAAU,IAAI,IAAI;AAAA,IAClD;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,mFAAmF;AAAA,EAC/F;AACF,CAAC;;;AClID,SAAS,qBAAqBC,WAG5B;AACA,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,WAAW,oBAAI,IAAY;AACjC,aAAW,SAASA,UAAS,OAAO,OAAO,GAAG;AAC5C,eAAW,QAAQ,MAAM,MAAM,OAAO,GAAG;AACvC,UAAI,KAAK,UAAU,KAAK,OAAO,SAAS,QAAS,SAAQ,IAAI,KAAK,OAAO,SAAS;AAClF,iBAAW,KAAK,KAAK,YAAY,CAAC,GAAG;AACnC,YAAI,EAAE,SAAS,QAAS,UAAS,IAAI,EAAE,SAAS;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,SAAS,SAAS;AAC7B;AAQO,IAAM,gBAAgB,cAAc;AAAA,EACzC,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAKJ;AAAA,EACA,SAAS;AAAA,IACP,YAAYA,WAAoB,KAAqC;AACnE,YAAM,EAAE,SAAS,SAAS,IAAI,qBAAqBA,SAAQ;AAC3D,YAAM,OAAO,oBAAI,IAAY;AAC7B,iBAAW,OAAO,UAAU;AAE1B,YAAI,QAAQ,IAAI,GAAG,EAAG;AAEtB,YAAI,CAAC,IAAI,SAAS,cAAc,GAAG,EAAE,UAAW;AAChD,aAAK,IAAI,GAAG;AAAA,MACd;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,yCAAyC;AAAA,EACrD;AACF,CAAC;;;AC1ED,IAAM,UAAU;AAChB,IAAM,aAAa;AACnB,IAAM,MAAM;AAEZ,IAAMC,YAAyB,aAAa,cAAc;AAU1D,SAAS,iBAAiB,IAAc,SAA8B;AACpE,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,QAAI,QAAQA,WAAU;AACpB,aAAO,IAAI,KAAK,KAAK;AACrB;AAAA,IACF;AACA,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAI,SAAS,WAAW,SAAS,WAAY;AAC7C,YAAM,IAAI,MAAM,IAAI;AAAA,IACtB;AACA,UAAM,IAAI,QAAQ,UAAU,OAAO;AACnC,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAKO,IAAM,eAAe,cAAc;AAAA,EACxC,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeC,WAAqC;AAClD,YAAM,OAAOA,UAAS,OAAO,IAAID,SAAQ;AACzC,UAAI,CAAC,KAAM,QAAO;AAElB,YAAM,SAAS,KAAK,MAAM,IAAI,OAAO;AACrC,YAAM,SAAS,KAAK,MAAM,IAAI,UAAU;AACxC,UAAI,CAAC,UAAU,CAAC,OAAQ,QAAO;AAG/B,UAAI,OAAO,cAAc,OAAO,UAAW,QAAO;AAClD,UAAI,OAAO,UAAU,OAAO,MAAO,QAAO;AAE1C,YAAM,UAAqB;AAAA,QACzB,UAAU;AAAA,QACV,OAAO,OAAO;AAAA,QACd,WAAW,OAAO;AAAA,QAClB,kBAAkB,OAAO,oBAAoB,OAAO;AAAA,QACpD,WAAW;AAAA;AAAA,MACb;AACA,aAAO,iBAAiBC,WAAU,OAAO;AAAA,IAC3C;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,uDAAuD;AAAA,EACnE;AACF,CAAC;;;ACzFD,IAAM,MAAM;AACZ,IAAM,QAAQ;AACd,IAAM,SAAS;AACf,IAAM,OAAO;AACb,IAAM,QAAQ;AACd,IAAM,cAAc;AACpB,IAAM,eAAe;AAKrB,SAAS,SAAS,GAA0B,GAAmC;AAC7E,SAAO,MAAM,UAAa,MAAM,UAAa,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE;AACxF;AAGA,SAAS,WAAW,KAAgB,UAAkC;AACpE,SAAO,EAAE,GAAG,KAAK,UAAU,WAAW,WAAW,UAAU,YAAY,QAAQ,EAAE;AACnF;AAGA,SAAS,cAAc,KAAe,WAA0D;AAC9F,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,IAAI,QAAQ;AACrC,UAAM,QACJ,QAAQ,qBAAqB,YAAY,IAAI,IAA4B,MAAM,KAAK;AACtF,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAQO,IAAM,iBAAiB,cAAc;AAAA,EAC1C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeC,WAAqC;AAClD,YAAM,OAAOA,UAAS,OAAO,IAAI,kBAAkB;AACnD,UAAI,CAAC,KAAM,QAAO;AAElB,YAAM,MAAM,KAAK,MAAM,IAAI,GAAG;AAC9B,YAAM,QAAQ,KAAK,MAAM,IAAI,KAAK;AAClC,YAAM,SAAS,KAAK,MAAM,IAAI,MAAM;AACpC,YAAM,OAAO,KAAK,MAAM,IAAI,IAAI;AAEhC,YAAM,OAAO,IAAI,IAA4B,KAAK,KAAK;AAGvD,UAAI,OAAO,SAAS,KAAK,KAAK,KAAK,SAAS,KAAK,MAAM,KAAK,SAAS,KAAK,IAAI,GAAG;AAC/E,aAAK,OAAO,GAAG;AACf,aAAK,OAAO,KAAK;AACjB,aAAK,OAAO,MAAM;AAClB,aAAK,OAAO,IAAI;AAChB,aAAK,IAAI,OAAO,WAAW,KAAK,KAAK,CAAC;AAAA,MACxC,OAAO;AACL,YAAI,YAAY;AAEhB,YAAI,SAAS,KAAK,MAAM,GAAG;AACzB,eAAK,OAAO,GAAG;AACf,eAAK,OAAO,MAAM;AAClB,eAAK,IAAI,aAAa,WAAW,KAAM,WAAW,CAAC;AACnD,sBAAY;AAAA,QACd;AAEA,YAAI,SAAS,MAAM,KAAK,GAAG;AACzB,eAAK,OAAO,IAAI;AAChB,eAAK,OAAO,KAAK;AACjB,eAAK,IAAI,cAAc,WAAW,MAAO,YAAY,CAAC;AACtD,sBAAY;AAAA,QACd;AACA,YAAI,CAAC,UAAW,QAAO;AAAA,MACzB;AAEA,aAAO,cAAcA,WAAU,IAAI;AAAA,IACrC;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,qEAAqE;AAAA,EACjF;AACF,CAAC;;;ACrGD,IAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,kBAAuC,IAAI,IAAI,YAAY;AAEjE,IAAMC,YAAyB,aAAa,cAAc;AAG1D,SAAS,oBAAoB,KAAa,OAAe,QAAgB,MAAsB;AAC7F,MAAI,UAAU,MAAM;AAClB,QAAI,QAAQ,QAAQ;AAClB,aAAO,QAAQ,QAAQ,MAAM,GAAG,GAAG,IAAI,KAAK;AAAA,IAC9C;AACA,WAAO,GAAG,GAAG,IAAI,KAAK,IAAI,MAAM;AAAA,EAClC;AACA,SAAO,GAAG,GAAG,IAAI,KAAK,IAAI,MAAM,IAAI,IAAI;AAC1C;AAGA,SAAS,iBAAiB,IAAc,YAAiC;AACvE,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,QAAI,QAAQA,WAAU;AACpB,aAAO,IAAI,KAAK,KAAK;AACrB;AAAA,IACF;AACA,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAI,CAAC,gBAAgB,IAAI,OAAO,IAAI,CAAC,EAAG,OAAM,IAAI,MAAM,IAAI;AAAA,IAC9D;AACA,UAAM,IAAI,WAAW,UAAU,UAAU;AACzC,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAOO,IAAM,kBAAkB,cAAc;AAAA,EAC3C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeC,WAAqC;AAClD,YAAM,OAAOA,UAAS,OAAO,IAAID,SAAQ;AACzC,UAAI,CAAC,KAAM,QAAO;AAGlB,YAAM,QAAQ,aAAa,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,CAAgB,CAAC;AACtE,UAAI,MAAM,KAAK,CAAC,MAAM,MAAM,MAAS,EAAG,QAAO;AAC/C,YAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI;AAGzB,UAAI,GAAG,aAAa,GAAG,aAAa,GAAG,aAAa,GAAG,UAAW,QAAO;AAEzE,YAAM,QAAQ;AAAA,QACZ,OAAO,GAAG,KAAK;AAAA,QACf,OAAO,GAAG,KAAK;AAAA,QACf,OAAO,GAAG,KAAK;AAAA,QACf,OAAO,GAAG,KAAK;AAAA,MACjB;AAEA,YAAM,aAAwB;AAAA,QAC5B,UAAU;AAAA,QACV;AAAA,QACA,WAAW;AAAA,QACX,kBACE,GAAG,oBAAoB,GAAG,oBAAoB,GAAG,oBAAoB,GAAG;AAAA,QAC1E,WAAW;AAAA;AAAA,MACb;AAEA,aAAO,iBAAiBC,WAAU,UAAU;AAAA,IAC9C;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,iDAAiD;AAAA,EAC7D;AACF,CAAC;;;AChHD,IAAM,aAAa;AACnB,IAAM,aAAa;AACnB,IAAM,WAAW;AAEjB,IAAMC,YAAyB,aAAa,cAAc;AAQ1D,SAAS,sBAAsB,IAAc,cAAmC;AAC9E,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,QAAI,QAAQA,WAAU;AACpB,aAAO,IAAI,KAAK,KAAK;AACrB;AAAA,IACF;AACA,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAI,SAAS,cAAc,SAAS,WAAY;AAChD,YAAM,IAAI,MAAM,IAAI;AAAA,IACtB;AACA,UAAM,IAAI,aAAa,UAAU,YAAY;AAC7C,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAKO,IAAM,oBAAoB,cAAc;AAAA,EAC7C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeC,WAAqC;AAClD,YAAM,OAAOA,UAAS,OAAO,IAAID,SAAQ;AACzC,UAAI,CAAC,KAAM,QAAO;AAElB,YAAM,YAAY,KAAK,MAAM,IAAI,UAAU;AAC3C,YAAM,YAAY,KAAK,MAAM,IAAI,UAAU;AAC3C,UAAI,CAAC,aAAa,CAAC,UAAW,QAAO;AAGrC,UAAI,UAAU,cAAc,UAAU,UAAW,QAAO;AACxD,UAAI,UAAU,UAAU,UAAU,MAAO,QAAO;AAEhD,YAAM,eAA0B;AAAA,QAC9B,UAAU;AAAA,QACV,OAAO,UAAU;AAAA,QACjB,WAAW,UAAU;AAAA,QACrB,kBAAkB,UAAU,oBAAoB,UAAU;AAAA,QAC1D,WAAW;AAAA;AAAA,MACb;AACA,aAAO,sBAAsBC,WAAU,YAAY;AAAA,IACrD;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,yEAAyE;AAAA,EACrF;AACF,CAAC;;;ACpFD,IAAM,eAAe;AACrB,IAAM,eAAe;AACrB,IAAM,aAAa;AAEnB,IAAMC,YAAyB,aAAa,cAAc;AAG1D,IAAMC,0BAA8C,oBAAI,IAAY;AAAA,EAClE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAUD,SAAS,wBAAwB,IAAc,WAAgC;AAC7E,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,QAAI,QAAQD,WAAU;AACpB,aAAO,IAAI,KAAK,KAAK;AACrB;AAAA,IACF;AACA,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAI,SAAS,gBAAgB,SAAS,aAAc;AACpD,YAAM,IAAI,MAAM,IAAI;AAAA,IACtB;AACA,UAAM,IAAI,UAAU,UAAU,SAAS;AACvC,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAKO,IAAM,8BAA8B,cAAc;AAAA,EACvD,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAGF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeE,WAAqC;AAClD,YAAM,OAAOA,UAAS,OAAO,IAAIF,SAAQ;AACzC,UAAI,CAAC,KAAM,QAAO;AAElB,YAAM,IAAI,KAAK,MAAM,IAAI,YAAY;AACrC,YAAM,IAAI,KAAK,MAAM,IAAI,YAAY;AACrC,UAAI,CAAC,KAAK,CAAC,EAAG,QAAO;AAGrB,UAAI,EAAE,cAAc,EAAE,UAAW,QAAO;AACxC,YAAM,QAAQ,OAAO,EAAE,KAAK;AAC5B,UAAIC,wBAAuB,IAAI,KAAK,EAAG,QAAO;AAC9C,UAAI,UAAU,OAAO,EAAE,KAAK,EAAG,QAAO;AAEtC,YAAM,YAAuB;AAAA,QAC3B,UAAU;AAAA,QACV,OAAO,EAAE;AAAA,QACT,WAAW,EAAE;AAAA,QACb,kBAAkB,EAAE,oBAAoB,EAAE;AAAA,QAC1C,WAAW;AAAA;AAAA,MACb;AACA,aAAO,wBAAwBC,WAAU,SAAS;AAAA,IACpD;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,8EAA8E;AAAA,EAC1F;AACF,CAAC;;;ACrGD,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,mBAAwC,IAAI,IAAY,aAAa;AAE3E,IAAMC,YAAyB,aAAa,cAAc;AAc1D,SAAS,eAAe,IAAkC;AACxD,QAAM,QAAQ,GAAG,OAAO,IAAIA,SAAQ;AACpC,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,QAAqB,CAAC;AAC5B,aAAW,QAAQ,eAAe;AAChC,UAAM,OAAO,MAAM,MAAM,IAAI,IAAmB;AAChD,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,QAAM,CAAC,KAAK,OAAO,QAAQ,IAAI,IAAI;AAGnC,MACE,EACE,IAAI,cAAc,MAAM,aACxB,MAAM,cAAc,OAAO,aAC3B,OAAO,cAAc,KAAK,YAE5B;AACA,WAAO;AAAA,EACT;AAEA,QAAM,KAAK,OAAO,IAAI,KAAK;AAC3B,QAAM,KAAK,OAAO,MAAM,KAAK;AAC7B,QAAM,KAAK,OAAO,OAAO,KAAK;AAC9B,QAAM,KAAK,OAAO,KAAK,KAAK;AAG5B,MAAI,OAAO,MAAM,OAAO,GAAI,QAAO;AAEnC,QAAM,QAAQ,OAAO,KAAK,KAAK,GAAG,EAAE,IAAI,EAAE;AAC1C,QAAM,WAAW,MAAM,KAAK,CAAC,MAAM,EAAE,gBAAgB;AACrD,SAAO,EAAE,OAAO,WAAW,IAAI,WAAW,SAAS;AACrD;AAKA,SAAS,kBAAkB,IAAc,MAA6B;AACpE,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,QAAI,QAAQA,WAAU;AACpB,aAAO,IAAI,KAAK,KAAK;AACrB;AAAA,IACF;AACA,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAI,iBAAiB,IAAI,OAAO,IAAI,CAAC,EAAG;AACxC,YAAM,IAAI,MAAM,IAAI;AAAA,IACtB;AACA,UAAM,YAAuB;AAAA,MAC3B,UAAU;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK;AAAA,MAChB,kBAAkB,KAAK;AAAA,MACvB,WAAW;AAAA;AAAA,IACb;AACA,UAAM,IAAI,UAAU,UAAU,SAAS;AACvC,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAOO,IAAM,mBAAmB,cAAc;AAAA,EAC5C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeC,WAAqC;AAClD,YAAM,OAAO,eAAeA,SAAQ;AACpC,aAAO,OAAO,kBAAkBA,WAAU,IAAI,IAAI;AAAA,IACpD;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,MACA;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,2DAA2D;AAAA,EACvE;AACF,CAAC;;;ACxID,IAAM,cAAc;AACpB,IAAM,gBAAgB;AACtB,IAAM,cAAc;AAEpB,IAAM,gBAAgB;AACtB,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AAEtB,IAAMC,YAAyB,aAAa,cAAc;AAK1D,SAAS,SAAS,GAA0B,GAAmC;AAC7E,SAAO,MAAM,UAAa,MAAM,UAAa,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE;AACxF;AAGA,SAAS,UAAU,UAAuB,OAA6B;AACrE,SAAO;AAAA,IACL;AAAA,IACA,OAAO,MAAM;AAAA,IACb,WAAW,MAAM;AAAA,IACjB,kBAAkB;AAAA;AAAA,IAClB,WAAW;AAAA;AAAA,EACb;AACF;AAGA,SAASC,eAAc,IAAc,WAA0D;AAC7F,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,UAAM,QACJ,QAAQD,YAAW,IAAI,IAA4B,SAAS,IAAI,MAAM;AACxE,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAKO,IAAM,iBAAiB,cAAc;AAAA,EAC1C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeE,WAAqC;AAClD,YAAM,OAAOA,UAAS,OAAO,IAAIF,SAAQ;AACzC,UAAI,CAAC,KAAM,QAAO;AAElB,YAAM,aAAa,KAAK,MAAM,IAAI,WAAW;AAC7C,YAAM,eAAe,KAAK,MAAM,IAAI,aAAa;AACjD,YAAM,eAAe,KAAK,MAAM,IAAI,aAAa;AACjD,YAAM,iBAAiB,KAAK,MAAM,IAAI,eAAe;AAErD,YAAM,OAAO,IAAI,IAA4B,KAAK,KAAK;AACvD,UAAI,YAAY;AAGhB,UAAI,SAAS,YAAY,YAAY,GAAG;AACtC,aAAK,OAAO,WAAW;AACvB,aAAK,OAAO,aAAa;AACzB,aAAK,IAAI,aAAa,UAAU,aAAa,UAAW,CAAC;AACzD,oBAAY;AAAA,MACd;AAEA,UAAI,SAAS,cAAc,cAAc,GAAG;AAC1C,aAAK,OAAO,aAAa;AACzB,aAAK,OAAO,eAAe;AAC3B,aAAK,IAAI,eAAe,UAAU,eAAe,YAAa,CAAC;AAC/D,oBAAY;AAAA,MACd;AAEA,UAAI,CAAC,UAAW,QAAO;AACvB,aAAOC,eAAcC,WAAU,IAAI;AAAA,IACrC;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,wEAAwE;AAAA,EACpF;AACF,CAAC;;;ACpGD,IAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,WAAgC,IAAI,IAAY,mBAAmB;AAEzE,IAAMC,YAAyB,aAAa,cAAc;AAE1D,IAAM,gBAAgB;AAGtB,IAAMC,0BAA8C,oBAAI,IAAY;AAAA,EAClE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAcD,SAAS,oBAAoB,IAAuC;AAClE,QAAM,QAAQ,GAAG,OAAO,IAAID,SAAQ;AACpC,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,QAAqB,CAAC;AAC5B,aAAW,QAAQ,qBAAqB;AACtC,UAAM,OAAO,MAAM,MAAM,IAAI,IAAmB;AAChD,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,KAAK,IAAI;AAAA,EACjB;AAGA,QAAM,YAAY,MAAM,CAAC,EAAG;AAC5B,MAAI,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,cAAc,SAAS,EAAG,QAAO;AAE3D,QAAM,QAAQ,OAAO,MAAM,CAAC,EAAG,KAAK;AACpC,MAAIC,wBAAuB,IAAI,KAAK,EAAG,QAAO;AAC9C,MAAI,CAAC,MAAM,MAAM,CAAC,MAAM,OAAO,EAAE,KAAK,MAAM,KAAK,EAAG,QAAO;AAE3D,QAAM,WAAW,MAAM,KAAK,CAAC,MAAM,EAAE,gBAAgB;AACrD,SAAO,EAAE,OAAO,WAAW,SAAS;AACtC;AAKA,SAAS,uBAAuB,IAAc,MAAkC;AAC9E,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,QAAI,QAAQD,WAAU;AACpB,aAAO,IAAI,KAAK,KAAK;AACrB;AAAA,IACF;AACA,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAI,SAAS,IAAI,OAAO,IAAI,CAAC,EAAG;AAChC,YAAM,IAAI,MAAM,IAAI;AAAA,IACtB;AACA,UAAM,YAAuB;AAAA,MAC3B,UAAU;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK;AAAA,MAChB,kBAAkB,KAAK;AAAA,MACvB,WAAW;AAAA;AAAA,IACb;AACA,UAAM,IAAI,UAAU,UAAU,SAAS;AACvC,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAKO,IAAM,wBAAwB,cAAc;AAAA,EACjD,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeE,WAAqC;AAClD,YAAM,OAAO,oBAAoBA,SAAQ;AACzC,aAAO,OAAO,uBAAuBA,WAAU,IAAI,IAAI;AAAA,IACzD;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,uFAAuF;AAAA,EACnG;AACF,CAAC;;;AC5HD,IAAM,uBAAuB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAMC,YAAgC,IAAI,IAAY,oBAAoB;AAE1E,IAAMC,aAAyB,aAAa,cAAc;AAE1D,IAAM,iBAAiB;AAGvB,IAAMC,0BAA8C,oBAAI,IAAY;AAAA,EAClE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAcD,SAAS,qBAAqB,IAAwC;AACpE,QAAM,QAAQ,GAAG,OAAO,IAAID,UAAQ;AACpC,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,QAAqB,CAAC;AAC5B,aAAW,QAAQ,sBAAsB;AACvC,UAAM,OAAO,MAAM,MAAM,IAAI,IAAmB;AAChD,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,KAAK,IAAI;AAAA,EACjB;AAGA,QAAM,YAAY,MAAM,CAAC,EAAG;AAC5B,MAAI,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,cAAc,SAAS,EAAG,QAAO;AAE3D,QAAM,QAAQ,OAAO,MAAM,CAAC,EAAG,KAAK;AACpC,MAAIC,wBAAuB,IAAI,KAAK,EAAG,QAAO;AAC9C,MAAI,CAAC,MAAM,MAAM,CAAC,MAAM,OAAO,EAAE,KAAK,MAAM,KAAK,EAAG,QAAO;AAE3D,QAAM,WAAW,MAAM,KAAK,CAAC,MAAM,EAAE,gBAAgB;AACrD,SAAO,EAAE,OAAO,WAAW,SAAS;AACtC;AAKA,SAAS,wBAAwB,IAAc,MAAmC;AAChF,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,QAAI,QAAQD,YAAU;AACpB,aAAO,IAAI,KAAK,KAAK;AACrB;AAAA,IACF;AACA,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAID,UAAS,IAAI,OAAO,IAAI,CAAC,EAAG;AAChC,YAAM,IAAI,MAAM,IAAI;AAAA,IACtB;AACA,UAAM,YAAuB;AAAA,MAC3B,UAAU;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK;AAAA,MAChB,kBAAkB,KAAK;AAAA,MACvB,WAAW;AAAA;AAAA,IACb;AACA,UAAM,IAAI,UAAU,UAAU,SAAS;AACvC,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAKO,IAAM,yBAAyB,cAAc;AAAA,EAClD,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeG,WAAqC;AAClD,YAAM,OAAO,qBAAqBA,SAAQ;AAC1C,aAAO,OAAO,wBAAwBA,WAAU,IAAI,IAAI;AAAA,IAC1D;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,uFAAuF;AAAA,EACnG;AACF,CAAC;;;ACnID,IAAM,QAAQ;AACd,IAAM,SAAS;AACf,IAAM,OAAO;AAGb,IAAMC,0BAA8C,oBAAI,IAAY,CAAC,QAAQ,WAAW,OAAO,CAAC;AAKhG,SAAS,UAAU,IAAsC;AACvD,SAAO,GAAG,OAAO,IAAI,aAAa,cAAc,CAAC;AACnD;AAMA,SAAS,kBAAkB,IAAc,OAAe,WAA8B;AACpF,QAAM,UAAU,aAAa,cAAc;AAC3C,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,QAAI,QAAQ,SAAS;AACnB,aAAO,IAAI,KAAK,KAAK;AACrB;AAAA,IACF;AACA,UAAM,QAAQ,IAAI,IAA4B,MAAM,KAAK;AACzD,UAAM,OAAO,KAAK;AAClB,UAAM,OAAO,MAAM;AACnB,eAAW,QAAQ,WAAW,qBAAqB,OAAO,IAAI,GAAG,OAAO,SAAS,GAAG;AAClF,YAAM,IAAI,KAAK,UAAU,IAAI;AAAA,IAC/B;AACA,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAKO,IAAM,gBAAgB,cAAc;AAAA,EACzC,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeC,WAAqC;AAClD,YAAM,OAAO,UAAUA,SAAQ;AAC/B,YAAM,IAAI,MAAM,MAAM,IAAI,KAAK;AAC/B,YAAM,IAAI,MAAM,MAAM,IAAI,MAAM;AAChC,UAAI,CAAC,KAAK,CAAC,EAAG,QAAO;AACrB,UAAI,EAAE,cAAc,EAAE,UAAW,QAAO;AACxC,UAAID,wBAAuB,IAAI,OAAO,EAAE,KAAK,CAAC,EAAG,QAAO;AACxD,UAAI,EAAE,UAAU,EAAE,MAAO,QAAO;AAChC,aAAO,kBAAkBC,WAAU,OAAO,EAAE,KAAK,GAAG,EAAE,SAAS;AAAA,IACjE;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,iDAAiD;AAAA,EAC7D;AACF,CAAC;;;ACjDM,IAAM,kBAAsC;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AC7EO,SAAS,MAAM,OAAuB;AAC3C,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,SAAK,MAAM,WAAW,CAAC;AACvB,QAAI,KAAK,KAAK,GAAG,QAAU;AAAA,EAC7B;AACA,UAAQ,MAAM,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAC/C;;;ACYO,SAAS,cACd,MACA,MACA,OACA,WACuC;AACvC,QAAM,WAAW,CAAC,GAAW,MAC3B,KAAK,qBAAqB,GAAG,GAAG,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,OAAO,EAAE,KAAK,CAAC,CAAU;AAE9F,MAAI,SAAS,QAAQ;AACnB,WAAO,CAAC,GAAG,SAAS,SAAS,KAAK,GAAG,GAAG,SAAS,UAAU,KAAK,CAAC;AAAA,EACnE;AACA,MAAI,SAAS,iBAAiB,SAAS,gBAAgB;AACrD,UAAM,QAAQ,MAAM,MAAM,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC3D,UAAM,IAAI,MAAM,CAAC,KAAK;AACtB,UAAM,IAAI,MAAM,CAAC,KAAK;AACtB,UAAM,QAAQ,SAAS,gBAAiB,CAAC,OAAO,QAAQ,IAAe,CAAC,QAAQ,OAAO;AACvF,WAAO,CAAC,GAAG,SAAS,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,SAAS,MAAM,CAAC,GAAG,CAAC,CAAC;AAAA,EAC5D;AACA,SAAO,SAAS,MAAM,KAAK;AAC7B;AAGO,SAAS,mBACd,WACA,KAC4B;AAC5B,MAAI,UAAU,SAAS,EAAG,QAAO;AACjC,QAAM,OAAO,IAAI,cAAc;AAC/B,QAAM,QAAQ,oBAAI,IAA4B;AAC9C,aAAW,CAAC,MAAM,KAAK,KAAK,WAAW;AACrC,eAAW,QAAQ,KAAK,qBAAqB,OAAO,IAAI,GAAG,OAAO,KAAK,GAAG;AACxE,YAAM,IAAI,KAAK,UAAU,IAAI;AAAA,IAC/B;AAAA,EACF;AACA,QAAM,QAAoB,EAAE,WAAW,gBAAgB,MAAM;AAC7D,QAAM,WAAqB,EAAE,QAAQ,oBAAI,IAAI,CAAC,CAAC,aAAa,cAAc,GAAG,KAAK,CAAC,CAAC,EAAE;AACtF,QAAM,MAAM,CAAC,GAAG,SAAS,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,GAAG;AAChE,QAAM,YAAY,MAAM,MAAM,GAAG,CAAC;AAClC,QAAM,YAA4B,EAAE,WAAW,OAAO,UAAU,KAAK,IAAI,SAAS,IAAI,GAAG,IAAI;AAC7F,MAAI;AACF,QAAI,KAAK,SAAS,SAAS;AAAA,EAC7B,QAAQ;AAAA,EAER;AACA,SAAO;AACT;;;ACpDA,yBAA8B;AAC9B,WAAsB;AAUtB,SAAS,aAAqB;AAC5B,SAAO,OAAO,eAAe,WAAW,aAAa;AACvD;AAOA,SAAS,eAAe,aAA0C;AAChE,QAAM,QAAkB,CAAC;AAGzB,MAAI,YAAa,OAAM,KAAU,UAAK,aAAa,gBAAgB,CAAC;AACpE,QAAM,KAAU,UAAK,QAAQ,IAAI,GAAG,gBAAgB,CAAC;AACrD,QAAM,KAAK,WAAW,CAAC;AACvB,aAAW,QAAQ,OAAO;AACxB,QAAI;AACF,YAAM,gBAAY,kCAAc,IAAI;AACpC,gBAAU,QAAQ,0BAA0B;AAC5C,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,WAAW,SAAkD;AAC3E,QAAM,MAAM,eAAe,QAAQ,WAAW;AAC9C,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI;AACF,UAAM,gBAAgB,IAAI,8BAA8B;AACxD,UAAM,EAAE,cAAc,IAAI,IAAI,0CAA0C;AAGxE,UAAM,EAAE,cAAc,IAAI,IAAI,sCAAsC;AAGpE,UAAM,MAAM,IAAI,0BAA0B;AAE1C,QAAI,aAAsB,QAAQ,UAAU,EAAE,SAAS,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE;AACrE,QAAI,QAAQ,eAAe,QAAW;AACpC,YAAM,aAAa,IAAI,2BAA2B;AAClD,mBAAa,WAAW,QAAQ,UAAU;AAAA,IAC5C;AACA,UAAM,WAAW,cAAc,UAAU;AACzC,UAAM,UAAU,cAAc,QAAQ;AAEtC,WAAO;AAAA,MACL,SAAS,IAAI;AAAA,MACb;AAAA,MACA,SAAS,YAAyC;AAChD,cAAM,QAAQ,cAAc,IAAI,IAAI,UAAU,GAAG,OAAO;AACxD,eAAO,MAAM,IAAI,CAAC,CAAC,EAAE,IAAI,MAAM,IAAI;AAAA,MACrC;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACnFA,IAAM,yBAAyB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAaM,SAAS,cAAc,UAAkC;AAC9D,QAAM,MAAM,SAAS,KAAK;AAC1B,MAAI,IAAI,WAAW,KAAK,IAAI,CAAC,MAAM,IAAK,QAAO,EAAE,MAAM,UAAU;AAGjE,MAAI,IAAI;AACR,SAAO,IAAI,IAAI,QAAQ,KAAK,GAAG;AAC7B,UAAM,IAAI,IAAI,CAAC;AACf,QAAI,MAAM,MAAM;AACd,WAAK;AACL;AAAA,IACF;AACA,QAAI,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,KAAK;AACxG;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,IAAI,MAAM,CAAC;AAC7B,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO,EAAE,MAAM,UAAU,QAAQ,CAAC,GAAG,eAAe,GAAG;AAAA,EACzD;AAEA,MAAI,CAAC,oCAAoC,KAAK,SAAS,GAAG;AACxD,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AAEA,QAAM,QAAQ,UAAU,MAAM,6BAA6B,KAAK,CAAC;AACjE,QAAM,SAAmB,CAAC;AAC1B,MAAI,gBAAgB;AACpB,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,WAAW,IAAI,KAAK,uBAAuB,IAAI,IAAI,GAAG;AAC7D,sBAAgB,KAAK,WAAW,IAAI,IAAI,OAAO,IAAI,IAAI;AAAA,IACzD,OAAO;AACL,aAAO,KAAK,IAAI;AAAA,IAClB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,UAAU,QAAQ,cAAc;AACjD;AAEO,SAAS,cAAc,OAAe,QAA2B,eAAuC;AAC7G,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,EAAE,KAAK;AAAA,IAClC;AAAA,EACF;AACF;AAGO,SAAS,cAAc,UAAiC;AAC7D,QAAM,MAAM,SAAS,KAAK;AAC1B,MAAI,IAAI,CAAC,MAAM,IAAK,QAAO;AAC3B,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,GAAG;AACtC,UAAM,IAAI,IAAI,CAAC;AACf,QAAI,MAAM,MAAM;AACd,WAAK;AACL,UAAI,IAAI,IAAI,OAAQ,QAAO,IAAI,CAAC;AAChC;AAAA,IACF;AACA,QAAI,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,KAAK;AACxG,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACA,SAAO,IAAI,SAAS,IAAI,MAAM;AAChC;;;AClEA,SAAS,aACP,MACA,YACA,qBACA,KACM;AACN,MAAI,KAAK,SAAS,QAAQ;AACxB,QAAI,KAAK,EAAE,MAAM,MAAyB,OAAO,YAAY,aAAa,oBAAoB,CAAC;AAC/F;AAAA,EACF;AACA,MAAI,KAAK,SAAS,UAAU;AAC1B,UAAM,KAAK;AACX,UAAM,WAAW,GAAG,SAAS,CAAC;AAC9B,QAAI,GAAG,SAAS,SAAS;AACvB,YAAM,YAAY,GAAG,SAAS,CAAC,GAAG,YAAY,GAAG,MAAM,IAAI;AAC3D,iBAAW,SAAS,SAAU,cAAa,OAAO,WAAW,qBAAqB,GAAG;AAAA,IACvF,OAAO;AAEL,iBAAW,SAAS,SAAU,cAAa,OAAO,YAAY,MAAM,GAAG;AAAA,IACzE;AAAA,EACF;AACF;AAGO,SAAS,aAAa,OAAe,OAA0C;AACpF,MAAI,MAAM,WAAW,EAAG,QAAO,EAAE,QAAQ,CAAC,GAAG,UAAU,MAAM;AAE7D,QAAM,SAA2F,CAAC;AAClG,aAAW,QAAQ,MAAO,cAAa,MAAM,CAAC,GAAG,OAAO,MAAM;AAE9D,QAAM,SAA2B,CAAC;AAClC,MAAI,aAAa;AAEjB,aAAW,EAAE,MAAM,OAAO,YAAY,KAAK,QAAQ;AACjD,UAAM,SAAS,cAAc,KAAK,QAAQ;AAC1C,QAAI,OAAO,SAAS,aAAa,aAAa;AAC5C,mBAAa;AACb;AAAA,IACF;AACA,UAAM,QAAmD,CAAC;AAC1D,eAAW,SAAS,KAAK,SAAS,CAAC,GAAG;AACpC,UAAI,MAAM,SAAS,OAAQ;AAC3B,YAAM,IAAI;AACV,UAAI,OAAO,EAAE,UAAU,SAAU;AACjC,YAAM,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,IAAI,CAAC;AAAA,IACpD;AACA,QAAI,MAAM,WAAW,EAAG;AACxB,UAAM,aAAa,MAAM,KAAK,OAAO;AACrC,WAAO,KAAK,EAAE,WAAW,cAAc,YAAY,OAAO,QAAQ,OAAO,aAAa,GAAG,MAAM,CAAC;AAAA,EAClG;AAEA,QAAMC,UACJ,cAAc,OAAO,WAAW,IAC5B,EAAE,OAAO,QAAQ,sBAAsB,QAAQ,wDAAwD,IACvG;AAEN,SAAO,EAAE,QAAQ,UAAU,MAAM,QAAAA,QAAO;AAC1C;;;AC1EO,SAAS,iBAAiB,MAAsB;AACrD,MAAI,KAAK,SAAS,QAAQ;AACxB,UAAM,IAAI;AACV,QAAI,OAAO,EAAE,UAAU,SAAU,QAAO;AACxC,WAAO,GAAG,EAAE,IAAI,IAAI,EAAE,KAAK,GAAG,EAAE,cAAc,OAAO,gBAAgB,EAAE;AAAA,EACzE;AACA,MAAI,KAAK,SAAS,QAAQ;AACxB,UAAM,IAAI;AACV,UAAM,QAAQ,EAAE,SAAS,CAAC,GACvB,IAAI,CAAC,MAAM,iBAAiB,CAAC,CAAC,EAC9B,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAC1B,KAAK,GAAG;AACX,WAAO,GAAG,EAAE,QAAQ,IAAI,IAAI;AAAA,EAC9B;AACA,MAAI,KAAK,SAAS,UAAU;AAC1B,UAAM,IAAI;AACV,UAAM,QAAQ,EAAE,SAAS,CAAC,GACvB,IAAI,CAAC,MAAM,iBAAiB,CAAC,CAAC,EAC9B,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAC1B,KAAK,EAAE;AACV,WAAO,IAAI,EAAE,IAAI,IAAI,EAAE,MAAM,IAAI,IAAI;AAAA,EACvC;AACA,SAAO;AACT;;;ACfO,SAAS,cACd,WACU;AACV,MAAI,UAAU,SAAS,EAAG,QAAO,cAAc;AAC/C,QAAM,SAAS,oBAAI,IAAiD;AACpE,aAAW,EAAE,WAAW,MAAM,KAAK,UAAU,OAAO,GAAG;AACrD,QAAI,MAAM,SAAS,EAAG;AACtB,WAAO,IAAI,aAAa,SAAS,GAAG,EAAE,WAAW,MAAM,CAAC;AAAA,EAC1D;AACA,MAAI,OAAO,SAAS,EAAG,QAAO,cAAc;AAC5C,SAAO,WAAW,kBAAkB,EAAE,OAAO,CAAC;AAChD;AAOO,SAAS,WAAW,MAAqD;AAC9E,QAAM,MAAqB,CAAC;AAC5B,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,MAAM,CAAC,MAAqC;AAChD,QAAI,CAAC,KAAK,EAAE,SAAS,WAAW,KAAK,IAAI,EAAE,SAAS,EAAG;AACvD,SAAK,IAAI,EAAE,SAAS;AACpB,QAAI,KAAK,CAAC;AAAA,EACZ;AACA,aAAW,KAAK,KAAK,YAAY,CAAC,EAAG,KAAI,CAAC;AAC1C,MAAI,KAAK,MAAM;AACf,SAAO,IAAI,SAAS,IAAI,MAAM;AAChC;;;AClCO,IAAM,eAA8B;AAAA,EACzC,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,eAAe;AAAA,EACf,cAAc;AAAA,EACd,WAAW;AACb;AAMO,IAAM,kBAAiC;AAAA,EAC5C,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,eAAe;AAAA,EACf,cAAc;AAAA,EACd,WAAW;AACb;;;ACCA,IAAM,mBAAN,MAAgD;AAAA,EACrC,KAAK;AAAA,EACL;AAAA,EACA;AAAA,EAEA;AAAA;AAAA,EAEA,cAAc,oBAAI,IAA4B;AAAA;AAAA,EAE9C,gBAAgB,oBAAI,IAA2B;AAAA;AAAA,EAExD,gBAA2F;AAAA,EAE3F,YAAY,SAAiC,CAAC,GAAG;AAC/C,SAAK,UAAU,WAAW,MAAM;AAChC,SAAK,WACH,OAAO,aAAa,KAAK,UAAU,eAAe,KAAK,QAAQ,OAAO,KAAK;AAC7E,UAAM,OAAO,KAAK,UAAU,OAAO,UAAU,CAAC,CAAC,KAAK,OAAO,cAAc;AACzE,SAAK,cAAc,OAAO,eAAe,GAAG,KAAK,QAAQ,IAAI,MAAM,IAAI,CAAC;AAAA,EAC1E;AAAA;AAAA,EAGA,SAAS,OAA+B;AACtC,UAAM,SAAS,KAAK,YAAY,IAAI,KAAK;AACzC,QAAI,OAAQ,QAAO;AACnB,QAAI;AACJ,QAAI,CAAC,KAAK,SAAS;AACjB,eAAS,EAAE,QAAQ,CAAC,GAAG,UAAU,MAAM;AAAA,IACzC,OAAO;AACL,UAAI;AACF,iBAAS,aAAa,OAAO,KAAK,QAAQ,SAAS,CAAC,KAAK,CAAC,CAAC;AAAA,MAC7D,QAAQ;AACN,iBAAS,EAAE,QAAQ,CAAC,GAAG,UAAU,MAAM;AAAA,MACzC;AAAA,IACF;AACA,SAAK,YAAY,IAAI,OAAO,MAAM;AAClC,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,OAAwB;AAC3B,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,WAAO,KAAK,SAAS,KAAK,EAAE;AAAA,EAC9B;AAAA,EAEA,QAAQ,OAAoC;AAC1C,UAAM,MAAM,KAAK,UAAU,MAAM,OAAO;AACxC,UAAM,SAAS,KAAK,cAAc,IAAI,GAAG;AACzC,QAAI,OAAQ,QAAO;AAInB,UAAM,YAAY,oBAAI,IAGpB;AACF,UAAM,WAAqB,CAAC;AAC5B,UAAM,UAAoB,CAAC;AAC3B,UAAMC,UAAwB,CAAC;AAE/B,UAAM,QAAQ,QAAQ,CAAC,OAAO,eAAe;AAC3C,YAAM,YAAY,KAAK,SAAS,KAAK;AACrC,UAAI,CAAC,UAAU,UAAU;AACvB,gBAAQ,KAAK,KAAK;AAClB;AAAA,MACF;AACA,UAAI,UAAU,OAAQ,CAAAA,QAAO,KAAK,UAAU,MAAM;AAClD,UAAI,UAAU,OAAO,WAAW,EAAG;AAEnC,YAAM,SAAsB,EAAE,MAAM,SAAS,YAAY,WAAW,MAAM;AAC1E,UAAI,cAAc;AAClB,iBAAW,SAAS,UAAU,QAAQ;AACpC,cAAM,KAAK,aAAa,MAAM,SAAS;AACvC,YAAI,SAAS,UAAU,IAAI,EAAE;AAC7B,YAAI,CAAC,QAAQ;AACX,mBAAS,EAAE,WAAW,MAAM,WAAW,OAAO,oBAAI,IAAI,EAAE;AACxD,oBAAU,IAAI,IAAI,MAAM;AAAA,QAC1B;AACA,mBAAW,CAAC,MAAM,OAAO,SAAS,KAAK,MAAM,OAAO;AAClD,qBAAW,QAAQ,WAAW,qBAAqB,MAAM,OAAO,SAAS,GAAG;AAK1E,kBAAM,OAAO,OAAO,MAAM,IAAI,KAAK,QAAQ;AAC3C,kBAAM,WAAW,OAAO,WAAW,IAAI,IAAI;AAC3C,mBAAO,MAAM,IAAI,KAAK,UAAU,WAAW,EAAE,GAAG,MAAM,QAAQ,SAAS,IAAI,EAAE,GAAG,MAAM,OAAO,CAAC;AAC9F,0BAAc;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AACA,UAAI,YAAa,UAAS,KAAK,KAAK;AAAA,IACtC,CAAC;AAED,UAAM,SAAwB;AAAA,MAC5B,QAAQ,cAAc,SAAS;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,QAAAA;AAAA,MACA,UAAU,CAAC;AAAA,IACb;AACA,SAAK,cAAc,IAAI,KAAK,MAAM;AAClC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,qBAAyF;AACvF,QAAI,KAAK,cAAe,QAAO,KAAK;AACpC,UAAM,QAA4D,CAAC;AACnE,QAAI,KAAK,SAAS;AAChB,UAAI;AACF,cAAM,UAAU,KAAK,QAAQ,QAC1B,aAAa,EACb,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ;AACnD,cAAM,QAAQ,KAAK,QAAQ,SAAS,OAAO;AAE3C,mBAAW,QAAQ,OAAO;AACxB,cAAI,KAAK,SAAS,OAAQ;AAC1B,gBAAM,OAAO;AACb,gBAAM,SAAS,cAAc,KAAK,QAAQ;AAC1C,cAAI,OAAO,SAAS,YAAY,OAAO,OAAO,SAAS,KAAK,OAAO,kBAAkB,IAAI;AACvF;AAAA,UACF;AACA,gBAAM,YAAY,cAAc,KAAK,QAAQ;AAC7C,cAAI,cAAc,KAAM;AACxB,gBAAM,QAAQ,oBAAI,IAAyB;AAC3C,qBAAW,SAAS,KAAK,SAAS,CAAC,GAAG;AACpC,gBAAI,MAAM,SAAS,OAAQ;AAC3B,kBAAM,IAAI;AACV,gBAAI,OAAO,EAAE,UAAU,SAAU;AACjC,uBAAW,QAAQ,WAAW,qBAAqB,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,IAAI,GAAG;AACzF,oBAAM,IAAI,KAAK,UAAU,OAAO,KAAK,KAAK,CAAC;AAAA,YAC7C;AAAA,UACF;AACA,cAAI,MAAM,OAAO,EAAG,OAAM,KAAK,CAAC,WAAW,KAAK,CAAC;AAAA,QACnD;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AACA,UAAM,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE;AACtF,SAAK,gBAAgB;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,QAAkB,KAA8B;AACnD,UAAM,OAAO,IAAI,cAAc;AAC/B,UAAM,aAAa,KAAK,kBAAkB,MAAM;AAChD,UAAM,OAAO,WAAW,OAAO,IAAI,aAAa,cAAc,CAAC;AAC/D,QAAI,CAAC,QAAQ,KAAK,MAAM,SAAS,EAAG,QAAO,EAAE,SAAS,CAAC,GAAG,OAAO,MAAM,UAAU,CAAC,EAAE;AAIpF,UAAM,aAAa,WAAW,OAAO,OAAO;AAM5C,UAAM,SAAS,oBAAI,IAAyB;AAC5C,eAAW,CAAC,MAAM,IAAI,KAAK,KAAK,OAAO;AACrC,iBAAW,CAAC,IAAI,EAAE,KAAK,cAAc,MAAM,OAAO,IAAI,GAAG,OAAO,KAAK,KAAK,GAAG,KAAK,SAAS,GAAG;AAC5F,eAAO,IAAI,IAAI,EAAE;AAAA,MACnB;AAAA,IACF;AAIA,UAAM,aAAyE,CAAC;AAChF,eAAW,SAAS,KAAK,mBAAmB,GAAG;AAC7C,YAAM,CAAC,EAAE,OAAO,IAAI;AACpB,UAAI,QAAQ,SAAS,KAAK,QAAQ,OAAO,OAAO,KAAM;AACtD,UAAI,OAAO;AACX,iBAAW,CAAC,MAAM,KAAK,KAAK,SAAS;AACnC,YAAI,OAAO,IAAI,IAAI,MAAM,OAAO;AAC9B,iBAAO;AACP;AAAA,QACF;AAAA,MACF;AACA,UAAI,KAAM,YAAW,KAAK,KAAK;AAAA,IACjC;AAKA,UAAM,YAAY,IAAI,IAAI,MAAM;AAChC,UAAM,UAAoB,CAAC;AAC3B,WAAO,UAAU,OAAO,GAAG;AACzB,UAAI,OAAmE;AACvE,UAAI,YAAY;AAChB,iBAAW,SAAS,YAAY;AAC9B,cAAM,CAAC,OAAO,OAAO,IAAI;AACzB,YAAI,QAAQ;AACZ,mBAAW,QAAQ,QAAQ,KAAK,EAAG,KAAI,UAAU,IAAI,IAAI,EAAG,UAAS;AACrE,YAAI,UAAU,EAAG;AACjB,cAAM,SACJ,SAAS,QACT,QAAQ,aACP,UAAU,aAAa,QAAQ,OAAO,KAAK,CAAC,EAAE,QAC9C,UAAU,aAAa,QAAQ,SAAS,KAAK,CAAC,EAAE,QAAQ,QAAQ,KAAK,CAAC;AACzE,YAAI,QAAQ;AACV,iBAAO;AACP,sBAAY;AAAA,QACd;AAAA,MACF;AACA,UAAI,CAAC,KAAM;AACX,cAAQ,KAAK,KAAK,CAAC,CAAC;AACpB,iBAAW,QAAQ,KAAK,CAAC,EAAE,KAAK,EAAG,WAAU,OAAO,IAAI;AAAA,IAC1D;AAEA,UAAM,QAAQ,UAAU,SAAS,KAAK,CAAC;AACvC,QAAI,UAAU,SAAS,EAAG,QAAO,EAAE,SAAS,OAAO,UAAU,CAAC,EAAE;AAGhE,UAAM,WAAW,mBAAmB,WAAW,GAAG;AAClD,WAAO,WACH,EAAE,SAAS,UAAU,OAAO,UAAU,CAAC,EAAE,IACzC,EAAE,SAAS,OAAO,UAAU,CAAC,EAAE;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,SAAoC;AACzC,QAAI,CAAC,KAAK,QAAS,QAAO;AAC1B,UAAM,SAAS,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC/D,QAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAI;AACF,aAAO,KAAK,QACT,SAAS,MAAM,EACf,IAAI,CAAC,MAAM,iBAAiB,CAAC,CAAC,EAC9B,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAC1B,KAAK,IAAI;AAAA,IACd,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,cAAc,OAA8B;AAM1C,UAAM,KAAK,KAAK,SAAS,KAAK;AAC9B,QAAI,CAAC,GAAG,YAAY,GAAG,OAAQ,QAAO;AACtC,UAAM,WACJ,GAAG,OAAO,SAAS,KACnB,GAAG,OAAO,MAAM,CAAC,MAAM,aAAa,EAAE,SAAS,MAAM,aAAa,cAAc,CAAC;AACnF,QAAI,CAAC,SAAU,QAAO;AACtB,WAAO;AAAA,EACT;AACF;AAGO,SAAS,uBAAuB,QAAgD;AACrF,SAAO,IAAI,iBAAiB,MAAM;AACpC;;;ACnSO,IAAM,kBAAkB;AAGxB,IAAM,wBAAwB;AAG9B,IAAM,iBAAiB;AAGvB,IAAM,qBAA0C,oBAAI,IAAI;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,qBAA0C,oBAAI,IAAI;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAMC,0BAA8C,oBAAI,IAAI;AAAA,EACjE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;;;AC1CD,IAAAC,sBAA8B;AAC9B,IAAAC,QAAsB;AAkBf,SAASC,cAAqB;AACnC,SAAO,OAAO,eAAe,WAAW,aAAa;AACvD;AA0BO,SAAS,kBAAkB,aAA4C;AAC5E,QAAM,QAAkB,CAAC;AACzB,MAAI,YAAa,OAAM,KAAU,WAAK,aAAa,gBAAgB,CAAC;AACpE,QAAM,KAAU,WAAK,QAAQ,IAAI,GAAG,gBAAgB,CAAC;AACrD,QAAM,KAAKA,YAAW,CAAC;AACvB,aAAW,QAAQ,OAAO;AACxB,QAAI;AACF,YAAM,UAAM,mCAAc,IAAI;AAC9B,UAAI,QAAQ,SAAS;AACrB,UAAI,QAAQ,yBAAyB;AACrC,YAAM,UAAU,IAAI,SAAS;AAC7B,YAAM,MAAM,IAAI,yBAAyB;AAEzC,YAAM,WAAW,IAAI,WAAW;AAChC,aAAO,EAAE,OAAO,QAAQ,OAAO,gBAAgB,SAAS;AAAA,IAC1D,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAOO,IAAI,KAA6B;AAEjC,IAAI,KAA+B;AAGnC,SAAS,cAAc,aAA4B;AACxD,MAAI,MAAM,GAAI;AACd,QAAM,SAAS,kBAAkB,WAAW;AAC5C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IAGF;AAAA,EACF;AACA,OAAK,OAAO;AACZ,OAAK,OAAO;AACd;;;AC7EO,SAAS,aAAa,MAA0B;AACrD,QAAM,QAAkB,CAAC;AACzB,MAAI,OAAO;AACX,MAAI,SAAS,KAAK;AAClB,SAAO,UAAU,OAAO,SAAS,UAAU;AACzC,UAAM,KAAK;AACX,UAAM,OAAO,GAAG,KAAK,YAAY;AACjC,QAAI,SAAS,QAAS,OAAM,QAAQ,GAAG,OAAO,KAAK,EAAE,QAAQ,QAAQ,GAAG,CAAC;AAAA,aAChE,SAAS,eAAe,KAAK,SAAS,WAAW,KAAK,SAAS,YAAa,QAAO;AAC5F,aAAS,OAAO;AAAA,EAClB;AACA,SAAO,EAAE,OAAO,MAAM,KAAK,OAAO,GAAG,KAAK;AAC5C;AAGO,SAAS,aAAa,MAAuB;AAClD,QAAM,MAAiB,CAAC;AACxB,aAAW,QAAQ,KAAK,OAAO;AAC7B,QAAI,KAAK,SAAS,OAAQ,KAAI,KAAK,CAAC,KAAK,MAAM,KAAK,OAAO,KAAK,cAAc,IAAI,CAAC;AAAA,EACrF;AACA,SAAO;AACT;;;ACnCA,qBAA6B;AAStB,SAAS,kBAAkB,OAAwB;AACxD,SAAO,MAAM,SAAS,KAAK,CAAC,kBAAkB,KAAK,KAAK;AAC1D;AAGO,SAAS,YAAYC,OAAuB;AACjD,MAAI;AACF,WAAO,EAAE,IAAIA,OAAM,SAAK,6BAAaA,OAAM,MAAM,EAAE;AAAA,EACrD,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,uCAAuCA,KAAI,KAAK,EAAE,MAAM,CAAC;AAAA,EAC3E;AACF;AAMO,SAAS,kBAAkB,UAAkB,OAAmC;AACrF,QAAM,QAAQ,MAAM,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,EAAE,KAAK;AAC/D,SAAO,GAAG,QAAQ,IAAI,cAAc,KAAK,MAAM,KAAK,GAAG,CAAC;AAC1D;;;ACdO,SAAS,eAAe,UAA+C;AAC5E,QAAM,YAAwB,CAAC;AAC/B,MAAI,UAAiC,CAAC;AACtC,MAAI,iBAAgC;AACpC,aAAW,QAAQ,SAAS,OAAO;AACjC,QAAI,GAAI,aAAa,IAAI,GAAG;AAC1B,gBAAU,KAAK,EAAE,gBAAgB,OAAO,QAAQ,CAAC;AACjD,gBAAU,CAAC;AACX,uBAAiB,gBAAgB,IAAI;AAAA,IACvC,OAAO;AACL,cAAQ,KAAK,IAAI;AAAA,IACnB;AAAA,EACF;AACA,YAAU,KAAK,EAAE,gBAAgB,OAAO,QAAQ,CAAC;AACjD,SAAO;AACT;AAGA,SAAS,gBAAgB,MAAyC;AAChE,QAAM,IAAI,KAAK;AACf,SAAO,EAAE,KAAK,MAAM,KAAK,MAAM,EAAE,KAAK;AACxC;AAGO,SAAS,WAAW,MAAqC;AAC9D,SAAO,KAAK,MAAM,YAAY;AAChC;AAEO,SAAS,gBAAgB,MAAsC;AACpE,SAAO,GAAI,gBAAgB,IAAI,KAAKC,wBAAuB,IAAI,WAAW,IAAI,CAAC;AACjF;AAGO,SAAS,uBAAuB,MAAqC;AAC1E,QAAM,OAAO,WAAW,IAAI;AAC5B,SAAO,KAAK,WAAW,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,MAAM,EAAE,CAAC;AACnE;;;ACFO,IAAM,oBAAN,MAAiD;AAAA,EACtC,KAAa;AAAA,EACb,WAAmB;AAAA,EACnB;AAAA,EAEP;AAAA;AAAA,EAEA,cAAc,oBAAI,IAAyB;AAAA;AAAA,EAE3C,SAAS,oBAAI,IAA0B;AAAA;AAAA,EAEvC,SAAS,oBAAI,IAAY;AAAA;AAAA,EAEzB;AAAA,EAET,WAA2C;AAAA,EAEpC,YAAY,WAA+B,CAAC,GAAG,UAA8B,CAAC,GAAG;AACtF,kBAAc,QAAQ,WAAW;AACjC,UAAM,YAAY,QAAQ,SAAS,CAAC,GAAG,IAAI,WAAW;AACtD,SAAK,SAAS,CAAC,GAAG,UAAU,GAAG,QAAQ;AACvC,SAAK,cAAc,QAAQ,eAAe,kBAAkB,KAAK,UAAU,KAAK,MAAM;AAEtF,UAAM,UAAU,oBAAI,IAAY;AAChC,QAAI,QAAQ;AACZ,eAAW,QAAQ,KAAK,QAAQ;AAC9B,cAAQ,KAAK,WAAW,MAAM,OAAO,OAAO;AAAA,IAC9C;AACA,SAAK,WAAW,CAAC,GAAG,OAAO,EAAE,KAAK;AAAA,EACpC;AAAA;AAAA,EAGA,IAAW,QAA4B;AACrC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGO,KAAK,OAAwB;AAClC,WAAO,kBAAkB,KAAK,KAAK,KAAK,OAAO,IAAI,KAAK;AAAA,EAC1D;AAAA,EAEO,QAAQ,OAAoC;AACjD,UAAM,SAAS,KAAK,eAAe,MAAM,SAAS,MAAM,OAAO;AAC/D,UAAM,WAAqB,CAAC;AAC5B,UAAM,UAAoB,CAAC;AAC3B,eAAW,SAAS,MAAM,SAAS;AACjC,UAAI,KAAK,YAAY,IAAI,KAAK,EAAG,UAAS,KAAK,KAAK;AAAA,UAC/C,SAAQ,KAAK,KAAK;AAAA,IACzB;AACA,WAAO,EAAE,QAAQ,UAAU,SAAS,QAAQ,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,EAC/D;AAAA,EAEO,KAAK,QAAkB,KAA8B;AAC1D,UAAM,OAAO,IAAI,cAAc;AAC/B,UAAM,YAAY,oBAAI,IAAoB;AAC1C,eAAW,CAAC,IAAI,KAAK,KAAK,KAAK,kBAAkB,MAAM,EAAE,QAAQ;AAC/D,iBAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,kBAAU,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,CAAC;AAAA,MACnD;AAAA,IACF;AACA,QAAI,UAAU,SAAS,EAAG,QAAO,EAAE,SAAS,CAAC,GAAG,OAAO,MAAM,UAAU,CAAC,EAAE;AAE1E,UAAM,UAAoB,CAAC;AAE3B,eAAW,EAAE,OAAO,MAAM,KAAK,KAAK,cAAc,GAAG;AACnD,UAAI,UAAU;AACd,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO;AAChC,YAAI,UAAU,IAAI,GAAG,MAAM,OAAO;AAChC,oBAAU;AACV;AAAA,QACF;AAAA,MACF;AACA,UAAI,CAAC,QAAS;AACd,cAAQ,KAAK,KAAK;AAClB,iBAAW,OAAO,MAAM,KAAK,EAAG,WAAU,OAAO,GAAG;AACpD,UAAI,UAAU,SAAS,EAAG;AAAA,IAC5B;AAGA,WAAO,EAAE,SAAS,OAAO,UAAU,SAAS,GAAG,UAAU,CAAC,EAAE;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,OAAO,UAAqC;AACjD,WAAO,KAAK,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,IAAI;AAAA,EAChD;AAAA,EAEO,cAAc,OAA8B;AACjD,UAAM,IAAI,KAAK,OAAO,IAAI,KAAK;AAC/B,QAAI,CAAC,GAAG;AACN,aAAO;AAAA,QACL,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,eAAe;AAAA,QACf,cAAc;AAAA,QACd,WAAW;AAAA,MACb;AAAA,IACF;AACA,WAAO;AAAA,MACL,WAAW,EAAE;AAAA,MACb,YAAY,EAAE;AAAA,MACd,YAAY,EAAE;AAAA,MACd,WAAW,EAAE;AAAA,MACb,eAAe,EAAE;AAAA,MACjB,cAAc,EAAE;AAAA;AAAA,MAEhB,WAAW,EAAE,cAAc,CAAC,EAAE;AAAA,IAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,mBAAsC;AAC3C,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA,EAKA,WAAW,MAAe,YAAoB,SAA8B;AAC1E,QAAI,QAAQ;AACZ,QAAI;AACJ,QAAI;AACF,aAAO,GAAI,KAAK,KAAK,EAAE,MAAM,KAAK,GAAG,CAAC;AAAA,IACxC,QAAQ;AAEN,aAAO;AAAA,IACT;AAEA,SAAK,UAAU,CAAC,SAAS;AACvB,YAAM,QAAQ,aAAa,IAAI;AAC/B,UAAI,MAAM,KAAM;AAChB,YAAM,QAAQ,aAAa,IAAI;AAE/B,UAAI;AACJ,UAAI;AACF,cAAM,GAAI,EAAE,QAAQ,KAAK,QAAQ;AAAA,MACnC,QAAQ;AACN;AAAA,MACF;AAEA,iBAAW,OAAO,IAAI,OAAO;AAC3B,cAAM,YAAY;AAClB,aAAK,iBAAiB,KAAgC,MAAM,OAAO,OAAO,WAAW,OAAO;AAAA,MAC9F;AACA,eAAS;AAAA,IACX,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,iBACE,UACA,OACA,OACA,OACA,SACM;AACN,UAAM,YAAY,eAAe,QAAQ;AACzC,QAAI,gBAAgB;AACpB,QAAI,gBAAgB;AAEpB,cAAU,QAAQ,CAAC,UAAU,UAAU;AACrC,YAAM,YAAY,UAAU,UAAU,SAAS;AAC/C,YAAM,kBAAkB,QAAQ,UAAU,SAAS,IAAI,UAAU,QAAQ,CAAC,EAAG,iBAAiB;AAC9F,UAAI,gBAAiB,iBAAgB;AAErC,YAAM,UAAU,SAAS,MAAM,OAAO,CAAC,MAAM,GAAI,YAAY,CAAC,CAAC;AAC/D,YAAM,cAAc,SAAS,MAAM;AAAA,QACjC,CAAC,MACC,GAAI,MAAM,CAAC,KACX,GAAI,aAAa,CAAC,KAClB,GAAI,YAAY,CAAC,KACjB,GAAI,YAAY,CAAC,KACjB,GAAI,UAAU,CAAC;AAAA,MACnB;AACA,YAAM,UAAU,SAAS,MAAM,OAAO,CAAC,MAAM,GAAI,SAAS,CAAC,CAAC;AAC5D,YAAM,mBAAmB,QAAQ,KAAK,CAAC,MAAM,mBAAmB,IAAI,WAAW,CAAC,CAAC,CAAC;AAClF,YAAM,mBAAmB,QAAQ,KAAK,CAAC,MAAM,mBAAmB,IAAI,WAAW,CAAC,CAAC,CAAC;AAClF,YAAM,eAAe,QAAQ;AAAA,QAC3B,CAAC,MACC,GAAI,cAAc,CAAC,KACnB,CAAC,mBAAmB,IAAI,WAAW,CAAC,CAAC,KACrC,CAAC,mBAAmB,IAAI,WAAW,CAAC,CAAC;AAAA,MACzC;AACA,YAAM,iBAAiB,QAAQ,OAAO,CAAC,MAAM,gBAAgB,CAAC,CAAC;AAC/D,YAAM,YAAY,QAAQ,SAAS,KAAK,eAAe,oBAAoB,aAAa,SAAS;AAEjG,UAAI,iBAAkB,iBAAgB;AAEtC,iBAAW,OAAO,SAAS;AACzB,cAAM,QAAQ,IAAI;AAClB,aAAK,OAAO,IAAI,KAAK;AACrB,cAAM,IAAI,KAAK,UAAU,KAAK;AAC9B,UAAE,aAAa;AACf,YAAI,UAAW,GAAE,YAAY;AAC7B,YAAI,oBAAoB,OAAO,oBAAoB,IAAK,GAAE,aAAa;AACvE,YAAI,oBAAoB,OAAO,oBAAoB,IAAK,GAAE,YAAY;AACtE,YAAI,UAAW,GAAE,aAAa;AAC9B,YAAI,iBAAkB,GAAE,eAAe;AACvC,YAAI,oBAAoB,QAAQ,aAAa,oBAAoB,eAAe,SAAS,GAAG;AAC1F,YAAE,cAAc;AAAA,QAClB;AAKA,cAAM,kBACJ,UAAU,WAAW,KACrB,QAAQ,WAAW,KACnB,CAAC,eACD,CAAC,oBACD,CAAC,oBACD,eAAe,UAAU;AAC3B,YAAI,mBAAmB,MAAM,SAAS,GAAG;AACvC,gBAAM,YAA4B;AAAA,YAChC;AAAA,YACA,QAAQ,aAAa,IAAI,UAAU,EAAE,KAAK;AAAA,YAC1C,eAAe,eAAe,WAAW,IAAI,uBAAuB,eAAe,CAAC,CAAE,IAAI;AAAA,UAC5F;AACA,eAAK,cAAc,OAAO,EAAE,OAAO,OAAO,WAAW,MAAM,CAAC;AAAA,QAC9D;AAAA,MACF;AAGA,iBAAW,KAAK,SAAS;AACvB,cAAM,QAAQ,WAAW,CAAC,MAAM;AAChC,UAAE,YAAY,CAAC,UAAU;AACvB,gBAAM,QAAQ,MAAM;AACpB,eAAK,OAAO,IAAI,KAAK;AACrB,gBAAM,IAAI,KAAK,UAAU,KAAK;AAC9B,YAAE,aAAa;AACf,YAAE,cAAc;AAChB,cAAI,MAAO,GAAE,gBAAgB;AAAA,QAC/B,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,QAAI,iBAAiB,eAAe;AAClC,cAAQ,IAAI,SAAS,SAAS,EAAE,KAAK,CAAC;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,cAAc,OAAe,OAAwB;AACnD,UAAM,OAAO,KAAK,YAAY,IAAI,KAAK;AACvC,QAAI,KAAM,MAAK,KAAK,KAAK;AAAA,QACpB,MAAK,YAAY,IAAI,OAAO,CAAC,KAAK,CAAC;AAAA,EAC1C;AAAA,EAEA,UAAU,OAA6B;AACrC,QAAI,IAAI,KAAK,OAAO,IAAI,KAAK;AAC7B,QAAI,CAAC,GAAG;AACN,UAAI;AAAA,QACF,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,eAAe;AAAA,QACf,cAAc;AAAA,QACd,aAAa;AAAA,MACf;AACA,WAAK,OAAO,IAAI,OAAO,CAAC;AAAA,IAC1B;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,SAA4B,WAAwC;AACjF,UAAM,UAAuB,CAAC;AAC9B,eAAW,SAAS,IAAI,IAAI,OAAO,GAAG;AACpC,YAAM,OAAO,KAAK,YAAY,IAAI,KAAK;AACvC,UAAI,KAAM,SAAQ,KAAK,GAAG,IAAI;AAAA,IAChC;AACA,QAAI,QAAQ,WAAW,EAAG,QAAO,cAAc;AAG/C,YAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAExC,UAAM,MAAM,oBAAI,IAAqF;AACrG,eAAW,SAAS,SAAS;AAC3B,YAAM,MAAM,aAAa,MAAM,SAAS;AACxC,UAAI,QAAQ,IAAI,IAAI,GAAG;AACvB,UAAI,CAAC,OAAO;AACV,gBAAQ,EAAE,WAAW,MAAM,WAAW,OAAO,oBAAI,IAAI,EAAE;AACvD,YAAI,IAAI,KAAK,KAAK;AAAA,MACpB;AACA,YAAM,aAAa,UAAU,QAAQ,MAAM,KAAK;AAChD,YAAM,SAAsB,EAAE,MAAM,SAAS,YAAY,WAAW,MAAM,MAAM;AAChF,iBAAW,CAAC,MAAM,OAAO,SAAS,KAAK,MAAM,OAAO;AAClD,mBAAW,QAAQ,WAAW,qBAAqB,MAAM,OAAO,SAAS,GAAG;AAC1E,gBAAM,MAAM,IAAI,KAAK,UAAU,EAAE,GAAG,MAAM,OAAO,CAAC;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAEA,UAAM,YAAY,oBAAI,IAA8B;AACpD,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK;AAC9B,UAAI,MAAM,MAAM,SAAS,EAAG;AAC5B,gBAAU,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,OAAO,MAAM,MAAM,CAAC;AAAA,IACvE;AACA,QAAI,UAAU,SAAS,EAAG,QAAO,cAAc;AAC/C,WAAO,WAAW,kBAAkB,EAAE,QAAQ,UAAU,CAAC;AAAA,EAC3D;AAAA;AAAA,EAGA,gBAAyC;AACvC,QAAI,KAAK,SAAU,QAAO,KAAK;AAC/B,UAAM,MAAsB,CAAC;AAC7B,eAAW,SAAS,KAAK,YAAY,KAAK,GAAG;AAC3C,YAAM,SAAS,KAAK,eAAe,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC;AACnD,YAAM,QAAQ,oBAAI,IAAoB;AACtC,iBAAW,CAAC,IAAI,KAAK,KAAK,OAAO,QAAQ;AACvC,mBAAW,CAAC,MAAM,IAAI,KAAK,MAAM,MAAO,OAAM,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,CAAC;AAAA,MACvF;AACA,UAAI,MAAM,OAAO,EAAG,KAAI,KAAK,EAAE,OAAO,MAAM,CAAC;AAAA,IAC/C;AAEA,QAAI,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,OAAO,EAAE,MAAM,IAAI;AAC9C,SAAK,WAAW;AAChB,WAAO;AAAA,EACT;AACF;AAYO,SAAS,kBACd,WAA+B,CAAC,GAChC,SACe;AACf,SAAO,IAAI,kBAAkB,UAAU,OAAO;AAChD;;;ACvXA,uBAA8B;AAC9B,sBAA8B;;;ACpB9B,sBAA0B;AAkBnB,IAAM,WACX,OAAO,gBAAAC,YAAkB,aACrB,gBAAAA,UACC,gBAAAA,QAA+D;AAI/D,IAAM,YAAiC,CAAC,OAAO,KAAK;AAGpD,IAAM,UAAU;AAYhB,SAAS,QAAQ,MAAuB;AAC7C,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,KAAK;AAAA,IACd,KAAK;AACH,aAAO,GAAG,QAAQ,KAAK,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI;AAAA,IACtD,KAAK;AACH,aAAO,GAAG,KAAK,UAAU,IAAI,IAAI,KAAK,KAAK,IAAI;AAAA,EACnD;AACF;AAGO,SAAS,gBAAgB,MAAwB;AACtD,MAAI,KAAK,SAAS,sBAAuB,QAAO;AAChD,MAAI,KAAK,SAAS,oBAAqB,QAAO;AAC9C,SAAO,SAAS,KAAK,KAAK,IAAI;AAChC;AAEO,SAAS,SAAS,MAAoC;AAC3D,SAAO,KAAK,SAAS,sBACjB,GAAG,KAAK,UAAU,IAAI,IAAI,KAAK,KAAK,IAAI,KACxC,KAAK;AACX;AAEO,SAAS,SAAS,MAA2B;AAClD,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAGO,SAAS,YAAY,MAAgC;AAC1D,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAaO,SAAS,mBAAmB,MAA+C;AAChF,QAAM,MAAoC,CAAC;AAC3C,QAAM,OAAO,oBAAI,IAAe;AAEhC,QAAM,QAAQ,CAAC,MAA0C;AACvD,QAAI,CAAC,KAAK,KAAK,IAAI,CAAC,EAAG;AACvB,SAAK,IAAI,CAAC;AACV,YAAQ,EAAE,MAAM;AAAA,MACd,KAAK;AAAA,MACL,KAAK;AACH,YAAI,KAAK,CAAC;AACV;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,cAAM,EAAE,UAAU;AAClB;AAAA,MACF,KAAK;AACH,cAAM,EAAE,IAAI;AACZ,cAAM,EAAE,KAAK;AACb;AAAA,MACF,KAAK;AACH,cAAM,EAAE,UAAU;AAClB,cAAM,EAAE,SAAS;AACjB;AAAA,MACF,KAAK;AACH,mBAAW,KAAK,EAAE,YAAa,OAAM,CAAC;AACtC;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAGH,mBAAW,KAAK,EAAE,UAAW,OAAM,CAAc;AACjD;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,cAAM,EAAE,IAAI;AACZ;AAAA,MACF,KAAK;AACH,mBAAW,KAAK,EAAE,KAAM,OAAM,CAAC;AAC/B;AAAA,MACF,KAAK;AACH,cAAM,EAAE,QAAQ;AAChB;AAAA,MACF,KAAK;AACH,cAAM,EAAE,UAAU;AAClB,cAAM,EAAE,SAAS;AACjB;AAAA,MACF,KAAK;AACH,mBAAW,MAAM,EAAE,SAAU,OAAM,EAAe;AAClD;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,IAAI;AACV,SAAO;AACT;AAEO,SAAS,aAAa,IAAY,MAAuB;AAC9D,MAAI,aAAa,KAAK,EAAE,EAAG,QAAO;AAClC,SAAO,yBAAyB,KAAK,IAAI;AAC3C;;;ACzKA,oBAAoC;AAwD7B,SAAS,QAAQ,MAAc,KAAwC;AAC5E,QAAM,cAA4B,CAAC;AACnC,QAAM,MAAkB,eAAe,KAAK;AAC5C,QAAM,UAAU,IAAI;AAEpB,QAAM,UAAM,cAAAC,OAAW,MAAM;AAAA,IAC3B,YAAY;AAAA,IACZ,SAAS,CAAC,OAAO,YAAY;AAAA,EAC/B,CAAC;AAED,QAAM,MAAqB,KAAK,SAAS,MAAM,IAAI,SAAS;AAC5D,QAAM,aAAyB;AAAA,IAC7B,IAAI;AAAA,IACJ,MAAM,IAAI;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV;AAAA,IACA,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AACA,MAAI,QAAQ,IAAI,SAAS,UAAU;AAInC,QAAM,SAAS,CAAC,SAAuC;AACrD,QAAI,KAAK,SAAS,QAAQ,KAAK,OAAO,KAAM,QAAO;AACnD,UAAM,OAAmB;AAAA,MACvB,MAAM;AAAA,MACN,OAAO,KAAK;AAAA,MACZ,KAAK,KAAK;AAAA,MACV,UAAU,KAAK,MACX,EAAE,MAAM,KAAK,IAAI,MAAM,MAAM,QAAQ,KAAK,IAAI,MAAM,OAAO,IAC3D;AAAA,MACJ,QAAQ,KAAK,MAAM,EAAE,MAAM,KAAK,IAAI,IAAI,MAAM,QAAQ,KAAK,IAAI,IAAI,OAAO,IAAI;AAAA,IAChF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,CAAC,SACf,KAAK,SAAS,QAAQ,KAAK,OAAO,OAAO,KAAK,KAAK,MAAM,KAAK,OAAO,KAAK,GAAG;AAG/E,QAAM,aAAa,CAAC,MAAuC,WAA6B;AACtF,UAAM,UAAuB,EAAE,MAAM,QAAQ,IAAI,GAAG,OAAO;AAC3D,WAAO,IAAI,MAAM,OAAO;AAAA,MACtB,MAAM,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,OAAO,GAAG,KAAK,EAAE;AAAA,MACxD,MAAM,SAAS,IAAI;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AAIA,QAAM,cAAc,CAAC,QACnB,IACG,MAAM,KAAK,EACX,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAC1B,IAAI,CAAC,WAAW,EAAE,MAAM,EAAgB;AAE7C,QAAM,iBAAiB,CAAC,SAAkC;AACxD,UAAM,WAAW,OAAO,IAAI,KAAK;AACjC,UAAM,IAAI,KAAK;AAEf,UAAM,aAAa,CAAC,QAAsB,cAA4C;AACpF,YAAM,MAAoB,EAAE,MAAM,UAAU,MAAM,aAAa,QAAW,OAAO;AACjF,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU,CAAC,GAAG;AAAA,QACd;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,YAAY;AAAA,MACd;AAAA,IACF;AAEA,QAAI,KAAK,KAAM,QAAO,WAAW,CAAC,GAAG,IAAI;AAEzC,QAAI,EAAE,SAAS,iBAAiB;AAC9B,aAAO,WAAW,YAAY,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC;AAAA,IACnD;AAEA,QAAI,EAAE,SAAS,0BAA0B;AACvC,YAAM,OAAO,EAAE;AAEf,UAAI,KAAK,SAAS,iBAAiB;AACjC,eAAO,WAAW,YAAY,KAAK,KAAK,GAAG,OAAO,IAAI,CAAC;AAAA,MACzD;AACA,UAAI,KAAK,SAAS,qBAAsB,QAAO,WAAW,CAAC,GAAG,IAAI;AAClE,YAAM,MAAM,WAAW,MAAM,KAAK;AAClC,YAAM,YAAY,OAAO,IAAI;AAC7B,YAAM,MAAoB,EAAE,MAAM,WAAW,MAAM,aAAa,QAAW,MAAM,IAAI;AACrF,aAAO;AAAA,QACL,MAAM,YAAY,IAAI;AAAA,QACtB,UAAU,CAAC,GAAG;AAAA,QACd;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,YAAY;AAAA,MACd;AAAA,IACF;AAEA,WAAO,eAAe;AAAA,EACxB;AAEA,QAAMC,kBAAiB,CAAC,YAAiC;AACvD,UAAM,MAAgB,CAAC;AACvB,eAAW,OAAO,QAAQ,UAAU;AAClC,UAAI,IAAI,SAAS,SAAU,YAAW,KAAK,IAAI,OAAQ,KAAI,KAAK,EAAE,KAAK;AAAA,IACzE;AACA,WAAO;AAAA,EACT;AAIA,QAAM,iBAAiB,CAAC,SAAkC;AACxD,UAAM,IAAI,KAAK;AACf,QAAI,KAAK,KAAM,QAAO,EAAE,MAAM,UAAU,OAAO,MAAM,MAAM,OAAO,IAAI,KAAK,OAAU;AACrF,QAAI,EAAE,SAAS,iBAAiB;AAC9B,aAAO,EAAE,MAAM,UAAU,OAAO,EAAE,OAAO,MAAM,OAAO,CAAC,KAAK,OAAU;AAAA,IACxE;AACA,QAAI,EAAE,SAAS,0BAA0B;AACvC,UAAI,EAAE,WAAW,SAAS,sBAAsB;AAC9C,eAAO,EAAE,MAAM,UAAU,OAAO,MAAM,MAAM,OAAO,CAAC,KAAK,OAAU;AAAA,MACrE;AACA,aAAO,EAAE,MAAM,WAAW,MAAM,WAAW,EAAE,YAAY,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,OAAU;AAAA,IAChG;AAEA,WAAO,EAAE,MAAM,WAAW,MAAM,WAAW,GAAiB,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,OAAU;AAAA,EACnG;AAIA,QAAM,kBAAkB,CAAC,KAA+B,aACtD,IAAI,SAAS,gBAAgB,cAAc,KAAK,QAAQ,IAAI,aAAa,KAAK,QAAQ;AAGxF,QAAM,cAAc,CAClB,MACA,UACA,QACS;AACT,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK,WAAW;AACd,cAAM,KAAK,IAAI,MAAM,KAAK;AAC1B,YAAI,MAAM;AAAA,UACR;AAAA,UACA,WAAW,IAAI,KAAK,OAAO;AAAA,YACzB,QAAQ;AAAA,YACR,MAAM,OAAO,IAAI;AAAA,YACjB,aAAa,QAAQ,KAAK,KAAK,KAAK;AAAA,UACtC,CAAC;AAAA,QACH;AACA,YAAI,KAAK,EAAE;AACX;AAAA,MACF;AAAA,MACA,KAAK,0BAA0B;AAC7B,cAAM,OAAO,KAAK;AAClB,YAAI,KAAK,SAAS,qBAAsB;AAGxC,YAAI,KAAK,SAAS,gBAAgB,KAAK,SAAS,eAAe;AAC7D,cAAI,KAAK,gBAAgB,MAAM,QAAQ,CAAC;AACxC;AAAA,QACF;AAGA,cAAM,KAAK,IAAI,MAAM,KAAK;AAC1B,cAAM,MAAM,WAAW,MAAM,KAAK;AAClC,YAAI,MAAM,IAAI,IAAI,WAAW,IAAI,KAAK,EAAE,QAAQ,UAAU,MAAM,OAAO,IAAI,EAAE,CAAC,CAAC;AAC/E,YAAI,KAAK,EAAE;AAIX,mBAAW,OAAO,mBAAmB,IAAI,EAAG,KAAI,KAAK,gBAAgB,KAAK,QAAQ,CAAC;AACnF;AAAA,MACF;AAAA,MACA,KAAK,kBAAkB;AACrB,cAAM,KAAK,IAAI,MAAM,KAAK;AAC1B,cAAM,MAAM,WAAW,KAAK,YAAY,IAAI;AAC5C,YAAI,MAAM,IAAI,IAAI,WAAW,IAAI,KAAK,EAAE,QAAQ,UAAU,MAAM,OAAO,IAAI,EAAE,CAAC,CAAC;AAC/E,YAAI,KAAK,EAAE;AACX,mBAAW,OAAO,mBAAmB,KAAK,UAAU,GAAG;AACrD,cAAI,KAAK,gBAAgB,KAAK,QAAQ,CAAC;AAAA,QACzC;AACA;AAAA,MACF;AAAA,MACA,KAAK;AACH,YAAI,KAAK,aAAa,MAAM,QAAQ,CAAC;AACrC;AAAA,MACF,KAAK;AACH,YAAI,KAAK,cAAc,MAAM,QAAQ,CAAC;AACtC;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,MAAmB,aAAiC;AACzE,UAAM,KAAK,IAAI,MAAM,KAAK;AAC1B,UAAM,WAAuB,CAAC;AAC9B,eAAW,KAAK,KAAK,SAAU,aAAY,GAAG,IAAI,QAAQ;AAC1D,QAAI,MAAM,IAAI,IAAI,eAAe,IAAI,EAAE,UAAU,QAAQ,UAAU,MAAM,OAAO,IAAI,EAAE,CAAC,CAAC;AACxF,YAAQ,IAAI,IAAI;AAAA,MACd,QAAQ;AAAA,MACR,MAAM,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,OAAO,GAAG,KAAK,EAAE;AAAA,MACxD,aAAa,OAAO,KAAK,eAAe;AAAA,MACxC,cAAc,OAAO,KAAK,eAAe;AAAA,MACzC,WAAW;AAAA,MACX,aAAa;AAAA,IACf,CAAC;AACD,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,CAAC,MAAkB,aAAiC;AACvE,UAAM,KAAK,IAAI,MAAM,KAAK;AAC1B,UAAM,UAA6B,KAAK;AACxC,UAAM,MAAM,QAAQ,QAAQ,IAAI;AAChC,UAAM,YAAY,gBAAgB,QAAQ,IAAI;AAE9C,UAAM,OAAiB,YAAY;AACnC,SAAK,cAAc;AAEnB,QAAI,UAAqB,eAAe;AACxC,UAAM,UAAU,oBAAI,IAAuB;AAC3C,UAAM,QAAkB,CAAC;AACzB,UAAM,UAAqB,CAAC;AAE5B,eAAW,QAAQ,QAAQ,YAAY;AACrC,UAAI,KAAK,SAAS,sBAAsB;AACtC,gBAAQ,KAAK,WAAW,KAAK,UAAU,IAAI,CAAC;AAC5C,aAAK,iBAAiB;AACtB;AAAA,MACF;AACA,YAAM,OAAO,SAAS,KAAK,IAAI;AAC/B,UAAI,SAAS,eAAe,SAAS,SAAS;AAC5C,kBAAU,eAAe,IAAI;AAC7B;AAAA,MACF;AACA,UAAI,SAAS,MAAO,MAAK,SAAS;AAAA,eACzB,SAAS,MAAO,MAAK,SAAS;AAAA,eAC9B,SAAS,0BAA2B,MAAK,mBAAmB;AAAA,eAC5D,WAAW,KAAK,IAAI,EAAG,MAAK,mBAAmB;AACxD,cAAQ,IAAI,MAAM,eAAe,IAAI,CAAC;AACtC,YAAM,KAAK,IAAI;AAAA,IACjB;AAEA,UAAM,QAAiB,EAAE,SAAS,SAAS,MAAM;AAEjD,UAAM,WAAuB,CAAC;AAC9B,eAAW,KAAK,KAAK,SAAU,aAAY,GAAG,IAAI,QAAQ;AAC1D,eAAW,OAAO,UAAU;AAC1B,YAAM,KAAK,IAAI,MAAM,IAAI,GAAG;AAC5B,UAAI,MAAM,GAAG,SAAS,QAAQ;AAC5B,aAAK,qBAAqB;AAC1B;AAAA,MACF;AAAA,IACF;AAGA,QAAIC,YAAqB,cAAc;AACvC,QAAI,CAAC,QAAQ,YAAY;AACvB,YAAM,SAASD,gBAAe,OAAO;AACrC,UAAI,OAAO,SAAS,GAAG;AACrB,cAAM,MAAM,IAAI,SAAS,QAAQ;AAAA,UAC/B,SAAS;AAAA,UACT,SAAS,EAAE,SAAS,KAAK,WAAW,YAAY,SAAY,OAAO;AAAA,QACrE,CAAC;AACD,QAAAC,YAAW,IAAI,WAAW,kBAAkB,IAAI,MAAM;AACtD,mBAAW,KAAK,IAAI,UAAU;AAC5B,sBAAY,KAAK;AAAA,YACf,MAAM;AAAA,YACN,UAAU,EAAE;AAAA,YACZ,SAAS,EAAE;AAAA,YACX,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,UAAM,YAAyB,YAAY,cAAc;AACzD,UAAM,KAAgB,cAAc,IAAI;AAAA,MACtC;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,aAAa,QAAQ;AAAA,MACrB;AAAA,MACA,UAAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,MAAM,OAAO,IAAI;AAAA,MACjB;AAAA,IACF,CAAC;AACD,QAAI,MAAM,IAAI,IAAI,EAAE;AAEpB,UAAM,QACJ,SAAS,SAAS,IACd,OAAO,KAAK,SAAS,CAAC,CAAe,KAAK,OAAO,KAAK,SAAS,GAAG,EAAE,CAAe,IACjF;AAAA,MACE,MAAM;AAAA,MACN,OAAO,OAAO,KAAK,SAAS,CAAC,CAAe,EAAG;AAAA,MAC/C,KAAK,OAAO,KAAK,SAAS,GAAG,EAAE,CAAe,EAAG;AAAA,IACnD,IACA,OACF;AACN,YAAQ,IAAI,IAAI;AAAA,MACd,QAAQ;AAAA,MACR,MAAM,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,OAAO,GAAG,KAAK,EAAE;AAAA,MACxD,aAAa,OAAO,OAAO;AAAA,MAC3B,cAAc,KAAK,iBAAiB,OAAO,KAAK,cAAc,IAAI;AAAA,MAClE,WAAW;AAAA,MACX,aAAa,QAAQ;AAAA,IACvB,CAAC;AACD,WAAO;AAAA,EACT;AAIA,QAAM,QAAsC,CAAC;AAC7C,WAAS,KAAK;AAAA,IACZ,WAAWC,OAA4B;AACrC,YAAM,KAAKA,MAAK,IAAI;AACpB,MAAAA,MAAK,KAAK;AAAA,IACZ;AAAA,IACA,YAAYA,OAA6B;AACvC,YAAM,KAAKA,MAAK,IAAI;AACpB,MAAAA,MAAK,KAAK;AAAA,IACZ;AAAA,EACF,CAAC;AAED,QAAM,WAAW,IAAI,MAAM,IAAI,IAAI,IAAI;AACvC,aAAW,KAAK,OAAO;AACrB,UAAM,KAAK,EAAE,SAAS,gBAAgB,cAAc,GAAG,IAAI,IAAI,IAAI,aAAa,GAAG,IAAI,IAAI;AAC3F,aAAS,SAAS,KAAK,EAAE;AAAA,EAC3B;AAEA,SAAO,EAAE,KAAK,YAAY;AAC5B;;;ACnYO,IAAM,cAAwB;AAAA,EACnC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS,IAAY,MAAuB;AAC1C,WAAO,aAAa,IAAI,IAAI;AAAA,EAC9B;AAAA,EACA,MAAM,MAAc,KAAwC;AAC1D,WAAO,QAAQ,MAAM,GAAG;AAAA,EAC1B;AACF;AAGO,SAAS,oBAA8B;AAC5C,SAAO;AACT;;;ACnBA,0BAAwB;AAoBxB,IAAMC,aAAiC,CAAC,OAAO,KAAK;AAUpD,SAAS,SAAS,KAAiB,KAA2B;AAC5D,QAAM,MAAM,IAAI,MAAM,IAAI,GAAG;AAC7B,QAAM,UAAU,KAAK;AACrB,MAAI,WAAW,OAAO,QAAQ,SAAS,UAAU;AAC/C,WAAO,EAAE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,WAAW,KAAK;AAAA,EAC/D;AACA,MAAI,KAAK;AACP,UAAM,KAAK,IAAI,QAAQ,IAAI,IAAI,KAAK,IAAI;AACxC,QAAI,GAAI,QAAO,EAAE,MAAM,GAAG,KAAK,MAAM,IAAI,KAAK,OAAO,IAAI,KAAK,GAAG,GAAG,QAAQ,MAAM;AAAA,EACpF;AACA,SAAO,EAAE,MAAM,IAAI,QAAQ,MAAM;AACnC;AAGA,SAASC,gBAAe,SAA8B;AACpD,QAAM,MAAgB,CAAC;AACvB,aAAW,OAAO,QAAQ,UAAU;AAClC,QAAI,IAAI,SAAS,SAAU,YAAW,KAAK,IAAI,OAAQ,KAAI,KAAK,EAAE,KAAK;AAAA,EACzE;AACA,SAAO;AACT;AAKA,SAAS,cAAc,KAAoC;AACzD,aAAW,MAAM,IAAI,QAAQ,OAAO,GAAG;AACrC,QAAI,OAAO,GAAG,SAAS,YAAY,GAAG,KAAK,SAAS,EAAG,QAAO;AAAA,EAChE;AACA,SAAO;AACT;AAGA,SAAS,YAAY,KAA2B;AAC9C,QAAM,MAAgB,CAAC;AACvB,QAAM,OAAO,oBAAI,IAAc;AAC/B,QAAM,QAAQ,CAAC,OAAuB;AACpC,QAAI,KAAK,IAAI,EAAE,EAAG;AAClB,SAAK,IAAI,EAAE;AACX,UAAM,IAAI,IAAI,MAAM,IAAI,EAAE;AAC1B,QAAI,CAAC,EAAG;AACR,QAAI,KAAK,CAAC;AACV,QAAI,EAAE,SAAS,aAAa,EAAE,SAAS,WAAY,YAAW,KAAK,EAAE,SAAU,OAAM,CAAC;AAAA,EACxF;AACA,QAAM,IAAI,IAAI;AACd,SAAO;AACT;AAGA,SAAS,iBAAiB,GAAe,GAAwB;AAC/D,MAAI,EAAE,SAAS,EAAE,KAAM,QAAO;AAC9B,MAAI,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,IAAK,QAAO,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE;AACtF,SAAO;AACT;AAWA,SAAS,YAAY,IAAiB,KAAiB,IAAgB,IAAwB;AAC7F,QAAM,UAAU,GAAG;AAEnB,MAAI,QAAQ,cAAc,QAAQ,OAAQ,QAAO;AAEjD,QAAM,SAASA,gBAAe,OAAO;AACrC,QAAM,YAAY,QAAQ;AAE1B,MAAI,aAAa,UAAU,SAAS,GAAG,IAAI;AACzC,UAAM,UAAU,GAAG,KAAK,MAAM,UAAU,OAAO,UAAU,GAAG;AAE5D,UAAM,QAAQ,QAAQ,WAAW,GAAG,IAAI,MAAM;AAC9C,UAAM,OAAO,GAAG,KAAK,GAAG,OAAO,KAAK,GAAG,CAAC,GAAG,KAAK;AAChD,QAAI,YAAY,MAAM;AACpB,SAAG,UAAU,UAAU,OAAO,UAAU,KAAK,IAAI;AACjD,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,MAAI,GAAG,YAAa,QAAO;AAC3B,QAAM,OAAO,IAAI,QAAQ,IAAI,GAAG,EAAE;AAClC,QAAM,UAAU,MAAM;AACtB,MAAI,CAAC,WAAW,QAAQ,SAAS,GAAG,GAAI,QAAO;AAE/C,QAAM,WAAW,QAAQ,QAAQ,IAAI,GAAG,IAAI;AAC5C,KAAG,WAAW,UAAU,eAAe,OAAO,KAAK,GAAG,CAAC,GAAG;AAC1D,SAAO;AACT;AAQA,SAAS,eAAe,SAAgC;AACtD,QAAM,IAAI,mBAAmB,KAAK,OAAO;AACzC,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE;AAChC,MAAI,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE;AACvB,QAAM,KAAK,QAAQ,CAAC;AACpB,MAAI,OAAO,KAAK;AACd,QAAI,QAAQ;AACZ,WAAO,IAAI,QAAQ,QAAQ,KAAK,GAAG;AACjC,YAAM,IAAI,QAAQ,CAAC;AACnB,UAAI,MAAM,IAAK,UAAS;AAAA,eACf,MAAM,KAAK;AAClB,iBAAS;AACT,YAAI,UAAU,GAAG;AACf,eAAK;AACL;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,WAAW,OAAO,OAAO,OAAO,KAAK;AACnC,UAAM,IAAI;AACV,SAAK;AACL,WAAO,IAAI,QAAQ,QAAQ,KAAK,GAAG;AACjC,UAAI,QAAQ,CAAC,MAAM,GAAG;AACpB,aAAK;AACL;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AACL,WAAO,IAAI,QAAQ,QAAQ,KAAK,GAAG;AACjC,UAAI,SAAS,KAAK,QAAQ,CAAC,CAAE,EAAG;AAAA,IAClC;AAAA,EACF;AACA,SAAO,QAAQ,MAAM,UAAU,CAAC;AAClC;AASA,SAAS,oBACP,IACA,KACA,IACA,QACA,MACM;AACN,QAAM,OAAO,OAAO;AACpB,MAAI,CAAC,QAAQ,KAAK,SAAS,GAAG,GAAI;AAClC,QAAM,UAAU,eAAe,GAAG,KAAK,MAAM,KAAK,OAAO,KAAK,GAAG,CAAC;AAClE,MAAI,CAAC,QAAS;AAEd,QAAM,SAAsB,CAAC;AAC7B,aAAW,KAAK,MAAM;AACpB,QAAI,EAAE,SAAS,aAAa,CAAC,EAAE,QAAQ,EAAE,KAAK,SAAS,GAAG,GAAI;AAC9D,QAAI,iBAAiB,OAAO,MAAM,EAAE,IAAI,EAAG,QAAO,KAAK,CAAC;AAAA,EAC1D;AAEA,QAAM,UAAU,OAAO;AAAA,IACrB,CAAC,MAAM,CAAC,OAAO,KAAK,CAAC,MAAM,MAAM,KAAK,EAAE,QAAQ,EAAE,QAAQ,iBAAiB,EAAE,MAAM,EAAE,IAAI,CAAC;AAAA,EAC5F;AACA,MAAI,QAAQ,WAAW,EAAG;AAE1B,QAAM,QAAQ,QAAQ,CAAC;AACvB,QAAM,YAAY,IAAI,QAAQ,IAAI,MAAM,EAAE,GAAG;AAC7C,MAAI,CAAC,aAAa,UAAU,SAAS,GAAG,GAAI;AAC5C,MAAI,eAAe,GAAG,KAAK,MAAM,UAAU,OAAO,UAAU,GAAG,CAAC,EAAG;AAGnE,KAAG,WAAW,UAAU,QAAQ,IAAI,MAAM,IAAI,QAAQ,IAAI,OAAO,EAAE;AACrE;AAGA,SAAS,cAAc,KAAgC;AACrD,QAAM,KAAK,cAAc,GAAG;AAC5B,MAAI,CAAC,GAAI,QAAO;AAEhB,QAAM,KAAK,IAAI,oBAAAC,QAAY,GAAG,IAAI;AAElC,QAAM,OAAO,YAAY,GAAG;AAC5B,QAAM,YAA0B,CAAC;AACjC,aAAW,KAAK,KAAM,KAAI,EAAE,QAAQ,EAAE,KAAK,SAAS,GAAG,GAAI,WAAU,KAAK,EAAE,IAAI;AAKhF,QAAM,UAA2B,CAAC;AAClC,aAAW,MAAM,WAAW,GAAG,GAAG;AAChC,QAAI,IAAI,MAAM,IAAI,EAAE,EAAG;AACvB,UAAM,OAAO,IAAI,QAAQ,IAAI,EAAE;AAC/B,QAAI,CAAC,QAAQ,KAAK,KAAK,SAAS,GAAG,GAAI;AACvC,UAAM,YAAY,UAAU,KAAK,CAAC,MAAM,iBAAiB,KAAK,MAAM,CAAC,CAAC;AACtE,YAAQ,KAAK,EAAE,SAAS,MAAM,UAAU,CAAC;AAAA,EAC3C;AAIA,QAAM,eAAe,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI;AAClF,aAAW,KAAK,SAAS;AACvB,UAAM,OAAO,EAAE,QAAQ;AACvB,UAAM,gBAAgB,aAAa,KAAK,CAAC,MAAM,MAAM,QAAQ,iBAAiB,GAAG,IAAI,CAAC;AACtF,QAAI,cAAe;AAEnB,QAAI,EAAE,WAAW;AAEf,0BAAoB,IAAI,KAAK,IAAI,EAAE,SAAS,IAAI;AAEhD,YAAM,OAAO,EAAE,QAAQ;AACvB,YAAM,QAAQ,EAAE,QAAQ;AACxB,UAAI,QAAQ,KAAK,SAAS,GAAG,MAAM,KAAK,MAAM,KAAK,MAAO,IAAG,OAAO,KAAK,OAAO,KAAK,GAAG;AACxF,UAAI,SAAS,MAAM,SAAS,GAAG,MAAM,MAAM,MAAM,MAAM,OAAO;AAC5D,WAAG,OAAO,MAAM,OAAO,MAAM,GAAG;AAAA,MAClC;AAAA,IACF,OAAO;AACL,SAAG,OAAO,KAAK,OAAO,KAAK,GAAG;AAAA,IAChC;AAAA,EACF;AAGA,aAAW,KAAK,MAAM;AACpB,QAAI,EAAE,SAAS,UAAW,aAAY,IAAI,KAAK,IAAI,CAAC;AAAA,EACtD;AAEA,SAAO,GAAG,SAAS;AACrB;AAGA,SAAS,WAAW,KAA6B;AAM/C,QAAM,MAAkB,CAAC;AACzB,QAAM,MAAM,IAAI,MAAM;AACtB,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK,GAAG;AAC/B,UAAM,KAAK;AACX,QAAI,IAAI,QAAQ,IAAI,EAAE,EAAG,KAAI,KAAK,EAAE;AAAA,EACtC;AACA,SAAO;AACT;AAKA,SAAS,UAAU,KAAiB,SAAmC;AACrE,MAAI,QAAQ,SAAS,YAAY,QAAQ,SAAS,WAAW,EAAG,QAAO;AAEvE,QAAM,UAAU,QAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS;AACjE,MAAI,WAAW,QAAQ,SAAS,WAAW;AACzC,WAAO,cAAc,SAAS,KAAK,QAAQ,IAAI,EAAE,IAAI;AAAA,EACvD;AAEA,QAAM,SAASD,gBAAe,OAAO;AACrC,SAAO,cAAc,OAAO,KAAK,GAAG,CAAC;AACvC;AAEA,SAAS,SAAS,KAAiB,MAAc,OAA0B;AACzE,MAAI,MAAM,SAAS,UAAU;AAC3B,QAAI,MAAM,UAAU,KAAM,QAAO;AACjC,QAAI,MAAM,UAAU,MAAO,QAAO;AAClC,WAAO,GAAG,IAAI,KAAK,OAAO,MAAM,KAAK,CAAC;AAAA,EACxC;AACA,SAAO,GAAG,IAAI,KAAK,SAAS,KAAK,MAAM,IAAI,EAAE,IAAI;AACnD;AAEA,SAAS,aAAa,KAAiB,IAAuB;AAC5D,QAAM,QAAkB,CAAC;AAEzB,QAAM,MAAM,UAAU,KAAK,GAAG,OAAO;AACrC,MAAI,QAAQ,KAAM,OAAM,KAAK,GAAG;AAEhC,aAAW,QAAQ,GAAG,MAAM,OAAO;AACjC,UAAM,IAAI,GAAG,MAAM,QAAQ,IAAI,IAAI;AACnC,QAAI,CAAC,EAAG;AACR,UAAM,OAAO,SAAS,KAAK,MAAM,CAAC;AAClC,QAAI,KAAK,SAAS,EAAG,OAAM,KAAK,IAAI;AAAA,EACtC;AAEA,aAAW,OAAO,GAAG,MAAM,QAAS,OAAM,KAAK,OAAO,SAAS,KAAK,GAAG,EAAE,IAAI,GAAG;AAEhF,QAAM,UAAU,MAAM,SAAS,IAAI,IAAI,MAAM,KAAK,GAAG,CAAC,KAAK;AAC3D,QAAM,MAAM,GAAG;AAEf,MAAI,GAAG,SAAS,WAAW,GAAG;AAC5B,WAAO,GAAG,cAAc,IAAI,GAAG,GAAG,OAAO,QAAQ,IAAI,GAAG,GAAG,OAAO,MAAM,GAAG;AAAA,EAC7E;AAEA,QAAM,QAAQ,GAAG,SAAS,IAAI,CAAC,MAAM,UAAU,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE;AAC/D,SAAO,IAAI,GAAG,GAAG,OAAO,IAAI,KAAK,KAAK,GAAG;AAC3C;AAEA,SAAS,UAAU,KAAiB,IAAsB;AACxD,QAAM,OAAO,IAAI,MAAM,IAAI,EAAE;AAC7B,MAAI,CAAC,KAAM,QAAO;AAClB,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,KAAK;AAAA,IACd,KAAK;AACH,aAAO,MAAM,KAAK,KAAK;AAAA,IACzB,KAAK,QAAQ;AACX,YAAM,EAAE,MAAM,OAAO,IAAI,SAAS,KAAK,KAAK,IAAI;AAChD,aAAO,SAAS,OAAO,IAAI,MAAM,IAAI,IAAI;AAAA,IAC3C;AAAA,IACA,KAAK;AACH,aAAO,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,UAAU,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA,IAClE,KAAK;AACH,aAAO,aAAa,KAAK,IAAI;AAAA,EACjC;AACF;AAEA,SAAS,QAAQ,KAAyB;AACxC,QAAM,OAAO,IAAI,MAAM,IAAI,IAAI,IAAI;AACnC,MAAI,CAAC,QAAQ,KAAK,SAAS,WAAY,QAAO,UAAU,KAAK,IAAI,IAAI;AACrE,SAAO,KAAK,SAAS,IAAI,CAAC,MAAM,UAAU,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE;AAC5D;AAIA,SAAS,QAAQ,KAAyB;AACxC,QAAM,WAAW,cAAc,GAAG;AAClC,SAAO,YAAY,QAAQ,GAAG;AAChC;AAEO,IAAM,aAAsB;AAAA,EACjC,MAAM;AAAA,EACN,OAAOD;AAAA,EACP,MAAM,KAAiB,OAAiB,MAAqC;AAC3E,UAAM,OAAO,QAAQ,GAAG;AACxB,WAAO,EAAE,MAAM,KAAK,MAAM,OAAO,CAAC,GAAG,aAAa,CAAC,EAAE;AAAA,EACvD;AACF;AAGO,SAAS,mBAA4B;AAC1C,SAAO;AACT;;;AC/WO,SAAS,UAAU,IAA6B;AACrD,QAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,EAAE,CAAC,KAAK;AACrC,MAAI,MAAM,SAAS,MAAM,EAAG,QAAO;AACnC,MAAI,MAAM,SAAS,MAAM,EAAG,QAAO;AACnC,SAAO;AACT;AAGA,SAASG,OAAM,KAAgC;AAC7C,aAAW,OAAO,IAAI,QAAQ,OAAO,EAAG,QAAO,IAAI;AACnD,SAAO;AACT;AAGA,SAAS,YAAY,UAAsC;AACzD,QAAM,UAAU,oBAAI,IAA0B;AAC9C,aAAW,KAAK,UAAU;AACxB,UAAM,QAAS,EAAE,SAAS,MAAM,KAAK,CAAC,EAAE,CAAC,KAAK;AAC9C,QAAI,SAAS,QAAQ,IAAI,KAAK;AAC9B,QAAI,CAAC,QAAQ;AACX,eAAS,CAAC;AACV,cAAQ,IAAI,OAAO,MAAM;AAAA,IAC3B;AACA,WAAO,KAAK,CAAC;AAAA,EACf;AACA,QAAM,SAAiB,CAAC;AACxB,aAAW,CAAC,OAAO,IAAI,KAAK,SAAS;AACnC,WAAO,KAAK,EAAE,OAAO,UAAU,GAAG,KAAK,YAA4B,UAAU,KAAK,CAAC;AAAA,EACrF;AACA,SAAO;AACT;AAUA,SAAS,gBACP,MACA,IACA,MACA,UACA,UACA,QACA,MACa;AACb,QAAM,SAAS,kBAAkB,EAAE,MAAM,MAAM;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,cAAc,MAAM;AAAA,IAAC;AAAA,EACvB,CAAC;AACD,QAAM,MAAM,OAAO;AAInB,aAAW,QAAQ,IAAI,MAAM,OAAO,EAAG,MAAK,KAAK,cAAc;AAE/D,QAAM,MAAoB;AAAA,IACxB;AAAA,IACA,eAAe;AAAA,IACf;AAAA;AAAA;AAAA;AAAA,IAIA,WAAW,mBAAmB,KAAK,QAAQ;AAAA,IAC3C;AAAA,IACA;AAAA,EACF;AACA,SAAO,EAAE,KAAK,KAAK,QAAQ,YAAY,QAAQ,EAAE;AACnD;AAGA,SAAS,eAAe,WAAuB,IAAY,UAAiC;AAC1F,0BAAwB,WAAW,UAAU,UAAU;AACvD,QAAM,UAAU,iBAAiB,EAAE;AAAA,IACjC;AAAA,IACA,EAAE,UAAU,IAAI,KAAK,CAAC,GAAG,YAAY,oBAAI,IAAI,EAAE;AAAA,IAC/C;AAAA,MACE;AAAA,MACA;AAAA,MACA,MAAM,oBAAoB;AAAA,MAC1B,KAAKA,OAAM,SAAS;AAAA,MACpB,cAAc,MAAM;AAAA,MAAC;AAAA,IACvB;AAAA,EACF;AACA,SAAO,QAAQ;AACjB;AAGO,SAAS,eACd,MACA,IACA,MACA,UACA,UACA,QACQ;AACR,QAAM,EAAE,KAAK,KAAK,OAAO,IAAI,gBAAgB,MAAM,IAAI,MAAM,UAAU,UAAU,QAAQ,eAAe;AACxG,QAAM,EAAE,KAAK,UAAU,IAAI,UAAU,KAAK,QAAQ,GAAG;AACrD,SAAO,eAAe,WAAW,IAAI,QAAQ;AAC/C;;;ALtEA,IAAM,kBAAqC,CAAC,QAAQ,QAAQ,OAAO;AAEnE,SAAS,eAAe,SAAiD;AACvE,SAAO;AAAA,IACL,UAAU,QAAQ,YAAY;AAAA,IAC9B,UAAU,QAAQ,YAAY,CAAC;AAAA,IAC/B,QAAQ,QAAQ,UAAU;AAAA,IAC1B,QAAQ,QAAQ,UAAU;AAAA,IAC1B,SAAS,QAAQ,WAAW;AAAA,EAC9B;AACF;AAGA,SAAS,YAAY,IAAY,SAAqC;AAEpE,QAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,EAAE,CAAC,KAAK;AACrC,SAAO,QAAQ,KAAK,CAAC,QAAQ,MAAM,SAAS,GAAG,CAAC;AAClD;AA6CA,SAAS,eAAe,UAAiD;AACvE,MAAI,SAAS,aAAa,UAAU;AAClC,WAAO,kBAAkB,CAAC,GAAG,EAAE,OAAO,SAAS,SAAS,CAAC;AAAA,EAC3D;AAEA,SAAO,uBAAuB;AAChC;AAEO,SAAS,cAAc,UAA0B,CAAC,GAAY;AACnE,QAAM,WAAW,eAAe,OAAO;AACvC,QAAM,WAAW,eAAe;AAChC,QAAM,WAAW;AAIjB,MAAI,iBAAuC;AAC3C,QAAM,cAAc,MAAsB,mBAAmB,eAAe,QAAQ;AAEpF,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,IAAI,WAA0B;AAC5B,aAAO,YAAY;AAAA,IACrB;AAAA,IACA;AAAA,IACA,UAAU,MAAc,IAAoC;AAC1D,UAAI,CAAC,YAAY,IAAI,SAAS,OAAO,EAAG,QAAO,EAAE,MAAM,KAAK,KAAK;AACjE,YAAM,OAAO,UAAU,EAAE;AAEzB,UAAI,SAAS,KAAM,QAAO,EAAE,MAAM,KAAK,KAAK;AAC5C,YAAM,MAAM,eAAe,MAAM,IAAI,MAAM,YAAY,GAAG,UAAU,SAAS,MAAM;AACnF,aAAO,EAAE,MAAM,KAAK,KAAK,KAAK;AAAA,IAChC;AAAA,EACF;AACF;;;ApDnIA,IAAM,UAAU,oBAAI,IAAqB;AAEzC,SAAS,UAAU,SAAkC;AACnD,QAAM,MAAM,KAAK,UAAU,WAAW,CAAC,CAAC;AACxC,MAAI,SAAS,QAAQ,IAAI,GAAG;AAC5B,MAAI,CAAC,QAAQ;AACX,aAAS,cAAc,OAAO;AAC9B,YAAQ,IAAI,KAAK,MAAM;AAAA,EACzB;AACA,SAAO;AACT;AAMe,SAAR,cAA2D,QAAwB;AACxF,QAAM,UAAU,KAAK,aAAa,KAAK,CAAC;AACxC,QAAM,SAAS,UAAU,OAAO;AAChC,SAAO,OAAO,UAAU,QAAQ,KAAK,YAAY,EAAE;AACrD;","names":["childIds","isInherited","normalizer","normalizer","asElement","asEl","metaFlag","declaresCustomProperties","targetedByStructuralPseudo","DISPLAY","baseConditionStyleMap","outerMergeSafe","metaOf","hasSpreadAttrs","isComponentNode","hasOwnAttrs","targetedByStructuralPseudo","asEl","metaOf","establishesContext","hasSpreadAttrs","isComponentNode","hasOwnAttrs","targetedByStructuralPseudo","DISPLAY","computed","BASE_KEY","computed","computed","BASE_KEY","computed","computed","BASE_KEY","computed","BASE_KEY","computed","BASE_KEY","NON_COLLAPSIBLE_VALUES","computed","BASE_KEY","computed","BASE_KEY","withBaseDecls","computed","BASE_KEY","NON_COLLAPSIBLE_VALUES","computed","SIDE_SET","BASE_KEY","NON_COLLAPSIBLE_VALUES","computed","NON_COLLAPSIBLE_VALUES","computed","opaque","opaque","LEGACY_PSEUDO_ELEMENTS","import_node_module","path","moduleBase","path","LEGACY_PSEUDO_ELEMENTS","babelTraverse","babelParse","staticTokensOf","computed","path","JSX_LANGS","staticTokensOf","MagicString","eolOf"]}
1
+ {"version":3,"sources":["../src/webpack-loader.ts","../../../node_modules/tsup/assets/cjs_shims.js","../../core/src/builders.ts","../../core/src/ops/runtime.ts","../../core/src/ops/apply.ts","../../core/src/pass-context.ts","../../core/src/flatten-safety.ts","../../core/src/pass-manager.ts","../../core/src/pipeline.ts","../../core/src/reverse-emit.ts","../../pattern-kit/src/normalize.ts","../../pattern-kit/src/combinators.ts","../../pattern-kit/src/define.ts","../../pattern-kit/src/pattern.ts","../../patterns/src/library/flatten/display-contents-wrapper.pattern.ts","../../patterns/src/library/flatten/empty-style-div.pattern.ts","../../patterns/src/library/flatten/flex-center-wrapper.pattern.ts","../../patterns/src/library/flatten/inline-flex-center-wrapper.pattern.ts","../../patterns/src/library/flatten/nested-flex-merge.pattern.ts","../../patterns/src/library/flatten/nested-grid-merge.pattern.ts","../../patterns/src/library/flatten/passthrough-wrapper.pattern.ts","../../patterns/src/library/flatten/redundant-fragment.pattern.ts","../../patterns/src/library/flatten/redundant-inline-wrapper.pattern.ts","../../patterns/src/library/compress/border-radius-shorthand.pattern.ts","../../patterns/src/library/compress/border-shorthand.pattern.ts","../../patterns/src/library/compress/dedupe-classes.pattern.ts","../../patterns/src/library/compress/gap-shorthand.pattern.ts","../../patterns/src/library/compress/inset-shorthand.pattern.ts","../../patterns/src/library/compress/margin-shorthand.pattern.ts","../../patterns/src/library/compress/overflow-shorthand.pattern.ts","../../patterns/src/library/compress/overscroll-behavior-shorthand.pattern.ts","../../patterns/src/library/compress/padding-shorthand.pattern.ts","../../patterns/src/library/compress/place-shorthand.pattern.ts","../../patterns/src/library/compress/scroll-margin-shorthand.pattern.ts","../../patterns/src/library/compress/scroll-padding-shorthand.pattern.ts","../../patterns/src/library/compress/size-shorthand.pattern.ts","../../patterns/src/_registry.generated.ts","../../resolver-tailwind/src/tailwind/fingerprint.ts","../../resolver-tailwind/src/tailwind/emit.ts","../../resolver-tailwind/src/tailwind/engine.ts","../../resolver-tailwind/src/tailwind/selector.ts","../../resolver-tailwind/src/tailwind/extract.ts","../../resolver-tailwind/src/tailwind/serialize.ts","../../resolver-tailwind/src/tailwind/stylemap.ts","../../resolver-tailwind/src/tailwind/usage.ts","../../resolver-tailwind/src/tailwind/resolver.ts","../../resolver-css/src/constants.ts","../../resolver-css/src/engine.ts","../../resolver-css/src/postcss-helpers.ts","../../resolver-css/src/misc-helpers.ts","../../resolver-css/src/selector-helpers.ts","../../resolver-css/src/resolver.ts","../src/index.ts","../../frontend-html/src/backend.ts","../../frontend-html/src/parse.ts","../../frontend-html/src/walk.ts","../../frontend-html/src/index.ts","../../frontend-jsx/src/frontend-ast.ts","../../frontend-jsx/src/frontend-parse.ts","../../frontend-jsx/src/frontend.ts","../../frontend-jsx/src/backend.ts","../src/pipeline-run.ts"],"sourcesContent":["/**\n * domflax webpack loader.\n *\n * A genuine webpack loader module: webpack requires this file by absolute path (wired by the\n * `domflax.webpack()` plugin, see {@link ./index.webpack}) and invokes the default export once per\n * matched `.jsx`/`.tsx` module. It runs the SAME single-file engine as {@link createDomflax} — so the\n * heavy Tailwind/postcss engines stay LAZY (constructed on first transform, only for the selected\n * provider), exactly as in the Vite adapter and the programmatic API.\n *\n * The loader is intentionally synchronous (the transform is a pure CPU function with no source map\n * yet) and structurally typed against webpack: it depends only on a minimal local `LoaderContext`\n * shape, never on the `webpack` package itself.\n */\nimport { createDomflax } from './index';\nimport type { Domflax, DomflaxOptions } from './index';\n\n/**\n * The slice of webpack's `LoaderContext` the domflax loader touches. Declared locally so this module\n * does not hard-depend on `webpack` types.\n */\nexport interface DomflaxLoaderContext {\n /** Absolute path of the module being transformed (no query suffix). */\n readonly resourcePath: string;\n /** Loader options passed via the `module.rule` `use[].options` entry. */\n getOptions?(): DomflaxOptions | undefined;\n}\n\n/**\n * Engine cache keyed by the serialized options, so a build reuses one configured engine (and its\n * one lazily-loaded resolver) across every transformed file instead of rebuilding per module.\n */\nconst engines = new Map<string, Domflax>();\n\nfunction engineFor(options: DomflaxOptions): Domflax {\n const key = JSON.stringify(options ?? {});\n let engine = engines.get(key);\n if (!engine) {\n engine = createDomflax(options);\n engines.set(key, engine);\n }\n return engine;\n}\n\n/**\n * webpack loader entry point. Returns the (possibly rewritten) source; non-jsx/tsx or unchanged\n * modules round-trip through {@link Domflax.transform} unchanged.\n */\nexport default function domflaxLoader(this: DomflaxLoaderContext, source: string): string {\n const options = this.getOptions?.() ?? {};\n const engine = engineFor(options);\n return engine.transform(source, this.resourcePath).code;\n}\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","/**\n * @domflax/core — runtime builders + traversal.\n *\n * Pure, dependency-free helpers to construct IR nodes, assemble an {@link IRDocument},\n * and walk the tree honouring {@link VisitSignal}. No heavy third-party deps: only the\n * type contract in `./types`.\n */\n\nimport type {\n AttrMap,\n Backref,\n BackrefTable,\n ClassList,\n ConditionKey,\n CssProperty,\n ExprRecord,\n ExprRef,\n ExprRegistry,\n FrontendKind,\n IdAllocator,\n IRComment,\n IRDocument,\n IRElement,\n IRExpr,\n IRFragment,\n IRNamespace,\n IRNode,\n IRNodeId,\n IRText,\n InlineStyle,\n NodeMeta,\n SafetyLevel,\n SourceSpan,\n StyleBlock,\n StyleCondition,\n StyleMap,\n Visitor,\n VisitContext,\n VisitSignal,\n} from './types';\n\n/* ───────────────────────── id / registry primitives ───────────────────────── */\n\n/** Monotonic IRNodeId allocator. `peek` reports the id `next()` would return. */\nexport function createIdAllocator(start = 1): IdAllocator {\n let n = start;\n return {\n next(): IRNodeId {\n const id = n;\n n += 1;\n return id as IRNodeId;\n },\n get peek(): IRNodeId {\n return n as IRNodeId;\n },\n };\n}\n\n/** Minimal in-memory ExprRegistry. */\nexport function createExprRegistry(start = 1): ExprRegistry {\n const map = new Map<ExprRef, ExprRecord>();\n let n = start;\n return {\n get(r: ExprRef): ExprRecord | undefined {\n return map.get(r);\n },\n intern(rec: Omit<ExprRecord, 'ref'>): ExprRef {\n const ref = n as ExprRef;\n n += 1;\n map.set(ref, { ...rec, ref });\n return ref;\n },\n releasePayloads(): void {\n for (const [k, v] of map) map.set(k, { ...v, payload: undefined });\n },\n };\n}\n\n/** Mutable BackrefTable: frontends register backrefs as they parse. */\nexport interface MutableBackrefTable extends BackrefTable {\n set(id: IRNodeId, backref: Backref): void;\n}\n\nexport function createBackrefTable(): MutableBackrefTable {\n const map = new Map<IRNodeId, Backref>();\n return {\n get(id: IRNodeId): Backref | undefined {\n return map.get(id);\n },\n span(id: IRNodeId): SourceSpan | null {\n return map.get(id)?.span ?? null;\n },\n childrenSpan(id: IRNodeId): SourceSpan | null {\n return map.get(id)?.innerSpan ?? null;\n },\n set(id: IRNodeId, backref: Backref): void {\n map.set(id, backref);\n },\n };\n}\n\n/* ───────────────────────── default sub-structures ───────────────────────── */\n\n/** A NodeMeta with every barrier/flag cleared. */\nexport function defaultMeta(safetyFloor: SafetyLevel = 0): NodeMeta {\n return {\n hasRef: false,\n hasEventHandlers: false,\n hasKey: false,\n hasSpreadAttrs: false,\n hasDynamicChildren: false,\n isComponent: false,\n hasDangerousHtml: false,\n targetedByCombinator: false,\n targetedByStructuralPseudo: false,\n selectorDependents: 0,\n hasOwnVisualStyle: false,\n establishesBox: false,\n establishesStackingContext: false,\n isContainingBlock: false,\n establishesFormattingContext: false,\n declaresCustomProperties: false,\n whitespaceSensitive: false,\n touched: false,\n styleDirty: false,\n synthetic: false,\n safetyFloor,\n };\n}\n\n/** Canonical base style condition (`media:'' states:[] pseudoElement:''`). */\nexport const BASE_CONDITION: StyleCondition = { media: '', states: [], pseudoElement: '' };\n\n/** Stable serialization of a StyleCondition into a ConditionKey. */\nexport function conditionKey(c: StyleCondition): ConditionKey {\n const states = [...c.states].sort().join(',');\n return `${c.media}|${states}|${c.pseudoElement}` as ConditionKey;\n}\n\nexport const BASE_CONDITION_KEY: ConditionKey = conditionKey(BASE_CONDITION);\n\n/** An empty StyleMap (no blocks). */\nexport function emptyStyleMap(): StyleMap {\n return { blocks: new Map<ConditionKey, StyleBlock>() };\n}\n\n/** An empty (absent) ClassList. */\nexport function emptyClassList(): ClassList {\n return {\n form: 'absent',\n segments: [],\n valueSpan: null,\n hasDynamic: false,\n opaque: false,\n rewritable: false,\n };\n}\n\n/** An empty AttrMap. */\nexport function emptyAttrMap(): AttrMap {\n return { entries: new Map(), spreads: [], order: [] };\n}\n\n/** An empty InlineStyle. */\nexport function emptyInlineStyle(): InlineStyle {\n return { decls: new Map<CssProperty, never>() as InlineStyle['decls'], dynamic: null };\n}\n\n/* ───────────────────────── node factories ───────────────────────── */\n\nexport interface ElementInit {\n readonly tag: string;\n readonly namespace?: IRNamespace;\n readonly isComponent?: boolean;\n readonly selfClosing?: boolean;\n readonly classes?: ClassList;\n readonly inlineStyle?: InlineStyle;\n readonly computed?: StyleMap;\n readonly attrs?: AttrMap;\n readonly children?: IRNodeId[];\n readonly parent?: IRNodeId | null;\n readonly span?: SourceSpan | null;\n readonly meta?: NodeMeta;\n}\n\nexport function createElement(id: IRNodeId, init: ElementInit): IRElement {\n return {\n id,\n kind: 'element',\n parent: init.parent ?? null,\n span: init.span ?? null,\n meta: init.meta ?? defaultMeta(),\n tag: init.tag,\n namespace: init.namespace ?? 'html',\n isComponent: init.isComponent ?? false,\n selfClosing: init.selfClosing ?? false,\n classes: init.classes ?? emptyClassList(),\n inlineStyle: init.inlineStyle ?? emptyInlineStyle(),\n computed: init.computed ?? emptyStyleMap(),\n attrs: init.attrs ?? emptyAttrMap(),\n children: init.children ?? [],\n };\n}\n\nexport function createText(\n id: IRNodeId,\n value: string,\n opts?: { collapsible?: boolean; parent?: IRNodeId | null; span?: SourceSpan | null },\n): IRText {\n return {\n id,\n kind: 'text',\n parent: opts?.parent ?? null,\n span: opts?.span ?? null,\n meta: defaultMeta(),\n value,\n collapsible: opts?.collapsible ?? true,\n };\n}\n\nexport function createExpr(\n id: IRNodeId,\n expr: ExprRef,\n opts?: { parent?: IRNodeId | null; span?: SourceSpan | null },\n): IRExpr {\n return {\n id,\n kind: 'expr',\n parent: opts?.parent ?? null,\n span: opts?.span ?? null,\n meta: defaultMeta(),\n expr,\n };\n}\n\nexport function createFragment(\n id: IRNodeId,\n opts?: { children?: IRNodeId[]; parent?: IRNodeId | null; span?: SourceSpan | null },\n): IRFragment {\n return {\n id,\n kind: 'fragment',\n parent: opts?.parent ?? null,\n span: opts?.span ?? null,\n meta: defaultMeta(),\n children: opts?.children ?? [],\n };\n}\n\nexport function createComment(\n id: IRNodeId,\n value: string,\n opts?: { parent?: IRNodeId | null; span?: SourceSpan | null },\n): IRComment {\n return {\n id,\n kind: 'comment',\n parent: opts?.parent ?? null,\n span: opts?.span ?? null,\n meta: defaultMeta(),\n value,\n };\n}\n\n/** Build an empty document whose root is a fresh fragment. */\nexport function createDocument(frontend: FrontendKind): IRDocument {\n const alloc = createIdAllocator();\n const rootId = alloc.next();\n const root = createFragment(rootId);\n const nodes = new Map<IRNodeId, IRNode>([[rootId, root]]);\n return {\n root: rootId,\n nodes,\n exprs: createExprRegistry(),\n sources: new Map(),\n backref: createBackrefTable(),\n frontend,\n alloc,\n };\n}\n\n/* ───────────────────────── tree accessors ───────────────────────── */\n\n/** Returns the child id list for container nodes, or an empty array. */\nexport function childIds(node: IRNode): readonly IRNodeId[] {\n return node.kind === 'element' || node.kind === 'fragment' ? node.children : [];\n}\n\n/** Returns the node, or undefined. */\nexport function getNode(doc: IRDocument, id: IRNodeId): IRNode | undefined {\n return doc.nodes.get(id);\n}\n\n/** Returns the node iff it is an element. */\nexport function getElement(doc: IRDocument, id: IRNodeId): IRElement | undefined {\n const n = doc.nodes.get(id);\n return n && n.kind === 'element' ? n : undefined;\n}\n\n/** Pre-order list of every element id reachable from the root. */\nexport function elementIds(doc: IRDocument): IRNodeId[] {\n const out: IRNodeId[] = [];\n const visit = (id: IRNodeId): void => {\n const n = doc.nodes.get(id);\n if (!n) return;\n if (n.kind === 'element') out.push(id);\n for (const c of childIds(n)) visit(c);\n };\n visit(doc.root);\n return out;\n}\n\n/* ───────────────────────── traversal ───────────────────────── */\n\n/**\n * Depth-first pre/post-order walk. `enter` may return `'skip'` (don't descend) or `'stop'`\n * (abort the whole walk); `exit` may return `'stop'`. The visitor receives a live {@link IRNode}\n * plus a {@link VisitContext} exposing depth and the parent node.\n */\nexport function walk(doc: IRDocument, visitor: Visitor): void {\n const roDoc = doc as unknown as VisitContext['doc'];\n let stopped = false;\n\n const visit = (id: IRNodeId, depth: number): void => {\n if (stopped) return;\n const node = doc.nodes.get(id);\n if (!node) return;\n\n const ctx: VisitContext = {\n doc: roDoc,\n depth,\n parent(): IRNode | null {\n return node.parent == null ? null : doc.nodes.get(node.parent) ?? null;\n },\n };\n\n const entered: VisitSignal = visitor.enter ? visitor.enter(node, ctx) : undefined;\n if (entered === 'stop') {\n stopped = true;\n return;\n }\n if (entered !== 'skip') {\n for (const child of childIds(node)) {\n visit(child, depth + 1);\n if (stopped) return;\n }\n }\n\n const exited: VisitSignal = visitor.exit ? visitor.exit(node, ctx) : undefined;\n if (exited === 'stop') stopped = true;\n };\n\n visit(doc.root, 0);\n}\n","/**\n * @domflax/core — applier runtime helpers (shared by the per-op handlers in `./apply`).\n *\n * Pure, dependency-free building blocks for the trusted mutator: input-preserving cloning, the\n * mutable apply state, small tree helpers, detached-spec materialization, and style merging.\n * Only depends on the `../types` contract and `../builders` runtime helpers.\n */\n\nimport type {\n ApplyContext,\n ApplyResult,\n AttrMap,\n AttrValue,\n ConditionKey,\n CssProperty,\n Diagnostic,\n DiagnosticCode,\n ElementSpec,\n IRDocument,\n IRNode,\n IRNodeId,\n NodeSpec,\n RewriteOp,\n SkippedOpGroup,\n StyleBlock,\n StyleConflictPolicy,\n StyleDecl,\n StyleMap,\n} from '../types';\n\nimport {\n createComment,\n createElement,\n createExpr,\n createFragment,\n createText,\n defaultMeta,\n} from '../builders';\n\n/* ───────────────────────── result of an apply run ───────────────────────── */\n\nexport interface ApplyOutcome {\n /** The new document (the input doc is never mutated). */\n readonly doc: IRDocument;\n readonly result: ApplyResult;\n}\n\nexport interface MutState {\n readonly doc: IRDocument;\n readonly touched: Set<IRNodeId>;\n readonly removed: Set<IRNodeId>;\n readonly created: Set<IRNodeId>;\n readonly diagnostics: Diagnostic[];\n readonly skipped: SkippedOpGroup[];\n appliedGroups: number;\n readonly ceiling: number;\n readonly ctx: ApplyContext;\n}\n\n/* ───────────────────────── cloning (keep input pure) ───────────────────────── */\n\nexport function cloneStyleMap(sm: StyleMap): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n blocks.set(key, {\n condition: block.condition,\n decls: new Map<CssProperty, StyleDecl>(block.decls),\n });\n }\n return { blocks };\n}\n\nfunction cloneNode(node: IRNode): IRNode {\n const meta = { ...node.meta };\n switch (node.kind) {\n case 'element':\n return {\n ...node,\n meta,\n children: [...node.children],\n computed: cloneStyleMap(node.computed),\n };\n case 'fragment':\n return { ...node, meta, children: [...node.children] };\n default:\n return { ...node, meta };\n }\n}\n\n/** Shallow-immutable clone: input doc and its node objects are never mutated. */\nexport function cloneDocument(doc: IRDocument): IRDocument {\n const nodes = new Map<IRNodeId, IRNode>();\n for (const [id, n] of doc.nodes) nodes.set(id, cloneNode(n));\n return {\n root: doc.root,\n nodes,\n exprs: doc.exprs,\n sources: doc.sources,\n backref: doc.backref,\n frontend: doc.frontend,\n alloc: doc.alloc,\n };\n}\n\n/* ───────────────────────── small helpers ───────────────────────── */\n\nexport function diag(\n code: DiagnosticCode,\n message: string,\n extra?: Partial<Diagnostic>,\n): Diagnostic {\n return { code, severity: 'warn', message, ...extra };\n}\n\nexport function getParentChildren(doc: IRDocument, id: IRNodeId): IRNodeId[] | null {\n const node = doc.nodes.get(id);\n if (!node || node.parent == null) return null;\n const parent = doc.nodes.get(node.parent);\n if (!parent) return null;\n if (parent.kind === 'element' || parent.kind === 'fragment') return parent.children;\n return null;\n}\n\nexport function indexInParent(doc: IRDocument, id: IRNodeId): number {\n const siblings = getParentChildren(doc, id);\n return siblings ? siblings.indexOf(id) : -1;\n}\n\nexport function markTouched(state: MutState, id: IRNodeId): void {\n const n = state.doc.nodes.get(id);\n if (n) {\n n.meta.touched = true;\n state.touched.add(id);\n }\n}\n\n/**\n * Mark a node whose OWN computed style a pass just rewrote (setClassList / mergeStyle onto it /\n * fold into it). Implies {@link markTouched}, and additionally raises `meta.styleDirty` — the signal\n * reverse-emit uses to re-derive class tokens. A purely structural bystander (a neighbour's unwrap /\n * merge / move) uses {@link markTouched} instead, so it is left byte-for-byte identical.\n */\nexport function markStyleDirty(state: MutState, id: IRNodeId): void {\n const n = state.doc.nodes.get(id);\n if (n) {\n n.meta.touched = true;\n n.meta.styleDirty = true;\n state.touched.add(id);\n }\n}\n\nexport function removeSubtree(state: MutState, id: IRNodeId): void {\n const node = state.doc.nodes.get(id);\n if (!node) return;\n if (node.kind === 'element' || node.kind === 'fragment') {\n for (const child of [...node.children]) removeSubtree(state, child);\n }\n state.doc.nodes.delete(id);\n state.removed.add(id);\n}\n\nexport function precond(op: RewriteOp, nodeId: IRNodeId, message: string): Diagnostic {\n return diag('DF_OP_PRECONDITION_FAILED', message, {\n nodeId,\n pattern: op.origin.pattern,\n severity: 'error',\n });\n}\n\nexport function primaryTarget(op: RewriteOp): IRNodeId | null {\n switch (op.op) {\n case 'removeNode':\n case 'unwrap':\n case 'replaceWith':\n case 'wrap':\n case 'moveNode':\n case 'setClassList':\n case 'mergeStyle':\n return op.target;\n case 'insertBefore':\n case 'insertAfter':\n return op.anchor;\n case 'mergeSiblings':\n return op.first;\n case 'foldInheritedStyles':\n return op.from;\n }\n}\n\n/* ───────────────────────── spec materialization ───────────────────────── */\n\nfunction specToAttrs(map: ReadonlyMap<string, string | boolean> | undefined): AttrMap {\n if (!map || map.size === 0) return { entries: new Map(), spreads: [], order: [] };\n const entries = new Map<string, AttrValue>();\n const order: string[] = [];\n for (const [k, v] of map) {\n entries.set(k, { kind: 'static', value: v });\n order.push(k);\n }\n return { entries, spreads: [], order };\n}\n\n/** Materialize a detached {@link NodeSpec} into live nodes; returns the new (or reused) id. */\nexport function materialize(state: MutState, spec: NodeSpec, parent: IRNodeId | null): IRNodeId {\n const { doc } = state;\n if (spec.kind === 'ref') {\n const existing = doc.nodes.get(spec.ref);\n if (existing) existing.parent = parent;\n return spec.ref;\n }\n\n const id = doc.alloc.next();\n state.created.add(id);\n switch (spec.kind) {\n case 'element': {\n const childIds: IRNodeId[] = [];\n const el = createElement(id, {\n tag: spec.tag,\n namespace: spec.namespace,\n selfClosing: spec.selfClosing,\n attrs: specToAttrs(spec.attrs),\n parent,\n meta: { ...defaultMeta(), synthetic: true },\n });\n if (spec.classes) el.computed = cloneStyleMap(spec.classes);\n doc.nodes.set(id, el);\n for (const child of spec.children ?? []) {\n childIds.push(materialize(state, child, id));\n }\n el.children = childIds;\n return id;\n }\n case 'text': {\n const t = createText(id, spec.value, { parent });\n t.meta.synthetic = true;\n doc.nodes.set(id, t);\n return id;\n }\n case 'expr': {\n const e = createExpr(id, spec.expr, { parent });\n e.meta.synthetic = true;\n doc.nodes.set(id, e);\n return id;\n }\n case 'comment': {\n const c = createComment(id, spec.value, { parent });\n c.meta.synthetic = true;\n doc.nodes.set(id, c);\n return id;\n }\n case 'fragment': {\n const frag = createFragment(id, { parent });\n frag.meta.synthetic = true;\n doc.nodes.set(id, frag);\n const childIds: IRNodeId[] = [];\n for (const child of spec.children) childIds.push(materialize(state, child, id));\n frag.children = childIds;\n return id;\n }\n }\n}\n\nexport function elementSpecToNode(\n state: MutState,\n spec: ElementSpec,\n parent: IRNodeId | null,\n): IRNodeId {\n return materialize(state, spec, parent);\n}\n\n/* ───────────────────────── style merging ───────────────────────── */\n\nexport function isInherited(state: MutState, decl: StyleDecl): boolean {\n if (decl.inherited) return true;\n const table = state.ctx.normalizer?.inherited;\n if (table) {\n try {\n return table.isInherited(decl.property);\n } catch {\n return decl.inherited;\n }\n }\n return decl.inherited;\n}\n\nexport interface MergeReport {\n readonly map: StyleMap;\n readonly conflict: boolean;\n}\n\n/** Merge `source` decls into `target`, condition-by-condition, per the conflict policy. */\nexport function mergeStyleMaps(\n target: StyleMap,\n source: StyleMap,\n policy: StyleConflictPolicy,\n): MergeReport {\n // Mutable working copy; returned (widened) as an immutable StyleMap.\n const blocks = new Map<ConditionKey, StyleBlock>(cloneStyleMap(target).blocks);\n let conflict = false;\n\n for (const [key, srcBlock] of source.blocks) {\n const existing = blocks.get(key);\n if (!existing) {\n blocks.set(key, {\n condition: srcBlock.condition,\n decls: new Map<CssProperty, StyleDecl>(srcBlock.decls),\n });\n continue;\n }\n const decls = new Map<CssProperty, StyleDecl>(existing.decls);\n for (const [prop, srcDecl] of srcBlock.decls) {\n const had = decls.get(prop);\n if (had && had.value !== srcDecl.value) {\n conflict = true;\n if (policy === 'target-wins') continue;\n // 'abort' is handled by the caller before commit; 'source-wins' falls through.\n }\n if (policy === 'target-wins' && had) continue;\n decls.set(prop, srcDecl);\n }\n blocks.set(key, { condition: existing.condition, decls });\n }\n return { map: { blocks }, conflict };\n}\n","/**\n * @domflax/core — the per-op handlers + public apply entry points.\n *\n * {@link applyOps} validates each {@link RewriteOp} against the safety ceiling / node-local floor\n * and commits it to a clone of the document; {@link applyGroups} commits whole {@link RewriteGroup}s\n * atomically. Rejected ops are collected into {@link ApplyResult.skipped} rather than throwing.\n */\n\nimport type {\n ApplyContext,\n ApplyResult,\n ConditionKey,\n CssProperty,\n Diagnostic,\n IRDocument,\n IRNodeId,\n RewriteGroup,\n RewriteOp,\n SkippedOpGroup,\n StyleBlock,\n StyleDecl,\n} from '../types';\n\nimport { BASE_CONDITION_KEY } from '../builders';\n\nimport {\n cloneDocument,\n cloneStyleMap,\n diag,\n elementSpecToNode,\n getParentChildren,\n isInherited,\n markStyleDirty,\n markTouched,\n materialize,\n mergeStyleMaps,\n precond,\n primaryTarget,\n removeSubtree,\n type ApplyOutcome,\n type MutState,\n} from './runtime';\n\nexport type { ApplyOutcome } from './runtime';\nexport { cloneDocument } from './runtime';\n\n/* ───────────────────────── per-op handlers ───────────────────────── */\n\nfunction safetyOk(state: MutState, op: RewriteOp, targetId: IRNodeId): Diagnostic | null {\n const opSafety = op.origin.safety;\n if (opSafety > state.ceiling) {\n return diag(\n 'DF_SAFETY_CEILING_EXCEEDED',\n `op '${op.op}' safety ${opSafety} exceeds ceiling ${state.ceiling}`,\n { nodeId: targetId, pattern: op.origin.pattern, severity: 'error' },\n );\n }\n const node = state.doc.nodes.get(targetId);\n if (node && opSafety > node.meta.safetyFloor) {\n return diag(\n 'DF_SAFETY_CEILING_EXCEEDED',\n `op '${op.op}' safety ${opSafety} exceeds node ${targetId} floor ${node.meta.safetyFloor}`,\n { nodeId: targetId, pattern: op.origin.pattern, severity: 'error' },\n );\n }\n return null;\n}\n\n/** Returns a list of validation issues; empty ⇒ the op was applied. */\nfunction applyOne(state: MutState, op: RewriteOp): Diagnostic[] {\n const { doc } = state;\n\n const primary = primaryTarget(op);\n if (primary != null) {\n if (!doc.nodes.get(primary)) {\n return [\n diag('DF_OP_PRECONDITION_FAILED', `target node ${primary} not found`, {\n nodeId: primary,\n pattern: op.origin.pattern,\n severity: 'error',\n }),\n ];\n }\n const safety = safetyOk(state, op, primary);\n if (safety) return [safety];\n }\n\n switch (op.op) {\n case 'removeNode': {\n const siblings = getParentChildren(doc, op.target);\n if (siblings) {\n const i = siblings.indexOf(op.target);\n if (i >= 0) siblings.splice(i, 1);\n }\n removeSubtree(state, op.target);\n return [];\n }\n\n case 'unwrap': {\n const node = doc.nodes.get(op.target);\n if (!node || (node.kind !== 'element' && node.kind !== 'fragment')) {\n return [precond(op, op.target, 'unwrap target is not a container')];\n }\n const siblings = getParentChildren(doc, op.target);\n if (!siblings) return [precond(op, op.target, 'unwrap target has no parent')];\n const at = siblings.indexOf(op.target);\n const kids = node.children;\n for (const k of kids) {\n const kn = doc.nodes.get(k);\n if (kn) kn.parent = node.parent;\n }\n siblings.splice(at, 1, ...kids);\n doc.nodes.delete(op.target);\n state.removed.add(op.target);\n if (node.parent != null) markTouched(state, node.parent);\n return [];\n }\n\n case 'replaceWith': {\n const siblings = getParentChildren(doc, op.target);\n if (!siblings) return [precond(op, op.target, 'replaceWith target has no parent')];\n const at = siblings.indexOf(op.target);\n const parentId = doc.nodes.get(op.target)?.parent ?? null;\n const newId = materialize(state, op.replacement, parentId);\n siblings.splice(at, 1, newId);\n removeSubtree(state, op.target);\n if (parentId != null) markTouched(state, parentId);\n return [];\n }\n\n case 'wrap': {\n const siblings = getParentChildren(doc, op.target);\n if (!siblings) return [precond(op, op.target, 'wrap target has no parent')];\n const at = siblings.indexOf(op.target);\n const parentId = doc.nodes.get(op.target)?.parent ?? null;\n const wrapperId = elementSpecToNode(state, op.wrapper, parentId);\n const wrapper = doc.nodes.get(wrapperId);\n const targetNode = doc.nodes.get(op.target);\n if (wrapper && (wrapper.kind === 'element' || wrapper.kind === 'fragment')) {\n wrapper.children.push(op.target);\n }\n if (targetNode) targetNode.parent = wrapperId;\n siblings.splice(at, 1, wrapperId);\n return [];\n }\n\n case 'insertBefore':\n case 'insertAfter': {\n const siblings = getParentChildren(doc, op.anchor);\n if (!siblings) return [precond(op, op.anchor, 'insert anchor has no parent')];\n const at = siblings.indexOf(op.anchor);\n const parentId = doc.nodes.get(op.anchor)?.parent ?? null;\n const newId = materialize(state, op.node, parentId);\n siblings.splice(op.op === 'insertBefore' ? at : at + 1, 0, newId);\n if (parentId != null) markTouched(state, parentId);\n return [];\n }\n\n case 'moveNode': {\n const newParent = doc.nodes.get(op.newParent);\n if (!newParent || (newParent.kind !== 'element' && newParent.kind !== 'fragment')) {\n return [precond(op, op.newParent, 'moveNode newParent is not a container')];\n }\n const siblings = getParentChildren(doc, op.target);\n if (siblings) {\n const i = siblings.indexOf(op.target);\n if (i >= 0) siblings.splice(i, 1);\n }\n const target = doc.nodes.get(op.target);\n if (target) target.parent = op.newParent;\n const idx = Math.max(0, Math.min(op.index, newParent.children.length));\n newParent.children.splice(idx, 0, op.target);\n markTouched(state, op.newParent);\n return [];\n }\n\n case 'mergeSiblings': {\n const first = doc.nodes.get(op.first);\n const second = doc.nodes.get(op.second);\n if (!first || !second) return [precond(op, op.first, 'mergeSiblings node missing')];\n if (\n (first.kind === 'element' || first.kind === 'fragment') &&\n (second.kind === 'element' || second.kind === 'fragment')\n ) {\n for (const c of second.children) {\n const cn = doc.nodes.get(c);\n if (cn) cn.parent = op.first;\n first.children.push(c);\n }\n second.children = [];\n }\n const siblings = getParentChildren(doc, op.second);\n if (siblings) {\n const i = siblings.indexOf(op.second);\n if (i >= 0) siblings.splice(i, 1);\n }\n doc.nodes.delete(op.second);\n state.removed.add(op.second);\n markTouched(state, op.first);\n return [];\n }\n\n case 'setClassList': {\n const el = doc.nodes.get(op.target);\n if (!el || el.kind !== 'element') {\n return [precond(op, op.target, 'setClassList target is not an element')];\n }\n el.computed = cloneStyleMap(op.style);\n markStyleDirty(state, op.target);\n return [];\n }\n\n case 'mergeStyle': {\n const el = doc.nodes.get(op.target);\n if (!el || el.kind !== 'element') {\n return [precond(op, op.target, 'mergeStyle target is not an element')];\n }\n const report = mergeStyleMaps(el.computed, op.style, op.onConflict);\n if (report.conflict && op.onConflict === 'abort') {\n return [\n diag('DF_STYLE_CONFLICT_UNRESOLVED', `mergeStyle aborted on conflict at ${op.target}`, {\n nodeId: op.target,\n pattern: op.origin.pattern,\n severity: 'error',\n }),\n ];\n }\n el.computed = report.map;\n if (op.source != null) {\n const src = doc.nodes.get(op.source);\n if (src) markTouched(state, op.source);\n }\n markStyleDirty(state, op.target);\n return [];\n }\n\n case 'foldInheritedStyles':\n return applyFold(state, op);\n }\n}\n\nfunction applyFold(\n state: MutState,\n op: Extract<RewriteOp, { op: 'foldInheritedStyles' }>,\n): Diagnostic[] {\n const { doc } = state;\n const from = doc.nodes.get(op.from);\n if (!from || from.kind !== 'element') {\n return [precond(op, op.from, 'fold source is not an element')];\n }\n const issues: Diagnostic[] = [];\n const onlyProps: ReadonlySet<CssProperty> | null =\n op.properties === 'all-inherited' ? null : new Set(op.properties);\n\n const conditionKeys =\n op.conditions === 'all'\n ? [...from.computed.blocks.keys()]\n : [BASE_CONDITION_KEY];\n\n for (const intoId of op.into) {\n const into = doc.nodes.get(intoId);\n if (!into || into.kind !== 'element') {\n issues.push(precond(op, intoId, 'fold target is not an element'));\n continue;\n }\n // Mutable working copy; assigned back (widened) as an immutable StyleMap.\n const nextBlocks = new Map<ConditionKey, StyleBlock>(cloneStyleMap(into.computed).blocks);\n let folded = false;\n\n for (const key of conditionKeys) {\n const srcBlock = from.computed.blocks.get(key);\n if (!srcBlock) continue;\n const dstBlock = nextBlocks.get(key);\n const decls = dstBlock\n ? new Map<CssProperty, StyleDecl>(dstBlock.decls)\n : new Map<CssProperty, StyleDecl>();\n\n for (const [prop, decl] of srcBlock.decls) {\n if (onlyProps && !onlyProps.has(prop)) continue;\n if (!isInherited(state, decl)) continue;\n if (decl.relativeToParent) {\n issues.push(\n diag(\n 'DF_RELATIVE_UNIT_FOLD',\n `refused to fold relative-unit declaration '${decl.property}' onto ${intoId}`,\n { nodeId: intoId, pattern: op.origin.pattern, severity: 'warn' },\n ),\n );\n continue;\n }\n if (!decls.has(prop)) {\n decls.set(prop, decl);\n folded = true;\n }\n }\n nextBlocks.set(key, { condition: srcBlock.condition, decls });\n }\n\n if (folded) {\n into.computed = { blocks: nextBlocks };\n markStyleDirty(state, intoId);\n }\n }\n // Non-blocking (DF_RELATIVE_UNIT_FOLD) diagnostics are recorded but do not skip the op.\n for (const d of issues) state.diagnostics.push(d);\n return [];\n}\n\n/* ───────────────────────── public entry points ───────────────────────── */\n\n/**\n * Apply a flat list of ops to a copy of `doc`. The input document is never mutated.\n * Each op is independently validated; failing ops are skipped (collected in\n * {@link ApplyResult.skipped}) instead of throwing.\n */\nexport function applyOps(\n doc: IRDocument,\n ops: readonly RewriteOp[],\n ctx?: Partial<ApplyContext>,\n): ApplyOutcome {\n const cloned = cloneDocument(doc);\n const state: MutState = {\n doc: cloned,\n touched: new Set(),\n removed: new Set(),\n created: new Set(),\n diagnostics: [],\n skipped: [],\n appliedGroups: 0,\n ceiling: ctx?.safetyCeiling ?? 3,\n ctx: { doc: cloned, safetyCeiling: ctx?.safetyCeiling ?? 3, ...ctx } as ApplyContext,\n };\n\n for (const op of ops) {\n const issues = applyOne(state, op);\n if (issues.length > 0) {\n state.skipped.push({\n group: { pattern: op.origin.pattern, anchor: primaryTarget(op) ?? doc.root, ops: [op] },\n issues: issues.map((d) => ({ op, code: d.code, message: d.message })),\n });\n for (const d of issues) state.diagnostics.push(d);\n } else {\n state.appliedGroups += 1;\n }\n }\n\n return { doc: cloned, result: finalize(state) };\n}\n\n/**\n * Apply pre-grouped ops (each {@link RewriteGroup} is committed atomically: if ANY op in the group\n * fails validation, the whole group is skipped and none of its ops mutate the tree).\n */\nexport function applyGroups(\n doc: IRDocument,\n groups: readonly RewriteGroup[],\n ctx?: Partial<ApplyContext>,\n): ApplyOutcome {\n // Group-atomicity is realized by working on a throwaway clone per group, then committing.\n let current = cloneDocument(doc);\n const touched = new Set<IRNodeId>();\n const removed = new Set<IRNodeId>();\n const created = new Set<IRNodeId>();\n const diagnostics: Diagnostic[] = [];\n const skipped: SkippedOpGroup[] = [];\n let appliedGroups = 0;\n\n for (const group of groups) {\n const attempt = applyOps(current, group.ops, ctx);\n if (attempt.result.skipped.length > 0) {\n skipped.push({\n group,\n issues: attempt.result.skipped.flatMap((s) => s.issues),\n });\n for (const s of attempt.result.skipped) for (const i of s.issues) {\n diagnostics.push(diag(i.code, i.message, { pattern: group.pattern }));\n }\n continue; // discard the attempt — group is atomic\n }\n current = attempt.doc;\n appliedGroups += 1;\n for (const id of attempt.result.touched) touched.add(id);\n for (const id of attempt.result.removed) removed.add(id);\n for (const id of attempt.result.created) created.add(id);\n for (const d of attempt.result.diagnostics) diagnostics.push(d);\n }\n\n const result: ApplyResult = {\n touched,\n removed,\n created,\n appliedGroups,\n skipped,\n journal: [],\n diagnostics,\n };\n return { doc: current, result };\n}\n\nfunction finalize(state: MutState): ApplyResult {\n return {\n touched: state.touched,\n removed: state.removed,\n created: state.created,\n appliedGroups: state.appliedGroups,\n skipped: state.skipped,\n journal: [],\n diagnostics: state.diagnostics,\n };\n}\n","/**\n * @domflax/core — pass-manager supporting contexts (resolvers, selector index, rewrite factory,\n * match context).\n *\n * Split out of `pass-manager.ts` so the sync engine, the async verifier-gated engine, and the\n * classification module can all share the same context construction without any of those files\n * exceeding the module-size budget. Dependency-free: only the `./types` contract + `./builders`.\n */\n\nimport type {\n DeepReadonly,\n ElementLike,\n ElementSpec,\n EmitContext,\n EmitResult,\n IRDocument,\n IRElement,\n IRNode,\n IRNodeId,\n MatchContext,\n NodeLike,\n NodeSpec,\n PassPhase,\n ResolveInput,\n ResolveResult,\n RewriteFactory,\n RewriteOpDraft,\n SelectorIndex,\n SelectorUsage,\n StyleConflictPolicy,\n StyleMap,\n StyleResolver,\n} from './types';\n\nimport { elementIds, emptyStyleMap, getElement } from './builders';\n\n/* ───────────────────────── default resolvers / selector index ───────────────────────── */\n\n/** A no-op resolver: owns nothing, resolves to empty styles. Useful as an injection default. */\nexport function createNullResolver(): StyleResolver {\n const empty: ResolveResult = {\n styles: emptyStyleMap(),\n resolved: [],\n unknown: [],\n opaque: [],\n warnings: [],\n };\n const usage: SelectorUsage = {\n asSubject: false,\n asAncestor: false,\n asCompound: false,\n asSibling: false,\n asHasArgument: false,\n asStructural: false,\n droppable: true,\n };\n return {\n id: 'null',\n provider: 'null@0.0.0',\n fingerprint: 'null',\n owns(): boolean {\n return false;\n },\n resolve(_input: ResolveInput): ResolveResult {\n return empty;\n },\n emit(_styles: StyleMap, _ctx: EmitContext): EmitResult {\n return { classes: [], exact: true, warnings: [] };\n },\n selectorUsage(): SelectorUsage {\n return usage;\n },\n };\n}\n\n/** A SelectorIndex that reports zero CSS-targeting (no combinator/structural coupling). */\nexport function createNullSelectorIndex(): SelectorIndex {\n const none: ReadonlySet<IRNodeId> = new Set();\n return {\n targetedByCombinator(): boolean {\n return false;\n },\n targetedByStructuralPseudo(): boolean {\n return false;\n },\n reparentImpact(): ReadonlySet<IRNodeId> {\n return none;\n },\n };\n}\n\n/** Resolvers that can enumerate the project's COMPLEX selectors (the custom-CSS resolver) expose this. */\ninterface ComplexSelectorCapable {\n complexSelectors(): readonly string[];\n}\n\nfunction hasComplexSelectors(r: StyleResolver): r is StyleResolver & ComplexSelectorCapable {\n return typeof (r as Partial<ComplexSelectorCapable>).complexSelectors === 'function';\n}\n\n/**\n * Build a real {@link SelectorIndex} from the active resolver.\n *\n * For a resolver that reports project COMPLEX selectors — anything with a combinator (`>`/`+`/`~`/\n * descendant) or a structural pseudo, i.e. the custom-CSS resolver — every element whose static class\n * participates in such a selector is flagged so the flatten/compress guards (`targetedByCombinator` /\n * `affectsSelectorMatching`) fire and a wrapper a selector depends on is NOT flattened. An element is\n * combinator-coupled when one of its classes is used as a descendant/child ancestor, as a sibling\n * subject, or as a `:has()` argument; structural-coupled when used in `:nth-child(...)` etc.\n *\n * For a combinator-free resolver (Tailwind utilities — no `complexSelectors()`), this degrades to the\n * null index so behaviour is unchanged.\n */\nexport function buildSelectorIndex(doc: IRDocument, resolver: StyleResolver): SelectorIndex {\n if (!hasComplexSelectors(resolver) || resolver.complexSelectors().length === 0) {\n return createNullSelectorIndex();\n }\n\n const combinator = new Set<IRNodeId>();\n const structural = new Set<IRNodeId>();\n\n for (const id of elementIds(doc)) {\n const el = getElement(doc, id);\n if (!el) continue;\n for (const seg of el.classes.segments) {\n if (seg.kind !== 'static') continue;\n for (const t of seg.tokens) {\n const u = resolver.selectorUsage(t.value);\n // Combinator coupling: descendant/child ancestor, sibling subject, or `:has()` argument —\n // reparenting/removing the element would change a combinator match-set.\n if (u.asAncestor || u.asSibling || u.asHasArgument) combinator.add(id);\n if (u.asStructural) structural.add(id);\n }\n }\n }\n\n // reparentImpact(id): non-empty when removing/unwrapping `id` would change a combinator/structural\n // match-set — `id` itself is coupled (its own match), or it is the matched ancestor of a child\n // (removing it reparents that child out of the relation). Self + element children is conservative\n // and sufficient for the flatten guard.\n const impact = new Map<IRNodeId, Set<IRNodeId>>();\n for (const id of elementIds(doc)) {\n const el = getElement(doc, id);\n if (!el) continue;\n if (!combinator.has(id) && !structural.has(id)) continue;\n const set = new Set<IRNodeId>([id]);\n for (const c of el.children) {\n const cn = doc.nodes.get(c);\n if (cn && cn.kind === 'element') set.add(c);\n }\n impact.set(id, set);\n }\n\n const empty: ReadonlySet<IRNodeId> = new Set();\n return {\n targetedByCombinator: (id: IRNodeId): boolean => combinator.has(id),\n targetedByStructuralPseudo: (id: IRNodeId): boolean => structural.has(id),\n reparentImpact: (id: IRNodeId): ReadonlySet<IRNodeId> => impact.get(id) ?? empty,\n };\n}\n\n/* ───────────────────────── rewrite factory (emits origin-free drafts) ───────────────────────── */\n\n/** Every {@link NodeLike}/{@link ElementLike} carries a readonly `id`. */\nfunction idOf(n: ElementLike | NodeLike): IRNodeId {\n return (n as IRElement).id;\n}\n\n/** The pattern-kit factory: produces op DRAFTS and detached NodeSpecs without any allocation. */\nexport function createRewriteFactory(): RewriteFactory {\n return {\n unwrap(target: ElementLike): RewriteOpDraft {\n return { op: 'unwrap', target: idOf(target) };\n },\n removeNode(target: NodeLike): RewriteOpDraft {\n return { op: 'removeNode', target: idOf(target) };\n },\n replaceWith(target: NodeLike, replacement: NodeSpec): RewriteOpDraft {\n return { op: 'replaceWith', target: idOf(target), replacement };\n },\n wrap(target: NodeLike, wrapper: ElementSpec): RewriteOpDraft {\n return { op: 'wrap', target: idOf(target), wrapper };\n },\n insertBefore(anchor: NodeLike, node: NodeSpec): RewriteOpDraft {\n return { op: 'insertBefore', anchor: idOf(anchor), node };\n },\n insertAfter(anchor: NodeLike, node: NodeSpec): RewriteOpDraft {\n return { op: 'insertAfter', anchor: idOf(anchor), node };\n },\n moveNode(target: NodeLike, newParent: ElementLike, index: number): RewriteOpDraft {\n return { op: 'moveNode', target: idOf(target), newParent: idOf(newParent), index };\n },\n mergeSiblings(first: NodeLike, second: NodeLike): RewriteOpDraft {\n return { op: 'mergeSiblings', first: idOf(first), second: idOf(second) };\n },\n setClassList(target: ElementLike, style: StyleMap, preserveOpaque = true): RewriteOpDraft {\n return { op: 'setClassList', target: idOf(target), style, preserveOpaque };\n },\n mergeStyle(\n target: ElementLike,\n source: ElementLike | null,\n style: StyleMap,\n onConflict: StyleConflictPolicy = 'abort',\n ): RewriteOpDraft {\n return {\n op: 'mergeStyle',\n target: idOf(target),\n source: source ? idOf(source) : null,\n style,\n onConflict,\n };\n },\n foldInheritedStyles(\n from: ElementLike,\n into: ElementLike | readonly ElementLike[],\n opts?: { only?: readonly import('./types').CssProperty[]; conditions?: 'base' | 'all' },\n ): RewriteOpDraft {\n const list: readonly ElementLike[] = Array.isArray(into)\n ? (into as readonly ElementLike[])\n : [into as ElementLike];\n return {\n op: 'foldInheritedStyles',\n from: idOf(from),\n into: list.map((t) => idOf(t)),\n properties: opts?.only ?? 'all-inherited',\n conditions: opts?.conditions ?? 'base',\n };\n },\n element(spec: ElementSpec): NodeSpec {\n return spec;\n },\n text(value: string): NodeSpec {\n return { kind: 'text', value };\n },\n keep(node: NodeLike): NodeSpec {\n return { kind: 'ref', ref: idOf(node) };\n },\n };\n}\n\n/* ───────────────────────── match context ───────────────────────── */\n\nfunction ro<T>(v: T): DeepReadonly<T> {\n return v as DeepReadonly<T>;\n}\n\n/** Build the read-only {@link MatchContext} a pattern's `evaluate` receives for one element. */\nexport function buildMatchContext(\n doc: IRDocument,\n elementId: IRNodeId,\n resolver: StyleResolver,\n selectors: SelectorIndex,\n safety: import('./types').SafetyLevel,\n phase: PassPhase,\n iteration: number,\n): MatchContext {\n const self = getElement(doc, elementId)!;\n\n const parentEl = (): DeepReadonly<IRElement> | null => {\n if (self.parent == null) return null;\n const p = doc.nodes.get(self.parent);\n return p && p.kind === 'element' ? ro(p) : null;\n };\n\n const elementChildren = (): readonly DeepReadonly<IRElement>[] => {\n const out: DeepReadonly<IRElement>[] = [];\n for (const c of self.children) {\n const cn = doc.nodes.get(c);\n if (cn && cn.kind === 'element') out.push(ro(cn));\n }\n return out;\n };\n\n const ancestors = (): readonly DeepReadonly<IRElement>[] => {\n const out: DeepReadonly<IRElement>[] = [];\n let cur: IRNodeId | null = self.parent;\n while (cur != null) {\n const n: IRNode | undefined = doc.nodes.get(cur);\n if (!n) break;\n if (n.kind === 'element') out.push(ro(n));\n cur = n.parent;\n }\n return out;\n };\n\n const siblingAt = (delta: number): DeepReadonly<IRNode> | null => {\n if (self.parent == null) return null;\n const p = doc.nodes.get(self.parent);\n if (!p || (p.kind !== 'element' && p.kind !== 'fragment')) return null;\n const i = p.children.indexOf(elementId);\n const sib = p.children[i + delta];\n if (sib == null) return null;\n const sn = doc.nodes.get(sib);\n return sn ? ro(sn) : null;\n };\n\n const computedOf = (n: NodeLike): StyleMap => {\n const node = doc.nodes.get((n as IRNode).id);\n return node && node.kind === 'element' ? node.computed : emptyStyleMap();\n };\n\n return {\n node: ro(self),\n doc: ro(doc),\n resolver,\n selectors,\n safety,\n phase,\n iteration,\n parent: parentEl,\n elementChildren,\n onlyElementChild(): DeepReadonly<IRElement> | null {\n const els = elementChildren();\n return els.length === 1 ? els[0]! : null;\n },\n computed(): StyleMap {\n return self.computed;\n },\n computedOf,\n isOpaque(n?: ElementLike): boolean {\n const target = n ? doc.nodes.get((n as IRElement).id) : self;\n if (!target || target.kind !== 'element') return true;\n return target.classes.opaque || target.meta.hasSpreadAttrs;\n },\n ancestors,\n closest(pred): DeepReadonly<IRElement> | null {\n for (const a of ancestors()) if (pred(a)) return a;\n return null;\n },\n prevSibling(): DeepReadonly<IRNode> | null {\n return siblingAt(-1);\n },\n nextSibling(): DeepReadonly<IRNode> | null {\n return siblingAt(1);\n },\n nthChildIndex(): number {\n if (self.parent == null) return 1;\n const p = doc.nodes.get(self.parent);\n if (!p || (p.kind !== 'element' && p.kind !== 'fragment')) return 1;\n let idx = 0;\n for (const c of p.children) {\n const cn = doc.nodes.get(c);\n if (cn && cn.kind === 'element') {\n idx += 1;\n if (c === elementId) return idx;\n }\n }\n return idx;\n },\n };\n}\n","/**\n * @domflax/core — static classification of a flatten (the VERIFIER-GATED safety core).\n *\n * A flatten pattern matches on `paintsNothing` + a structural/style signature, but unwrapping a\n * wrapper can still change rendering: a wrapper with non-paint layout styles (e.g. `px-4 py-4`) drops\n * that padding when removed (it is NOT reproduced on the surviving child), and a centering wrapper\n * collapsed to `place-self:center` only stays centered when the child's NEW parent is flex/grid. The\n * existing emittability revert only checks the ADDED style is re-emittable — not that the wrapper's\n * own styles survive, nor that the parent context holds.\n *\n * {@link classifyFlattenOps} answers, for one applied flatten op-group, whether it is:\n *\n * • `'provably-safe'` — removing the wrapper changes NOTHING renderable: the wrapper\n * establishes no box/formatting/stacking context, has no non-inherited\n * own declaration that the rewrite does not reproduce on the surviving\n * child, AND the rewrite adds no parent-context-dependent self-alignment\n * (unless the new parent is statically flex/grid). Examples: passthrough\n * / empty-style / display-contents / redundant-fragment wrappers.\n * • `'needs-verification'` — anything else (drops/relies on a style, or centering→place-self).\n *\n * Pure + dependency-free: only the `./types` contract + `./builders` accessors.\n */\n\nimport { conditionKey, getElement } from './builders';\nimport type {\n CssProperty,\n IRDocument,\n IRElement,\n IRNodeId,\n RewriteOp,\n StyleBlock,\n StyleDecl,\n StyleMap,\n StyleNormalizer,\n} from './types';\n\n/** The static verdict for one flatten op-group. */\nexport type FlattenClass = 'provably-safe' | 'needs-verification';\n\n/** A classified flatten plus the structural anchors a verifier needs to render before/after. */\nexport interface FlattenClassification {\n readonly kind: FlattenClass;\n /** The unwrapped wrapper (in the BEFORE doc), or null when the group removes no element box. */\n readonly wrapperId: IRNodeId | null;\n /** The surviving child styles fold onto (the AFTER subtree root), or null. */\n readonly childId: IRNodeId | null;\n}\n\n/* ───────────────────────── display / context reasoning ───────────────────────── */\n\nconst DISPLAY = 'display' as CssProperty;\nconst POSITION = 'position' as CssProperty;\nconst TRANSFORM = 'transform' as CssProperty;\nconst ALIGN_ITEMS = 'align-items' as CssProperty;\nconst JUSTIFY_CONTENT = 'justify-content' as CssProperty;\nconst JUSTIFY_ITEMS = 'justify-items' as CssProperty;\nconst PLACE_ITEMS = 'place-items' as CssProperty;\nconst PLACE_SELF = 'place-self' as CssProperty;\n\n/** Displays that generate no independent formatting context for the wrapper's children. */\nconst CONTEXT_SAFE_DISPLAYS: ReadonlySet<string> = new Set(['block', 'contents', '']);\n/** `position` values that neither establish a containing block nor offset the element. */\nconst STATIC_POSITIONS: ReadonlySet<string> = new Set(['static', '']);\n\n/* ───────────────────────── context-compensated centering (grid-parent override) ───────────────────────── */\n\n/**\n * Displays under which a block-level wrapper carrying `align-items:center` + `justify-content:center`\n * truly centers a single child on BOTH axes (so collapsing it to `place-self:center` is lossless).\n * Restricted to the block-level `flex`/`grid` (per the CSS soundness rule) — the inline variants are\n * left `needs-verification`.\n */\nconst CENTERING_DISPLAYS: ReadonlySet<string> = new Set(['flex', 'grid']);\n/**\n * Parent displays that establish a GRID formatting context — the ONLY context in which the child's\n * `justify-self` (the horizontal half of `place-self:center`) is honored. A flex parent ignores\n * `justify-self`, and a block parent ignores both, so neither can host the flatten.\n */\nconst GRID_PARENT_DISPLAYS: ReadonlySet<string> = new Set(['grid']);\n/**\n * Item-alignment values under which a stretch-defaulted grid item FILLS its area. Only when the\n * wrapper fills its grid area does \"center inside the wrapper\" equal \"center inside the area\" (which\n * is what `place-self:center` on the child produces). Any other value (start/end/center/…) would let\n * the wrapper shrink and sit off-center, so the collapse could move the child → we preserve.\n */\nconst STRETCHY_ITEM_ALIGN: ReadonlySet<string> = new Set(['normal', 'stretch']);\n/** Parent item-alignment properties that, when non-stretch, stop the wrapper filling its grid area. */\nconst PARENT_ITEMS_ALIGN_PROPS: readonly CssProperty[] = [ALIGN_ITEMS, JUSTIFY_ITEMS, PLACE_ITEMS];\n\n/** True when a style condition is the unconditional base (no media / states / pseudo-element). */\nfunction isBaseCondition(block: StyleBlock): boolean {\n const c = block.condition;\n return c.media === '' && c.states.length === 0 && c.pseudoElement === '';\n}\n\n/** The base-condition value of `prop` in a NORMALIZED style map, or null when unset. */\nfunction baseValue(sm: StyleMap, prop: CssProperty): string | null {\n for (const block of sm.blocks.values()) {\n if (!isBaseCondition(block)) continue;\n const d = block.decls.get(prop);\n return d ? String(d.value) : null;\n }\n return null;\n}\n\n/**\n * True when unwrapping `wrapper` reparents the child under a statically-known GRID container that lets\n * the wrapper fill its area — the ONE parent context in which `place-self:center` reproduces the\n * wrapper's centering exactly. Requires (a) the parent is `display:grid`/`inline-grid` in the base\n * condition, (b) NO condition switches the parent to a non-grid display, and (c) NO condition forces a\n * non-stretch item-alignment (align-items/justify-items/place-items) that would shrink the wrapper off\n * its area. Anything else (flex/block/unknown parent, `place-items:center`, responsive `md:flex`, …)\n * → false → the flatten stays `needs-verification` (preserved).\n */\nfunction parentIsFillingGrid(before: IRDocument, wrapper: IRElement, norm: StyleNormalizer): boolean {\n if (wrapper.parent == null) return false;\n const p = before.nodes.get(wrapper.parent);\n if (!p || p.kind !== 'element') return false;\n const pc = norm.normalizeStyleMap(p.computed);\n let baseIsGrid = false;\n for (const block of pc.blocks.values()) {\n const disp = block.decls.get(DISPLAY);\n if (disp) {\n if (!GRID_PARENT_DISPLAYS.has(String(disp.value))) return false; // any non-grid display → unsafe\n if (isBaseCondition(block)) baseIsGrid = true;\n }\n for (const prop of PARENT_ITEMS_ALIGN_PROPS) {\n const d = block.decls.get(prop);\n if (d && !STRETCHY_ITEM_ALIGN.has(String(d.value))) return false; // wrapper would not fill its area\n }\n }\n return baseIsGrid;\n}\n\n/**\n * True when the wrapper carries NOTHING beyond the base-condition centering signature\n * (`display:flex|grid` + `align-items:center` + `justify-content:center`) that removal would drop.\n * Those three are compensated by the child's new `place-self:center`; `position:static`/`transform:none`\n * are inert; inherited declarations are folded onto the child by `foldInheritedStyles`; and any decl the\n * child provably reproduces is not lost. ANY other non-inherited own declaration — in any condition\n * (padding, margin, sizing, border, background, gap, a NON-base or NON-center align-items/justify-content,\n * a non-static position, a transform, …) → false → not a pure centering wrapper → preserved.\n */\nfunction wrapperHasOnlyCenteringStyle(\n wrapperComputed: StyleMap,\n childComputed: StyleMap | null,\n norm: StyleNormalizer,\n): boolean {\n for (const block of wrapperComputed.blocks.values()) {\n const base = isBaseCondition(block);\n const ck = conditionKey(block.condition);\n for (const [prop, decl] of block.decls) {\n const val = String(decl.value);\n if (prop === DISPLAY) {\n if (base && CENTERING_DISPLAYS.has(val)) continue;\n return false;\n }\n if (prop === ALIGN_ITEMS) {\n if (base && val === 'center') continue;\n return false;\n }\n if (prop === JUSTIFY_CONTENT) {\n if (base && val === 'center') continue;\n return false;\n }\n if (prop === POSITION) {\n if (STATIC_POSITIONS.has(val)) continue;\n return false;\n }\n if (prop === TRANSFORM) {\n if (val === 'none') continue;\n return false;\n }\n if (isInherited(decl, norm)) continue; // folded onto the child by foldInheritedStyles\n if (childReproduces(childComputed, ck, prop, val)) continue;\n return false; // some other own style would be dropped\n }\n }\n return true;\n}\n\n/** True when `wrapper` has exactly ONE element child and no other RENDERED content (rule 4). */\nfunction wrapperCentersSingleElement(before: IRDocument, wrapper: IRElement): boolean {\n let elements = 0;\n for (const cid of wrapper.children) {\n const n = before.nodes.get(cid);\n if (!n) continue;\n if (n.kind === 'element') {\n elements += 1;\n continue;\n }\n if (n.kind === 'comment') continue; // comments paint nothing and are not flex/grid items\n if (n.kind === 'text' && n.value.trim() === '') continue; // collapsible whitespace ⇒ no item\n return false; // real text / an `{expr}` island the wrapper's centering also positions\n }\n return elements === 1;\n}\n\n/** True when the child ALREADY carries a non-neutral self-alignment that place-self:center would override (rule 5). */\nfunction childHasSelfAlign(childBefore: StyleMap | null, norm: StyleNormalizer): boolean {\n if (!childBefore) return false;\n const sm = norm.normalizeStyleMap(childBefore);\n for (const block of sm.blocks.values()) {\n for (const prop of SELF_ALIGN_PROPS) {\n const d = block.decls.get(prop);\n if (d && !NEUTRAL_ALIGN.has(String(d.value))) return true;\n }\n }\n return false;\n}\n\n/** True when the rewrite grants the child the `place-self:center` equivalent (rule 2, second half). */\nfunction childGainsPlaceSelfCenter(childAfter: StyleMap): boolean {\n if (baseValue(childAfter, PLACE_SELF) === 'center') return true;\n return (\n baseValue(childAfter, 'align-self' as CssProperty) === 'center' &&\n baseValue(childAfter, 'justify-self' as CssProperty) === 'center'\n );\n}\n\n/**\n * The provably-sound override for the ubiquitous centering wrapper. Flattening\n *\n * <P grid><W flex/grid items-center justify-center><C/></W></P> → <P grid><C place-self:center/></P>\n *\n * is render-identical ONLY when ALL hold (each proven statically from the before-tree):\n * 1. Parent P establishes a GRID formatting context that lets the wrapper fill its area — so the\n * child's new `justify-self:center` (ignored under flex/block) is honored. ({@link parentIsFillingGrid})\n * 2. Wrapper W centers a single child on both axes (`display:flex|grid` + `align-items:center` +\n * `justify-content:center`) and the child gains the equivalent `place-self:center`.\n * 3. W has no OTHER non-inherited box style whose removal would drop or shift anything.\n * ({@link wrapperHasOnlyCenteringStyle})\n * 4. W has exactly one ELEMENT child and no other rendered content. ({@link wrapperCentersSingleElement})\n * 5. C does not already carry a conflicting `place-self`/`align-self`/`justify-self`. ({@link childHasSelfAlign})\n *\n * Any failure → false → the wrapper is preserved (the conservative default). Works identically for the\n * HTML and JSX pipelines: the parent display is read from the before-tree's resolved computed styles.\n */\nfunction isContextCompensatedCentering(\n before: IRDocument,\n wrapper: IRElement,\n wrapperComputed: StyleMap,\n childBefore: StyleMap | null,\n childAfter: StyleMap | null,\n norm: StyleNormalizer,\n): boolean {\n if (!childAfter) return false;\n // (2) wrapper centering signature (base condition) + the child actually gains place-self:center.\n if (!CENTERING_DISPLAYS.has(baseValue(wrapperComputed, DISPLAY) ?? '')) return false;\n if (baseValue(wrapperComputed, ALIGN_ITEMS) !== 'center') return false;\n if (baseValue(wrapperComputed, JUSTIFY_CONTENT) !== 'center') return false;\n const childAfterNorm = norm.normalizeStyleMap(childAfter);\n if (!childGainsPlaceSelfCenter(childAfterNorm)) return false;\n // (3) nothing else on the wrapper is dropped.\n if (!wrapperHasOnlyCenteringStyle(wrapperComputed, childAfterNorm, norm)) return false;\n // (4) exactly one element child, nothing else the wrapper positions.\n if (!wrapperCentersSingleElement(before, wrapper)) return false;\n // (5) the child has no pre-existing self-alignment place-self:center would override.\n if (childHasSelfAlign(childBefore, norm)) return false;\n // (1) the new parent is a statically-known grid that lets the wrapper fill its area.\n return parentIsFillingGrid(before, wrapper, norm);\n}\n\n/** Self-alignment properties whose effect depends on the parent being a flex/grid container. */\nconst SELF_ALIGN_PROPS: readonly CssProperty[] = [\n 'place-self' as CssProperty,\n 'align-self' as CssProperty,\n 'justify-self' as CssProperty,\n];\n/** Self-alignment values that are no-ops (so adding them assumes nothing about the parent). */\nconst NEUTRAL_ALIGN: ReadonlySet<string> = new Set(['auto', 'normal', 'auto auto', '']);\n/** Parent displays under which `place-self`/`*-self` centering actually takes effect. */\nconst FLEX_GRID_DISPLAYS: ReadonlySet<string> = new Set(['flex', 'inline-flex', 'grid', 'inline-grid']);\n\n/**\n * True when the wrapper establishes a box/formatting/stacking context that positions or sizes its\n * children — so removing its box could move/resize the surviving child. Derived from the COMPUTED\n * style (the frontend leaves the `meta.establishes*` flags unset for class-resolved styles), exactly\n * how `hasOwnVisualStyle` reasons over the computed map.\n */\nfunction establishesChildContext(sm: StyleMap): boolean {\n for (const block of sm.blocks.values()) {\n const display = block.decls.get(DISPLAY);\n if (display && !CONTEXT_SAFE_DISPLAYS.has(String(display.value))) return true;\n const position = block.decls.get(POSITION);\n if (position && !STATIC_POSITIONS.has(String(position.value))) return true;\n const transform = block.decls.get(TRANSFORM);\n if (transform && String(transform.value) !== 'none') return true;\n }\n return false;\n}\n\n/* ───────────────────────── declaration reasoning ───────────────────────── */\n\nfunction isInherited(decl: StyleDecl, norm: StyleNormalizer): boolean {\n if (decl.inherited) return true;\n try {\n return norm.inherited.isInherited(decl.property);\n } catch {\n return false;\n }\n}\n\n/** True when the child reproduces this exact declaration (same property + value) in the same condition. */\nfunction childReproduces(\n childComputed: StyleMap | null,\n conditionK: string,\n prop: CssProperty,\n value: string,\n): boolean {\n if (!childComputed) return false;\n const block = childComputed.blocks.get(conditionK as never);\n if (!block) return false;\n const d = block.decls.get(prop);\n return d != null && String(d.value) === value;\n}\n\n/**\n * True when the wrapper carries a non-inherited declaration that is NOT reproduced on the surviving\n * child — i.e. flattening would DROP a renderable style. `display`/`position`/`transform` are skipped\n * because {@link establishesChildContext} already governs them (and when it passed they are no-ops).\n */\nfunction dropsOwnStyle(\n wrapperComputed: StyleMap,\n childComputed: StyleMap | null,\n norm: StyleNormalizer,\n): boolean {\n for (const block of wrapperComputed.blocks.values()) {\n const ck = conditionKey(block.condition);\n for (const [prop, decl] of block.decls) {\n if (prop === DISPLAY || prop === POSITION || prop === TRANSFORM) continue;\n if (isInherited(decl, norm)) continue; // folded onto the child by foldInheritedStyles\n if (!childReproduces(childComputed, ck, prop, String(decl.value))) return true;\n }\n }\n return false;\n}\n\n/* ───────────────────────── parent-context reasoning ───────────────────────── */\n\n/** The element's base-condition `display` value (normalized), or '' when unset/not an element. */\nfunction displayOf(el: IRElement | undefined, norm: StyleNormalizer): string {\n if (!el) return '';\n for (const block of norm.normalizeStyleMap(el.computed).blocks.values()) {\n if (block.condition.media === '' && block.condition.states.length === 0 && block.condition.pseudoElement === '') {\n const d = block.decls.get(DISPLAY);\n if (d) return String(d.value);\n }\n }\n return '';\n}\n\n/** True when unwrapping `wrapper` reparents the child UNDER a flex/grid container in the before-tree. */\nfunction newParentIsFlexOrGrid(before: IRDocument, wrapper: IRElement, norm: StyleNormalizer): boolean {\n if (wrapper.parent == null) return false;\n const p = before.nodes.get(wrapper.parent);\n if (!p || p.kind !== 'element') return false;\n return FLEX_GRID_DISPLAYS.has(displayOf(p, norm));\n}\n\n/**\n * True when the rewrite GRANTS the child a parent-context-dependent self-alignment (place-self /\n * align-self / justify-self with a non-neutral value) that was not already on it — centering that only\n * holds if the new parent is flex/grid.\n */\nfunction addsParentContextStyle(\n childBefore: StyleMap | null,\n childAfter: StyleMap | null,\n norm: StyleNormalizer,\n): boolean {\n if (!childAfter) return false;\n const before = childBefore ? norm.normalizeStyleMap(childBefore) : null;\n const after = norm.normalizeStyleMap(childAfter);\n for (const block of after.blocks.values()) {\n const ck = conditionKey(block.condition);\n for (const prop of SELF_ALIGN_PROPS) {\n const d = block.decls.get(prop);\n if (!d || NEUTRAL_ALIGN.has(String(d.value))) continue;\n const prev = before?.blocks.get(ck as never)?.decls.get(prop);\n if (!prev || String(prev.value) !== String(d.value)) return true;\n }\n }\n return false;\n}\n\n/* ───────────────────────── op-group anchors ───────────────────────── */\n\n/** The wrapper the group unwraps (the structural removal), or null when the group removes no box. */\nfunction unwrapTargetOf(ops: readonly RewriteOp[]): IRNodeId | null {\n for (const op of ops) if (op.op === 'unwrap') return op.target;\n return null;\n}\n\n/** The surviving child styles fold onto: the mergeStyle/fold target, else the wrapper's sole element child. */\nfunction survivingChildOf(ops: readonly RewriteOp[], wrapper: IRElement, before: IRDocument): IRNodeId | null {\n for (const op of ops) if (op.op === 'mergeStyle') return op.target;\n for (const op of ops) if (op.op === 'foldInheritedStyles' && op.into.length > 0) return op.into[0]!;\n for (const c of wrapper.children) {\n const n = before.nodes.get(c);\n if (n && n.kind === 'element') return c;\n }\n return null;\n}\n\n/* ───────────────────────── the classifier ───────────────────────── */\n\n/**\n * Statically classify one applied flatten op-group. `before` is the doc as it was BEFORE the group's\n * ops; `after` is the result of applying them.\n *\n * A group that unwraps no element box (e.g. {@link redundant-fragment}, or a style-only flatten) is\n * `provably-safe` — there is no box whose removal could move/resize anything. Otherwise the three\n * criteria above decide.\n */\nexport function classifyFlattenOps(\n before: IRDocument,\n after: IRDocument,\n ops: readonly RewriteOp[],\n norm: StyleNormalizer,\n): FlattenClassification {\n const wrapperId = unwrapTargetOf(ops);\n if (wrapperId == null) return { kind: 'provably-safe', wrapperId: null, childId: null };\n\n const wrapper = before.nodes.get(wrapperId);\n // A fragment carries no box and no computed style — unwrapping it is always layout-identical.\n if (!wrapper || wrapper.kind !== 'element') {\n return { kind: 'provably-safe', wrapperId: null, childId: null };\n }\n\n const childId = survivingChildOf(ops, wrapper, before);\n const wrapperComputed = norm.normalizeStyleMap(wrapper.computed);\n const childAfter = childId != null ? getElement(after, childId)?.computed ?? null : null;\n const childBefore = childId != null ? getElement(before, childId)?.computed ?? null : null;\n\n // (OVERRIDE) A flex/grid centering wrapper establishes a formatting context — so (A) below would\n // reject it — YET collapsing it to `place-self:center` on the sole child is provably layout-neutral\n // when the child's NEW parent is a statically-known grid that lets the wrapper fill its area (and the\n // wrapper carries nothing else). This is the ONE context-compensated case; verified render-identical\n // in Chromium. Everything that fails any rule falls through to the conservative criteria below.\n if (isContextCompensatedCentering(before, wrapper, wrapperComputed, childBefore, childAfter, norm)) {\n return { kind: 'provably-safe', wrapperId, childId };\n }\n\n // (A) wrapper positions/sizes its children → removing its box can move/resize them.\n if (establishesChildContext(wrapperComputed)) {\n return { kind: 'needs-verification', wrapperId, childId };\n }\n // (B) wrapper drops a non-inherited own style the child does not reproduce.\n if (dropsOwnStyle(wrapperComputed, childAfter ? norm.normalizeStyleMap(childAfter) : null, norm)) {\n return { kind: 'needs-verification', wrapperId, childId };\n }\n // (C) rewrite adds parent-context-dependent centering, but the new parent is not statically flex/grid.\n if (addsParentContextStyle(childBefore, childAfter, norm) && !newParentIsFlexOrGrid(before, wrapper, norm)) {\n return { kind: 'needs-verification', wrapperId, childId };\n }\n\n return { kind: 'provably-safe', wrapperId, childId };\n}\n","/**\n * @domflax/core — pass manager (the sync, static flatten driver).\n *\n * Runs {@link Pattern}s grouped by {@link PassPhase} in declared order, driving the `flatten` phase to\n * a fixpoint under a max-iteration budget, isolating per-node pattern errors into {@link Diagnostic}s\n * (a thrown pattern never aborts the run — it becomes `DF_PATTERN_THREW`), and applying the static\n * flatten policy ({@link ApplyContext.gate}) — under `'provably-safe'` only provably layout-neutral\n * flattens commit, so the transform never changes rendering and never launches a browser.\n *\n * The supporting contexts (resolvers, selector index, rewrite factory, match context) live in\n * `./pass-context`; the static flatten classifier in `./flatten-safety`. Dependency-free: only the\n * `./types` contract + sibling runtime helpers.\n */\n\nimport type {\n ApplyContext,\n Diagnostic,\n FixpointConfig,\n HaltReason,\n IRDocument,\n IRNodeId,\n Pass,\n PassManager,\n PassPhase,\n Pattern,\n PhaseRunResult,\n RewriteFactory,\n RewriteOp,\n RewriteOpDraft,\n StyleMap,\n StyleNormalizer,\n StyleResolver,\n SyntheticSink,\n EmitContext,\n} from './types';\n\nimport { childIds, elementIds, getElement } from './builders';\nimport { applyOps } from './ops';\nimport { buildMatchContext, createRewriteFactory } from './pass-context';\nimport { classifyFlattenOps } from './flatten-safety';\n\n// Re-export the supporting contexts so `@domflax/core` consumers keep importing them from here / the\n// barrel exactly as before this module was split.\nexport {\n buildMatchContext,\n buildSelectorIndex,\n createNullResolver,\n createNullSelectorIndex,\n createRewriteFactory,\n} from './pass-context';\n\n/* ───────────────────────── defaults ───────────────────────── */\n\nexport const DEFAULT_FIXPOINT: FixpointConfig = {\n maxIterations: 16,\n phases: { flatten: 16, compress: 8, extract: 4 },\n onBudgetExhausted: 'warn',\n detectOscillation: true,\n};\n\nexport const PHASE_ORDER: readonly PassPhase[] = ['flatten', 'compress', 'extract'];\n\n/* ───────────────────────── op stamping + phase grouping ───────────────────────── */\n\nexport function stampOrigin(draft: RewriteOpDraft, pattern: Pattern): RewriteOp {\n return {\n ...draft,\n origin: { pattern: pattern.name, category: pattern.category, safety: pattern.safety },\n } as RewriteOp;\n}\n\nexport function patternsForPhase(passes: readonly Pass[], phase: PassPhase): Pattern[] {\n const out: Pattern[] = [];\n for (const pass of passes) {\n if (pass.phase !== phase) continue;\n for (const p of pass.patterns) out.push(p);\n }\n out.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n return out;\n}\n\nexport interface RunState {\n doc: IRDocument;\n}\n\n/* ───────────────────────── flatten residual-skip (never drop an unreproducible style) ───────────────────────── */\n\n/** A throwaway {@link SyntheticSink} for the emit exactness probe (registrations are discarded). */\nfunction probeSink(): SyntheticSink {\n return {\n register(s): string {\n return s.className;\n },\n drain(): readonly never[] {\n return [];\n },\n };\n}\n\n/** Nodes a group writes STYLE onto (the survivors a flatten transfers declarations to). */\nfunction styleWriteTargets(ops: readonly RewriteOp[]): IRNodeId[] {\n const ids: IRNodeId[] = [];\n for (const op of ops) {\n if (op.op === 'mergeStyle' || op.op === 'setClassList') ids.push(op.target);\n else if (op.op === 'foldInheritedStyles') ids.push(...op.into);\n }\n return ids;\n}\n\n/** True iff the resolver can EXACTLY reverse-emit `sm` (no residual). An empty map is trivially exact. */\nfunction emitIsExact(resolver: StyleResolver, normalizer: StyleNormalizer, sm: StyleMap): boolean {\n if (sm.blocks.size === 0) return true;\n try {\n const ctx: EmitContext = { normalizer, sink: probeSink() };\n const r = resolver.emit(sm, ctx);\n return r.exact && r.residual == null;\n } catch {\n return true; // a throwing resolver must never block a flatten\n }\n}\n\n/**\n * T5 — flatten must never DROP a style it can't reproduce. After a flatten transfers declarations onto\n * a surviving (rewritable) element, if the resolver can no longer EXACTLY reverse-emit that element's\n * computed style — and it could before — the flatten would silently lose the residual declarations\n * during reverse-emit, so the whole flatten is reverted (the wrapper is kept). Pre-existing residue\n * (already non-exact before the flatten) is not blamed on the flatten and does not trigger a revert.\n */\nexport function flattenWouldDropStyle(\n before: IRDocument,\n after: IRDocument,\n ops: readonly RewriteOp[],\n resolver: StyleResolver,\n normalizer: StyleNormalizer,\n): boolean {\n for (const id of styleWriteTargets(ops)) {\n const newEl = getElement(after, id);\n if (!newEl) continue; // target was itself removed — its style lives on the survivor we also check\n // Opaque / dynamic class lists are kept verbatim by reverse-emit, so no style is dropped there.\n if (newEl.classes.opaque || newEl.classes.hasDynamic) continue;\n if (emitIsExact(resolver, normalizer, newEl.computed)) continue;\n const oldEl = getElement(before, id);\n const wasExact = !oldEl || emitIsExact(resolver, normalizer, oldEl.computed);\n if (wasExact) return true; // the flatten introduced an unreproducible style → revert\n }\n return false;\n}\n\n/* ───────────────────────── flatten gate decision (shared sync core) ───────────────────────── */\n\nexport type FlattenVerdict = 'commit' | 'revert';\n\n/**\n * Decide what to do with a freshly-applied flatten op-group, given the gate. Returns:\n * • `'commit'` — keep the outcome (the historical path for `'all'`, and provably-safe flattens).\n * • `'revert'` — discard + bar the node (residual-drop, or a needs-verification flatten under the\n * `'provably-safe'` gate).\n *\n * `before`/`after` are the docs immediately around the group's application.\n */\nexport function flattenVerdict(\n before: IRDocument,\n after: IRDocument,\n ops: readonly RewriteOp[],\n ctx: ApplyContext,\n): FlattenVerdict {\n // T5 (independent of the gate): a flatten must never drop a style the resolver can't re-emit.\n if (flattenWouldDropStyle(before, after, ops, ctx.resolver, ctx.normalizer)) return 'revert';\n\n const gate = ctx.gate ?? 'all';\n if (gate === 'all') return 'commit';\n\n const cls = classifyFlattenOps(before, after, ops, ctx.normalizer);\n return cls.kind === 'provably-safe' ? 'commit' : 'revert';\n}\n\n/* ───────────────────────── per-element pattern evaluation (shared) ───────────────────────── */\n\n/**\n * Evaluate every pattern against `elId` until one produces ops; returns the stamped op list (and its\n * pattern), or null when no pattern matched. Pattern throws become `DF_PATTERN_THREW` diagnostics.\n */\nexport function evaluateElement(\n doc: IRDocument,\n elId: IRNodeId,\n patterns: readonly Pattern[],\n ctx: ApplyContext,\n factory: RewriteFactory,\n phase: PassPhase,\n iteration: number,\n diagnostics: Diagnostic[],\n): { ops: RewriteOp[]; pattern: Pattern } | null {\n for (const pattern of patterns) {\n if (pattern.safety > ctx.safetyCeiling) continue;\n let drafts: readonly RewriteOpDraft[] = [];\n try {\n const mctx = buildMatchContext(doc, elId, ctx.resolver, ctx.selectors, ctx.safetyCeiling, phase, iteration);\n const result = pattern.evaluate(mctx, factory);\n if (!result) continue;\n drafts = result.ops;\n if (result.diagnostics) for (const d of result.diagnostics) diagnostics.push(d);\n } catch (err) {\n diagnostics.push({\n code: 'DF_PATTERN_THREW',\n severity: 'error',\n message: `pattern '${pattern.name}' threw: ${String((err as Error)?.message ?? err)}`,\n nodeId: elId,\n pattern: pattern.name,\n phase,\n iteration,\n cause: err,\n });\n continue;\n }\n if (drafts.length === 0) continue;\n return { ops: drafts.map((d) => stampOrigin(d, pattern)), pattern };\n }\n return null;\n}\n\n/** Emit the diagnostic recorded when a flatten is reverted by the gate / residual guard. */\nexport function revertDiagnostic(\n pattern: Pattern,\n elId: IRNodeId,\n phase: PassPhase,\n iteration: number,\n resolverId: string,\n): Diagnostic {\n return {\n code: 'DF_VERIFY_REVERTED',\n severity: 'warn',\n message:\n `flatten '${pattern.name}' reverted on node ${elId}: it would change rendering (drops a style, ` +\n `establishes layout context, or assumes a parent context) and was not proven safe by resolver ` +\n `'${resolverId}'`,\n nodeId: elId,\n pattern: pattern.name,\n phase,\n iteration,\n };\n}\n\n/* ───────────────────────── one sweep (sync) ───────────────────────── */\n\n/**\n * One sweep of a phase: evaluate every pattern against every live element, collect op drafts, stamp\n * origin, apply, then commit/revert per {@link flattenVerdict}. Returns the number of ops applied\n * (0 ⇒ fixpoint for this phase). Under the `'provably-safe'` gate, any flatten that is not provably\n * safe is reverted — the transform is fully static and never changes rendering.\n */\nfunction runSweep(\n state: RunState,\n patterns: readonly Pattern[],\n ctx: ApplyContext,\n factory: RewriteFactory,\n phase: PassPhase,\n iteration: number,\n touched: Set<IRNodeId>,\n diagnostics: Diagnostic[],\n flattenBarred: Set<IRNodeId>,\n): number {\n let appliedOps = 0;\n\n for (const elId of elementIds(state.doc)) {\n const el = getElement(state.doc, elId);\n if (!el) continue; // removed earlier in this sweep\n if (phase === 'flatten' && flattenBarred.has(elId)) continue;\n\n const evaluated = evaluateElement(state.doc, elId, patterns, ctx, factory, phase, iteration, diagnostics);\n if (!evaluated) continue;\n const { ops, pattern } = evaluated;\n\n const outcome = applyOps(state.doc, ops, ctx);\n for (const d of outcome.result.diagnostics) diagnostics.push(d);\n if (outcome.result.appliedGroups === 0) continue;\n\n if (phase === 'flatten') {\n const verdict = flattenVerdict(state.doc, outcome.doc, ops, ctx);\n if (verdict !== 'commit') {\n // Discard the outcome (keep the wrapper) AND bar this node from any further flatten this run.\n diagnostics.push(revertDiagnostic(pattern, elId, phase, iteration, ctx.resolver.id));\n flattenBarred.add(elId);\n continue;\n }\n }\n\n state.doc = outcome.doc;\n appliedOps += outcome.result.appliedGroups;\n for (const id of outcome.result.touched) touched.add(id);\n for (const id of outcome.result.created) touched.add(id);\n }\n return appliedOps;\n}\n\n/* ───────────────────────── oscillation fingerprint ───────────────────────── */\n\n/** Cheap structural fingerprint of the document for oscillation detection. */\nexport function docFingerprint(doc: IRDocument): string {\n const parts: string[] = [];\n const visit = (id: IRNodeId): void => {\n const n = doc.nodes.get(id);\n if (!n) return;\n parts.push(`${id}:${n.kind}`);\n for (const c of childIds(n)) visit(c);\n };\n visit(doc.root);\n return parts.join('|');\n}\n\n/* ───────────────────────── the fixpoint driver (sync) ───────────────────────── */\n\n/** A single phase's terminal result, built from the loop's accounting. */\nexport interface PhaseLoopState {\n iterations: number;\n converged: boolean;\n haltReason: HaltReason;\n readonly touched: Set<IRNodeId>;\n readonly diagnostics: Diagnostic[];\n readonly seen: Set<string>;\n}\n\n/** Record the budget-exhausted diagnostic + finalize a phase result. Shared by sync + async drivers. */\nexport function finalizePhase(\n phase: PassPhase,\n s: PhaseLoopState,\n budget: number,\n onBudgetExhausted: 'warn' | 'error',\n): PhaseRunResult {\n if (!s.converged && s.haltReason !== 'oscillation') {\n s.haltReason = 'budget';\n s.diagnostics.push({\n code: 'DF_FIXPOINT_BUDGET',\n severity: onBudgetExhausted === 'error' ? 'error' : 'warn',\n message: `phase '${phase}' exhausted ${budget}-iteration budget`,\n phase,\n iteration: s.iterations,\n });\n }\n return {\n phase,\n iterations: s.iterations,\n converged: s.converged,\n haltReason: s.haltReason,\n touched: s.touched,\n diagnostics: s.diagnostics,\n };\n}\n\n/**\n * Runs `passes` over `doc` to a per-phase fixpoint (synchronous). This is the concrete entry the\n * pipeline calls. Under the `'provably-safe'` gate, flattens that are not provably layout-neutral are\n * reverted — the transform is fully static and never changes rendering.\n */\nexport function runPasses(\n doc: IRDocument,\n passes: readonly Pass[],\n ctx: ApplyContext,\n config?: FixpointConfig,\n): { readonly doc: IRDocument; readonly results: readonly PhaseRunResult[] } {\n const cfg: FixpointConfig = { ...DEFAULT_FIXPOINT, ...config };\n const factory = createRewriteFactory();\n const state: RunState = { doc };\n const results: PhaseRunResult[] = [];\n // Nodes barred from flattening after a revert — persists across sweeps/phases.\n const flattenBarred = new Set<IRNodeId>();\n\n for (const phase of PHASE_ORDER) {\n const patterns = patternsForPhase(passes, phase);\n const budget = cfg.phases[phase] ?? cfg.maxIterations;\n const s: PhaseLoopState = {\n iterations: 0,\n converged: false,\n haltReason: 'converged',\n touched: new Set(),\n diagnostics: [],\n seen: new Set(),\n };\n\n if (patterns.length === 0) {\n s.converged = true;\n results.push(finalizePhase(phase, s, budget, cfg.onBudgetExhausted));\n continue;\n }\n\n while (s.iterations < budget) {\n s.iterations += 1;\n const applied = runSweep(\n state,\n patterns,\n ctx,\n factory,\n phase,\n s.iterations,\n s.touched,\n s.diagnostics,\n flattenBarred,\n );\n\n if (applied === 0) {\n s.converged = true;\n break;\n }\n\n if (cfg.detectOscillation) {\n const fp = docFingerprint(state.doc);\n if (s.seen.has(fp)) {\n s.haltReason = 'oscillation';\n s.diagnostics.push({\n code: 'DF_FIXPOINT_OSCILLATION',\n severity: 'warn',\n message: `phase '${phase}' oscillated; halting`,\n phase,\n iteration: s.iterations,\n });\n break;\n }\n s.seen.add(fp);\n }\n }\n\n results.push(finalizePhase(phase, s, budget, cfg.onBudgetExhausted));\n }\n\n return { doc: state.doc, results };\n}\n\n/** A {@link PassManager} that runs the given passes (carried on the manager instance). */\nexport function createPassManager(passes: readonly Pass[]): PassManager {\n return {\n run(doc: IRDocument, ctx: ApplyContext, config?: FixpointConfig): readonly PhaseRunResult[] {\n return runPasses(doc, passes, ctx, config).results;\n },\n };\n}\n","/**\n * @domflax/core — the pure, single-file pipeline.\n *\n * Wires injected interfaces together: {@link Frontend} → resolve → {@link PassManager} →\n * {@link Backend}. Core itself stays dependency-free; the resolver, frontend, and backend are all\n * supplied by the caller, so no heavy third-party libs ever reach this package.\n */\n\nimport type {\n ApplyContext,\n Backend,\n BackendContext,\n CodegenResult,\n Diagnostic,\n EditPlan,\n Frontend,\n FrontendParseContext,\n IRDocument,\n IRElement,\n PassPhase,\n Pipeline,\n PipelineInput,\n PipelineOutput,\n PipelineStats,\n SourceSpan,\n StyleMap,\n SyntheticClass,\n SyntheticSink,\n} from './types';\n\nimport { elementIds, getElement } from './builders';\nimport { createNullSelectorIndex, runPasses } from './pass-manager';\n\n/* ───────────────────────── synthetic sink ───────────────────────── */\n\n/** A minimal in-memory {@link SyntheticSink}: dedupes by className, drains in insertion order. */\nexport function createSyntheticSink(): SyntheticSink {\n const map = new Map<string, SyntheticClass>();\n return {\n register(s: SyntheticClass): string {\n if (!map.has(s.className)) map.set(s.className, s);\n return s.className;\n },\n drain(): readonly SyntheticClass[] {\n return [...map.values()];\n },\n };\n}\n\n/* ───────────────────────── resolve step ───────────────────────── */\n\nfunction staticClassTokens(el: IRElement): string[] {\n const out: string[] = [];\n for (const seg of el.classes.segments) {\n if (seg.kind === 'static') for (const t of seg.tokens) out.push(t.value);\n }\n return out;\n}\n\n/**\n * Populate each element's `computed` StyleMap from its author classes via the injected resolver.\n * Opaque/spread elements and elements without static classes are left untouched. Resolver throws\n * are isolated into diagnostics (a stub resolver may legitimately be NotImplemented).\n */\nfunction resolveStyles(\n doc: IRDocument,\n input: PipelineInput,\n diagnostics: Diagnostic[],\n): void {\n const { resolver, normalizer } = input;\n for (const id of elementIds(doc)) {\n const el = getElement(doc, id);\n if (!el || el.classes.opaque) continue;\n const tokens = staticClassTokens(el);\n if (tokens.length === 0) continue;\n try {\n const result = resolver.resolve({\n classes: tokens,\n element: {\n tagName: el.tag,\n namespace: el.namespace === 'svg' ? 'svg' : 'html',\n },\n });\n let styles: StyleMap = result.styles;\n try {\n styles = normalizer.normalizeStyleMap(styles);\n } catch {\n /* normalizer is optional/stubbed — keep raw styles */\n }\n el.computed = styles;\n for (const w of result.warnings) {\n diagnostics.push({\n code: 'DF_STYLE_CONFLICT_UNRESOLVED',\n severity: w.severity,\n message: w.message,\n nodeId: id,\n });\n }\n } catch (err) {\n diagnostics.push({\n code: 'DF_OP_PRECONDITION_FAILED',\n severity: 'debug',\n message: `resolve skipped for <${el.tag}>: ${String((err as Error)?.message ?? err)}`,\n nodeId: id,\n cause: err,\n });\n }\n }\n}\n\n/* ───────────────────────── the pipeline ───────────────────────── */\n\nconst ZERO_ITERATIONS: Readonly<Record<PassPhase, number>> = {\n flatten: 0,\n compress: 0,\n extract: 0,\n};\n\nclass DefaultPipeline implements Pipeline {\n run(input: PipelineInput): PipelineOutput {\n const startedAt = now();\n const diagnostics: Diagnostic[] = [];\n const report = (d: Diagnostic): void => {\n diagnostics.push(d);\n input.reporter?.report(d);\n };\n\n // 1. PARSE ────────────────────────────────────────────────────────────\n const parseCtx: FrontendParseContext = {\n id: input.id,\n kind: input.kind,\n resolver: input.resolver,\n normalizer: input.normalizer,\n config: { preserveComments: input.config?.preserveComments ?? true },\n onDiagnostic: report,\n };\n if (input.babelAst !== undefined) parseCtx.babelAst = input.babelAst;\n\n const parsed = input.frontend.parse(input.code, parseCtx);\n for (const d of parsed.diagnostics) report(d);\n const doc = parsed.doc;\n const nodesIn = doc.nodes.size;\n\n // 2. RESOLVE ──────────────────────────────────────────────────────────\n resolveStyles(doc, input, diagnostics);\n\n // 3. PASSES (fixpoint per phase) ──────────────────────────────────────\n const ctx: ApplyContext = {\n doc,\n safetyCeiling: input.config?.safety ?? 2,\n normalizer: input.normalizer,\n selectors: createNullSelectorIndex(),\n resolver: input.resolver,\n };\n const { doc: optimized, results } = runPasses(doc, input.passes, ctx, fixpointFrom(input));\n\n let opsApplied = 0;\n const iterations: Record<PassPhase, number> = { ...ZERO_ITERATIONS };\n for (const r of results) {\n iterations[r.phase] = r.iterations;\n for (const d of r.diagnostics) {\n diagnostics.push(d);\n input.reporter?.report(d);\n }\n opsApplied += r.touched.size;\n }\n\n // 4. PRINT ────────────────────────────────────────────────────────────\n const editPlan: EditPlan = {\n moduleId: input.id,\n ops: [],\n provenance: new Map(),\n };\n const backendCtx: BackendContext = {\n normalizer: input.normalizer,\n resolver: input.resolver,\n sink: createSyntheticSink(),\n eol: eolOf(optimized),\n onDiagnostic: report,\n };\n const printed: CodegenResult = input.backend.print(optimized, editPlan, backendCtx);\n for (const d of printed.diagnostics) {\n diagnostics.push(d);\n input.reporter?.report(d);\n }\n\n // 5. ASSEMBLE OUTPUT ──────────────────────────────────────────────────\n const stats: PipelineStats = {\n nodesIn,\n nodesOut: optimized.nodes.size,\n opsApplied,\n iterations,\n durationMs: now() - startedAt,\n };\n const touched: readonly SourceSpan[] = printed.edits.map((e) => e.span);\n\n return {\n code: printed.code,\n map: printed.map,\n changed: printed.code !== input.code,\n touched,\n diagnostics,\n stats,\n doc: optimized,\n editPlan,\n };\n }\n}\n\nfunction fixpointFrom(input: PipelineInput): import('./types').FixpointConfig | undefined {\n const fp = input.config?.fixpoint;\n if (!fp) return undefined;\n return {\n maxIterations: fp.maxIterations ?? 16,\n phases: fp.phases ?? {},\n onBudgetExhausted: fp.onBudgetExhausted ?? 'warn',\n detectOscillation: fp.detectOscillation ?? true,\n };\n}\n\nfunction eolOf(doc: IRDocument): '\\n' | '\\r\\n' {\n for (const src of doc.sources.values()) return src.eol;\n return '\\n';\n}\n\n// `performance` is a host global (node20 / browser) not covered by the ES2023 lib;\n// declared minimally so the runtime feature-detection below stays type-safe.\ndeclare const performance: { now(): number } | undefined;\n\nfunction now(): number {\n return typeof performance !== 'undefined' && typeof performance.now === 'function'\n ? performance.now()\n : Date.now();\n}\n\n/** Build the pure single-file {@link Pipeline}. */\nexport function createPipeline(): Pipeline {\n return new DefaultPipeline();\n}\n","/**\n * @domflax/core — the shared reverse-emit step (computed → className).\n *\n * The backend re-prints `className` from each element's {@link ClassList}, but the pass manager\n * records optimized styles on `computed`. This module folds those optimized computed styles back\n * into the element's static class tokens, and is the SINGLE source of truth shared by every\n * orchestrator (the `domflax` meta package, `@domflax/cli`, and the pattern auto-test harness) so\n * their pipelines cannot diverge.\n *\n * ## Only STYLE-DIRTY elements are re-emitted (never inflate a bystander)\n *\n * Reverse-emit runs ONLY on elements a pass actually rewrote the computed style of — `meta.styleDirty`\n * (a `setClassList`, a `mergeStyle` onto it, or an inherited fold into it). An element that was merely\n * `touched` as a STRUCTURAL BYSTANDER — a child was flattened/unwrapped, a sibling merged/moved, a\n * node inserted next to it — never has its own computed changed, so its `class` attribute is left\n * BYTE-FOR-BYTE IDENTICAL. This is what stops a real custom-CSS site from INFLATING: an unchanged\n * `<div class=\"product-art\">` can no longer gain a redundant `.bg-cream-deep` just because an inert\n * child next to it was flattened.\n *\n * ## REPLACE, not append — with retained-class coverage SUBTRACTED\n *\n * For every style-dirty, rewritable (non-opaque, non-dynamic) element we ask the resolver for the\n * MINIMAL class set reproducing the element's computed style, then REPLACE the element's droppable\n * tokens with it — rather than appending. Replacing is what lets a compress pass actually shorten\n * output: `px-4 py-4` collapses to `p-4`, equal `w/h` to `size-*`, the four insets to `inset-0`, and\n * fully-overridden duplicates simply disappear.\n *\n * Crucially, before choosing what to emit we SUBTRACT the style already supplied by the element's\n * RETAINED (kept, non-droppable) classes: we emit only for the RESIDUAL declarations those classes do\n * not already reproduce. So reverse-emit can never materialize a utility for a property a semantic\n * class the element keeps already sets (the `.product-art` background is never re-added as\n * `.bg-cream-deep`). Output therefore never grows with a class whose contribution is already covered.\n *\n * ## Droppability gate (never lose a load-bearing class)\n *\n * A token is only removed when `resolver.selectorUsage(token).droppable` is true — i.e. it is a\n * plain, resolver-owned utility whose entire contribution is reproducible from `computed`. Tokens\n * that are unknown to the resolver, opaque (combinator/at-rule utilities whose effect never folds\n * onto the element's own box), variant-bound, or referenced by a custom-CSS selector are NOT\n * droppable and are preserved verbatim. As a safety net, if the residual `emit` produces nothing at\n * all we leave the element's tokens untouched (a resolver that failed to load must never erase\n * classes).\n */\n\nimport { elementIds, getElement } from './builders';\nimport { createSyntheticSink } from './pipeline';\nimport type {\n ClassList,\n ClassSegment,\n ClassToken,\n ConditionKey,\n CssProperty,\n EmitContext,\n IRDocument,\n StyleBlock,\n StyleDecl,\n StyleMap,\n StyleNormalizer,\n StyleResolver,\n} from './types';\n\n/** All static class tokens of a {@link ClassList}, in source order. */\nfunction staticTokensOf(cl: ClassList): string[] {\n const out: string[] = [];\n for (const seg of cl.segments) {\n if (seg.kind === 'static') for (const t of seg.tokens) out.push(t.value);\n }\n return out;\n}\n\n/** A rewritable static {@link ClassList} over `tokens`, preserving the previous list's spans. */\nfunction staticClassList(prev: ClassList, tokens: readonly string[]): ClassList {\n const classTokens: ClassToken[] = tokens.map((value) => ({ value }));\n const seg: ClassSegment = { kind: 'static', tokens: classTokens };\n return {\n form: 'string-literal',\n segments: [seg],\n valueSpan: prev.valueSpan,\n attrSpan: prev.attrSpan,\n hasDynamic: false,\n opaque: false,\n rewritable: true,\n };\n}\n\n/** Two token lists are equal iff same length and same tokens in the same order. */\nfunction sameTokens(a: readonly string[], b: readonly string[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i += 1) if (a[i] !== b[i]) return false;\n return true;\n}\n\n/**\n * Return the RESIDUAL of `computed` after removing every declaration the element's retained classes\n * already reproduce EXACTLY (same value + `!important`, in the same style condition). What's left is\n * the set of declarations the emitted classes must actually cover — so reverse-emit never re-adds a\n * utility for a property a kept class already supplies. A declaration whose retained-class value\n * DIFFERS from the computed one (i.e. the class was overridden) is kept in the residual: the final\n * value still has to be emitted by something.\n */\nfunction residualStyle(computed: StyleMap, covered: StyleMap, norm: StyleNormalizer): StyleMap {\n const cov = norm.normalizeStyleMap(covered);\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of norm.normalizeStyleMap(computed).blocks) {\n const covBlock = cov.blocks.get(key);\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n const covDecl = covBlock?.decls.get(prop);\n if (covDecl && covDecl.value === decl.value && covDecl.important === decl.important) continue;\n decls.set(prop, decl);\n }\n if (decls.size > 0) blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/**\n * Fold every STYLE-DIRTY, rewritable element's optimized computed style back into the MINIMAL static\n * class-token set (see module docs). Mutates `doc` in place.\n */\nexport function syncClassesFromComputed(\n doc: IRDocument,\n resolver: StyleResolver,\n norm: StyleNormalizer,\n): void {\n const sink = createSyntheticSink();\n for (const id of elementIds(doc)) {\n const el = getElement(doc, id);\n if (!el) continue;\n // Only re-derive classes for elements a pass actually rewrote the style of. A structural\n // bystander (touched but not styleDirty) keeps its class attribute byte-for-byte identical.\n if (!el.meta.styleDirty) continue;\n if (el.classes.opaque || el.classes.hasDynamic) continue;\n\n const tokens = staticTokensOf(el.classes);\n\n // Tokens that are ALWAYS retained (unknown / opaque / variant / selector-bound). Their style is\n // subtracted from the computed map so we never re-emit a class for a property they already cover.\n const retained = tokens.filter((t) => !resolver.selectorUsage(t).droppable);\n const covered = retained.length > 0 ? resolver.resolve({ classes: retained }).styles : null;\n const target = covered ? residualStyle(el.computed, covered, norm) : el.computed;\n\n // Minimal class set reproducing the residual (computed MINUS retained-class coverage).\n const ctx: EmitContext = { normalizer: norm, sink };\n const emitted = resolver.emit(target, ctx).classes;\n // A resolver that reverse-synthesized nothing must never erase the element's classes.\n if (emitted.length === 0) continue;\n\n const emittedSet = new Set(emitted);\n const next: string[] = [];\n const seen = new Set<string>();\n\n // 1. Keep each existing token that is either NOT droppable (unknown / opaque / variant /\n // selector-bound) or still part of the emitted minimal set — preserving source order.\n for (const t of tokens) {\n if (seen.has(t)) continue;\n const keep = emittedSet.has(t) || !resolver.selectorUsage(t).droppable;\n if (keep) {\n next.push(t);\n seen.add(t);\n }\n }\n // 2. Append any newly-emitted classes not already present, in emit order.\n for (const c of emitted) {\n if (seen.has(c)) continue;\n next.push(c);\n seen.add(c);\n }\n\n if (sameTokens(next, tokens)) continue; // no churn when nothing actually changed\n el.classes = staticClassList(el.classes, next);\n }\n}\n","/**\n * @domflax/pattern-kit — the shared StyleMap normalizer.\n *\n * A single, syntactic-only {@link StyleNormalizer} implementation that core, the patterns, and the\n * verifier all reuse so they agree, byte-for-byte, on what two style declarations \"mean\". It NEVER\n * resolves initial/inherited/computed defaults (that is the verifier's job) — it only:\n *\n * • canonicalizes colors (`transparent` ⇒ `rgba(0, 0, 0, 0)`, hex lower-cased + 3→6 expanded,\n * `rgb()/rgba()/hsl()/hsla()` argument spacing normalized),\n * • canonicalizes units (whitespace collapsed, zero-lengths `0px`/`0%`/… ⇒ `0`),\n * • expands a fixed set of box shorthands to longhands (`padding`/`margin`/`inset`/`border-width`\n * into their four sides, `gap` into `row-gap`/`column-gap`),\n * • orders declarations by property for stable comparison.\n *\n * Dependency-free: only `@domflax/core` (types + the StyleMap builder helpers).\n */\n\nimport type {\n CssProperty,\n CssValue,\n ConditionKey,\n InheritedPropertyTable,\n StyleBlock,\n StyleDecl,\n StyleMap,\n StyleNormalizer,\n} from '@domflax/core';\n\nimport { conditionKey, emptyStyleMap } from '@domflax/core';\n\n/* ───────────────────────── inherited-property table ───────────────────────── */\n\n/**\n * Canonical, versioned set of inherited CSS longhands. Any author custom property (`--*`) is\n * also treated as inherited via the `isInherited` predicate.\n */\nconst INHERITED_PROPERTIES: readonly string[] = [\n 'azimuth',\n 'border-collapse',\n 'border-spacing',\n 'caption-side',\n 'color',\n 'cursor',\n 'direction',\n 'empty-cells',\n 'font-family',\n 'font-feature-settings',\n 'font-kerning',\n 'font-size',\n 'font-size-adjust',\n 'font-stretch',\n 'font-style',\n 'font-variant',\n 'font-variant-caps',\n 'font-variant-numeric',\n 'font-weight',\n 'hyphens',\n 'letter-spacing',\n 'line-height',\n 'list-style-image',\n 'list-style-position',\n 'list-style-type',\n 'orphans',\n 'overflow-wrap',\n 'quotes',\n 'tab-size',\n 'text-align',\n 'text-align-last',\n 'text-decoration-color',\n 'text-indent',\n 'text-justify',\n 'text-rendering',\n 'text-shadow',\n 'text-transform',\n 'text-underline-position',\n 'visibility',\n 'white-space',\n 'widows',\n 'word-break',\n 'word-spacing',\n 'writing-mode',\n '-webkit-font-smoothing',\n];\n\nfunction createInheritedTable(): InheritedPropertyTable {\n const properties = new Set<CssProperty>(INHERITED_PROPERTIES as unknown as CssProperty[]);\n return {\n version: 'domflax-inherited@1',\n properties,\n isInherited(property: CssProperty): boolean {\n // Author custom properties (`--*`) inherit by definition.\n return String(property).startsWith('--') || properties.has(property);\n },\n };\n}\n\n/* ───────────────────────── value canonicalization ───────────────────────── */\n\nconst ZERO_LENGTH_RE =\n /\\b0(?:px|em|rem|ex|ch|vh|vw|vmin|vmax|vi|vb|pt|pc|cm|mm|in|q|lh|rlh|fr|deg|rad|turn|s|ms|%)\\b/g;\n\nconst FUNC_ARGS_RE = /\\b(rgba?|hsla?|hwb|lab|lch|oklab|oklch)\\(([^()]*)\\)/gi;\n\nconst RELATIVE_UNIT_RE = /(?:\\d*\\.?\\d+)(?:em|ex|ch|lh)\\b|%/i;\n\n/**\n * Pure, syntactic value canonicalization. Idempotent: `canon(canon(v)) === canon(v)`.\n */\nfunction canonValue(raw: string): string {\n let v = raw.trim().replace(/\\s+/g, ' ');\n\n // Lower-case hex colors (#abc / #aabbcc / #aabbccff).\n v = v.replace(/#([0-9a-fA-F]{3,8})\\b/g, (_m, hex: string) => '#' + hex.toLowerCase());\n\n // Expand 3-digit hex (#abc → #aabbcc) — only when exactly 3 hex digits.\n v = v.replace(\n /#([0-9a-f])([0-9a-f])([0-9a-f])(?![0-9a-f])/g,\n (_m, r: string, g: string, b: string) => `#${r}${r}${g}${g}${b}${b}`,\n );\n\n // Canonical fully-transparent color.\n v = v.replace(/\\btransparent\\b/gi, 'rgba(0, 0, 0, 0)');\n v = v.replace(/#00000000\\b/g, 'rgba(0, 0, 0, 0)');\n\n // Collapse zero lengths/angles/times to a bare `0`.\n v = v.replace(ZERO_LENGTH_RE, '0');\n\n // Normalize the argument spacing of color/space functions: single space after each comma.\n v = v.replace(FUNC_ARGS_RE, (_m, fn: string, args: string) => {\n const parts = args\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n return `${fn.toLowerCase()}(${parts.join(', ')})`;\n });\n\n return v;\n}\n\n/** True when the (canonicalized) value uses a parent-relative unit (em/ex/ch/lh/%). */\nfunction isRelativeValue(value: string): boolean {\n return RELATIVE_UNIT_RE.test(value);\n}\n\n/* ───────────────────────── shorthand expansion ───────────────────────── */\n\n/** Box-model shorthands whose 1–4 value form expands to four explicit sides. */\nconst BOX_SIDES: Readonly<Record<string, readonly [string, string, string, string]>> = {\n padding: ['padding-top', 'padding-right', 'padding-bottom', 'padding-left'],\n margin: ['margin-top', 'margin-right', 'margin-bottom', 'margin-left'],\n inset: ['top', 'right', 'bottom', 'left'],\n 'border-width': [\n 'border-top-width',\n 'border-right-width',\n 'border-bottom-width',\n 'border-left-width',\n ],\n 'border-style': [\n 'border-top-style',\n 'border-right-style',\n 'border-bottom-style',\n 'border-left-style',\n ],\n 'border-color': [\n 'border-top-color',\n 'border-right-color',\n 'border-bottom-color',\n 'border-left-color',\n ],\n};\n\n/** Split on top-level whitespace, keeping `fn(a, b)` groups intact. */\nfunction splitTopLevel(value: string): string[] {\n const out: string[] = [];\n let depth = 0;\n let cur = '';\n for (const ch of value) {\n if (ch === '(') depth += 1;\n else if (ch === ')') depth = Math.max(0, depth - 1);\n if (depth === 0 && /\\s/.test(ch)) {\n if (cur.length > 0) {\n out.push(cur);\n cur = '';\n }\n continue;\n }\n cur += ch;\n }\n if (cur.length > 0) out.push(cur);\n return out;\n}\n\n/** Map a 1–4 value box shorthand onto its [top, right, bottom, left] sides. */\nfunction boxFourSides(values: readonly string[]): [string, string, string, string] {\n const [a, b, c, d] = values;\n switch (values.length) {\n case 1:\n return [a!, a!, a!, a!];\n case 2:\n return [a!, b!, a!, b!];\n case 3:\n return [a!, b!, c!, b!];\n default:\n return [a!, b!, c!, d!];\n }\n}\n\n/** Expand one declaration into longhand `[property, value]` pairs (single pair if not shorthand). */\nfunction expandShorthand(prop: string, value: string): Array<[string, string]> {\n const box = BOX_SIDES[prop];\n if (box) {\n const parts = splitTopLevel(value);\n if (parts.length >= 1 && parts.length <= 4) {\n const sides = boxFourSides(parts);\n return box.map((p, i) => [p, sides[i]!] as [string, string]);\n }\n return [[prop, value]];\n }\n\n if (prop === 'gap' || prop === 'grid-gap') {\n const parts = splitTopLevel(value);\n if (parts.length === 1) {\n return [\n ['row-gap', parts[0]!],\n ['column-gap', parts[0]!],\n ];\n }\n if (parts.length === 2) {\n return [\n ['row-gap', parts[0]!],\n ['column-gap', parts[1]!],\n ];\n }\n return [[prop, value]];\n }\n\n return [[prop, value]];\n}\n\n/* ───────────────────────── the normalizer ───────────────────────── */\n\nfunction makeDecl(\n table: InheritedPropertyTable,\n prop: string,\n rawValue: string,\n important: boolean,\n): StyleDecl {\n const property = prop.trim().toLowerCase() as CssProperty;\n const value = canonValue(rawValue) as CssValue;\n return {\n property,\n value,\n important,\n relativeToParent: isRelativeValue(value),\n inherited: table.isInherited(property),\n };\n}\n\nexport function createNormalizer(): StyleNormalizer {\n const inherited = createInheritedTable();\n\n const normalizeDeclaration = (\n prop: string,\n value: string,\n important: boolean,\n ): readonly StyleDecl[] => {\n const p = prop.trim().toLowerCase();\n const expanded = expandShorthand(p, value.trim());\n return expanded.map(([lp, lv]) => makeDecl(inherited, lp, lv, important));\n };\n\n const normalizeValue = (prop: CssProperty, raw: string): CssValue => {\n void prop;\n return canonValue(raw) as CssValue;\n };\n\n const normalizeStyleMap = (sm: StyleMap): StyleMap => {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const block of sm.blocks.values()) {\n const decls = new Map<CssProperty, StyleDecl>();\n // Re-canonicalize every value and re-key (the decls are already longhand).\n for (const decl of block.decls.values()) {\n const next: StyleDecl = {\n ...decl,\n value: canonValue(String(decl.value)) as CssValue,\n relativeToParent: isRelativeValue(String(decl.value)),\n inherited: inherited.isInherited(decl.property),\n };\n decls.set(next.property, next);\n }\n // Property-sorted for deterministic iteration/serialization.\n const sorted = new Map<CssProperty, StyleDecl>(\n [...decls.entries()].sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0)),\n );\n const key = conditionKey(block.condition);\n blocks.set(key, { condition: block.condition, decls: sorted });\n }\n return { blocks };\n };\n\n const equals = (a: StyleMap, b: StyleMap): boolean => {\n const na = normalizeStyleMap(a);\n const nb = normalizeStyleMap(b);\n if (na.blocks.size !== nb.blocks.size) return false;\n for (const [key, blockA] of na.blocks) {\n const blockB = nb.blocks.get(key);\n if (!blockB) return false;\n if (blockA.decls.size !== blockB.decls.size) return false;\n for (const [prop, declA] of blockA.decls) {\n const declB = blockB.decls.get(prop);\n if (!declB) return false;\n if (declA.value !== declB.value || declA.important !== declB.important) return false;\n }\n }\n return true;\n };\n\n return {\n version: 'domflax-normalizer@1',\n normalizeDeclaration,\n normalizeValue,\n normalizeStyleMap,\n equals,\n inherited,\n };\n}\n\n/** The shared, process-wide normalizer instance reused by core / patterns / verify. */\nexport const normalizer: StyleNormalizer = createNormalizer();\n\n/* ───────────────────────── superset helper (used by `computed()` matcher) ───────────────────────── */\n\n/**\n * True when `full` contains every declaration of `partial` with an equal normalized value\n * (a per-condition, per-declaration superset test). Both maps are normalized first so the\n * comparison is meaning-based, not string-based. Empty `partial` ⇒ always `true`.\n */\nexport function isStyleSuperset(\n full: StyleMap,\n partial: StyleMap,\n norm: StyleNormalizer = normalizer,\n): boolean {\n const nf = norm.normalizeStyleMap(full);\n const np = norm.normalizeStyleMap(partial);\n for (const [key, want] of np.blocks) {\n const have = nf.blocks.get(key) ?? nf.blocks.get(conditionKey(want.condition));\n if (!have) return false;\n for (const [prop, decl] of want.decls) {\n const got = have.decls.get(prop);\n if (!got || got.value !== decl.value) return false;\n }\n }\n return true;\n}\n\n/** Re-exported for callers that want to (de)construct keys without importing core directly. */\nexport { emptyStyleMap };\n","/**\n * @domflax/pattern-kit — composable matcher vocabulary.\n *\n * A {@link Matcher} is a PURE predicate over a node + its {@link MatchContext}. Matchers never\n * mutate; they only read the (DeepReadonly) IR and the precomputed targeting/selector facts the\n * context exposes. Authors compose them with {@link and}/{@link or}/{@link not} and feed the\n * result into a pattern's `evaluate`.\n *\n * Style-aware matchers (`computed`, `hasOwnVisualStyle`) reason over the NORMALIZED StyleMap via\n * the shared normalizer in `./normalize`, so they query meaning, not raw CSS strings.\n */\n\nimport type {\n DeepReadonly,\n ElementLike,\n IRElement,\n IRNode,\n IRNodeId,\n MatchContext,\n NodeLike,\n StyleMap,\n} from '@domflax/core';\n\nimport { isStyleSuperset, normalizer } from './normalize';\n\n/** A pure predicate: does `node` satisfy this condition in the given match context? */\nexport type Matcher = (node: NodeLike, ctx: MatchContext) => boolean;\n\n/* ───────────────────────── internal helpers ───────────────────────── */\n\nfunction asElement(node: NodeLike): DeepReadonly<IRElement> | null {\n const n = node as DeepReadonly<IRNode>;\n return n.kind === 'element' ? (n as DeepReadonly<IRElement>) : null;\n}\n\nfunction elementChildrenOf(\n el: DeepReadonly<IRElement>,\n ctx: MatchContext,\n): DeepReadonly<IRElement>[] {\n const out: DeepReadonly<IRElement>[] = [];\n for (const childId of el.children) {\n const child = ctx.doc.nodes.get(childId);\n if (child && child.kind === 'element') out.push(child as DeepReadonly<IRElement>);\n }\n return out;\n}\n\n/* ───────────────────────── boolean combinators ───────────────────────── */\n\n/** Logical AND. Empty list ⇒ always matches. Short-circuits on the first failure. */\nexport function and(...matchers: readonly Matcher[]): Matcher {\n return (node, ctx) => matchers.every((m) => m(node, ctx));\n}\n\n/** Logical OR. Empty list ⇒ never matches. Short-circuits on the first success. */\nexport function or(...matchers: readonly Matcher[]): Matcher {\n return (node, ctx) => matchers.some((m) => m(node, ctx));\n}\n\n/** Logical NOT. */\nexport function not(matcher: Matcher): Matcher {\n return (node, ctx) => !matcher(node, ctx);\n}\n\n/* ───────────────────────── structural matchers ───────────────────────── */\n\n/** Matches any element; with `tag`, only elements whose (case-insensitive) tag equals it. */\nexport function isElement(tag?: string): Matcher {\n const want = tag?.toLowerCase();\n return (node) => {\n const el = asElement(node);\n if (!el) return false;\n return want === undefined || el.tag.toLowerCase() === want;\n };\n}\n\n/** Matches an element with exactly one ELEMENT child (text/expr/comment children ignored). */\nexport const hasSingleElementChild: Matcher = (node, ctx) => {\n const el = asElement(node);\n if (!el) return false;\n return elementChildrenOf(el, ctx).length === 1;\n};\n\n/* ───────────────────────── style matchers ───────────────────────── */\n\n/**\n * Matches when the node's computed StyleMap is a SUPERSET of `partial` — i.e. every declaration\n * in `partial` is present in `node.computed` with an equal normalized value. Comparison is\n * meaning-based (both sides normalized first). Empty `partial` always matches.\n */\nexport function computed(partial: StyleMap): Matcher {\n return (node, ctx) => {\n const el = asElement(node);\n if (!el) return false;\n const full = ctx.computedOf(el as unknown as NodeLike) ?? (el.computed as StyleMap);\n return isStyleSuperset(full as StyleMap, partial, normalizer);\n };\n}\n\n/** Visual (paint-establishing) properties that count as \"own visual style\", beyond pure layout. */\nconst VISUAL_PROPERTIES: ReadonlySet<string> = new Set<string>([\n 'background',\n 'background-color',\n 'background-image',\n 'border-top-width',\n 'border-right-width',\n 'border-bottom-width',\n 'border-left-width',\n 'border-top-style',\n 'border-right-style',\n 'border-bottom-style',\n 'border-left-style',\n 'border-top-color',\n 'border-right-color',\n 'border-bottom-color',\n 'border-left-color',\n 'border-radius',\n 'box-shadow',\n 'outline',\n 'outline-width',\n 'outline-style',\n 'outline-color',\n 'text-shadow',\n 'filter',\n 'backdrop-filter',\n 'mix-blend-mode',\n 'opacity',\n]);\n\n/** Values that mean \"no paint\" — a visual property set to one of these does NOT count. */\nconst EMPTY_VISUAL_VALUES: ReadonlySet<string> = new Set<string>([\n 'none',\n '0',\n 'normal',\n 'transparent',\n 'rgba(0, 0, 0, 0)',\n 'initial',\n 'unset',\n 'auto',\n]);\n\n/**\n * Matches when the element paints something of its own: a meaningful background, border, shadow,\n * outline, filter, etc. across ANY style condition. Honours the frontend-set `meta.hasOwnVisualStyle`\n * fast-path, then falls back to scanning the normalized computed StyleMap.\n */\nexport const hasOwnVisualStyle: Matcher = (node, ctx) => {\n const el = asElement(node);\n if (!el) return false;\n if (el.meta.hasOwnVisualStyle) return true;\n\n const computedMap = ctx.computedOf(el as unknown as NodeLike) ?? (el.computed as StyleMap);\n const norm = normalizer.normalizeStyleMap(computedMap as StyleMap);\n for (const block of norm.blocks.values()) {\n for (const decl of block.decls.values()) {\n if (!VISUAL_PROPERTIES.has(String(decl.property))) continue;\n if (!EMPTY_VISUAL_VALUES.has(String(decl.value))) return true;\n }\n }\n return false;\n};\n\n/* ───────────────────────── opacity-barrier / meta matchers ───────────────────────── */\n\n/** Element carries a `ref` (hard opacity barrier). */\nexport const hasRef: Matcher = (node) => asElement(node)?.meta.hasRef ?? false;\n\n/** Element has event handlers (onClick, …). */\nexport const hasEventHandlers: Matcher = (node) => asElement(node)?.meta.hasEventHandlers ?? false;\n\n/** Element has dynamic children (mapped/conditional islands). */\nexport const hasDynamicChildren: Matcher = (node) =>\n asElement(node)?.meta.hasDynamicChildren ?? false;\n\n/** Element's class list contains a dynamic segment (template/expr) → not freely rewritable. */\nexport const hasDynamicClasses: Matcher = (node) => asElement(node)?.classes.hasDynamic ?? false;\n\n/**\n * Element's class list is wholly dynamic / spread-derived (`classes.opaque`, or spread attrs) — its\n * concrete tokens can't be seen or statically rewritten, so a class-rewriting (compress) pattern\n * must decline. Delegates to the context's authoritative {@link MatchContext.isOpaque}.\n */\nexport const opaque: Matcher = (node, ctx) => {\n const el = asElement(node);\n if (!el) return false;\n return ctx.isOpaque(el as unknown as ElementLike);\n};\n\n/**\n * Element is the subject of a combinator selector (`>`/`+`/`~`). Honours the frontend-set meta\n * flag and the precomputed {@link SelectorIndex} in the context.\n */\nexport const targetedByCombinator: Matcher = (node, ctx) => {\n const el = asElement(node);\n if (!el) return false;\n if (el.meta.targetedByCombinator) return true;\n // `el.id` is a branded number; DeepReadonly widens the brand, so re-narrow for the index call.\n return ctx.selectors.targetedByCombinator(el.id as unknown as IRNodeId);\n};\n","/**\n * @domflax/pattern-kit — `validatePattern` (INTERNAL).\n *\n * A small, eager validator + identity wrapper that turns a lowered {@link Pattern} spec into a\n * frozen, contract-checked Pattern. Catching shape errors here (bad category/phase, missing\n * `evaluate`, out-of-range safety) keeps the pass-manager's hot loop free of defensive checks and\n * gives authors an immediate, actionable error at module-load time.\n *\n * This is the PRIVATE lower-level core: it is consumed only by the declarative\n * {@link import('./pattern').definePattern} authoring surface (which compiles a high-level config\n * down to a {@link Pattern} and then runs it through this validator). It is intentionally NOT part\n * of the public package surface — authors use `definePattern` instead.\n */\n\nimport type { PassPhase, Pattern, SafetyLevel } from '@domflax/core';\n\nconst PHASES: ReadonlySet<PassPhase> = new Set<PassPhase>(['flatten', 'compress', 'extract']);\nconst SAFETY_LEVELS: ReadonlySet<SafetyLevel> = new Set<SafetyLevel>([0, 1, 2, 3]);\n\nfunction fail(name: string, why: string): never {\n throw new Error(`definePattern(${name || '<anonymous>'}): ${why}`);\n}\n\n/**\n * Validate and freeze a {@link Pattern}. Throws on any contract violation; otherwise returns the\n * (shallow-frozen) spec unchanged so it can be registered into a {@link Pass}. INTERNAL — see the\n * module header; authors call the declarative {@link import('./pattern').definePattern}.\n */\nexport function validatePattern(spec: Pattern): Pattern {\n if (spec == null || typeof spec !== 'object') {\n throw new Error('definePattern: spec must be an object');\n }\n\n const name = spec.name;\n if (typeof name !== 'string' || name.length === 0) {\n fail(String(name), 'name must be a non-empty string');\n }\n\n if (typeof spec.category !== 'string' || !spec.category.includes('/')) {\n fail(name, `category must be a \"<phase>/<slug>\" string (got ${JSON.stringify(spec.category)})`);\n }\n\n const phase = spec.category.split('/', 1)[0] as PassPhase;\n if (!PHASES.has(phase)) {\n fail(name, `category phase must be one of flatten|compress|extract (got \"${phase}\")`);\n }\n\n if (!SAFETY_LEVELS.has(spec.safety)) {\n fail(name, `safety must be 0|1|2|3 (got ${JSON.stringify(spec.safety)})`);\n }\n\n if (typeof spec.evaluate !== 'function') {\n fail(name, 'evaluate must be a function');\n }\n\n if (spec.priority !== undefined && !Number.isFinite(spec.priority)) {\n fail(name, 'priority must be a finite number when provided');\n }\n\n return Object.freeze({ ...spec });\n}\n","/**\n * @domflax/pattern-kit — `definePattern()`: THE declarative pattern-authoring surface.\n *\n * `definePattern(config)` is the single public way to author a rewrite pattern: definition AND its\n * tests are co-located in one call. It compiles down to the private lower-level\n * {@link import('./define').validatePattern}/{@link Pattern} contract (it never replaces the\n * engine). Authors describe the match as a plain DATA object and the rewrite as a named RECIPE; this\n * module maps each key to the existing matcher combinators and op-draft factories, auto-applies the\n * phase-appropriate safety guards (the full opacity-barrier + selector set for `flatten/*`; the\n * narrower class-rewrite-safety set for `compress/*`) so authors never hand-write them, and threads\n * `doc`/`test` through. Two escape hatches — a `match` predicate and a `rewrite` function — keep\n * exotic patterns (e.g. ones anchored on a parent fragment) expressible.\n *\n * The co-located {@link PatternTest} (`provider`/`cssFiles`/`cases`/`noMatch`/`custom`) is carried on\n * the compiled {@link AuthoredPattern} as `.test`, where the generic harness (`./testing`) reads it:\n * each `case` asserts `before → after`, each `noMatch` asserts the input is left unchanged, and the\n * optional `custom` hook runs arbitrary assertions against the built transform.\n *\n * `style` blocks in the declarative match (and in `childGains`/`mergeStyle` recipes) are PLAIN\n * objects (camelCase or kebab keys) auto-normalized into a superset StyleMap via the shared\n * normalizer — authors never import the normalizer or hand-build a StyleMap.\n *\n * `pattern` remains exported as a DEPRECATED alias of `definePattern` for backward compatibility.\n */\n\nimport type {\n Captures,\n ConditionKey,\n CssProperty,\n DeepReadonly,\n IRElement,\n IRNode,\n IRNodeId,\n MatchContext,\n MatchResult,\n NodeLike,\n NodeMeta,\n PassCategory,\n PassPhase,\n Pattern,\n PatternDoc,\n PreconditionSketch,\n RewriteFactory,\n RewriteOpDraft,\n SafetyLevel,\n StyleBlock,\n StyleDecl,\n StyleMap,\n StyleOrigin,\n StyleConflictPolicy,\n} from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport {\n and,\n computed,\n hasDynamicChildren,\n hasDynamicClasses,\n hasEventHandlers,\n hasOwnVisualStyle,\n hasRef,\n hasSingleElementChild,\n isElement,\n not,\n opaque,\n targetedByCombinator,\n type Matcher,\n} from './combinators';\nimport { validatePattern } from './define';\nimport { normalizer } from './normalize';\n\n/* ───────────────────────── public config shapes ───────────────────────── */\n\n/** A plain CSS style object: camelCase or kebab-case keys, string or number values. */\nexport type PlainStyle = Readonly<Record<string, string | number>>;\n\n/**\n * Declarative match as DATA. Every key maps to one of the existing matcher combinators; an empty\n * object matches any element. Use the `match` FUNCTION escape hatch for anything not expressible\n * here (relational/ancestor/sibling shapes, parent-anchored patterns, …).\n */\nexport interface DeclarativeMatch {\n /** Restrict to a tag (case-insensitive). Omit to match any element. */\n readonly tag?: string;\n /** Computed style the node must be a SUPERSET of (plain object, auto-normalized). */\n readonly style?: PlainStyle;\n /** Require exactly one ELEMENT child. */\n readonly onlyChild?: 'element';\n /** Require the element to paint nothing of its own (no own visual style). */\n readonly paintsNothing?: boolean;\n /** Extra, hand-written predicate AND-ed into the declarative match. */\n readonly where?: Matcher | readonly Matcher[];\n}\n\n/** Escape hatch: a raw match predicate (no auto-guards are added). */\nexport type MatchFn = (node: NodeLike, ctx: MatchContext) => boolean;\n\n/**\n * Flatten recipe: fold inherited styles onto the sole element child (default on), optionally merge\n * `childGains` onto it, then unwrap the node (id-preserving). Mirrors the flatten exemplars.\n */\nexport interface FlattenIntoRecipe {\n readonly flattenInto: 'child';\n /** Plain style merged onto the surviving child (source-wins) before unwrap. */\n readonly childGains?: PlainStyle;\n /** Fold inheritable declarations onto the child first. Default `true`. */\n readonly foldInherited?: boolean;\n}\n\n/** Compress recipe: rebuild the element's class StyleMap; return `null` to decline. */\nexport interface RewriteClassesRecipe {\n readonly rewriteClasses: (computed: StyleMap, ctx: MatchContext) => StyleMap | null;\n /** Keep opaque/selector-bound tokens verbatim. Default `true`. */\n readonly preserveOpaque?: boolean;\n}\n\n/** Compress recipe: drop fully-overridden class tokens (provenance is pruned automatically). */\nexport interface DropClassesRecipe {\n readonly dropClasses: (computed: StyleMap, ctx: MatchContext) => Iterable<string>;\n /** Keep opaque/selector-bound tokens verbatim. Default `true`. */\n readonly preserveOpaque?: boolean;\n}\n\n/** Merge a literal plain style onto the matched element. */\nexport interface MergeStyleRecipe {\n readonly mergeStyle: PlainStyle;\n readonly onConflict?: StyleConflictPolicy;\n}\n\nexport type RewriteRecipe =\n | FlattenIntoRecipe\n | RewriteClassesRecipe\n | DropClassesRecipe\n | MergeStyleRecipe;\n\n/** Escape hatch: a raw rewrite that returns op drafts (or `null`/`[]` for no-op). */\nexport type RewriteFn = (\n ctx: MatchContext,\n rw: RewriteFactory,\n) => readonly RewriteOpDraft[] | null;\n\n/** A single positive before→after assertion run through the pattern's built transform. */\nexport interface PatternTestCase {\n readonly name?: string;\n readonly before: string;\n readonly after: string;\n}\n\n/** Helpers handed to a {@link PatternTest.custom} hook (the built transform + expectation sugar). */\nexport interface TestHelpers {\n /** Run the pattern's transform on `code` (default filename `'X.tsx'`). */\n readonly transform: (code: string, filename?: string) => string;\n /** Assert `before` transforms to `after` (whitespace-normalized). */\n readonly expectTransforms: (before: string, after: string) => void;\n /** Assert `code` is left unchanged (whitespace-normalized). */\n readonly expectUnchanged: (code: string) => void;\n}\n\n/**\n * Co-located test spec for a pattern. The generic harness (`./testing`) builds a transform for the\n * declared `provider` (default `'tailwind'`; `'custom'` resolves the listed `cssFiles`), then runs\n * every `case` (`before → after`), every `noMatch` (left unchanged), and the optional `custom` hook.\n */\nexport interface PatternTest {\n /** Which style provider the harness builds the transform from. Default `'tailwind'`. */\n readonly provider?: 'tailwind' | 'custom';\n /** For `provider: 'custom'` — the project stylesheet paths backing the CSS resolver. */\n readonly cssFiles?: readonly string[];\n /** Positive before→after assertions. */\n readonly cases?: readonly PatternTestCase[];\n /** Inputs the pattern must leave UNCHANGED (barriers, non-matching shapes, safety reverts). */\n readonly noMatch?: readonly string[];\n /** Arbitrary extra assertions against the built transform. */\n readonly custom?: (h: TestHelpers) => void;\n}\n\nexport interface PatternConfig {\n readonly name: string;\n readonly category: PassCategory;\n readonly safety: SafetyLevel;\n readonly priority?: number;\n readonly precondition?: PreconditionSketch;\n readonly doc?: PatternDoc;\n /** Co-located tests consumed by the generic harness (`./testing`). */\n readonly test?: PatternTest;\n /** Declarative match DATA, or a raw predicate escape hatch. Defaults to \"any element\". */\n readonly match?: DeclarativeMatch | MatchFn;\n /** A named rewrite recipe, or a raw op-draft factory escape hatch. */\n readonly rewrite: RewriteRecipe | RewriteFn;\n}\n\n/** A {@link Pattern} that also carries its co-located {@link PatternTest} for the test harness. */\nexport interface AuthoredPattern<C extends Captures = Captures> extends Pattern {\n readonly test?: PatternTest;\n evaluate(ctx: MatchContext, rw: RewriteFactory): MatchResult<C> | null;\n}\n\n/* ───────────────────────── plain-style → StyleMap ───────────────────────── */\n\nfunction camelToKebab(key: string): string {\n if (key.startsWith('--')) return key; // custom property — leave verbatim\n return key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n}\n\n/** Build a single-(base-)condition StyleMap from a plain style object via the shared normalizer. */\nfunction plainToStyleMap(style: PlainStyle): StyleMap {\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [rawKey, rawValue] of Object.entries(style)) {\n const prop = camelToKebab(rawKey);\n for (const decl of normalizer.normalizeDeclaration(prop, String(rawValue), false)) {\n decls.set(decl.property, decl);\n }\n }\n const block: StyleBlock = { condition: BASE_CONDITION, decls };\n return { blocks: new Map<ConditionKey, StyleBlock>([[conditionKey(BASE_CONDITION), block]]) };\n}\n\n/* ───────────────────────── local meta / selector matchers ───────────────────────── */\n\nfunction asElement(node: NodeLike): DeepReadonly<IRElement> | null {\n const n = node as DeepReadonly<IRNode>;\n return n.kind === 'element' ? (n as DeepReadonly<IRElement>) : null;\n}\n\nfunction metaFlag(flag: keyof NodeMeta): Matcher {\n return (node) => Boolean(asElement(node)?.meta[flag]);\n}\n\n/** Element renders raw/`dangerouslySetInnerHTML` markup — a hard opacity barrier. */\nconst hasRawHtml: Matcher = metaFlag('hasDangerousHtml');\n\n/**\n * Unwrapping/removing this node would change the combinator / structural-pseudo match-set of itself,\n * its child, or a former sibling. Empty `reparentImpact` ⇒ structurally safe to hoist.\n */\nconst affectsSelectorMatching: Matcher = (node, ctx) => {\n const el = asElement(node);\n if (!el) return false;\n return ctx.selectors.reparentImpact(el.id as unknown as IRNodeId).size > 0;\n};\n\n/**\n * The opacity-barrier + selector-safety guards every `flatten/*` pattern must carry. Auto-applied to\n * the declarative match so authors never hand-write them (the flatten exemplars spell them out).\n *\n * Flatten UNWRAPS the element (moving its children into a new parent and dropping its box), so every\n * opacity barrier matters: a ref, event handler, dynamic child, or raw HTML on the wrapper — or any\n * selector the reparent would disturb — makes the flatten unsafe.\n */\nconst FLATTEN_GUARDS: Matcher = and(\n not(hasRef),\n not(hasEventHandlers),\n not(hasDynamicChildren),\n not(hasRawHtml),\n not(targetedByCombinator),\n not(affectsSelectorMatching),\n);\n\n/**\n * The guards every `compress/*` pattern must carry. Compress ONLY ever rewrites the element's OWN\n * class tokens (e.g. `px-4 py-4 → p-4`) — it never touches the element's structure, children, or\n * identity. A dynamic `{expr}` child, a ref, an event handler, or `dangerouslySetInnerHTML` is\n * therefore wholly unaffected by a class-only change, so — unlike flatten — those opacity barriers\n * must NOT gate compress. Compress is gated ONLY on what actually makes a class rewrite unsafe:\n * • a className we can't statically rewrite — a dynamic segment ({@link hasDynamicClasses}) or a\n * wholly dynamic / spread-derived list ({@link opaque}); and\n * • the selector-safety guard — a class a CSS combinator selector structurally depends on\n * ({@link targetedByCombinator}) must not be dropped or rewritten.\n */\nconst COMPRESS_GUARDS: Matcher = and(\n not(hasDynamicClasses),\n not(opaque),\n not(targetedByCombinator),\n);\n\n/* ───────────────────────── match compilation ───────────────────────── */\n\n/** The auto-applied guard set for a pattern's phase (compress vs flatten get different barriers). */\nfunction autoGuardsFor(category: PassCategory): Matcher | null {\n switch (category.split('/', 1)[0] as PassPhase) {\n case 'flatten':\n return FLATTEN_GUARDS;\n case 'compress':\n return COMPRESS_GUARDS;\n default:\n return null;\n }\n}\n\nfunction compileDeclarativeMatch(m: DeclarativeMatch): Matcher {\n const parts: Matcher[] = [isElement(m.tag)];\n if (m.style) parts.push(computed(plainToStyleMap(m.style)));\n if (m.onlyChild === 'element') parts.push(hasSingleElementChild);\n if (m.paintsNothing) parts.push(not(hasOwnVisualStyle));\n if (m.where) {\n const extra = Array.isArray(m.where) ? (m.where as readonly Matcher[]) : [m.where as Matcher];\n for (const w of extra) parts.push(w);\n }\n return and(...parts);\n}\n\nfunction compileMatch(\n match: DeclarativeMatch | MatchFn | undefined,\n category: PassCategory,\n): MatchFn {\n // Escape hatch: a raw predicate takes full control (no auto-guards).\n if (typeof match === 'function') return match;\n\n const declarative = compileDeclarativeMatch(match ?? {});\n const guards = autoGuardsFor(category);\n const guarded = guards ? and(declarative, guards) : declarative;\n return (node, ctx) => guarded(node, ctx);\n}\n\n/* ───────────────────────── rewrite compilation ───────────────────────── */\n\n/** Clone `sm`, pruning every `shadowed` provenance entry that references a dropped class token. */\nfunction pruneShadowed(sm: StyleMap, drop: ReadonlySet<string>): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n const filtered = (decl.shadowed ?? []).filter(\n (o) => !(o.kind === 'class' && drop.has(o.className)),\n );\n const rest: StyleDecl = { ...decl };\n delete (rest as { shadowed?: readonly StyleOrigin[] }).shadowed;\n const next: StyleDecl = filtered.length > 0 ? { ...rest, shadowed: filtered } : rest;\n decls.set(prop, next);\n }\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\nfunction compileFlattenInto(recipe: FlattenIntoRecipe): RewriteFn {\n const childGains = recipe.childGains ? plainToStyleMap(recipe.childGains) : null;\n const fold = recipe.foldInherited !== false;\n return (ctx, rw) => {\n const wrapper = ctx.node;\n const child = ctx.onlyElementChild();\n if (!child) return null;\n const ops: RewriteOpDraft[] = [];\n if (fold) ops.push(rw.foldInheritedStyles(wrapper, child, { conditions: 'all' }));\n if (childGains) ops.push(rw.mergeStyle(child, null, childGains, 'source-wins'));\n ops.push(rw.unwrap(wrapper));\n return ops;\n };\n}\n\nfunction compileRewrite(rewrite: RewriteRecipe | RewriteFn): RewriteFn {\n if (typeof rewrite === 'function') return rewrite;\n\n if ('flattenInto' in rewrite) return compileFlattenInto(rewrite);\n\n if ('rewriteClasses' in rewrite) {\n const preserveOpaque = rewrite.preserveOpaque ?? true;\n return (ctx, rw) => {\n const next = rewrite.rewriteClasses(ctx.computed(), ctx);\n if (!next) return null;\n return [rw.setClassList(ctx.node, next, preserveOpaque)];\n };\n }\n\n if ('dropClasses' in rewrite) {\n const preserveOpaque = rewrite.preserveOpaque ?? true;\n return (ctx, rw) => {\n const drop = new Set<string>(rewrite.dropClasses(ctx.computed(), ctx));\n if (drop.size === 0) return null;\n return [rw.setClassList(ctx.node, pruneShadowed(ctx.computed(), drop), preserveOpaque)];\n };\n }\n\n // MergeStyleRecipe\n const style = plainToStyleMap(rewrite.mergeStyle);\n const onConflict = rewrite.onConflict ?? 'abort';\n return (ctx, rw) => [rw.mergeStyle(ctx.node, null, style, onConflict)];\n}\n\n/* ───────────────────────── the public factory ───────────────────────── */\n\n/**\n * THE declarative pattern-authoring function. Compile a {@link PatternConfig} (definition + co-located\n * {@link PatternTest}) into a validated {@link AuthoredPattern}: a normal {@link Pattern} (registerable\n * into any {@link import('@domflax/core').Pass}) that also exposes its `test` for the generic harness.\n */\nexport function definePattern(config: PatternConfig): AuthoredPattern {\n const matchFn = compileMatch(config.match, config.category);\n const rewriteFn = compileRewrite(config.rewrite);\n\n const spec: AuthoredPattern = {\n name: config.name,\n category: config.category,\n safety: config.safety,\n priority: config.priority,\n precondition: config.precondition,\n doc: config.doc,\n test: config.test,\n evaluate(ctx: MatchContext, rw: RewriteFactory): MatchResult | null {\n if (!matchFn(ctx.node as unknown as NodeLike, ctx)) return null;\n const ops = rewriteFn(ctx, rw);\n if (!ops || ops.length === 0) return null;\n return { ops };\n },\n };\n\n // `validatePattern` validates + freezes; the spread preserves `test` at runtime.\n return validatePattern(spec) as AuthoredPattern;\n}\n\n/**\n * @deprecated Use {@link definePattern}. Retained as a thin alias for backward compatibility.\n */\nexport const pattern = definePattern;\n","/**\n * @domflax/patterns — flatten pattern: `display-contents-wrapper`.\n *\n * Collapses a wrapper that has explicitly opted OUT of generating a box:\n *\n * <div style=\"display:contents\"><Child/></div> → <Child/>\n *\n * `display:contents` makes an element generate NO box of its own — its children render exactly as if\n * they were direct children of the element's parent. A `display:contents` wrapper with a single\n * element child is therefore already a layout passthrough: it contributes nothing to flow, paint\n * (a contents box paints nothing), formatting, stacking, or containing-block resolution. Removing it\n * and hoisting the child produces a tree that is layout-identical — the wrapper's only remaining\n * effect was inheritance, which is preserved by folding inheritable declarations onto the child first.\n *\n * This is the safest possible wrapper-elimination: the box being removed provably did not exist.\n * The opacity-barrier + selector-safety guards (ref/handlers/dynamic-children/raw-html/combinator/\n * reparent-impact) are auto-applied for every `flatten/*` pattern; the `where` predicates add the\n * passthrough-specific requirements (no own attrs / dynamic-or-spread classes, no `var()` coupling,\n * not a component, not a structural-pseudo subject).\n *\n * (Chosen as the safe variant of the size-hoisting \"full-size passthrough\" idea: hoisting an explicit\n * `width/height:100%` onto a child is only sound when the child is block-level and unsized, which is\n * not knowable from the wrapper alone — whereas a `display:contents` box is a passthrough by definition.)\n */\n\nimport type {\n DeepReadonly,\n IRElement,\n IRNode,\n IRNodeId,\n NodeLike,\n NodeMeta,\n} from '@domflax/core';\n\nimport { definePattern, hasDynamicClasses, not, type Matcher } from '@domflax/pattern-kit';\n\n/* ───────────────────────── local meta/attr/selector matchers ───────────────────────── */\n\nfunction asEl(node: NodeLike): DeepReadonly<IRElement> | null {\n const n = node as DeepReadonly<IRNode>;\n return n.kind === 'element' ? (n as DeepReadonly<IRElement>) : null;\n}\n\nfunction metaOf(node: NodeLike): DeepReadonly<NodeMeta> | null {\n return asEl(node)?.meta ?? null;\n}\n\n/**\n * Element exposes custom properties to a descendant — removing its box could sever a `var()` coupling,\n * so it is NOT a free passthrough. (A `display:contents` box establishes no formatting/stacking/box\n * context and is no containing block, so those flags need not be checked.)\n */\nconst declaresCustomProperties: Matcher = (node) => metaOf(node)?.declaresCustomProperties ?? false;\n\n/** Hard opacity barriers beyond the auto-applied set: spread attrs, component identity. */\nconst hasSpreadAttrs: Matcher = (node) => metaOf(node)?.hasSpreadAttrs ?? false;\nconst isComponentNode: Matcher = (node) => metaOf(node)?.isComponent ?? false;\n\n/** Element carries own attributes (id / data-* / …) beyond its class list — possible selector/JS hook. */\nconst hasOwnAttrs: Matcher = (node) => {\n const el = asEl(node);\n if (!el) return false;\n return el.attrs.entries.size > 0 || el.attrs.spreads.length > 0;\n};\n\n/**\n * Element is the subject of a structural pseudo (`:first/:last/:only/:nth-*`). Honours the meta flag\n * and the precomputed {@link SelectorIndex}.\n */\nconst targetedByStructuralPseudo: Matcher = (node, ctx) => {\n const el = asEl(node);\n if (!el) return false;\n if (el.meta.targetedByStructuralPseudo) return true;\n return ctx.selectors.targetedByStructuralPseudo(el.id as unknown as IRNodeId);\n};\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/**\n * Flatten a `display:contents` wrapper (a box that generates no box) into its sole element child,\n * folding any inheritable styles down first so inherited values survive the removal.\n */\nexport const displayContentsWrapper = definePattern({\n name: 'display-contents-wrapper',\n category: 'flatten/display-contents-wrapper',\n safety: 2,\n doc: {\n title: 'Flatten display:contents wrapper',\n summary:\n 'A div with display:contents (which generates no box) wrapping a single element child, with ' +\n 'no own visual style, no attributes beyond an inert class, and no opacity barriers, is removed; ' +\n 'its sole child is hoisted in its place.',\n before: '<div style=\"display:contents\"><Child/></div>',\n after: '<Child/>',\n safetyRationale:\n 'A display:contents element generates no box at all, so its children already render as direct ' +\n \"children of its parent; removing it is layout-identical. It paints nothing, establishes no \" +\n 'formatting/stacking/box context, is no containing block, carries no ' +\n 'ref/handlers/dynamic-children/html/spread/component identity, owns no targetable attrs / ' +\n 'custom-property coupling, and is not a combinator/structural-pseudo subject; inheritable ' +\n 'styles are folded onto the child before removal.',\n },\n match: {\n tag: 'div',\n style: { display: 'contents' },\n onlyChild: 'element',\n paintsNothing: true,\n where: [\n not(declaresCustomProperties),\n not(hasOwnAttrs),\n not(hasDynamicClasses),\n not(hasSpreadAttrs),\n not(isComponentNode),\n not(targetedByStructuralPseudo),\n ],\n },\n rewrite: { flattenInto: 'child' },\n test: {\n cases: [\n {\n // `display:contents` generates no box, so removing it is provably layout-identical → the\n // wrapper is flattened even under the conservative gate; the child is hoisted.\n before: '<div className=\"contents\"><a className=\"text-blue-500\">Link</a></div>',\n after: '<a className=\"text-blue-500\">Link</a>',\n },\n ],\n noMatch: [\n // A ref pins the wrapper's element identity (a hard opacity barrier) → not a passthrough.\n '<div className=\"contents\" ref={rootRef}><a className=\"text-blue-500\">Link</a></div>',\n ],\n },\n});\n","/**\n * @domflax/patterns — flatten pattern: `empty-style-div`.\n *\n * Collapses the most common piece of structural noise of all: a `<div>` whose ONLY role is to wrap\n * a single child while contributing nothing to layout or paint —\n *\n * <div><Child/></div> (no styles at all)\n * <div style=\"display:block\"><Child/></div> (the default; still a no-op box)\n *\n * Such a div is layout-neutral: it is a plain block box with no own visual style, establishes no\n * box / formatting / stacking context, is not a containing block, and declares no custom properties\n * a descendant might read. Its box is therefore indistinguishable from \"not being there\", so it can\n * be unwrapped into its sole child.\n *\n * Authored with the declarative {@link definePattern} API. The opacity-barrier + selector-safety\n * guards (ref/handlers/dynamic-children/raw-html/combinator/reparent-impact) are applied\n * automatically for every `flatten/*` pattern; the `where` predicates below add the LAYOUT-neutrality\n * requirements specific to this pattern (no non-block display, no box/formatting/stacking context, no\n * containing block, no custom-property coupling, no structural-pseudo targeting).\n */\n\nimport type {\n CssProperty,\n DeepReadonly,\n IRElement,\n IRNode,\n IRNodeId,\n NodeLike,\n NodeMeta,\n StyleMap,\n} from '@domflax/core';\n\nimport { definePattern, not, type Matcher } from '@domflax/pattern-kit';\n\n/* ───────────────────────── local matcher helpers ───────────────────────── */\n\n/** Narrow a NodeLike to a (readonly) element, or null. */\nfunction asEl(node: NodeLike): DeepReadonly<IRElement> | null {\n const n = node as DeepReadonly<IRNode>;\n return n.kind === 'element' ? (n as DeepReadonly<IRElement>) : null;\n}\n\n/** A boolean `meta` flag, lifted into a {@link Matcher}. Mirrors how core's combinators read meta. */\nfunction metaFlag(flag: keyof NodeMeta): Matcher {\n return (node) => Boolean(asEl(node)?.meta[flag]);\n}\n\n/** Wrapper establishes an intrinsic/explicit box (sizing) — NOT layout-neutral. */\nconst establishesBox = metaFlag('establishesBox');\n/** Wrapper establishes a formatting context (flex/grid/flow-root/…) — NOT layout-neutral. */\nconst establishesFormattingContext = metaFlag('establishesFormattingContext');\n/** Wrapper establishes a stacking context (transform/opacity<1/z-index/…) — NOT layout-neutral. */\nconst establishesStackingContext = metaFlag('establishesStackingContext');\n/** Wrapper is the containing block for abs/fixed descendants — removing it would reposition them. */\nconst isContainingBlock = metaFlag('isContainingBlock');\n/** Wrapper sets `--*` custom properties a descendant reads (author-var coupling). */\nconst declaresCustomProperties = metaFlag('declaresCustomProperties');\n\n/**\n * Wrapper is a structural-pseudo target (:first/:last/:only/:nth-child/-of-type). Honours the\n * frontend-set meta flag and the precomputed {@link SelectorIndex}. Unwrapping such a node would\n * change a selector's match-set.\n */\nconst targetedByStructuralPseudo: Matcher = (node, ctx) => {\n const el = asEl(node);\n if (!el) return false;\n if (el.meta.targetedByStructuralPseudo) return true;\n return ctx.selectors.targetedByStructuralPseudo(el.id as unknown as IRNodeId);\n};\n\nconst DISPLAY = 'display' as CssProperty;\n\n/**\n * True when the wrapper sets `display` to anything other than the block default in ANY condition.\n * An `inline`/`inline-block`/`flex`/`grid`/`contents`/`none` div is NOT layout-neutral — its box (or\n * lack of one) participates in layout differently from its surviving child.\n */\nconst hasNonBlockDisplay: Matcher = (node, ctx) => {\n const el = asEl(node);\n if (!el) return false;\n const sm: StyleMap = ctx.computedOf(el as unknown as NodeLike) ?? (el.computed as StyleMap);\n for (const block of sm.blocks.values()) {\n const decl = block.decls.get(DISPLAY);\n if (decl && String(decl.value) !== 'block') return true;\n }\n return false;\n};\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/**\n * Flatten a layout-neutral, style-free `<div>` wrapper into its sole element child.\n */\nexport const emptyStyleDiv = definePattern({\n name: 'empty-style-div',\n category: 'flatten/empty-style-div',\n safety: 1,\n doc: {\n title: 'Flatten empty-style div wrapper',\n summary:\n 'A layout-neutral div (display:block default, no box/visual styles) that wraps a single ' +\n 'child is removed; the child is hoisted into its place.',\n before: '<div><Child/></div>',\n after: '<Child/>',\n safetyRationale:\n 'Wrapper is a plain block box that paints nothing, establishes no box/formatting/stacking ' +\n 'context, is no containing block, has no custom-property coupling, carries no ' +\n 'ref/handlers/dynamic children/raw HTML, and is neither a combinator subject nor a ' +\n 'structural-pseudo target; inheritable styles are folded onto the child before removal.',\n },\n match: {\n tag: 'div',\n onlyChild: 'element',\n paintsNothing: true,\n where: [\n not(hasNonBlockDisplay),\n not(establishesBox),\n not(establishesFormattingContext),\n not(establishesStackingContext),\n not(isContainingBlock),\n not(declaresCustomProperties),\n not(targetedByStructuralPseudo),\n ],\n },\n rewrite: { flattenInto: 'child' },\n test: {\n cases: [\n {\n // A layout-neutral, style-free block div is a provably-safe flatten → removed, child hoisted.\n before: '<div><span className=\"bg-red-200\">Hi</span></div>',\n after: '<span className=\"bg-red-200\">Hi</span>',\n },\n ],\n noMatch: [\n // The wrapper paints its own background (own visual style) → not layout-neutral, kept.\n '<div className=\"bg-blue-500\"><span className=\"bg-red-200\">Hi</span></div>',\n ],\n },\n});\n","/**\n * @domflax/patterns — flatten pattern: `flex-center-wrapper`.\n *\n * Collapses the ubiquitous \"centering wrapper\" idiom\n *\n * <div style=\"display:flex; align-items:center; justify-content:center\"><Child/></div>\n *\n * into its sole child, pushing the centering intent down onto the child as `place-self: center`.\n * The wrapper only exists to center one element; once `place-self:center` lives on the child the\n * wrapper is pure structural noise and can go.\n *\n * Authored with the declarative {@link definePattern} API: the match is the flex-centering\n * computed-style signature on a single-element-child `<div>` that paints nothing of its own; the\n * recipe folds inheritable styles onto the child, grants it `place-self:center`, then unwraps the\n * wrapper (id-preserving). The opacity-barrier + selector-safety guards are applied automatically by\n * the `definePattern` factory for every `flatten/*` pattern.\n */\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/**\n * Flatten a flex-centering `<div>` wrapper into its sole element child, granting the child\n * `place-self:center`.\n */\nexport const flexCenterWrapper = definePattern({\n name: 'flex-center-wrapper',\n category: 'flatten/flex-center-wrapper',\n safety: 2,\n doc: {\n title: 'Flatten flex-centering wrapper',\n summary:\n 'A div that only centers a single child (display:flex; align-items:center; ' +\n 'justify-content:center) is removed; the child gains place-self:center.',\n before: '<div style=\"display:flex;align-items:center;justify-content:center\"><Child/></div>',\n after: '<Child style=\"place-self:center\"/>',\n safetyRationale:\n 'Wrapper paints nothing, carries no ref/handlers/dynamic children, and is not a combinator ' +\n 'subject; inheritable styles are folded onto the child before removal.',\n },\n match: {\n tag: 'div',\n style: { display: 'flex', alignItems: 'center', justifyContent: 'center' },\n onlyChild: 'element',\n paintsNothing: true,\n },\n rewrite: {\n flattenInto: 'child',\n childGains: { placeSelf: 'center' },\n },\n // Collapsing a flex-centering wrapper to `place-self:center` on the child is render-identical ONLY\n // when the child's NEW parent is a statically-known GRID that lets the wrapper fill its area (there\n // `place-self`'s align-self AND justify-self both take effect). Under that ONE context the flatten is\n // classified `provably-safe` and commits; under a flex/block/unknown parent — or when the wrapper\n // drops any own style — it stays `needs-verification` and the conservative production gate PRESERVES\n // it. Op-level correctness (purity, id-preserving unwrap, opacity-barrier safety) is additionally\n // asserted by the invariant suite over every pattern.\n test: {\n cases: [\n {\n name: 'grid parent → flattened (child gains place-self-center)',\n before:\n '<div className=\"grid\">' +\n '<div className=\"flex items-center justify-center\"><span className=\"bg-red-200\">x</span></div>' +\n '</div>',\n after: '<div className=\"grid\"><span className=\"bg-red-200 place-self-center\">x</span></div>',\n },\n ],\n noMatch: [\n // Non-grid (flex) parent (document root): `justify-self` is ignored in flex → not provably safe.\n '<div className=\"flex justify-center items-center\"><div className=\"bg-red-200\">Hello</div></div>',\n // Grid parent, but the wrapper drops padding when removed → not layout-neutral (rule 3).\n '<div className=\"grid\">' +\n '<div className=\"p-4 flex items-center justify-center\"><span className=\"bg-red-200\">x</span></div>' +\n '</div>',\n // Grid parent forcing place-items-center: the wrapper would not fill its area → fill guard skips.\n '<div className=\"grid place-items-center\">' +\n '<div className=\"flex items-center justify-center\"><span className=\"bg-red-200\">x</span></div>' +\n '</div>',\n // onClick is a hard opacity barrier → the wrapper is load-bearing regardless of the gate.\n '<div className=\"flex justify-center items-center\" onClick={handleClick}>' +\n '<div className=\"bg-red-200\">Hello</div>' +\n '</div>',\n ],\n },\n});\n","/**\n * @domflax/patterns — flatten pattern: `inline-flex-center-wrapper`.\n *\n * Collapses the inline-flex flavour of the \"centering wrapper\" idiom\n *\n * <div style=\"display:inline-flex; align-items:center; justify-content:center\"><Child/></div>\n *\n * into its sole child, pushing the centering intent down onto the child as `place-self: center`.\n * Like its block-level `flex-center-wrapper` sibling the wrapper only exists to center one element;\n * once `place-self:center` lives on the child the wrapper is pure structural noise and can go.\n *\n * Authored with the declarative {@link definePattern} API: the match is the inline-flex-centering\n * computed-style signature on a single-element-child `<div>` that paints nothing of its own; the\n * recipe folds inheritable styles onto the child, grants it `place-self:center`, then unwraps the\n * wrapper (id-preserving). The opacity-barrier + selector-safety guards are applied automatically by\n * the `definePattern` factory for every `flatten/*` pattern.\n */\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/**\n * Flatten an inline-flex-centering `<div>` wrapper into its sole element child, granting the child\n * `place-self:center`.\n */\nexport const inlineFlexCenterWrapper = definePattern({\n name: 'inline-flex-center-wrapper',\n category: 'flatten/inline-flex-center-wrapper',\n safety: 2,\n doc: {\n title: 'Flatten inline-flex-centering wrapper',\n summary:\n 'A div that only centers a single child (display:inline-flex; align-items:center; ' +\n 'justify-content:center) is removed; the child gains place-self:center.',\n before:\n '<div style=\"display:inline-flex;align-items:center;justify-content:center\"><Child/></div>',\n after: '<Child style=\"place-self:center\"/>',\n safetyRationale:\n 'Wrapper paints nothing, carries no ref/handlers/dynamic children, and is not a combinator ' +\n 'subject; inheritable styles are folded onto the child before removal.',\n },\n match: {\n tag: 'div',\n style: { display: 'inline-flex', alignItems: 'center', justifyContent: 'center' },\n onlyChild: 'element',\n paintsNothing: true,\n },\n rewrite: {\n flattenInto: 'child',\n childGains: { placeSelf: 'center' },\n },\n // Like its block-level sibling, this centering flatten is `needs-verification` (the wrapper's own\n // `display:inline-flex` establishes a formatting context, and place-self centering only holds under\n // a flex/grid parent), so the conservative production gate (`'provably-safe'`) REVERTS it — every\n // case here is a no-match. Op-level correctness is covered by the invariant suite.\n test: {\n noMatch: [\n // Even under a static flex/grid parent the centering flatten is not provably layout-neutral.\n '<div className=\"grid\">' +\n '<div className=\"inline-flex items-center justify-center\"><span className=\"bg-red-200\">x</span></div>' +\n '</div>',\n // Non-flex/grid parent (document root) → left unchanged.\n '<div className=\"inline-flex justify-center items-center\"><div className=\"bg-red-200\">Hello</div></div>',\n // onClick is a hard opacity barrier → the wrapper is load-bearing regardless of the gate.\n '<div className=\"inline-flex justify-center items-center\" onClick={handleClick}>' +\n '<div className=\"bg-red-200\">Hello</div>' +\n '</div>',\n ],\n },\n});\n","/**\n * @domflax/patterns — flatten pattern: `nested-flex-merge`.\n *\n * Collapses a redundant nesting of two flex containers\n *\n * <div style=\"display:flex; align-items:center; gap:8px\">\n * <div style=\"display:flex; flex-direction:column\"> … </div>\n * </div>\n *\n * where the OUTER flex container's sole element child is ITSELF a flex container, into a single\n * flex container that carries the union of both elements' flex declarations. The outer wrapper's\n * box is then structural noise (it paints nothing and only establishes a flex context that the\n * merged child now also establishes), so it is removed.\n *\n * Authored with the declarative {@link pattern} API: the match is a flex `<div>` with a single\n * element child painting nothing of its own (auto-guarded against opacity barriers / combinator\n * targeting like every `flatten/*` pattern). The value-relational reasoning — the child must also\n * be a (non-combinator) flex container, the wrapper must carry only transferable flex/inheritable\n * declarations, and the two must not conflict on any shared flex property — lives in the `rewrite`\n * op-draft factory escape hatch, which folds inherited styles, transfers the wrapper's flex\n * declarations onto the child (target-wins), then unwraps the wrapper.\n */\n\nimport type {\n ConditionKey,\n CssProperty,\n MatchContext,\n NodeLike,\n RewriteFactory,\n RewriteOpDraft,\n StyleBlock,\n StyleDecl,\n StyleMap,\n} from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport {\n and,\n computed,\n definePattern,\n isElement,\n normalizer,\n not,\n targetedByCombinator,\n type Matcher,\n} from '@domflax/pattern-kit';\n\n/* ───────────────────────── style fixtures ───────────────────────── */\n\n/** Build a single-(base-)condition StyleMap from raw `[property, value]` pairs via the shared normalizer. */\nfunction baseConditionStyleMap(decls: readonly (readonly [string, string])[]): StyleMap {\n const map = new Map<CssProperty, StyleDecl>();\n for (const [prop, value] of decls) {\n for (const decl of normalizer.normalizeDeclaration(prop, value, false)) {\n map.set(decl.property, decl);\n }\n }\n const block: StyleBlock = { condition: BASE_CONDITION, decls: map };\n const blocks = new Map<ConditionKey, StyleBlock>([[conditionKey(BASE_CONDITION), block]]);\n return { blocks };\n}\n\n/** Both containers must declare `display:flex` (the matched signature). */\nconst DISPLAY_FLEX: StyleMap = baseConditionStyleMap([['display', 'flex']]);\n\n/**\n * The flex-CONTAINER property set this pattern is allowed to transfer from the wrapper onto the\n * child. (Longhands only, since the shared normalizer expands `gap` → `row-gap`/`column-gap`.)\n */\nconst FLEX_CONTAINER_PROPERTIES: ReadonlySet<string> = new Set<string>([\n 'display',\n 'flex-direction',\n 'flex-wrap',\n 'justify-content',\n 'align-items',\n 'align-content',\n 'place-content',\n 'place-items',\n 'row-gap',\n 'column-gap',\n]);\n\n/* ───────────────────────── style reasoning helpers (pure) ───────────────────────── */\n\n/**\n * True iff every declaration on the wrapper is either a transferable flex-container property or an\n * inheritable property (which we fold onto the child). If the wrapper carries anything else\n * (padding/margin/sizing/position/…), removing its box would change layout, so the merge is unsafe.\n */\nfunction outerMergeSafe(sm: StyleMap): boolean {\n const norm = normalizer.normalizeStyleMap(sm);\n for (const block of norm.blocks.values()) {\n for (const decl of block.decls.values()) {\n if (FLEX_CONTAINER_PROPERTIES.has(String(decl.property))) continue;\n if (decl.inherited) continue;\n return false;\n }\n }\n return true;\n}\n\n/**\n * True iff the two containers disagree on any shared flex-container property (in any matching\n * condition) — e.g. `flex-direction:row` vs `flex-direction:column`. Such a conflict makes the\n * merge ambiguous, so the pattern skips.\n */\nfunction flexConflict(outer: StyleMap, inner: StyleMap): boolean {\n const a = normalizer.normalizeStyleMap(outer);\n const b = normalizer.normalizeStyleMap(inner);\n for (const [key, blockA] of a.blocks) {\n const blockB = b.blocks.get(key);\n if (!blockB) continue;\n for (const [prop, declA] of blockA.decls) {\n if (!FLEX_CONTAINER_PROPERTIES.has(String(prop))) continue;\n const declB = blockB.decls.get(prop);\n if (declB && declB.value !== declA.value) return true;\n }\n }\n return false;\n}\n\n/** Project the wrapper's transferable flex-container declarations into a fresh StyleMap. */\nfunction extractFlexStyle(sm: StyleMap): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n if (FLEX_CONTAINER_PROPERTIES.has(String(prop))) decls.set(prop, decl);\n }\n if (decls.size > 0) blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/** The inner (surviving) flex container: also a flex `<div>`, and not a combinator subject (it is reparented). */\nconst isInnerFlex: Matcher = and(\n isElement('div'),\n computed(DISPLAY_FLEX),\n not(targetedByCombinator),\n);\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/**\n * Flatten a flex container whose sole child is a compatible flex container into a single container.\n */\nexport const nestedFlexMerge = definePattern({\n name: 'nested-flex-merge',\n category: 'flatten/nested-flex-merge',\n safety: 2,\n doc: {\n title: 'Merge nested flex containers',\n summary:\n 'A flex container whose only child is itself a flex container with non-conflicting flex ' +\n 'properties is collapsed into one; the wrapper is removed and its flex declarations merge ' +\n 'onto the surviving child.',\n before:\n '<div style=\"display:flex;align-items:center;gap:8px\">' +\n '<div style=\"display:flex;flex-direction:column\"/></div>',\n after: '<div style=\"display:flex;flex-direction:column;align-items:center;gap:8px\"/>',\n safetyRationale:\n 'The wrapper paints nothing, declares only flex-container/inheritable properties, carries no ' +\n 'ref/handlers/dynamic children, and is not a combinator subject; the two containers do not ' +\n 'conflict on any flex property, so the union is unambiguous and lossless.',\n },\n match: {\n tag: 'div',\n style: { display: 'flex' },\n onlyChild: 'element',\n paintsNothing: true,\n },\n rewrite: (ctx: MatchContext, rw: RewriteFactory): readonly RewriteOpDraft[] | null => {\n const outer = ctx.node;\n const inner = ctx.onlyElementChild();\n if (!inner) return null;\n if (!isInnerFlex(inner as unknown as NodeLike, ctx)) return null;\n\n const outerStyle = ctx.computed();\n const innerStyle = ctx.computedOf(inner as unknown as NodeLike);\n\n // The wrapper must carry nothing that would be lost when its box is removed …\n if (!outerMergeSafe(outerStyle)) return null;\n // … and the two containers must agree on every shared flex property.\n if (flexConflict(outerStyle, innerStyle)) return null;\n\n return [\n // 1. Preserve inheritable values (color/font/…) by folding them onto the child first.\n rw.foldInheritedStyles(outer, inner, { conditions: 'all' }),\n // 2. Transfer the wrapper's flex-container declarations onto the child (target-wins keeps the\n // child's value for any shared property — identical anyway, we proved non-conflict).\n rw.mergeStyle(inner, null, extractFlexStyle(outerStyle), 'target-wins'),\n // 3. Remove the wrapper (structural-safe; hoists the child and preserves its IRNodeId).\n rw.unwrap(outer),\n ];\n },\n // Merging the outer flex container into the inner removes the outer's box, but a `display:flex`\n // wrapper establishes a formatting context, so this is a `needs-verification` flatten that the\n // conservative production gate (`'provably-safe'`) REVERTS — every case here is a no-match. The\n // merge's op-level correctness (purity, id-preserving unwrap, opacity-barrier safety) is asserted\n // by the invariant suite over every pattern.\n test: {\n noMatch: [\n // The merge is real but not provably layout-neutral (the wrapper establishes a flex context),\n // so under the conservative gate the nested containers are left in place.\n '<div className=\"flex items-center gap-2\" data-x=\"1\"><div className=\"flex flex-col\">X</div></div>',\n // A non-flex wrapper does not match the flex-container signature → left unchanged anyway.\n '<div className=\"block bg-blue-500\"><div className=\"flex flex-col\">X</div></div>',\n ],\n },\n});\n","/**\n * @domflax/patterns — flatten pattern: `nested-grid-merge`.\n *\n * Collapses a redundant nesting of two grid containers\n *\n * <div style=\"display:grid; gap:8px\">\n * <div style=\"display:grid; grid-template-columns:1fr 1fr\"> … </div>\n * </div>\n *\n * where the OUTER grid container's sole element child is ITSELF a grid container, into a single grid\n * container carrying the union of both elements' grid declarations. The outer wrapper's box is then\n * structural noise (it paints nothing and only establishes a grid context the merged child now also\n * establishes), so it is removed.\n *\n * This is the grid analogue of `nested-flex-merge`. The declarative match is a grid `<div>` with a\n * single element child painting nothing of its own (auto-guarded against opacity barriers / combinator\n * targeting like every `flatten/*` pattern). The value-relational reasoning — the child must also be a\n * (non-combinator) grid container, the wrapper must carry only transferable grid/inheritable\n * declarations, and the two must not conflict on any shared grid property — lives in the `rewrite`\n * op-draft factory escape hatch, which folds inherited styles, transfers the wrapper's grid\n * declarations onto the child (target-wins), then unwraps the wrapper.\n */\n\nimport type {\n ConditionKey,\n CssProperty,\n MatchContext,\n NodeLike,\n RewriteFactory,\n RewriteOpDraft,\n StyleBlock,\n StyleDecl,\n StyleMap,\n} from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport {\n and,\n computed,\n definePattern,\n isElement,\n normalizer,\n not,\n targetedByCombinator,\n type Matcher,\n} from '@domflax/pattern-kit';\n\n/* ───────────────────────── style fixtures ───────────────────────── */\n\n/** Build a single-(base-)condition StyleMap from raw `[property, value]` pairs via the shared normalizer. */\nfunction baseConditionStyleMap(decls: readonly (readonly [string, string])[]): StyleMap {\n const map = new Map<CssProperty, StyleDecl>();\n for (const [prop, value] of decls) {\n for (const decl of normalizer.normalizeDeclaration(prop, value, false)) {\n map.set(decl.property, decl);\n }\n }\n const block: StyleBlock = { condition: BASE_CONDITION, decls: map };\n const blocks = new Map<ConditionKey, StyleBlock>([[conditionKey(BASE_CONDITION), block]]);\n return { blocks };\n}\n\n/** Both containers must declare `display:grid` (the matched signature). */\nconst DISPLAY_GRID: StyleMap = baseConditionStyleMap([['display', 'grid']]);\n\n/**\n * The grid-CONTAINER property set this pattern is allowed to transfer from the wrapper onto the child.\n * (Longhands only, since the shared normalizer expands `gap` → `row-gap`/`column-gap`.)\n */\nconst GRID_CONTAINER_PROPERTIES: ReadonlySet<string> = new Set<string>([\n 'display',\n 'grid-template-columns',\n 'grid-template-rows',\n 'grid-template-areas',\n 'grid-auto-columns',\n 'grid-auto-rows',\n 'grid-auto-flow',\n 'justify-content',\n 'align-content',\n 'place-content',\n 'justify-items',\n 'align-items',\n 'place-items',\n 'row-gap',\n 'column-gap',\n]);\n\n/* ───────────────────────── style reasoning helpers (pure) ───────────────────────── */\n\n/**\n * True iff every declaration on the wrapper is either a transferable grid-container property or an\n * inheritable property (which we fold onto the child). If the wrapper carries anything else\n * (padding/margin/sizing/position/…), removing its box would change layout, so the merge is unsafe.\n */\nfunction outerMergeSafe(sm: StyleMap): boolean {\n const norm = normalizer.normalizeStyleMap(sm);\n for (const block of norm.blocks.values()) {\n for (const decl of block.decls.values()) {\n if (GRID_CONTAINER_PROPERTIES.has(String(decl.property))) continue;\n if (decl.inherited) continue;\n return false;\n }\n }\n return true;\n}\n\n/**\n * True iff the two containers disagree on any shared grid-container property (in any matching\n * condition) — e.g. `grid-template-columns:1fr` vs `1fr 1fr`. Such a conflict makes the merge\n * ambiguous, so the pattern skips.\n */\nfunction gridConflict(outer: StyleMap, inner: StyleMap): boolean {\n const a = normalizer.normalizeStyleMap(outer);\n const b = normalizer.normalizeStyleMap(inner);\n for (const [key, blockA] of a.blocks) {\n const blockB = b.blocks.get(key);\n if (!blockB) continue;\n for (const [prop, declA] of blockA.decls) {\n if (!GRID_CONTAINER_PROPERTIES.has(String(prop))) continue;\n const declB = blockB.decls.get(prop);\n if (declB && declB.value !== declA.value) return true;\n }\n }\n return false;\n}\n\n/** Project the wrapper's transferable grid-container declarations into a fresh StyleMap. */\nfunction extractGridStyle(sm: StyleMap): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n if (GRID_CONTAINER_PROPERTIES.has(String(prop))) decls.set(prop, decl);\n }\n if (decls.size > 0) blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/** The inner (surviving) grid container: also a grid `<div>`, and not a combinator subject (it is reparented). */\nconst isInnerGrid: Matcher = and(\n isElement('div'),\n computed(DISPLAY_GRID),\n not(targetedByCombinator),\n);\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/**\n * Flatten a grid container whose sole child is a compatible grid container into a single container.\n */\nexport const nestedGridMerge = definePattern({\n name: 'nested-grid-merge',\n category: 'flatten/nested-grid-merge',\n safety: 2,\n doc: {\n title: 'Merge nested grid containers',\n summary:\n 'A grid container whose only child is itself a grid container with non-conflicting grid ' +\n 'properties is collapsed into one; the wrapper is removed and its grid declarations merge ' +\n 'onto the surviving child.',\n before:\n '<div style=\"display:grid;gap:8px\">' +\n '<div style=\"display:grid;grid-template-columns:1fr 1fr\"/></div>',\n after: '<div style=\"display:grid;grid-template-columns:1fr 1fr;gap:8px\"/>',\n safetyRationale:\n 'The wrapper paints nothing, declares only grid-container/inheritable properties, carries no ' +\n 'ref/handlers/dynamic children, and is not a combinator subject; the two containers do not ' +\n 'conflict on any grid property, so the union is unambiguous and lossless.',\n },\n match: {\n tag: 'div',\n style: { display: 'grid' },\n onlyChild: 'element',\n paintsNothing: true,\n },\n rewrite: (ctx: MatchContext, rw: RewriteFactory): readonly RewriteOpDraft[] | null => {\n const outer = ctx.node;\n const inner = ctx.onlyElementChild();\n if (!inner) return null;\n if (!isInnerGrid(inner as unknown as NodeLike, ctx)) return null;\n\n const outerStyle = ctx.computed();\n const innerStyle = ctx.computedOf(inner as unknown as NodeLike);\n\n // The wrapper must carry nothing that would be lost when its box is removed …\n if (!outerMergeSafe(outerStyle)) return null;\n // … and the two containers must agree on every shared grid property.\n if (gridConflict(outerStyle, innerStyle)) return null;\n\n return [\n // 1. Preserve inheritable values (color/font/…) by folding them onto the child first.\n rw.foldInheritedStyles(outer, inner, { conditions: 'all' }),\n // 2. Transfer the wrapper's grid-container declarations onto the child (target-wins keeps the\n // child's value for any shared property — identical anyway, we proved non-conflict).\n rw.mergeStyle(inner, null, extractGridStyle(outerStyle), 'target-wins'),\n // 3. Remove the wrapper (structural-safe; hoists the child and preserves its IRNodeId).\n rw.unwrap(outer),\n ];\n },\n // Like its flex sibling, this merge removes the outer container's box, but a `display:grid` wrapper\n // establishes a formatting context, so it is a `needs-verification` flatten that the conservative\n // production gate (`'provably-safe'`) REVERTS — every case here is a no-match. Op-level correctness\n // is asserted by the invariant suite over every pattern.\n test: {\n noMatch: [\n // The merge is real but not provably layout-neutral (the wrapper establishes a grid context),\n // so under the conservative gate the nested containers are left in place.\n '<div className=\"grid gap-2\" data-x=\"1\"><div className=\"grid grid-cols-2\">X</div></div>',\n // A non-grid wrapper does not match the grid-container signature → left unchanged anyway.\n '<div className=\"block bg-blue-500\"><div className=\"grid grid-cols-2\">X</div></div>',\n ],\n },\n});\n","/**\n * @domflax/patterns — flatten pattern: `passthrough-wrapper`.\n *\n * Collapses a purely-structural wrapper that exists for no reason at all:\n *\n * <div><Child/></div>\n *\n * The wrapper paints nothing, establishes no box / formatting / stacking context, carries no\n * attributes beyond an (optional) inert class, holds exactly one element child, and is free of every\n * opacity barrier (ref / event-handlers / dynamic children / dangerous html / spread / component).\n * Such a `<div>` is pure DOM noise: removing it and hoisting the child is invisible to both paint\n * and layout.\n *\n * Authored with the declarative {@link definePattern} API. The opacity-barrier + selector-safety\n * guards (ref/handlers/dynamic-children/raw-html/combinator/reparent-impact) are applied\n * automatically for every `flatten/*` pattern; the `where` predicates add the passthrough-specific\n * requirements (no box/formatting/stacking context, no own attrs, no dynamic/spread classes, not a\n * component, not a structural-pseudo subject).\n */\n\nimport type {\n DeepReadonly,\n IRElement,\n IRNode,\n IRNodeId,\n NodeLike,\n NodeMeta,\n} from '@domflax/core';\n\nimport { definePattern, hasDynamicClasses, not, type Matcher } from '@domflax/pattern-kit';\n\n/* ───────────────────────── local meta/attr/selector matchers ───────────────────────── */\n\nfunction metaOf(node: NodeLike): DeepReadonly<NodeMeta> | null {\n const n = node as DeepReadonly<IRNode>;\n return n.kind === 'element' ? (n as DeepReadonly<IRElement>).meta : null;\n}\n\nfunction elementOf(node: NodeLike): DeepReadonly<IRElement> | null {\n const n = node as DeepReadonly<IRNode>;\n return n.kind === 'element' ? (n as DeepReadonly<IRElement>) : null;\n}\n\n/**\n * Element establishes some box / formatting / stacking context, is a containing block, or exposes\n * custom properties to a descendant — any of which means removing its box could shift layout or\n * break a `var()` coupling, so it is NOT a passthrough.\n */\nconst establishesContext: Matcher = (node) => {\n const m = metaOf(node);\n if (!m) return false;\n return (\n m.establishesBox ||\n m.establishesFormattingContext ||\n m.establishesStackingContext ||\n m.isContainingBlock ||\n m.declaresCustomProperties\n );\n};\n\n/** Hard opacity barriers beyond the auto-applied set: spread attrs, component identity. */\nconst hasSpreadAttrs: Matcher = (node) => metaOf(node)?.hasSpreadAttrs ?? false;\nconst isComponentNode: Matcher = (node) => metaOf(node)?.isComponent ?? false;\n\n/** Element carries own attributes (id / data-* / …) beyond its class list — possible selector/JS hook. */\nconst hasOwnAttrs: Matcher = (node) => {\n const el = elementOf(node);\n if (!el) return false;\n return el.attrs.entries.size > 0 || el.attrs.spreads.length > 0;\n};\n\n/**\n * Element is the subject of a structural pseudo (`:first/:last/:only/:nth-*`). Honours the meta flag\n * and the precomputed {@link SelectorIndex}.\n */\nconst targetedByStructuralPseudo: Matcher = (node, ctx) => {\n const el = elementOf(node);\n if (!el) return false;\n if (el.meta.targetedByStructuralPseudo) return true;\n return ctx.selectors.targetedByStructuralPseudo(el.id as unknown as IRNodeId);\n};\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/**\n * Flatten a do-nothing `<div>` wrapper into its sole element child, folding any inheritable styles\n * down first so inherited values survive the box removal.\n */\nexport const passthroughWrapper = definePattern({\n name: 'passthrough-wrapper',\n category: 'flatten/passthrough-wrapper',\n safety: 2,\n doc: {\n title: 'Flatten passthrough wrapper',\n summary:\n 'A div with no own visual/box style, no attributes beyond an inert class, exactly one ' +\n 'element child, and no opacity barriers is removed; its sole child is hoisted in its place.',\n before: '<div><Child/></div>',\n after: '<Child/>',\n safetyRationale:\n 'Wrapper paints nothing and establishes no layout/paint/var context, carries no ' +\n 'ref/handlers/dynamic-children/html/spread/component identity, owns no targetable attrs, ' +\n 'and is not a combinator/structural-pseudo subject (reparenting changes no match-set); ' +\n 'inheritable styles are folded onto the child before removal.',\n },\n match: {\n tag: 'div',\n onlyChild: 'element',\n paintsNothing: true,\n where: [\n not(establishesContext),\n not(hasOwnAttrs),\n not(hasDynamicClasses),\n not(hasSpreadAttrs),\n not(isComponentNode),\n not(targetedByStructuralPseudo),\n ],\n },\n rewrite: { flattenInto: 'child' },\n test: {\n cases: [\n {\n // A plain, style-free wrapper paints nothing and establishes no context → a provably-safe\n // flatten under the conservative gate: the wrapper is removed and its sole child hoisted.\n before: '<div><a className=\"bg-red-200\">Link</a></div>',\n after: '<a className=\"bg-red-200\">Link</a>',\n },\n ],\n noMatch: [\n // A ref pins the wrapper's element identity (a hard opacity barrier) → not a passthrough.\n '<div ref={rootRef}><a className=\"bg-red-200\">Link</a></div>',\n // A `display:flex` wrapper establishes a formatting context, so removing its box is NOT\n // provably layout-neutral → the conservative gate leaves it in place.\n '<div className=\"flex\"><a className=\"bg-red-200\">Link</a></div>',\n ],\n },\n});\n","/**\n * @domflax/patterns — flatten pattern: `redundant-fragment`.\n *\n * Collapses a fragment that wraps exactly one child\n *\n * <><Child/></> → <Child/>\n *\n * A fragment renders no box of its own, so a fragment whose sole purpose is to wrap a single node\n * is pure structural noise: splicing the child up into the fragment's slot is invisible in both\n * the rendered DOM and the project's CSS cascade.\n *\n * Anchoring: the pass manager only visits ELEMENT nodes (see core's `elementIds`), never fragments,\n * so this pattern is anchored on the fragment's sole *element* child and removes the PARENT fragment.\n * Because the match is PARENT-anchored (and reads a fragment's `meta`, which the element-only\n * combinator vocabulary cannot inspect), it uses the declarative API's two escape hatches: a raw\n * `match` predicate and a raw `rewrite` op-draft factory.\n */\n\nimport type {\n DeepReadonly,\n ElementLike,\n IRNode,\n IRNodeId,\n MatchContext,\n NodeLike,\n RewriteFactory,\n RewriteOpDraft,\n} from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── match predicate (escape hatch) ───────────────────────── */\n\n/**\n * Matches an element whose PARENT is a redundant, unwrappable fragment: a non-root fragment with\n * exactly one child (this element), free of every opacity barrier and CSS-targeting coupling.\n */\nfunction parentIsRedundantFragment(node: NodeLike, ctx: MatchContext): boolean {\n const el = node as DeepReadonly<IRNode>;\n if (el.kind !== 'element') return false;\n\n const parentId = el.parent;\n if (parentId == null) return false;\n\n const parent = ctx.doc.nodes.get(parentId);\n if (!parent || parent.kind !== 'fragment') return false;\n\n // Never unwrap the document root (it must always be a fragment — IRDocument invariant).\n if (parent.parent == null) return false;\n\n // Exactly one child (counting EVERY kind) ⇒ the anchor element is the fragment's sole child.\n if (parent.children.length !== 1) return false;\n\n // Hard opacity barriers on the fragment: keyed `<Fragment key>`, ref/handlers/dynamic children/\n // dangerous HTML/spread/component identity. Any of these means the fragment is load-bearing.\n const m = parent.meta;\n if (\n m.hasKey ||\n m.hasRef ||\n m.hasEventHandlers ||\n m.hasDynamicChildren ||\n m.hasDangerousHtml ||\n m.hasSpreadAttrs ||\n m.isComponent\n ) {\n return false;\n }\n\n // CSS-selector safety: the fragment (or its reparented child) must not move any combinator /\n // structural-pseudo match-set. Honour both the frontend-set meta flags and the SelectorIndex.\n if (m.targetedByCombinator || m.targetedByStructuralPseudo) return false;\n const fid = parentId as unknown as IRNodeId;\n if (ctx.selectors.targetedByCombinator(fid) || ctx.selectors.targetedByStructuralPseudo(fid)) {\n return false;\n }\n if (ctx.selectors.reparentImpact(fid).size > 0) return false;\n\n return true;\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/**\n * Flatten a fragment that wraps exactly one child into that child.\n *\n * Safety level 1 (`safe`): a purely structural, style-free, selector-transparent cleanup.\n */\nexport const redundantFragment = definePattern({\n name: 'redundant-fragment',\n category: 'flatten/redundant-fragment',\n safety: 1,\n doc: {\n title: 'Flatten redundant single-child fragment',\n summary:\n 'A fragment whose only child is a single node is removed; the child is spliced up into the ' +\n \"fragment's slot, preserving its IRNodeId, siblings, attributes and the CSS cascade.\",\n before: '<><Child/></>',\n after: '<Child/>',\n safetyRationale:\n 'A fragment paints nothing and renders no box; with exactly one child its removal changes ' +\n 'no sibling/structural-pseudo match-set. Keyed fragments and fragments carrying ' +\n 'ref/handlers/dynamic-children/raw-html/spread are excluded as opacity barriers.',\n },\n match: parentIsRedundantFragment,\n rewrite: (ctx: MatchContext, rw: RewriteFactory): readonly RewriteOpDraft[] | null => {\n const parentId = ctx.node.parent;\n if (parentId == null) return null;\n const fragment = ctx.doc.nodes.get(parentId);\n if (!fragment || fragment.kind !== 'fragment') return null;\n // Splice the sole child up into the fragment's slot, deleting ONLY the fragment node.\n return [rw.unwrap(fragment as unknown as ElementLike)];\n },\n test: {\n cases: [\n {\n // A fragment renders no box, so unwrapping a single-child fragment is always layout-identical\n // → a provably-safe flatten: the child is spliced up into the fragment's slot.\n before: '<><span className=\"bg-red-200\">Hi</span></>',\n after: '<span className=\"bg-red-200\">Hi</span>',\n },\n ],\n noMatch: [\n // Two children ⇒ not a single-child fragment, so the fragment is load-bearing and stays.\n '<><span className=\"bg-red-200\">A</span><span className=\"bg-green-200\">B</span></>',\n ],\n },\n});\n","/**\n * @domflax/patterns — flatten pattern: `redundant-inline-wrapper`.\n *\n * Collapses a purely-structural INLINE wrapper:\n *\n * <span><Child/></span> (display:inline, no own style)\n *\n * An inline `<span>` that paints nothing, establishes no box / formatting / stacking context, carries\n * no attributes beyond an (optional) inert class, declares no custom properties, and holds exactly one\n * element child is pure inline noise. An empty inline box merely wraps its child's box; removing it and\n * hoisting the child leaves both paint and layout untouched (the surviving child folds the inheritable\n * declarations the span carried).\n *\n * This is the inline sibling of `passthrough-wrapper` (which targets `<div>`): the same opacity-barrier\n * + selector-safety guards are auto-applied by the `pattern()` factory for every `flatten/*` pattern;\n * the `where` predicates add the inline-passthrough requirements (display must be the inline default,\n * no box/formatting/stacking context or var coupling, no own attrs / dynamic-or-spread classes, not a\n * component, not a structural-pseudo subject).\n */\n\nimport type {\n CssProperty,\n DeepReadonly,\n IRElement,\n IRNode,\n IRNodeId,\n NodeLike,\n NodeMeta,\n StyleMap,\n} from '@domflax/core';\n\nimport { definePattern, hasDynamicClasses, not, type Matcher } from '@domflax/pattern-kit';\n\n/* ───────────────────────── local meta/attr/selector matchers ───────────────────────── */\n\nfunction asEl(node: NodeLike): DeepReadonly<IRElement> | null {\n const n = node as DeepReadonly<IRNode>;\n return n.kind === 'element' ? (n as DeepReadonly<IRElement>) : null;\n}\n\nfunction metaOf(node: NodeLike): DeepReadonly<NodeMeta> | null {\n return asEl(node)?.meta ?? null;\n}\n\n/**\n * Element establishes some box / formatting / stacking context, is a containing block, or exposes\n * custom properties to a descendant — removing its box could shift layout or sever a `var()` coupling,\n * so it is NOT an inline passthrough.\n */\nconst establishesContext: Matcher = (node) => {\n const m = metaOf(node);\n if (!m) return false;\n return (\n m.establishesBox ||\n m.establishesFormattingContext ||\n m.establishesStackingContext ||\n m.isContainingBlock ||\n m.declaresCustomProperties\n );\n};\n\n/** Hard opacity barriers beyond the auto-applied set: spread attrs, component identity. */\nconst hasSpreadAttrs: Matcher = (node) => metaOf(node)?.hasSpreadAttrs ?? false;\nconst isComponentNode: Matcher = (node) => metaOf(node)?.isComponent ?? false;\n\n/** Element carries own attributes (id / data-* / …) beyond its class list — possible selector/JS hook. */\nconst hasOwnAttrs: Matcher = (node) => {\n const el = asEl(node);\n if (!el) return false;\n return el.attrs.entries.size > 0 || el.attrs.spreads.length > 0;\n};\n\n/**\n * Element is the subject of a structural pseudo (`:first/:last/:only/:nth-*`). Honours the meta flag\n * and the precomputed {@link SelectorIndex}.\n */\nconst targetedByStructuralPseudo: Matcher = (node, ctx) => {\n const el = asEl(node);\n if (!el) return false;\n if (el.meta.targetedByStructuralPseudo) return true;\n return ctx.selectors.targetedByStructuralPseudo(el.id as unknown as IRNodeId);\n};\n\nconst DISPLAY = 'display' as CssProperty;\n\n/**\n * Element sets `display` to anything other than the inline default in ANY condition. An\n * inline-block / block / flex / grid / contents span is NOT an inline passthrough — its box (or lack\n * of one) participates in layout differently from a bare inline box.\n */\nconst hasNonInlineDisplay: Matcher = (node, ctx) => {\n const el = asEl(node);\n if (!el) return false;\n const sm: StyleMap = ctx.computedOf(el as unknown as NodeLike) ?? (el.computed as StyleMap);\n for (const block of sm.blocks.values()) {\n const decl = block.decls.get(DISPLAY);\n if (decl && String(decl.value) !== 'inline') return true;\n }\n return false;\n};\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/**\n * Flatten a do-nothing inline `<span>` wrapper into its sole element child, folding any inheritable\n * styles down first so inherited values survive the box removal.\n */\nexport const redundantInlineWrapper = definePattern({\n name: 'redundant-inline-wrapper',\n category: 'flatten/redundant-inline-wrapper',\n safety: 2,\n doc: {\n title: 'Flatten redundant inline wrapper',\n summary:\n 'An inline span with no own visual/box style, no attributes beyond an inert class, exactly ' +\n 'one element child, and no opacity barriers is removed; its sole child is hoisted in its place.',\n before: '<span><Child/></span>',\n after: '<Child/>',\n safetyRationale:\n 'An empty inline box paints nothing and establishes no layout/paint/var context; with the ' +\n 'inline default display and a single element child its removal changes no paint and no flow. ' +\n 'The span carries no ref/handlers/dynamic-children/html/spread/component identity, owns no ' +\n 'targetable attrs, and is not a combinator/structural-pseudo subject; inheritable styles are ' +\n 'folded onto the child before removal.',\n },\n match: {\n tag: 'span',\n onlyChild: 'element',\n paintsNothing: true,\n where: [\n not(hasNonInlineDisplay),\n not(establishesContext),\n not(hasOwnAttrs),\n not(hasDynamicClasses),\n not(hasSpreadAttrs),\n not(isComponentNode),\n not(targetedByStructuralPseudo),\n ],\n },\n rewrite: { flattenInto: 'child' },\n test: {\n cases: [\n {\n // An empty inline span paints nothing and establishes no context → a provably-safe flatten:\n // the span is removed and its sole child hoisted in place.\n before: '<span><a className=\"text-blue-500\">Link</a></span>',\n after: '<a className=\"text-blue-500\">Link</a>',\n },\n ],\n noMatch: [\n // A ref pins the span's element identity (a hard opacity barrier) → not a passthrough.\n '<span ref={spanRef}><a className=\"text-blue-500\">Link</a></span>',\n // The span paints its own background (own visual style) → kept.\n '<span className=\"bg-green-200\"><a className=\"text-blue-500\">Link</a></span>',\n // Non-inline display (inline-block) participates in layout differently → kept.\n '<span className=\"inline-block\"><a className=\"text-blue-500\">Link</a></span>',\n ],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `border-radius-shorthand`.\n *\n * Collapses an element whose four corner radii are expressed as separate longhand declarations and\n * are ALL EQUAL into the single CSS `border-radius` shorthand:\n *\n * border-top-left-radius:0.5rem; border-top-right-radius:0.5rem;\n * border-bottom-right-radius:0.5rem; border-bottom-left-radius:0.5rem\n * ⇒ border-radius:0.5rem (Tailwind `rounded-lg`)\n *\n * The IR's computed StyleMap keeps each corner as its own longhand (Tailwind's `rounded-tl-*` /\n * `rounded-tr-*` / … each resolve to one corner property). This pass runs the collapse in reverse on\n * the computed map ONLY when all four corners share one value — the single case that maps cleanly to\n * a single Tailwind utility (the CSS 2-value `border-radius` form is DIAGONAL, which has no clean\n * `rounded-*` edge utility, so per-corner differences are intentionally left alone). Rebuilding the\n * map with one `border-radius` decl lets the minimizing reverse-emit pick the single `rounded-*`\n * token covering all four corners instead of two edge tokens.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the\n * `rewriteClasses` recipe rebuilds the class StyleMap, declining (`null`) unless the four corners are\n * present, concrete, equal, and share an `!important` flag.\n */\n\nimport type { ConditionKey, CssProperty, CssValue, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── corner analysis ───────────────────────── */\n\n/** The four corner-radius longhands. */\nconst CORNERS = [\n 'border-top-left-radius',\n 'border-top-right-radius',\n 'border-bottom-right-radius',\n 'border-bottom-left-radius',\n] as const satisfies readonly string[];\n\nconst CORNER_SET: ReadonlySet<string> = new Set<string>(CORNERS);\n\nconst BASE_KEY: ConditionKey = conditionKey(BASE_CONDITION);\n\nconst RADIUS = 'border-radius' as CssProperty;\n\n/** CSS-wide keywords for which a corner collapse is pointless or unsound. */\nconst NON_COLLAPSIBLE_VALUES: ReadonlySet<string> = new Set<string>([\n 'initial',\n 'inherit',\n 'unset',\n 'revert',\n 'revert-layer',\n]);\n\n/** The single value all four corners fold into (carrying important / relative-unit flags). */\ninterface RadiusFold {\n readonly value: string;\n readonly important: boolean;\n readonly relative: boolean;\n}\n\n/**\n * Inspect the BASE-condition block of `sm` and, iff all four corner longhands are present, share a\n * uniform `!important` flag, hold a concrete (non-keyword) value, and are ALL EQUAL, return that\n * value. Returns `null` when the corners cannot fold to one `border-radius`.\n */\nfunction analyzeRadius(sm: StyleMap): RadiusFold | null {\n const block = sm.blocks.get(BASE_KEY);\n if (!block) return null;\n\n const corners: StyleDecl[] = [];\n for (const corner of CORNERS) {\n const decl = block.decls.get(corner as CssProperty);\n if (!decl) return null;\n corners.push(decl);\n }\n\n // A shorthand cannot carry per-corner `!important`; only fold a uniform flag.\n const important = corners[0]!.important;\n if (!corners.every((d) => d.important === important)) return null;\n\n const value = String(corners[0]!.value);\n if (NON_COLLAPSIBLE_VALUES.has(value)) return null;\n if (!corners.every((d) => String(d.value) === value)) return null;\n\n const relative = corners.some((d) => d.relativeToParent);\n return { value, important, relative };\n}\n\n/* ───────────────────────── style rebuild ───────────────────────── */\n\n/** Rebuild `sm` with the four BASE-block corner longhands replaced by one `border-radius` decl. */\nfunction withFoldedRadius(sm: StyleMap, fold: RadiusFold): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n if (key !== BASE_KEY) {\n blocks.set(key, block);\n continue;\n }\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n if (CORNER_SET.has(String(prop))) continue; // drop the four corner longhands\n decls.set(prop, decl);\n }\n const shorthand: StyleDecl = {\n property: RADIUS,\n value: fold.value as CssValue,\n important: fold.important,\n relativeToParent: fold.relative,\n inherited: false, // border-radius is never inherited\n };\n decls.set(shorthand.property, shorthand);\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/** Fold four equal corner radii into the single `border-radius` shorthand. */\nexport const borderRadiusShorthand = definePattern({\n name: 'border-radius-shorthand',\n category: 'compress/border-radius-shorthand',\n safety: 1,\n doc: {\n title: 'Collapse equal corner radii into border-radius',\n summary:\n 'An element whose four corner radii (border-*-radius longhands) are all equal is rewritten to ' +\n 'the single Tailwind rounded-* utility (border-radius === the four equal corners).',\n before: '<div class=\"rounded-tl-lg rounded-tr-lg rounded-br-lg rounded-bl-lg\"/>',\n after: '<div class=\"rounded-lg\"/>',\n safetyRationale:\n '`border-radius` is value-identical to four equal corner radii — a class-only change. It is safe ' +\n 'even on an element with a ref, event handler, dynamic child, or dangerouslySetInnerHTML — a ' +\n 'className rewrite touches none of them; only a dynamic/opaque class list or a combinator-subject ' +\n 'class is excluded, so no behaviour or project selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const fold = analyzeRadius(computed);\n return fold ? withFoldedRadius(computed, fold) : null;\n },\n },\n test: {\n cases: [\n {\n // The four equal corner longhands collapse to a `border-radius` decl at the IR level; the\n // minimizing reverse-emit then picks the single shortest utility (`rounded-lg`) that reproduces\n // it, replacing the four `rounded-{tl,tr,br,bl}-lg` tokens. `bg-red-200` is preserved.\n before: '<div className=\"rounded-tl-lg rounded-tr-lg rounded-br-lg rounded-bl-lg bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 rounded-lg\">box</div>',\n },\n ],\n // Corners differ (top corners vs bottom corners) → no all-equal collapse.\n noMatch: ['<div className=\"rounded-t-lg rounded-b-sm bg-red-200\">box</div>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `border-shorthand`.\n *\n * Collapses an element whose four border-side WIDTHS are expressed as separate longhand declarations\n * back into the shortest equivalent `border-width` shorthand:\n *\n * border-top-width:2px; border-right-width:2px; border-bottom-width:2px; border-left-width:2px\n * ⇒ border-width:2px (Tailwind `border-2`)\n *\n * border-top-width:2px; border-bottom-width:2px; border-left-width:4px; border-right-width:4px\n * ⇒ border-width:2px 4px (Tailwind `border-y-2 border-x-4`)\n *\n * Tailwind's per-side / per-axis width utilities (`border-t-*`, `border-x-*`, …) each resolve to the\n * matching `border-*-width` longhand(s); the shared normalizer keeps them longhand. This pass runs\n * the expansion in reverse on the computed map ONLY when the four widths fold cleanly into a 1- or\n * 2-value form — i.e. `top===bottom` AND `left===right`. Rebuilding the map with one `border-width`\n * shorthand lets the minimizing reverse-emit pick the single/paired utility (`border-2`, or\n * `border-x-* border-y-*`) instead of four per-side tokens. Only WIDTH is folded — border style and\n * color are independent longhands the resolver carries separately, so this never disturbs them.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the `rewriteClasses`\n * recipe rebuilds the class StyleMap, declining (`null`) unless the four widths fold cleanly.\n */\n\nimport type { ConditionKey, CssProperty, CssValue, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── border-width analysis ───────────────────────── */\n\n/** The four border-width longhands, in CSS shorthand order: top, right, bottom, left. */\nconst WIDTH_SIDES = [\n 'border-top-width',\n 'border-right-width',\n 'border-bottom-width',\n 'border-left-width',\n] as const satisfies readonly string[];\n\nconst WIDTH_SIDE_SET: ReadonlySet<string> = new Set<string>(WIDTH_SIDES);\n\nconst BASE_KEY: ConditionKey = conditionKey(BASE_CONDITION);\n\nconst BORDER_WIDTH = 'border-width' as CssProperty;\n\n/** The collapsed shorthand the four widths fold into (carrying important / relative-unit flags). */\ninterface WidthFold {\n readonly value: string; // 1-value (`2px`) or 2-value (`2px 4px`) form\n readonly important: boolean;\n readonly relative: boolean;\n}\n\n/**\n * Inspect the BASE-condition block of `sm` and, iff all four border-width longhands are present,\n * share a uniform `!important` flag, and form matching x/y pairs (`top===bottom` AND `left===right`),\n * return the shortest equivalent shorthand value. Returns `null` when the sides cannot fold.\n */\nfunction analyzeWidth(sm: StyleMap): WidthFold | null {\n const block = sm.blocks.get(BASE_KEY);\n if (!block) return null;\n\n const sides: StyleDecl[] = [];\n for (const side of WIDTH_SIDES) {\n const decl = block.decls.get(side as CssProperty);\n if (!decl) return null;\n sides.push(decl);\n }\n const [top, right, bottom, left] = sides as [StyleDecl, StyleDecl, StyleDecl, StyleDecl];\n\n // A shorthand cannot carry per-side `!important`; only fold a uniform flag.\n if (\n !(\n top.important === right.important &&\n right.important === bottom.important &&\n bottom.important === left.important\n )\n ) {\n return null;\n }\n\n const tv = String(top.value);\n const rv = String(right.value);\n const bv = String(bottom.value);\n const lv = String(left.value);\n\n // Only the `border-*` (all equal) and `border-x-* border-y-*` (matching pairs) shapes are in scope.\n if (tv !== bv || lv !== rv) return null;\n\n const value = tv === lv ? tv : `${tv} ${lv}`;\n const relative = sides.some((d) => d.relativeToParent);\n return { value, important: top.important, relative };\n}\n\n/* ───────────────────────── style rebuild ───────────────────────── */\n\n/** Rebuild `sm` with the four BASE-block border-width longhands replaced by one shorthand. */\nfunction withFoldedWidth(sm: StyleMap, fold: WidthFold): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n if (key !== BASE_KEY) {\n blocks.set(key, block);\n continue;\n }\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n if (WIDTH_SIDE_SET.has(String(prop))) continue; // drop the four width longhands\n decls.set(prop, decl);\n }\n const shorthand: StyleDecl = {\n property: BORDER_WIDTH,\n value: fold.value as CssValue,\n important: fold.important,\n relativeToParent: fold.relative,\n inherited: false, // border-width is never inherited\n };\n decls.set(shorthand.property, shorthand);\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/** Compress an element's four equal/paired border-width longhands into the shortest shorthand. */\nexport const borderShorthand = definePattern({\n name: 'border-shorthand',\n category: 'compress/border-shorthand',\n safety: 1,\n doc: {\n title: 'Collapse border-width longhands to shorthand',\n summary:\n 'Equal border width on all four sides (or matching x/y pairs) expressed as separate longhand ' +\n 'declarations is collapsed to the shortest equivalent border-width shorthand (border-* / ' +\n 'border-x-* border-y-*).',\n before: '<div class=\"border-t-2 border-r-2 border-b-2 border-l-2\"/>',\n after: '<div class=\"border-2\"/>',\n safetyRationale:\n 'A value-preserving re-serialization of the same computed border widths (style/color longhands ' +\n 'untouched) — a class-only change. It is safe even on an element with a ref, event handler, dynamic ' +\n 'child, or dangerouslySetInnerHTML — a className rewrite touches none of them; only a ' +\n 'dynamic/opaque class list or a combinator-subject class is excluded, so no behaviour or project ' +\n 'selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const fold = analyzeWidth(computed);\n return fold ? withFoldedWidth(computed, fold) : null;\n },\n },\n test: {\n cases: [\n {\n // The four equal width longhands collapse to a `border-width` shorthand at the IR level, and the\n // minimizing reverse-emit picks the single shortest utility (`border-2`) that reproduces it,\n // replacing the four `border-{t,r,b,l}-2` tokens. `bg-red-200` is preserved.\n before: '<div className=\"border-t-2 border-r-2 border-b-2 border-l-2 bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 border-2\">box</div>',\n },\n ],\n // Asymmetric widths (top != bottom) cannot fold into a shorthand.\n noMatch: ['<div className=\"border-t-2 border-r-4 border-b-8 border-l-4 bg-red-200\">box</div>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `dedupe-classes`.\n *\n * Removes duplicate / fully-overridden class tokens that resolve to the same property where a\n * LATER token wins, leaving the minimal set of tokens with an IDENTICAL computed style. The\n * canonical case:\n *\n * <p class=\"text-sm text-lg\">…</p> → <p class=\"text-lg\">…</p>\n *\n * Both `text-sm` and `text-lg` set `font-size`; resolution already made `text-lg` win, so the\n * computed `font-size` is `text-lg`'s value and `text-sm` contributes NOTHING to the final\n * computed style. The earlier token is pure noise and can be dropped without changing a pixel.\n *\n * How redundancy is detected (purely from the already-resolved, normalized computed StyleMap):\n * • every declaration carries provenance — `origin` (the winning token) and `shadowed`\n * (the tokens it overrode);\n * • a class token is FULLY OVERRIDDEN iff it appears in some declaration's `shadowed` list but\n * is NOT the winning `origin` of any declaration across ANY style condition. Such a token can\n * be deleted with zero effect on the computed style.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the `dropClasses` recipe returns the set of\n * fully-overridden, resolver-droppable tokens to delete (their `shadowed` provenance is pruned\n * automatically before the minimal class StyleMap is re-installed).\n */\n\nimport type { MatchContext, StyleMap } from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── provenance analysis ───────────────────────── */\n\n/** Winners (tokens that win some declaration) and shadowed (tokens overridden somewhere). */\nfunction findRedundantClasses(computed: StyleMap): {\n winners: ReadonlySet<string>;\n shadowed: ReadonlySet<string>;\n} {\n const winners = new Set<string>();\n const shadowed = new Set<string>();\n for (const block of computed.blocks.values()) {\n for (const decl of block.decls.values()) {\n if (decl.origin && decl.origin.kind === 'class') winners.add(decl.origin.className);\n for (const o of decl.shadowed ?? []) {\n if (o.kind === 'class') shadowed.add(o.className);\n }\n }\n }\n return { winners, shadowed };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/**\n * Collapse a class list to the minimal token set that yields an identical computed style, by\n * dropping tokens whose declarations are fully overridden by later tokens.\n */\nexport const dedupeClasses = definePattern({\n name: 'dedupe-classes',\n category: 'compress/dedupe-classes',\n safety: 1,\n doc: {\n title: 'Dedupe fully-overridden class tokens',\n summary:\n 'Drops class tokens whose every declaration is overridden by a later token resolving to the ' +\n 'same property; the surviving token set produces a byte-for-byte identical computed style.',\n before: '<p class=\"text-sm text-lg\" />',\n after: '<p class=\"text-lg\" />',\n safetyRationale:\n 'A fully-overridden token contributes nothing to the computed style in any condition, so removing ' +\n 'it changes no pixels — a class-only change. It is safe even on an element with a ref, event ' +\n 'handler, dynamic child, or dangerouslySetInnerHTML — a className rewrite touches none of them; ' +\n 'only a dynamic/opaque class list or a combinator-subject class is excluded, so no behaviour or ' +\n 'project selector is disturbed.',\n },\n rewrite: {\n dropClasses(computed: StyleMap, ctx: MatchContext): Iterable<string> {\n const { winners, shadowed } = findRedundantClasses(computed);\n const drop = new Set<string>();\n for (const cls of shadowed) {\n // A token that still wins SOME property elsewhere is not redundant — keep it.\n if (winners.has(cls)) continue;\n // Selector-membership safety: only drop a token referenced purely as a plain subject.\n if (!ctx.resolver.selectorUsage(cls).droppable) continue;\n drop.add(cls);\n }\n return drop;\n },\n },\n test: {\n cases: [\n {\n // `text-sm` is fully overridden by `text-lg` (both set font-size + line-height). The resolver\n // records that shadowing in provenance and reports the Tailwind utility as droppable, so the\n // pattern drops `text-sm`; the reverse-emit then re-derives the minimal set (`text-lg`).\n before: '<p className=\"text-sm text-lg\">Hi</p>',\n after: '<p className=\"text-lg\">Hi</p>',\n },\n ],\n // Both tokens win a distinct property (no full override) → nothing to dedupe.\n noMatch: ['<p className=\"text-lg font-bold\">Hi</p>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `gap-shorthand`.\n *\n * Collapses an element whose grid/flex gutters are expressed as two equal axis longhands back into\n * the single `gap` shorthand:\n *\n * row-gap:16px; column-gap:16px ⇒ gap:16px (Tailwind `gap-x-4 gap-y-4` → `gap-4`)\n *\n * The IR's computed StyleMap is canonically LONGHAND (the shared normalizer expands the `gap`\n * shorthand into `row-gap` + `column-gap` at parse time). This pass runs the expansion in reverse on\n * the computed map ONLY when both axes carry the SAME value and `!important` flag — i.e. when the two\n * gutters genuinely fold into a single-value `gap`. When the axes differ it declines, leaving the two\n * longhands verbatim (an asymmetric gutter has no equivalent single-value shorthand).\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the\n * `rewriteClasses` recipe rebuilds the class StyleMap, declining (`null`) unless the two axis gaps\n * are present, equal, and share an `!important` flag.\n */\n\nimport type { ConditionKey, CssProperty, CssValue, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── property handles ───────────────────────── */\n\nconst ROW_GAP = 'row-gap' as CssProperty;\nconst COLUMN_GAP = 'column-gap' as CssProperty;\nconst GAP = 'gap' as CssProperty;\n\nconst BASE_KEY: ConditionKey = conditionKey(BASE_CONDITION);\n\n/* ───────────────────────── helpers ───────────────────────── */\n\n/**\n * Rebuild the computed StyleMap with the BASE block's `row-gap`/`column-gap` pair replaced by a\n * single `gap` declaration; all other conditions/blocks are preserved verbatim. The synthesized\n * `gap` decl is set LITERALLY (not via the normalizer, which would re-expand it back into the two\n * axis longhands), so the emit side re-expands and matches the single `gap-*` utility.\n */\nfunction withGapShorthand(sm: StyleMap, gapDecl: StyleDecl): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n if (key !== BASE_KEY) {\n blocks.set(key, block);\n continue;\n }\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n if (prop === ROW_GAP || prop === COLUMN_GAP) continue; // drop the two axis longhands\n decls.set(prop, decl);\n }\n decls.set(gapDecl.property, gapDecl);\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/** Fold an equal `row-gap`/`column-gap` pair into the single `gap` shorthand. */\nexport const gapShorthand = definePattern({\n name: 'gap-shorthand',\n category: 'compress/gap-shorthand',\n safety: 1,\n doc: {\n title: 'Collapse equal row/column gap into the `gap` shorthand',\n summary:\n 'An element whose computed row-gap and column-gap are equal has the two axis longhands ' +\n 'collapsed into a single-value `gap` shorthand (Tailwind gap-x-* gap-y-* → gap-*).',\n before: '<div style=\"row-gap:16px;column-gap:16px\"/>',\n after: '<div style=\"gap:16px\"/>',\n safetyRationale:\n 'A single-value `gap` is value-identical to an equal row-gap+column-gap pair — a class-only change. ' +\n 'It is safe even on an element with a ref, event handler, dynamic child, or dangerouslySetInnerHTML ' +\n '— a className rewrite touches none of them; only a dynamic/opaque class list or a ' +\n 'combinator-subject class is excluded, so no behaviour or project selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const base = computed.blocks.get(BASE_KEY);\n if (!base) return null;\n\n const rowGap = base.decls.get(ROW_GAP);\n const colGap = base.decls.get(COLUMN_GAP);\n if (!rowGap || !colGap) return null;\n\n // A single-value `gap` cannot carry per-axis `!important` or differing values.\n if (rowGap.important !== colGap.important) return null;\n if (rowGap.value !== colGap.value) return null;\n\n const gapDecl: StyleDecl = {\n property: GAP,\n value: rowGap.value as CssValue,\n important: rowGap.important,\n relativeToParent: rowGap.relativeToParent || colGap.relativeToParent,\n inherited: false, // gap is not an inherited property\n };\n return withGapShorthand(computed, gapDecl);\n },\n },\n test: {\n cases: [\n {\n // Equal row/column gap collapse to a `gap` decl at the IR level; the minimizing reverse-emit\n // re-expands `gap` to row-gap+column-gap and picks the single utility covering both (`gap-4`),\n // replacing the `gap-x-4`+`gap-y-4` pair. `bg-red-200` is preserved.\n before: '<div className=\"gap-x-4 gap-y-4 bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 gap-4\">box</div>',\n },\n ],\n // Unequal axes (row-gap != column-gap) have no single-value `gap` equivalent → not collapsed.\n noMatch: ['<div className=\"gap-x-2 gap-y-4 bg-red-200\">box</div>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `inset-shorthand`.\n *\n * Recompacts the four physical inset longhands (`top`/`right`/`bottom`/`left`) on an element's\n * computed style back into the tightest CSS shorthand the values allow:\n *\n * • all four equal → `inset: <v>`\n * • top == bottom (a matching pair) → `inset-block: <v>` (Tailwind `inset-y-*`)\n * • left == right (a matching pair) → `inset-inline: <v>` (Tailwind `inset-x-*`)\n *\n * The two axis collapses are independent: an element whose `top == bottom` but `left != right`\n * collapses only the block axis and keeps the `left`/`right` longhands verbatim. When nothing\n * collapses (all four distinct, or fewer than a full pair present) the pattern declines.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the `rewriteClasses` recipe rebuilds the class\n * StyleMap, declining (`null`) unless at least one inset axis collapses.\n */\n\nimport type { ConditionKey, CssProperty, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION_KEY } from '@domflax/core';\n\nimport { normalizer, definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── property handles ───────────────────────── */\n\nconst TOP = 'top' as CssProperty;\nconst RIGHT = 'right' as CssProperty;\nconst BOTTOM = 'bottom' as CssProperty;\nconst LEFT = 'left' as CssProperty;\nconst INSET = 'inset' as CssProperty;\nconst INSET_BLOCK = 'inset-block' as CssProperty; // top + bottom (Tailwind inset-y)\nconst INSET_INLINE = 'inset-inline' as CssProperty; // left + right (Tailwind inset-x)\n\n/* ───────────────────────── value helpers ───────────────────────── */\n\n/** Two side-decls collapse only if they agree on BOTH normalized value and `!important`. */\nfunction sameSide(a: StyleDecl | undefined, b: StyleDecl | undefined): boolean {\n return a !== undefined && b !== undefined && a.value === b.value && a.important === b.important;\n}\n\n/** Re-key a decl onto a new property, recomputing its inherited flag for that property. */\nfunction asProperty(src: StyleDecl, property: CssProperty): StyleDecl {\n return { ...src, property, inherited: normalizer.inherited.isInherited(property) };\n}\n\n/** Rebuild `src` with the base block's decls replaced; all other condition blocks pass through. */\nfunction withBaseDecls(src: StyleMap, baseDecls: ReadonlyMap<CssProperty, StyleDecl>): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of src.blocks) {\n const decls =\n key === BASE_CONDITION_KEY ? baseDecls : new Map<CssProperty, StyleDecl>(block.decls);\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/**\n * Collapse equal/paired physical inset longhands into the `inset` / `inset-block` / `inset-inline`\n * shorthands on an element's computed style.\n */\nexport const insetShorthand = definePattern({\n name: 'inset-shorthand',\n category: 'compress/inset-shorthand',\n safety: 2,\n doc: {\n title: 'Compress inset longhands into a shorthand',\n summary:\n 'top/right/bottom/left set to one value collapse to `inset`; a matching top/bottom or ' +\n 'left/right pair collapses to `inset-block` / `inset-inline` (Tailwind inset-y / inset-x).',\n before: '<div style=\"top:10px;right:10px;bottom:10px;left:10px\"/>',\n after: '<div style=\"inset:10px\"/>',\n safetyRationale:\n 'Meaning-preserving inset shorthand compaction — a class-only change. It is safe even on an element ' +\n 'with a ref, event handler, dynamic child, or dangerouslySetInnerHTML — a className rewrite touches ' +\n 'none of them; only a dynamic/opaque class list or a combinator-subject class is excluded, so no ' +\n 'behaviour or project selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const base = computed.blocks.get(BASE_CONDITION_KEY);\n if (!base) return null;\n\n const top = base.decls.get(TOP);\n const right = base.decls.get(RIGHT);\n const bottom = base.decls.get(BOTTOM);\n const left = base.decls.get(LEFT);\n\n const next = new Map<CssProperty, StyleDecl>(base.decls);\n\n // 1. All four sides equal → single `inset`.\n if (top && sameSide(top, right) && sameSide(top, bottom) && sameSide(top, left)) {\n next.delete(TOP);\n next.delete(RIGHT);\n next.delete(BOTTOM);\n next.delete(LEFT);\n next.set(INSET, asProperty(top, INSET));\n } else {\n let collapsed = false;\n // 2a. Block axis: top == bottom → `inset-block`.\n if (sameSide(top, bottom)) {\n next.delete(TOP);\n next.delete(BOTTOM);\n next.set(INSET_BLOCK, asProperty(top!, INSET_BLOCK));\n collapsed = true;\n }\n // 2b. Inline axis: left == right → `inset-inline`.\n if (sameSide(left, right)) {\n next.delete(LEFT);\n next.delete(RIGHT);\n next.set(INSET_INLINE, asProperty(left!, INSET_INLINE));\n collapsed = true;\n }\n if (!collapsed) return null; // nothing to compress — decline\n }\n\n return withBaseDecls(computed, next);\n },\n },\n test: {\n cases: [\n {\n // The four equal inset longhands collapse to an `inset` shorthand at the IR level; the\n // minimizing reverse-emit expands it back to top/right/bottom/left and picks the single utility\n // covering all four (`inset-0`), replacing the four physical-side tokens. `bg-red-200` survives.\n before: '<div className=\"top-0 right-0 bottom-0 left-0 bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 inset-0\">box</div>',\n },\n ],\n // No matching inset pair (all four distinct) → nothing collapses.\n noMatch: ['<div className=\"top-0 right-1 bottom-2 left-3 bg-red-200\">box</div>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `margin-shorthand`.\n *\n * Collapses the four explicit margin longhands\n *\n * margin-top / margin-right / margin-bottom / margin-left\n *\n * back into a single CSS `margin` shorthand declaration on the SAME element (the margin analogue of\n * `padding-shorthand`, covering the `m` / `mx` / `my` collapse), choosing the shortest legal\n * 1–4-value form:\n *\n * • all four equal → `margin: <v>` (the `m` case)\n * • top==bottom and left==right → `margin: <y> <x>` (the `my`/`mx` case)\n * • left==right (top!=bottom) → `margin: <t> <x> <b>`\n * • otherwise → `margin: <t> <r> <b> <l>`\n *\n * It is a pure representation change: the resolved box model is identical, only the declaration\n * count shrinks from four to one, which the backend can then re-emit as a single shorthand utility.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the `rewriteClasses` recipe rebuilds the class\n * StyleMap, declining (`null`) unless all four margin longhands are present with a uniform\n * (non-)`!important` flag.\n */\n\nimport type { ConditionKey, CssProperty, CssValue, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── constants / helpers ───────────────────────── */\n\n/** The four margin longhands, in CSS shorthand order (top, right, bottom, left). */\nconst MARGIN_SIDES = [\n 'margin-top',\n 'margin-right',\n 'margin-bottom',\n 'margin-left',\n] as const satisfies readonly string[];\n\nconst MARGIN_SIDE_SET: ReadonlySet<string> = new Set(MARGIN_SIDES);\n\nconst BASE_KEY: ConditionKey = conditionKey(BASE_CONDITION);\n\n/** Collapse four side values into the shortest legal CSS `margin` shorthand value string. */\nfunction collapseMarginValue(top: string, right: string, bottom: string, left: string): string {\n if (right === left) {\n if (top === bottom) {\n return top === right ? top : `${top} ${right}`;\n }\n return `${top} ${right} ${bottom}`;\n }\n return `${top} ${right} ${bottom} ${left}`;\n}\n\n/** Rebuild the computed StyleMap with the four BASE-block margin longhands replaced by `margin`. */\nfunction withFoldedMargin(sm: StyleMap, marginDecl: StyleDecl): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n if (key !== BASE_KEY) {\n blocks.set(key, block);\n continue;\n }\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n if (!MARGIN_SIDE_SET.has(String(prop))) decls.set(prop, decl);\n }\n decls.set(marginDecl.property, marginDecl);\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/**\n * Fold four margin longhands into one `margin` shorthand on the element's base style block.\n */\nexport const marginShorthand = definePattern({\n name: 'margin-shorthand',\n category: 'compress/margin-shorthand',\n safety: 2,\n doc: {\n title: 'Compress margin longhands into the `margin` shorthand',\n summary:\n 'An element with margin-top/right/bottom/left all set has them collapsed into the shortest ' +\n 'legal `margin` shorthand (the m / mx / my forms); meaning is preserved, declaration count drops.',\n before: '<div style=\"margin-top:8px;margin-right:8px;margin-bottom:8px;margin-left:8px\"/>',\n after: '<div style=\"margin:8px\"/>',\n safetyRationale:\n 'A pure representation change of the same computed margins (no pixels move) — a class-only change. ' +\n 'It is safe even on an element with a ref, event handler, dynamic child, or dangerouslySetInnerHTML ' +\n '— a className rewrite touches none of them; only a dynamic/opaque class list or a ' +\n 'combinator-subject class is excluded, so no behaviour or project selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const base = computed.blocks.get(BASE_KEY);\n if (!base) return null;\n\n // Require all four longhands present in the base block (the `m` collapse only touches base).\n const sides = MARGIN_SIDES.map((p) => base.decls.get(p as CssProperty));\n if (sides.some((d) => d === undefined)) return null;\n const [mt, mr, mb, ml] = sides as readonly StyleDecl[];\n\n // A shorthand can only carry a uniform `!important`; mixing would change cascade behaviour.\n if (mt.important || mr.important || mb.important || ml.important) return null;\n\n const value = collapseMarginValue(\n String(mt.value),\n String(mr.value),\n String(mb.value),\n String(ml.value),\n );\n\n const marginDecl: StyleDecl = {\n property: 'margin' as CssProperty,\n value: value as CssValue,\n important: false,\n relativeToParent:\n mt.relativeToParent || mr.relativeToParent || mb.relativeToParent || ml.relativeToParent,\n inherited: false, // margin is not an inherited property\n };\n\n return withFoldedMargin(computed, marginDecl);\n },\n },\n test: {\n cases: [\n {\n // The four equal margin longhands collapse to a `margin` shorthand at the IR level, and the\n // minimizing reverse-emit picks the single shortest utility (`m-2`) reproducing it, replacing\n // the four `m{t,r,b,l}-2` tokens. `bg-red-200` is preserved.\n before: '<div className=\"mt-2 mr-2 mb-2 ml-2 bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 m-2\">box</div>',\n },\n ],\n // Only two margin sides set → the four-longhand `margin` collapse does not apply.\n noMatch: ['<div className=\"mt-2 mb-2 bg-red-200\">box</div>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `overflow-shorthand`.\n *\n * Collapses an element whose two overflow axes are expressed as equal longhands back into the single\n * `overflow` shorthand:\n *\n * overflow-x:auto; overflow-y:auto ⇒ overflow:auto (Tailwind `overflow-x-auto overflow-y-auto`\n * → `overflow-auto`)\n *\n * Unlike the box shorthands, the shared normalizer leaves `overflow-x` / `overflow-y` as independent\n * longhands (it does not synthesize an `overflow` shorthand), so an element styled with two equal\n * axis utilities keeps two separate declarations until this pass folds them. The fold runs ONLY when\n * both axes carry the SAME value and `!important` flag; an asymmetric pair (`overflow-x !==\n * overflow-y`) has no single-keyword `overflow` equivalent and is declined.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the\n * `rewriteClasses` recipe rebuilds the class StyleMap, declining (`null`) unless both overflow axes\n * are present, equal, and share an `!important` flag.\n */\n\nimport type { ConditionKey, CssProperty, CssValue, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── property handles ───────────────────────── */\n\nconst OVERFLOW_X = 'overflow-x' as CssProperty;\nconst OVERFLOW_Y = 'overflow-y' as CssProperty;\nconst OVERFLOW = 'overflow' as CssProperty;\n\nconst BASE_KEY: ConditionKey = conditionKey(BASE_CONDITION);\n\n/* ───────────────────────── helpers ───────────────────────── */\n\n/**\n * Rebuild the computed StyleMap with the BASE block's `overflow-x`/`overflow-y` pair replaced by a\n * single `overflow` declaration; all other conditions/blocks are preserved verbatim.\n */\nfunction withOverflowShorthand(sm: StyleMap, overflowDecl: StyleDecl): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n if (key !== BASE_KEY) {\n blocks.set(key, block);\n continue;\n }\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n if (prop === OVERFLOW_X || prop === OVERFLOW_Y) continue; // drop the two axis longhands\n decls.set(prop, decl);\n }\n decls.set(overflowDecl.property, overflowDecl);\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/** Fold an equal `overflow-x`/`overflow-y` pair into the single `overflow` shorthand. */\nexport const overflowShorthand = definePattern({\n name: 'overflow-shorthand',\n category: 'compress/overflow-shorthand',\n safety: 1,\n doc: {\n title: 'Collapse equal overflow axes into the `overflow` shorthand',\n summary:\n 'An element whose computed overflow-x and overflow-y are equal has the two axis longhands ' +\n 'collapsed into a single `overflow` shorthand (Tailwind overflow-x-* overflow-y-* → overflow-*).',\n before: '<div style=\"overflow-x:auto;overflow-y:auto\"/>',\n after: '<div style=\"overflow:auto\"/>',\n safetyRationale:\n 'A single-keyword `overflow` is value-identical to equal overflow-x+overflow-y — a class-only ' +\n 'change. It is safe even on an element with a ref, event handler, dynamic child, or ' +\n 'dangerouslySetInnerHTML — a className rewrite touches none of them; only a dynamic/opaque class ' +\n 'list or a combinator-subject class is excluded, so no behaviour or project selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const base = computed.blocks.get(BASE_KEY);\n if (!base) return null;\n\n const overflowX = base.decls.get(OVERFLOW_X);\n const overflowY = base.decls.get(OVERFLOW_Y);\n if (!overflowX || !overflowY) return null;\n\n // The single-keyword shorthand cannot carry per-axis `!important` or differing values.\n if (overflowX.important !== overflowY.important) return null;\n if (overflowX.value !== overflowY.value) return null;\n\n const overflowDecl: StyleDecl = {\n property: OVERFLOW,\n value: overflowX.value as CssValue,\n important: overflowX.important,\n relativeToParent: overflowX.relativeToParent || overflowY.relativeToParent,\n inherited: false, // overflow is not an inherited property\n };\n return withOverflowShorthand(computed, overflowDecl);\n },\n },\n test: {\n cases: [\n {\n // Equal overflow axes collapse to an `overflow` decl at the IR level; the minimizing\n // reverse-emit picks the single utility covering both (`overflow-auto`), replacing the\n // `overflow-x-auto`+`overflow-y-auto` pair. `bg-red-200` is preserved.\n before: '<div className=\"overflow-x-auto overflow-y-auto bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 overflow-auto\">box</div>',\n },\n ],\n // Mismatched axes (overflow-x != overflow-y) have no single-keyword equivalent → not collapsed.\n noMatch: ['<div className=\"overflow-x-auto overflow-y-hidden bg-red-200\">box</div>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `overscroll-behavior-shorthand`.\n *\n * Collapses an element whose two overscroll-behavior axes are expressed as separate longhand\n * declarations and are EQUAL into the single CSS `overscroll-behavior` shorthand:\n *\n * overscroll-behavior-x:contain; overscroll-behavior-y:contain\n * ⇒ overscroll-behavior:contain (Tailwind `overscroll-x-contain overscroll-y-contain` → `overscroll-contain`)\n *\n * Tailwind's `overscroll-x-*` / `overscroll-y-*` utilities each resolve to the matching\n * `overscroll-behavior-{x,y}` axis longhand, and the shared normalizer keeps `overscroll-behavior`\n * un-expanded (it is NOT one of the box/gap shorthands the normalizer splits). So only the equal-axis\n * form maps cleanly to a single `overscroll-*` utility. This pass runs the collapse in reverse on the\n * computed map ONLY when both axes carry the SAME value and `!important` flag, replacing them with one\n * `overscroll-behavior` decl so the minimizing reverse-emit can pick a single `overscroll-*` token\n * instead of two axis tokens. When the axes differ it declines, leaving the two longhands verbatim.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the\n * `rewriteClasses` recipe rebuilds the class StyleMap, declining (`null`) unless both axes are\n * present, concrete, equal, and share an `!important` flag.\n */\n\nimport type { ConditionKey, CssProperty, CssValue, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── property handles ───────────────────────── */\n\nconst OVERSCROLL_X = 'overscroll-behavior-x' as CssProperty;\nconst OVERSCROLL_Y = 'overscroll-behavior-y' as CssProperty;\nconst OVERSCROLL = 'overscroll-behavior' as CssProperty;\n\nconst BASE_KEY: ConditionKey = conditionKey(BASE_CONDITION);\n\n/** CSS-wide keywords for which an axis collapse is pointless or unsound. */\nconst NON_COLLAPSIBLE_VALUES: ReadonlySet<string> = new Set<string>([\n 'initial',\n 'inherit',\n 'unset',\n 'revert',\n 'revert-layer',\n]);\n\n/* ───────────────────────── helpers ───────────────────────── */\n\n/**\n * Rebuild the computed StyleMap with the BASE block's overscroll-behavior x/y pair replaced by a\n * single `overscroll-behavior` declaration; all other conditions/blocks are preserved verbatim. The\n * synthesized shorthand decl is set LITERALLY (the normalizer leaves `overscroll-behavior` intact),\n * so the emit side matches the single `overscroll-*` utility.\n */\nfunction withOverscrollShorthand(sm: StyleMap, shorthand: StyleDecl): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n if (key !== BASE_KEY) {\n blocks.set(key, block);\n continue;\n }\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n if (prop === OVERSCROLL_X || prop === OVERSCROLL_Y) continue; // drop the two axis longhands\n decls.set(prop, decl);\n }\n decls.set(shorthand.property, shorthand);\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/** Fold an equal overscroll-behavior x/y pair into the single `overscroll-behavior` shorthand. */\nexport const overscrollBehaviorShorthand = definePattern({\n name: 'overscroll-behavior-shorthand',\n category: 'compress/overscroll-behavior-shorthand',\n safety: 1,\n doc: {\n title: 'Collapse equal overscroll-behavior axes into overscroll-behavior',\n summary:\n 'An element whose computed overscroll-behavior-x and overscroll-behavior-y are equal has the ' +\n 'two axis longhands collapsed into a single `overscroll-behavior` shorthand (Tailwind ' +\n 'overscroll-x-* overscroll-y-* → overscroll-*).',\n before: '<div style=\"overscroll-behavior-x:contain;overscroll-behavior-y:contain\"/>',\n after: '<div class=\"overscroll-contain\"/>',\n safetyRationale:\n '`overscroll-behavior` is value-identical to an equal x+y axis pair — a class-only change. It is ' +\n 'safe even on an element with a ref, event handler, dynamic child, or dangerouslySetInnerHTML — a ' +\n 'className rewrite touches none of them; only a dynamic/opaque class list or a combinator-subject ' +\n 'class is excluded, so no behaviour or project selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const base = computed.blocks.get(BASE_KEY);\n if (!base) return null;\n\n const x = base.decls.get(OVERSCROLL_X);\n const y = base.decls.get(OVERSCROLL_Y);\n if (!x || !y) return null;\n\n // A single shorthand cannot carry per-axis `!important` or differing values.\n if (x.important !== y.important) return null;\n const value = String(x.value);\n if (NON_COLLAPSIBLE_VALUES.has(value)) return null;\n if (value !== String(y.value)) return null;\n\n const shorthand: StyleDecl = {\n property: OVERSCROLL,\n value: x.value as CssValue,\n important: x.important,\n relativeToParent: x.relativeToParent || y.relativeToParent,\n inherited: false, // overscroll-behavior is not an inherited property\n };\n return withOverscrollShorthand(computed, shorthand);\n },\n },\n test: {\n cases: [\n {\n // Equal x/y axes collapse to an `overscroll-behavior` decl at the IR level; the minimizing\n // reverse-emit picks the single utility covering both (`overscroll-contain`), replacing the\n // `overscroll-x-contain`+`overscroll-y-contain` pair. `bg-red-200` is preserved.\n before: '<div className=\"overscroll-x-contain overscroll-y-contain bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 overscroll-contain\">box</div>',\n },\n ],\n // Axes differ (x != y) → no equal-axis collapse.\n noMatch: ['<div className=\"overscroll-x-contain overscroll-y-auto bg-red-200\">box</div>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `padding-shorthand`.\n *\n * Collapses an element whose four padding sides are expressed as separate longhand declarations\n * back into the shortest equivalent shorthand:\n *\n * padding-top:16px; padding-right:16px; padding-bottom:16px; padding-left:16px\n * ⇒ padding:16px (Tailwind `p-4`)\n *\n * padding-top:8px; padding-bottom:8px; padding-left:16px; padding-right:16px\n * ⇒ padding:8px 16px (Tailwind `px-4 py-2`)\n *\n * The IR's computed StyleMap is canonically LONGHAND (the shared normalizer expands every box\n * shorthand at parse time). This pass runs the expansion in reverse on the computed map ONLY when\n * the four sides fold cleanly into a 1- or 2-value form — i.e. `top===bottom` AND `left===right`.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the `rewriteClasses`\n * recipe rebuilds the class StyleMap, declining (`null`) unless the four sides fold cleanly.\n */\n\nimport type { ConditionKey, CssProperty, CssValue, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── padding analysis ───────────────────────── */\n\n/** The four padding longhands, in CSS shorthand order: top, right, bottom, left. */\nconst PADDING_SIDES = [\n 'padding-top',\n 'padding-right',\n 'padding-bottom',\n 'padding-left',\n] as const;\n\nconst PADDING_SIDE_SET: ReadonlySet<string> = new Set<string>(PADDING_SIDES);\n\nconst BASE_KEY: ConditionKey = conditionKey(BASE_CONDITION);\n\n/** The collapsed shorthand the four sides fold into (carrying important / relative-unit flags). */\ninterface PaddingFold {\n readonly value: string; // 1-value (`16px`) or 2-value (`8px 16px`) form\n readonly important: boolean;\n readonly relative: boolean;\n}\n\n/**\n * Inspect the BASE-condition block of `sm` and, iff all four padding longhands are present, share a\n * uniform `!important` flag, and form matching x/y pairs (`top===bottom` AND `left===right`), return\n * the shortest equivalent shorthand value. Returns `null` when the sides cannot fold.\n */\nfunction analyzePadding(sm: StyleMap): PaddingFold | null {\n const block = sm.blocks.get(BASE_KEY);\n if (!block) return null;\n\n const sides: StyleDecl[] = [];\n for (const side of PADDING_SIDES) {\n const decl = block.decls.get(side as CssProperty);\n if (!decl) return null;\n sides.push(decl);\n }\n const [top, right, bottom, left] = sides as [StyleDecl, StyleDecl, StyleDecl, StyleDecl];\n\n // A shorthand cannot carry per-side `!important`; only fold a uniform flag.\n if (\n !(\n top.important === right.important &&\n right.important === bottom.important &&\n bottom.important === left.important\n )\n ) {\n return null;\n }\n\n const tv = String(top.value);\n const rv = String(right.value);\n const bv = String(bottom.value);\n const lv = String(left.value);\n\n // Only the `p-*` (all equal) and `px-* py-*` (matching pairs) shapes are in scope.\n if (tv !== bv || lv !== rv) return null;\n\n const value = tv === lv ? tv : `${tv} ${lv}`;\n const relative = sides.some((d) => d.relativeToParent);\n return { value, important: top.important, relative };\n}\n\n/* ───────────────────────── style rebuild ───────────────────────── */\n\n/** Rebuild `sm` with the four BASE-block padding longhands replaced by one `padding` shorthand. */\nfunction withFoldedPadding(sm: StyleMap, fold: PaddingFold): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n if (key !== BASE_KEY) {\n blocks.set(key, block);\n continue;\n }\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n if (PADDING_SIDE_SET.has(String(prop))) continue; // drop the four longhands\n decls.set(prop, decl);\n }\n const shorthand: StyleDecl = {\n property: 'padding' as CssProperty,\n value: fold.value as CssValue,\n important: fold.important,\n relativeToParent: fold.relative,\n inherited: false, // padding is never inherited\n };\n decls.set(shorthand.property, shorthand);\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/**\n * Compress an element's four equal/paired padding longhands into the shortest `padding` shorthand.\n */\nexport const paddingShorthand = definePattern({\n name: 'padding-shorthand',\n category: 'compress/padding-shorthand',\n safety: 1,\n doc: {\n title: 'Collapse padding longhands to shorthand',\n summary:\n 'Equal padding on all four sides (or matching x/y pairs) expressed as separate longhand ' +\n 'declarations is collapsed to the shortest equivalent padding shorthand (p-* / px-* py-*).',\n before: '<div class=\"pt-4 pr-4 pb-4 pl-4\"/>',\n after: '<div class=\"p-4\"/>',\n safetyRationale:\n 'A value-preserving re-serialization of the same computed padding on the same node — a class-only ' +\n 'change. It is safe even on an element with a ref, event handler, dynamic child, or ' +\n 'dangerouslySetInnerHTML — a className rewrite touches none of them; only a dynamic/opaque class ' +\n 'list or a combinator-subject class is excluded, so no behaviour or project selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const fold = analyzePadding(computed);\n return fold ? withFoldedPadding(computed, fold) : null;\n },\n },\n test: {\n cases: [\n {\n // The four equal padding longhands collapse to a `padding` shorthand at the IR level, and the\n // minimizing reverse-emit picks the single shortest utility (`p-4`) that reproduces it,\n // replacing the four `p{t,r,b,l}-4` tokens. `bg-red-200` is preserved (its order is stable).\n before: '<div className=\"pt-4 pr-4 pb-4 pl-4 bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 p-4\">box</div>',\n },\n {\n // A dynamic `{x}` child no longer blocks compress: only the element's OWN class tokens are\n // rewritten (px-4 py-4 → p-4); the dynamic child is untouched by a class-only change. This is\n // the real-app common case (most elements have dynamic content).\n before: '<div className=\"px-4 py-4\">{x}</div>',\n after: '<div className=\"p-4\">{x}</div>',\n },\n ],\n // Asymmetric padding (top != bottom) cannot fold into a shorthand → left unchanged.\n noMatch: ['<div className=\"pt-2 pr-4 pb-8 pl-4 bg-red-200\">box</div>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `place-shorthand`.\n *\n * Recompacts the grid/flex alignment longhands on an element's computed style into the CSS `place-*`\n * shorthands whenever the two axes of a pair agree:\n *\n * • align-items == justify-items → `place-items: <v>` (Tailwind `items-* justify-items-*`)\n * • align-content == justify-content → `place-content: <v>` (Tailwind `content-* justify-*`)\n *\n * The two collapses are INDEPENDENT: an element whose items pair agrees but whose content pair does\n * not collapses only `place-items` and keeps the content longhands verbatim. The shared normalizer\n * leaves all four alignment properties as independent longhands (it synthesizes no `place-*`\n * shorthand), so an element styled with two matching axis utilities keeps the longhands until this\n * pass folds them. When neither pair agrees the pattern declines.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the\n * `rewriteClasses` recipe rebuilds the class StyleMap, declining (`null`) unless at least one\n * alignment pair collapses.\n */\n\nimport type { ConditionKey, CssProperty, CssValue, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── property handles ───────────────────────── */\n\nconst ALIGN_ITEMS = 'align-items' as CssProperty;\nconst JUSTIFY_ITEMS = 'justify-items' as CssProperty;\nconst PLACE_ITEMS = 'place-items' as CssProperty;\n\nconst ALIGN_CONTENT = 'align-content' as CssProperty;\nconst JUSTIFY_CONTENT = 'justify-content' as CssProperty;\nconst PLACE_CONTENT = 'place-content' as CssProperty;\n\nconst BASE_KEY: ConditionKey = conditionKey(BASE_CONDITION);\n\n/* ───────────────────────── helpers ───────────────────────── */\n\n/** Two alignment decls collapse only if they agree on BOTH normalized value and `!important`. */\nfunction samePair(a: StyleDecl | undefined, b: StyleDecl | undefined): boolean {\n return a !== undefined && b !== undefined && a.value === b.value && a.important === b.important;\n}\n\n/** Build a `place-*` shorthand decl carrying the (uniform) value/`!important` of its axis pair. */\nfunction placeDecl(property: CssProperty, align: StyleDecl): StyleDecl {\n return {\n property,\n value: align.value as CssValue,\n important: align.important,\n relativeToParent: false, // alignment keywords (center/start/stretch/…) are not length-relative\n inherited: false, // none of the place-* alignment properties are inherited\n };\n}\n\n/** Rebuild `sm` with the base block's decls replaced; all other condition blocks pass through. */\nfunction withBaseDecls(sm: StyleMap, baseDecls: ReadonlyMap<CssProperty, StyleDecl>): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n const decls =\n key === BASE_KEY ? new Map<CssProperty, StyleDecl>(baseDecls) : block.decls;\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/** Fold matching align/justify pairs into the `place-items` / `place-content` shorthands. */\nexport const placeShorthand = definePattern({\n name: 'place-shorthand',\n category: 'compress/place-shorthand',\n safety: 1,\n doc: {\n title: 'Collapse matching alignment pairs into `place-*` shorthands',\n summary:\n 'When align-items equals justify-items they collapse to `place-items`; when align-content ' +\n 'equals justify-content they collapse to `place-content`. The two collapses are independent.',\n before: '<div style=\"align-items:center;justify-items:center\"/>',\n after: '<div style=\"place-items:center\"/>',\n safetyRationale:\n 'A `place-*` shorthand is value-identical to its equal align/justify pair — a class-only change. It ' +\n 'is safe even on an element with a ref, event handler, dynamic child, or dangerouslySetInnerHTML — ' +\n 'a className rewrite touches none of them; only a dynamic/opaque class list or a combinator-subject ' +\n 'class is excluded, so no behaviour or project selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const base = computed.blocks.get(BASE_KEY);\n if (!base) return null;\n\n const alignItems = base.decls.get(ALIGN_ITEMS);\n const justifyItems = base.decls.get(JUSTIFY_ITEMS);\n const alignContent = base.decls.get(ALIGN_CONTENT);\n const justifyContent = base.decls.get(JUSTIFY_CONTENT);\n\n const next = new Map<CssProperty, StyleDecl>(base.decls);\n let collapsed = false;\n\n // 1. Items axis: align-items == justify-items → `place-items`.\n if (samePair(alignItems, justifyItems)) {\n next.delete(ALIGN_ITEMS);\n next.delete(JUSTIFY_ITEMS);\n next.set(PLACE_ITEMS, placeDecl(PLACE_ITEMS, alignItems!));\n collapsed = true;\n }\n // 2. Content axis: align-content == justify-content → `place-content`.\n if (samePair(alignContent, justifyContent)) {\n next.delete(ALIGN_CONTENT);\n next.delete(JUSTIFY_CONTENT);\n next.set(PLACE_CONTENT, placeDecl(PLACE_CONTENT, alignContent!));\n collapsed = true;\n }\n\n if (!collapsed) return null; // nothing to compress — decline\n return withBaseDecls(computed, next);\n },\n },\n test: {\n cases: [\n {\n // The matching items pair collapses to a `place-items` decl at the IR level; the minimizing\n // reverse-emit picks the single utility covering both (`place-items-center`), replacing the\n // `items-center`+`justify-items-center` pair. `bg-red-200` is preserved.\n before: '<div className=\"items-center justify-items-center bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 place-items-center\">box</div>',\n },\n ],\n // Mismatched alignment (align-items != justify-items, no content pair) → nothing collapses.\n noMatch: ['<div className=\"items-center justify-items-start bg-red-200\">box</div>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `scroll-margin-shorthand`.\n *\n * Collapses an element whose four scroll-margin sides are expressed as separate longhand\n * declarations and are ALL EQUAL into the single CSS `scroll-margin` shorthand:\n *\n * scroll-margin-top:1rem; scroll-margin-right:1rem;\n * scroll-margin-bottom:1rem; scroll-margin-left:1rem\n * ⇒ scroll-margin:1rem (Tailwind `scroll-m-4`)\n *\n * Tailwind's `scroll-mt-*` / `scroll-mx-*` / … utilities each resolve to the matching\n * `scroll-margin-*` longhand(s), and the shared normalizer keeps `scroll-margin` un-expanded (it is\n * NOT one of the box shorthands the normalizer splits). So only the all-equal (1-value) form maps\n * cleanly to a single `scroll-m-*` utility — the 2-value (`scroll-mx`/`scroll-my`) shape is left to\n * the resolver's own reverse-emit. This pass runs the collapse in reverse on the computed map ONLY\n * when all four sides share one value, replacing them with one `scroll-margin` decl so the minimizing\n * reverse-emit can pick a single `scroll-m-*` token instead of two axis tokens.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the\n * `rewriteClasses` recipe rebuilds the class StyleMap, declining (`null`) unless the four sides are\n * present, concrete, equal, and share an `!important` flag.\n */\n\nimport type { ConditionKey, CssProperty, CssValue, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── scroll-margin analysis ───────────────────────── */\n\n/** The four scroll-margin longhands. */\nconst SCROLL_MARGIN_SIDES = [\n 'scroll-margin-top',\n 'scroll-margin-right',\n 'scroll-margin-bottom',\n 'scroll-margin-left',\n] as const satisfies readonly string[];\n\nconst SIDE_SET: ReadonlySet<string> = new Set<string>(SCROLL_MARGIN_SIDES);\n\nconst BASE_KEY: ConditionKey = conditionKey(BASE_CONDITION);\n\nconst SCROLL_MARGIN = 'scroll-margin' as CssProperty;\n\n/** CSS-wide keywords for which a side collapse is pointless or unsound. */\nconst NON_COLLAPSIBLE_VALUES: ReadonlySet<string> = new Set<string>([\n 'initial',\n 'inherit',\n 'unset',\n 'revert',\n 'revert-layer',\n]);\n\n/** The single value all four sides fold into (carrying important / relative-unit flags). */\ninterface ScrollMarginFold {\n readonly value: string;\n readonly important: boolean;\n readonly relative: boolean;\n}\n\n/**\n * Inspect the BASE-condition block of `sm` and, iff all four scroll-margin longhands are present,\n * share a uniform `!important` flag, hold a concrete (non-keyword) value, and are ALL EQUAL, return\n * that value. Returns `null` when the sides cannot fold to one `scroll-margin`.\n */\nfunction analyzeScrollMargin(sm: StyleMap): ScrollMarginFold | null {\n const block = sm.blocks.get(BASE_KEY);\n if (!block) return null;\n\n const sides: StyleDecl[] = [];\n for (const side of SCROLL_MARGIN_SIDES) {\n const decl = block.decls.get(side as CssProperty);\n if (!decl) return null;\n sides.push(decl);\n }\n\n // A shorthand cannot carry per-side `!important`; only fold a uniform flag.\n const important = sides[0]!.important;\n if (!sides.every((d) => d.important === important)) return null;\n\n const value = String(sides[0]!.value);\n if (NON_COLLAPSIBLE_VALUES.has(value)) return null;\n if (!sides.every((d) => String(d.value) === value)) return null;\n\n const relative = sides.some((d) => d.relativeToParent);\n return { value, important, relative };\n}\n\n/* ───────────────────────── style rebuild ───────────────────────── */\n\n/** Rebuild `sm` with the four BASE-block scroll-margin longhands replaced by one shorthand decl. */\nfunction withFoldedScrollMargin(sm: StyleMap, fold: ScrollMarginFold): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n if (key !== BASE_KEY) {\n blocks.set(key, block);\n continue;\n }\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n if (SIDE_SET.has(String(prop))) continue; // drop the four longhands\n decls.set(prop, decl);\n }\n const shorthand: StyleDecl = {\n property: SCROLL_MARGIN,\n value: fold.value as CssValue,\n important: fold.important,\n relativeToParent: fold.relative,\n inherited: false, // scroll-margin is never inherited\n };\n decls.set(shorthand.property, shorthand);\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/** Fold four equal scroll-margin sides into the single `scroll-margin` shorthand. */\nexport const scrollMarginShorthand = definePattern({\n name: 'scroll-margin-shorthand',\n category: 'compress/scroll-margin-shorthand',\n safety: 1,\n doc: {\n title: 'Collapse equal scroll-margin sides into scroll-margin',\n summary:\n 'An element whose four scroll-margin sides are all equal is rewritten to the single Tailwind ' +\n 'scroll-m-* utility (scroll-margin === the four equal sides).',\n before: '<div class=\"scroll-mt-4 scroll-mr-4 scroll-mb-4 scroll-ml-4\"/>',\n after: '<div class=\"scroll-m-4\"/>',\n safetyRationale:\n '`scroll-margin` is value-identical to four equal scroll-margin sides — a class-only change. It is ' +\n 'safe even on an element with a ref, event handler, dynamic child, or dangerouslySetInnerHTML — a ' +\n 'className rewrite touches none of them; only a dynamic/opaque class list or a combinator-subject ' +\n 'class is excluded, so no behaviour or project selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const fold = analyzeScrollMargin(computed);\n return fold ? withFoldedScrollMargin(computed, fold) : null;\n },\n },\n test: {\n cases: [\n {\n // The four equal scroll-margin longhands collapse to a `scroll-margin` decl at the IR level; the\n // minimizing reverse-emit then picks the single shortest utility (`scroll-m-4`) that reproduces\n // it, replacing the four `scroll-m{t,r,b,l}-4` tokens. `bg-red-200` is preserved.\n before: '<div className=\"scroll-mt-4 scroll-mr-4 scroll-mb-4 scroll-ml-4 bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 scroll-m-4\">box</div>',\n },\n ],\n // Sides differ (top != bottom) → no all-equal collapse.\n noMatch: ['<div className=\"scroll-mt-2 scroll-mr-4 scroll-mb-8 scroll-ml-4 bg-red-200\">box</div>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `scroll-padding-shorthand`.\n *\n * Collapses an element whose four scroll-padding sides are expressed as separate longhand\n * declarations and are ALL EQUAL into the single CSS `scroll-padding` shorthand:\n *\n * scroll-padding-top:1rem; scroll-padding-right:1rem;\n * scroll-padding-bottom:1rem; scroll-padding-left:1rem\n * ⇒ scroll-padding:1rem (Tailwind `scroll-p-4`)\n *\n * Tailwind's `scroll-pt-*` / `scroll-px-*` / … utilities each resolve to the matching\n * `scroll-padding-*` longhand(s), and the shared normalizer keeps `scroll-padding` un-expanded (it is\n * NOT one of the box shorthands the normalizer splits). So only the all-equal (1-value) form maps\n * cleanly to a single `scroll-p-*` utility — the 2-value (`scroll-px`/`scroll-py`) shape is left to\n * the resolver's own reverse-emit. This pass runs the collapse in reverse on the computed map ONLY\n * when all four sides share one value, replacing them with one `scroll-padding` decl so the minimizing\n * reverse-emit can pick a single `scroll-p-*` token instead of two axis tokens.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the\n * `rewriteClasses` recipe rebuilds the class StyleMap, declining (`null`) unless the four sides are\n * present, concrete, equal, and share an `!important` flag.\n */\n\nimport type { ConditionKey, CssProperty, CssValue, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport { definePattern } from '@domflax/pattern-kit';\n\n/* ───────────────────────── scroll-padding analysis ───────────────────────── */\n\n/** The four scroll-padding longhands. */\nconst SCROLL_PADDING_SIDES = [\n 'scroll-padding-top',\n 'scroll-padding-right',\n 'scroll-padding-bottom',\n 'scroll-padding-left',\n] as const satisfies readonly string[];\n\nconst SIDE_SET: ReadonlySet<string> = new Set<string>(SCROLL_PADDING_SIDES);\n\nconst BASE_KEY: ConditionKey = conditionKey(BASE_CONDITION);\n\nconst SCROLL_PADDING = 'scroll-padding' as CssProperty;\n\n/** CSS-wide keywords for which a side collapse is pointless or unsound. */\nconst NON_COLLAPSIBLE_VALUES: ReadonlySet<string> = new Set<string>([\n 'initial',\n 'inherit',\n 'unset',\n 'revert',\n 'revert-layer',\n]);\n\n/** The single value all four sides fold into (carrying important / relative-unit flags). */\ninterface ScrollPaddingFold {\n readonly value: string;\n readonly important: boolean;\n readonly relative: boolean;\n}\n\n/**\n * Inspect the BASE-condition block of `sm` and, iff all four scroll-padding longhands are present,\n * share a uniform `!important` flag, hold a concrete (non-keyword) value, and are ALL EQUAL, return\n * that value. Returns `null` when the sides cannot fold to one `scroll-padding`.\n */\nfunction analyzeScrollPadding(sm: StyleMap): ScrollPaddingFold | null {\n const block = sm.blocks.get(BASE_KEY);\n if (!block) return null;\n\n const sides: StyleDecl[] = [];\n for (const side of SCROLL_PADDING_SIDES) {\n const decl = block.decls.get(side as CssProperty);\n if (!decl) return null;\n sides.push(decl);\n }\n\n // A shorthand cannot carry per-side `!important`; only fold a uniform flag.\n const important = sides[0]!.important;\n if (!sides.every((d) => d.important === important)) return null;\n\n const value = String(sides[0]!.value);\n if (NON_COLLAPSIBLE_VALUES.has(value)) return null;\n if (!sides.every((d) => String(d.value) === value)) return null;\n\n const relative = sides.some((d) => d.relativeToParent);\n return { value, important, relative };\n}\n\n/* ───────────────────────── style rebuild ───────────────────────── */\n\n/** Rebuild `sm` with the four BASE-block scroll-padding longhands replaced by one shorthand decl. */\nfunction withFoldedScrollPadding(sm: StyleMap, fold: ScrollPaddingFold): StyleMap {\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n if (key !== BASE_KEY) {\n blocks.set(key, block);\n continue;\n }\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, decl] of block.decls) {\n if (SIDE_SET.has(String(prop))) continue; // drop the four longhands\n decls.set(prop, decl);\n }\n const shorthand: StyleDecl = {\n property: SCROLL_PADDING,\n value: fold.value as CssValue,\n important: fold.important,\n relativeToParent: fold.relative,\n inherited: false, // scroll-padding is never inherited\n };\n decls.set(shorthand.property, shorthand);\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/** Fold four equal scroll-padding sides into the single `scroll-padding` shorthand. */\nexport const scrollPaddingShorthand = definePattern({\n name: 'scroll-padding-shorthand',\n category: 'compress/scroll-padding-shorthand',\n safety: 1,\n doc: {\n title: 'Collapse equal scroll-padding sides into scroll-padding',\n summary:\n 'An element whose four scroll-padding sides are all equal is rewritten to the single Tailwind ' +\n 'scroll-p-* utility (scroll-padding === the four equal sides).',\n before: '<div class=\"scroll-pt-4 scroll-pr-4 scroll-pb-4 scroll-pl-4\"/>',\n after: '<div class=\"scroll-p-4\"/>',\n safetyRationale:\n '`scroll-padding` is value-identical to four equal scroll-padding sides — a class-only change. It ' +\n 'is safe even on an element with a ref, event handler, dynamic child, or dangerouslySetInnerHTML — ' +\n 'a className rewrite touches none of them; only a dynamic/opaque class list or a combinator-subject ' +\n 'class is excluded, so no behaviour or project selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const fold = analyzeScrollPadding(computed);\n return fold ? withFoldedScrollPadding(computed, fold) : null;\n },\n },\n test: {\n cases: [\n {\n // The four equal scroll-padding longhands collapse to a `scroll-padding` decl at the IR level;\n // the minimizing reverse-emit then picks the single shortest utility (`scroll-p-4`) that\n // reproduces it, replacing the four `scroll-p{t,r,b,l}-4` tokens. `bg-red-200` is preserved.\n before: '<div className=\"scroll-pt-4 scroll-pr-4 scroll-pb-4 scroll-pl-4 bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 scroll-p-4\">box</div>',\n },\n ],\n // Sides differ (top != bottom) → no all-equal collapse.\n noMatch: ['<div className=\"scroll-pt-2 scroll-pr-4 scroll-pb-8 scroll-pl-4 bg-red-200\">box</div>'],\n },\n});\n","/**\n * @domflax/patterns — compress pattern: `size-shorthand`.\n *\n * Collapses an element whose computed `width` and `height` are EQUAL into the single Tailwind\n * `size-*` utility:\n *\n * <div style=\"width:1rem; height:1rem\"/> → <div class=\"size-4\"/>\n *\n * At the IR level we work over the normalized computed StyleMap (CSS longhands), so the pattern\n * recognizes the `width === height` shape in the BASE condition and rebuilds the element's class\n * StyleMap with a single `size` declaration (the resolver reverse-emits the concrete `size-*` token\n * at codegen). Both longhands are removed and replaced by the merged `size` decl, so the rewrite is\n * idempotent — once collapsed there is no `width`+`height` pair left to re-match.\n *\n * Authored with the declarative {@link pattern} API: `definePattern` auto-applies the compress safety guards — a dynamic or opaque class list\n * and combinator-subject selectors are excluded (a ref / event handler / dynamic child / dangerous\n * HTML never blocks a class-only rewrite); the\n * `rewriteClasses` recipe rebuilds the class StyleMap, returning `null` (decline) unless the BASE\n * width/height are equal, concrete, and share an `!important` flag.\n */\n\nimport type { ConditionKey, CssProperty, StyleBlock, StyleDecl, StyleMap } from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\n\nimport { normalizer, definePattern } from '@domflax/pattern-kit';\n\nconst WIDTH = 'width' as CssProperty;\nconst HEIGHT = 'height' as CssProperty;\nconst SIZE = 'size' as CssProperty;\n\n/** Values for which collapsing the two axes is pointless or unsound (no concrete equal extent). */\nconst NON_COLLAPSIBLE_VALUES: ReadonlySet<string> = new Set<string>(['auto', 'initial', 'unset']);\n\n/* ───────────────────────── helpers ───────────────────────── */\n\n/** Read the BASE-condition block of the node's normalized computed StyleMap, if any. */\nfunction baseBlock(sm: StyleMap): StyleBlock | undefined {\n return sm.blocks.get(conditionKey(BASE_CONDITION));\n}\n\n/**\n * Rebuild the computed StyleMap with the BASE block's `width`/`height` pair replaced by a single\n * `size` declaration; all other conditions/blocks are preserved verbatim.\n */\nfunction withSizeShorthand(sm: StyleMap, value: string, important: boolean): StyleMap {\n const baseKey = conditionKey(BASE_CONDITION);\n const blocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of sm.blocks) {\n if (key !== baseKey) {\n blocks.set(key, block);\n continue;\n }\n const decls = new Map<CssProperty, StyleDecl>(block.decls);\n decls.delete(WIDTH);\n decls.delete(HEIGHT);\n for (const decl of normalizer.normalizeDeclaration(String(SIZE), value, important)) {\n decls.set(decl.property, decl);\n }\n blocks.set(key, { condition: block.condition, decls });\n }\n return { blocks };\n}\n\n/* ───────────────────────── the pattern ───────────────────────── */\n\n/** Fold equal `width`/`height` into the `size-*` utility. */\nexport const sizeShorthand = definePattern({\n name: 'size-shorthand',\n category: 'compress/size-shorthand',\n safety: 2,\n doc: {\n title: 'Collapse equal width/height into size-*',\n summary:\n 'An element whose computed width and height are equal is rewritten to the single Tailwind ' +\n 'size-* utility (size-* === width + height at the same value).',\n before: '<div style=\"width:1rem;height:1rem\"/>',\n after: '<div class=\"size-4\"/>',\n safetyRationale:\n '`size-*` is value-identical to equal width+height — a class-only change. It is safe even on an ' +\n 'element with a ref, event handler, dynamic child, or dangerouslySetInnerHTML — a className rewrite ' +\n 'touches none of them; only a dynamic/opaque class list or a combinator-subject class is excluded, ' +\n 'so no behaviour or project selector is disturbed.',\n },\n rewrite: {\n rewriteClasses(computed: StyleMap): StyleMap | null {\n const base = baseBlock(computed);\n const w = base?.decls.get(WIDTH);\n const h = base?.decls.get(HEIGHT);\n if (!w || !h) return null;\n if (w.important !== h.important) return null;\n if (NON_COLLAPSIBLE_VALUES.has(String(w.value))) return null;\n if (w.value !== h.value) return null;\n return withSizeShorthand(computed, String(w.value), w.important);\n },\n },\n test: {\n cases: [\n {\n // Equal width/height collapse to a `size` decl at the IR level; the minimizing reverse-emit\n // expands `size` back to width+height, finds the single utility covering both (`size-10`), and\n // replaces the `h-10`+`w-10` pair with it. `bg-red-200` is preserved.\n before: '<div className=\"h-10 w-10 bg-red-200\">box</div>',\n after: '<div className=\"bg-red-200 size-10\">box</div>',\n },\n ],\n // Width and height differ → no equal-axis collapse.\n noMatch: ['<div className=\"h-10 w-20 bg-red-200\">box</div>'],\n },\n});\n","/**\n * AUTO-GENERATED by `scripts/gen-registry.mjs` — DO NOT EDIT BY HAND.\n *\n * Regenerate with `npm run generate` (also runs automatically before build/typecheck/test).\n * Patterns are discovered by the `*.pattern.ts` file convention under `src/library/flatten`\n * and `src/library/compress`; the array below is sorted flatten-before-compress.\n */\n\nimport type { Pattern } from '@domflax/core';\n\nimport { displayContentsWrapper } from './library/flatten/display-contents-wrapper.pattern';\nimport { emptyStyleDiv } from './library/flatten/empty-style-div.pattern';\nimport { flexCenterWrapper } from './library/flatten/flex-center-wrapper.pattern';\nimport { inlineFlexCenterWrapper } from './library/flatten/inline-flex-center-wrapper.pattern';\nimport { nestedFlexMerge } from './library/flatten/nested-flex-merge.pattern';\nimport { nestedGridMerge } from './library/flatten/nested-grid-merge.pattern';\nimport { passthroughWrapper } from './library/flatten/passthrough-wrapper.pattern';\nimport { redundantFragment } from './library/flatten/redundant-fragment.pattern';\nimport { redundantInlineWrapper } from './library/flatten/redundant-inline-wrapper.pattern';\nimport { borderRadiusShorthand } from './library/compress/border-radius-shorthand.pattern';\nimport { borderShorthand } from './library/compress/border-shorthand.pattern';\nimport { dedupeClasses } from './library/compress/dedupe-classes.pattern';\nimport { gapShorthand } from './library/compress/gap-shorthand.pattern';\nimport { insetShorthand } from './library/compress/inset-shorthand.pattern';\nimport { marginShorthand } from './library/compress/margin-shorthand.pattern';\nimport { overflowShorthand } from './library/compress/overflow-shorthand.pattern';\nimport { overscrollBehaviorShorthand } from './library/compress/overscroll-behavior-shorthand.pattern';\nimport { paddingShorthand } from './library/compress/padding-shorthand.pattern';\nimport { placeShorthand } from './library/compress/place-shorthand.pattern';\nimport { scrollMarginShorthand } from './library/compress/scroll-margin-shorthand.pattern';\nimport { scrollPaddingShorthand } from './library/compress/scroll-padding-shorthand.pattern';\nimport { sizeShorthand } from './library/compress/size-shorthand.pattern';\n\nexport {\n displayContentsWrapper,\n emptyStyleDiv,\n flexCenterWrapper,\n inlineFlexCenterWrapper,\n nestedFlexMerge,\n nestedGridMerge,\n passthroughWrapper,\n redundantFragment,\n redundantInlineWrapper,\n borderRadiusShorthand,\n borderShorthand,\n dedupeClasses,\n gapShorthand,\n insetShorthand,\n marginShorthand,\n overflowShorthand,\n overscrollBehaviorShorthand,\n paddingShorthand,\n placeShorthand,\n scrollMarginShorthand,\n scrollPaddingShorthand,\n sizeShorthand,\n};\n\n/** Every built-in pattern, in registration order (flatten patterns before compress). */\nexport const builtinPatterns: readonly Pattern[] = [\n displayContentsWrapper,\n emptyStyleDiv,\n flexCenterWrapper,\n inlineFlexCenterWrapper,\n nestedFlexMerge,\n nestedGridMerge,\n passthroughWrapper,\n redundantFragment,\n redundantInlineWrapper,\n borderRadiusShorthand,\n borderShorthand,\n dedupeClasses,\n gapShorthand,\n insetShorthand,\n marginShorthand,\n overflowShorthand,\n overscrollBehaviorShorthand,\n paddingShorthand,\n placeShorthand,\n scrollMarginShorthand,\n scrollPaddingShorthand,\n sizeShorthand,\n];\n\nexport default builtinPatterns;\n","/**\n * @domflax/resolver-tailwind — tiny dependency-free hash for cache-busting fingerprints.\n */\n\n/** Tiny, dependency-free FNV-1a string hash (hex). Used to derive the cache-busting fingerprint. */\nexport function fnv1a(input: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < input.length; i += 1) {\n h ^= input.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return (h >>> 0).toString(16).padStart(8, '0');\n}\n","/**\n * @domflax/resolver-tailwind — emit-side shorthand expansion + residual synthesis.\n */\n\nimport type {\n CssProperty,\n EmitContext,\n StyleBlock,\n StyleDecl,\n StyleMap,\n SyntheticClass,\n} from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\nimport { normalizer } from '@domflax/pattern-kit';\n\nimport { fnv1a } from './fingerprint';\n\n/**\n * Expand a single computed declaration into the canonical LONGHAND `[property, value]` pairs the\n * reverse index is keyed on. The shared normalizer already expands the physical box shorthands\n * (`padding`/`margin`/`inset`/`border-*`); we additionally expand the few logical shorthands the\n * compress passes synthesize that the normalizer leaves intact (`size`, `inset-block`,\n * `inset-inline`). Values are re-canonicalized via the normalizer so they match the index exactly.\n */\nexport function expandForEmit(\n norm: { normalizeDeclaration: typeof normalizer.normalizeDeclaration },\n prop: string,\n value: string,\n important: boolean,\n): Array<readonly [CssProperty, string]> {\n const pairsFor = (p: string, v: string): Array<readonly [CssProperty, string]> =>\n norm.normalizeDeclaration(p, v, important).map((d) => [d.property, String(d.value)] as const);\n\n if (prop === 'size') {\n return [...pairsFor('width', value), ...pairsFor('height', value)];\n }\n if (prop === 'inset-block' || prop === 'inset-inline') {\n const parts = value.split(/\\s+/).filter((s) => s.length > 0);\n const a = parts[0] ?? value;\n const b = parts[1] ?? a;\n const sides = prop === 'inset-block' ? (['top', 'bottom'] as const) : (['left', 'right'] as const);\n return [...pairsFor(sides[0], a), ...pairsFor(sides[1], b)];\n }\n return pairsFor(prop, value);\n}\n\n/** Build a residual {@link SyntheticClass} for declarations no utility covered; `null` on failure. */\nexport function synthesizeResidual(\n remaining: ReadonlyMap<CssProperty, string>,\n ctx: EmitContext,\n): SyntheticClass | undefined {\n if (remaining.size === 0) return undefined;\n const norm = ctx.normalizer ?? normalizer;\n const decls = new Map<CssProperty, StyleDecl>();\n for (const [prop, value] of remaining) {\n for (const decl of norm.normalizeDeclaration(String(prop), value, false)) {\n decls.set(decl.property, decl);\n }\n }\n const block: StyleBlock = { condition: BASE_CONDITION, decls };\n const styleMap: StyleMap = { blocks: new Map([[conditionKey(BASE_CONDITION), block]]) };\n const css = [...remaining].map(([p, v]) => `${p}:${v}`).join(';');\n const className = `df-${fnv1a(css)}`;\n const synthetic: SyntheticClass = { className, decls: styleMap, css: `.${className}{${css}}` };\n try {\n ctx.sink.register(synthetic);\n } catch {\n /* a sink that rejects registration must not break emit */\n }\n return synthetic;\n}\n","/**\n * @domflax/resolver-tailwind — engine loading (synchronous v3 internals).\n *\n * The forward/reverse engine lives in tailwindcss' CommonJS internals. We load them through\n * `createRequire` (rather than `import`) so the exact same code path works whether this module is\n * bundled to ESM or CJS, and so the untyped internal subpaths don't need ambient declarations.\n *\n * CRITICAL (bundling): tailwindcss must be resolved from the CONSUMER'S project, NOT from the file\n * this module happens to live in. When `domflax` inlines this resolver into its own bundle\n * (`noExternal: [/^@domflax\\//]`), a require based on the bundle's location (`__filename`) would\n * look for `tailwindcss` next to `domflax/dist`, where it does not exist — so the engine silently\n * failed to load and `emit`'s reverse index came up empty. Instead we root the require in the user's\n * project (an explicit project root, then `process.cwd()`), exactly how prettier-plugin-tailwindcss\n * and the Tailwind IntelliSense engine locate a project's Tailwind. The bundle/source location is\n * kept only as a last-resort fallback (covers the non-bundled / in-repo dev case). The first base\n * from which `tailwindcss/package.json` resolves wins.\n */\n\nimport { createRequire } from 'node:module';\nimport * as path from 'node:path';\n\nimport type { TailwindResolverConfig } from './config';\nimport type { TwContext, TwEngine, TwNode } from './types';\n\n/**\n * This module's own location, used as a last-resort require base. esbuild substitutes a real\n * `__filename` in a CJS bundle; in an ESM bundle `__filename` is undefined and we fall back to\n * `import.meta.url` (a `file://` URL, which `createRequire` accepts).\n */\nfunction moduleBase(): string {\n return typeof __filename === 'string' ? __filename : import.meta.url;\n}\n\n/**\n * Build a `require` rooted in the consumer's project so engine resolution is independent of where\n * this (possibly bundled) module physically lives. Returns `null` if `tailwindcss` resolves from no\n * candidate base.\n */\nfunction projectRequire(projectRoot?: string): NodeRequire | null {\n const bases: string[] = [];\n // A real file name is irrelevant — `createRequire` only uses the containing directory for\n // resolution; the file need not exist.\n if (projectRoot) bases.push(path.join(projectRoot, '__domflax__.js'));\n bases.push(path.join(process.cwd(), '__domflax__.js'));\n bases.push(moduleBase());\n for (const base of bases) {\n try {\n const candidate = createRequire(base);\n candidate.resolve('tailwindcss/package.json');\n return candidate;\n } catch {\n /* try the next base */\n }\n }\n return null;\n}\n\n/** Build a synchronous Tailwind v3 engine for the given resolved config; returns `null` on failure. */\nexport function loadEngine(options: TailwindResolverConfig): TwEngine | null {\n const req = projectRequire(options.projectRoot);\n if (!req) return null;\n try {\n const resolveConfig = req('tailwindcss/resolveConfig.js') as (c: unknown) => unknown;\n const { createContext } = req('tailwindcss/lib/lib/setupContextUtils.js') as {\n createContext: (config: unknown) => TwContext;\n };\n const { generateRules } = req('tailwindcss/lib/lib/generateRules.js') as {\n generateRules: (candidates: Set<string>, context: TwContext) => Array<[number, TwNode]>;\n };\n const pkg = req('tailwindcss/package.json') as { version: string };\n\n let userConfig: unknown = options.config ?? { content: [{ raw: '' }] };\n if (options.configPath !== undefined) {\n const loadConfig = req('tailwindcss/loadConfig.js') as (p: string) => unknown;\n userConfig = loadConfig(options.configPath);\n }\n const resolved = resolveConfig(userConfig);\n const context = createContext(resolved);\n\n return {\n version: pkg.version,\n context,\n generate(candidates: readonly string[]): TwNode[] {\n const rules = generateRules(new Set(candidates), context);\n return rules.map(([, node]) => node);\n },\n };\n } catch {\n return null;\n }\n}\n","/**\n * @domflax/resolver-tailwind — selector / condition parsing.\n */\n\nimport type { StyleCondition } from '@domflax/core';\n\n/** Pseudo-elements that Tailwind may emit with a legacy single colon. */\nconst LEGACY_PSEUDO_ELEMENTS = new Set([\n ':before',\n ':after',\n ':first-line',\n ':first-letter',\n]);\n\nexport type ParsedSelector =\n | { readonly kind: 'simple'; readonly states: readonly string[]; readonly pseudoElement: string }\n | { readonly kind: 'complex' };\n\n/**\n * Parse a generated selector into a {@link StyleCondition} fragment. Accepts ONLY a single class\n * selector optionally followed by pseudo-class / pseudo-element parts (`.x`, `.x:hover`,\n * `.x::before`, `.x:focus:hover`). Anything with a combinator, a second compound class, an attribute\n * selector, or a selector list is `complex` (⇒ opaque) because its declarations do not apply to the\n * element's own box.\n */\nexport function parseSelector(selector: string): ParsedSelector {\n const sel = selector.trim();\n if (sel.length === 0 || sel[0] !== '.') return { kind: 'complex' };\n\n // Consume the class identifier, honoring CSS backslash escapes (`\\:`, `\\/`, `\\[`, …).\n let i = 1;\n for (; i < sel.length; i += 1) {\n const c = sel[i]!;\n if (c === '\\\\') {\n i += 1; // skip the escaped char\n continue;\n }\n if (c === ':' || c === '.' || c === '[' || c === ' ' || c === '>' || c === '+' || c === '~' || c === ',') {\n break;\n }\n }\n\n const remainder = sel.slice(i);\n if (remainder.length === 0) {\n return { kind: 'simple', states: [], pseudoElement: '' };\n }\n // The remainder must be EXCLUSIVELY pseudo parts — no combinator / compound / attribute follows.\n if (!/^(?:::?[-a-z]+(?:\\([^()]*\\))?)+$/i.test(remainder)) {\n return { kind: 'complex' };\n }\n\n const parts = remainder.match(/::?[-a-z]+(?:\\([^()]*\\))?/gi) ?? [];\n const states: string[] = [];\n let pseudoElement = '';\n for (const part of parts) {\n if (part.startsWith('::') || LEGACY_PSEUDO_ELEMENTS.has(part)) {\n pseudoElement = part.startsWith('::') ? part : `:${part}`;\n } else {\n states.push(part);\n }\n }\n return { kind: 'simple', states, pseudoElement };\n}\n\nexport function makeCondition(media: string, states: readonly string[], pseudoElement: string): StyleCondition {\n return {\n media,\n states: [...new Set(states)].sort(),\n pseudoElement,\n };\n}\n\n/** Recover a class name from a simple `.escaped-class` selector, or `null` if it isn't simple. */\nexport function unescapeClass(selector: string): string | null {\n const sel = selector.trim();\n if (sel[0] !== '.') return null;\n let out = '';\n for (let i = 1; i < sel.length; i += 1) {\n const c = sel[i]!;\n if (c === '\\\\') {\n i += 1;\n if (i < sel.length) out += sel[i];\n continue;\n }\n if (c === ':' || c === '.' || c === '[' || c === ' ' || c === '>' || c === '+' || c === '~' || c === ',') {\n return null; // not a bare single-class selector\n }\n out += c;\n }\n return out.length > 0 ? out : null;\n}\n","/**\n * @domflax/resolver-tailwind — rule extraction (engine nodes → usable blocks).\n */\n\nimport type { OpaqueToken, StyleCondition } from '@domflax/core';\n\nimport { makeCondition, parseSelector } from './selector';\nimport type { TwGeneratedAtRule, TwGeneratedDecl, TwGeneratedRule, TwNode } from './types';\n\nexport interface ExtractedBlock {\n readonly condition: StyleCondition;\n readonly decls: ReadonlyArray<readonly [string, string, boolean]>;\n}\n\nexport interface ExtractedToken {\n /** Usable (BASE + supported-variant) blocks. */\n readonly blocks: readonly ExtractedBlock[];\n /** True if the engine emitted at least one rule for the token (even an opaque one). */\n readonly produced: boolean;\n /** Set when the token only resolves via combinator / unsupported at-rule selectors. */\n readonly opaque?: OpaqueToken;\n}\n\n/** Collect every leaf `rule` node together with the `@media` stack that wraps it. */\nfunction collectRules(\n node: TwNode,\n mediaStack: readonly string[],\n inUnsupportedAtRule: boolean,\n out: Array<{ rule: TwGeneratedRule; media: readonly string[]; unsupported: boolean }>,\n): void {\n if (node.type === 'rule') {\n out.push({ rule: node as TwGeneratedRule, media: mediaStack, unsupported: inUnsupportedAtRule });\n return;\n }\n if (node.type === 'atrule') {\n const at = node as TwGeneratedAtRule;\n const children = at.nodes ?? [];\n if (at.name === 'media') {\n const nextStack = at.params ? [...mediaStack, at.params] : mediaStack;\n for (const child of children) collectRules(child, nextStack, inUnsupportedAtRule, out);\n } else {\n // @supports / @container / etc. — recurse but flag as unsupported (⇒ opaque).\n for (const child of children) collectRules(child, mediaStack, true, out);\n }\n }\n}\n\n/** Extract usable blocks + opacity info for a single candidate token from its generated nodes. */\nexport function extractToken(token: string, nodes: readonly TwNode[]): ExtractedToken {\n if (nodes.length === 0) return { blocks: [], produced: false };\n\n const leaves: Array<{ rule: TwGeneratedRule; media: readonly string[]; unsupported: boolean }> = [];\n for (const node of nodes) collectRules(node, [], false, leaves);\n\n const blocks: ExtractedBlock[] = [];\n let sawComplex = false;\n\n for (const { rule, media, unsupported } of leaves) {\n const parsed = parseSelector(rule.selector);\n if (parsed.kind === 'complex' || unsupported) {\n sawComplex = true;\n continue;\n }\n const decls: Array<readonly [string, string, boolean]> = [];\n for (const child of rule.nodes ?? []) {\n if (child.type !== 'decl') continue; // skip @defaults markers, comments, nested rules\n const d = child as TwGeneratedDecl;\n if (typeof d.value !== 'string') continue;\n decls.push([d.prop, d.value, d.important === true]);\n }\n if (decls.length === 0) continue;\n const mediaQuery = media.join(' and ');\n blocks.push({ condition: makeCondition(mediaQuery, parsed.states, parsed.pseudoElement), decls });\n }\n\n const opaque: OpaqueToken | undefined =\n sawComplex && blocks.length === 0\n ? { token, reason: 'combinator-variant', detail: 'utility targets descendants/siblings, not its own box' }\n : undefined;\n\n return { blocks, produced: true, opaque };\n}\n","/**\n * @domflax/resolver-tailwind — CSS serialization for `cssFor`.\n */\n\nimport type { TwGeneratedAtRule, TwGeneratedDecl, TwGeneratedRule, TwNode } from './types';\n\n/** Serialize one engine-emitted node (rule / atrule / decl) into plain CSS text. */\nexport function serializeCssNode(node: TwNode): string {\n if (node.type === 'decl') {\n const d = node as TwGeneratedDecl;\n if (typeof d.value !== 'string') return '';\n return `${d.prop}:${d.value}${d.important === true ? ' !important' : ''}`;\n }\n if (node.type === 'rule') {\n const r = node as TwGeneratedRule;\n const body = (r.nodes ?? [])\n .map((c) => serializeCssNode(c))\n .filter((s) => s.length > 0)\n .join(';');\n return `${r.selector}{${body}}`;\n }\n if (node.type === 'atrule') {\n const a = node as TwGeneratedAtRule;\n const body = (a.nodes ?? [])\n .map((c) => serializeCssNode(c))\n .filter((s) => s.length > 0)\n .join('');\n return `@${a.name} ${a.params}{${body}}`;\n }\n return '';\n}\n","/**\n * @domflax/resolver-tailwind — StyleMap assembly + provenance helpers.\n */\n\nimport type {\n CssProperty,\n StyleBlock,\n StyleCondition,\n StyleDecl,\n StyleMap,\n StyleOrigin,\n} from '@domflax/core';\nimport { conditionKey, emptyStyleMap } from '@domflax/core';\nimport { normalizer } from '@domflax/pattern-kit';\n\nexport function buildStyleMap(\n blockMaps: Map<string, { condition: StyleCondition; decls: Map<CssProperty, StyleDecl> }>,\n): StyleMap {\n if (blockMaps.size === 0) return emptyStyleMap();\n const blocks = new Map<ReturnType<typeof conditionKey>, StyleBlock>();\n for (const { condition, decls } of blockMaps.values()) {\n if (decls.size === 0) continue;\n blocks.set(conditionKey(condition), { condition, decls });\n }\n if (blocks.size === 0) return emptyStyleMap();\n return normalizer.normalizeStyleMap({ blocks });\n}\n\n/**\n * The shadow chain a newly-winning declaration inherits when it overrides `prev` on the same\n * property: everything `prev` already shadowed, plus `prev`'s own origin (now shadowed too). Deduped\n * by class name and restricted to class origins (the only kind `dedupe-classes` acts on).\n */\nexport function shadowedBy(prev: StyleDecl): readonly StyleOrigin[] | undefined {\n const out: StyleOrigin[] = [];\n const seen = new Set<string>();\n const add = (o: StyleOrigin | undefined): void => {\n if (!o || o.kind !== 'class' || seen.has(o.className)) return;\n seen.add(o.className);\n out.push(o);\n };\n for (const o of prev.shadowed ?? []) add(o);\n add(prev.origin);\n return out.length > 0 ? out : undefined;\n}\n","/**\n * @domflax/resolver-tailwind — conservative {@link SelectorUsage} constants.\n */\n\nimport type { SelectorUsage } from '@domflax/core';\n\n/**\n * A conservative, never-droppable {@link SelectorUsage}. Until a real project selector graph exists\n * we must assume a class could be referenced in any unsafe position, so nothing is safe to rewrite.\n */\nexport const OPAQUE_USAGE: SelectorUsage = {\n asSubject: true,\n asAncestor: true,\n asCompound: true,\n asSibling: true,\n asHasArgument: true,\n asStructural: true,\n droppable: false,\n};\n\n/**\n * A plain-subject {@link SelectorUsage}: the class is a resolver-owned, base-only utility whose\n * whole effect is reproducible from `computed`, so it is safe to drop/replace during reverse-emit.\n */\nexport const DROPPABLE_USAGE: SelectorUsage = {\n asSubject: true,\n asAncestor: false,\n asCompound: false,\n asSibling: false,\n asHasArgument: false,\n asStructural: false,\n droppable: true,\n};\n","/**\n * @domflax/resolver-tailwind — the {@link StyleResolver} implementation + public factory.\n */\n\nimport type {\n CssProperty,\n EmitContext,\n EmitResult,\n OpaqueToken,\n ResolveInput,\n ResolveResult,\n SelectorUsage,\n StyleCondition,\n StyleDecl,\n StyleMap,\n StyleOrigin,\n StyleResolver,\n} from '@domflax/core';\nimport { BASE_CONDITION, conditionKey } from '@domflax/core';\nimport { normalizer } from '@domflax/pattern-kit';\n\nimport type { TailwindResolverConfig } from './config';\nimport { expandForEmit, synthesizeResidual } from './emit';\nimport { loadEngine } from './engine';\nimport type { ExtractedToken } from './extract';\nimport { extractToken } from './extract';\nimport { fnv1a } from './fingerprint';\nimport { parseSelector, unescapeClass } from './selector';\nimport { serializeCssNode } from './serialize';\nimport { buildStyleMap, shadowedBy } from './stylemap';\nimport type { TwEngine, TwGeneratedDecl, TwGeneratedRule } from './types';\nimport { DROPPABLE_USAGE, OPAQUE_USAGE } from './usage';\n\nclass TailwindResolver implements StyleResolver {\n readonly id = 'tailwind';\n readonly provider: string;\n readonly fingerprint: string;\n\n readonly #engine: TwEngine | null;\n /** Per-token extraction cache (engine output is pure for a fixed config). */\n readonly #tokenCache = new Map<string, ExtractedToken>();\n /** Per-class-set forward-resolution cache. */\n readonly #resolveCache = new Map<string, ResolveResult>();\n /** Lazily built reverse index for {@link emit}. */\n #reverseIndex: ReadonlyArray<readonly [string, ReadonlyMap<CssProperty, string>]> | null = null;\n\n constructor(config: TailwindResolverConfig = {}) {\n this.#engine = loadEngine(config);\n this.provider =\n config.provider ?? (this.#engine ? `tailwindcss@${this.#engine.version}` : 'tailwindcss');\n const seed = JSON.stringify(config.config ?? {}) + (config.configPath ?? '');\n this.fingerprint = config.fingerprint ?? `${this.provider}/${fnv1a(seed)}`;\n }\n\n /** Engine-backed, cached single-token extraction. */\n #extract(token: string): ExtractedToken {\n const cached = this.#tokenCache.get(token);\n if (cached) return cached;\n let result: ExtractedToken;\n if (!this.#engine) {\n result = { blocks: [], produced: false };\n } else {\n try {\n result = extractToken(token, this.#engine.generate([token]));\n } catch {\n result = { blocks: [], produced: false };\n }\n }\n this.#tokenCache.set(token, result);\n return result;\n }\n\n owns(token: string): boolean {\n if (token.length === 0) return false;\n return this.#extract(token).produced;\n }\n\n resolve(input: ResolveInput): ResolveResult {\n const key = JSON.stringify(input.classes);\n const cached = this.#resolveCache.get(key);\n if (cached) return cached;\n\n // condition-key → { condition, longhand decls }. Iterating classes in source order means later\n // utilities overwrite earlier ones on the same property (equal-specificity cascade).\n const blockMaps = new Map<\n string,\n { condition: StyleCondition; decls: Map<CssProperty, StyleDecl> }\n >();\n const resolved: string[] = [];\n const unknown: string[] = [];\n const opaque: OpaqueToken[] = [];\n\n input.classes.forEach((token, tokenIndex) => {\n const extracted = this.#extract(token);\n if (!extracted.produced) {\n unknown.push(token);\n return;\n }\n if (extracted.opaque) opaque.push(extracted.opaque);\n if (extracted.blocks.length === 0) return; // produced only opaque rules\n\n const origin: StyleOrigin = { kind: 'class', tokenIndex, className: token };\n let contributed = false;\n for (const block of extracted.blocks) {\n const ck = conditionKey(block.condition);\n let bucket = blockMaps.get(ck);\n if (!bucket) {\n bucket = { condition: block.condition, decls: new Map() };\n blockMaps.set(ck, bucket);\n }\n for (const [prop, value, important] of block.decls) {\n for (const decl of normalizer.normalizeDeclaration(prop, value, important)) {\n // Record provenance: a LATER token on the same property shadows the earlier one. The\n // overridden origin (plus anything it already shadowed) is carried in `shadowed`, which\n // is exactly what the `dedupe-classes` pattern reads to find fully-overridden tokens.\n // This only enriches decl metadata — the resolved VALUES are unchanged.\n const prev = bucket.decls.get(decl.property);\n const shadowed = prev ? shadowedBy(prev) : undefined;\n bucket.decls.set(decl.property, shadowed ? { ...decl, origin, shadowed } : { ...decl, origin });\n contributed = true;\n }\n }\n }\n if (contributed) resolved.push(token);\n });\n\n const result: ResolveResult = {\n styles: buildStyleMap(blockMaps),\n resolved,\n unknown,\n opaque,\n warnings: [],\n };\n this.#resolveCache.set(key, result);\n return result;\n }\n\n /**\n * Lazily build the reverse index from the engine's own enumerable class list. Each indexable\n * utility maps to its NORMALIZED BASE longhand declarations (property → canonical value). Utilities\n * with variant conditions, combinator selectors, or no BASE declarations are skipped. Sorted by\n * declaration count (desc) so greedier (shorthand-like) utilities are tried first.\n */\n #buildReverseIndex(): ReadonlyArray<readonly [string, ReadonlyMap<CssProperty, string>]> {\n if (this.#reverseIndex) return this.#reverseIndex;\n const index: Array<readonly [string, Map<CssProperty, string>]> = [];\n if (this.#engine) {\n try {\n const classes = this.#engine.context\n .getClassList()\n .filter((c): c is string => typeof c === 'string');\n const nodes = this.#engine.generate(classes);\n // Re-extract per class would be costly; instead group decls by their (single) class selector.\n for (const node of nodes) {\n if (node.type !== 'rule') continue; // skip @media / @keyframes wrappers (⇒ variants only)\n const rule = node as TwGeneratedRule;\n const parsed = parseSelector(rule.selector);\n if (parsed.kind !== 'simple' || parsed.states.length > 0 || parsed.pseudoElement !== '') {\n continue; // BASE-only\n }\n const className = unescapeClass(rule.selector);\n if (className === null) continue;\n const decls = new Map<CssProperty, string>();\n for (const child of rule.nodes ?? []) {\n if (child.type !== 'decl') continue;\n const d = child as TwGeneratedDecl;\n if (typeof d.value !== 'string') continue;\n for (const decl of normalizer.normalizeDeclaration(d.prop, d.value, d.important === true)) {\n decls.set(decl.property, String(decl.value));\n }\n }\n if (decls.size > 0) index.push([className, decls]);\n }\n } catch {\n /* leave index empty on failure — emit degrades to a no-op */\n }\n }\n index.sort((a, b) => b[1].size - a[1].size || (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0));\n this.#reverseIndex = index;\n return index;\n }\n\n emit(styles: StyleMap, ctx: EmitContext): EmitResult {\n const norm = ctx.normalizer ?? normalizer;\n const normalized = norm.normalizeStyleMap(styles);\n const base = normalized.blocks.get(conditionKey(BASE_CONDITION));\n if (!base || base.decls.size === 0) return { classes: [], exact: true, warnings: [] };\n\n // Only the BASE block is reverse-synthesized (see module LIMITATION). Any non-base condition\n // present in the target means we cannot be exact.\n const hasNonBase = normalized.blocks.size > 1;\n\n // The target longhand map. The IR's compress passes hand us SHORTHAND properties (`padding`,\n // `margin`, `inset`, `inset-block`, `inset-inline`, `size`); we expand them to the same longhand\n // basis the reverse index is keyed on, so a single shorthand utility (`p-4`, `size-4`, `inset-0`)\n // can cover them.\n const target = new Map<CssProperty, string>();\n for (const [prop, decl] of base.decls) {\n for (const [lp, lv] of expandForEmit(norm, String(prop), String(decl.value), decl.important)) {\n target.set(lp, lv);\n }\n }\n\n // Keep only utilities every one of whose declarations matches the target (an exact-fit subset);\n // emitting a utility that sets an unwanted property/value would change the computed style.\n const candidates: Array<readonly [string, ReadonlyMap<CssProperty, string>]> = [];\n for (const entry of this.#buildReverseIndex()) {\n const [, declMap] = entry;\n if (declMap.size === 0 || declMap.size > target.size) continue;\n let fits = true;\n for (const [prop, value] of declMap) {\n if (target.get(prop) !== value) {\n fits = false;\n break;\n }\n }\n if (fits) candidates.push(entry);\n }\n\n // Greedy set-cover: repeatedly take the candidate covering the MOST still-needed declarations,\n // so a shorthand (`p-4`, 4 decls) beats `px-4`+`py-4`. Ties break toward the tighter decl-set\n // then lexicographically, for deterministic output.\n const remaining = new Map(target);\n const classes: string[] = [];\n while (remaining.size > 0) {\n let best: readonly [string, ReadonlyMap<CssProperty, string>] | null = null;\n let bestCover = 0;\n for (const entry of candidates) {\n const [token, declMap] = entry;\n let cover = 0;\n for (const prop of declMap.keys()) if (remaining.has(prop)) cover += 1;\n if (cover === 0) continue;\n const better =\n best === null ||\n cover > bestCover ||\n (cover === bestCover && declMap.size < best[1].size) ||\n (cover === bestCover && declMap.size === best[1].size && token < best[0]);\n if (better) {\n best = entry;\n bestCover = cover;\n }\n }\n if (!best) break; // nothing covers any still-needed declaration → residual\n classes.push(best[0]);\n for (const prop of best[1].keys()) remaining.delete(prop);\n }\n\n const exact = remaining.size === 0 && !hasNonBase;\n if (remaining.size === 0) return { classes, exact, warnings: [] };\n\n // Surface what no utility could cover as a residual synthetic (never thrown, never invented).\n const residual = synthesizeResidual(remaining, ctx);\n return residual\n ? { classes, residual, exact, warnings: [] }\n : { classes, exact, warnings: [] };\n }\n\n /**\n * Generate a CSS stylesheet that defines `classes`, so a verifier can render a subtree with the\n * real Tailwind styling applied. Backed by the same engine `resolve` uses (`generate(candidates)`),\n * serialized to plain CSS. Returns `''` when the engine is unavailable or generates nothing.\n */\n cssFor(classes: readonly string[]): string {\n if (!this.#engine) return '';\n const tokens = [...new Set(classes)].filter((c) => c.length > 0);\n if (tokens.length === 0) return '';\n try {\n return this.#engine\n .generate(tokens)\n .map((n) => serializeCssNode(n))\n .filter((s) => s.length > 0)\n .join('\\n');\n } catch {\n return '';\n }\n }\n\n selectorUsage(token: string): SelectorUsage {\n // No project selector graph yet, so we cannot know how a CUSTOM (non-Tailwind) class is\n // referenced — treat it as load-bearing (preserved verbatim). A resolver-OWNED utility, by\n // contrast, is safe to drop/replace iff its whole effect is reproducible from `computed`: it\n // must be a plain (non-opaque) utility contributing ONLY base-condition declarations. Opaque\n // (combinator/at-rule) and variant-bound utilities are kept, because `emit` cannot rebuild them.\n const ex = this.#extract(token);\n if (!ex.produced || ex.opaque) return OPAQUE_USAGE;\n const baseOnly =\n ex.blocks.length > 0 &&\n ex.blocks.every((b) => conditionKey(b.condition) === conditionKey(BASE_CONDITION));\n if (!baseOnly) return OPAQUE_USAGE;\n return DROPPABLE_USAGE;\n }\n}\n\n/** Factory: build a Tailwind-backed {@link StyleResolver}. */\nexport function createTailwindResolver(config?: TailwindResolverConfig): StyleResolver {\n return new TailwindResolver(config);\n}\n","/* ────────────────────────────────────────────────────────────────────────── *\n * Resolver identity + selector classification constants\n * ────────────────────────────────────────────────────────────────────────── */\n\n/** Stable resolver id surfaced on {@link StyleResolver.id}. */\nexport const CSS_RESOLVER_ID = 'css';\n\n/** Provider tag surfaced on {@link StyleResolver.provider}. */\nexport const CSS_RESOLVER_PROVIDER = 'custom-css';\n\n/** Version stamp for the index/cascade machinery; bump when its semantics change (cache-busting). */\nexport const ENGINE_VERSION = 'css-index@1';\n\n/** Structural pseudo-classes — their presence makes a class structurally targeted (review-1 blocker). */\nexport const STRUCTURAL_PSEUDOS: ReadonlySet<string> = new Set([\n ':nth-child',\n ':nth-last-child',\n ':first-child',\n ':last-child',\n ':only-child',\n ':nth-of-type',\n ':nth-last-of-type',\n ':first-of-type',\n ':last-of-type',\n ':only-of-type',\n]);\n\n/** Functional pseudos whose argument is itself a selector list — opaque to forward resolution. */\nexport const FUNCTIONAL_PSEUDOS: ReadonlySet<string> = new Set([\n ':not',\n ':is',\n ':where',\n ':has',\n ':matches',\n]);\n\n/** Legacy single-colon pseudo-ELEMENTS that the parser may not flag via `isPseudoElement`. */\nexport const LEGACY_PSEUDO_ELEMENTS: ReadonlySet<string> = new Set([\n ':before',\n ':after',\n ':first-line',\n ':first-letter',\n]);\n","import { createRequire } from 'node:module';\nimport * as path from 'node:path';\nimport type { Root as PostcssRoot } from 'postcss';\nimport type selectorParser from 'postcss-selector-parser';\n\n/* ────────────────────────────────────────────────────────────────────────── *\n * Lazy engine loading (postcss + postcss-selector-parser)\n * ────────────────────────────────────────────────────────────────────────── *\n *\n * postcss and postcss-selector-parser are OPTIONAL peers of the published `domflax` package: a\n * Tailwind-only user need not install them. They must therefore be loaded LAZILY (only when this\n * resolver is actually constructed) and from the CONSUMER'S project — never via a static top-level\n * `import`, which would (a) crash on module load for a postcss-less install and (b), once this\n * resolver is inlined into domflax's bundle, resolve relative to `domflax/dist` instead of the\n * user's project. We root the require in `process.cwd()` (or an explicit project root), exactly as\n * the Tailwind resolver does, with the bundle/source location as a last-resort fallback.\n */\n\n/** This module's own location — esbuild fills `__filename` in CJS; ESM falls back to `import.meta.url`. */\nexport function moduleBase(): string {\n return typeof __filename === 'string' ? __filename : import.meta.url;\n}\n\n/** The single postcss entry point this resolver calls at runtime. */\nexport type PostcssParseApi = (css: string, opts?: { from?: string }) => PostcssRoot;\n\n/** The subset of the postcss-selector-parser API this resolver calls at runtime (guards preserve narrowing). */\nexport interface SelectorParserApi {\n (): { astSync(selector: string): selectorParser.Root };\n isClassName(n: selectorParser.Node): n is selectorParser.ClassName;\n isTag(n: selectorParser.Node): n is selectorParser.Tag;\n isIdentifier(n: selectorParser.Node): n is selectorParser.Identifier;\n isAttribute(n: selectorParser.Node): n is selectorParser.Attribute;\n isUniversal(n: selectorParser.Node): n is selectorParser.Universal;\n isNesting(n: selectorParser.Node): n is selectorParser.Nesting;\n isPseudo(n: selectorParser.Node): n is selectorParser.Pseudo;\n isPseudoClass(n: selectorParser.Node): n is selectorParser.Pseudo;\n isPseudoElement(n: selectorParser.Node): n is selectorParser.Pseudo;\n isCombinator(n: selectorParser.Node): n is selectorParser.Combinator;\n}\n\nexport interface PostcssEngine {\n readonly parse: PostcssParseApi;\n readonly selectorParser: SelectorParserApi;\n}\n\n/** Resolve postcss + postcss-selector-parser from the consumer's project; `null` if unavailable. */\nexport function loadPostcssEngine(projectRoot?: string): PostcssEngine | null {\n const bases: string[] = [];\n if (projectRoot) bases.push(path.join(projectRoot, '__domflax__.js'));\n bases.push(path.join(process.cwd(), '__domflax__.js'));\n bases.push(moduleBase());\n for (const base of bases) {\n try {\n const req = createRequire(base);\n req.resolve('postcss');\n req.resolve('postcss-selector-parser');\n const postcss = req('postcss') as { parse: PostcssParseApi };\n const raw = req('postcss-selector-parser') as SelectorParserApi & { default?: SelectorParserApi };\n // postcss-selector-parser is CJS with a default export under interop; accept both shapes.\n const selector = raw.default ?? raw;\n return { parse: postcss.parse, selectorParser: selector };\n } catch {\n /* try the next base */\n }\n }\n return null;\n}\n\n/* ────────────────────────────────────────────────────────────────────────── *\n * Lazily-loaded postcss engine (module singleton)\n * ────────────────────────────────────────────────────────────────────────── */\n\n/** Runtime postcss `parse`, populated on first resolver construction. */\nexport let pc: PostcssParseApi | null = null;\n/** Runtime postcss-selector-parser, populated on first resolver construction. */\nexport let sp: SelectorParserApi | null = null;\n\n/** Ensure the postcss engine is loaded; throws a clear error if the optional peers are absent. */\nexport function ensurePostcss(projectRoot?: string): void {\n if (pc && sp) return;\n const engine = loadPostcssEngine(projectRoot);\n if (!engine) {\n throw new Error(\n '@domflax/resolver-css requires \"postcss\" and \"postcss-selector-parser\" to be installed in ' +\n 'your project (they are optional peer dependencies of domflax, loaded only when the custom-CSS ' +\n 'provider is used). Install them with: npm install postcss postcss-selector-parser',\n );\n }\n pc = engine.parse;\n sp = engine.selectorParser;\n}\n","import type { AtRule, Rule } from 'postcss';\nimport type { RawDecl } from './types';\n\n/* ────────────────────────────────────────────────────────────────────────── *\n * postcss helpers\n * ────────────────────────────────────────────────────────────────────────── */\n\ninterface MediaContext {\n readonly media: string;\n /** True when the rule lives under an at-rule that is not a style context (keyframes/font-face). */\n readonly skip: boolean;\n}\n\n/** Walk a rule's at-rule ancestry, collecting `@media` params and detecting non-style contexts. */\nexport function mediaContext(rule: Rule): MediaContext {\n const parts: string[] = [];\n let skip = false;\n let parent = rule.parent;\n while (parent && parent.type === 'atrule') {\n const at = parent as AtRule;\n const name = at.name.toLowerCase();\n if (name === 'media') parts.unshift(at.params.trim().replace(/\\s+/g, ' '));\n else if (name === 'keyframes' || name.endsWith('keyframes') || name === 'font-face') skip = true;\n parent = parent.parent;\n }\n return { media: parts.join(' and '), skip };\n}\n\n/** A rule's direct declarations, in source order, as raw `[prop, value, important]` triples. */\nexport function collectDecls(rule: Rule): RawDecl[] {\n const out: RawDecl[] = [];\n for (const node of rule.nodes) {\n if (node.type === 'decl') out.push([node.prop, node.value, node.important === true]);\n }\n return out;\n}\n","import { readFileSync } from 'node:fs';\nimport { ENGINE_VERSION } from './constants';\nimport type { CssFile } from './types';\n\n/* ────────────────────────────────────────────────────────────────────────── *\n * Misc helpers\n * ────────────────────────────────────────────────────────────────────────── */\n\n/** Cheap, allocation-free CSS-identifier check used by {@link CustomCSSResolver.owns}. */\nexport function isPlainClassToken(token: string): boolean {\n return token.length > 0 && !/[\\s.#>+~:[\\]()]/.test(token);\n}\n\n/** Read a CSS file from disk; surfaces unreadable paths as a clear input error. */\nexport function readCssPath(path: string): CssFile {\n try {\n return { id: path, css: readFileSync(path, 'utf8') };\n } catch (cause) {\n throw new Error(`resolver-css: cannot read CSS file \"${path}\"`, { cause });\n }\n}\n\n/**\n * Derive a deterministic fingerprint from the provider tag, engine version, and each file's id +\n * length. Cheap and good enough to bust downstream caches when the source CSS set changes.\n */\nexport function deriveFingerprint(provider: string, files: readonly CssFile[]): string {\n const parts = files.map((f) => `${f.id}:${f.css.length}`).sort();\n return `${provider}/${ENGINE_VERSION}::${parts.join('|')}`;\n}\n","import type selectorParser from 'postcss-selector-parser';\nimport { LEGACY_PSEUDO_ELEMENTS } from './constants';\nimport { sp } from './engine';\n\n/* ────────────────────────────────────────────────────────────────────────── *\n * Selector helpers\n * ────────────────────────────────────────────────────────────────────────── */\n\nexport interface Compound {\n /** The combinator immediately to this compound's LEFT (`null` for the first compound). */\n readonly leftCombinator: string | null;\n readonly nodes: readonly selectorParser.Node[];\n}\n\n/** Split a selector's flat node list into compounds delimited by combinator nodes. */\nexport function splitCompounds(selector: selectorParser.Selector): Compound[] {\n const compounds: Compound[] = [];\n let current: selectorParser.Node[] = [];\n let leftCombinator: string | null = null;\n for (const node of selector.nodes) {\n if (sp!.isCombinator(node)) {\n compounds.push({ leftCombinator, nodes: current });\n current = [];\n leftCombinator = combinatorValue(node);\n } else {\n current.push(node);\n }\n }\n compounds.push({ leftCombinator, nodes: current });\n return compounds;\n}\n\n/** A combinator's normalized value — descendant combinators are a single space. */\nfunction combinatorValue(node: selectorParser.Combinator): string {\n const v = node.value;\n return v.trim() === '' ? ' ' : v.trim();\n}\n\n/** The pseudo's lower-cased name including its leading colon(s), without any argument. */\nexport function pseudoName(node: selectorParser.Pseudo): string {\n return node.value.toLowerCase();\n}\n\nexport function isPseudoElement(node: selectorParser.Pseudo): boolean {\n return sp!.isPseudoElement(node) || LEGACY_PSEUDO_ELEMENTS.has(pseudoName(node));\n}\n\n/** Canonicalize a pseudo-element to the modern double-colon form (e.g. `:before` → `::before`). */\nexport function normalizePseudoElement(node: selectorParser.Pseudo): string {\n const name = pseudoName(node);\n return name.startsWith('::') ? name : `::${name.replace(/^:/, '')}`;\n}\n","import type {\n ConditionKey,\n CssProperty,\n EmitContext,\n EmitResult,\n ResolveInput,\n ResolveResult,\n SelectorUsage,\n StyleBlock,\n StyleCondition,\n StyleDecl,\n StyleMap,\n StyleOrigin,\n StyleResolver,\n} from '@domflax/core';\nimport { conditionKey, emptyStyleMap } from '@domflax/core';\nimport { normalizer } from '@domflax/pattern-kit';\nimport type selectorParser from 'postcss-selector-parser';\nimport {\n CSS_RESOLVER_ID,\n CSS_RESOLVER_PROVIDER,\n FUNCTIONAL_PSEUDOS,\n STRUCTURAL_PSEUDOS,\n} from './constants';\nimport { ensurePostcss, pc, sp } from './engine';\nimport { collectDecls, mediaContext } from './postcss-helpers';\nimport { deriveFingerprint, isPlainClassToken, readCssPath } from './misc-helpers';\nimport {\n isPseudoElement,\n normalizePseudoElement,\n pseudoName,\n splitCompounds,\n} from './selector-helpers';\nimport type {\n CssFile,\n CssResolverOptions,\n MutableUsage,\n RawDecl,\n ReverseEntry,\n RuleEntry,\n} from './types';\n\n/* ────────────────────────────────────────────────────────────────────────── *\n * CustomCSSResolver\n * ────────────────────────────────────────────────────────────────────────── */\n\n/**\n * Resolves plain CSS classes against a fixed set of project stylesheets parsed with postcss.\n */\nexport class CustomCSSResolver implements StyleResolver {\n public readonly id: string = CSS_RESOLVER_ID;\n public readonly provider: string = CSS_RESOLVER_PROVIDER;\n public readonly fingerprint: string;\n\n readonly #files: readonly CssFile[];\n /** Forward map: class token → simple-`.class` rule contributions (source order). */\n readonly #classIndex = new Map<string, RuleEntry[]>();\n /** Selector-participation facts per class token. */\n readonly #usage = new Map<string, MutableUsage>();\n /** Every class referenced anywhere in the stylesheets (forward-resolvable or not). */\n readonly #known = new Set<string>();\n /** Distinct COMPLEX selectors (combinator or structural pseudo), sorted. */\n readonly #complex: readonly string[];\n\n #reverse: readonly ReverseEntry[] | null = null;\n\n public constructor(cssFiles: readonly CssFile[] = [], options: CssResolverOptions = {}) {\n ensurePostcss(options.projectRoot);\n const fromDisk = (options.files ?? []).map(readCssPath);\n this.#files = [...cssFiles, ...fromDisk];\n this.fingerprint = options.fingerprint ?? deriveFingerprint(this.provider, this.#files);\n\n const complex = new Set<string>();\n let order = 0;\n for (const file of this.#files) {\n order = this.#indexFile(file, order, complex);\n }\n this.#complex = [...complex].sort();\n }\n\n /** The stylesheets this resolver was constructed with (raw sources + any read from disk). */\n public get files(): readonly CssFile[] {\n return this.#files;\n }\n\n /** Owns any plain class token referenced by one of {@link files}. */\n public owns(token: string): boolean {\n return isPlainClassToken(token) && this.#known.has(token);\n }\n\n public resolve(input: ResolveInput): ResolveResult {\n const styles = this.#resolveTokens(input.classes, input.classes);\n const resolved: string[] = [];\n const unknown: string[] = [];\n for (const token of input.classes) {\n if (this.#classIndex.has(token)) resolved.push(token);\n else unknown.push(token);\n }\n return { styles, resolved, unknown, opaque: [], warnings: [] };\n }\n\n public emit(styles: StyleMap, ctx: EmitContext): EmitResult {\n const norm = ctx.normalizer ?? normalizer;\n const remaining = new Map<string, string>();\n for (const [ck, block] of norm.normalizeStyleMap(styles).blocks) {\n for (const [prop, decl] of block.decls) {\n remaining.set(`${ck} ${prop}`, String(decl.value));\n }\n }\n if (remaining.size === 0) return { classes: [], exact: true, warnings: [] };\n\n const classes: string[] = [];\n // Greedy set-cover: larger classes first so the emitted set stays minimal.\n for (const { token, keyed } of this.#reverseIndex()) {\n let matches = true;\n for (const [key, value] of keyed) {\n if (remaining.get(key) !== value) {\n matches = false;\n break;\n }\n }\n if (!matches) continue;\n classes.push(token);\n for (const key of keyed.keys()) remaining.delete(key);\n if (remaining.size === 0) break;\n }\n\n // Unmatched declarations are left as-is (no synthetic residual) — surfaced via `exact:false`.\n return { classes, exact: remaining.size === 0, warnings: [] };\n }\n\n /**\n * Return a CSS stylesheet defining the given class tokens, so a verifier can render a subtree with\n * the project's real styling applied. The source stylesheets ARE the definition, so we hand back\n * their concatenation verbatim (every relevant rule — including combinator/structural selectors —\n * is preserved). `classes` is accepted for interface parity but the full source is always returned.\n */\n public cssFor(_classes: readonly string[]): string {\n return this.#files.map((f) => f.css).join('\\n');\n }\n\n public selectorUsage(token: string): SelectorUsage {\n const u = this.#usage.get(token);\n if (!u) {\n return {\n asSubject: false,\n asAncestor: false,\n asCompound: false,\n asSibling: false,\n asHasArgument: false,\n asStructural: false,\n droppable: true,\n };\n }\n return {\n asSubject: u.asSubject,\n asAncestor: u.asAncestor,\n asCompound: u.asCompound,\n asSibling: u.asSibling,\n asHasArgument: u.asHasArgument,\n asStructural: u.asStructural,\n // Safe to drop/rename only when every reference is the lone subject of a bare `.x {}`.\n droppable: u.referenced && !u.loadBearing,\n };\n }\n\n /**\n * The distinct COMPLEX selectors found across all stylesheets — anything containing a combinator\n * (descendant / `>` / `+` / `~`) or a structural pseudo (`:nth-child`, `:first-child`, …). Feeds\n * domflax's CSS-selector-safety guard.\n */\n public complexSelectors(): readonly string[] {\n return this.#complex;\n }\n\n /* ─────────────────────────── internals ─────────────────────────── */\n\n /** Parse one stylesheet and fold its rules into the indexes. Returns the advanced order counter. */\n #indexFile(file: CssFile, startOrder: number, complex: Set<string>): number {\n let order = startOrder;\n let root;\n try {\n root = pc!(file.css, { from: file.id });\n } catch {\n // Malformed CSS contributes nothing (never throws — only clear input errors do).\n return order;\n }\n\n root.walkRules((rule) => {\n const media = mediaContext(rule);\n if (media.skip) return; // inside @keyframes / @font-face etc. — not class rules\n const decls = collectDecls(rule);\n\n let ast;\n try {\n ast = sp!().astSync(rule.selector);\n } catch {\n return;\n }\n\n for (const sel of ast.nodes) {\n const thisOrder = order;\n this.#analyzeSelector(sel as selectorParser.Selector, media.media, decls, thisOrder, complex);\n }\n order += 1;\n });\n\n return order;\n }\n\n /** Analyze one comma-segment selector: forward indexing, usage facts, complex detection. */\n #analyzeSelector(\n selector: selectorParser.Selector,\n media: string,\n decls: readonly RawDecl[],\n order: number,\n complex: Set<string>,\n ): void {\n const compounds = splitCompounds(selector);\n let hasCombinator = false;\n let hasStructural = false;\n\n compounds.forEach((compound, index) => {\n const isSubject = index === compounds.length - 1;\n const rightCombinator = index < compounds.length - 1 ? compounds[index + 1]!.leftCombinator : null;\n if (rightCombinator) hasCombinator = true;\n\n const classes = compound.nodes.filter((n) => sp!.isClassName(n));\n const otherSimple = compound.nodes.some(\n (n) =>\n sp!.isTag(n) ||\n sp!.isIdentifier(n) ||\n sp!.isAttribute(n) ||\n sp!.isUniversal(n) ||\n sp!.isNesting(n),\n );\n const pseudos = compound.nodes.filter((n) => sp!.isPseudo(n));\n const structuralPseudo = pseudos.some((p) => STRUCTURAL_PSEUDOS.has(pseudoName(p)));\n const functionalPseudo = pseudos.some((p) => FUNCTIONAL_PSEUDOS.has(pseudoName(p)));\n const statePseudos = pseudos.filter(\n (p) =>\n sp!.isPseudoClass(p) &&\n !STRUCTURAL_PSEUDOS.has(pseudoName(p)) &&\n !FUNCTIONAL_PSEUDOS.has(pseudoName(p)),\n );\n const elementPseudos = pseudos.filter((p) => isPseudoElement(p));\n const qualified = classes.length > 1 || otherSimple || functionalPseudo || statePseudos.length > 0;\n\n if (structuralPseudo) hasStructural = true;\n\n for (const cls of classes) {\n const token = cls.value;\n this.#known.add(token);\n const u = this.#getUsage(token);\n u.referenced = true;\n if (isSubject) u.asSubject = true;\n if (rightCombinator === ' ' || rightCombinator === '>') u.asAncestor = true;\n if (rightCombinator === '+' || rightCombinator === '~') u.asSibling = true;\n if (qualified) u.asCompound = true;\n if (structuralPseudo) u.asStructural = true;\n if (rightCombinator !== null || qualified || structuralPseudo || elementPseudos.length > 0) {\n u.loadBearing = true;\n }\n\n // Forward indexing: a single bare `.class` compound, optionally qualified by state\n // pseudo-classes and/or a pseudo-element, with NO other simple selector and NO\n // structural/functional pseudo and NO combinator on this compound's right edge.\n const forwardEligible =\n compounds.length === 1 &&\n classes.length === 1 &&\n !otherSimple &&\n !structuralPseudo &&\n !functionalPseudo &&\n elementPseudos.length <= 1;\n if (forwardEligible && decls.length > 0) {\n const condition: StyleCondition = {\n media,\n states: statePseudos.map(pseudoName).sort(),\n pseudoElement: elementPseudos.length === 1 ? normalizePseudoElement(elementPseudos[0]!) : '',\n };\n this.#addRuleEntry(token, { order, token, condition, decls });\n }\n }\n\n // Classes nested inside selector-argument pseudos (:has/:is/:where/:not) are references too.\n for (const p of pseudos) {\n const isHas = pseudoName(p) === ':has';\n p.walkClasses((inner) => {\n const token = inner.value;\n this.#known.add(token);\n const u = this.#getUsage(token);\n u.referenced = true;\n u.loadBearing = true;\n if (isHas) u.asHasArgument = true;\n });\n }\n });\n\n if (hasCombinator || hasStructural) {\n complex.add(selector.toString().trim());\n }\n }\n\n #addRuleEntry(token: string, entry: RuleEntry): void {\n const list = this.#classIndex.get(token);\n if (list) list.push(entry);\n else this.#classIndex.set(token, [entry]);\n }\n\n #getUsage(token: string): MutableUsage {\n let u = this.#usage.get(token);\n if (!u) {\n u = {\n referenced: false,\n asSubject: false,\n asAncestor: false,\n asCompound: false,\n asSibling: false,\n asHasArgument: false,\n asStructural: false,\n loadBearing: false,\n };\n this.#usage.set(token, u);\n }\n return u;\n }\n\n /**\n * Resolve a set of tokens into a normalized condition-keyed StyleMap. `tokenList` is the original\n * class list (for per-declaration `tokenIndex` provenance); `request` is the set being resolved.\n */\n #resolveTokens(request: readonly string[], tokenList: readonly string[]): StyleMap {\n const entries: RuleEntry[] = [];\n for (const token of new Set(request)) {\n const list = this.#classIndex.get(token);\n if (list) entries.push(...list);\n }\n if (entries.length === 0) return emptyStyleMap();\n\n // Equal-specificity single-class rules cascade by source order — later wins.\n entries.sort((a, b) => a.order - b.order);\n\n const acc = new Map<ConditionKey, { condition: StyleCondition; decls: Map<CssProperty, StyleDecl> }>();\n for (const entry of entries) {\n const key = conditionKey(entry.condition);\n let block = acc.get(key);\n if (!block) {\n block = { condition: entry.condition, decls: new Map() };\n acc.set(key, block);\n }\n const tokenIndex = tokenList.indexOf(entry.token);\n const origin: StyleOrigin = { kind: 'class', tokenIndex, className: entry.token };\n for (const [prop, value, important] of entry.decls) {\n for (const decl of normalizer.normalizeDeclaration(prop, value, important)) {\n block.decls.set(decl.property, { ...decl, origin });\n }\n }\n }\n\n const rawBlocks = new Map<ConditionKey, StyleBlock>();\n for (const [key, block] of acc) {\n if (block.decls.size === 0) continue;\n rawBlocks.set(key, { condition: block.condition, decls: block.decls });\n }\n if (rawBlocks.size === 0) return emptyStyleMap();\n return normalizer.normalizeStyleMap({ blocks: rawBlocks });\n }\n\n /** Build (once) the reverse index used by {@link emit}. */\n #reverseIndex(): readonly ReverseEntry[] {\n if (this.#reverse) return this.#reverse;\n const out: ReverseEntry[] = [];\n for (const token of this.#classIndex.keys()) {\n const styles = this.#resolveTokens([token], [token]);\n const keyed = new Map<string, string>();\n for (const [ck, block] of styles.blocks) {\n for (const [prop, decl] of block.decls) keyed.set(`${ck} ${prop}`, String(decl.value));\n }\n if (keyed.size > 0) out.push({ token, keyed });\n }\n // Larger declaration sets first → greedy minimal cover in `emit`.\n out.sort((a, b) => b.keyed.size - a.keyed.size);\n this.#reverse = out;\n return out;\n }\n}\n\n/* ────────────────────────────────────────────────────────────────────────── *\n * Factory\n * ────────────────────────────────────────────────────────────────────────── */\n\n/**\n * Construct a {@link CustomCSSResolver} from raw CSS sources and/or file paths.\n *\n * @param cssFiles raw stylesheets (`{ id, css }`) — pass `[]` when loading only from disk.\n * @param options optional disk paths (`files`) and/or an explicit `fingerprint`.\n */\nexport function createCssResolver(\n cssFiles: readonly CssFile[] = [],\n options?: CssResolverOptions,\n): StyleResolver {\n return new CustomCSSResolver(cssFiles, options);\n}\n","/**\n * domflax — public meta package.\n *\n * Re-exports the entire `@domflax/core` public API (types + reference runtime) and the built-in\n * `@domflax/patterns` library, then layers thin, framework-agnostic build adapters on top\n * (`vite()` / `webpack()`) plus a programmatic `createDomflax()` factory.\n *\n * Each adapter runs the SAME single-file engine as {@link createDomflax} (JSX/TSX + HTML frontends +\n * lazy Tailwind/CSS resolver → core pass manager → reverse-emit → surgical backend). The adapters are\n * structurally typed against their bundlers — they never hard-depend on `vite` or `webpack`.\n *\n * `.jsx`/`.tsx` route to `@domflax/frontend-jsx` (Babel); `.html`/`.htm` route to\n * `@domflax/frontend-html` (parse5). Both emit via SURGICAL span edits over the original source.\n */\n\nimport { createPipeline } from '@domflax/core';\nimport type {\n EncodedSourceMap,\n Pattern,\n Pipeline,\n SafetyLevel,\n StyleResolver,\n} from '@domflax/core';\nimport { builtinPatterns } from '@domflax/patterns';\nimport { createTailwindResolver } from '@domflax/resolver-tailwind';\nimport { createCssResolver } from '@domflax/resolver-css';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { htmlKindOf, jsxKindOf, runHtmlPipeline, runJsxPipeline } from './pipeline-run';\n\n// ── Re-export the public surface ──────────────────────────────────────────────────────────────\nexport * from '@domflax/core';\nexport * from '@domflax/patterns';\n\n/* ────────────────────────────────────────────────────────────────────────── *\n * Options\n * ────────────────────────────────────────────────────────────────────────── */\n\n/** How class names resolve to computed styles. */\nexport type DomflaxProvider = 'auto' | 'tailwind' | 'custom';\n\n/** Public adapter/factory options (mirrors the documented `domflax({...})` surface). */\nexport interface DomflaxOptions {\n /** Resolution strategy. Defaults to `'auto'`. */\n readonly provider?: DomflaxProvider;\n /** Stylesheets to parse when `provider` is `'custom'`. */\n readonly cssFiles?: readonly string[];\n /** Preview changes without rewriting source. */\n readonly dryRun?: boolean;\n /** Optimization aggressiveness handed to the pass manager (0 lint … 3 aggressive). */\n readonly safety?: SafetyLevel;\n /** File globs/extensions the adapters should consider. Defaults to jsx/tsx/html. */\n readonly include?: readonly string[];\n}\n\n/** Fully-resolved options with defaults applied. */\nexport interface ResolvedDomflaxOptions {\n readonly provider: DomflaxProvider;\n readonly cssFiles: readonly string[];\n readonly dryRun: boolean;\n readonly safety: SafetyLevel;\n readonly include: readonly string[];\n}\n\nconst DEFAULT_INCLUDE: readonly string[] = ['.jsx', '.tsx', '.html', '.htm'];\n\nfunction resolveOptions(options: DomflaxOptions): ResolvedDomflaxOptions {\n return {\n provider: options.provider ?? 'auto',\n cssFiles: options.cssFiles ?? [],\n dryRun: options.dryRun ?? false,\n safety: options.safety ?? 2,\n include: options.include ?? DEFAULT_INCLUDE,\n };\n}\n\n/** True when `id` is a file domflax knows how to transform. */\nfunction isSupported(id: string, include: readonly string[]): boolean {\n // Strip query suffixes bundlers append (e.g. `App.tsx?used`).\n const clean = id.split('?', 1)[0] ?? id;\n return include.some((ext) => clean.endsWith(ext));\n}\n\n/* ────────────────────────────────────────────────────────────────────────── *\n * Programmatic instance\n * ────────────────────────────────────────────────────────────────────────── */\n\n/** Result of a single-file transform. `map` is null until codegen lands. */\nexport interface DomflaxTransformResult {\n readonly code: string;\n readonly map: EncodedSourceMap | null;\n}\n\n/**\n * A configured domflax engine. Holds the wired core {@link Pipeline}, the passthrough\n * {@link StyleResolver}, and the built-in {@link Pattern} set, and exposes a single-file\n * `transform`.\n */\nexport interface Domflax {\n readonly options: ResolvedDomflaxOptions;\n readonly pipeline: Pipeline;\n readonly resolver: StyleResolver;\n readonly patterns: readonly Pattern[];\n /**\n * Transform one file (SYNCHRONOUS, fully static, never launches a browser). For `.jsx`/`.tsx` this\n * runs the full pipeline (parse → resolve → flatten[provably-safe only] → reverse-emit → print);\n * every other (or unsupported) file is returned unchanged. Only provably layout-neutral flattens are\n * applied — domflax never changes rendering.\n */\n transform(code: string, id: string): DomflaxTransformResult;\n}\n\n/**\n * Build a configured domflax engine.\n *\n * Wires a real single-file pipeline: the JSX/TSX frontend + a Tailwind resolver feed the core pass\n * manager (running {@link builtinPatterns}), whose output is reverse-emitted back to class tokens\n * and re-printed by the JSX backend. Non-jsx/tsx files pass through unchanged.\n */\n/**\n * Build the {@link StyleResolver} for the chosen provider. The heavy engine each resolver wraps\n * (Tailwind v3 / postcss) is loaded LAZILY — at the moment this factory runs — and resolved from the\n * CONSUMER'S project, NOT from domflax's (possibly bundled) location. Both engines are OPTIONAL peer\n * dependencies of the published `domflax`: a Tailwind-only user never triggers a postcss load, and a\n * custom-CSS-only user never triggers a Tailwind load, because only the selected branch constructs.\n */\nfunction createResolver(resolved: ResolvedDomflaxOptions): StyleResolver {\n if (resolved.provider === 'custom') {\n return createCssResolver([], { files: resolved.cssFiles });\n }\n // 'auto' and 'tailwind' both resolve against the project's Tailwind engine.\n return createTailwindResolver();\n}\n\nexport function createDomflax(options: DomflaxOptions = {}): Domflax {\n const resolved = resolveOptions(options);\n const pipeline = createPipeline();\n const patterns = builtinPatterns;\n\n // Construct the resolver lazily so neither optional engine (Tailwind / postcss) is loaded until a\n // file is actually transformed (and only the engine for the selected provider is ever loaded).\n let cachedResolver: StyleResolver | null = null;\n const getResolver = (): StyleResolver => (cachedResolver ??= createResolver(resolved));\n\n return {\n options: resolved,\n pipeline,\n get resolver(): StyleResolver {\n return getResolver();\n },\n patterns,\n transform(code: string, id: string): DomflaxTransformResult {\n if (!isSupported(id, resolved.include)) return { code, map: null };\n const kind = jsxKindOf(id);\n if (kind !== null) {\n const out = runJsxPipeline(code, id, kind, getResolver(), patterns, resolved.safety);\n return { code: out, map: null };\n }\n // `.html`/`.htm` route to the parse5 HTML frontend/backend (surgical span edits).\n if (htmlKindOf(id) !== null) {\n const out = runHtmlPipeline(code, id, getResolver(), patterns, resolved.safety);\n return { code: out, map: null };\n }\n return { code, map: null };\n },\n };\n}\n\n/* ────────────────────────────────────────────────────────────────────────── *\n * Build adapters (framework-agnostic, structurally-typed shapes)\n * ────────────────────────────────────────────────────────────────────────── */\n\n/**\n * Minimal Vite-plugin shape. Declared locally so this adapter does NOT depend on `vite`'s types\n * (an optional, type-only peer). Structurally compatible with Vite's `Plugin` for the hooks domflax\n * uses: `enforce: 'pre'` runs domflax before Vite's JSX→`createElement` transform, and `transform`\n * is Vite's per-file source hook. Returning `null` is Vite's \"no change\" signal.\n */\nexport interface DomflaxVitePlugin {\n readonly name: string;\n readonly enforce: 'pre';\n /** Vite's per-file source hook. Fully synchronous and browser-free. */\n transform(code: string, id: string): DomflaxTransformResult | null;\n}\n\n/**\n * Vite adapter. Returns a real Vite `Plugin` (`enforce: 'pre'`) whose `transform` runs the domflax\n * engine on `.jsx`/`.tsx` modules — strips any bundler query suffix (e.g. `App.tsx?used`) before\n * matching, returns `{ code, map }` when the source changed, and `null` (Vite's unchanged signal)\n * for unchanged sources and for any non-jsx/tsx module.\n *\n * @example\n * ```js\n * // vite.config.js\n * import domflax from 'domflax';\n * export default { plugins: [domflax.vite({ provider: 'tailwind' })] };\n * ```\n */\nexport function vite(options: DomflaxOptions = {}): DomflaxVitePlugin {\n const engine = createDomflax(options);\n return {\n name: 'domflax',\n enforce: 'pre',\n transform(code: string, id: string): DomflaxTransformResult | null {\n if (!isSupported(id, engine.options.include)) return null;\n const out = engine.transform(code, id);\n // Signal \"no change\" to Vite when the source round-tripped unchanged.\n return out.code === code ? null : out;\n },\n };\n}\n\n/* ── webpack / Next.js ──────────────────────────────────────────────────────────────────────── */\n\n/** A `module.rule` `use` entry: an absolute loader path plus the options forwarded to it. */\ninterface DomflaxRuleUse {\n readonly loader: string;\n readonly options: DomflaxOptions;\n}\n\n/** The slice of a webpack `module.rule` domflax appends. */\ninterface DomflaxModuleRule {\n readonly test: RegExp;\n readonly enforce: 'pre';\n readonly exclude: RegExp;\n readonly use: readonly DomflaxRuleUse[];\n}\n\n/** Anything carrying a `module.rules` array — both a webpack `Compiler.options` and Next's bare config. */\ninterface DomflaxWebpackModuleHost {\n module?: { rules?: unknown[] };\n}\n\n/**\n * Minimal webpack-compiler shape. Declared locally so this adapter does NOT depend on `webpack`'s\n * types. domflax only needs to push a rule onto the host's `module.rules`.\n *\n * `apply` accepts BOTH shapes: a real webpack `Compiler` (rules live under `compiler.options.module`)\n * AND the bare `config` object Next.js hands you from `webpack(config)` (rules live directly under\n * `config.module`). It duck-types `compiler.options ?? compiler` to find the right host.\n */\nexport interface DomflaxWebpackCompiler extends DomflaxWebpackModuleHost {\n options?: DomflaxWebpackModuleHost;\n}\n\n/**\n * Minimal webpack-plugin shape. `apply(compiler)` is the webpack plugin entry point.\n */\nexport interface DomflaxWebpackPlugin {\n readonly name: string;\n apply(compiler: DomflaxWebpackCompiler): void;\n}\n\n/** `.jsx`/`.tsx` modules only (combinator-free with the JSX frontend; `.js`/`.ts` are skipped). */\nconst WEBPACK_JSX_TEST = /\\.[jt]sx$/;\n\n/**\n * Absolute path to the bundled webpack loader (`./webpack-loader`). Resolved lazily against THIS\n * module's location so it works whether `domflax` is loaded as ESM (`dist/index.js`) or CJS\n * (`dist/index.cjs`) — both sit beside `dist/webpack-loader.cjs`. webpack requires loaders via\n * CommonJS, so we always point at the `.cjs` output.\n */\nfunction webpackLoaderPath(): string {\n const here = dirname(fileURLToPath(import.meta.url));\n return join(here, 'webpack-loader.cjs');\n}\n\n/**\n * webpack adapter (also the Next.js path). Returns a plugin whose `apply(compiler)` injects a\n * pre-enforced `module.rule` that invokes the domflax {@link ./webpack-loader loader} on every\n * `.jsx`/`.tsx` module. The loader runs the SAME lazy engine as {@link createDomflax} (no eager\n * Tailwind/postcss load).\n *\n * Next.js wiring (`next.config.js`) — Next exposes the underlying webpack config via `webpack(config)`:\n * ```js\n * // next.config.js\n * const domflax = require('domflax');\n * module.exports = {\n * webpack(config) {\n * domflax.webpack({ provider: 'tailwind' }).apply(config);\n * return config;\n * },\n * };\n * ```\n * `apply(compiler)` is intentionally duck-typed on `compiler.options.module.rules`, so it accepts\n * both a real webpack `Compiler` and the bare `config` object Next.js hands you.\n *\n * Caveat: this targets the webpack builder only. **Turbopack is not yet supported** — it does not\n * accept arbitrary webpack loaders, so the `next.config.js` wiring above is a no-op under\n * `next dev --turbopack`. Run domflax through the webpack builder until Turbopack exposes a loader API.\n */\nexport function webpack(options: DomflaxOptions = {}): DomflaxWebpackPlugin {\n // Validate options eagerly (parity with the other adapters); the resolver stays lazy.\n createDomflax(options);\n return {\n name: 'domflax',\n apply(compiler: DomflaxWebpackCompiler): void {\n // Real webpack passes a `Compiler` (rules under `.options.module`); Next's `webpack(config)`\n // passes the bare config (rules under `.module`). Duck-type to the right host.\n const host: DomflaxWebpackModuleHost = compiler.options ?? compiler;\n const mod = (host.module ??= {});\n const rules = (mod.rules ??= []);\n const rule: DomflaxModuleRule = {\n test: WEBPACK_JSX_TEST,\n enforce: 'pre',\n exclude: /node_modules/,\n use: [{ loader: webpackLoaderPath(), options }],\n };\n rules.push(rule);\n },\n };\n}\n\n/**\n * The default-export namespace. Exposes the build adapters and the programmatic factory as an OBJECT\n * so the documented `import domflax from 'domflax'; domflax.vite()` / `domflax.webpack()` works (and a\n * CommonJS `const domflax = require('domflax'); domflax.vite()` too). The named exports\n * (`createDomflax`, `vite`, `webpack`, …) remain available for direct import.\n */\nexport interface DomflaxDefault {\n createDomflax(options?: DomflaxOptions): Domflax;\n vite(options?: DomflaxOptions): DomflaxVitePlugin;\n webpack(options?: DomflaxOptions): DomflaxWebpackPlugin;\n}\n\n/** Default export: an object exposing `vite`, `webpack`, and the programmatic `createDomflax`. */\nconst domflax: DomflaxDefault = { createDomflax, vite, webpack };\nexport default domflax;\n","/**\n * @domflax/frontend-html — IR → HTML backend (SURGICAL, verbatim-preserving).\n *\n * The pass manager mutates the IR tree that was lowered from a complete HTML document. The backend\n * emits the SAME document back with ONLY the diffs the passes produced, applied as span edits over the\n * ORIGINAL source via `magic-string`. It NEVER re-serializes the parse5 tree — doing so would normalize\n * quoting/whitespace/attribute order across the whole file. Every untouched byte (doctype, `<head>`,\n * comments, scripts, whitespace, attribute ordering) stays byte-for-byte identical.\n *\n * • CLASS CHANGE — for a surviving element whose static class list differs from its source text,\n * overwrite just the `class` attribute VALUE span (quotes included) with the new tokens.\n * • UNWRAP (flatten) — when a wrapper element was removed but a descendant survived, delete ONLY the\n * wrapper's open- and close-tag spans; the children (their entire subtrees) survive verbatim.\n * • FULL REMOVAL — when a node was removed with no surviving descendant, delete its whole span.\n */\n\nimport MagicString from 'magic-string';\n\nimport type {\n Backref,\n ClassList,\n IRDocument,\n IRElement,\n IRNode,\n IRNodeId,\n SourceFile,\n SourceSpan,\n} from '@domflax/core';\n\n/* ───────────────────────── shared helpers ───────────────────────── */\n\n/** All static class tokens of a {@link ClassList}, in source order. */\nfunction staticTokensOf(classes: ClassList): string[] {\n const out: string[] = [];\n for (const seg of classes.segments) {\n if (seg.kind === 'static') for (const t of seg.tokens) out.push(t.value);\n }\n return out;\n}\n\n/** Two token lists are equal iff same length and same tokens in the same order. */\nfunction sameTokens(a: readonly string[], b: readonly string[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i += 1) if (a[i] !== b[i]) return false;\n return true;\n}\n\n/** Pick the single retained source file this document was parsed from (if any). */\nfunction primarySource(doc: IRDocument): SourceFile | null {\n for (const sf of doc.sources.values()) {\n if (typeof sf.text === 'string' && sf.text.length > 0) return sf;\n }\n return null;\n}\n\n/** Collect every node reachable from the root of the (mutated) tree. */\nfunction collectKept(doc: IRDocument): IRNode[] {\n const out: IRNode[] = [];\n const seen = new Set<IRNodeId>();\n const visit = (id: IRNodeId): void => {\n if (seen.has(id)) return;\n seen.add(id);\n const n = doc.nodes.get(id);\n if (!n) return;\n out.push(n);\n if (n.kind === 'element' || n.kind === 'fragment') for (const c of n.children) visit(c);\n };\n visit(doc.root);\n return out;\n}\n\n/** Span `a` strictly contains span `b` (same file, b nested inside, not identical). */\nfunction strictlyContains(a: SourceSpan, b: SourceSpan): boolean {\n if (a.file !== b.file) return false;\n if (a.start <= b.start && b.end <= a.end) return !(a.start === b.start && a.end === b.end);\n return false;\n}\n\n/** All ids the backref table knows about (every originally-parsed element with a source location). */\nfunction backrefIds(doc: IRDocument): IRNodeId[] {\n const out: IRNodeId[] = [];\n const max = doc.alloc.peek as unknown as number;\n for (let i = 1; i < max; i += 1) {\n const id = i as IRNodeId;\n if (doc.backref.get(id)) out.push(id);\n }\n return out;\n}\n\n/* ───────────────────────── class-value rewrite ───────────────────────── */\n\n/** The tokens currently written in the class value span (quotes/whitespace stripped). */\nfunction currentTokens(sf: SourceFile, valueSpan: SourceSpan): string[] {\n const raw = sf.text.slice(valueSpan.start, valueSpan.end).trim();\n const unquoted = raw.replace(/^['\"]/, '').replace(/['\"]$/, '');\n return unquoted.split(/\\s+/).filter((t) => t.length > 0);\n}\n\n/** Apply the class-list diff for one surviving element. Returns true if a byte edit was made. */\nfunction editClasses(ms: MagicString, doc: IRDocument, sf: SourceFile, el: IRElement): boolean {\n const classes = el.classes;\n if (classes.hasDynamic || classes.opaque) return false; // never rewrite an opaque/dynamic list\n\n const tokens = staticTokensOf(classes);\n const valueSpan = classes.valueSpan;\n\n if (valueSpan && valueSpan.file === sf.id) {\n if (sameTokens(currentTokens(sf, valueSpan), tokens)) return false; // unchanged → leave verbatim\n const current = sf.text.slice(valueSpan.start, valueSpan.end).trim();\n const quote = current.startsWith(\"'\") ? \"'\" : '\"';\n ms.overwrite(valueSpan.start, valueSpan.end, `${quote}${tokens.join(' ')}${quote}`);\n return true;\n }\n\n // No class attribute originally, but the passes added classes ⇒ insert one on the opening tag.\n if (tokens.length === 0) return false;\n const openTag = doc.backref.get(el.id)?.openTagSpan;\n if (!openTag || openTag.file !== sf.id) return false;\n ms.appendLeft(openTag.start + 1 + el.tag.length, ` class=\"${tokens.join(' ')}\"`);\n return true;\n}\n\n/* ───────────────────────── surgical codegen ───────────────────────── */\n\ninterface RemovedRegion {\n readonly backref: Backref;\n /** A surviving node nested inside this region ⇒ this was an UNWRAP (keep inner, drop tags). */\n readonly unwrapped: boolean;\n}\n\n/** Surgical whole-document codegen. Returns null when the document has no retained source. */\nfunction surgicalPrint(doc: IRDocument): string | null {\n const sf = primarySource(doc);\n if (!sf) return null;\n\n const ms = new MagicString(sf.text);\n\n const kept = collectKept(doc);\n const keptSpans: SourceSpan[] = [];\n for (const n of kept) if (n.span && n.span.file === sf.id) keptSpans.push(n.span);\n\n // 1) Structural removals — an id in the backref table but absent from the live node map was removed\n // by the passes. Classify as UNWRAP (a surviving node nests inside) or FULL removal.\n const removed: RemovedRegion[] = [];\n for (const id of backrefIds(doc)) {\n if (doc.nodes.has(id)) continue;\n const back = doc.backref.get(id);\n if (!back || back.span.file !== sf.id) continue;\n const unwrapped = keptSpans.some((k) => strictlyContains(back.span, k));\n removed.push({ backref: back, unwrapped });\n }\n\n // Skip any removed region nested inside a FULL-removal region (already deleted by the ancestor), so\n // every delete stays disjoint (magic-string requires it).\n const fullRemovals = removed.filter((r) => !r.unwrapped).map((r) => r.backref.span);\n for (const r of removed) {\n const s = r.backref.span;\n if (fullRemovals.some((f) => f !== s && strictlyContains(f, s))) continue;\n\n if (r.unwrapped) {\n const open = r.backref.openTagSpan;\n const close = r.backref.closeTagSpan;\n if (open && open.file === sf.id && open.end > open.start) ms.remove(open.start, open.end);\n if (close && close.file === sf.id && close.end > close.start) ms.remove(close.start, close.end);\n } else {\n ms.remove(s.start, s.end);\n }\n }\n\n // 2) Class-list diffs on every surviving element.\n for (const n of kept) if (n.kind === 'element') editClasses(ms, doc, sf, n);\n\n return ms.toString();\n}\n\n/** Emit the (possibly edited) document. Falls back to the empty string only for a source-less doc. */\nexport function doPrint(doc: IRDocument): string {\n return surgicalPrint(doc) ?? '';\n}\n","/**\n * @domflax/frontend-html — the parse5 HTML → IR parse pass.\n *\n * Parses HTML with parse5 (WHATWG-compliant tree construction) and lowers its tree into the\n * `@domflax/core` IR: every element → {@link IRElement} (tag + non-class attributes, with the `class`\n * attribute resolved through `ctx.resolver`/`ctx.normalizer` into `computed` so downstream patterns\n * match on resolved style), text → {@link IRText}, comments → {@link IRComment}. Doctype and\n * auto-inserted (`<html>`/`<head>`/`<body>`) wrappers are preserved verbatim: doctype is not\n * represented, synthetic wrappers become opaque (never edited).\n *\n * Precise SOURCE SPANS from parse5 location info (element span, open-/close-tag spans, and the `class`\n * VALUE span) are recorded in the {@link MutableBackrefTable} so the backend edits surgically instead\n * of re-serializing (which would reformat the whole document).\n *\n * OPACITY (never flatten/rewrite), enforced via `meta.safetyFloor = 0` (blocks every op above lint):\n * • elements with an `id`, any inline `on*=` handler, or `contenteditable` (element only);\n * • `<script>`/`<style>`/`<template>`/`<svg>`/`<pre>`/`<textarea>` subtrees (not descended into);\n * • synthetic (auto-inserted) elements carrying no source location.\n *\n * parse5 is LAZILY required (via `createRequire`, since {@link Frontend.parse} is synchronous) INSIDE\n * `doParse`, so the JSX-only path never loads it.\n */\n\nimport { createRequire } from 'node:module';\n\nimport type {\n AttrMap,\n AttrValue,\n ClassList,\n ClassSegment,\n Diagnostic,\n FrontendParseContext,\n IRDocument,\n IRElement,\n IRFragment,\n IRNodeId,\n MutableBackrefTable,\n NodeMeta,\n ParseResult,\n SourceFile,\n StyleMap,\n} from '@domflax/core';\nimport {\n createComment,\n createDocument,\n createElement,\n createText,\n defaultMeta,\n emptyClassList,\n emptyStyleMap,\n} from '@domflax/core';\n\nimport type { P5Attr, P5Location, P5Node, Parse5Module } from './walk';\nimport {\n FILE_ID,\n attrsLocOf,\n classValueSpan,\n elementIsOpaque,\n hasEventHandler,\n isOpaqueSubtreeTag,\n span,\n} from './walk';\n\n/* ───────────────────────── lazy parse5 ───────────────────────── */\n\nlet cachedParse5: Parse5Module | null = null;\n\n/**\n * Load parse5 lazily via `createRequire` (NOT a top-level import): {@link Frontend.parse} is\n * synchronous, so a dynamic `import()` is unavailable, and the JSX-only path must never pull parse5\n * into memory. Rooted at THIS module so it resolves the parse5 the frontend depends on.\n */\nfunction loadParse5(): Parse5Module {\n if (cachedParse5) return cachedParse5;\n const req = createRequire(import.meta.url);\n cachedParse5 = req('parse5') as Parse5Module;\n return cachedParse5;\n}\n\n/* ───────────────────────── parse pass ───────────────────────── */\n\nexport function doParse(code: string, ctx: FrontendParseContext): ParseResult {\n const diagnostics: Diagnostic[] = [];\n const doc: IRDocument = createDocument('html');\n const backref = doc.backref as MutableBackrefTable;\n\n const parse5 = loadParse5();\n const document = parse5.parse(code, { sourceCodeLocationInfo: true });\n\n const eol: '\\n' | '\\r\\n' = code.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const sourceFile: SourceFile = {\n id: FILE_ID,\n path: ctx.id,\n text: code,\n frontend: 'html',\n eol,\n indentUnit: ' ',\n native: document,\n };\n doc.sources.set(FILE_ID, sourceFile);\n\n /* ----- class resolution (static classes → computed style) ----- */\n\n const resolveComputed = (tokens: readonly string[], tag: string, nodeId: IRNodeId): StyleMap => {\n if (tokens.length === 0) return emptyStyleMap();\n const res = ctx.resolver.resolve({ classes: tokens, element: { tagName: tag, namespace: 'html' } });\n for (const w of res.warnings) {\n diagnostics.push({\n code: 'DF_STYLE_CONFLICT_UNRESOLVED',\n severity: w.severity,\n message: w.message,\n nodeId,\n });\n }\n return ctx.normalizer.normalizeStyleMap(res.styles);\n };\n\n const splitTokens = (raw: string): string[] => raw.split(/\\s+/).filter((t) => t.length > 0);\n\n /* ----- child lowering ----- */\n\n const appendChild = (node: P5Node, parentId: IRNodeId, out: IRNodeId[]): void => {\n const name = node.nodeName;\n if (name === '#text') {\n const value = node.value ?? '';\n const id = doc.alloc.next();\n const loc = node.sourceCodeLocation ?? null;\n doc.nodes.set(\n id,\n createText(id, value, {\n parent: parentId,\n span: loc ? span(loc.startOffset, loc.endOffset) : null,\n collapsible: /^\\s*$/.test(value),\n }),\n );\n out.push(id);\n return;\n }\n if (name === '#comment') {\n const id = doc.alloc.next();\n const loc = node.sourceCodeLocation ?? null;\n doc.nodes.set(\n id,\n createComment(id, node.data ?? '', {\n parent: parentId,\n span: loc ? span(loc.startOffset, loc.endOffset) : null,\n }),\n );\n out.push(id);\n return;\n }\n if (name === '#documentType') return; // doctype stays verbatim in source (never represented)\n if (name.startsWith('#')) {\n // #document / #document-fragment — a container with no element identity: hoist its children.\n for (const c of node.childNodes ?? []) appendChild(c, parentId, out);\n return;\n }\n out.push(buildElement(node, parentId));\n };\n\n /* ----- element lowering ----- */\n\n const buildElement = (node: P5Node, parentId: IRNodeId): IRNodeId => {\n const id = doc.alloc.next();\n const tag = (node.tagName ?? node.nodeName).toLowerCase();\n const loc: P5Location | null = node.sourceCodeLocation ?? null;\n const attrsArr: readonly P5Attr[] = node.attrs ?? [];\n\n const opaqueSubtree = isOpaqueSubtreeTag(tag);\n const synthetic = loc == null; // auto-inserted <html>/<head>/<body>\n const opaque = opaqueSubtree || synthetic || elementIsOpaque(attrsArr);\n\n const meta: NodeMeta = defaultMeta();\n meta.hasEventHandlers = hasEventHandler(attrsArr);\n // Opaque nodes get floor 0 (any op above lint is refused by the applier); optimizable nodes get\n // floor 3 (fully open — the pattern predicates + flatten classifier are the real gate).\n meta.safetyFloor = opaque ? 0 : 3;\n\n // Split attributes: `class` → ClassList; everything else → AttrMap entries (so flatten's\n // `hasOwnAttrs` guard sees id/data-*/… and refuses to unwrap the element).\n let classes: ClassList = emptyClassList();\n let classTokens: string[] = [];\n const entries = new Map<string, AttrValue>();\n const order: string[] = [];\n\n for (const a of attrsArr) {\n if (a.name.toLowerCase() === 'class') {\n classTokens = splitTokens(a.value);\n const valueSpan = classValueSpan(loc, code);\n const clAttr = attrsLocOf(loc)?.['class'];\n const seg: ClassSegment = {\n kind: 'static',\n span: valueSpan ?? undefined,\n tokens: classTokens.map((value) => ({ value })),\n };\n classes = {\n form: 'string-literal',\n segments: [seg],\n valueSpan,\n attrSpan: clAttr ? span(clAttr.startOffset, clAttr.endOffset) : undefined,\n hasDynamic: false,\n opaque: false,\n rewritable: valueSpan != null,\n };\n continue;\n }\n const v = a.value;\n entries.set(a.name, { kind: 'static', value: v === '' ? true : v });\n order.push(a.name);\n }\n\n const attrs: AttrMap = { entries, spreads: [], order };\n const computed = resolveComputed(classTokens, tag, id);\n\n // Children — opaque-subtree elements are NOT descended into; their inner bytes survive verbatim.\n const children: IRNodeId[] = [];\n if (!opaqueSubtree) {\n for (const c of node.childNodes ?? []) appendChild(c, id, children);\n }\n\n const el: IRElement = createElement(id, {\n tag,\n namespace: 'html',\n isComponent: false,\n selfClosing: loc ? loc.endTag == null : false,\n classes,\n computed,\n attrs,\n children,\n parent: parentId,\n span: loc ? span(loc.startOffset, loc.endOffset) : null,\n meta,\n });\n doc.nodes.set(id, el);\n\n // Backref (surgical-edit anchors) — only for elements with a real source location. Synthetic\n // wrappers get none, so the backend never tries to move/remove their bytes.\n if (loc) {\n backref.set(id, {\n nodeId: id,\n span: span(loc.startOffset, loc.endOffset),\n openTagSpan: loc.startTag ? span(loc.startTag.startOffset, loc.startTag.endOffset) : null,\n closeTagSpan: loc.endTag ? span(loc.endTag.startOffset, loc.endTag.endOffset) : null,\n innerSpan: null,\n selfClosing: loc.endTag == null,\n });\n }\n return id;\n };\n\n /* ----- attach top-level nodes under the root fragment ----- */\n\n const rootFrag = doc.nodes.get(doc.root) as IRFragment;\n appendChild(document, doc.root, rootFrag.children);\n\n return { doc, diagnostics };\n}\n","/**\n * @domflax/frontend-html — pure parse5 interop, constants, and opacity/span helpers.\n *\n * Stateless building blocks shared by the HTML parse pass: the minimal parse5 node/location shapes\n * this frontend reads (parse5 ships its own types, but the frontend requires it LAZILY as `unknown`,\n * so it re-declares only the slice it touches), the fixed constants, the opacity classification\n * predicates (which elements/subtrees must never be flattened or rewritten), and the source-span\n * helpers that turn parse5 location info into {@link SourceSpan}s for surgical codegen.\n *\n * No closure state, no document mutation, no third-party imports — only the `@domflax/core` type\n * contract.\n */\n\nimport type { FileKind, SourceFileId, SourceSpan } from '@domflax/core';\n\n/** Languages this frontend claims. HTML only; JSX/TSX is owned by a sibling frontend. */\nexport const HTML_LANGS: readonly FileKind[] = ['html'];\n\n/** The single registered source file id (one parse == one document). */\nexport const FILE_ID = 1 as SourceFileId;\n\n/* ───────────────────────── parse5 minimal shapes (lazy-required as unknown) ───────────────────────── */\n\n/** A `{ startOffset, endOffset }` byte range parse5 records for a node/tag/attribute. */\nexport interface P5Range {\n readonly startOffset: number;\n readonly endOffset: number;\n}\n\n/** parse5 element start-tag location (parse5 v7 nests per-attribute ranges under `startTag.attrs`). */\nexport interface P5TagLoc extends P5Range {\n readonly attrs?: Readonly<Record<string, P5Range>>;\n}\n\n/** parse5 element source-code location. `attrs` may live at the top level (v6) or under `startTag` (v7). */\nexport interface P5Location extends P5Range {\n readonly startTag?: P5TagLoc | null;\n readonly endTag?: P5Range | null;\n readonly attrs?: Readonly<Record<string, P5Range>>;\n}\n\nexport interface P5Attr {\n readonly name: string;\n readonly value: string;\n}\n\nexport interface P5Node {\n readonly nodeName: string;\n readonly tagName?: string;\n readonly value?: string; // #text\n readonly data?: string; // #comment\n readonly attrs?: readonly P5Attr[];\n readonly childNodes?: readonly P5Node[];\n readonly sourceCodeLocation?: P5Location | null;\n}\n\n/** The tiny slice of the parse5 module surface the frontend calls. */\nexport interface Parse5Module {\n parse(html: string, opts: { readonly sourceCodeLocationInfo: boolean }): P5Node;\n}\n\n/* ───────────────────────── HTML detection ───────────────────────── */\n\n/** Lightweight heuristic: does this source id / code look like HTML we can own? */\nexport function looksLikeHtml(id: string, code: string): boolean {\n if (/\\.html?$/i.test(id)) return true;\n const head = code.slice(0, 256).trimStart().toLowerCase();\n return head.startsWith('<!doctype html') || head.startsWith('<html') || head.startsWith('<');\n}\n\n/* ───────────────────────── opacity classification ───────────────────────── */\n\n/**\n * Tags whose ENTIRE subtree is opaque — never descended into, flattened, or rewritten. Raw-text /\n * embedded-content / whitespace-significant elements whose inner bytes must survive verbatim:\n * `<script>`/`<style>` (raw text + JS/CSS), `<template>` (inert content), `<svg>` (foreign markup),\n * `<pre>`/`<textarea>` (whitespace-significant).\n */\nexport const OPAQUE_SUBTREE_TAGS: ReadonlySet<string> = new Set([\n 'script',\n 'style',\n 'template',\n 'svg',\n 'pre',\n 'textarea',\n]);\n\nexport function isOpaqueSubtreeTag(tag: string): boolean {\n return OPAQUE_SUBTREE_TAGS.has(tag);\n}\n\n/**\n * Element-level opacity: an `id` (JS may `querySelector`/anchor-link it), any inline `on*=` event\n * handler, or `contenteditable` pins the element's identity/behaviour — it must never be flattened or\n * rewritten (its subtree may still be optimized).\n */\nexport function elementIsOpaque(attrs: readonly P5Attr[]): boolean {\n for (const a of attrs) {\n const n = a.name.toLowerCase();\n if (n === 'id' || n === 'contenteditable') return true;\n if (n.startsWith('on')) return true;\n }\n return false;\n}\n\n/** True when the element carries any inline `on*=` event handler. */\nexport function hasEventHandler(attrs: readonly P5Attr[]): boolean {\n for (const a of attrs) if (/^on/i.test(a.name)) return true;\n return false;\n}\n\n/* ───────────────────────── source-span helpers ───────────────────────── */\n\n/** A {@link SourceSpan} over `[start, end)` in the single source file. */\nexport function span(start: number, end: number): SourceSpan {\n return { file: FILE_ID, start, end };\n}\n\n/** The per-attribute location map, tolerating both the v6 (top-level) and v7 (`startTag`) layouts. */\nexport function attrsLocOf(loc: P5Location | null | undefined): Readonly<Record<string, P5Range>> | undefined {\n if (!loc) return undefined;\n return loc.startTag?.attrs ?? loc.attrs;\n}\n\n/**\n * The VALUE span (quotes included) of the `class` attribute — the splice target the backend overwrites\n * to rewrite the class list in place. Derived from the whole-attribute range (`class=\"…\"`) by skipping\n * past the name and `=`; returns null when there is no class attribute or it has no value.\n */\nexport function classValueSpan(loc: P5Location | null | undefined, source: string): SourceSpan | null {\n const attrsLoc = attrsLocOf(loc);\n const cl = attrsLoc?.['class'];\n if (!cl) return null;\n const text = source.slice(cl.startOffset, cl.endOffset);\n const eq = text.indexOf('=');\n if (eq === -1) return null; // bare `class` with no value\n let i = eq + 1;\n while (i < text.length && /\\s/.test(text[i]!)) i += 1;\n if (i >= text.length) return null;\n return span(cl.startOffset + i, cl.endOffset);\n}\n","/**\n * @domflax/frontend-html — parse5 HTML <-> IR frontend + backend.\n *\n * A {@link Frontend} that parses HTML into an {@link IRDocument} (parse5 tree → IR, resolving each\n * element's `class` attribute onto `computed`), and a matching {@link Backend} that prints the edited\n * document back to HTML with SURGICAL, span-based edits over the original source (never re-serializing\n * the parse5 tree). Untouched bytes — doctype, comments, whitespace, scripts, attribute order — stay\n * byte-for-byte identical.\n *\n * parse5 is a real dependency but is LAZILY required inside `parse()` (see `./parse`), so the JSX-only\n * path never loads it. The parse walk + opacity/span helpers live in `./walk` + `./parse`; the reverse\n * codegen in `./backend`. This module is the public assembly point.\n */\n\nimport type {\n Backend,\n BackendContext,\n CodegenResult,\n EditPlan,\n Frontend,\n FrontendParseContext,\n IRDocument,\n ParseResult,\n} from '@domflax/core';\n\nimport { doPrint } from './backend';\nimport { doParse } from './parse';\nimport { HTML_LANGS, looksLikeHtml } from './walk';\n\nexport { HTML_LANGS, looksLikeHtml } from './walk';\n\n/** HTML frontend: parse5 HTML → IR (with source spans for surgical codegen). */\nexport const htmlFrontend: Frontend = {\n name: 'html',\n langs: HTML_LANGS,\n canParse(id: string, code: string): boolean {\n return looksLikeHtml(id, code);\n },\n parse(code: string, ctx: FrontendParseContext): ParseResult {\n return doParse(code, ctx);\n },\n};\n\n/** Factory mirror — returns a fresh handle to the (stateless) HTML frontend. */\nexport function createHtmlFrontend(): Frontend {\n return htmlFrontend;\n}\n\n/** HTML backend: IR → HTML via span-based surgical edits over the retained verbatim source. */\nexport const htmlBackend: Backend = {\n name: 'html',\n langs: HTML_LANGS,\n print(doc: IRDocument, _plan: EditPlan, _ctx: BackendContext): CodegenResult {\n return { code: doPrint(doc), map: null, edits: [], diagnostics: [] };\n },\n};\n\n/** Factory mirror — returns a fresh handle to the (stateless) HTML backend. */\nexport function createHtmlBackend(): Backend {\n return htmlBackend;\n}\n\nexport default htmlFrontend;\n","/**\n * @domflax/frontend-jsx — AST interop, constants, and pure classification helpers.\n *\n * Stateless building blocks shared by the JSX parse pass: the `@babel/traverse`\n * default-export normalization, the frontend's fixed constants, and the pure\n * name/classification/JSX-discovery helpers (no closure state, no document mutation).\n */\n\nimport babelTraverse from '@babel/traverse';\nimport type {\n JSXAttribute,\n JSXElement,\n JSXFragment,\n JSXIdentifier,\n JSXMemberExpression,\n JSXNamespacedName,\n Node as BabelNode,\n} from '@babel/types';\n\nimport type { ClassListForm, ExprKind, FileKind, SourceFileId } from '@domflax/core';\n\n/* ───────────────────────── @babel/traverse interop ───────────────────────── */\n\n// `@babel/traverse` is published as CJS (`module.exports = traverse; exports.default = traverse`).\n// Under an ESM default import the value may be the function OR `{ default: fn }` depending on the\n// interop layer (Node ESM vs. esbuild vs. tsup), so normalize defensively.\nexport const traverse = (\n typeof babelTraverse === 'function'\n ? babelTraverse\n : (babelTraverse as unknown as { default: typeof babelTraverse }).default\n) as typeof babelTraverse;\n\n/** Languages this frontend claims. JSX/TSX only; HTML is owned by a sibling frontend. */\nexport const JSX_LANGS: readonly FileKind[] = ['jsx', 'tsx'];\n\n/** The single registered source file id (one parse == one module). */\nexport const FILE_ID = 1 as SourceFileId;\n\n/** Marker payload stored for every interned expression so the backend can re-print it. */\nexport interface ExprPayload {\n readonly text: string;\n readonly spread: boolean;\n}\n\n/* ───────────────────────── name + classification helpers ───────────────────────── */\n\nexport type JSXName = JSXIdentifier | JSXMemberExpression | JSXNamespacedName;\n\nexport function jsxName(node: JSXName): string {\n switch (node.type) {\n case 'JSXIdentifier':\n return node.name;\n case 'JSXMemberExpression':\n return `${jsxName(node.object)}.${node.property.name}`;\n case 'JSXNamespacedName':\n return `${node.namespace.name}:${node.name.name}`;\n }\n}\n\n/** Component vs. intrinsic: capitalized identifier or member expression ⇒ component. */\nexport function isComponentName(node: JSXName): boolean {\n if (node.type === 'JSXMemberExpression') return true;\n if (node.type === 'JSXNamespacedName') return false;\n return /^[A-Z]/.test(node.name);\n}\n\nexport function attrName(name: JSXAttribute['name']): string {\n return name.type === 'JSXNamespacedName'\n ? `${name.namespace.name}:${name.name.name}`\n : name.name;\n}\n\nexport function exprKind(node: BabelNode): ExprKind {\n switch (node.type) {\n case 'CallExpression':\n case 'OptionalCallExpression':\n return 'call';\n case 'MemberExpression':\n case 'OptionalMemberExpression':\n return 'member';\n case 'ConditionalExpression':\n case 'LogicalExpression':\n return 'conditional';\n case 'TemplateLiteral':\n case 'TaggedTemplateExpression':\n return 'template';\n case 'Identifier':\n return 'identifier';\n case 'SpreadElement':\n return 'spread';\n default:\n return 'other';\n }\n}\n\n/** Map a dynamic className expression to the closest {@link ClassListForm}. */\nexport function classFormOf(node: BabelNode): ClassListForm {\n switch (node.type) {\n case 'TemplateLiteral':\n case 'TaggedTemplateExpression':\n return 'template-literal';\n case 'CallExpression':\n case 'OptionalCallExpression':\n return 'call';\n case 'ConditionalExpression':\n case 'LogicalExpression':\n return 'conditional';\n case 'MemberExpression':\n case 'OptionalMemberExpression':\n case 'Identifier':\n return 'member';\n default:\n return 'call';\n }\n}\n\n/**\n * Find the OUTERMOST JSXElement/JSXFragment nodes that a dynamic expression renders, so the frontend\n * can lower JSX nested inside `{…}` holes — `.map`/`.filter`/`.forEach((x) => <jsx/>)` callbacks,\n * `&&`/`||` logical expressions, ternaries, and parenthesized/cast wrappers — into REAL IR element\n * nodes. The dynamic scaffolding around them (the call itself, the conditions, `{expr}` holes) stays\n * opaque; only the renderable JSX is surfaced so the pass manager descends into and optimizes it.\n *\n * Only the outermost JSX is collected: `buildElement`/`buildFragment` recurse into the\n * descendants themselves, so we must NOT descend past a JSX boundary here (that would double-register\n * inner elements).\n */\nexport function findNestedJsxRoots(root: BabelNode): (JSXElement | JSXFragment)[] {\n const out: (JSXElement | JSXFragment)[] = [];\n const seen = new Set<BabelNode>();\n\n const visit = (n: BabelNode | null | undefined): void => {\n if (!n || seen.has(n)) return;\n seen.add(n);\n switch (n.type) {\n case 'JSXElement':\n case 'JSXFragment':\n out.push(n); // outermost renderable JSX — buildElement/buildFragment recurse from here\n return;\n case 'ParenthesizedExpression':\n case 'TSNonNullExpression':\n case 'TSAsExpression':\n case 'TSSatisfiesExpression':\n case 'TSTypeAssertion':\n visit(n.expression);\n return;\n case 'LogicalExpression':\n visit(n.left);\n visit(n.right);\n return;\n case 'ConditionalExpression':\n visit(n.consequent);\n visit(n.alternate);\n return;\n case 'SequenceExpression':\n for (const e of n.expressions) visit(e);\n return;\n case 'CallExpression':\n case 'OptionalCallExpression':\n // `.map`/`.filter`/`.forEach(cb)` etc. — descend into the call arguments (the callbacks),\n // never the callee (that is the `items.map` member access, which renders nothing).\n for (const a of n.arguments) visit(a as BabelNode);\n return;\n case 'ArrowFunctionExpression':\n case 'FunctionExpression':\n visit(n.body);\n return;\n case 'BlockStatement':\n for (const s of n.body) visit(s);\n return;\n case 'ReturnStatement':\n visit(n.argument);\n return;\n case 'IfStatement':\n visit(n.consequent);\n visit(n.alternate);\n return;\n case 'ArrayExpression':\n for (const el of n.elements) visit(el as BabelNode);\n return;\n default:\n return;\n }\n };\n\n visit(root);\n return out;\n}\n\nexport function looksLikeJsx(id: string, code: string): boolean {\n if (/\\.[jt]sx$/i.test(id)) return true;\n return /<\\/?[A-Za-z][\\w.-]*|<>/.test(code);\n}\n","/**\n * @domflax/frontend-jsx — the JSX/TSX → IR parse pass.\n *\n * Walks a Babel AST (`@babel/parser` → `@babel/traverse`) and lowers JSXElement /\n * JSXFragment / JSXText / JSXExpressionContainer / JSXSpreadChild nodes into the\n * `@domflax/core` IR. ALL dynamic JavaScript stays out of the structural IR: every\n * expression container, spread, and dynamic className/child is interned into the\n * document's {@link ExprRegistry} as an opaque {@link ExprRef} (with its verbatim source\n * slice as payload), and only its source span survives in the tree.\n *\n * Static `class`/`className` literals are split into {@link ClassToken}s on a static\n * {@link ClassSegment}; a non-string-literal className becomes a single dynamic segment\n * (opaque, never optimized). Static classes are resolved through the supplied\n * {@link StyleResolver} + {@link StyleNormalizer} into `element.computed` so downstream\n * patterns can match on resolved style.\n *\n * NodeMeta opacity barriers populated here: hasRef (`ref=`), hasEventHandlers (`on*=`),\n * hasKey (`key=`), hasSpreadAttrs (`{...x}`), hasDangerousHtml\n * (`dangerouslySetInnerHTML=`), hasDynamicChildren (any expression / spread child),\n * isComponent (capitalized / member tag). \"hasDynamicClasses\" is carried on the\n * {@link ClassList} itself (`hasDynamic` / `opaque`), not on NodeMeta.\n */\n\nimport { parse as babelParse } from '@babel/parser';\nimport type { NodePath } from '@babel/traverse';\nimport type {\n Expression,\n JSXAttribute,\n JSXElement,\n JSXEmptyExpression,\n JSXFragment,\n JSXOpeningElement,\n Node as BabelNode,\n} from '@babel/types';\n\nimport type {\n AttrMap,\n AttrValue,\n ClassList,\n ClassSegment,\n ClassToken,\n Diagnostic,\n ExprRef,\n FrontendParseContext,\n IRDocument,\n IRElement,\n IRFragment,\n IRNamespace,\n IRNodeId,\n MutableBackrefTable,\n NodeMeta,\n ParseResult,\n SourceFile,\n SourceSpan,\n StyleMap,\n} from '@domflax/core';\nimport {\n createDocument,\n createElement,\n createExpr,\n createFragment,\n createText,\n defaultMeta,\n emptyClassList,\n emptyStyleMap,\n} from '@domflax/core';\n\nimport type { ExprPayload } from './frontend-ast';\nimport {\n FILE_ID,\n attrName,\n classFormOf,\n exprKind,\n findNestedJsxRoots,\n isComponentName,\n jsxName,\n traverse,\n} from './frontend-ast';\n\nexport function doParse(code: string, ctx: FrontendParseContext): ParseResult {\n const diagnostics: Diagnostic[] = [];\n const doc: IRDocument = createDocument('jsx');\n const backref = doc.backref as MutableBackrefTable;\n\n const ast = babelParse(code, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript'],\n });\n\n const eol: '\\n' | '\\r\\n' = code.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const sourceFile: SourceFile = {\n id: FILE_ID,\n path: ctx.id,\n text: code,\n frontend: 'jsx',\n eol,\n indentUnit: ' ',\n native: ast,\n };\n doc.sources.set(FILE_ID, sourceFile);\n\n /* ----- span helpers (close over `code`) ----- */\n\n const spanOf = (node: BabelNode): SourceSpan | null => {\n if (node.start == null || node.end == null) return null;\n const span: SourceSpan = {\n file: FILE_ID,\n start: node.start,\n end: node.end,\n startLoc: node.loc\n ? { line: node.loc.start.line, column: node.loc.start.column }\n : undefined,\n endLoc: node.loc ? { line: node.loc.end.line, column: node.loc.end.column } : undefined,\n };\n return span;\n };\n\n const sliceOf = (node: BabelNode): string =>\n node.start == null || node.end == null ? '' : code.slice(node.start, node.end);\n\n /** Intern an expression as an opaque ExprRef, recording its verbatim source slice. */\n const internExpr = (node: Expression | JSXEmptyExpression, spread: boolean): ExprRef => {\n const payload: ExprPayload = { text: sliceOf(node), spread };\n return doc.exprs.intern({\n span: spanOf(node) ?? { file: FILE_ID, start: 0, end: 0 },\n kind: exprKind(node),\n payload,\n });\n };\n\n /* ----- class list ----- */\n\n const splitTokens = (raw: string): ClassToken[] =>\n raw\n .split(/\\s+/)\n .filter((t) => t.length > 0)\n .map((value) => ({ value }) as ClassToken);\n\n const buildClassList = (attr: JSXAttribute): ClassList => {\n const attrSpan = spanOf(attr) ?? undefined;\n const v = attr.value;\n\n const staticList = (tokens: ClassToken[], valueSpan: SourceSpan | null): ClassList => {\n const seg: ClassSegment = { kind: 'static', span: valueSpan ?? undefined, tokens };\n return {\n form: 'string-literal',\n segments: [seg],\n valueSpan,\n attrSpan,\n hasDynamic: false,\n opaque: false,\n rewritable: true,\n };\n };\n\n if (v == null) return staticList([], null);\n\n if (v.type === 'StringLiteral') {\n return staticList(splitTokens(v.value), spanOf(v));\n }\n\n if (v.type === 'JSXExpressionContainer') {\n const expr = v.expression;\n // `className={\"a b\"}` is still a static string literal.\n if (expr.type === 'StringLiteral') {\n return staticList(splitTokens(expr.value), spanOf(expr));\n }\n if (expr.type === 'JSXEmptyExpression') return staticList([], null);\n const ref = internExpr(expr, false);\n const valueSpan = spanOf(expr);\n const seg: ClassSegment = { kind: 'dynamic', span: valueSpan ?? undefined, expr: ref };\n return {\n form: classFormOf(expr),\n segments: [seg],\n valueSpan,\n attrSpan,\n hasDynamic: true,\n opaque: true,\n rewritable: false,\n };\n }\n\n return emptyClassList();\n };\n\n const staticTokensOf = (classes: ClassList): string[] => {\n const out: string[] = [];\n for (const seg of classes.segments) {\n if (seg.kind === 'static') for (const t of seg.tokens) out.push(t.value);\n }\n return out;\n };\n\n /* ----- attribute value ----- */\n\n const buildAttrValue = (attr: JSXAttribute): AttrValue => {\n const v = attr.value;\n if (v == null) return { kind: 'static', value: true, span: spanOf(attr) ?? undefined };\n if (v.type === 'StringLiteral') {\n return { kind: 'static', value: v.value, span: spanOf(v) ?? undefined };\n }\n if (v.type === 'JSXExpressionContainer') {\n if (v.expression.type === 'JSXEmptyExpression') {\n return { kind: 'static', value: true, span: spanOf(v) ?? undefined };\n }\n return { kind: 'dynamic', expr: internExpr(v.expression, false), span: spanOf(v) ?? undefined };\n }\n // JSXElement / JSXFragment used as an attribute value → opaque expression.\n return { kind: 'dynamic', expr: internExpr(v as Expression, false), span: spanOf(v) ?? undefined };\n };\n\n /* ----- node builders ----- */\n\n const buildNestedRoot = (jsx: JSXElement | JSXFragment, parentId: IRNodeId): IRNodeId =>\n jsx.type === 'JSXFragment' ? buildFragment(jsx, parentId) : buildElement(jsx, parentId);\n\n /** Lower a single JSX child, appending the resulting IR node id(s) onto `out`. */\n const appendChild = (\n node: JSXElement['children'][number],\n parentId: IRNodeId,\n out: IRNodeId[],\n ): void => {\n switch (node.type) {\n case 'JSXText': {\n const id = doc.alloc.next();\n doc.nodes.set(\n id,\n createText(id, node.value, {\n parent: parentId,\n span: spanOf(node),\n collapsible: /^\\s*$/.test(node.value),\n }),\n );\n out.push(id);\n return;\n }\n case 'JSXExpressionContainer': {\n const expr = node.expression;\n if (expr.type === 'JSXEmptyExpression') return; // `{/* comment */}`\n // A container whose WHOLE expression is a JSX node (`{<X/>}`) renders that node directly —\n // lower it as a real element so passes can optimize it (no opaque wrapper needed).\n if (expr.type === 'JSXElement' || expr.type === 'JSXFragment') {\n out.push(buildNestedRoot(expr, parentId));\n return;\n }\n // Otherwise the expression itself stays OPAQUE — the `.map`/condition/`{expr}` hole is\n // interned and preserved verbatim by the backend …\n const id = doc.alloc.next();\n const ref = internExpr(expr, false);\n doc.nodes.set(id, createExpr(id, ref, { parent: parentId, span: spanOf(node) }));\n out.push(id);\n // … but any JSX nested INSIDE it (map/filter callbacks, `&&`/`||`, ternary, parens) is\n // lowered to real element nodes (with their true source spans) so the pass manager descends\n // into and optimizes them too.\n for (const jsx of findNestedJsxRoots(expr)) out.push(buildNestedRoot(jsx, parentId));\n return;\n }\n case 'JSXSpreadChild': {\n const id = doc.alloc.next();\n const ref = internExpr(node.expression, true);\n doc.nodes.set(id, createExpr(id, ref, { parent: parentId, span: spanOf(node) }));\n out.push(id);\n for (const jsx of findNestedJsxRoots(node.expression)) {\n out.push(buildNestedRoot(jsx, parentId));\n }\n return;\n }\n case 'JSXElement':\n out.push(buildElement(node, parentId));\n return;\n case 'JSXFragment':\n out.push(buildFragment(node, parentId));\n return;\n default:\n return;\n }\n };\n\n const buildFragment = (node: JSXFragment, parentId: IRNodeId): IRNodeId => {\n const id = doc.alloc.next();\n const children: IRNodeId[] = [];\n for (const c of node.children) appendChild(c, id, children);\n doc.nodes.set(id, createFragment(id, { children, parent: parentId, span: spanOf(node) }));\n backref.set(id, {\n nodeId: id,\n span: spanOf(node) ?? { file: FILE_ID, start: 0, end: 0 },\n openTagSpan: spanOf(node.openingFragment),\n closeTagSpan: spanOf(node.closingFragment),\n innerSpan: null,\n selfClosing: false,\n });\n return id;\n };\n\n const buildElement = (node: JSXElement, parentId: IRNodeId): IRNodeId => {\n const id = doc.alloc.next();\n const opening: JSXOpeningElement = node.openingElement;\n const tag = jsxName(opening.name);\n const component = isComponentName(opening.name);\n\n const meta: NodeMeta = defaultMeta();\n meta.isComponent = component;\n\n let classes: ClassList = emptyClassList();\n const entries = new Map<string, AttrValue>();\n const order: string[] = [];\n const spreads: ExprRef[] = [];\n\n for (const attr of opening.attributes) {\n if (attr.type === 'JSXSpreadAttribute') {\n spreads.push(internExpr(attr.argument, true));\n meta.hasSpreadAttrs = true;\n continue;\n }\n const name = attrName(attr.name);\n if (name === 'className' || name === 'class') {\n classes = buildClassList(attr);\n continue;\n }\n if (name === 'ref') meta.hasRef = true;\n else if (name === 'key') meta.hasKey = true;\n else if (name === 'dangerouslySetInnerHTML') meta.hasDangerousHtml = true;\n else if (/^on[A-Z]/.test(name)) meta.hasEventHandlers = true;\n entries.set(name, buildAttrValue(attr));\n order.push(name);\n }\n\n const attrs: AttrMap = { entries, spreads, order };\n\n const children: IRNodeId[] = [];\n for (const c of node.children) appendChild(c, id, children);\n for (const cid of children) {\n const cn = doc.nodes.get(cid);\n if (cn && cn.kind === 'expr') {\n meta.hasDynamicChildren = true;\n break;\n }\n }\n\n // Resolve static classes (+ tag) into computed style via the injected resolver/normalizer.\n let computed: StyleMap = emptyStyleMap();\n if (!classes.hasDynamic) {\n const tokens = staticTokensOf(classes);\n if (tokens.length > 0) {\n const res = ctx.resolver.resolve({\n classes: tokens,\n element: { tagName: tag, namespace: component ? undefined : 'html' },\n });\n computed = ctx.normalizer.normalizeStyleMap(res.styles);\n for (const w of res.warnings) {\n diagnostics.push({\n code: 'DF_STYLE_CONFLICT_UNRESOLVED',\n severity: w.severity,\n message: w.message,\n nodeId: id,\n });\n }\n }\n }\n\n const namespace: IRNamespace = component ? 'component' : 'html';\n const el: IRElement = createElement(id, {\n tag,\n namespace,\n isComponent: component,\n selfClosing: opening.selfClosing,\n classes,\n computed,\n attrs,\n children,\n parent: parentId,\n span: spanOf(node),\n meta,\n });\n doc.nodes.set(id, el);\n\n const inner =\n children.length > 0\n ? spanOf(node.children[0]! as BabelNode) && spanOf(node.children.at(-1)! as BabelNode)\n ? {\n file: FILE_ID,\n start: spanOf(node.children[0]! as BabelNode)!.start,\n end: spanOf(node.children.at(-1)! as BabelNode)!.end,\n }\n : null\n : null;\n backref.set(id, {\n nodeId: id,\n span: spanOf(node) ?? { file: FILE_ID, start: 0, end: 0 },\n openTagSpan: spanOf(opening),\n closeTagSpan: node.closingElement ? spanOf(node.closingElement) : null,\n innerSpan: inner,\n selfClosing: opening.selfClosing,\n });\n return id;\n };\n\n /* ----- collect the outermost JSX islands and attach them to the root fragment ----- */\n\n const roots: (JSXElement | JSXFragment)[] = [];\n traverse(ast, {\n JSXElement(path: NodePath<JSXElement>) {\n roots.push(path.node);\n path.skip();\n },\n JSXFragment(path: NodePath<JSXFragment>) {\n roots.push(path.node);\n path.skip();\n },\n });\n\n const rootFrag = doc.nodes.get(doc.root) as IRFragment;\n for (const r of roots) {\n const id = r.type === 'JSXFragment' ? buildFragment(r, doc.root) : buildElement(r, doc.root);\n rootFrag.children.push(id);\n }\n\n return { doc, diagnostics };\n}\n","/**\n * @domflax/frontend-jsx — Babel JSX/TSX → IR frontend.\n *\n * Walks a Babel AST (`@babel/parser` → `@babel/traverse`) and lowers JSXElement /\n * JSXFragment / JSXText / JSXExpressionContainer / JSXSpreadChild nodes into the\n * `@domflax/core` IR. ALL dynamic JavaScript stays out of the structural IR: every\n * expression container, spread, and dynamic className/child is interned into the\n * document's {@link ExprRegistry} as an opaque {@link ExprRef} (with its verbatim source\n * slice as payload), and only its source span survives in the tree.\n *\n * Static `class`/`className` literals are split into {@link ClassToken}s on a static\n * {@link ClassSegment}; a non-string-literal className becomes a single dynamic segment\n * (opaque, never optimized). Static classes are resolved through the supplied\n * {@link StyleResolver} + {@link StyleNormalizer} into `element.computed` so downstream\n * patterns can match on resolved style.\n *\n * NodeMeta opacity barriers populated here: hasRef (`ref=`), hasEventHandlers (`on*=`),\n * hasKey (`key=`), hasSpreadAttrs (`{...x}`), hasDangerousHtml\n * (`dangerouslySetInnerHTML=`), hasDynamicChildren (any expression / spread child),\n * isComponent (capitalized / member tag). \"hasDynamicClasses\" is carried on the\n * {@link ClassList} itself (`hasDynamic` / `opaque`), not on NodeMeta.\n *\n * The pure AST/classification helpers live in `./frontend-ast`; the parse pass itself\n * lives in `./frontend-parse`. This module is the public assembly point.\n */\n\nimport type { Frontend, FrontendParseContext, ParseResult } from '@domflax/core';\n\nimport { JSX_LANGS, looksLikeJsx } from './frontend-ast';\nimport { doParse } from './frontend-parse';\n\nexport const jsxFrontend: Frontend = {\n name: 'babel-jsx',\n langs: JSX_LANGS,\n canParse(id: string, code: string): boolean {\n return looksLikeJsx(id, code);\n },\n parse(code: string, ctx: FrontendParseContext): ParseResult {\n return doParse(code, ctx);\n },\n};\n\n/** Factory mirror — returns a fresh handle to the (stateless) JSX frontend. */\nexport function createJsxFrontend(): Frontend {\n return jsxFrontend;\n}\n","/**\n * @domflax/frontend-jsx — IR → JSX/TSX backend (SURGICAL, full-module round-trip).\n *\n * The pass manager mutates a tree of JSX *islands* that were lowered from a complete module\n * (imports, `export default function`, hooks, `return (…)`, `{expr}` holes, comments, …). The\n * backend's job is to emit a COMPLETE, valid module — not just the JSX subtree. It does this by\n * starting from the element's ORIGINAL verbatim source (retained on {@link SourceFile.text}) and\n * applying ONLY the diffs the passes produced, via `magic-string`:\n *\n * • CLASS CHANGE — for every surviving element whose static class list differs from its source\n * text, overwrite just the `class`/`className` attribute VALUE span (quotes included) with the\n * new tokens. If the element gained classes but had no class attribute, insert one on the\n * opening tag.\n * • UNWRAP (flatten) — when a wrapper element/fragment was removed but its children survived,\n * delete ONLY the wrapper's open- and close-tag spans; the children (and their entire subtrees,\n * including dynamic `{expr}` holes and `key=`) are preserved verbatim.\n * • FULL REMOVAL — when a node was removed with no surviving descendant, delete its whole span.\n *\n * Every other byte — imports, exports, function declarations, returns, hooks, `{expr}` holes,\n * whitespace, comments, attribute ordering — is left exactly as authored. Output is\n * `magicString.toString()`: a complete module.\n *\n * Fallback: a document with no retained source (e.g. a hand-synthesized IR) cannot be spliced, so\n * it falls back to a clean structural re-print ({@link rePrint}).\n */\n\nimport MagicString from 'magic-string';\n\nimport type {\n AttrValue,\n Backend,\n BackendContext,\n Backref,\n ClassList,\n CodegenResult,\n EditPlan,\n ExprRef,\n FileKind,\n IRDocument,\n IRElement,\n IRNode,\n IRNodeId,\n SourceFile,\n SourceSpan,\n} from '@domflax/core';\n\nconst JSX_LANGS: readonly FileKind[] = ['jsx', 'tsx'];\n\ninterface ExprPayload {\n readonly text: string;\n readonly spread: boolean;\n}\n\n/* ───────────────────────── shared expr/class helpers ───────────────────────── */\n\n/** Recover an interned expression's source text (payload first, span-slice fallback). */\nfunction exprText(doc: IRDocument, ref: ExprRef): ExprPayload {\n const rec = doc.exprs.get(ref);\n const payload = rec?.payload as Partial<ExprPayload> | undefined;\n if (payload && typeof payload.text === 'string') {\n return { text: payload.text, spread: payload.spread === true };\n }\n if (rec) {\n const sf = doc.sources.get(rec.span.file);\n if (sf) return { text: sf.text.slice(rec.span.start, rec.span.end), spread: false };\n }\n return { text: '', spread: false };\n}\n\n/** All static class tokens of a {@link ClassList}, in order. */\nfunction staticTokensOf(classes: ClassList): string[] {\n const out: string[] = [];\n for (const seg of classes.segments) {\n if (seg.kind === 'static') for (const t of seg.tokens) out.push(t.value);\n }\n return out;\n}\n\n/* ───────────────────────── surgical (magic-string) codegen ───────────────────────── */\n\n/** Pick the single retained source file this document was parsed from (if any). */\nfunction primarySource(doc: IRDocument): SourceFile | null {\n for (const sf of doc.sources.values()) {\n if (typeof sf.text === 'string' && sf.text.length > 0) return sf;\n }\n return null;\n}\n\n/** Collect every node reachable from the root of the (mutated) tree. */\nfunction collectKept(doc: IRDocument): IRNode[] {\n const out: IRNode[] = [];\n const seen = new Set<IRNodeId>();\n const visit = (id: IRNodeId): void => {\n if (seen.has(id)) return;\n seen.add(id);\n const n = doc.nodes.get(id);\n if (!n) return;\n out.push(n);\n if (n.kind === 'element' || n.kind === 'fragment') for (const c of n.children) visit(c);\n };\n visit(doc.root);\n return out;\n}\n\n/** Span `a` strictly contains span `b` (same file, b nested inside, not identical). */\nfunction strictlyContains(a: SourceSpan, b: SourceSpan): boolean {\n if (a.file !== b.file) return false;\n if (a.start <= b.start && b.end <= a.end) return !(a.start === b.start && a.end === b.end);\n return false;\n}\n\ninterface RemovedRegion {\n readonly backref: Backref;\n /** A surviving node nested inside this region ⇒ this was an UNWRAP (keep inner, drop tags). */\n readonly unwrapped: boolean;\n}\n\n/**\n * Apply the class-list diff for a single surviving element. Returns true if an edit was made.\n */\nfunction editClasses(ms: MagicString, doc: IRDocument, sf: SourceFile, el: IRElement): boolean {\n const classes = el.classes;\n // Wholly dynamic / opaque class lists are never rewritten by the passes — leave verbatim.\n if (classes.hasDynamic || classes.opaque) return false;\n\n const tokens = staticTokensOf(classes);\n const valueSpan = classes.valueSpan;\n\n if (valueSpan && valueSpan.file === sf.id) {\n const current = sf.text.slice(valueSpan.start, valueSpan.end);\n // Preserve the original quote style; default to double quotes when we can't detect one.\n const quote = current.startsWith(\"'\") ? \"'\" : '\"';\n const next = `${quote}${tokens.join(' ')}${quote}`;\n if (current !== next) {\n ms.overwrite(valueSpan.start, valueSpan.end, next);\n return true;\n }\n return false;\n }\n\n // No class attribute originally, but the passes added classes ⇒ insert one on the opening tag.\n if (tokens.length === 0) return false;\n if (el.isComponent) return false; // never synthesize className onto an opaque component\n const back = doc.backref.get(el.id);\n const openTag = back?.openTagSpan;\n if (!openTag || openTag.file !== sf.id) return false;\n // Insert immediately after the tag name: `<tag‸ …`.\n const insertAt = openTag.start + 1 + el.tag.length;\n ms.appendLeft(insertAt, ` className=\"${tokens.join(' ')}\"`);\n return true;\n}\n\n/**\n * Extract a `key=…` attribute (verbatim, e.g. `key={f.id}` or `key=\"row\"`) from an opening-tag's\n * source text, or null when the tag carries no key. Brace/quote-aware so `key={f.id}` with nested\n * braces is captured whole. Requires whitespace before `key` so `data-key=` / `aria-keyshortcuts=`\n * never false-match.\n */\nfunction extractKeyAttr(openTag: string): string | null {\n const m = /(^|\\s)key\\s*=\\s*/.exec(openTag);\n if (!m) return null;\n const keyStart = m.index + m[1].length;\n let i = m.index + m[0].length;\n const ch = openTag[i];\n if (ch === '{') {\n let depth = 0;\n for (; i < openTag.length; i += 1) {\n const c = openTag[i];\n if (c === '{') depth += 1;\n else if (c === '}') {\n depth -= 1;\n if (depth === 0) {\n i += 1;\n break;\n }\n }\n }\n } else if (ch === '\"' || ch === \"'\") {\n const q = ch;\n i += 1;\n for (; i < openTag.length; i += 1) {\n if (openTag[i] === q) {\n i += 1;\n break;\n }\n }\n } else {\n for (; i < openTag.length; i += 1) {\n if (/[\\s>/]/.test(openTag[i]!)) break;\n }\n }\n return openTag.slice(keyStart, i);\n}\n\n/**\n * KEY SAFETY: when an UNWRAPPED wrapper carried a React `key`, that key must not vanish with the\n * deleted tags. If the wrapper had exactly one surviving (maximal) element child and that child has\n * no key of its own, transfer the wrapper's `key=…` verbatim onto the survivor's opening tag.\n * Conservative: anything ambiguous (no surviving element child, multiple survivors, child already\n * keyed) is left untouched (the flatten pattern is expected to have refused such a case).\n */\nfunction transferKeyOnUnwrap(\n ms: MagicString,\n doc: IRDocument,\n sf: SourceFile,\n region: Backref,\n kept: readonly IRNode[],\n): void {\n const open = region.openTagSpan;\n if (!open || open.file !== sf.id) return;\n const keyAttr = extractKeyAttr(sf.text.slice(open.start, open.end));\n if (!keyAttr) return;\n\n const inside: IRElement[] = [];\n for (const n of kept) {\n if (n.kind !== 'element' || !n.span || n.span.file !== sf.id) continue;\n if (strictlyContains(region.span, n.span)) inside.push(n);\n }\n // Keep only the topmost survivors (not nested inside another survivor of this region).\n const maximal = inside.filter(\n (n) => !inside.some((o) => o !== n && o.span && n.span && strictlyContains(o.span, n.span)),\n );\n if (maximal.length !== 1) return;\n\n const child = maximal[0]!;\n const childOpen = doc.backref.get(child.id)?.openTagSpan;\n if (!childOpen || childOpen.file !== sf.id) return;\n if (extractKeyAttr(sf.text.slice(childOpen.start, childOpen.end))) return; // already keyed\n\n // Insert immediately after the child's tag name: `<tag‸ …`.\n ms.appendLeft(childOpen.start + 1 + child.tag.length, ` ${keyAttr}`);\n}\n\n/** Surgical full-module codegen. Returns null when the document has no retained source. */\nfunction surgicalPrint(doc: IRDocument): string | null {\n const sf = primarySource(doc);\n if (!sf) return null;\n\n const ms = new MagicString(sf.text);\n\n const kept = collectKept(doc);\n const keptSpans: SourceSpan[] = [];\n for (const n of kept) if (n.span && n.span.file === sf.id) keptSpans.push(n.span);\n\n // 1) Structural removals. A node present in the backref table but absent from the live node map\n // was removed by the passes. Classify each as an UNWRAP (a surviving node nests inside it) or\n // a FULL removal (nothing survived inside).\n const removed: RemovedRegion[] = [];\n for (const id of backrefIds(doc)) {\n if (doc.nodes.has(id)) continue; // still live\n const back = doc.backref.get(id);\n if (!back || back.span.file !== sf.id) continue;\n const unwrapped = keptSpans.some((k) => strictlyContains(back.span, k));\n removed.push({ backref: back, unwrapped });\n }\n\n // Skip any removed region nested inside a FULL-removal region (its bytes are already deleted by\n // the ancestor) — this keeps every delete disjoint, which magic-string requires.\n const fullRemovals = removed.filter((r) => !r.unwrapped).map((r) => r.backref.span);\n for (const r of removed) {\n const span = r.backref.span;\n const coveredByFull = fullRemovals.some((f) => f !== span && strictlyContains(f, span));\n if (coveredByFull) continue;\n\n if (r.unwrapped) {\n // KEY SAFETY: salvage a `key=…` off the wrapper onto its surviving child before deleting tags.\n transferKeyOnUnwrap(ms, doc, sf, r.backref, kept);\n // Delete only the wrapper's tags; keep its (surviving) inner content verbatim.\n const open = r.backref.openTagSpan;\n const close = r.backref.closeTagSpan;\n if (open && open.file === sf.id && open.end > open.start) ms.remove(open.start, open.end);\n if (close && close.file === sf.id && close.end > close.start) {\n ms.remove(close.start, close.end);\n }\n } else {\n ms.remove(span.start, span.end);\n }\n }\n\n // 2) Class-list diffs on every surviving element.\n for (const n of kept) {\n if (n.kind === 'element') editClasses(ms, doc, sf, n);\n }\n\n return ms.toString();\n}\n\n/** All ids the backref table knows about (every originally-parsed element / fragment). */\nfunction backrefIds(doc: IRDocument): IRNodeId[] {\n // The backref table is shared verbatim from parse time; collect ids by scanning original spans we\n // recorded for live + removed nodes. We don't have a public iterator, so reconstruct the universe\n // from the live nodes plus their (now-removed) original ancestry isn't possible directly — instead\n // ask the table for each id we can reach. The table exposes `get`; the set of candidate ids is the\n // contiguous allocation range [1, alloc.peek). Scanning that range is O(n) and dependency-free.\n const out: IRNodeId[] = [];\n const max = doc.alloc.peek as unknown as number;\n for (let i = 1; i < max; i += 1) {\n const id = i as IRNodeId;\n if (doc.backref.get(id)) out.push(id);\n }\n return out;\n}\n\n/* ───────────────────────── structural re-print (fallback) ───────────────────────── */\n\n/** Re-build the `className=…` attribute (or null when the element has no class list). */\nfunction classText(doc: IRDocument, classes: ClassList): string | null {\n if (classes.form === 'absent' || classes.segments.length === 0) return null;\n\n const dynamic = classes.segments.find((s) => s.kind === 'dynamic');\n if (dynamic && dynamic.kind === 'dynamic') {\n return `className={${exprText(doc, dynamic.expr).text}}`;\n }\n\n const tokens = staticTokensOf(classes);\n return `className=\"${tokens.join(' ')}\"`;\n}\n\nfunction attrText(doc: IRDocument, name: string, value: AttrValue): string {\n if (value.kind === 'static') {\n if (value.value === true) return name;\n if (value.value === false) return '';\n return `${name}=\"${String(value.value)}\"`;\n }\n return `${name}={${exprText(doc, value.expr).text}}`;\n}\n\nfunction printElement(doc: IRDocument, el: IRElement): string {\n const parts: string[] = [];\n\n const cls = classText(doc, el.classes);\n if (cls !== null) parts.push(cls);\n\n for (const name of el.attrs.order) {\n const v = el.attrs.entries.get(name);\n if (!v) continue;\n const text = attrText(doc, name, v);\n if (text.length > 0) parts.push(text);\n }\n\n for (const ref of el.attrs.spreads) parts.push(`{...${exprText(doc, ref).text}}`);\n\n const attrStr = parts.length > 0 ? ` ${parts.join(' ')}` : '';\n const tag = el.tag;\n\n if (el.children.length === 0) {\n return el.selfClosing ? `<${tag}${attrStr} />` : `<${tag}${attrStr}></${tag}>`;\n }\n\n const inner = el.children.map((c) => printNode(doc, c)).join('');\n return `<${tag}${attrStr}>${inner}</${tag}>`;\n}\n\nfunction printNode(doc: IRDocument, id: IRNodeId): string {\n const node = doc.nodes.get(id);\n if (!node) return '';\n switch (node.kind) {\n case 'text':\n return node.value;\n case 'comment':\n return `{/*${node.value}*/}`;\n case 'expr': {\n const { text, spread } = exprText(doc, node.expr);\n return spread ? `{...${text}}` : `{${text}}`;\n }\n case 'fragment':\n return `<>${node.children.map((c) => printNode(doc, c)).join('')}</>`;\n case 'element':\n return printElement(doc, node);\n }\n}\n\nfunction rePrint(doc: IRDocument): string {\n const root = doc.nodes.get(doc.root);\n if (!root || root.kind !== 'fragment') return printNode(doc, doc.root);\n return root.children.map((c) => printNode(doc, c)).join('');\n}\n\n/* ───────────────────────── public backend ───────────────────────── */\n\nfunction doPrint(doc: IRDocument): string {\n const surgical = surgicalPrint(doc);\n return surgical ?? rePrint(doc);\n}\n\nexport const jsxBackend: Backend = {\n name: 'babel-jsx',\n langs: JSX_LANGS,\n print(doc: IRDocument, _plan: EditPlan, _ctx: BackendContext): CodegenResult {\n const code = doPrint(doc);\n return { code, map: null, edits: [], diagnostics: [] };\n },\n};\n\n/** Factory mirror — returns a fresh handle to the (stateless) JSX backend. */\nexport function createJsxBackend(): Backend {\n return jsxBackend;\n}\n","/**\n * domflax — the single-file JSX/TSX pipeline runner (parse → resolve → flatten → reverse-emit →\n * print), split out of `index.ts` so the meta package's barrel + adapters stay focused.\n *\n * {@link runJsxPipeline} is SYNC and fully static (gate `'provably-safe'`): it never changes rendering\n * and never launches a browser.\n */\n\nimport {\n buildSelectorIndex,\n createSyntheticSink,\n runPasses,\n syncClassesFromComputed,\n} from '@domflax/core';\nimport type {\n ApplyContext,\n FileKind,\n FlattenGate,\n IRDocument,\n Pass,\n PassCategory,\n PassPhase,\n Pattern,\n SafetyLevel,\n StyleResolver,\n} from '@domflax/core';\nimport { createHtmlBackend, createHtmlFrontend } from '@domflax/frontend-html';\nimport { createJsxBackend, createJsxFrontend } from '@domflax/frontend-jsx';\nimport { normalizer } from '@domflax/pattern-kit';\n\n/** `.tsx`/`.jsx` ⇒ the matching {@link FileKind}; anything else ⇒ null (no JSX frontend). */\nexport function jsxKindOf(id: string): FileKind | null {\n const clean = id.split('?', 1)[0] ?? id;\n if (clean.endsWith('.tsx')) return 'tsx';\n if (clean.endsWith('.jsx')) return 'jsx';\n return null;\n}\n\n/** `.html`/`.htm` ⇒ `'html'`; anything else ⇒ null (no HTML frontend). */\nexport function htmlKindOf(id: string): FileKind | null {\n const clean = (id.split('?', 1)[0] ?? id).toLowerCase();\n if (clean.endsWith('.html') || clean.endsWith('.htm')) return 'html';\n return null;\n}\n\n/** First registered source's EOL, defaulting to `\\n`. */\nfunction eolOf(doc: IRDocument): '\\n' | '\\r\\n' {\n for (const src of doc.sources.values()) return src.eol;\n return '\\n';\n}\n\n/** Group the flat pattern list into one {@link Pass} per {@link PassPhase} (derived from category). */\nfunction buildPasses(patterns: readonly Pattern[]): Pass[] {\n const byPhase = new Map<PassPhase, Pattern[]>();\n for (const p of patterns) {\n const phase = (p.category.split('/', 1)[0] ?? 'flatten') as PassPhase;\n let bucket = byPhase.get(phase);\n if (!bucket) {\n bucket = [];\n byPhase.set(phase, bucket);\n }\n bucket.push(p);\n }\n const passes: Pass[] = [];\n for (const [phase, pats] of byPhase) {\n passes.push({ phase, category: `${phase}/builtin` as PassCategory, patterns: pats });\n }\n return passes;\n}\n\n/** The parsed, authorized doc + the apply context + grouped passes, shared by sync + async runs. */\ninterface PreparedRun {\n readonly doc: IRDocument;\n readonly ctx: ApplyContext;\n readonly passes: readonly Pass[];\n}\n\n/** PARSE (JSX → IR, resolving classes onto `computed`) + AUTHORIZE + build the apply context. */\nfunction preparePipeline(\n code: string,\n id: string,\n kind: FileKind,\n resolver: StyleResolver,\n patterns: readonly Pattern[],\n safety: SafetyLevel,\n gate: FlattenGate,\n): PreparedRun {\n const parsed = createJsxFrontend().parse(code, {\n id,\n kind,\n resolver,\n normalizer,\n config: {},\n onDiagnostic: () => {},\n });\n const doc = parsed.doc;\n\n // AUTHORIZE — the JSX frontend defaults every node's safety floor to 0. The orchestrator opens the\n // floor to the max; the configured ceiling + each pattern's opacity predicates are the real gate.\n for (const node of doc.nodes.values()) node.meta.safetyFloor = 3;\n\n const ctx: ApplyContext = {\n doc,\n safetyCeiling: safety,\n normalizer,\n // Real CSS-selector-safety index from the active resolver: a wrapper a combinator/structural\n // selector depends on is flagged so the flatten guards refuse to flatten it. Tailwind (no\n // complexSelectors) degrades to the null index — behaviour unchanged.\n selectors: buildSelectorIndex(doc, resolver),\n resolver,\n gate,\n };\n return { doc, ctx, passes: buildPasses(patterns) };\n}\n\n/** REVERSE-EMIT optimized computed styles back into class tokens, then PRINT IR → JSX/TSX text. */\nfunction finishPipeline(optimized: IRDocument, id: string, resolver: StyleResolver): string {\n syncClassesFromComputed(optimized, resolver, normalizer);\n const printed = createJsxBackend().print(\n optimized,\n { moduleId: id, ops: [], provenance: new Map() },\n {\n normalizer,\n resolver,\n sink: createSyntheticSink(),\n eol: eolOf(optimized),\n onDiagnostic: () => {},\n },\n );\n return printed.code;\n}\n\n/** SYNC full pipeline (gate `'provably-safe'` — never changes rendering, never launches a browser). */\nexport function runJsxPipeline(\n code: string,\n id: string,\n kind: FileKind,\n resolver: StyleResolver,\n patterns: readonly Pattern[],\n safety: SafetyLevel,\n): string {\n const { doc, ctx, passes } = preparePipeline(code, id, kind, resolver, patterns, safety, 'provably-safe');\n const { doc: optimized } = runPasses(doc, passes, ctx);\n return finishPipeline(optimized, id, resolver);\n}\n\n/* ───────────────────────── HTML pipeline (parse5 frontend/backend) ───────────────────────── */\n\n/**\n * PARSE (HTML → IR, resolving classes onto `computed`) + AUTHORIZE + build the apply context. Unlike\n * the JSX path, the HTML frontend sets per-node `safetyFloor` itself (opaque nodes → 0), so we must\n * NOT blanket-open every node to 3 (that would strip the opacity floors).\n */\nfunction prepareHtml(\n code: string,\n id: string,\n resolver: StyleResolver,\n patterns: readonly Pattern[],\n safety: SafetyLevel,\n gate: FlattenGate,\n): PreparedRun {\n const parsed = createHtmlFrontend().parse(code, {\n id,\n kind: 'html',\n resolver,\n normalizer,\n config: {},\n onDiagnostic: () => {},\n });\n const doc = parsed.doc;\n const ctx: ApplyContext = {\n doc,\n safetyCeiling: safety,\n normalizer,\n selectors: buildSelectorIndex(doc, resolver),\n resolver,\n gate,\n };\n return { doc, ctx, passes: buildPasses(patterns) };\n}\n\n/** REVERSE-EMIT optimized computed styles back into class tokens, then PRINT IR → HTML text. */\nfunction finishHtmlPipeline(optimized: IRDocument, id: string, resolver: StyleResolver): string {\n syncClassesFromComputed(optimized, resolver, normalizer);\n const printed = createHtmlBackend().print(\n optimized,\n { moduleId: id, ops: [], provenance: new Map() },\n {\n normalizer,\n resolver,\n sink: createSyntheticSink(),\n eol: eolOf(optimized),\n onDiagnostic: () => {},\n },\n );\n return printed.code;\n}\n\n/** SYNC full HTML pipeline (gate `'provably-safe'` — surgical span edits over verbatim source). */\nexport function runHtmlPipeline(\n code: string,\n id: string,\n resolver: StyleResolver,\n patterns: readonly Pattern[],\n safety: SafetyLevel,\n): string {\n const { doc, ctx, passes } = prepareHtml(code, id, resolver, patterns, safety, 'provably-safe');\n const { doc: optimized } = runPasses(doc, passes, ctx);\n return finishHtmlPipeline(optimized, id, resolver);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACKA,IAAM,mBAAmB,MACvB,OAAO,aAAa,cAChB,IAAI,IAAI,QAAQ,UAAU,EAAE,EAAE,OAC7B,SAAS,iBAAiB,SAAS,cAAc,QAAQ,YAAY,MAAM,WAC1E,SAAS,cAAc,MACvB,IAAI,IAAI,WAAW,SAAS,OAAO,EAAE;AAEtC,IAAM,gBAAgC,iCAAiB;;;ACgCvD,SAAS,kBAAkB,QAAQ,GAAgB;AACxD,MAAI,IAAI;AACR,SAAO;AAAA,IACL,OAAiB;AACf,YAAM,KAAK;AACX,WAAK;AACL,aAAO;AAAA,IACT;AAAA,IACA,IAAI,OAAiB;AACnB,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAGO,SAAS,mBAAmB,QAAQ,GAAiB;AAC1D,QAAM,MAAM,oBAAI,IAAyB;AACzC,MAAI,IAAI;AACR,SAAO;AAAA,IACL,IAAI,GAAoC;AACtC,aAAO,IAAI,IAAI,CAAC;AAAA,IAClB;AAAA,IACA,OAAO,KAAuC;AAC5C,YAAM,MAAM;AACZ,WAAK;AACL,UAAI,IAAI,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;AAC5B,aAAO;AAAA,IACT;AAAA,IACA,kBAAwB;AACtB,iBAAW,CAAC,GAAG,CAAC,KAAK,IAAK,KAAI,IAAI,GAAG,EAAE,GAAG,GAAG,SAAS,OAAU,CAAC;AAAA,IACnE;AAAA,EACF;AACF;AAOO,SAAS,qBAA0C;AACxD,QAAM,MAAM,oBAAI,IAAuB;AACvC,SAAO;AAAA,IACL,IAAI,IAAmC;AACrC,aAAO,IAAI,IAAI,EAAE;AAAA,IACnB;AAAA,IACA,KAAK,IAAiC;AACpC,aAAO,IAAI,IAAI,EAAE,GAAG,QAAQ;AAAA,IAC9B;AAAA,IACA,aAAa,IAAiC;AAC5C,aAAO,IAAI,IAAI,EAAE,GAAG,aAAa;AAAA,IACnC;AAAA,IACA,IAAI,IAAc,SAAwB;AACxC,UAAI,IAAI,IAAI,OAAO;AAAA,IACrB;AAAA,EACF;AACF;AAKO,SAAS,YAAY,cAA2B,GAAa;AAClE,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,kBAAkB;AAAA,IAClB,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,sBAAsB;AAAA,IACtB,4BAA4B;AAAA,IAC5B,oBAAoB;AAAA,IACpB,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,4BAA4B;AAAA,IAC5B,mBAAmB;AAAA,IACnB,8BAA8B;AAAA,IAC9B,0BAA0B;AAAA,IAC1B,qBAAqB;AAAA,IACrB,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,WAAW;AAAA,IACX;AAAA,EACF;AACF;AAGO,IAAM,iBAAiC,EAAE,OAAO,IAAI,QAAQ,CAAC,GAAG,eAAe,GAAG;AAGlF,SAAS,aAAa,GAAiC;AAC5D,QAAM,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG;AAC5C,SAAO,GAAG,EAAE,KAAK,IAAI,MAAM,IAAI,EAAE,aAAa;AAChD;AAEO,IAAM,qBAAmC,aAAa,cAAc;AAGpE,SAAS,gBAA0B;AACxC,SAAO,EAAE,QAAQ,oBAAI,IAA8B,EAAE;AACvD;AAGO,SAAS,iBAA4B;AAC1C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,CAAC;AAAA,IACX,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AACF;AAGO,SAAS,eAAwB;AACtC,SAAO,EAAE,SAAS,oBAAI,IAAI,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,EAAE;AACtD;AAGO,SAAS,mBAAgC;AAC9C,SAAO,EAAE,OAAO,oBAAI,IAAwB,GAA2B,SAAS,KAAK;AACvF;AAmBO,SAAS,cAAc,IAAc,MAA8B;AACxE,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,QAAQ,KAAK,UAAU;AAAA,IACvB,MAAM,KAAK,QAAQ;AAAA,IACnB,MAAM,KAAK,QAAQ,YAAY;AAAA,IAC/B,KAAK,KAAK;AAAA,IACV,WAAW,KAAK,aAAa;AAAA,IAC7B,aAAa,KAAK,eAAe;AAAA,IACjC,aAAa,KAAK,eAAe;AAAA,IACjC,SAAS,KAAK,WAAW,eAAe;AAAA,IACxC,aAAa,KAAK,eAAe,iBAAiB;AAAA,IAClD,UAAU,KAAK,YAAY,cAAc;AAAA,IACzC,OAAO,KAAK,SAAS,aAAa;AAAA,IAClC,UAAU,KAAK,YAAY,CAAC;AAAA,EAC9B;AACF;AAEO,SAAS,WACd,IACA,OACA,MACQ;AACR,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,QAAQ,MAAM,UAAU;AAAA,IACxB,MAAM,MAAM,QAAQ;AAAA,IACpB,MAAM,YAAY;AAAA,IAClB;AAAA,IACA,aAAa,MAAM,eAAe;AAAA,EACpC;AACF;AAEO,SAAS,WACd,IACA,MACA,MACQ;AACR,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,QAAQ,MAAM,UAAU;AAAA,IACxB,MAAM,MAAM,QAAQ;AAAA,IACpB,MAAM,YAAY;AAAA,IAClB;AAAA,EACF;AACF;AAEO,SAAS,eACd,IACA,MACY;AACZ,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,QAAQ,MAAM,UAAU;AAAA,IACxB,MAAM,MAAM,QAAQ;AAAA,IACpB,MAAM,YAAY;AAAA,IAClB,UAAU,MAAM,YAAY,CAAC;AAAA,EAC/B;AACF;AAEO,SAAS,cACd,IACA,OACA,MACW;AACX,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,QAAQ,MAAM,UAAU;AAAA,IACxB,MAAM,MAAM,QAAQ;AAAA,IACpB,MAAM,YAAY;AAAA,IAClB;AAAA,EACF;AACF;AAGO,SAAS,eAAe,UAAoC;AACjE,QAAM,QAAQ,kBAAkB;AAChC,QAAM,SAAS,MAAM,KAAK;AAC1B,QAAM,OAAO,eAAe,MAAM;AAClC,QAAM,QAAQ,oBAAI,IAAsB,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;AACxD,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,OAAO,mBAAmB;AAAA,IAC1B,SAAS,oBAAI,IAAI;AAAA,IACjB,SAAS,mBAAmB;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AACF;AAKO,SAAS,SAAS,MAAmC;AAC1D,SAAO,KAAK,SAAS,aAAa,KAAK,SAAS,aAAa,KAAK,WAAW,CAAC;AAChF;AAQO,SAAS,WAAW,KAAiB,IAAqC;AAC/E,QAAM,IAAI,IAAI,MAAM,IAAI,EAAE;AAC1B,SAAO,KAAK,EAAE,SAAS,YAAY,IAAI;AACzC;AAGO,SAAS,WAAW,KAA6B;AACtD,QAAM,MAAkB,CAAC;AACzB,QAAM,QAAQ,CAAC,OAAuB;AACpC,UAAM,IAAI,IAAI,MAAM,IAAI,EAAE;AAC1B,QAAI,CAAC,EAAG;AACR,QAAI,EAAE,SAAS,UAAW,KAAI,KAAK,EAAE;AACrC,eAAW,KAAK,SAAS,CAAC,EAAG,OAAM,CAAC;AAAA,EACtC;AACA,QAAM,IAAI,IAAI;AACd,SAAO;AACT;;;ACzPO,SAAS,cAAc,IAAwB;AACpD,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,WAAO,IAAI,KAAK;AAAA,MACd,WAAW,MAAM;AAAA,MACjB,OAAO,IAAI,IAA4B,MAAM,KAAK;AAAA,IACpD,CAAC;AAAA,EACH;AACA,SAAO,EAAE,OAAO;AAClB;AAEA,SAAS,UAAU,MAAsB;AACvC,QAAM,OAAO,EAAE,GAAG,KAAK,KAAK;AAC5B,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA,UAAU,CAAC,GAAG,KAAK,QAAQ;AAAA,QAC3B,UAAU,cAAc,KAAK,QAAQ;AAAA,MACvC;AAAA,IACF,KAAK;AACH,aAAO,EAAE,GAAG,MAAM,MAAM,UAAU,CAAC,GAAG,KAAK,QAAQ,EAAE;AAAA,IACvD;AACE,aAAO,EAAE,GAAG,MAAM,KAAK;AAAA,EAC3B;AACF;AAGO,SAAS,cAAc,KAA6B;AACzD,QAAM,QAAQ,oBAAI,IAAsB;AACxC,aAAW,CAAC,IAAI,CAAC,KAAK,IAAI,MAAO,OAAM,IAAI,IAAI,UAAU,CAAC,CAAC;AAC3D,SAAO;AAAA,IACL,MAAM,IAAI;AAAA,IACV;AAAA,IACA,OAAO,IAAI;AAAA,IACX,SAAS,IAAI;AAAA,IACb,SAAS,IAAI;AAAA,IACb,UAAU,IAAI;AAAA,IACd,OAAO,IAAI;AAAA,EACb;AACF;AAIO,SAAS,KACd,MACA,SACA,OACY;AACZ,SAAO,EAAE,MAAM,UAAU,QAAQ,SAAS,GAAG,MAAM;AACrD;AAEO,SAAS,kBAAkB,KAAiB,IAAiC;AAClF,QAAM,OAAO,IAAI,MAAM,IAAI,EAAE;AAC7B,MAAI,CAAC,QAAQ,KAAK,UAAU,KAAM,QAAO;AACzC,QAAM,SAAS,IAAI,MAAM,IAAI,KAAK,MAAM;AACxC,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,OAAO,SAAS,aAAa,OAAO,SAAS,WAAY,QAAO,OAAO;AAC3E,SAAO;AACT;AAOO,SAAS,YAAY,OAAiB,IAAoB;AAC/D,QAAM,IAAI,MAAM,IAAI,MAAM,IAAI,EAAE;AAChC,MAAI,GAAG;AACL,MAAE,KAAK,UAAU;AACjB,UAAM,QAAQ,IAAI,EAAE;AAAA,EACtB;AACF;AAQO,SAAS,eAAe,OAAiB,IAAoB;AAClE,QAAM,IAAI,MAAM,IAAI,MAAM,IAAI,EAAE;AAChC,MAAI,GAAG;AACL,MAAE,KAAK,UAAU;AACjB,MAAE,KAAK,aAAa;AACpB,UAAM,QAAQ,IAAI,EAAE;AAAA,EACtB;AACF;AAEO,SAAS,cAAc,OAAiB,IAAoB;AACjE,QAAM,OAAO,MAAM,IAAI,MAAM,IAAI,EAAE;AACnC,MAAI,CAAC,KAAM;AACX,MAAI,KAAK,SAAS,aAAa,KAAK,SAAS,YAAY;AACvD,eAAW,SAAS,CAAC,GAAG,KAAK,QAAQ,EAAG,eAAc,OAAO,KAAK;AAAA,EACpE;AACA,QAAM,IAAI,MAAM,OAAO,EAAE;AACzB,QAAM,QAAQ,IAAI,EAAE;AACtB;AAEO,SAAS,QAAQ,IAAe,QAAkB,SAA6B;AACpF,SAAO,KAAK,6BAA6B,SAAS;AAAA,IAChD;AAAA,IACA,SAAS,GAAG,OAAO;AAAA,IACnB,UAAU;AAAA,EACZ,CAAC;AACH;AAEO,SAAS,cAAc,IAAgC;AAC5D,UAAQ,GAAG,IAAI;AAAA,IACb,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,GAAG;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AACH,aAAO,GAAG;AAAA,IACZ,KAAK;AACH,aAAO,GAAG;AAAA,IACZ,KAAK;AACH,aAAO,GAAG;AAAA,EACd;AACF;AAIA,SAAS,YAAY,KAAiE;AACpF,MAAI,CAAC,OAAO,IAAI,SAAS,EAAG,QAAO,EAAE,SAAS,oBAAI,IAAI,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,EAAE;AAChF,QAAM,UAAU,oBAAI,IAAuB;AAC3C,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,GAAG,CAAC,KAAK,KAAK;AACxB,YAAQ,IAAI,GAAG,EAAE,MAAM,UAAU,OAAO,EAAE,CAAC;AAC3C,UAAM,KAAK,CAAC;AAAA,EACd;AACA,SAAO,EAAE,SAAS,SAAS,CAAC,GAAG,MAAM;AACvC;AAGO,SAAS,YAAY,OAAiB,MAAgB,QAAmC;AAC9F,QAAM,EAAE,IAAI,IAAI;AAChB,MAAI,KAAK,SAAS,OAAO;AACvB,UAAM,WAAW,IAAI,MAAM,IAAI,KAAK,GAAG;AACvC,QAAI,SAAU,UAAS,SAAS;AAChC,WAAO,KAAK;AAAA,EACd;AAEA,QAAM,KAAK,IAAI,MAAM,KAAK;AAC1B,QAAM,QAAQ,IAAI,EAAE;AACpB,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK,WAAW;AACd,YAAMA,YAAuB,CAAC;AAC9B,YAAM,KAAK,cAAc,IAAI;AAAA,QAC3B,KAAK,KAAK;AAAA,QACV,WAAW,KAAK;AAAA,QAChB,aAAa,KAAK;AAAA,QAClB,OAAO,YAAY,KAAK,KAAK;AAAA,QAC7B;AAAA,QACA,MAAM,EAAE,GAAG,YAAY,GAAG,WAAW,KAAK;AAAA,MAC5C,CAAC;AACD,UAAI,KAAK,QAAS,IAAG,WAAW,cAAc,KAAK,OAAO;AAC1D,UAAI,MAAM,IAAI,IAAI,EAAE;AACpB,iBAAW,SAAS,KAAK,YAAY,CAAC,GAAG;AACvC,QAAAA,UAAS,KAAK,YAAY,OAAO,OAAO,EAAE,CAAC;AAAA,MAC7C;AACA,SAAG,WAAWA;AACd,aAAO;AAAA,IACT;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,IAAI,WAAW,IAAI,KAAK,OAAO,EAAE,OAAO,CAAC;AAC/C,QAAE,KAAK,YAAY;AACnB,UAAI,MAAM,IAAI,IAAI,CAAC;AACnB,aAAO;AAAA,IACT;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,IAAI,WAAW,IAAI,KAAK,MAAM,EAAE,OAAO,CAAC;AAC9C,QAAE,KAAK,YAAY;AACnB,UAAI,MAAM,IAAI,IAAI,CAAC;AACnB,aAAO;AAAA,IACT;AAAA,IACA,KAAK,WAAW;AACd,YAAM,IAAI,cAAc,IAAI,KAAK,OAAO,EAAE,OAAO,CAAC;AAClD,QAAE,KAAK,YAAY;AACnB,UAAI,MAAM,IAAI,IAAI,CAAC;AACnB,aAAO;AAAA,IACT;AAAA,IACA,KAAK,YAAY;AACf,YAAM,OAAO,eAAe,IAAI,EAAE,OAAO,CAAC;AAC1C,WAAK,KAAK,YAAY;AACtB,UAAI,MAAM,IAAI,IAAI,IAAI;AACtB,YAAMA,YAAuB,CAAC;AAC9B,iBAAW,SAAS,KAAK,SAAU,CAAAA,UAAS,KAAK,YAAY,OAAO,OAAO,EAAE,CAAC;AAC9E,WAAK,WAAWA;AAChB,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAAS,kBACd,OACA,MACA,QACU;AACV,SAAO,YAAY,OAAO,MAAM,MAAM;AACxC;AAIO,SAAS,YAAY,OAAiB,MAA0B;AACrE,MAAI,KAAK,UAAW,QAAO;AAC3B,QAAM,QAAQ,MAAM,IAAI,YAAY;AACpC,MAAI,OAAO;AACT,QAAI;AACF,aAAO,MAAM,YAAY,KAAK,QAAQ;AAAA,IACxC,QAAQ;AACN,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AACA,SAAO,KAAK;AACd;AAQO,SAAS,eACd,QACA,QACA,QACa;AAEb,QAAM,SAAS,IAAI,IAA8B,cAAc,MAAM,EAAE,MAAM;AAC7E,MAAI,WAAW;AAEf,aAAW,CAAC,KAAK,QAAQ,KAAK,OAAO,QAAQ;AAC3C,UAAM,WAAW,OAAO,IAAI,GAAG;AAC/B,QAAI,CAAC,UAAU;AACb,aAAO,IAAI,KAAK;AAAA,QACd,WAAW,SAAS;AAAA,QACpB,OAAO,IAAI,IAA4B,SAAS,KAAK;AAAA,MACvD,CAAC;AACD;AAAA,IACF;AACA,UAAM,QAAQ,IAAI,IAA4B,SAAS,KAAK;AAC5D,eAAW,CAAC,MAAM,OAAO,KAAK,SAAS,OAAO;AAC5C,YAAM,MAAM,MAAM,IAAI,IAAI;AAC1B,UAAI,OAAO,IAAI,UAAU,QAAQ,OAAO;AACtC,mBAAW;AACX,YAAI,WAAW,cAAe;AAAA,MAEhC;AACA,UAAI,WAAW,iBAAiB,IAAK;AACrC,YAAM,IAAI,MAAM,OAAO;AAAA,IACzB;AACA,WAAO,IAAI,KAAK,EAAE,WAAW,SAAS,WAAW,MAAM,CAAC;AAAA,EAC1D;AACA,SAAO,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS;AACrC;;;ACnRA,SAAS,SAAS,OAAiB,IAAe,UAAuC;AACvF,QAAM,WAAW,GAAG,OAAO;AAC3B,MAAI,WAAW,MAAM,SAAS;AAC5B,WAAO;AAAA,MACL;AAAA,MACA,OAAO,GAAG,EAAE,YAAY,QAAQ,oBAAoB,MAAM,OAAO;AAAA,MACjE,EAAE,QAAQ,UAAU,SAAS,GAAG,OAAO,SAAS,UAAU,QAAQ;AAAA,IACpE;AAAA,EACF;AACA,QAAM,OAAO,MAAM,IAAI,MAAM,IAAI,QAAQ;AACzC,MAAI,QAAQ,WAAW,KAAK,KAAK,aAAa;AAC5C,WAAO;AAAA,MACL;AAAA,MACA,OAAO,GAAG,EAAE,YAAY,QAAQ,iBAAiB,QAAQ,UAAU,KAAK,KAAK,WAAW;AAAA,MACxF,EAAE,QAAQ,UAAU,SAAS,GAAG,OAAO,SAAS,UAAU,QAAQ;AAAA,IACpE;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,SAAS,OAAiB,IAA6B;AAC9D,QAAM,EAAE,IAAI,IAAI;AAEhB,QAAM,UAAU,cAAc,EAAE;AAChC,MAAI,WAAW,MAAM;AACnB,QAAI,CAAC,IAAI,MAAM,IAAI,OAAO,GAAG;AAC3B,aAAO;AAAA,QACL,KAAK,6BAA6B,eAAe,OAAO,cAAc;AAAA,UACpE,QAAQ;AAAA,UACR,SAAS,GAAG,OAAO;AAAA,UACnB,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AACA,UAAM,SAAS,SAAS,OAAO,IAAI,OAAO;AAC1C,QAAI,OAAQ,QAAO,CAAC,MAAM;AAAA,EAC5B;AAEA,UAAQ,GAAG,IAAI;AAAA,IACb,KAAK,cAAc;AACjB,YAAM,WAAW,kBAAkB,KAAK,GAAG,MAAM;AACjD,UAAI,UAAU;AACZ,cAAM,IAAI,SAAS,QAAQ,GAAG,MAAM;AACpC,YAAI,KAAK,EAAG,UAAS,OAAO,GAAG,CAAC;AAAA,MAClC;AACA,oBAAc,OAAO,GAAG,MAAM;AAC9B,aAAO,CAAC;AAAA,IACV;AAAA,IAEA,KAAK,UAAU;AACb,YAAM,OAAO,IAAI,MAAM,IAAI,GAAG,MAAM;AACpC,UAAI,CAAC,QAAS,KAAK,SAAS,aAAa,KAAK,SAAS,YAAa;AAClE,eAAO,CAAC,QAAQ,IAAI,GAAG,QAAQ,kCAAkC,CAAC;AAAA,MACpE;AACA,YAAM,WAAW,kBAAkB,KAAK,GAAG,MAAM;AACjD,UAAI,CAAC,SAAU,QAAO,CAAC,QAAQ,IAAI,GAAG,QAAQ,6BAA6B,CAAC;AAC5E,YAAM,KAAK,SAAS,QAAQ,GAAG,MAAM;AACrC,YAAM,OAAO,KAAK;AAClB,iBAAW,KAAK,MAAM;AACpB,cAAM,KAAK,IAAI,MAAM,IAAI,CAAC;AAC1B,YAAI,GAAI,IAAG,SAAS,KAAK;AAAA,MAC3B;AACA,eAAS,OAAO,IAAI,GAAG,GAAG,IAAI;AAC9B,UAAI,MAAM,OAAO,GAAG,MAAM;AAC1B,YAAM,QAAQ,IAAI,GAAG,MAAM;AAC3B,UAAI,KAAK,UAAU,KAAM,aAAY,OAAO,KAAK,MAAM;AACvD,aAAO,CAAC;AAAA,IACV;AAAA,IAEA,KAAK,eAAe;AAClB,YAAM,WAAW,kBAAkB,KAAK,GAAG,MAAM;AACjD,UAAI,CAAC,SAAU,QAAO,CAAC,QAAQ,IAAI,GAAG,QAAQ,kCAAkC,CAAC;AACjF,YAAM,KAAK,SAAS,QAAQ,GAAG,MAAM;AACrC,YAAM,WAAW,IAAI,MAAM,IAAI,GAAG,MAAM,GAAG,UAAU;AACrD,YAAM,QAAQ,YAAY,OAAO,GAAG,aAAa,QAAQ;AACzD,eAAS,OAAO,IAAI,GAAG,KAAK;AAC5B,oBAAc,OAAO,GAAG,MAAM;AAC9B,UAAI,YAAY,KAAM,aAAY,OAAO,QAAQ;AACjD,aAAO,CAAC;AAAA,IACV;AAAA,IAEA,KAAK,QAAQ;AACX,YAAM,WAAW,kBAAkB,KAAK,GAAG,MAAM;AACjD,UAAI,CAAC,SAAU,QAAO,CAAC,QAAQ,IAAI,GAAG,QAAQ,2BAA2B,CAAC;AAC1E,YAAM,KAAK,SAAS,QAAQ,GAAG,MAAM;AACrC,YAAM,WAAW,IAAI,MAAM,IAAI,GAAG,MAAM,GAAG,UAAU;AACrD,YAAM,YAAY,kBAAkB,OAAO,GAAG,SAAS,QAAQ;AAC/D,YAAM,UAAU,IAAI,MAAM,IAAI,SAAS;AACvC,YAAM,aAAa,IAAI,MAAM,IAAI,GAAG,MAAM;AAC1C,UAAI,YAAY,QAAQ,SAAS,aAAa,QAAQ,SAAS,aAAa;AAC1E,gBAAQ,SAAS,KAAK,GAAG,MAAM;AAAA,MACjC;AACA,UAAI,WAAY,YAAW,SAAS;AACpC,eAAS,OAAO,IAAI,GAAG,SAAS;AAChC,aAAO,CAAC;AAAA,IACV;AAAA,IAEA,KAAK;AAAA,IACL,KAAK,eAAe;AAClB,YAAM,WAAW,kBAAkB,KAAK,GAAG,MAAM;AACjD,UAAI,CAAC,SAAU,QAAO,CAAC,QAAQ,IAAI,GAAG,QAAQ,6BAA6B,CAAC;AAC5E,YAAM,KAAK,SAAS,QAAQ,GAAG,MAAM;AACrC,YAAM,WAAW,IAAI,MAAM,IAAI,GAAG,MAAM,GAAG,UAAU;AACrD,YAAM,QAAQ,YAAY,OAAO,GAAG,MAAM,QAAQ;AAClD,eAAS,OAAO,GAAG,OAAO,iBAAiB,KAAK,KAAK,GAAG,GAAG,KAAK;AAChE,UAAI,YAAY,KAAM,aAAY,OAAO,QAAQ;AACjD,aAAO,CAAC;AAAA,IACV;AAAA,IAEA,KAAK,YAAY;AACf,YAAM,YAAY,IAAI,MAAM,IAAI,GAAG,SAAS;AAC5C,UAAI,CAAC,aAAc,UAAU,SAAS,aAAa,UAAU,SAAS,YAAa;AACjF,eAAO,CAAC,QAAQ,IAAI,GAAG,WAAW,uCAAuC,CAAC;AAAA,MAC5E;AACA,YAAM,WAAW,kBAAkB,KAAK,GAAG,MAAM;AACjD,UAAI,UAAU;AACZ,cAAM,IAAI,SAAS,QAAQ,GAAG,MAAM;AACpC,YAAI,KAAK,EAAG,UAAS,OAAO,GAAG,CAAC;AAAA,MAClC;AACA,YAAM,SAAS,IAAI,MAAM,IAAI,GAAG,MAAM;AACtC,UAAI,OAAQ,QAAO,SAAS,GAAG;AAC/B,YAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,UAAU,SAAS,MAAM,CAAC;AACrE,gBAAU,SAAS,OAAO,KAAK,GAAG,GAAG,MAAM;AAC3C,kBAAY,OAAO,GAAG,SAAS;AAC/B,aAAO,CAAC;AAAA,IACV;AAAA,IAEA,KAAK,iBAAiB;AACpB,YAAM,QAAQ,IAAI,MAAM,IAAI,GAAG,KAAK;AACpC,YAAM,SAAS,IAAI,MAAM,IAAI,GAAG,MAAM;AACtC,UAAI,CAAC,SAAS,CAAC,OAAQ,QAAO,CAAC,QAAQ,IAAI,GAAG,OAAO,4BAA4B,CAAC;AAClF,WACG,MAAM,SAAS,aAAa,MAAM,SAAS,gBAC3C,OAAO,SAAS,aAAa,OAAO,SAAS,aAC9C;AACA,mBAAW,KAAK,OAAO,UAAU;AAC/B,gBAAM,KAAK,IAAI,MAAM,IAAI,CAAC;AAC1B,cAAI,GAAI,IAAG,SAAS,GAAG;AACvB,gBAAM,SAAS,KAAK,CAAC;AAAA,QACvB;AACA,eAAO,WAAW,CAAC;AAAA,MACrB;AACA,YAAM,WAAW,kBAAkB,KAAK,GAAG,MAAM;AACjD,UAAI,UAAU;AACZ,cAAM,IAAI,SAAS,QAAQ,GAAG,MAAM;AACpC,YAAI,KAAK,EAAG,UAAS,OAAO,GAAG,CAAC;AAAA,MAClC;AACA,UAAI,MAAM,OAAO,GAAG,MAAM;AAC1B,YAAM,QAAQ,IAAI,GAAG,MAAM;AAC3B,kBAAY,OAAO,GAAG,KAAK;AAC3B,aAAO,CAAC;AAAA,IACV;AAAA,IAEA,KAAK,gBAAgB;AACnB,YAAM,KAAK,IAAI,MAAM,IAAI,GAAG,MAAM;AAClC,UAAI,CAAC,MAAM,GAAG,SAAS,WAAW;AAChC,eAAO,CAAC,QAAQ,IAAI,GAAG,QAAQ,uCAAuC,CAAC;AAAA,MACzE;AACA,SAAG,WAAW,cAAc,GAAG,KAAK;AACpC,qBAAe,OAAO,GAAG,MAAM;AAC/B,aAAO,CAAC;AAAA,IACV;AAAA,IAEA,KAAK,cAAc;AACjB,YAAM,KAAK,IAAI,MAAM,IAAI,GAAG,MAAM;AAClC,UAAI,CAAC,MAAM,GAAG,SAAS,WAAW;AAChC,eAAO,CAAC,QAAQ,IAAI,GAAG,QAAQ,qCAAqC,CAAC;AAAA,MACvE;AACA,YAAM,SAAS,eAAe,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU;AAClE,UAAI,OAAO,YAAY,GAAG,eAAe,SAAS;AAChD,eAAO;AAAA,UACL,KAAK,gCAAgC,qCAAqC,GAAG,MAAM,IAAI;AAAA,YACrF,QAAQ,GAAG;AAAA,YACX,SAAS,GAAG,OAAO;AAAA,YACnB,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF;AACA,SAAG,WAAW,OAAO;AACrB,UAAI,GAAG,UAAU,MAAM;AACrB,cAAM,MAAM,IAAI,MAAM,IAAI,GAAG,MAAM;AACnC,YAAI,IAAK,aAAY,OAAO,GAAG,MAAM;AAAA,MACvC;AACA,qBAAe,OAAO,GAAG,MAAM;AAC/B,aAAO,CAAC;AAAA,IACV;AAAA,IAEA,KAAK;AACH,aAAO,UAAU,OAAO,EAAE;AAAA,EAC9B;AACF;AAEA,SAAS,UACP,OACA,IACc;AACd,QAAM,EAAE,IAAI,IAAI;AAChB,QAAM,OAAO,IAAI,MAAM,IAAI,GAAG,IAAI;AAClC,MAAI,CAAC,QAAQ,KAAK,SAAS,WAAW;AACpC,WAAO,CAAC,QAAQ,IAAI,GAAG,MAAM,+BAA+B,CAAC;AAAA,EAC/D;AACA,QAAM,SAAuB,CAAC;AAC9B,QAAM,YACJ,GAAG,eAAe,kBAAkB,OAAO,IAAI,IAAI,GAAG,UAAU;AAElE,QAAM,gBACJ,GAAG,eAAe,QACd,CAAC,GAAG,KAAK,SAAS,OAAO,KAAK,CAAC,IAC/B,CAAC,kBAAkB;AAEzB,aAAW,UAAU,GAAG,MAAM;AAC5B,UAAM,OAAO,IAAI,MAAM,IAAI,MAAM;AACjC,QAAI,CAAC,QAAQ,KAAK,SAAS,WAAW;AACpC,aAAO,KAAK,QAAQ,IAAI,QAAQ,+BAA+B,CAAC;AAChE;AAAA,IACF;AAEA,UAAM,aAAa,IAAI,IAA8B,cAAc,KAAK,QAAQ,EAAE,MAAM;AACxF,QAAI,SAAS;AAEb,eAAW,OAAO,eAAe;AAC/B,YAAM,WAAW,KAAK,SAAS,OAAO,IAAI,GAAG;AAC7C,UAAI,CAAC,SAAU;AACf,YAAM,WAAW,WAAW,IAAI,GAAG;AACnC,YAAM,QAAQ,WACV,IAAI,IAA4B,SAAS,KAAK,IAC9C,oBAAI,IAA4B;AAEpC,iBAAW,CAAC,MAAM,IAAI,KAAK,SAAS,OAAO;AACzC,YAAI,aAAa,CAAC,UAAU,IAAI,IAAI,EAAG;AACvC,YAAI,CAAC,YAAY,OAAO,IAAI,EAAG;AAC/B,YAAI,KAAK,kBAAkB;AACzB,iBAAO;AAAA,YACL;AAAA,cACE;AAAA,cACA,8CAA8C,KAAK,QAAQ,UAAU,MAAM;AAAA,cAC3E,EAAE,QAAQ,QAAQ,SAAS,GAAG,OAAO,SAAS,UAAU,OAAO;AAAA,YACjE;AAAA,UACF;AACA;AAAA,QACF;AACA,YAAI,CAAC,MAAM,IAAI,IAAI,GAAG;AACpB,gBAAM,IAAI,MAAM,IAAI;AACpB,mBAAS;AAAA,QACX;AAAA,MACF;AACA,iBAAW,IAAI,KAAK,EAAE,WAAW,SAAS,WAAW,MAAM,CAAC;AAAA,IAC9D;AAEA,QAAI,QAAQ;AACV,WAAK,WAAW,EAAE,QAAQ,WAAW;AACrC,qBAAe,OAAO,MAAM;AAAA,IAC9B;AAAA,EACF;AAEA,aAAW,KAAK,OAAQ,OAAM,YAAY,KAAK,CAAC;AAChD,SAAO,CAAC;AACV;AASO,SAAS,SACd,KACA,KACA,KACc;AACd,QAAM,SAAS,cAAc,GAAG;AAChC,QAAM,QAAkB;AAAA,IACtB,KAAK;AAAA,IACL,SAAS,oBAAI,IAAI;AAAA,IACjB,SAAS,oBAAI,IAAI;AAAA,IACjB,SAAS,oBAAI,IAAI;AAAA,IACjB,aAAa,CAAC;AAAA,IACd,SAAS,CAAC;AAAA,IACV,eAAe;AAAA,IACf,SAAS,KAAK,iBAAiB;AAAA,IAC/B,KAAK,EAAE,KAAK,QAAQ,eAAe,KAAK,iBAAiB,GAAG,GAAG,IAAI;AAAA,EACrE;AAEA,aAAW,MAAM,KAAK;AACpB,UAAM,SAAS,SAAS,OAAO,EAAE;AACjC,QAAI,OAAO,SAAS,GAAG;AACrB,YAAM,QAAQ,KAAK;AAAA,QACjB,OAAO,EAAE,SAAS,GAAG,OAAO,SAAS,QAAQ,cAAc,EAAE,KAAK,IAAI,MAAM,KAAK,CAAC,EAAE,EAAE;AAAA,QACtF,QAAQ,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,MAAM,EAAE,MAAM,SAAS,EAAE,QAAQ,EAAE;AAAA,MACtE,CAAC;AACD,iBAAW,KAAK,OAAQ,OAAM,YAAY,KAAK,CAAC;AAAA,IAClD,OAAO;AACL,YAAM,iBAAiB;AAAA,IACzB;AAAA,EACF;AAEA,SAAO,EAAE,KAAK,QAAQ,QAAQ,SAAS,KAAK,EAAE;AAChD;AAoDA,SAAS,SAAS,OAA8B;AAC9C,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IACf,SAAS,MAAM;AAAA,IACf,SAAS,MAAM;AAAA,IACf,eAAe,MAAM;AAAA,IACrB,SAAS,MAAM;AAAA,IACf,SAAS,CAAC;AAAA,IACV,aAAa,MAAM;AAAA,EACrB;AACF;;;AC7UO,SAAS,0BAAyC;AACvD,QAAM,OAA8B,oBAAI,IAAI;AAC5C,SAAO;AAAA,IACL,uBAAgC;AAC9B,aAAO;AAAA,IACT;AAAA,IACA,6BAAsC;AACpC,aAAO;AAAA,IACT;AAAA,IACA,iBAAwC;AACtC,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAOA,SAAS,oBAAoB,GAA+D;AAC1F,SAAO,OAAQ,EAAsC,qBAAqB;AAC5E;AAeO,SAAS,mBAAmB,KAAiB,UAAwC;AAC1F,MAAI,CAAC,oBAAoB,QAAQ,KAAK,SAAS,iBAAiB,EAAE,WAAW,GAAG;AAC9E,WAAO,wBAAwB;AAAA,EACjC;AAEA,QAAM,aAAa,oBAAI,IAAc;AACrC,QAAM,aAAa,oBAAI,IAAc;AAErC,aAAW,MAAM,WAAW,GAAG,GAAG;AAChC,UAAM,KAAK,WAAW,KAAK,EAAE;AAC7B,QAAI,CAAC,GAAI;AACT,eAAW,OAAO,GAAG,QAAQ,UAAU;AACrC,UAAI,IAAI,SAAS,SAAU;AAC3B,iBAAW,KAAK,IAAI,QAAQ;AAC1B,cAAM,IAAI,SAAS,cAAc,EAAE,KAAK;AAGxC,YAAI,EAAE,cAAc,EAAE,aAAa,EAAE,cAAe,YAAW,IAAI,EAAE;AACrE,YAAI,EAAE,aAAc,YAAW,IAAI,EAAE;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAMA,QAAM,SAAS,oBAAI,IAA6B;AAChD,aAAW,MAAM,WAAW,GAAG,GAAG;AAChC,UAAM,KAAK,WAAW,KAAK,EAAE;AAC7B,QAAI,CAAC,GAAI;AACT,QAAI,CAAC,WAAW,IAAI,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE,EAAG;AAChD,UAAM,MAAM,oBAAI,IAAc,CAAC,EAAE,CAAC;AAClC,eAAW,KAAK,GAAG,UAAU;AAC3B,YAAM,KAAK,IAAI,MAAM,IAAI,CAAC;AAC1B,UAAI,MAAM,GAAG,SAAS,UAAW,KAAI,IAAI,CAAC;AAAA,IAC5C;AACA,WAAO,IAAI,IAAI,GAAG;AAAA,EACpB;AAEA,QAAM,QAA+B,oBAAI,IAAI;AAC7C,SAAO;AAAA,IACL,sBAAsB,CAAC,OAA0B,WAAW,IAAI,EAAE;AAAA,IAClE,4BAA4B,CAAC,OAA0B,WAAW,IAAI,EAAE;AAAA,IACxE,gBAAgB,CAAC,OAAwC,OAAO,IAAI,EAAE,KAAK;AAAA,EAC7E;AACF;AAKA,SAAS,KAAK,GAAqC;AACjD,SAAQ,EAAgB;AAC1B;AAGO,SAAS,uBAAuC;AACrD,SAAO;AAAA,IACL,OAAO,QAAqC;AAC1C,aAAO,EAAE,IAAI,UAAU,QAAQ,KAAK,MAAM,EAAE;AAAA,IAC9C;AAAA,IACA,WAAW,QAAkC;AAC3C,aAAO,EAAE,IAAI,cAAc,QAAQ,KAAK,MAAM,EAAE;AAAA,IAClD;AAAA,IACA,YAAY,QAAkB,aAAuC;AACnE,aAAO,EAAE,IAAI,eAAe,QAAQ,KAAK,MAAM,GAAG,YAAY;AAAA,IAChE;AAAA,IACA,KAAK,QAAkB,SAAsC;AAC3D,aAAO,EAAE,IAAI,QAAQ,QAAQ,KAAK,MAAM,GAAG,QAAQ;AAAA,IACrD;AAAA,IACA,aAAa,QAAkB,MAAgC;AAC7D,aAAO,EAAE,IAAI,gBAAgB,QAAQ,KAAK,MAAM,GAAG,KAAK;AAAA,IAC1D;AAAA,IACA,YAAY,QAAkB,MAAgC;AAC5D,aAAO,EAAE,IAAI,eAAe,QAAQ,KAAK,MAAM,GAAG,KAAK;AAAA,IACzD;AAAA,IACA,SAAS,QAAkB,WAAwB,OAA+B;AAChF,aAAO,EAAE,IAAI,YAAY,QAAQ,KAAK,MAAM,GAAG,WAAW,KAAK,SAAS,GAAG,MAAM;AAAA,IACnF;AAAA,IACA,cAAc,OAAiB,QAAkC;AAC/D,aAAO,EAAE,IAAI,iBAAiB,OAAO,KAAK,KAAK,GAAG,QAAQ,KAAK,MAAM,EAAE;AAAA,IACzE;AAAA,IACA,aAAa,QAAqB,OAAiB,iBAAiB,MAAsB;AACxF,aAAO,EAAE,IAAI,gBAAgB,QAAQ,KAAK,MAAM,GAAG,OAAO,eAAe;AAAA,IAC3E;AAAA,IACA,WACE,QACA,QACA,OACA,aAAkC,SAClB;AAChB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ,KAAK,MAAM;AAAA,QACnB,QAAQ,SAAS,KAAK,MAAM,IAAI;AAAA,QAChC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,oBACE,MACA,MACA,MACgB;AAChB,YAAM,OAA+B,MAAM,QAAQ,IAAI,IAClD,OACD,CAAC,IAAmB;AACxB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM,KAAK,IAAI;AAAA,QACf,MAAM,KAAK,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;AAAA,QAC7B,YAAY,MAAM,QAAQ;AAAA,QAC1B,YAAY,MAAM,cAAc;AAAA,MAClC;AAAA,IACF;AAAA,IACA,QAAQ,MAA6B;AACnC,aAAO;AAAA,IACT;AAAA,IACA,KAAK,OAAyB;AAC5B,aAAO,EAAE,MAAM,QAAQ,MAAM;AAAA,IAC/B;AAAA,IACA,KAAK,MAA0B;AAC7B,aAAO,EAAE,MAAM,OAAO,KAAK,KAAK,IAAI,EAAE;AAAA,IACxC;AAAA,EACF;AACF;AAIA,SAAS,GAAM,GAAuB;AACpC,SAAO;AACT;AAGO,SAAS,kBACd,KACA,WACA,UACA,WACA,QACA,OACA,WACc;AACd,QAAM,OAAO,WAAW,KAAK,SAAS;AAEtC,QAAM,WAAW,MAAsC;AACrD,QAAI,KAAK,UAAU,KAAM,QAAO;AAChC,UAAM,IAAI,IAAI,MAAM,IAAI,KAAK,MAAM;AACnC,WAAO,KAAK,EAAE,SAAS,YAAY,GAAG,CAAC,IAAI;AAAA,EAC7C;AAEA,QAAM,kBAAkB,MAA0C;AAChE,UAAM,MAAiC,CAAC;AACxC,eAAW,KAAK,KAAK,UAAU;AAC7B,YAAM,KAAK,IAAI,MAAM,IAAI,CAAC;AAC1B,UAAI,MAAM,GAAG,SAAS,UAAW,KAAI,KAAK,GAAG,EAAE,CAAC;AAAA,IAClD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,MAA0C;AAC1D,UAAM,MAAiC,CAAC;AACxC,QAAI,MAAuB,KAAK;AAChC,WAAO,OAAO,MAAM;AAClB,YAAM,IAAwB,IAAI,MAAM,IAAI,GAAG;AAC/C,UAAI,CAAC,EAAG;AACR,UAAI,EAAE,SAAS,UAAW,KAAI,KAAK,GAAG,CAAC,CAAC;AACxC,YAAM,EAAE;AAAA,IACV;AACA,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,CAAC,UAA+C;AAChE,QAAI,KAAK,UAAU,KAAM,QAAO;AAChC,UAAM,IAAI,IAAI,MAAM,IAAI,KAAK,MAAM;AACnC,QAAI,CAAC,KAAM,EAAE,SAAS,aAAa,EAAE,SAAS,WAAa,QAAO;AAClE,UAAM,IAAI,EAAE,SAAS,QAAQ,SAAS;AACtC,UAAM,MAAM,EAAE,SAAS,IAAI,KAAK;AAChC,QAAI,OAAO,KAAM,QAAO;AACxB,UAAM,KAAK,IAAI,MAAM,IAAI,GAAG;AAC5B,WAAO,KAAK,GAAG,EAAE,IAAI;AAAA,EACvB;AAEA,QAAM,aAAa,CAAC,MAA0B;AAC5C,UAAM,OAAO,IAAI,MAAM,IAAK,EAAa,EAAE;AAC3C,WAAO,QAAQ,KAAK,SAAS,YAAY,KAAK,WAAW,cAAc;AAAA,EACzE;AAEA,SAAO;AAAA,IACL,MAAM,GAAG,IAAI;AAAA,IACb,KAAK,GAAG,GAAG;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,mBAAmD;AACjD,YAAM,MAAM,gBAAgB;AAC5B,aAAO,IAAI,WAAW,IAAI,IAAI,CAAC,IAAK;AAAA,IACtC;AAAA,IACA,WAAqB;AACnB,aAAO,KAAK;AAAA,IACd;AAAA,IACA;AAAA,IACA,SAAS,GAA0B;AACjC,YAAM,SAAS,IAAI,IAAI,MAAM,IAAK,EAAgB,EAAE,IAAI;AACxD,UAAI,CAAC,UAAU,OAAO,SAAS,UAAW,QAAO;AACjD,aAAO,OAAO,QAAQ,UAAU,OAAO,KAAK;AAAA,IAC9C;AAAA,IACA;AAAA,IACA,QAAQ,MAAsC;AAC5C,iBAAW,KAAK,UAAU,EAAG,KAAI,KAAK,CAAC,EAAG,QAAO;AACjD,aAAO;AAAA,IACT;AAAA,IACA,cAA2C;AACzC,aAAO,UAAU,EAAE;AAAA,IACrB;AAAA,IACA,cAA2C;AACzC,aAAO,UAAU,CAAC;AAAA,IACpB;AAAA,IACA,gBAAwB;AACtB,UAAI,KAAK,UAAU,KAAM,QAAO;AAChC,YAAM,IAAI,IAAI,MAAM,IAAI,KAAK,MAAM;AACnC,UAAI,CAAC,KAAM,EAAE,SAAS,aAAa,EAAE,SAAS,WAAa,QAAO;AAClE,UAAI,MAAM;AACV,iBAAW,KAAK,EAAE,UAAU;AAC1B,cAAM,KAAK,IAAI,MAAM,IAAI,CAAC;AAC1B,YAAI,MAAM,GAAG,SAAS,WAAW;AAC/B,iBAAO;AACP,cAAI,MAAM,UAAW,QAAO;AAAA,QAC9B;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC5SA,IAAM,UAAU;AAChB,IAAM,WAAW;AACjB,IAAM,YAAY;AAClB,IAAM,cAAc;AACpB,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AACtB,IAAM,cAAc;AACpB,IAAM,aAAa;AAGnB,IAAM,wBAA6C,oBAAI,IAAI,CAAC,SAAS,YAAY,EAAE,CAAC;AAEpF,IAAM,mBAAwC,oBAAI,IAAI,CAAC,UAAU,EAAE,CAAC;AAUpE,IAAM,qBAA0C,oBAAI,IAAI,CAAC,QAAQ,MAAM,CAAC;AAMxE,IAAM,uBAA4C,oBAAI,IAAI,CAAC,MAAM,CAAC;AAOlE,IAAM,sBAA2C,oBAAI,IAAI,CAAC,UAAU,SAAS,CAAC;AAE9E,IAAM,2BAAmD,CAAC,aAAa,eAAe,WAAW;AAGjG,SAAS,gBAAgB,OAA4B;AACnD,QAAM,IAAI,MAAM;AAChB,SAAO,EAAE,UAAU,MAAM,EAAE,OAAO,WAAW,KAAK,EAAE,kBAAkB;AACxE;AAGA,SAAS,UAAU,IAAc,MAAkC;AACjE,aAAW,SAAS,GAAG,OAAO,OAAO,GAAG;AACtC,QAAI,CAAC,gBAAgB,KAAK,EAAG;AAC7B,UAAM,IAAI,MAAM,MAAM,IAAI,IAAI;AAC9B,WAAO,IAAI,OAAO,EAAE,KAAK,IAAI;AAAA,EAC/B;AACA,SAAO;AACT;AAWA,SAAS,oBAAoB,QAAoB,SAAoB,MAAgC;AACnG,MAAI,QAAQ,UAAU,KAAM,QAAO;AACnC,QAAM,IAAI,OAAO,MAAM,IAAI,QAAQ,MAAM;AACzC,MAAI,CAAC,KAAK,EAAE,SAAS,UAAW,QAAO;AACvC,QAAMC,MAAK,KAAK,kBAAkB,EAAE,QAAQ;AAC5C,MAAI,aAAa;AACjB,aAAW,SAASA,IAAG,OAAO,OAAO,GAAG;AACtC,UAAM,OAAO,MAAM,MAAM,IAAI,OAAO;AACpC,QAAI,MAAM;AACR,UAAI,CAAC,qBAAqB,IAAI,OAAO,KAAK,KAAK,CAAC,EAAG,QAAO;AAC1D,UAAI,gBAAgB,KAAK,EAAG,cAAa;AAAA,IAC3C;AACA,eAAW,QAAQ,0BAA0B;AAC3C,YAAM,IAAI,MAAM,MAAM,IAAI,IAAI;AAC9B,UAAI,KAAK,CAAC,oBAAoB,IAAI,OAAO,EAAE,KAAK,CAAC,EAAG,QAAO;AAAA,IAC7D;AAAA,EACF;AACA,SAAO;AACT;AAWA,SAAS,6BACP,iBACA,eACA,MACS;AACT,aAAW,SAAS,gBAAgB,OAAO,OAAO,GAAG;AACnD,UAAM,OAAO,gBAAgB,KAAK;AAClC,UAAM,KAAK,aAAa,MAAM,SAAS;AACvC,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,YAAM,MAAM,OAAO,KAAK,KAAK;AAC7B,UAAI,SAAS,SAAS;AACpB,YAAI,QAAQ,mBAAmB,IAAI,GAAG,EAAG;AACzC,eAAO;AAAA,MACT;AACA,UAAI,SAAS,aAAa;AACxB,YAAI,QAAQ,QAAQ,SAAU;AAC9B,eAAO;AAAA,MACT;AACA,UAAI,SAAS,iBAAiB;AAC5B,YAAI,QAAQ,QAAQ,SAAU;AAC9B,eAAO;AAAA,MACT;AACA,UAAI,SAAS,UAAU;AACrB,YAAI,iBAAiB,IAAI,GAAG,EAAG;AAC/B,eAAO;AAAA,MACT;AACA,UAAI,SAAS,WAAW;AACtB,YAAI,QAAQ,OAAQ;AACpB,eAAO;AAAA,MACT;AACA,UAAIC,aAAY,MAAM,IAAI,EAAG;AAC7B,UAAI,gBAAgB,eAAe,IAAI,MAAM,GAAG,EAAG;AACnD,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,4BAA4B,QAAoB,SAA6B;AACpF,MAAI,WAAW;AACf,aAAW,OAAO,QAAQ,UAAU;AAClC,UAAM,IAAI,OAAO,MAAM,IAAI,GAAG;AAC9B,QAAI,CAAC,EAAG;AACR,QAAI,EAAE,SAAS,WAAW;AACxB,kBAAY;AACZ;AAAA,IACF;AACA,QAAI,EAAE,SAAS,UAAW;AAC1B,QAAI,EAAE,SAAS,UAAU,EAAE,MAAM,KAAK,MAAM,GAAI;AAChD,WAAO;AAAA,EACT;AACA,SAAO,aAAa;AACtB;AAGA,SAAS,kBAAkB,aAA8B,MAAgC;AACvF,MAAI,CAAC,YAAa,QAAO;AACzB,QAAM,KAAK,KAAK,kBAAkB,WAAW;AAC7C,aAAW,SAAS,GAAG,OAAO,OAAO,GAAG;AACtC,eAAW,QAAQ,kBAAkB;AACnC,YAAM,IAAI,MAAM,MAAM,IAAI,IAAI;AAC9B,UAAI,KAAK,CAAC,cAAc,IAAI,OAAO,EAAE,KAAK,CAAC,EAAG,QAAO;AAAA,IACvD;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,0BAA0B,YAA+B;AAChE,MAAI,UAAU,YAAY,UAAU,MAAM,SAAU,QAAO;AAC3D,SACE,UAAU,YAAY,YAA2B,MAAM,YACvD,UAAU,YAAY,cAA6B,MAAM;AAE7D;AAoBA,SAAS,8BACP,QACA,SACA,iBACA,aACA,YACA,MACS;AACT,MAAI,CAAC,WAAY,QAAO;AAExB,MAAI,CAAC,mBAAmB,IAAI,UAAU,iBAAiB,OAAO,KAAK,EAAE,EAAG,QAAO;AAC/E,MAAI,UAAU,iBAAiB,WAAW,MAAM,SAAU,QAAO;AACjE,MAAI,UAAU,iBAAiB,eAAe,MAAM,SAAU,QAAO;AACrE,QAAM,iBAAiB,KAAK,kBAAkB,UAAU;AACxD,MAAI,CAAC,0BAA0B,cAAc,EAAG,QAAO;AAEvD,MAAI,CAAC,6BAA6B,iBAAiB,gBAAgB,IAAI,EAAG,QAAO;AAEjF,MAAI,CAAC,4BAA4B,QAAQ,OAAO,EAAG,QAAO;AAE1D,MAAI,kBAAkB,aAAa,IAAI,EAAG,QAAO;AAEjD,SAAO,oBAAoB,QAAQ,SAAS,IAAI;AAClD;AAGA,IAAM,mBAA2C;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,gBAAqC,oBAAI,IAAI,CAAC,QAAQ,UAAU,aAAa,EAAE,CAAC;AAEtF,IAAM,qBAA0C,oBAAI,IAAI,CAAC,QAAQ,eAAe,QAAQ,aAAa,CAAC;AAQtG,SAAS,wBAAwB,IAAuB;AACtD,aAAW,SAAS,GAAG,OAAO,OAAO,GAAG;AACtC,UAAM,UAAU,MAAM,MAAM,IAAI,OAAO;AACvC,QAAI,WAAW,CAAC,sBAAsB,IAAI,OAAO,QAAQ,KAAK,CAAC,EAAG,QAAO;AACzE,UAAM,WAAW,MAAM,MAAM,IAAI,QAAQ;AACzC,QAAI,YAAY,CAAC,iBAAiB,IAAI,OAAO,SAAS,KAAK,CAAC,EAAG,QAAO;AACtE,UAAM,YAAY,MAAM,MAAM,IAAI,SAAS;AAC3C,QAAI,aAAa,OAAO,UAAU,KAAK,MAAM,OAAQ,QAAO;AAAA,EAC9D;AACA,SAAO;AACT;AAIA,SAASA,aAAY,MAAiB,MAAgC;AACpE,MAAI,KAAK,UAAW,QAAO;AAC3B,MAAI;AACF,WAAO,KAAK,UAAU,YAAY,KAAK,QAAQ;AAAA,EACjD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,SAAS,gBACP,eACA,YACA,MACA,OACS;AACT,MAAI,CAAC,cAAe,QAAO;AAC3B,QAAM,QAAQ,cAAc,OAAO,IAAI,UAAmB;AAC1D,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,IAAI,MAAM,MAAM,IAAI,IAAI;AAC9B,SAAO,KAAK,QAAQ,OAAO,EAAE,KAAK,MAAM;AAC1C;AAOA,SAAS,cACP,iBACA,eACA,MACS;AACT,aAAW,SAAS,gBAAgB,OAAO,OAAO,GAAG;AACnD,UAAM,KAAK,aAAa,MAAM,SAAS;AACvC,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAI,SAAS,WAAW,SAAS,YAAY,SAAS,UAAW;AACjE,UAAIA,aAAY,MAAM,IAAI,EAAG;AAC7B,UAAI,CAAC,gBAAgB,eAAe,IAAI,MAAM,OAAO,KAAK,KAAK,CAAC,EAAG,QAAO;AAAA,IAC5E;AAAA,EACF;AACA,SAAO;AACT;AAKA,SAAS,UAAU,IAA2B,MAA+B;AAC3E,MAAI,CAAC,GAAI,QAAO;AAChB,aAAW,SAAS,KAAK,kBAAkB,GAAG,QAAQ,EAAE,OAAO,OAAO,GAAG;AACvE,QAAI,MAAM,UAAU,UAAU,MAAM,MAAM,UAAU,OAAO,WAAW,KAAK,MAAM,UAAU,kBAAkB,IAAI;AAC/G,YAAM,IAAI,MAAM,MAAM,IAAI,OAAO;AACjC,UAAI,EAAG,QAAO,OAAO,EAAE,KAAK;AAAA,IAC9B;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,sBAAsB,QAAoB,SAAoB,MAAgC;AACrG,MAAI,QAAQ,UAAU,KAAM,QAAO;AACnC,QAAM,IAAI,OAAO,MAAM,IAAI,QAAQ,MAAM;AACzC,MAAI,CAAC,KAAK,EAAE,SAAS,UAAW,QAAO;AACvC,SAAO,mBAAmB,IAAI,UAAU,GAAG,IAAI,CAAC;AAClD;AAOA,SAAS,uBACP,aACA,YACA,MACS;AACT,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,SAAS,cAAc,KAAK,kBAAkB,WAAW,IAAI;AACnE,QAAM,QAAQ,KAAK,kBAAkB,UAAU;AAC/C,aAAW,SAAS,MAAM,OAAO,OAAO,GAAG;AACzC,UAAM,KAAK,aAAa,MAAM,SAAS;AACvC,eAAW,QAAQ,kBAAkB;AACnC,YAAM,IAAI,MAAM,MAAM,IAAI,IAAI;AAC9B,UAAI,CAAC,KAAK,cAAc,IAAI,OAAO,EAAE,KAAK,CAAC,EAAG;AAC9C,YAAM,OAAO,QAAQ,OAAO,IAAI,EAAW,GAAG,MAAM,IAAI,IAAI;AAC5D,UAAI,CAAC,QAAQ,OAAO,KAAK,KAAK,MAAM,OAAO,EAAE,KAAK,EAAG,QAAO;AAAA,IAC9D;AAAA,EACF;AACA,SAAO;AACT;AAKA,SAAS,eAAe,KAA4C;AAClE,aAAW,MAAM,IAAK,KAAI,GAAG,OAAO,SAAU,QAAO,GAAG;AACxD,SAAO;AACT;AAGA,SAAS,iBAAiB,KAA2B,SAAoB,QAAqC;AAC5G,aAAW,MAAM,IAAK,KAAI,GAAG,OAAO,aAAc,QAAO,GAAG;AAC5D,aAAW,MAAM,IAAK,KAAI,GAAG,OAAO,yBAAyB,GAAG,KAAK,SAAS,EAAG,QAAO,GAAG,KAAK,CAAC;AACjG,aAAW,KAAK,QAAQ,UAAU;AAChC,UAAM,IAAI,OAAO,MAAM,IAAI,CAAC;AAC5B,QAAI,KAAK,EAAE,SAAS,UAAW,QAAO;AAAA,EACxC;AACA,SAAO;AACT;AAYO,SAAS,mBACd,QACA,OACA,KACA,MACuB;AACvB,QAAM,YAAY,eAAe,GAAG;AACpC,MAAI,aAAa,KAAM,QAAO,EAAE,MAAM,iBAAiB,WAAW,MAAM,SAAS,KAAK;AAEtF,QAAM,UAAU,OAAO,MAAM,IAAI,SAAS;AAE1C,MAAI,CAAC,WAAW,QAAQ,SAAS,WAAW;AAC1C,WAAO,EAAE,MAAM,iBAAiB,WAAW,MAAM,SAAS,KAAK;AAAA,EACjE;AAEA,QAAM,UAAU,iBAAiB,KAAK,SAAS,MAAM;AACrD,QAAM,kBAAkB,KAAK,kBAAkB,QAAQ,QAAQ;AAC/D,QAAM,aAAa,WAAW,OAAO,WAAW,OAAO,OAAO,GAAG,YAAY,OAAO;AACpF,QAAM,cAAc,WAAW,OAAO,WAAW,QAAQ,OAAO,GAAG,YAAY,OAAO;AAOtF,MAAI,8BAA8B,QAAQ,SAAS,iBAAiB,aAAa,YAAY,IAAI,GAAG;AAClG,WAAO,EAAE,MAAM,iBAAiB,WAAW,QAAQ;AAAA,EACrD;AAGA,MAAI,wBAAwB,eAAe,GAAG;AAC5C,WAAO,EAAE,MAAM,sBAAsB,WAAW,QAAQ;AAAA,EAC1D;AAEA,MAAI,cAAc,iBAAiB,aAAa,KAAK,kBAAkB,UAAU,IAAI,MAAM,IAAI,GAAG;AAChG,WAAO,EAAE,MAAM,sBAAsB,WAAW,QAAQ;AAAA,EAC1D;AAEA,MAAI,uBAAuB,aAAa,YAAY,IAAI,KAAK,CAAC,sBAAsB,QAAQ,SAAS,IAAI,GAAG;AAC1G,WAAO,EAAE,MAAM,sBAAsB,WAAW,QAAQ;AAAA,EAC1D;AAEA,SAAO,EAAE,MAAM,iBAAiB,WAAW,QAAQ;AACrD;;;ACpZO,IAAM,mBAAmC;AAAA,EAC9C,eAAe;AAAA,EACf,QAAQ,EAAE,SAAS,IAAI,UAAU,GAAG,SAAS,EAAE;AAAA,EAC/C,mBAAmB;AAAA,EACnB,mBAAmB;AACrB;AAEO,IAAM,cAAoC,CAAC,WAAW,YAAY,SAAS;AAI3E,SAAS,YAAY,OAAuB,SAA6B;AAC9E,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,EAAE,SAAS,QAAQ,MAAM,UAAU,QAAQ,UAAU,QAAQ,QAAQ,OAAO;AAAA,EACtF;AACF;AAEO,SAAS,iBAAiB,QAAyB,OAA6B;AACrF,QAAM,MAAiB,CAAC;AACxB,aAAW,QAAQ,QAAQ;AACzB,QAAI,KAAK,UAAU,MAAO;AAC1B,eAAW,KAAK,KAAK,SAAU,KAAI,KAAK,CAAC;AAAA,EAC3C;AACA,MAAI,KAAK,CAAC,GAAG,OAAO,EAAE,YAAY,MAAM,EAAE,YAAY,EAAE;AACxD,SAAO;AACT;AASA,SAAS,YAA2B;AAClC,SAAO;AAAA,IACL,SAAS,GAAW;AAClB,aAAO,EAAE;AAAA,IACX;AAAA,IACA,QAA0B;AACxB,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AACF;AAGA,SAAS,kBAAkB,KAAuC;AAChE,QAAM,MAAkB,CAAC;AACzB,aAAW,MAAM,KAAK;AACpB,QAAI,GAAG,OAAO,gBAAgB,GAAG,OAAO,eAAgB,KAAI,KAAK,GAAG,MAAM;AAAA,aACjE,GAAG,OAAO,sBAAuB,KAAI,KAAK,GAAG,GAAG,IAAI;AAAA,EAC/D;AACA,SAAO;AACT;AAGA,SAAS,YAAY,UAAyBC,aAA6B,IAAuB;AAChG,MAAI,GAAG,OAAO,SAAS,EAAG,QAAO;AACjC,MAAI;AACF,UAAM,MAAmB,EAAE,YAAAA,aAAY,MAAM,UAAU,EAAE;AACzD,UAAM,IAAI,SAAS,KAAK,IAAI,GAAG;AAC/B,WAAO,EAAE,SAAS,EAAE,YAAY;AAAA,EAClC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AASO,SAAS,sBACd,QACA,OACA,KACA,UACAA,aACS;AACT,aAAW,MAAM,kBAAkB,GAAG,GAAG;AACvC,UAAM,QAAQ,WAAW,OAAO,EAAE;AAClC,QAAI,CAAC,MAAO;AAEZ,QAAI,MAAM,QAAQ,UAAU,MAAM,QAAQ,WAAY;AACtD,QAAI,YAAY,UAAUA,aAAY,MAAM,QAAQ,EAAG;AACvD,UAAM,QAAQ,WAAW,QAAQ,EAAE;AACnC,UAAM,WAAW,CAAC,SAAS,YAAY,UAAUA,aAAY,MAAM,QAAQ;AAC3E,QAAI,SAAU,QAAO;AAAA,EACvB;AACA,SAAO;AACT;AAcO,SAAS,eACd,QACA,OACA,KACA,KACgB;AAEhB,MAAI,sBAAsB,QAAQ,OAAO,KAAK,IAAI,UAAU,IAAI,UAAU,EAAG,QAAO;AAEpF,QAAM,OAAO,IAAI,QAAQ;AACzB,MAAI,SAAS,MAAO,QAAO;AAE3B,QAAM,MAAM,mBAAmB,QAAQ,OAAO,KAAK,IAAI,UAAU;AACjE,SAAO,IAAI,SAAS,kBAAkB,WAAW;AACnD;AAQO,SAAS,gBACd,KACA,MACA,UACA,KACA,SACA,OACA,WACA,aAC+C;AAC/C,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,SAAS,IAAI,cAAe;AACxC,QAAI,SAAoC,CAAC;AACzC,QAAI;AACF,YAAM,OAAO,kBAAkB,KAAK,MAAM,IAAI,UAAU,IAAI,WAAW,IAAI,eAAe,OAAO,SAAS;AAC1G,YAAM,SAAS,QAAQ,SAAS,MAAM,OAAO;AAC7C,UAAI,CAAC,OAAQ;AACb,eAAS,OAAO;AAChB,UAAI,OAAO,YAAa,YAAW,KAAK,OAAO,YAAa,aAAY,KAAK,CAAC;AAAA,IAChF,SAAS,KAAK;AACZ,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,YAAY,QAAQ,IAAI,YAAY,OAAQ,KAAe,WAAW,GAAG,CAAC;AAAA,QACnF,QAAQ;AAAA,QACR,SAAS,QAAQ;AAAA,QACjB;AAAA,QACA;AAAA,QACA,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AACA,QAAI,OAAO,WAAW,EAAG;AACzB,WAAO,EAAE,KAAK,OAAO,IAAI,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,QAAQ;AAAA,EACpE;AACA,SAAO;AACT;AAGO,SAAS,iBACd,SACA,MACA,OACA,WACA,YACY;AACZ,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SACE,YAAY,QAAQ,IAAI,sBAAsB,IAAI,6IAE9C,UAAU;AAAA,IAChB,QAAQ;AAAA,IACR,SAAS,QAAQ;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AACF;AAUA,SAAS,SACP,OACA,UACA,KACA,SACA,OACA,WACA,SACA,aACA,eACQ;AACR,MAAI,aAAa;AAEjB,aAAW,QAAQ,WAAW,MAAM,GAAG,GAAG;AACxC,UAAM,KAAK,WAAW,MAAM,KAAK,IAAI;AACrC,QAAI,CAAC,GAAI;AACT,QAAI,UAAU,aAAa,cAAc,IAAI,IAAI,EAAG;AAEpD,UAAM,YAAY,gBAAgB,MAAM,KAAK,MAAM,UAAU,KAAK,SAAS,OAAO,WAAW,WAAW;AACxG,QAAI,CAAC,UAAW;AAChB,UAAM,EAAE,KAAK,QAAQ,IAAI;AAEzB,UAAM,UAAU,SAAS,MAAM,KAAK,KAAK,GAAG;AAC5C,eAAW,KAAK,QAAQ,OAAO,YAAa,aAAY,KAAK,CAAC;AAC9D,QAAI,QAAQ,OAAO,kBAAkB,EAAG;AAExC,QAAI,UAAU,WAAW;AACvB,YAAM,UAAU,eAAe,MAAM,KAAK,QAAQ,KAAK,KAAK,GAAG;AAC/D,UAAI,YAAY,UAAU;AAExB,oBAAY,KAAK,iBAAiB,SAAS,MAAM,OAAO,WAAW,IAAI,SAAS,EAAE,CAAC;AACnF,sBAAc,IAAI,IAAI;AACtB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,MAAM,QAAQ;AACpB,kBAAc,QAAQ,OAAO;AAC7B,eAAW,MAAM,QAAQ,OAAO,QAAS,SAAQ,IAAI,EAAE;AACvD,eAAW,MAAM,QAAQ,OAAO,QAAS,SAAQ,IAAI,EAAE;AAAA,EACzD;AACA,SAAO;AACT;AAKO,SAAS,eAAe,KAAyB;AACtD,QAAM,QAAkB,CAAC;AACzB,QAAM,QAAQ,CAAC,OAAuB;AACpC,UAAM,IAAI,IAAI,MAAM,IAAI,EAAE;AAC1B,QAAI,CAAC,EAAG;AACR,UAAM,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;AAC5B,eAAW,KAAK,SAAS,CAAC,EAAG,OAAM,CAAC;AAAA,EACtC;AACA,QAAM,IAAI,IAAI;AACd,SAAO,MAAM,KAAK,GAAG;AACvB;AAeO,SAAS,cACd,OACA,GACA,QACA,mBACgB;AAChB,MAAI,CAAC,EAAE,aAAa,EAAE,eAAe,eAAe;AAClD,MAAE,aAAa;AACf,MAAE,YAAY,KAAK;AAAA,MACjB,MAAM;AAAA,MACN,UAAU,sBAAsB,UAAU,UAAU;AAAA,MACpD,SAAS,UAAU,KAAK,eAAe,MAAM;AAAA,MAC7C;AAAA,MACA,WAAW,EAAE;AAAA,IACf,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL;AAAA,IACA,YAAY,EAAE;AAAA,IACd,WAAW,EAAE;AAAA,IACb,YAAY,EAAE;AAAA,IACd,SAAS,EAAE;AAAA,IACX,aAAa,EAAE;AAAA,EACjB;AACF;AAOO,SAAS,UACd,KACA,QACA,KACA,QAC2E;AAC3E,QAAM,MAAsB,EAAE,GAAG,kBAAkB,GAAG,OAAO;AAC7D,QAAM,UAAU,qBAAqB;AACrC,QAAM,QAAkB,EAAE,IAAI;AAC9B,QAAM,UAA4B,CAAC;AAEnC,QAAM,gBAAgB,oBAAI,IAAc;AAExC,aAAW,SAAS,aAAa;AAC/B,UAAM,WAAW,iBAAiB,QAAQ,KAAK;AAC/C,UAAM,SAAS,IAAI,OAAO,KAAK,KAAK,IAAI;AACxC,UAAM,IAAoB;AAAA,MACxB,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,SAAS,oBAAI,IAAI;AAAA,MACjB,aAAa,CAAC;AAAA,MACd,MAAM,oBAAI,IAAI;AAAA,IAChB;AAEA,QAAI,SAAS,WAAW,GAAG;AACzB,QAAE,YAAY;AACd,cAAQ,KAAK,cAAc,OAAO,GAAG,QAAQ,IAAI,iBAAiB,CAAC;AACnE;AAAA,IACF;AAEA,WAAO,EAAE,aAAa,QAAQ;AAC5B,QAAE,cAAc;AAChB,YAAM,UAAU;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE;AAAA,QACF,EAAE;AAAA,QACF,EAAE;AAAA,QACF;AAAA,MACF;AAEA,UAAI,YAAY,GAAG;AACjB,UAAE,YAAY;AACd;AAAA,MACF;AAEA,UAAI,IAAI,mBAAmB;AACzB,cAAM,KAAK,eAAe,MAAM,GAAG;AACnC,YAAI,EAAE,KAAK,IAAI,EAAE,GAAG;AAClB,YAAE,aAAa;AACf,YAAE,YAAY,KAAK;AAAA,YACjB,MAAM;AAAA,YACN,UAAU;AAAA,YACV,SAAS,UAAU,KAAK;AAAA,YACxB;AAAA,YACA,WAAW,EAAE;AAAA,UACf,CAAC;AACD;AAAA,QACF;AACA,UAAE,KAAK,IAAI,EAAE;AAAA,MACf;AAAA,IACF;AAEA,YAAQ,KAAK,cAAc,OAAO,GAAG,QAAQ,IAAI,iBAAiB,CAAC;AAAA,EACrE;AAEA,SAAO,EAAE,KAAK,MAAM,KAAK,QAAQ;AACnC;;;ACpYO,SAAS,sBAAqC;AACnD,QAAM,MAAM,oBAAI,IAA4B;AAC5C,SAAO;AAAA,IACL,SAAS,GAA2B;AAClC,UAAI,CAAC,IAAI,IAAI,EAAE,SAAS,EAAG,KAAI,IAAI,EAAE,WAAW,CAAC;AACjD,aAAO,EAAE;AAAA,IACX;AAAA,IACA,QAAmC;AACjC,aAAO,CAAC,GAAG,IAAI,OAAO,CAAC;AAAA,IACzB;AAAA,EACF;AACF;AAIA,SAAS,kBAAkB,IAAyB;AAClD,QAAM,MAAgB,CAAC;AACvB,aAAW,OAAO,GAAG,QAAQ,UAAU;AACrC,QAAI,IAAI,SAAS,SAAU,YAAW,KAAK,IAAI,OAAQ,KAAI,KAAK,EAAE,KAAK;AAAA,EACzE;AACA,SAAO;AACT;AAOA,SAAS,cACP,KACA,OACA,aACM;AACN,QAAM,EAAE,UAAU,YAAAC,YAAW,IAAI;AACjC,aAAW,MAAM,WAAW,GAAG,GAAG;AAChC,UAAM,KAAK,WAAW,KAAK,EAAE;AAC7B,QAAI,CAAC,MAAM,GAAG,QAAQ,OAAQ;AAC9B,UAAM,SAAS,kBAAkB,EAAE;AACnC,QAAI,OAAO,WAAW,EAAG;AACzB,QAAI;AACF,YAAM,SAAS,SAAS,QAAQ;AAAA,QAC9B,SAAS;AAAA,QACT,SAAS;AAAA,UACP,SAAS,GAAG;AAAA,UACZ,WAAW,GAAG,cAAc,QAAQ,QAAQ;AAAA,QAC9C;AAAA,MACF,CAAC;AACD,UAAI,SAAmB,OAAO;AAC9B,UAAI;AACF,iBAASA,YAAW,kBAAkB,MAAM;AAAA,MAC9C,QAAQ;AAAA,MAER;AACA,SAAG,WAAW;AACd,iBAAW,KAAK,OAAO,UAAU;AAC/B,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,UAAU,EAAE;AAAA,UACZ,SAAS,EAAE;AAAA,UACX,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF,SAAS,KAAK;AACZ,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,wBAAwB,GAAG,GAAG,MAAM,OAAQ,KAAe,WAAW,GAAG,CAAC;AAAA,QACnF,QAAQ;AAAA,QACR,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAIA,IAAM,kBAAuD;AAAA,EAC3D,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS;AACX;AAEA,IAAM,kBAAN,MAA0C;AAAA,EACxC,IAAI,OAAsC;AACxC,UAAM,YAAY,IAAI;AACtB,UAAM,cAA4B,CAAC;AACnC,UAAM,SAAS,CAAC,MAAwB;AACtC,kBAAY,KAAK,CAAC;AAClB,YAAM,UAAU,OAAO,CAAC;AAAA,IAC1B;AAGA,UAAM,WAAiC;AAAA,MACrC,IAAI,MAAM;AAAA,MACV,MAAM,MAAM;AAAA,MACZ,UAAU,MAAM;AAAA,MAChB,YAAY,MAAM;AAAA,MAClB,QAAQ,EAAE,kBAAkB,MAAM,QAAQ,oBAAoB,KAAK;AAAA,MACnE,cAAc;AAAA,IAChB;AACA,QAAI,MAAM,aAAa,OAAW,UAAS,WAAW,MAAM;AAE5D,UAAM,SAAS,MAAM,SAAS,MAAM,MAAM,MAAM,QAAQ;AACxD,eAAW,KAAK,OAAO,YAAa,QAAO,CAAC;AAC5C,UAAM,MAAM,OAAO;AACnB,UAAM,UAAU,IAAI,MAAM;AAG1B,kBAAc,KAAK,OAAO,WAAW;AAGrC,UAAM,MAAoB;AAAA,MACxB;AAAA,MACA,eAAe,MAAM,QAAQ,UAAU;AAAA,MACvC,YAAY,MAAM;AAAA,MAClB,WAAW,wBAAwB;AAAA,MACnC,UAAU,MAAM;AAAA,IAClB;AACA,UAAM,EAAE,KAAK,WAAW,QAAQ,IAAI,UAAU,KAAK,MAAM,QAAQ,KAAK,aAAa,KAAK,CAAC;AAEzF,QAAI,aAAa;AACjB,UAAM,aAAwC,EAAE,GAAG,gBAAgB;AACnE,eAAW,KAAK,SAAS;AACvB,iBAAW,EAAE,KAAK,IAAI,EAAE;AACxB,iBAAW,KAAK,EAAE,aAAa;AAC7B,oBAAY,KAAK,CAAC;AAClB,cAAM,UAAU,OAAO,CAAC;AAAA,MAC1B;AACA,oBAAc,EAAE,QAAQ;AAAA,IAC1B;AAGA,UAAM,WAAqB;AAAA,MACzB,UAAU,MAAM;AAAA,MAChB,KAAK,CAAC;AAAA,MACN,YAAY,oBAAI,IAAI;AAAA,IACtB;AACA,UAAM,aAA6B;AAAA,MACjC,YAAY,MAAM;AAAA,MAClB,UAAU,MAAM;AAAA,MAChB,MAAM,oBAAoB;AAAA,MAC1B,KAAK,MAAM,SAAS;AAAA,MACpB,cAAc;AAAA,IAChB;AACA,UAAM,UAAyB,MAAM,QAAQ,MAAM,WAAW,UAAU,UAAU;AAClF,eAAW,KAAK,QAAQ,aAAa;AACnC,kBAAY,KAAK,CAAC;AAClB,YAAM,UAAU,OAAO,CAAC;AAAA,IAC1B;AAGA,UAAM,QAAuB;AAAA,MAC3B;AAAA,MACA,UAAU,UAAU,MAAM;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,YAAY,IAAI,IAAI;AAAA,IACtB;AACA,UAAM,UAAiC,QAAQ,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI;AAEtE,WAAO;AAAA,MACL,MAAM,QAAQ;AAAA,MACd,KAAK,QAAQ;AAAA,MACb,SAAS,QAAQ,SAAS,MAAM;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,aAAa,OAAoE;AACxF,QAAM,KAAK,MAAM,QAAQ;AACzB,MAAI,CAAC,GAAI,QAAO;AAChB,SAAO;AAAA,IACL,eAAe,GAAG,iBAAiB;AAAA,IACnC,QAAQ,GAAG,UAAU,CAAC;AAAA,IACtB,mBAAmB,GAAG,qBAAqB;AAAA,IAC3C,mBAAmB,GAAG,qBAAqB;AAAA,EAC7C;AACF;AAEA,SAAS,MAAM,KAAgC;AAC7C,aAAW,OAAO,IAAI,QAAQ,OAAO,EAAG,QAAO,IAAI;AACnD,SAAO;AACT;AAMA,SAAS,MAAc;AACrB,SAAO,OAAO,gBAAgB,eAAe,OAAO,YAAY,QAAQ,aACpE,YAAY,IAAI,IAChB,KAAK,IAAI;AACf;AAGO,SAAS,iBAA2B;AACzC,SAAO,IAAI,gBAAgB;AAC7B;;;AChLA,SAAS,eAAe,IAAyB;AAC/C,QAAM,MAAgB,CAAC;AACvB,aAAW,OAAO,GAAG,UAAU;AAC7B,QAAI,IAAI,SAAS,SAAU,YAAW,KAAK,IAAI,OAAQ,KAAI,KAAK,EAAE,KAAK;AAAA,EACzE;AACA,SAAO;AACT;AAGA,SAAS,gBAAgB,MAAiB,QAAsC;AAC9E,QAAM,cAA4B,OAAO,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE;AACnE,QAAM,MAAoB,EAAE,MAAM,UAAU,QAAQ,YAAY;AAChE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,CAAC,GAAG;AAAA,IACd,WAAW,KAAK;AAAA,IAChB,UAAU,KAAK;AAAA,IACf,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AACF;AAGA,SAAS,WAAW,GAAsB,GAA+B;AACvE,MAAI,EAAE,WAAW,EAAE,OAAQ,QAAO;AAClC,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,EAAG,KAAI,EAAE,CAAC,MAAM,EAAE,CAAC,EAAG,QAAO;AAChE,SAAO;AACT;AAUA,SAAS,cAAcC,WAAoB,SAAmB,MAAiC;AAC7F,QAAM,MAAM,KAAK,kBAAkB,OAAO;AAC1C,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,KAAK,kBAAkBA,SAAQ,EAAE,QAAQ;AAClE,UAAM,WAAW,IAAI,OAAO,IAAI,GAAG;AACnC,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,YAAM,UAAU,UAAU,MAAM,IAAI,IAAI;AACxC,UAAI,WAAW,QAAQ,UAAU,KAAK,SAAS,QAAQ,cAAc,KAAK,UAAW;AACrF,YAAM,IAAI,MAAM,IAAI;AAAA,IACtB;AACA,QAAI,MAAM,OAAO,EAAG,QAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EAC3E;AACA,SAAO,EAAE,OAAO;AAClB;AAMO,SAAS,wBACd,KACA,UACA,MACM;AACN,QAAM,OAAO,oBAAoB;AACjC,aAAW,MAAM,WAAW,GAAG,GAAG;AAChC,UAAM,KAAK,WAAW,KAAK,EAAE;AAC7B,QAAI,CAAC,GAAI;AAGT,QAAI,CAAC,GAAG,KAAK,WAAY;AACzB,QAAI,GAAG,QAAQ,UAAU,GAAG,QAAQ,WAAY;AAEhD,UAAM,SAAS,eAAe,GAAG,OAAO;AAIxC,UAAM,WAAW,OAAO,OAAO,CAAC,MAAM,CAAC,SAAS,cAAc,CAAC,EAAE,SAAS;AAC1E,UAAM,UAAU,SAAS,SAAS,IAAI,SAAS,QAAQ,EAAE,SAAS,SAAS,CAAC,EAAE,SAAS;AACvF,UAAM,SAAS,UAAU,cAAc,GAAG,UAAU,SAAS,IAAI,IAAI,GAAG;AAGxE,UAAM,MAAmB,EAAE,YAAY,MAAM,KAAK;AAClD,UAAM,UAAU,SAAS,KAAK,QAAQ,GAAG,EAAE;AAE3C,QAAI,QAAQ,WAAW,EAAG;AAE1B,UAAM,aAAa,IAAI,IAAI,OAAO;AAClC,UAAM,OAAiB,CAAC;AACxB,UAAM,OAAO,oBAAI,IAAY;AAI7B,eAAW,KAAK,QAAQ;AACtB,UAAI,KAAK,IAAI,CAAC,EAAG;AACjB,YAAM,OAAO,WAAW,IAAI,CAAC,KAAK,CAAC,SAAS,cAAc,CAAC,EAAE;AAC7D,UAAI,MAAM;AACR,aAAK,KAAK,CAAC;AACX,aAAK,IAAI,CAAC;AAAA,MACZ;AAAA,IACF;AAEA,eAAW,KAAK,SAAS;AACvB,UAAI,KAAK,IAAI,CAAC,EAAG;AACjB,WAAK,KAAK,CAAC;AACX,WAAK,IAAI,CAAC;AAAA,IACZ;AAEA,QAAI,WAAW,MAAM,MAAM,EAAG;AAC9B,OAAG,UAAU,gBAAgB,GAAG,SAAS,IAAI;AAAA,EAC/C;AACF;;;ACxIA,IAAM,uBAA0C;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,uBAA+C;AACtD,QAAM,aAAa,IAAI,IAAiB,oBAAgD;AACxF,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,YAAY,UAAgC;AAE1C,aAAO,OAAO,QAAQ,EAAE,WAAW,IAAI,KAAK,WAAW,IAAI,QAAQ;AAAA,IACrE;AAAA,EACF;AACF;AAIA,IAAM,iBACJ;AAEF,IAAM,eAAe;AAErB,IAAM,mBAAmB;AAKzB,SAAS,WAAW,KAAqB;AACvC,MAAI,IAAI,IAAI,KAAK,EAAE,QAAQ,QAAQ,GAAG;AAGtC,MAAI,EAAE,QAAQ,0BAA0B,CAAC,IAAI,QAAgB,MAAM,IAAI,YAAY,CAAC;AAGpF,MAAI,EAAE;AAAA,IACJ;AAAA,IACA,CAAC,IAAI,GAAW,GAAW,MAAc,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAAA,EACpE;AAGA,MAAI,EAAE,QAAQ,qBAAqB,kBAAkB;AACrD,MAAI,EAAE,QAAQ,gBAAgB,kBAAkB;AAGhD,MAAI,EAAE,QAAQ,gBAAgB,GAAG;AAGjC,MAAI,EAAE,QAAQ,cAAc,CAAC,IAAI,IAAY,SAAiB;AAC5D,UAAM,QAAQ,KACX,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC7B,WAAO,GAAG,GAAG,YAAY,CAAC,IAAI,MAAM,KAAK,IAAI,CAAC;AAAA,EAChD,CAAC;AAED,SAAO;AACT;AAGA,SAAS,gBAAgB,OAAwB;AAC/C,SAAO,iBAAiB,KAAK,KAAK;AACpC;AAKA,IAAM,YAAiF;AAAA,EACrF,SAAS,CAAC,eAAe,iBAAiB,kBAAkB,cAAc;AAAA,EAC1E,QAAQ,CAAC,cAAc,gBAAgB,iBAAiB,aAAa;AAAA,EACrE,OAAO,CAAC,OAAO,SAAS,UAAU,MAAM;AAAA,EACxC,gBAAgB;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAGA,SAAS,cAAc,OAAyB;AAC9C,QAAM,MAAgB,CAAC;AACvB,MAAI,QAAQ;AACZ,MAAI,MAAM;AACV,aAAW,MAAM,OAAO;AACtB,QAAI,OAAO,IAAK,UAAS;AAAA,aAChB,OAAO,IAAK,SAAQ,KAAK,IAAI,GAAG,QAAQ,CAAC;AAClD,QAAI,UAAU,KAAK,KAAK,KAAK,EAAE,GAAG;AAChC,UAAI,IAAI,SAAS,GAAG;AAClB,YAAI,KAAK,GAAG;AACZ,cAAM;AAAA,MACR;AACA;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,MAAI,IAAI,SAAS,EAAG,KAAI,KAAK,GAAG;AAChC,SAAO;AACT;AAGA,SAAS,aAAa,QAA6D;AACjF,QAAM,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI;AACrB,UAAQ,OAAO,QAAQ;AAAA,IACrB,KAAK;AACH,aAAO,CAAC,GAAI,GAAI,GAAI,CAAE;AAAA,IACxB,KAAK;AACH,aAAO,CAAC,GAAI,GAAI,GAAI,CAAE;AAAA,IACxB,KAAK;AACH,aAAO,CAAC,GAAI,GAAI,GAAI,CAAE;AAAA,IACxB;AACE,aAAO,CAAC,GAAI,GAAI,GAAI,CAAE;AAAA,EAC1B;AACF;AAGA,SAAS,gBAAgB,MAAc,OAAwC;AAC7E,QAAM,MAAM,UAAU,IAAI;AAC1B,MAAI,KAAK;AACP,UAAM,QAAQ,cAAc,KAAK;AACjC,QAAI,MAAM,UAAU,KAAK,MAAM,UAAU,GAAG;AAC1C,YAAM,QAAQ,aAAa,KAAK;AAChC,aAAO,IAAI,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,CAAE,CAAqB;AAAA,IAC7D;AACA,WAAO,CAAC,CAAC,MAAM,KAAK,CAAC;AAAA,EACvB;AAEA,MAAI,SAAS,SAAS,SAAS,YAAY;AACzC,UAAM,QAAQ,cAAc,KAAK;AACjC,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO;AAAA,QACL,CAAC,WAAW,MAAM,CAAC,CAAE;AAAA,QACrB,CAAC,cAAc,MAAM,CAAC,CAAE;AAAA,MAC1B;AAAA,IACF;AACA,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO;AAAA,QACL,CAAC,WAAW,MAAM,CAAC,CAAE;AAAA,QACrB,CAAC,cAAc,MAAM,CAAC,CAAE;AAAA,MAC1B;AAAA,IACF;AACA,WAAO,CAAC,CAAC,MAAM,KAAK,CAAC;AAAA,EACvB;AAEA,SAAO,CAAC,CAAC,MAAM,KAAK,CAAC;AACvB;AAIA,SAAS,SACP,OACA,MACA,UACA,WACW;AACX,QAAM,WAAW,KAAK,KAAK,EAAE,YAAY;AACzC,QAAM,QAAQ,WAAW,QAAQ;AACjC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB,gBAAgB,KAAK;AAAA,IACvC,WAAW,MAAM,YAAY,QAAQ;AAAA,EACvC;AACF;AAEO,SAAS,mBAAoC;AAClD,QAAM,YAAY,qBAAqB;AAEvC,QAAM,uBAAuB,CAC3B,MACA,OACA,cACyB;AACzB,UAAM,IAAI,KAAK,KAAK,EAAE,YAAY;AAClC,UAAM,WAAW,gBAAgB,GAAG,MAAM,KAAK,CAAC;AAChD,WAAO,SAAS,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,SAAS,WAAW,IAAI,IAAI,SAAS,CAAC;AAAA,EAC1E;AAEA,QAAM,iBAAiB,CAAC,MAAmB,QAA0B;AACnE,SAAK;AACL,WAAO,WAAW,GAAG;AAAA,EACvB;AAEA,QAAM,oBAAoB,CAAC,OAA2B;AACpD,UAAM,SAAS,oBAAI,IAA8B;AACjD,eAAW,SAAS,GAAG,OAAO,OAAO,GAAG;AACtC,YAAM,QAAQ,oBAAI,IAA4B;AAE9C,iBAAW,QAAQ,MAAM,MAAM,OAAO,GAAG;AACvC,cAAM,OAAkB;AAAA,UACtB,GAAG;AAAA,UACH,OAAO,WAAW,OAAO,KAAK,KAAK,CAAC;AAAA,UACpC,kBAAkB,gBAAgB,OAAO,KAAK,KAAK,CAAC;AAAA,UACpD,WAAW,UAAU,YAAY,KAAK,QAAQ;AAAA,QAChD;AACA,cAAM,IAAI,KAAK,UAAU,IAAI;AAAA,MAC/B;AAEA,YAAM,SAAS,IAAI;AAAA,QACjB,CAAC,GAAG,MAAM,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAO,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,CAAE;AAAA,MAC9E;AACA,YAAM,MAAM,aAAa,MAAM,SAAS;AACxC,aAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,OAAO,OAAO,CAAC;AAAA,IAC/D;AACA,WAAO,EAAE,OAAO;AAAA,EAClB;AAEA,QAAM,SAAS,CAAC,GAAa,MAAyB;AACpD,UAAM,KAAK,kBAAkB,CAAC;AAC9B,UAAM,KAAK,kBAAkB,CAAC;AAC9B,QAAI,GAAG,OAAO,SAAS,GAAG,OAAO,KAAM,QAAO;AAC9C,eAAW,CAAC,KAAK,MAAM,KAAK,GAAG,QAAQ;AACrC,YAAM,SAAS,GAAG,OAAO,IAAI,GAAG;AAChC,UAAI,CAAC,OAAQ,QAAO;AACpB,UAAI,OAAO,MAAM,SAAS,OAAO,MAAM,KAAM,QAAO;AACpD,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,OAAO;AACxC,cAAM,QAAQ,OAAO,MAAM,IAAI,IAAI;AACnC,YAAI,CAAC,MAAO,QAAO;AACnB,YAAI,MAAM,UAAU,MAAM,SAAS,MAAM,cAAc,MAAM,UAAW,QAAO;AAAA,MACjF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAGO,IAAM,aAA8B,iBAAiB;AASrD,SAAS,gBACd,MACA,SACA,OAAwB,YACf;AACT,QAAM,KAAK,KAAK,kBAAkB,IAAI;AACtC,QAAM,KAAK,KAAK,kBAAkB,OAAO;AACzC,aAAW,CAAC,KAAK,IAAI,KAAK,GAAG,QAAQ;AACnC,UAAM,OAAO,GAAG,OAAO,IAAI,GAAG,KAAK,GAAG,OAAO,IAAI,aAAa,KAAK,SAAS,CAAC;AAC7E,QAAI,CAAC,KAAM,QAAO;AAClB,eAAW,CAAC,MAAM,IAAI,KAAK,KAAK,OAAO;AACrC,YAAM,MAAM,KAAK,MAAM,IAAI,IAAI;AAC/B,UAAI,CAAC,OAAO,IAAI,UAAU,KAAK,MAAO,QAAO;AAAA,IAC/C;AAAA,EACF;AACA,SAAO;AACT;;;ACnUA,SAAS,UAAU,MAAgD;AACjE,QAAM,IAAI;AACV,SAAO,EAAE,SAAS,YAAa,IAAgC;AACjE;AAEA,SAAS,kBACP,IACA,KAC2B;AAC3B,QAAM,MAAiC,CAAC;AACxC,aAAW,WAAW,GAAG,UAAU;AACjC,UAAM,QAAQ,IAAI,IAAI,MAAM,IAAI,OAAO;AACvC,QAAI,SAAS,MAAM,SAAS,UAAW,KAAI,KAAK,KAAgC;AAAA,EAClF;AACA,SAAO;AACT;AAKO,SAAS,OAAO,UAAuC;AAC5D,SAAO,CAAC,MAAM,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC;AAC1D;AAQO,SAAS,IAAI,SAA2B;AAC7C,SAAO,CAAC,MAAM,QAAQ,CAAC,QAAQ,MAAM,GAAG;AAC1C;AAKO,SAAS,UAAU,KAAuB;AAC/C,QAAM,OAAO,KAAK,YAAY;AAC9B,SAAO,CAAC,SAAS;AACf,UAAM,KAAK,UAAU,IAAI;AACzB,QAAI,CAAC,GAAI,QAAO;AAChB,WAAO,SAAS,UAAa,GAAG,IAAI,YAAY,MAAM;AAAA,EACxD;AACF;AAGO,IAAM,wBAAiC,CAAC,MAAM,QAAQ;AAC3D,QAAM,KAAK,UAAU,IAAI;AACzB,MAAI,CAAC,GAAI,QAAO;AAChB,SAAO,kBAAkB,IAAI,GAAG,EAAE,WAAW;AAC/C;AASO,SAAS,SAAS,SAA4B;AACnD,SAAO,CAAC,MAAM,QAAQ;AACpB,UAAM,KAAK,UAAU,IAAI;AACzB,QAAI,CAAC,GAAI,QAAO;AAChB,UAAM,OAAO,IAAI,WAAW,EAAyB,KAAM,GAAG;AAC9D,WAAO,gBAAgB,MAAkB,SAAS,UAAU;AAAA,EAC9D;AACF;AAGA,IAAM,oBAAyC,oBAAI,IAAY;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGD,IAAM,sBAA2C,oBAAI,IAAY;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAOM,IAAM,oBAA6B,CAAC,MAAM,QAAQ;AACvD,QAAM,KAAK,UAAU,IAAI;AACzB,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,GAAG,KAAK,kBAAmB,QAAO;AAEtC,QAAM,cAAc,IAAI,WAAW,EAAyB,KAAM,GAAG;AACrE,QAAM,OAAO,WAAW,kBAAkB,WAAuB;AACjE,aAAW,SAAS,KAAK,OAAO,OAAO,GAAG;AACxC,eAAW,QAAQ,MAAM,MAAM,OAAO,GAAG;AACvC,UAAI,CAAC,kBAAkB,IAAI,OAAO,KAAK,QAAQ,CAAC,EAAG;AACnD,UAAI,CAAC,oBAAoB,IAAI,OAAO,KAAK,KAAK,CAAC,EAAG,QAAO;AAAA,IAC3D;AAAA,EACF;AACA,SAAO;AACT;AAKO,IAAM,SAAkB,CAAC,SAAS,UAAU,IAAI,GAAG,KAAK,UAAU;AAGlE,IAAM,mBAA4B,CAAC,SAAS,UAAU,IAAI,GAAG,KAAK,oBAAoB;AAGtF,IAAM,qBAA8B,CAAC,SAC1C,UAAU,IAAI,GAAG,KAAK,sBAAsB;AAGvC,IAAM,oBAA6B,CAAC,SAAS,UAAU,IAAI,GAAG,QAAQ,cAAc;AAOpF,IAAM,SAAkB,CAAC,MAAM,QAAQ;AAC5C,QAAM,KAAK,UAAU,IAAI;AACzB,MAAI,CAAC,GAAI,QAAO;AAChB,SAAO,IAAI,SAAS,EAA4B;AAClD;AAMO,IAAM,uBAAgC,CAAC,MAAM,QAAQ;AAC1D,QAAM,KAAK,UAAU,IAAI;AACzB,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,GAAG,KAAK,qBAAsB,QAAO;AAEzC,SAAO,IAAI,UAAU,qBAAqB,GAAG,EAAyB;AACxE;;;ACtLA,IAAM,SAAiC,oBAAI,IAAe,CAAC,WAAW,YAAY,SAAS,CAAC;AAC5F,IAAM,gBAA0C,oBAAI,IAAiB,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;AAEjF,SAAS,KAAK,MAAc,KAAoB;AAC9C,QAAM,IAAI,MAAM,iBAAiB,QAAQ,aAAa,MAAM,GAAG,EAAE;AACnE;AAOO,SAAS,gBAAgB,MAAwB;AACtD,MAAI,QAAQ,QAAQ,OAAO,SAAS,UAAU;AAC5C,UAAM,IAAI,MAAM,uCAAuC;AAAA,EACzD;AAEA,QAAM,OAAO,KAAK;AAClB,MAAI,OAAO,SAAS,YAAY,KAAK,WAAW,GAAG;AACjD,SAAK,OAAO,IAAI,GAAG,iCAAiC;AAAA,EACtD;AAEA,MAAI,OAAO,KAAK,aAAa,YAAY,CAAC,KAAK,SAAS,SAAS,GAAG,GAAG;AACrE,SAAK,MAAM,mDAAmD,KAAK,UAAU,KAAK,QAAQ,CAAC,GAAG;AAAA,EAChG;AAEA,QAAM,QAAQ,KAAK,SAAS,MAAM,KAAK,CAAC,EAAE,CAAC;AAC3C,MAAI,CAAC,OAAO,IAAI,KAAK,GAAG;AACtB,SAAK,MAAM,gEAAgE,KAAK,IAAI;AAAA,EACtF;AAEA,MAAI,CAAC,cAAc,IAAI,KAAK,MAAM,GAAG;AACnC,SAAK,MAAM,+BAA+B,KAAK,UAAU,KAAK,MAAM,CAAC,GAAG;AAAA,EAC1E;AAEA,MAAI,OAAO,KAAK,aAAa,YAAY;AACvC,SAAK,MAAM,6BAA6B;AAAA,EAC1C;AAEA,MAAI,KAAK,aAAa,UAAa,CAAC,OAAO,SAAS,KAAK,QAAQ,GAAG;AAClE,SAAK,MAAM,gDAAgD;AAAA,EAC7D;AAEA,SAAO,OAAO,OAAO,EAAE,GAAG,KAAK,CAAC;AAClC;;;AC2IA,SAAS,aAAa,KAAqB;AACzC,MAAI,IAAI,WAAW,IAAI,EAAG,QAAO;AACjC,SAAO,IAAI,QAAQ,UAAU,CAAC,MAAM,IAAI,EAAE,YAAY,CAAC,EAAE;AAC3D;AAGA,SAAS,gBAAgB,OAA6B;AACpD,QAAM,QAAQ,oBAAI,IAA4B;AAC9C,aAAW,CAAC,QAAQ,QAAQ,KAAK,OAAO,QAAQ,KAAK,GAAG;AACtD,UAAM,OAAO,aAAa,MAAM;AAChC,eAAW,QAAQ,WAAW,qBAAqB,MAAM,OAAO,QAAQ,GAAG,KAAK,GAAG;AACjF,YAAM,IAAI,KAAK,UAAU,IAAI;AAAA,IAC/B;AAAA,EACF;AACA,QAAM,QAAoB,EAAE,WAAW,gBAAgB,MAAM;AAC7D,SAAO,EAAE,QAAQ,oBAAI,IAA8B,CAAC,CAAC,aAAa,cAAc,GAAG,KAAK,CAAC,CAAC,EAAE;AAC9F;AAIA,SAASC,WAAU,MAAgD;AACjE,QAAM,IAAI;AACV,SAAO,EAAE,SAAS,YAAa,IAAgC;AACjE;AAEA,SAAS,SAAS,MAA+B;AAC/C,SAAO,CAAC,SAAS,QAAQA,WAAU,IAAI,GAAG,KAAK,IAAI,CAAC;AACtD;AAGA,IAAM,aAAsB,SAAS,kBAAkB;AAMvD,IAAM,0BAAmC,CAAC,MAAM,QAAQ;AACtD,QAAM,KAAKA,WAAU,IAAI;AACzB,MAAI,CAAC,GAAI,QAAO;AAChB,SAAO,IAAI,UAAU,eAAe,GAAG,EAAyB,EAAE,OAAO;AAC3E;AAUA,IAAM,iBAA0B;AAAA,EAC9B,IAAI,MAAM;AAAA,EACV,IAAI,gBAAgB;AAAA,EACpB,IAAI,kBAAkB;AAAA,EACtB,IAAI,UAAU;AAAA,EACd,IAAI,oBAAoB;AAAA,EACxB,IAAI,uBAAuB;AAC7B;AAaA,IAAM,kBAA2B;AAAA,EAC/B,IAAI,iBAAiB;AAAA,EACrB,IAAI,MAAM;AAAA,EACV,IAAI,oBAAoB;AAC1B;AAKA,SAAS,cAAc,UAAwC;AAC7D,UAAQ,SAAS,MAAM,KAAK,CAAC,EAAE,CAAC,GAAgB;AAAA,IAC9C,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,wBAAwB,GAA8B;AAC7D,QAAM,QAAmB,CAAC,UAAU,EAAE,GAAG,CAAC;AAC1C,MAAI,EAAE,MAAO,OAAM,KAAK,SAAS,gBAAgB,EAAE,KAAK,CAAC,CAAC;AAC1D,MAAI,EAAE,cAAc,UAAW,OAAM,KAAK,qBAAqB;AAC/D,MAAI,EAAE,cAAe,OAAM,KAAK,IAAI,iBAAiB,CAAC;AACtD,MAAI,EAAE,OAAO;AACX,UAAM,QAAQ,MAAM,QAAQ,EAAE,KAAK,IAAK,EAAE,QAA+B,CAAC,EAAE,KAAgB;AAC5F,eAAW,KAAK,MAAO,OAAM,KAAK,CAAC;AAAA,EACrC;AACA,SAAO,IAAI,GAAG,KAAK;AACrB;AAEA,SAAS,aACP,OACA,UACS;AAET,MAAI,OAAO,UAAU,WAAY,QAAO;AAExC,QAAM,cAAc,wBAAwB,SAAS,CAAC,CAAC;AACvD,QAAM,SAAS,cAAc,QAAQ;AACrC,QAAM,UAAU,SAAS,IAAI,aAAa,MAAM,IAAI;AACpD,SAAO,CAAC,MAAM,QAAQ,QAAQ,MAAM,GAAG;AACzC;AAKA,SAAS,cAAc,IAAc,MAAqC;AACxE,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,YAAM,YAAY,KAAK,YAAY,CAAC,GAAG;AAAA,QACrC,CAAC,MAAM,EAAE,EAAE,SAAS,WAAW,KAAK,IAAI,EAAE,SAAS;AAAA,MACrD;AACA,YAAM,OAAkB,EAAE,GAAG,KAAK;AAClC,aAAQ,KAA+C;AACvD,YAAM,OAAkB,SAAS,SAAS,IAAI,EAAE,GAAG,MAAM,UAAU,SAAS,IAAI;AAChF,YAAM,IAAI,MAAM,IAAI;AAAA,IACtB;AACA,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAEA,SAAS,mBAAmB,QAAsC;AAChE,QAAM,aAAa,OAAO,aAAa,gBAAgB,OAAO,UAAU,IAAI;AAC5E,QAAM,OAAO,OAAO,kBAAkB;AACtC,SAAO,CAAC,KAAK,OAAO;AAClB,UAAM,UAAU,IAAI;AACpB,UAAM,QAAQ,IAAI,iBAAiB;AACnC,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,MAAwB,CAAC;AAC/B,QAAI,KAAM,KAAI,KAAK,GAAG,oBAAoB,SAAS,OAAO,EAAE,YAAY,MAAM,CAAC,CAAC;AAChF,QAAI,WAAY,KAAI,KAAK,GAAG,WAAW,OAAO,MAAM,YAAY,aAAa,CAAC;AAC9E,QAAI,KAAK,GAAG,OAAO,OAAO,CAAC;AAC3B,WAAO;AAAA,EACT;AACF;AAEA,SAAS,eAAe,SAA+C;AACrE,MAAI,OAAO,YAAY,WAAY,QAAO;AAE1C,MAAI,iBAAiB,QAAS,QAAO,mBAAmB,OAAO;AAE/D,MAAI,oBAAoB,SAAS;AAC/B,UAAM,iBAAiB,QAAQ,kBAAkB;AACjD,WAAO,CAAC,KAAK,OAAO;AAClB,YAAM,OAAO,QAAQ,eAAe,IAAI,SAAS,GAAG,GAAG;AACvD,UAAI,CAAC,KAAM,QAAO;AAClB,aAAO,CAAC,GAAG,aAAa,IAAI,MAAM,MAAM,cAAc,CAAC;AAAA,IACzD;AAAA,EACF;AAEA,MAAI,iBAAiB,SAAS;AAC5B,UAAM,iBAAiB,QAAQ,kBAAkB;AACjD,WAAO,CAAC,KAAK,OAAO;AAClB,YAAM,OAAO,IAAI,IAAY,QAAQ,YAAY,IAAI,SAAS,GAAG,GAAG,CAAC;AACrE,UAAI,KAAK,SAAS,EAAG,QAAO;AAC5B,aAAO,CAAC,GAAG,aAAa,IAAI,MAAM,cAAc,IAAI,SAAS,GAAG,IAAI,GAAG,cAAc,CAAC;AAAA,IACxF;AAAA,EACF;AAGA,QAAM,QAAQ,gBAAgB,QAAQ,UAAU;AAChD,QAAM,aAAa,QAAQ,cAAc;AACzC,SAAO,CAAC,KAAK,OAAO,CAAC,GAAG,WAAW,IAAI,MAAM,MAAM,OAAO,UAAU,CAAC;AACvE;AASO,SAAS,cAAc,QAAwC;AACpE,QAAM,UAAU,aAAa,OAAO,OAAO,OAAO,QAAQ;AAC1D,QAAM,YAAY,eAAe,OAAO,OAAO;AAE/C,QAAM,OAAwB;AAAA,IAC5B,MAAM,OAAO;AAAA,IACb,UAAU,OAAO;AAAA,IACjB,QAAQ,OAAO;AAAA,IACf,UAAU,OAAO;AAAA,IACjB,cAAc,OAAO;AAAA,IACrB,KAAK,OAAO;AAAA,IACZ,MAAM,OAAO;AAAA,IACb,SAAS,KAAmB,IAAwC;AAClE,UAAI,CAAC,QAAQ,IAAI,MAA6B,GAAG,EAAG,QAAO;AAC3D,YAAM,MAAM,UAAU,KAAK,EAAE;AAC7B,UAAI,CAAC,OAAO,IAAI,WAAW,EAAG,QAAO;AACrC,aAAO,EAAE,IAAI;AAAA,IACf;AAAA,EACF;AAGA,SAAO,gBAAgB,IAAI;AAC7B;;;AClXA,SAAS,KAAK,MAAgD;AAC5D,QAAM,IAAI;AACV,SAAO,EAAE,SAAS,YAAa,IAAgC;AACjE;AAEA,SAAS,OAAO,MAA+C;AAC7D,SAAO,KAAK,IAAI,GAAG,QAAQ;AAC7B;AAOA,IAAM,2BAAoC,CAAC,SAAS,OAAO,IAAI,GAAG,4BAA4B;AAG9F,IAAM,iBAA0B,CAAC,SAAS,OAAO,IAAI,GAAG,kBAAkB;AAC1E,IAAM,kBAA2B,CAAC,SAAS,OAAO,IAAI,GAAG,eAAe;AAGxE,IAAM,cAAuB,CAAC,SAAS;AACrC,QAAM,KAAK,KAAK,IAAI;AACpB,MAAI,CAAC,GAAI,QAAO;AAChB,SAAO,GAAG,MAAM,QAAQ,OAAO,KAAK,GAAG,MAAM,QAAQ,SAAS;AAChE;AAMA,IAAM,6BAAsC,CAAC,MAAM,QAAQ;AACzD,QAAM,KAAK,KAAK,IAAI;AACpB,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,GAAG,KAAK,2BAA4B,QAAO;AAC/C,SAAO,IAAI,UAAU,2BAA2B,GAAG,EAAyB;AAC9E;AAQO,IAAM,yBAAyB,cAAc;AAAA,EAClD,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAGF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAMJ;AAAA,EACA,OAAO;AAAA,IACL,KAAK;AAAA,IACL,OAAO,EAAE,SAAS,WAAW;AAAA,IAC7B,WAAW;AAAA,IACX,eAAe;AAAA,IACf,OAAO;AAAA,MACL,IAAI,wBAAwB;AAAA,MAC5B,IAAI,WAAW;AAAA,MACf,IAAI,iBAAiB;AAAA,MACrB,IAAI,cAAc;AAAA,MAClB,IAAI,eAAe;AAAA,MACnB,IAAI,0BAA0B;AAAA,IAChC;AAAA,EACF;AAAA,EACA,SAAS,EAAE,aAAa,QAAQ;AAAA,EAChC,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA,QAGE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,SAAS;AAAA;AAAA,MAEP;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AC9FD,SAASC,MAAK,MAAgD;AAC5D,QAAM,IAAI;AACV,SAAO,EAAE,SAAS,YAAa,IAAgC;AACjE;AAGA,SAASC,UAAS,MAA+B;AAC/C,SAAO,CAAC,SAAS,QAAQD,MAAK,IAAI,GAAG,KAAK,IAAI,CAAC;AACjD;AAGA,IAAM,iBAAiBC,UAAS,gBAAgB;AAEhD,IAAM,+BAA+BA,UAAS,8BAA8B;AAE5E,IAAM,6BAA6BA,UAAS,4BAA4B;AAExE,IAAM,oBAAoBA,UAAS,mBAAmB;AAEtD,IAAMC,4BAA2BD,UAAS,0BAA0B;AAOpE,IAAME,8BAAsC,CAAC,MAAM,QAAQ;AACzD,QAAM,KAAKH,MAAK,IAAI;AACpB,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,GAAG,KAAK,2BAA4B,QAAO;AAC/C,SAAO,IAAI,UAAU,2BAA2B,GAAG,EAAyB;AAC9E;AAEA,IAAMI,WAAU;AAOhB,IAAM,qBAA8B,CAAC,MAAM,QAAQ;AACjD,QAAM,KAAKJ,MAAK,IAAI;AACpB,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,KAAe,IAAI,WAAW,EAAyB,KAAM,GAAG;AACtE,aAAW,SAAS,GAAG,OAAO,OAAO,GAAG;AACtC,UAAM,OAAO,MAAM,MAAM,IAAII,QAAO;AACpC,QAAI,QAAQ,OAAO,KAAK,KAAK,MAAM,QAAS,QAAO;AAAA,EACrD;AACA,SAAO;AACT;AAOO,IAAM,gBAAgB,cAAc;AAAA,EACzC,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,OAAO;AAAA,IACL,KAAK;AAAA,IACL,WAAW;AAAA,IACX,eAAe;AAAA,IACf,OAAO;AAAA,MACL,IAAI,kBAAkB;AAAA,MACtB,IAAI,cAAc;AAAA,MAClB,IAAI,4BAA4B;AAAA,MAChC,IAAI,0BAA0B;AAAA,MAC9B,IAAI,iBAAiB;AAAA,MACrB,IAAIF,yBAAwB;AAAA,MAC5B,IAAIC,2BAA0B;AAAA,IAChC;AAAA,EACF;AAAA,EACA,SAAS,EAAE,aAAa,QAAQ;AAAA,EAChC,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA,QAEE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,SAAS;AAAA;AAAA,MAEP;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AClHM,IAAM,oBAAoB,cAAc;AAAA,EAC7C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAEJ;AAAA,EACA,OAAO;AAAA,IACL,KAAK;AAAA,IACL,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,SAAS;AAAA,IACzE,WAAW;AAAA,IACX,eAAe;AAAA,EACjB;AAAA,EACA,SAAS;AAAA,IACP,aAAa;AAAA,IACb,YAAY,EAAE,WAAW,SAAS;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,QACE;AAAA,QAGF,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,SAAS;AAAA;AAAA,MAEP;AAAA;AAAA,MAEA;AAAA;AAAA,MAIA;AAAA;AAAA,MAIA;AAAA,IAGF;AAAA,EACF;AACF,CAAC;;;AC5DM,IAAM,0BAA0B,cAAc;AAAA,EACnD,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QACE;AAAA,IACF,OAAO;AAAA,IACP,iBACE;AAAA,EAEJ;AAAA,EACA,OAAO;AAAA,IACL,KAAK;AAAA,IACL,OAAO,EAAE,SAAS,eAAe,YAAY,UAAU,gBAAgB,SAAS;AAAA,IAChF,WAAW;AAAA,IACX,eAAe;AAAA,EACjB;AAAA,EACA,SAAS;AAAA,IACP,aAAa;AAAA,IACb,YAAY,EAAE,WAAW,SAAS;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM;AAAA,IACJ,SAAS;AAAA;AAAA,MAEP;AAAA;AAAA,MAIA;AAAA;AAAA,MAEA;AAAA,IAGF;AAAA,EACF;AACF,CAAC;;;AClBD,SAAS,sBAAsB,OAAyD;AACtF,QAAM,MAAM,oBAAI,IAA4B;AAC5C,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO;AACjC,eAAW,QAAQ,WAAW,qBAAqB,MAAM,OAAO,KAAK,GAAG;AACtE,UAAI,IAAI,KAAK,UAAU,IAAI;AAAA,IAC7B;AAAA,EACF;AACA,QAAM,QAAoB,EAAE,WAAW,gBAAgB,OAAO,IAAI;AAClE,QAAM,SAAS,oBAAI,IAA8B,CAAC,CAAC,aAAa,cAAc,GAAG,KAAK,CAAC,CAAC;AACxF,SAAO,EAAE,OAAO;AAClB;AAGA,IAAM,eAAyB,sBAAsB,CAAC,CAAC,WAAW,MAAM,CAAC,CAAC;AAM1E,IAAM,4BAAiD,oBAAI,IAAY;AAAA,EACrE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AASD,SAAS,eAAe,IAAuB;AAC7C,QAAM,OAAO,WAAW,kBAAkB,EAAE;AAC5C,aAAW,SAAS,KAAK,OAAO,OAAO,GAAG;AACxC,eAAW,QAAQ,MAAM,MAAM,OAAO,GAAG;AACvC,UAAI,0BAA0B,IAAI,OAAO,KAAK,QAAQ,CAAC,EAAG;AAC1D,UAAI,KAAK,UAAW;AACpB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAOA,SAAS,aAAa,OAAiB,OAA0B;AAC/D,QAAM,IAAI,WAAW,kBAAkB,KAAK;AAC5C,QAAM,IAAI,WAAW,kBAAkB,KAAK;AAC5C,aAAW,CAAC,KAAK,MAAM,KAAK,EAAE,QAAQ;AACpC,UAAM,SAAS,EAAE,OAAO,IAAI,GAAG;AAC/B,QAAI,CAAC,OAAQ;AACb,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,OAAO;AACxC,UAAI,CAAC,0BAA0B,IAAI,OAAO,IAAI,CAAC,EAAG;AAClD,YAAM,QAAQ,OAAO,MAAM,IAAI,IAAI;AACnC,UAAI,SAAS,MAAM,UAAU,MAAM,MAAO,QAAO;AAAA,IACnD;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,iBAAiB,IAAwB;AAChD,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAI,0BAA0B,IAAI,OAAO,IAAI,CAAC,EAAG,OAAM,IAAI,MAAM,IAAI;AAAA,IACvE;AACA,QAAI,MAAM,OAAO,EAAG,QAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EAC3E;AACA,SAAO,EAAE,OAAO;AAClB;AAGA,IAAM,cAAuB;AAAA,EAC3B,UAAU,KAAK;AAAA,EACf,SAAS,YAAY;AAAA,EACrB,IAAI,oBAAoB;AAC1B;AAOO,IAAM,kBAAkB,cAAc;AAAA,EAC3C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAGF,QACE;AAAA,IAEF,OAAO;AAAA,IACP,iBACE;AAAA,EAGJ;AAAA,EACA,OAAO;AAAA,IACL,KAAK;AAAA,IACL,OAAO,EAAE,SAAS,OAAO;AAAA,IACzB,WAAW;AAAA,IACX,eAAe;AAAA,EACjB;AAAA,EACA,SAAS,CAAC,KAAmB,OAAyD;AACpF,UAAM,QAAQ,IAAI;AAClB,UAAM,QAAQ,IAAI,iBAAiB;AACnC,QAAI,CAAC,MAAO,QAAO;AACnB,QAAI,CAAC,YAAY,OAA8B,GAAG,EAAG,QAAO;AAE5D,UAAM,aAAa,IAAI,SAAS;AAChC,UAAM,aAAa,IAAI,WAAW,KAA4B;AAG9D,QAAI,CAAC,eAAe,UAAU,EAAG,QAAO;AAExC,QAAI,aAAa,YAAY,UAAU,EAAG,QAAO;AAEjD,WAAO;AAAA;AAAA,MAEL,GAAG,oBAAoB,OAAO,OAAO,EAAE,YAAY,MAAM,CAAC;AAAA;AAAA;AAAA,MAG1D,GAAG,WAAW,OAAO,MAAM,iBAAiB,UAAU,GAAG,aAAa;AAAA;AAAA,MAEtE,GAAG,OAAO,KAAK;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM;AAAA,IACJ,SAAS;AAAA;AAAA;AAAA,MAGP;AAAA;AAAA,MAEA;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AC/JD,SAASE,uBAAsB,OAAyD;AACtF,QAAM,MAAM,oBAAI,IAA4B;AAC5C,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO;AACjC,eAAW,QAAQ,WAAW,qBAAqB,MAAM,OAAO,KAAK,GAAG;AACtE,UAAI,IAAI,KAAK,UAAU,IAAI;AAAA,IAC7B;AAAA,EACF;AACA,QAAM,QAAoB,EAAE,WAAW,gBAAgB,OAAO,IAAI;AAClE,QAAM,SAAS,oBAAI,IAA8B,CAAC,CAAC,aAAa,cAAc,GAAG,KAAK,CAAC,CAAC;AACxF,SAAO,EAAE,OAAO;AAClB;AAGA,IAAM,eAAyBA,uBAAsB,CAAC,CAAC,WAAW,MAAM,CAAC,CAAC;AAM1E,IAAM,4BAAiD,oBAAI,IAAY;AAAA,EACrE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AASD,SAASC,gBAAe,IAAuB;AAC7C,QAAM,OAAO,WAAW,kBAAkB,EAAE;AAC5C,aAAW,SAAS,KAAK,OAAO,OAAO,GAAG;AACxC,eAAW,QAAQ,MAAM,MAAM,OAAO,GAAG;AACvC,UAAI,0BAA0B,IAAI,OAAO,KAAK,QAAQ,CAAC,EAAG;AAC1D,UAAI,KAAK,UAAW;AACpB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAOA,SAAS,aAAa,OAAiB,OAA0B;AAC/D,QAAM,IAAI,WAAW,kBAAkB,KAAK;AAC5C,QAAM,IAAI,WAAW,kBAAkB,KAAK;AAC5C,aAAW,CAAC,KAAK,MAAM,KAAK,EAAE,QAAQ;AACpC,UAAM,SAAS,EAAE,OAAO,IAAI,GAAG;AAC/B,QAAI,CAAC,OAAQ;AACb,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,OAAO;AACxC,UAAI,CAAC,0BAA0B,IAAI,OAAO,IAAI,CAAC,EAAG;AAClD,YAAM,QAAQ,OAAO,MAAM,IAAI,IAAI;AACnC,UAAI,SAAS,MAAM,UAAU,MAAM,MAAO,QAAO;AAAA,IACnD;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,iBAAiB,IAAwB;AAChD,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAI,0BAA0B,IAAI,OAAO,IAAI,CAAC,EAAG,OAAM,IAAI,MAAM,IAAI;AAAA,IACvE;AACA,QAAI,MAAM,OAAO,EAAG,QAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EAC3E;AACA,SAAO,EAAE,OAAO;AAClB;AAGA,IAAM,cAAuB;AAAA,EAC3B,UAAU,KAAK;AAAA,EACf,SAAS,YAAY;AAAA,EACrB,IAAI,oBAAoB;AAC1B;AAOO,IAAM,kBAAkB,cAAc;AAAA,EAC3C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAGF,QACE;AAAA,IAEF,OAAO;AAAA,IACP,iBACE;AAAA,EAGJ;AAAA,EACA,OAAO;AAAA,IACL,KAAK;AAAA,IACL,OAAO,EAAE,SAAS,OAAO;AAAA,IACzB,WAAW;AAAA,IACX,eAAe;AAAA,EACjB;AAAA,EACA,SAAS,CAAC,KAAmB,OAAyD;AACpF,UAAM,QAAQ,IAAI;AAClB,UAAM,QAAQ,IAAI,iBAAiB;AACnC,QAAI,CAAC,MAAO,QAAO;AACnB,QAAI,CAAC,YAAY,OAA8B,GAAG,EAAG,QAAO;AAE5D,UAAM,aAAa,IAAI,SAAS;AAChC,UAAM,aAAa,IAAI,WAAW,KAA4B;AAG9D,QAAI,CAACA,gBAAe,UAAU,EAAG,QAAO;AAExC,QAAI,aAAa,YAAY,UAAU,EAAG,QAAO;AAEjD,WAAO;AAAA;AAAA,MAEL,GAAG,oBAAoB,OAAO,OAAO,EAAE,YAAY,MAAM,CAAC;AAAA;AAAA;AAAA,MAG1D,GAAG,WAAW,OAAO,MAAM,iBAAiB,UAAU,GAAG,aAAa;AAAA;AAAA,MAEtE,GAAG,OAAO,KAAK;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM;AAAA,IACJ,SAAS;AAAA;AAAA;AAAA,MAGP;AAAA;AAAA,MAEA;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;ACpLD,SAASC,QAAO,MAA+C;AAC7D,QAAM,IAAI;AACV,SAAO,EAAE,SAAS,YAAa,EAA8B,OAAO;AACtE;AAEA,SAAS,UAAU,MAAgD;AACjE,QAAM,IAAI;AACV,SAAO,EAAE,SAAS,YAAa,IAAgC;AACjE;AAOA,IAAM,qBAA8B,CAAC,SAAS;AAC5C,QAAM,IAAIA,QAAO,IAAI;AACrB,MAAI,CAAC,EAAG,QAAO;AACf,SACE,EAAE,kBACF,EAAE,gCACF,EAAE,8BACF,EAAE,qBACF,EAAE;AAEN;AAGA,IAAMC,kBAA0B,CAAC,SAASD,QAAO,IAAI,GAAG,kBAAkB;AAC1E,IAAME,mBAA2B,CAAC,SAASF,QAAO,IAAI,GAAG,eAAe;AAGxE,IAAMG,eAAuB,CAAC,SAAS;AACrC,QAAM,KAAK,UAAU,IAAI;AACzB,MAAI,CAAC,GAAI,QAAO;AAChB,SAAO,GAAG,MAAM,QAAQ,OAAO,KAAK,GAAG,MAAM,QAAQ,SAAS;AAChE;AAMA,IAAMC,8BAAsC,CAAC,MAAM,QAAQ;AACzD,QAAM,KAAK,UAAU,IAAI;AACzB,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,GAAG,KAAK,2BAA4B,QAAO;AAC/C,SAAO,IAAI,UAAU,2BAA2B,GAAG,EAAyB;AAC9E;AAQO,IAAM,qBAAqB,cAAc;AAAA,EAC9C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,OAAO;AAAA,IACL,KAAK;AAAA,IACL,WAAW;AAAA,IACX,eAAe;AAAA,IACf,OAAO;AAAA,MACL,IAAI,kBAAkB;AAAA,MACtB,IAAID,YAAW;AAAA,MACf,IAAI,iBAAiB;AAAA,MACrB,IAAIF,eAAc;AAAA,MAClB,IAAIC,gBAAe;AAAA,MACnB,IAAIE,2BAA0B;AAAA,IAChC;AAAA,EACF;AAAA,EACA,SAAS,EAAE,aAAa,QAAQ;AAAA,EAChC,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA,QAGE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,SAAS;AAAA;AAAA,MAEP;AAAA;AAAA;AAAA,MAGA;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;ACnGD,SAAS,0BAA0B,MAAgB,KAA4B;AAC7E,QAAM,KAAK;AACX,MAAI,GAAG,SAAS,UAAW,QAAO;AAElC,QAAM,WAAW,GAAG;AACpB,MAAI,YAAY,KAAM,QAAO;AAE7B,QAAM,SAAS,IAAI,IAAI,MAAM,IAAI,QAAQ;AACzC,MAAI,CAAC,UAAU,OAAO,SAAS,WAAY,QAAO;AAGlD,MAAI,OAAO,UAAU,KAAM,QAAO;AAGlC,MAAI,OAAO,SAAS,WAAW,EAAG,QAAO;AAIzC,QAAM,IAAI,OAAO;AACjB,MACE,EAAE,UACF,EAAE,UACF,EAAE,oBACF,EAAE,sBACF,EAAE,oBACF,EAAE,kBACF,EAAE,aACF;AACA,WAAO;AAAA,EACT;AAIA,MAAI,EAAE,wBAAwB,EAAE,2BAA4B,QAAO;AACnE,QAAM,MAAM;AACZ,MAAI,IAAI,UAAU,qBAAqB,GAAG,KAAK,IAAI,UAAU,2BAA2B,GAAG,GAAG;AAC5F,WAAO;AAAA,EACT;AACA,MAAI,IAAI,UAAU,eAAe,GAAG,EAAE,OAAO,EAAG,QAAO;AAEvD,SAAO;AACT;AASO,IAAM,oBAAoB,cAAc;AAAA,EAC7C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAGJ;AAAA,EACA,OAAO;AAAA,EACP,SAAS,CAAC,KAAmB,OAAyD;AACpF,UAAM,WAAW,IAAI,KAAK;AAC1B,QAAI,YAAY,KAAM,QAAO;AAC7B,UAAM,WAAW,IAAI,IAAI,MAAM,IAAI,QAAQ;AAC3C,QAAI,CAAC,YAAY,SAAS,SAAS,WAAY,QAAO;AAEtD,WAAO,CAAC,GAAG,OAAO,QAAkC,CAAC;AAAA,EACvD;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA,QAGE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,SAAS;AAAA;AAAA,MAEP;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AC3FD,SAASC,MAAK,MAAgD;AAC5D,QAAM,IAAI;AACV,SAAO,EAAE,SAAS,YAAa,IAAgC;AACjE;AAEA,SAASC,QAAO,MAA+C;AAC7D,SAAOD,MAAK,IAAI,GAAG,QAAQ;AAC7B;AAOA,IAAME,sBAA8B,CAAC,SAAS;AAC5C,QAAM,IAAID,QAAO,IAAI;AACrB,MAAI,CAAC,EAAG,QAAO;AACf,SACE,EAAE,kBACF,EAAE,gCACF,EAAE,8BACF,EAAE,qBACF,EAAE;AAEN;AAGA,IAAME,kBAA0B,CAAC,SAASF,QAAO,IAAI,GAAG,kBAAkB;AAC1E,IAAMG,mBAA2B,CAAC,SAASH,QAAO,IAAI,GAAG,eAAe;AAGxE,IAAMI,eAAuB,CAAC,SAAS;AACrC,QAAM,KAAKL,MAAK,IAAI;AACpB,MAAI,CAAC,GAAI,QAAO;AAChB,SAAO,GAAG,MAAM,QAAQ,OAAO,KAAK,GAAG,MAAM,QAAQ,SAAS;AAChE;AAMA,IAAMM,8BAAsC,CAAC,MAAM,QAAQ;AACzD,QAAM,KAAKN,MAAK,IAAI;AACpB,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,GAAG,KAAK,2BAA4B,QAAO;AAC/C,SAAO,IAAI,UAAU,2BAA2B,GAAG,EAAyB;AAC9E;AAEA,IAAMO,WAAU;AAOhB,IAAM,sBAA+B,CAAC,MAAM,QAAQ;AAClD,QAAM,KAAKP,MAAK,IAAI;AACpB,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,KAAe,IAAI,WAAW,EAAyB,KAAM,GAAG;AACtE,aAAW,SAAS,GAAG,OAAO,OAAO,GAAG;AACtC,UAAM,OAAO,MAAM,MAAM,IAAIO,QAAO;AACpC,QAAI,QAAQ,OAAO,KAAK,KAAK,MAAM,SAAU,QAAO;AAAA,EACtD;AACA,SAAO;AACT;AAQO,IAAM,yBAAyB,cAAc;AAAA,EAClD,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAKJ;AAAA,EACA,OAAO;AAAA,IACL,KAAK;AAAA,IACL,WAAW;AAAA,IACX,eAAe;AAAA,IACf,OAAO;AAAA,MACL,IAAI,mBAAmB;AAAA,MACvB,IAAIL,mBAAkB;AAAA,MACtB,IAAIG,YAAW;AAAA,MACf,IAAI,iBAAiB;AAAA,MACrB,IAAIF,eAAc;AAAA,MAClB,IAAIC,gBAAe;AAAA,MACnB,IAAIE,2BAA0B;AAAA,IAChC;AAAA,EACF;AAAA,EACA,SAAS,EAAE,aAAa,QAAQ;AAAA,EAChC,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA,QAGE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,SAAS;AAAA;AAAA,MAEP;AAAA;AAAA,MAEA;AAAA;AAAA,MAEA;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AC7HD,IAAM,UAAU;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,aAAkC,IAAI,IAAY,OAAO;AAE/D,IAAM,WAAyB,aAAa,cAAc;AAE1D,IAAM,SAAS;AAGf,IAAM,yBAA8C,oBAAI,IAAY;AAAA,EAClE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAcD,SAAS,cAAc,IAAiC;AACtD,QAAM,QAAQ,GAAG,OAAO,IAAI,QAAQ;AACpC,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,UAAuB,CAAC;AAC9B,aAAW,UAAU,SAAS;AAC5B,UAAM,OAAO,MAAM,MAAM,IAAI,MAAqB;AAClD,QAAI,CAAC,KAAM,QAAO;AAClB,YAAQ,KAAK,IAAI;AAAA,EACnB;AAGA,QAAM,YAAY,QAAQ,CAAC,EAAG;AAC9B,MAAI,CAAC,QAAQ,MAAM,CAAC,MAAM,EAAE,cAAc,SAAS,EAAG,QAAO;AAE7D,QAAM,QAAQ,OAAO,QAAQ,CAAC,EAAG,KAAK;AACtC,MAAI,uBAAuB,IAAI,KAAK,EAAG,QAAO;AAC9C,MAAI,CAAC,QAAQ,MAAM,CAAC,MAAM,OAAO,EAAE,KAAK,MAAM,KAAK,EAAG,QAAO;AAE7D,QAAM,WAAW,QAAQ,KAAK,CAAC,MAAM,EAAE,gBAAgB;AACvD,SAAO,EAAE,OAAO,WAAW,SAAS;AACtC;AAKA,SAAS,iBAAiB,IAAc,MAA4B;AAClE,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,QAAI,QAAQ,UAAU;AACpB,aAAO,IAAI,KAAK,KAAK;AACrB;AAAA,IACF;AACA,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAI,WAAW,IAAI,OAAO,IAAI,CAAC,EAAG;AAClC,YAAM,IAAI,MAAM,IAAI;AAAA,IACtB;AACA,UAAM,YAAuB;AAAA,MAC3B,UAAU;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK;AAAA,MAChB,kBAAkB,KAAK;AAAA,MACvB,WAAW;AAAA;AAAA,IACb;AACA,UAAM,IAAI,UAAU,UAAU,SAAS;AACvC,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAKO,IAAM,wBAAwB,cAAc;AAAA,EACjD,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeE,WAAqC;AAClD,YAAM,OAAO,cAAcA,SAAQ;AACnC,aAAO,OAAO,iBAAiBA,WAAU,IAAI,IAAI;AAAA,IACnD;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,iEAAiE;AAAA,EAC7E;AACF,CAAC;;;AC3HD,IAAM,cAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,iBAAsC,IAAI,IAAY,WAAW;AAEvE,IAAMC,YAAyB,aAAa,cAAc;AAE1D,IAAM,eAAe;AAcrB,SAAS,aAAa,IAAgC;AACpD,QAAM,QAAQ,GAAG,OAAO,IAAIA,SAAQ;AACpC,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,QAAqB,CAAC;AAC5B,aAAW,QAAQ,aAAa;AAC9B,UAAM,OAAO,MAAM,MAAM,IAAI,IAAmB;AAChD,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,QAAM,CAAC,KAAK,OAAO,QAAQ,IAAI,IAAI;AAGnC,MACE,EACE,IAAI,cAAc,MAAM,aACxB,MAAM,cAAc,OAAO,aAC3B,OAAO,cAAc,KAAK,YAE5B;AACA,WAAO;AAAA,EACT;AAEA,QAAM,KAAK,OAAO,IAAI,KAAK;AAC3B,QAAM,KAAK,OAAO,MAAM,KAAK;AAC7B,QAAM,KAAK,OAAO,OAAO,KAAK;AAC9B,QAAM,KAAK,OAAO,KAAK,KAAK;AAG5B,MAAI,OAAO,MAAM,OAAO,GAAI,QAAO;AAEnC,QAAM,QAAQ,OAAO,KAAK,KAAK,GAAG,EAAE,IAAI,EAAE;AAC1C,QAAM,WAAW,MAAM,KAAK,CAAC,MAAM,EAAE,gBAAgB;AACrD,SAAO,EAAE,OAAO,WAAW,IAAI,WAAW,SAAS;AACrD;AAKA,SAAS,gBAAgB,IAAc,MAA2B;AAChE,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,QAAI,QAAQA,WAAU;AACpB,aAAO,IAAI,KAAK,KAAK;AACrB;AAAA,IACF;AACA,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAI,eAAe,IAAI,OAAO,IAAI,CAAC,EAAG;AACtC,YAAM,IAAI,MAAM,IAAI;AAAA,IACtB;AACA,UAAM,YAAuB;AAAA,MAC3B,UAAU;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK;AAAA,MAChB,kBAAkB,KAAK;AAAA,MACvB,WAAW;AAAA;AAAA,IACb;AACA,UAAM,IAAI,UAAU,UAAU,SAAS;AACvC,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAKO,IAAM,kBAAkB,cAAc;AAAA,EAC3C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAGF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAKJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeC,WAAqC;AAClD,YAAM,OAAO,aAAaA,SAAQ;AAClC,aAAO,OAAO,gBAAgBA,WAAU,IAAI,IAAI;AAAA,IAClD;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,mFAAmF;AAAA,EAC/F;AACF,CAAC;;;AClID,SAAS,qBAAqBC,WAG5B;AACA,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,WAAW,oBAAI,IAAY;AACjC,aAAW,SAASA,UAAS,OAAO,OAAO,GAAG;AAC5C,eAAW,QAAQ,MAAM,MAAM,OAAO,GAAG;AACvC,UAAI,KAAK,UAAU,KAAK,OAAO,SAAS,QAAS,SAAQ,IAAI,KAAK,OAAO,SAAS;AAClF,iBAAW,KAAK,KAAK,YAAY,CAAC,GAAG;AACnC,YAAI,EAAE,SAAS,QAAS,UAAS,IAAI,EAAE,SAAS;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,SAAS,SAAS;AAC7B;AAQO,IAAM,gBAAgB,cAAc;AAAA,EACzC,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAKJ;AAAA,EACA,SAAS;AAAA,IACP,YAAYA,WAAoB,KAAqC;AACnE,YAAM,EAAE,SAAS,SAAS,IAAI,qBAAqBA,SAAQ;AAC3D,YAAM,OAAO,oBAAI,IAAY;AAC7B,iBAAW,OAAO,UAAU;AAE1B,YAAI,QAAQ,IAAI,GAAG,EAAG;AAEtB,YAAI,CAAC,IAAI,SAAS,cAAc,GAAG,EAAE,UAAW;AAChD,aAAK,IAAI,GAAG;AAAA,MACd;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,yCAAyC;AAAA,EACrD;AACF,CAAC;;;AC1ED,IAAM,UAAU;AAChB,IAAM,aAAa;AACnB,IAAM,MAAM;AAEZ,IAAMC,YAAyB,aAAa,cAAc;AAU1D,SAAS,iBAAiB,IAAc,SAA8B;AACpE,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,QAAI,QAAQA,WAAU;AACpB,aAAO,IAAI,KAAK,KAAK;AACrB;AAAA,IACF;AACA,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAI,SAAS,WAAW,SAAS,WAAY;AAC7C,YAAM,IAAI,MAAM,IAAI;AAAA,IACtB;AACA,UAAM,IAAI,QAAQ,UAAU,OAAO;AACnC,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAKO,IAAM,eAAe,cAAc;AAAA,EACxC,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeC,WAAqC;AAClD,YAAM,OAAOA,UAAS,OAAO,IAAID,SAAQ;AACzC,UAAI,CAAC,KAAM,QAAO;AAElB,YAAM,SAAS,KAAK,MAAM,IAAI,OAAO;AACrC,YAAM,SAAS,KAAK,MAAM,IAAI,UAAU;AACxC,UAAI,CAAC,UAAU,CAAC,OAAQ,QAAO;AAG/B,UAAI,OAAO,cAAc,OAAO,UAAW,QAAO;AAClD,UAAI,OAAO,UAAU,OAAO,MAAO,QAAO;AAE1C,YAAM,UAAqB;AAAA,QACzB,UAAU;AAAA,QACV,OAAO,OAAO;AAAA,QACd,WAAW,OAAO;AAAA,QAClB,kBAAkB,OAAO,oBAAoB,OAAO;AAAA,QACpD,WAAW;AAAA;AAAA,MACb;AACA,aAAO,iBAAiBC,WAAU,OAAO;AAAA,IAC3C;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,uDAAuD;AAAA,EACnE;AACF,CAAC;;;ACzFD,IAAM,MAAM;AACZ,IAAM,QAAQ;AACd,IAAM,SAAS;AACf,IAAM,OAAO;AACb,IAAM,QAAQ;AACd,IAAM,cAAc;AACpB,IAAM,eAAe;AAKrB,SAAS,SAAS,GAA0B,GAAmC;AAC7E,SAAO,MAAM,UAAa,MAAM,UAAa,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE;AACxF;AAGA,SAAS,WAAW,KAAgB,UAAkC;AACpE,SAAO,EAAE,GAAG,KAAK,UAAU,WAAW,WAAW,UAAU,YAAY,QAAQ,EAAE;AACnF;AAGA,SAAS,cAAc,KAAe,WAA0D;AAC9F,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,IAAI,QAAQ;AACrC,UAAM,QACJ,QAAQ,qBAAqB,YAAY,IAAI,IAA4B,MAAM,KAAK;AACtF,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAQO,IAAM,iBAAiB,cAAc;AAAA,EAC1C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeC,WAAqC;AAClD,YAAM,OAAOA,UAAS,OAAO,IAAI,kBAAkB;AACnD,UAAI,CAAC,KAAM,QAAO;AAElB,YAAM,MAAM,KAAK,MAAM,IAAI,GAAG;AAC9B,YAAM,QAAQ,KAAK,MAAM,IAAI,KAAK;AAClC,YAAM,SAAS,KAAK,MAAM,IAAI,MAAM;AACpC,YAAM,OAAO,KAAK,MAAM,IAAI,IAAI;AAEhC,YAAM,OAAO,IAAI,IAA4B,KAAK,KAAK;AAGvD,UAAI,OAAO,SAAS,KAAK,KAAK,KAAK,SAAS,KAAK,MAAM,KAAK,SAAS,KAAK,IAAI,GAAG;AAC/E,aAAK,OAAO,GAAG;AACf,aAAK,OAAO,KAAK;AACjB,aAAK,OAAO,MAAM;AAClB,aAAK,OAAO,IAAI;AAChB,aAAK,IAAI,OAAO,WAAW,KAAK,KAAK,CAAC;AAAA,MACxC,OAAO;AACL,YAAI,YAAY;AAEhB,YAAI,SAAS,KAAK,MAAM,GAAG;AACzB,eAAK,OAAO,GAAG;AACf,eAAK,OAAO,MAAM;AAClB,eAAK,IAAI,aAAa,WAAW,KAAM,WAAW,CAAC;AACnD,sBAAY;AAAA,QACd;AAEA,YAAI,SAAS,MAAM,KAAK,GAAG;AACzB,eAAK,OAAO,IAAI;AAChB,eAAK,OAAO,KAAK;AACjB,eAAK,IAAI,cAAc,WAAW,MAAO,YAAY,CAAC;AACtD,sBAAY;AAAA,QACd;AACA,YAAI,CAAC,UAAW,QAAO;AAAA,MACzB;AAEA,aAAO,cAAcA,WAAU,IAAI;AAAA,IACrC;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,qEAAqE;AAAA,EACjF;AACF,CAAC;;;ACrGD,IAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,kBAAuC,IAAI,IAAI,YAAY;AAEjE,IAAMC,YAAyB,aAAa,cAAc;AAG1D,SAAS,oBAAoB,KAAa,OAAe,QAAgB,MAAsB;AAC7F,MAAI,UAAU,MAAM;AAClB,QAAI,QAAQ,QAAQ;AAClB,aAAO,QAAQ,QAAQ,MAAM,GAAG,GAAG,IAAI,KAAK;AAAA,IAC9C;AACA,WAAO,GAAG,GAAG,IAAI,KAAK,IAAI,MAAM;AAAA,EAClC;AACA,SAAO,GAAG,GAAG,IAAI,KAAK,IAAI,MAAM,IAAI,IAAI;AAC1C;AAGA,SAAS,iBAAiB,IAAc,YAAiC;AACvE,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,QAAI,QAAQA,WAAU;AACpB,aAAO,IAAI,KAAK,KAAK;AACrB;AAAA,IACF;AACA,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAI,CAAC,gBAAgB,IAAI,OAAO,IAAI,CAAC,EAAG,OAAM,IAAI,MAAM,IAAI;AAAA,IAC9D;AACA,UAAM,IAAI,WAAW,UAAU,UAAU;AACzC,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAOO,IAAM,kBAAkB,cAAc;AAAA,EAC3C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeC,WAAqC;AAClD,YAAM,OAAOA,UAAS,OAAO,IAAID,SAAQ;AACzC,UAAI,CAAC,KAAM,QAAO;AAGlB,YAAM,QAAQ,aAAa,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,CAAgB,CAAC;AACtE,UAAI,MAAM,KAAK,CAAC,MAAM,MAAM,MAAS,EAAG,QAAO;AAC/C,YAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI;AAGzB,UAAI,GAAG,aAAa,GAAG,aAAa,GAAG,aAAa,GAAG,UAAW,QAAO;AAEzE,YAAM,QAAQ;AAAA,QACZ,OAAO,GAAG,KAAK;AAAA,QACf,OAAO,GAAG,KAAK;AAAA,QACf,OAAO,GAAG,KAAK;AAAA,QACf,OAAO,GAAG,KAAK;AAAA,MACjB;AAEA,YAAM,aAAwB;AAAA,QAC5B,UAAU;AAAA,QACV;AAAA,QACA,WAAW;AAAA,QACX,kBACE,GAAG,oBAAoB,GAAG,oBAAoB,GAAG,oBAAoB,GAAG;AAAA,QAC1E,WAAW;AAAA;AAAA,MACb;AAEA,aAAO,iBAAiBC,WAAU,UAAU;AAAA,IAC9C;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,iDAAiD;AAAA,EAC7D;AACF,CAAC;;;AChHD,IAAM,aAAa;AACnB,IAAM,aAAa;AACnB,IAAM,WAAW;AAEjB,IAAMC,YAAyB,aAAa,cAAc;AAQ1D,SAAS,sBAAsB,IAAc,cAAmC;AAC9E,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,QAAI,QAAQA,WAAU;AACpB,aAAO,IAAI,KAAK,KAAK;AACrB;AAAA,IACF;AACA,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAI,SAAS,cAAc,SAAS,WAAY;AAChD,YAAM,IAAI,MAAM,IAAI;AAAA,IACtB;AACA,UAAM,IAAI,aAAa,UAAU,YAAY;AAC7C,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAKO,IAAM,oBAAoB,cAAc;AAAA,EAC7C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeC,WAAqC;AAClD,YAAM,OAAOA,UAAS,OAAO,IAAID,SAAQ;AACzC,UAAI,CAAC,KAAM,QAAO;AAElB,YAAM,YAAY,KAAK,MAAM,IAAI,UAAU;AAC3C,YAAM,YAAY,KAAK,MAAM,IAAI,UAAU;AAC3C,UAAI,CAAC,aAAa,CAAC,UAAW,QAAO;AAGrC,UAAI,UAAU,cAAc,UAAU,UAAW,QAAO;AACxD,UAAI,UAAU,UAAU,UAAU,MAAO,QAAO;AAEhD,YAAM,eAA0B;AAAA,QAC9B,UAAU;AAAA,QACV,OAAO,UAAU;AAAA,QACjB,WAAW,UAAU;AAAA,QACrB,kBAAkB,UAAU,oBAAoB,UAAU;AAAA,QAC1D,WAAW;AAAA;AAAA,MACb;AACA,aAAO,sBAAsBC,WAAU,YAAY;AAAA,IACrD;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,yEAAyE;AAAA,EACrF;AACF,CAAC;;;ACpFD,IAAM,eAAe;AACrB,IAAM,eAAe;AACrB,IAAM,aAAa;AAEnB,IAAMC,YAAyB,aAAa,cAAc;AAG1D,IAAMC,0BAA8C,oBAAI,IAAY;AAAA,EAClE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAUD,SAAS,wBAAwB,IAAc,WAAgC;AAC7E,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,QAAI,QAAQD,WAAU;AACpB,aAAO,IAAI,KAAK,KAAK;AACrB;AAAA,IACF;AACA,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAI,SAAS,gBAAgB,SAAS,aAAc;AACpD,YAAM,IAAI,MAAM,IAAI;AAAA,IACtB;AACA,UAAM,IAAI,UAAU,UAAU,SAAS;AACvC,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAKO,IAAM,8BAA8B,cAAc;AAAA,EACvD,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAGF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeE,WAAqC;AAClD,YAAM,OAAOA,UAAS,OAAO,IAAIF,SAAQ;AACzC,UAAI,CAAC,KAAM,QAAO;AAElB,YAAM,IAAI,KAAK,MAAM,IAAI,YAAY;AACrC,YAAM,IAAI,KAAK,MAAM,IAAI,YAAY;AACrC,UAAI,CAAC,KAAK,CAAC,EAAG,QAAO;AAGrB,UAAI,EAAE,cAAc,EAAE,UAAW,QAAO;AACxC,YAAM,QAAQ,OAAO,EAAE,KAAK;AAC5B,UAAIC,wBAAuB,IAAI,KAAK,EAAG,QAAO;AAC9C,UAAI,UAAU,OAAO,EAAE,KAAK,EAAG,QAAO;AAEtC,YAAM,YAAuB;AAAA,QAC3B,UAAU;AAAA,QACV,OAAO,EAAE;AAAA,QACT,WAAW,EAAE;AAAA,QACb,kBAAkB,EAAE,oBAAoB,EAAE;AAAA,QAC1C,WAAW;AAAA;AAAA,MACb;AACA,aAAO,wBAAwBC,WAAU,SAAS;AAAA,IACpD;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,8EAA8E;AAAA,EAC1F;AACF,CAAC;;;ACrGD,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,mBAAwC,IAAI,IAAY,aAAa;AAE3E,IAAMC,YAAyB,aAAa,cAAc;AAc1D,SAAS,eAAe,IAAkC;AACxD,QAAM,QAAQ,GAAG,OAAO,IAAIA,SAAQ;AACpC,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,QAAqB,CAAC;AAC5B,aAAW,QAAQ,eAAe;AAChC,UAAM,OAAO,MAAM,MAAM,IAAI,IAAmB;AAChD,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,QAAM,CAAC,KAAK,OAAO,QAAQ,IAAI,IAAI;AAGnC,MACE,EACE,IAAI,cAAc,MAAM,aACxB,MAAM,cAAc,OAAO,aAC3B,OAAO,cAAc,KAAK,YAE5B;AACA,WAAO;AAAA,EACT;AAEA,QAAM,KAAK,OAAO,IAAI,KAAK;AAC3B,QAAM,KAAK,OAAO,MAAM,KAAK;AAC7B,QAAM,KAAK,OAAO,OAAO,KAAK;AAC9B,QAAM,KAAK,OAAO,KAAK,KAAK;AAG5B,MAAI,OAAO,MAAM,OAAO,GAAI,QAAO;AAEnC,QAAM,QAAQ,OAAO,KAAK,KAAK,GAAG,EAAE,IAAI,EAAE;AAC1C,QAAM,WAAW,MAAM,KAAK,CAAC,MAAM,EAAE,gBAAgB;AACrD,SAAO,EAAE,OAAO,WAAW,IAAI,WAAW,SAAS;AACrD;AAKA,SAAS,kBAAkB,IAAc,MAA6B;AACpE,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,QAAI,QAAQA,WAAU;AACpB,aAAO,IAAI,KAAK,KAAK;AACrB;AAAA,IACF;AACA,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAI,iBAAiB,IAAI,OAAO,IAAI,CAAC,EAAG;AACxC,YAAM,IAAI,MAAM,IAAI;AAAA,IACtB;AACA,UAAM,YAAuB;AAAA,MAC3B,UAAU;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK;AAAA,MAChB,kBAAkB,KAAK;AAAA,MACvB,WAAW;AAAA;AAAA,IACb;AACA,UAAM,IAAI,UAAU,UAAU,SAAS;AACvC,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAOO,IAAM,mBAAmB,cAAc;AAAA,EAC5C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeC,WAAqC;AAClD,YAAM,OAAO,eAAeA,SAAQ;AACpC,aAAO,OAAO,kBAAkBA,WAAU,IAAI,IAAI;AAAA,IACpD;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,MACA;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,2DAA2D;AAAA,EACvE;AACF,CAAC;;;ACxID,IAAMC,eAAc;AACpB,IAAMC,iBAAgB;AACtB,IAAMC,eAAc;AAEpB,IAAM,gBAAgB;AACtB,IAAMC,mBAAkB;AACxB,IAAM,gBAAgB;AAEtB,IAAMC,YAAyB,aAAa,cAAc;AAK1D,SAAS,SAAS,GAA0B,GAAmC;AAC7E,SAAO,MAAM,UAAa,MAAM,UAAa,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE;AACxF;AAGA,SAAS,UAAU,UAAuB,OAA6B;AACrE,SAAO;AAAA,IACL;AAAA,IACA,OAAO,MAAM;AAAA,IACb,WAAW,MAAM;AAAA,IACjB,kBAAkB;AAAA;AAAA,IAClB,WAAW;AAAA;AAAA,EACb;AACF;AAGA,SAASC,eAAc,IAAc,WAA0D;AAC7F,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,UAAM,QACJ,QAAQD,YAAW,IAAI,IAA4B,SAAS,IAAI,MAAM;AACxE,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAKO,IAAM,iBAAiB,cAAc;AAAA,EAC1C,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeE,WAAqC;AAClD,YAAM,OAAOA,UAAS,OAAO,IAAIF,SAAQ;AACzC,UAAI,CAAC,KAAM,QAAO;AAElB,YAAM,aAAa,KAAK,MAAM,IAAIJ,YAAW;AAC7C,YAAM,eAAe,KAAK,MAAM,IAAIC,cAAa;AACjD,YAAM,eAAe,KAAK,MAAM,IAAI,aAAa;AACjD,YAAM,iBAAiB,KAAK,MAAM,IAAIE,gBAAe;AAErD,YAAM,OAAO,IAAI,IAA4B,KAAK,KAAK;AACvD,UAAI,YAAY;AAGhB,UAAI,SAAS,YAAY,YAAY,GAAG;AACtC,aAAK,OAAOH,YAAW;AACvB,aAAK,OAAOC,cAAa;AACzB,aAAK,IAAIC,cAAa,UAAUA,cAAa,UAAW,CAAC;AACzD,oBAAY;AAAA,MACd;AAEA,UAAI,SAAS,cAAc,cAAc,GAAG;AAC1C,aAAK,OAAO,aAAa;AACzB,aAAK,OAAOC,gBAAe;AAC3B,aAAK,IAAI,eAAe,UAAU,eAAe,YAAa,CAAC;AAC/D,oBAAY;AAAA,MACd;AAEA,UAAI,CAAC,UAAW,QAAO;AACvB,aAAOE,eAAcC,WAAU,IAAI;AAAA,IACrC;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,wEAAwE;AAAA,EACpF;AACF,CAAC;;;ACpGD,IAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,WAAgC,IAAI,IAAY,mBAAmB;AAEzE,IAAMC,YAAyB,aAAa,cAAc;AAE1D,IAAM,gBAAgB;AAGtB,IAAMC,0BAA8C,oBAAI,IAAY;AAAA,EAClE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAcD,SAAS,oBAAoB,IAAuC;AAClE,QAAM,QAAQ,GAAG,OAAO,IAAID,SAAQ;AACpC,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,QAAqB,CAAC;AAC5B,aAAW,QAAQ,qBAAqB;AACtC,UAAM,OAAO,MAAM,MAAM,IAAI,IAAmB;AAChD,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,KAAK,IAAI;AAAA,EACjB;AAGA,QAAM,YAAY,MAAM,CAAC,EAAG;AAC5B,MAAI,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,cAAc,SAAS,EAAG,QAAO;AAE3D,QAAM,QAAQ,OAAO,MAAM,CAAC,EAAG,KAAK;AACpC,MAAIC,wBAAuB,IAAI,KAAK,EAAG,QAAO;AAC9C,MAAI,CAAC,MAAM,MAAM,CAAC,MAAM,OAAO,EAAE,KAAK,MAAM,KAAK,EAAG,QAAO;AAE3D,QAAM,WAAW,MAAM,KAAK,CAAC,MAAM,EAAE,gBAAgB;AACrD,SAAO,EAAE,OAAO,WAAW,SAAS;AACtC;AAKA,SAAS,uBAAuB,IAAc,MAAkC;AAC9E,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,QAAI,QAAQD,WAAU;AACpB,aAAO,IAAI,KAAK,KAAK;AACrB;AAAA,IACF;AACA,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAI,SAAS,IAAI,OAAO,IAAI,CAAC,EAAG;AAChC,YAAM,IAAI,MAAM,IAAI;AAAA,IACtB;AACA,UAAM,YAAuB;AAAA,MAC3B,UAAU;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK;AAAA,MAChB,kBAAkB,KAAK;AAAA,MACvB,WAAW;AAAA;AAAA,IACb;AACA,UAAM,IAAI,UAAU,UAAU,SAAS;AACvC,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAKO,IAAM,wBAAwB,cAAc;AAAA,EACjD,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeE,WAAqC;AAClD,YAAM,OAAO,oBAAoBA,SAAQ;AACzC,aAAO,OAAO,uBAAuBA,WAAU,IAAI,IAAI;AAAA,IACzD;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,uFAAuF;AAAA,EACnG;AACF,CAAC;;;AC5HD,IAAM,uBAAuB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAMC,YAAgC,IAAI,IAAY,oBAAoB;AAE1E,IAAMC,aAAyB,aAAa,cAAc;AAE1D,IAAM,iBAAiB;AAGvB,IAAMC,0BAA8C,oBAAI,IAAY;AAAA,EAClE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAcD,SAAS,qBAAqB,IAAwC;AACpE,QAAM,QAAQ,GAAG,OAAO,IAAID,UAAQ;AACpC,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,QAAqB,CAAC;AAC5B,aAAW,QAAQ,sBAAsB;AACvC,UAAM,OAAO,MAAM,MAAM,IAAI,IAAmB;AAChD,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,KAAK,IAAI;AAAA,EACjB;AAGA,QAAM,YAAY,MAAM,CAAC,EAAG;AAC5B,MAAI,CAAC,MAAM,MAAM,CAAC,MAAM,EAAE,cAAc,SAAS,EAAG,QAAO;AAE3D,QAAM,QAAQ,OAAO,MAAM,CAAC,EAAG,KAAK;AACpC,MAAIC,wBAAuB,IAAI,KAAK,EAAG,QAAO;AAC9C,MAAI,CAAC,MAAM,MAAM,CAAC,MAAM,OAAO,EAAE,KAAK,MAAM,KAAK,EAAG,QAAO;AAE3D,QAAM,WAAW,MAAM,KAAK,CAAC,MAAM,EAAE,gBAAgB;AACrD,SAAO,EAAE,OAAO,WAAW,SAAS;AACtC;AAKA,SAAS,wBAAwB,IAAc,MAAmC;AAChF,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,QAAI,QAAQD,YAAU;AACpB,aAAO,IAAI,KAAK,KAAK;AACrB;AAAA,IACF;AACA,UAAM,QAAQ,oBAAI,IAA4B;AAC9C,eAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,UAAID,UAAS,IAAI,OAAO,IAAI,CAAC,EAAG;AAChC,YAAM,IAAI,MAAM,IAAI;AAAA,IACtB;AACA,UAAM,YAAuB;AAAA,MAC3B,UAAU;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK;AAAA,MAChB,kBAAkB,KAAK;AAAA,MACvB,WAAW;AAAA;AAAA,IACb;AACA,UAAM,IAAI,UAAU,UAAU,SAAS;AACvC,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAKO,IAAM,yBAAyB,cAAc;AAAA,EAClD,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeG,WAAqC;AAClD,YAAM,OAAO,qBAAqBA,SAAQ;AAC1C,aAAO,OAAO,wBAAwBA,WAAU,IAAI,IAAI;AAAA,IAC1D;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,uFAAuF;AAAA,EACnG;AACF,CAAC;;;ACnID,IAAM,QAAQ;AACd,IAAM,SAAS;AACf,IAAM,OAAO;AAGb,IAAMC,0BAA8C,oBAAI,IAAY,CAAC,QAAQ,WAAW,OAAO,CAAC;AAKhG,SAAS,UAAU,IAAsC;AACvD,SAAO,GAAG,OAAO,IAAI,aAAa,cAAc,CAAC;AACnD;AAMA,SAAS,kBAAkB,IAAc,OAAe,WAA8B;AACpF,QAAM,UAAU,aAAa,cAAc;AAC3C,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,GAAG,QAAQ;AACpC,QAAI,QAAQ,SAAS;AACnB,aAAO,IAAI,KAAK,KAAK;AACrB;AAAA,IACF;AACA,UAAM,QAAQ,IAAI,IAA4B,MAAM,KAAK;AACzD,UAAM,OAAO,KAAK;AAClB,UAAM,OAAO,MAAM;AACnB,eAAW,QAAQ,WAAW,qBAAqB,OAAO,IAAI,GAAG,OAAO,SAAS,GAAG;AAClF,YAAM,IAAI,KAAK,UAAU,IAAI;AAAA,IAC/B;AACA,WAAO,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACvD;AACA,SAAO,EAAE,OAAO;AAClB;AAKO,IAAM,gBAAgB,cAAc;AAAA,EACzC,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,IACP,SACE;AAAA,IAEF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,iBACE;AAAA,EAIJ;AAAA,EACA,SAAS;AAAA,IACP,eAAeC,WAAqC;AAClD,YAAM,OAAO,UAAUA,SAAQ;AAC/B,YAAM,IAAI,MAAM,MAAM,IAAI,KAAK;AAC/B,YAAM,IAAI,MAAM,MAAM,IAAI,MAAM;AAChC,UAAI,CAAC,KAAK,CAAC,EAAG,QAAO;AACrB,UAAI,EAAE,cAAc,EAAE,UAAW,QAAO;AACxC,UAAID,wBAAuB,IAAI,OAAO,EAAE,KAAK,CAAC,EAAG,QAAO;AACxD,UAAI,EAAE,UAAU,EAAE,MAAO,QAAO;AAChC,aAAO,kBAAkBC,WAAU,OAAO,EAAE,KAAK,GAAG,EAAE,SAAS;AAAA,IACjE;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,QAIE,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA,IAEA,SAAS,CAAC,iDAAiD;AAAA,EAC7D;AACF,CAAC;;;ACjDM,IAAM,kBAAsC;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AC7EO,SAAS,MAAM,OAAuB;AAC3C,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,SAAK,MAAM,WAAW,CAAC;AACvB,QAAI,KAAK,KAAK,GAAG,QAAU;AAAA,EAC7B;AACA,UAAQ,MAAM,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAC/C;;;ACYO,SAAS,cACd,MACA,MACA,OACA,WACuC;AACvC,QAAM,WAAW,CAAC,GAAW,MAC3B,KAAK,qBAAqB,GAAG,GAAG,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,OAAO,EAAE,KAAK,CAAC,CAAU;AAE9F,MAAI,SAAS,QAAQ;AACnB,WAAO,CAAC,GAAG,SAAS,SAAS,KAAK,GAAG,GAAG,SAAS,UAAU,KAAK,CAAC;AAAA,EACnE;AACA,MAAI,SAAS,iBAAiB,SAAS,gBAAgB;AACrD,UAAM,QAAQ,MAAM,MAAM,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC3D,UAAM,IAAI,MAAM,CAAC,KAAK;AACtB,UAAM,IAAI,MAAM,CAAC,KAAK;AACtB,UAAM,QAAQ,SAAS,gBAAiB,CAAC,OAAO,QAAQ,IAAe,CAAC,QAAQ,OAAO;AACvF,WAAO,CAAC,GAAG,SAAS,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,SAAS,MAAM,CAAC,GAAG,CAAC,CAAC;AAAA,EAC5D;AACA,SAAO,SAAS,MAAM,KAAK;AAC7B;AAGO,SAAS,mBACd,WACA,KAC4B;AAC5B,MAAI,UAAU,SAAS,EAAG,QAAO;AACjC,QAAM,OAAO,IAAI,cAAc;AAC/B,QAAM,QAAQ,oBAAI,IAA4B;AAC9C,aAAW,CAAC,MAAM,KAAK,KAAK,WAAW;AACrC,eAAW,QAAQ,KAAK,qBAAqB,OAAO,IAAI,GAAG,OAAO,KAAK,GAAG;AACxE,YAAM,IAAI,KAAK,UAAU,IAAI;AAAA,IAC/B;AAAA,EACF;AACA,QAAM,QAAoB,EAAE,WAAW,gBAAgB,MAAM;AAC7D,QAAM,WAAqB,EAAE,QAAQ,oBAAI,IAAI,CAAC,CAAC,aAAa,cAAc,GAAG,KAAK,CAAC,CAAC,EAAE;AACtF,QAAM,MAAM,CAAC,GAAG,SAAS,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,GAAG;AAChE,QAAM,YAAY,MAAM,MAAM,GAAG,CAAC;AAClC,QAAM,YAA4B,EAAE,WAAW,OAAO,UAAU,KAAK,IAAI,SAAS,IAAI,GAAG,IAAI;AAC7F,MAAI;AACF,QAAI,KAAK,SAAS,SAAS;AAAA,EAC7B,QAAQ;AAAA,EAER;AACA,SAAO;AACT;;;ACpDA,yBAA8B;AAC9B,WAAsB;AAUtB,SAAS,aAAqB;AAC5B,SAAO,OAAO,eAAe,WAAW,aAAa;AACvD;AAOA,SAAS,eAAe,aAA0C;AAChE,QAAM,QAAkB,CAAC;AAGzB,MAAI,YAAa,OAAM,KAAU,UAAK,aAAa,gBAAgB,CAAC;AACpE,QAAM,KAAU,UAAK,QAAQ,IAAI,GAAG,gBAAgB,CAAC;AACrD,QAAM,KAAK,WAAW,CAAC;AACvB,aAAW,QAAQ,OAAO;AACxB,QAAI;AACF,YAAM,gBAAY,kCAAc,IAAI;AACpC,gBAAU,QAAQ,0BAA0B;AAC5C,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,WAAW,SAAkD;AAC3E,QAAM,MAAM,eAAe,QAAQ,WAAW;AAC9C,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI;AACF,UAAM,gBAAgB,IAAI,8BAA8B;AACxD,UAAM,EAAE,cAAc,IAAI,IAAI,0CAA0C;AAGxE,UAAM,EAAE,cAAc,IAAI,IAAI,sCAAsC;AAGpE,UAAM,MAAM,IAAI,0BAA0B;AAE1C,QAAI,aAAsB,QAAQ,UAAU,EAAE,SAAS,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE;AACrE,QAAI,QAAQ,eAAe,QAAW;AACpC,YAAM,aAAa,IAAI,2BAA2B;AAClD,mBAAa,WAAW,QAAQ,UAAU;AAAA,IAC5C;AACA,UAAM,WAAW,cAAc,UAAU;AACzC,UAAM,UAAU,cAAc,QAAQ;AAEtC,WAAO;AAAA,MACL,SAAS,IAAI;AAAA,MACb;AAAA,MACA,SAAS,YAAyC;AAChD,cAAM,QAAQ,cAAc,IAAI,IAAI,UAAU,GAAG,OAAO;AACxD,eAAO,MAAM,IAAI,CAAC,CAAC,EAAE,IAAI,MAAM,IAAI;AAAA,MACrC;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACnFA,IAAM,yBAAyB,oBAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAaM,SAAS,cAAc,UAAkC;AAC9D,QAAM,MAAM,SAAS,KAAK;AAC1B,MAAI,IAAI,WAAW,KAAK,IAAI,CAAC,MAAM,IAAK,QAAO,EAAE,MAAM,UAAU;AAGjE,MAAI,IAAI;AACR,SAAO,IAAI,IAAI,QAAQ,KAAK,GAAG;AAC7B,UAAM,IAAI,IAAI,CAAC;AACf,QAAI,MAAM,MAAM;AACd,WAAK;AACL;AAAA,IACF;AACA,QAAI,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,KAAK;AACxG;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,IAAI,MAAM,CAAC;AAC7B,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO,EAAE,MAAM,UAAU,QAAQ,CAAC,GAAG,eAAe,GAAG;AAAA,EACzD;AAEA,MAAI,CAAC,oCAAoC,KAAK,SAAS,GAAG;AACxD,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AAEA,QAAM,QAAQ,UAAU,MAAM,6BAA6B,KAAK,CAAC;AACjE,QAAM,SAAmB,CAAC;AAC1B,MAAI,gBAAgB;AACpB,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,WAAW,IAAI,KAAK,uBAAuB,IAAI,IAAI,GAAG;AAC7D,sBAAgB,KAAK,WAAW,IAAI,IAAI,OAAO,IAAI,IAAI;AAAA,IACzD,OAAO;AACL,aAAO,KAAK,IAAI;AAAA,IAClB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,UAAU,QAAQ,cAAc;AACjD;AAEO,SAAS,cAAc,OAAe,QAA2B,eAAuC;AAC7G,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,EAAE,KAAK;AAAA,IAClC;AAAA,EACF;AACF;AAGO,SAAS,cAAc,UAAiC;AAC7D,QAAM,MAAM,SAAS,KAAK;AAC1B,MAAI,IAAI,CAAC,MAAM,IAAK,QAAO;AAC3B,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,GAAG;AACtC,UAAM,IAAI,IAAI,CAAC;AACf,QAAI,MAAM,MAAM;AACd,WAAK;AACL,UAAI,IAAI,IAAI,OAAQ,QAAO,IAAI,CAAC;AAChC;AAAA,IACF;AACA,QAAI,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,KAAK;AACxG,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACA,SAAO,IAAI,SAAS,IAAI,MAAM;AAChC;;;AClEA,SAAS,aACP,MACA,YACA,qBACA,KACM;AACN,MAAI,KAAK,SAAS,QAAQ;AACxB,QAAI,KAAK,EAAE,MAAM,MAAyB,OAAO,YAAY,aAAa,oBAAoB,CAAC;AAC/F;AAAA,EACF;AACA,MAAI,KAAK,SAAS,UAAU;AAC1B,UAAM,KAAK;AACX,UAAM,WAAW,GAAG,SAAS,CAAC;AAC9B,QAAI,GAAG,SAAS,SAAS;AACvB,YAAM,YAAY,GAAG,SAAS,CAAC,GAAG,YAAY,GAAG,MAAM,IAAI;AAC3D,iBAAW,SAAS,SAAU,cAAa,OAAO,WAAW,qBAAqB,GAAG;AAAA,IACvF,OAAO;AAEL,iBAAW,SAAS,SAAU,cAAa,OAAO,YAAY,MAAM,GAAG;AAAA,IACzE;AAAA,EACF;AACF;AAGO,SAAS,aAAa,OAAe,OAA0C;AACpF,MAAI,MAAM,WAAW,EAAG,QAAO,EAAE,QAAQ,CAAC,GAAG,UAAU,MAAM;AAE7D,QAAM,SAA2F,CAAC;AAClG,aAAW,QAAQ,MAAO,cAAa,MAAM,CAAC,GAAG,OAAO,MAAM;AAE9D,QAAM,SAA2B,CAAC;AAClC,MAAI,aAAa;AAEjB,aAAW,EAAE,MAAM,OAAO,YAAY,KAAK,QAAQ;AACjD,UAAM,SAAS,cAAc,KAAK,QAAQ;AAC1C,QAAI,OAAO,SAAS,aAAa,aAAa;AAC5C,mBAAa;AACb;AAAA,IACF;AACA,UAAM,QAAmD,CAAC;AAC1D,eAAW,SAAS,KAAK,SAAS,CAAC,GAAG;AACpC,UAAI,MAAM,SAAS,OAAQ;AAC3B,YAAM,IAAI;AACV,UAAI,OAAO,EAAE,UAAU,SAAU;AACjC,YAAM,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,IAAI,CAAC;AAAA,IACpD;AACA,QAAI,MAAM,WAAW,EAAG;AACxB,UAAM,aAAa,MAAM,KAAK,OAAO;AACrC,WAAO,KAAK,EAAE,WAAW,cAAc,YAAY,OAAO,QAAQ,OAAO,aAAa,GAAG,MAAM,CAAC;AAAA,EAClG;AAEA,QAAMC,UACJ,cAAc,OAAO,WAAW,IAC5B,EAAE,OAAO,QAAQ,sBAAsB,QAAQ,wDAAwD,IACvG;AAEN,SAAO,EAAE,QAAQ,UAAU,MAAM,QAAAA,QAAO;AAC1C;;;AC1EO,SAAS,iBAAiB,MAAsB;AACrD,MAAI,KAAK,SAAS,QAAQ;AACxB,UAAM,IAAI;AACV,QAAI,OAAO,EAAE,UAAU,SAAU,QAAO;AACxC,WAAO,GAAG,EAAE,IAAI,IAAI,EAAE,KAAK,GAAG,EAAE,cAAc,OAAO,gBAAgB,EAAE;AAAA,EACzE;AACA,MAAI,KAAK,SAAS,QAAQ;AACxB,UAAM,IAAI;AACV,UAAM,QAAQ,EAAE,SAAS,CAAC,GACvB,IAAI,CAAC,MAAM,iBAAiB,CAAC,CAAC,EAC9B,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAC1B,KAAK,GAAG;AACX,WAAO,GAAG,EAAE,QAAQ,IAAI,IAAI;AAAA,EAC9B;AACA,MAAI,KAAK,SAAS,UAAU;AAC1B,UAAM,IAAI;AACV,UAAM,QAAQ,EAAE,SAAS,CAAC,GACvB,IAAI,CAAC,MAAM,iBAAiB,CAAC,CAAC,EAC9B,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAC1B,KAAK,EAAE;AACV,WAAO,IAAI,EAAE,IAAI,IAAI,EAAE,MAAM,IAAI,IAAI;AAAA,EACvC;AACA,SAAO;AACT;;;ACfO,SAAS,cACd,WACU;AACV,MAAI,UAAU,SAAS,EAAG,QAAO,cAAc;AAC/C,QAAM,SAAS,oBAAI,IAAiD;AACpE,aAAW,EAAE,WAAW,MAAM,KAAK,UAAU,OAAO,GAAG;AACrD,QAAI,MAAM,SAAS,EAAG;AACtB,WAAO,IAAI,aAAa,SAAS,GAAG,EAAE,WAAW,MAAM,CAAC;AAAA,EAC1D;AACA,MAAI,OAAO,SAAS,EAAG,QAAO,cAAc;AAC5C,SAAO,WAAW,kBAAkB,EAAE,OAAO,CAAC;AAChD;AAOO,SAAS,WAAW,MAAqD;AAC9E,QAAM,MAAqB,CAAC;AAC5B,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,MAAM,CAAC,MAAqC;AAChD,QAAI,CAAC,KAAK,EAAE,SAAS,WAAW,KAAK,IAAI,EAAE,SAAS,EAAG;AACvD,SAAK,IAAI,EAAE,SAAS;AACpB,QAAI,KAAK,CAAC;AAAA,EACZ;AACA,aAAW,KAAK,KAAK,YAAY,CAAC,EAAG,KAAI,CAAC;AAC1C,MAAI,KAAK,MAAM;AACf,SAAO,IAAI,SAAS,IAAI,MAAM;AAChC;;;AClCO,IAAM,eAA8B;AAAA,EACzC,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,eAAe;AAAA,EACf,cAAc;AAAA,EACd,WAAW;AACb;AAMO,IAAM,kBAAiC;AAAA,EAC5C,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,eAAe;AAAA,EACf,cAAc;AAAA,EACd,WAAW;AACb;;;ACCA,IAAM,mBAAN,MAAgD;AAAA,EACrC,KAAK;AAAA,EACL;AAAA,EACA;AAAA,EAEA;AAAA;AAAA,EAEA,cAAc,oBAAI,IAA4B;AAAA;AAAA,EAE9C,gBAAgB,oBAAI,IAA2B;AAAA;AAAA,EAExD,gBAA2F;AAAA,EAE3F,YAAY,SAAiC,CAAC,GAAG;AAC/C,SAAK,UAAU,WAAW,MAAM;AAChC,SAAK,WACH,OAAO,aAAa,KAAK,UAAU,eAAe,KAAK,QAAQ,OAAO,KAAK;AAC7E,UAAM,OAAO,KAAK,UAAU,OAAO,UAAU,CAAC,CAAC,KAAK,OAAO,cAAc;AACzE,SAAK,cAAc,OAAO,eAAe,GAAG,KAAK,QAAQ,IAAI,MAAM,IAAI,CAAC;AAAA,EAC1E;AAAA;AAAA,EAGA,SAAS,OAA+B;AACtC,UAAM,SAAS,KAAK,YAAY,IAAI,KAAK;AACzC,QAAI,OAAQ,QAAO;AACnB,QAAI;AACJ,QAAI,CAAC,KAAK,SAAS;AACjB,eAAS,EAAE,QAAQ,CAAC,GAAG,UAAU,MAAM;AAAA,IACzC,OAAO;AACL,UAAI;AACF,iBAAS,aAAa,OAAO,KAAK,QAAQ,SAAS,CAAC,KAAK,CAAC,CAAC;AAAA,MAC7D,QAAQ;AACN,iBAAS,EAAE,QAAQ,CAAC,GAAG,UAAU,MAAM;AAAA,MACzC;AAAA,IACF;AACA,SAAK,YAAY,IAAI,OAAO,MAAM;AAClC,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,OAAwB;AAC3B,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,WAAO,KAAK,SAAS,KAAK,EAAE;AAAA,EAC9B;AAAA,EAEA,QAAQ,OAAoC;AAC1C,UAAM,MAAM,KAAK,UAAU,MAAM,OAAO;AACxC,UAAM,SAAS,KAAK,cAAc,IAAI,GAAG;AACzC,QAAI,OAAQ,QAAO;AAInB,UAAM,YAAY,oBAAI,IAGpB;AACF,UAAM,WAAqB,CAAC;AAC5B,UAAM,UAAoB,CAAC;AAC3B,UAAMC,UAAwB,CAAC;AAE/B,UAAM,QAAQ,QAAQ,CAAC,OAAO,eAAe;AAC3C,YAAM,YAAY,KAAK,SAAS,KAAK;AACrC,UAAI,CAAC,UAAU,UAAU;AACvB,gBAAQ,KAAK,KAAK;AAClB;AAAA,MACF;AACA,UAAI,UAAU,OAAQ,CAAAA,QAAO,KAAK,UAAU,MAAM;AAClD,UAAI,UAAU,OAAO,WAAW,EAAG;AAEnC,YAAM,SAAsB,EAAE,MAAM,SAAS,YAAY,WAAW,MAAM;AAC1E,UAAI,cAAc;AAClB,iBAAW,SAAS,UAAU,QAAQ;AACpC,cAAM,KAAK,aAAa,MAAM,SAAS;AACvC,YAAI,SAAS,UAAU,IAAI,EAAE;AAC7B,YAAI,CAAC,QAAQ;AACX,mBAAS,EAAE,WAAW,MAAM,WAAW,OAAO,oBAAI,IAAI,EAAE;AACxD,oBAAU,IAAI,IAAI,MAAM;AAAA,QAC1B;AACA,mBAAW,CAAC,MAAM,OAAO,SAAS,KAAK,MAAM,OAAO;AAClD,qBAAW,QAAQ,WAAW,qBAAqB,MAAM,OAAO,SAAS,GAAG;AAK1E,kBAAM,OAAO,OAAO,MAAM,IAAI,KAAK,QAAQ;AAC3C,kBAAM,WAAW,OAAO,WAAW,IAAI,IAAI;AAC3C,mBAAO,MAAM,IAAI,KAAK,UAAU,WAAW,EAAE,GAAG,MAAM,QAAQ,SAAS,IAAI,EAAE,GAAG,MAAM,OAAO,CAAC;AAC9F,0BAAc;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AACA,UAAI,YAAa,UAAS,KAAK,KAAK;AAAA,IACtC,CAAC;AAED,UAAM,SAAwB;AAAA,MAC5B,QAAQ,cAAc,SAAS;AAAA,MAC/B;AAAA,MACA;AAAA,MACA,QAAAA;AAAA,MACA,UAAU,CAAC;AAAA,IACb;AACA,SAAK,cAAc,IAAI,KAAK,MAAM;AAClC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,qBAAyF;AACvF,QAAI,KAAK,cAAe,QAAO,KAAK;AACpC,UAAM,QAA4D,CAAC;AACnE,QAAI,KAAK,SAAS;AAChB,UAAI;AACF,cAAM,UAAU,KAAK,QAAQ,QAC1B,aAAa,EACb,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ;AACnD,cAAM,QAAQ,KAAK,QAAQ,SAAS,OAAO;AAE3C,mBAAW,QAAQ,OAAO;AACxB,cAAI,KAAK,SAAS,OAAQ;AAC1B,gBAAM,OAAO;AACb,gBAAM,SAAS,cAAc,KAAK,QAAQ;AAC1C,cAAI,OAAO,SAAS,YAAY,OAAO,OAAO,SAAS,KAAK,OAAO,kBAAkB,IAAI;AACvF;AAAA,UACF;AACA,gBAAM,YAAY,cAAc,KAAK,QAAQ;AAC7C,cAAI,cAAc,KAAM;AACxB,gBAAM,QAAQ,oBAAI,IAAyB;AAC3C,qBAAW,SAAS,KAAK,SAAS,CAAC,GAAG;AACpC,gBAAI,MAAM,SAAS,OAAQ;AAC3B,kBAAM,IAAI;AACV,gBAAI,OAAO,EAAE,UAAU,SAAU;AACjC,uBAAW,QAAQ,WAAW,qBAAqB,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,IAAI,GAAG;AACzF,oBAAM,IAAI,KAAK,UAAU,OAAO,KAAK,KAAK,CAAC;AAAA,YAC7C;AAAA,UACF;AACA,cAAI,MAAM,OAAO,EAAG,OAAM,KAAK,CAAC,WAAW,KAAK,CAAC;AAAA,QACnD;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AACA,UAAM,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE;AACtF,SAAK,gBAAgB;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,QAAkB,KAA8B;AACnD,UAAM,OAAO,IAAI,cAAc;AAC/B,UAAM,aAAa,KAAK,kBAAkB,MAAM;AAChD,UAAM,OAAO,WAAW,OAAO,IAAI,aAAa,cAAc,CAAC;AAC/D,QAAI,CAAC,QAAQ,KAAK,MAAM,SAAS,EAAG,QAAO,EAAE,SAAS,CAAC,GAAG,OAAO,MAAM,UAAU,CAAC,EAAE;AAIpF,UAAM,aAAa,WAAW,OAAO,OAAO;AAM5C,UAAM,SAAS,oBAAI,IAAyB;AAC5C,eAAW,CAAC,MAAM,IAAI,KAAK,KAAK,OAAO;AACrC,iBAAW,CAAC,IAAI,EAAE,KAAK,cAAc,MAAM,OAAO,IAAI,GAAG,OAAO,KAAK,KAAK,GAAG,KAAK,SAAS,GAAG;AAC5F,eAAO,IAAI,IAAI,EAAE;AAAA,MACnB;AAAA,IACF;AAIA,UAAM,aAAyE,CAAC;AAChF,eAAW,SAAS,KAAK,mBAAmB,GAAG;AAC7C,YAAM,CAAC,EAAE,OAAO,IAAI;AACpB,UAAI,QAAQ,SAAS,KAAK,QAAQ,OAAO,OAAO,KAAM;AACtD,UAAI,OAAO;AACX,iBAAW,CAAC,MAAM,KAAK,KAAK,SAAS;AACnC,YAAI,OAAO,IAAI,IAAI,MAAM,OAAO;AAC9B,iBAAO;AACP;AAAA,QACF;AAAA,MACF;AACA,UAAI,KAAM,YAAW,KAAK,KAAK;AAAA,IACjC;AAKA,UAAM,YAAY,IAAI,IAAI,MAAM;AAChC,UAAM,UAAoB,CAAC;AAC3B,WAAO,UAAU,OAAO,GAAG;AACzB,UAAI,OAAmE;AACvE,UAAI,YAAY;AAChB,iBAAW,SAAS,YAAY;AAC9B,cAAM,CAAC,OAAO,OAAO,IAAI;AACzB,YAAI,QAAQ;AACZ,mBAAW,QAAQ,QAAQ,KAAK,EAAG,KAAI,UAAU,IAAI,IAAI,EAAG,UAAS;AACrE,YAAI,UAAU,EAAG;AACjB,cAAM,SACJ,SAAS,QACT,QAAQ,aACP,UAAU,aAAa,QAAQ,OAAO,KAAK,CAAC,EAAE,QAC9C,UAAU,aAAa,QAAQ,SAAS,KAAK,CAAC,EAAE,QAAQ,QAAQ,KAAK,CAAC;AACzE,YAAI,QAAQ;AACV,iBAAO;AACP,sBAAY;AAAA,QACd;AAAA,MACF;AACA,UAAI,CAAC,KAAM;AACX,cAAQ,KAAK,KAAK,CAAC,CAAC;AACpB,iBAAW,QAAQ,KAAK,CAAC,EAAE,KAAK,EAAG,WAAU,OAAO,IAAI;AAAA,IAC1D;AAEA,UAAM,QAAQ,UAAU,SAAS,KAAK,CAAC;AACvC,QAAI,UAAU,SAAS,EAAG,QAAO,EAAE,SAAS,OAAO,UAAU,CAAC,EAAE;AAGhE,UAAM,WAAW,mBAAmB,WAAW,GAAG;AAClD,WAAO,WACH,EAAE,SAAS,UAAU,OAAO,UAAU,CAAC,EAAE,IACzC,EAAE,SAAS,OAAO,UAAU,CAAC,EAAE;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,SAAoC;AACzC,QAAI,CAAC,KAAK,QAAS,QAAO;AAC1B,UAAM,SAAS,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC/D,QAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAI;AACF,aAAO,KAAK,QACT,SAAS,MAAM,EACf,IAAI,CAAC,MAAM,iBAAiB,CAAC,CAAC,EAC9B,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAC1B,KAAK,IAAI;AAAA,IACd,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,cAAc,OAA8B;AAM1C,UAAM,KAAK,KAAK,SAAS,KAAK;AAC9B,QAAI,CAAC,GAAG,YAAY,GAAG,OAAQ,QAAO;AACtC,UAAM,WACJ,GAAG,OAAO,SAAS,KACnB,GAAG,OAAO,MAAM,CAAC,MAAM,aAAa,EAAE,SAAS,MAAM,aAAa,cAAc,CAAC;AACnF,QAAI,CAAC,SAAU,QAAO;AACtB,WAAO;AAAA,EACT;AACF;AAGO,SAAS,uBAAuB,QAAgD;AACrF,SAAO,IAAI,iBAAiB,MAAM;AACpC;;;ACnSO,IAAM,kBAAkB;AAGxB,IAAM,wBAAwB;AAG9B,IAAM,iBAAiB;AAGvB,IAAM,qBAA0C,oBAAI,IAAI;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,qBAA0C,oBAAI,IAAI;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAMC,0BAA8C,oBAAI,IAAI;AAAA,EACjE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;;;AC1CD,IAAAC,sBAA8B;AAC9B,IAAAC,QAAsB;AAkBf,SAASC,cAAqB;AACnC,SAAO,OAAO,eAAe,WAAW,aAAa;AACvD;AA0BO,SAAS,kBAAkB,aAA4C;AAC5E,QAAM,QAAkB,CAAC;AACzB,MAAI,YAAa,OAAM,KAAU,WAAK,aAAa,gBAAgB,CAAC;AACpE,QAAM,KAAU,WAAK,QAAQ,IAAI,GAAG,gBAAgB,CAAC;AACrD,QAAM,KAAKA,YAAW,CAAC;AACvB,aAAW,QAAQ,OAAO;AACxB,QAAI;AACF,YAAM,UAAM,mCAAc,IAAI;AAC9B,UAAI,QAAQ,SAAS;AACrB,UAAI,QAAQ,yBAAyB;AACrC,YAAM,UAAU,IAAI,SAAS;AAC7B,YAAM,MAAM,IAAI,yBAAyB;AAEzC,YAAM,WAAW,IAAI,WAAW;AAChC,aAAO,EAAE,OAAO,QAAQ,OAAO,gBAAgB,SAAS;AAAA,IAC1D,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAOO,IAAI,KAA6B;AAEjC,IAAI,KAA+B;AAGnC,SAAS,cAAc,aAA4B;AACxD,MAAI,MAAM,GAAI;AACd,QAAM,SAAS,kBAAkB,WAAW;AAC5C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IAGF;AAAA,EACF;AACA,OAAK,OAAO;AACZ,OAAK,OAAO;AACd;;;AC7EO,SAAS,aAAa,MAA0B;AACrD,QAAM,QAAkB,CAAC;AACzB,MAAI,OAAO;AACX,MAAI,SAAS,KAAK;AAClB,SAAO,UAAU,OAAO,SAAS,UAAU;AACzC,UAAM,KAAK;AACX,UAAM,OAAO,GAAG,KAAK,YAAY;AACjC,QAAI,SAAS,QAAS,OAAM,QAAQ,GAAG,OAAO,KAAK,EAAE,QAAQ,QAAQ,GAAG,CAAC;AAAA,aAChE,SAAS,eAAe,KAAK,SAAS,WAAW,KAAK,SAAS,YAAa,QAAO;AAC5F,aAAS,OAAO;AAAA,EAClB;AACA,SAAO,EAAE,OAAO,MAAM,KAAK,OAAO,GAAG,KAAK;AAC5C;AAGO,SAAS,aAAa,MAAuB;AAClD,QAAM,MAAiB,CAAC;AACxB,aAAW,QAAQ,KAAK,OAAO;AAC7B,QAAI,KAAK,SAAS,OAAQ,KAAI,KAAK,CAAC,KAAK,MAAM,KAAK,OAAO,KAAK,cAAc,IAAI,CAAC;AAAA,EACrF;AACA,SAAO;AACT;;;ACnCA,qBAA6B;AAStB,SAAS,kBAAkB,OAAwB;AACxD,SAAO,MAAM,SAAS,KAAK,CAAC,kBAAkB,KAAK,KAAK;AAC1D;AAGO,SAAS,YAAYC,OAAuB;AACjD,MAAI;AACF,WAAO,EAAE,IAAIA,OAAM,SAAK,6BAAaA,OAAM,MAAM,EAAE;AAAA,EACrD,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,uCAAuCA,KAAI,KAAK,EAAE,MAAM,CAAC;AAAA,EAC3E;AACF;AAMO,SAAS,kBAAkB,UAAkB,OAAmC;AACrF,QAAM,QAAQ,MAAM,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,EAAE,KAAK;AAC/D,SAAO,GAAG,QAAQ,IAAI,cAAc,KAAK,MAAM,KAAK,GAAG,CAAC;AAC1D;;;ACdO,SAAS,eAAe,UAA+C;AAC5E,QAAM,YAAwB,CAAC;AAC/B,MAAI,UAAiC,CAAC;AACtC,MAAI,iBAAgC;AACpC,aAAW,QAAQ,SAAS,OAAO;AACjC,QAAI,GAAI,aAAa,IAAI,GAAG;AAC1B,gBAAU,KAAK,EAAE,gBAAgB,OAAO,QAAQ,CAAC;AACjD,gBAAU,CAAC;AACX,uBAAiB,gBAAgB,IAAI;AAAA,IACvC,OAAO;AACL,cAAQ,KAAK,IAAI;AAAA,IACnB;AAAA,EACF;AACA,YAAU,KAAK,EAAE,gBAAgB,OAAO,QAAQ,CAAC;AACjD,SAAO;AACT;AAGA,SAAS,gBAAgB,MAAyC;AAChE,QAAM,IAAI,KAAK;AACf,SAAO,EAAE,KAAK,MAAM,KAAK,MAAM,EAAE,KAAK;AACxC;AAGO,SAAS,WAAW,MAAqC;AAC9D,SAAO,KAAK,MAAM,YAAY;AAChC;AAEO,SAAS,gBAAgB,MAAsC;AACpE,SAAO,GAAI,gBAAgB,IAAI,KAAKC,wBAAuB,IAAI,WAAW,IAAI,CAAC;AACjF;AAGO,SAAS,uBAAuB,MAAqC;AAC1E,QAAM,OAAO,WAAW,IAAI;AAC5B,SAAO,KAAK,WAAW,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,MAAM,EAAE,CAAC;AACnE;;;ACFO,IAAM,oBAAN,MAAiD;AAAA,EACtC,KAAa;AAAA,EACb,WAAmB;AAAA,EACnB;AAAA,EAEP;AAAA;AAAA,EAEA,cAAc,oBAAI,IAAyB;AAAA;AAAA,EAE3C,SAAS,oBAAI,IAA0B;AAAA;AAAA,EAEvC,SAAS,oBAAI,IAAY;AAAA;AAAA,EAEzB;AAAA,EAET,WAA2C;AAAA,EAEpC,YAAY,WAA+B,CAAC,GAAG,UAA8B,CAAC,GAAG;AACtF,kBAAc,QAAQ,WAAW;AACjC,UAAM,YAAY,QAAQ,SAAS,CAAC,GAAG,IAAI,WAAW;AACtD,SAAK,SAAS,CAAC,GAAG,UAAU,GAAG,QAAQ;AACvC,SAAK,cAAc,QAAQ,eAAe,kBAAkB,KAAK,UAAU,KAAK,MAAM;AAEtF,UAAM,UAAU,oBAAI,IAAY;AAChC,QAAI,QAAQ;AACZ,eAAW,QAAQ,KAAK,QAAQ;AAC9B,cAAQ,KAAK,WAAW,MAAM,OAAO,OAAO;AAAA,IAC9C;AACA,SAAK,WAAW,CAAC,GAAG,OAAO,EAAE,KAAK;AAAA,EACpC;AAAA;AAAA,EAGA,IAAW,QAA4B;AACrC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGO,KAAK,OAAwB;AAClC,WAAO,kBAAkB,KAAK,KAAK,KAAK,OAAO,IAAI,KAAK;AAAA,EAC1D;AAAA,EAEO,QAAQ,OAAoC;AACjD,UAAM,SAAS,KAAK,eAAe,MAAM,SAAS,MAAM,OAAO;AAC/D,UAAM,WAAqB,CAAC;AAC5B,UAAM,UAAoB,CAAC;AAC3B,eAAW,SAAS,MAAM,SAAS;AACjC,UAAI,KAAK,YAAY,IAAI,KAAK,EAAG,UAAS,KAAK,KAAK;AAAA,UAC/C,SAAQ,KAAK,KAAK;AAAA,IACzB;AACA,WAAO,EAAE,QAAQ,UAAU,SAAS,QAAQ,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,EAC/D;AAAA,EAEO,KAAK,QAAkB,KAA8B;AAC1D,UAAM,OAAO,IAAI,cAAc;AAC/B,UAAM,YAAY,oBAAI,IAAoB;AAC1C,eAAW,CAAC,IAAI,KAAK,KAAK,KAAK,kBAAkB,MAAM,EAAE,QAAQ;AAC/D,iBAAW,CAAC,MAAM,IAAI,KAAK,MAAM,OAAO;AACtC,kBAAU,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,CAAC;AAAA,MACnD;AAAA,IACF;AACA,QAAI,UAAU,SAAS,EAAG,QAAO,EAAE,SAAS,CAAC,GAAG,OAAO,MAAM,UAAU,CAAC,EAAE;AAE1E,UAAM,UAAoB,CAAC;AAE3B,eAAW,EAAE,OAAO,MAAM,KAAK,KAAK,cAAc,GAAG;AACnD,UAAI,UAAU;AACd,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO;AAChC,YAAI,UAAU,IAAI,GAAG,MAAM,OAAO;AAChC,oBAAU;AACV;AAAA,QACF;AAAA,MACF;AACA,UAAI,CAAC,QAAS;AACd,cAAQ,KAAK,KAAK;AAClB,iBAAW,OAAO,MAAM,KAAK,EAAG,WAAU,OAAO,GAAG;AACpD,UAAI,UAAU,SAAS,EAAG;AAAA,IAC5B;AAGA,WAAO,EAAE,SAAS,OAAO,UAAU,SAAS,GAAG,UAAU,CAAC,EAAE;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,OAAO,UAAqC;AACjD,WAAO,KAAK,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,IAAI;AAAA,EAChD;AAAA,EAEO,cAAc,OAA8B;AACjD,UAAM,IAAI,KAAK,OAAO,IAAI,KAAK;AAC/B,QAAI,CAAC,GAAG;AACN,aAAO;AAAA,QACL,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,eAAe;AAAA,QACf,cAAc;AAAA,QACd,WAAW;AAAA,MACb;AAAA,IACF;AACA,WAAO;AAAA,MACL,WAAW,EAAE;AAAA,MACb,YAAY,EAAE;AAAA,MACd,YAAY,EAAE;AAAA,MACd,WAAW,EAAE;AAAA,MACb,eAAe,EAAE;AAAA,MACjB,cAAc,EAAE;AAAA;AAAA,MAEhB,WAAW,EAAE,cAAc,CAAC,EAAE;AAAA,IAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,mBAAsC;AAC3C,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA,EAKA,WAAW,MAAe,YAAoB,SAA8B;AAC1E,QAAI,QAAQ;AACZ,QAAI;AACJ,QAAI;AACF,aAAO,GAAI,KAAK,KAAK,EAAE,MAAM,KAAK,GAAG,CAAC;AAAA,IACxC,QAAQ;AAEN,aAAO;AAAA,IACT;AAEA,SAAK,UAAU,CAAC,SAAS;AACvB,YAAM,QAAQ,aAAa,IAAI;AAC/B,UAAI,MAAM,KAAM;AAChB,YAAM,QAAQ,aAAa,IAAI;AAE/B,UAAI;AACJ,UAAI;AACF,cAAM,GAAI,EAAE,QAAQ,KAAK,QAAQ;AAAA,MACnC,QAAQ;AACN;AAAA,MACF;AAEA,iBAAW,OAAO,IAAI,OAAO;AAC3B,cAAM,YAAY;AAClB,aAAK,iBAAiB,KAAgC,MAAM,OAAO,OAAO,WAAW,OAAO;AAAA,MAC9F;AACA,eAAS;AAAA,IACX,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,iBACE,UACA,OACA,OACA,OACA,SACM;AACN,UAAM,YAAY,eAAe,QAAQ;AACzC,QAAI,gBAAgB;AACpB,QAAI,gBAAgB;AAEpB,cAAU,QAAQ,CAAC,UAAU,UAAU;AACrC,YAAM,YAAY,UAAU,UAAU,SAAS;AAC/C,YAAM,kBAAkB,QAAQ,UAAU,SAAS,IAAI,UAAU,QAAQ,CAAC,EAAG,iBAAiB;AAC9F,UAAI,gBAAiB,iBAAgB;AAErC,YAAM,UAAU,SAAS,MAAM,OAAO,CAAC,MAAM,GAAI,YAAY,CAAC,CAAC;AAC/D,YAAM,cAAc,SAAS,MAAM;AAAA,QACjC,CAAC,MACC,GAAI,MAAM,CAAC,KACX,GAAI,aAAa,CAAC,KAClB,GAAI,YAAY,CAAC,KACjB,GAAI,YAAY,CAAC,KACjB,GAAI,UAAU,CAAC;AAAA,MACnB;AACA,YAAM,UAAU,SAAS,MAAM,OAAO,CAAC,MAAM,GAAI,SAAS,CAAC,CAAC;AAC5D,YAAM,mBAAmB,QAAQ,KAAK,CAAC,MAAM,mBAAmB,IAAI,WAAW,CAAC,CAAC,CAAC;AAClF,YAAM,mBAAmB,QAAQ,KAAK,CAAC,MAAM,mBAAmB,IAAI,WAAW,CAAC,CAAC,CAAC;AAClF,YAAM,eAAe,QAAQ;AAAA,QAC3B,CAAC,MACC,GAAI,cAAc,CAAC,KACnB,CAAC,mBAAmB,IAAI,WAAW,CAAC,CAAC,KACrC,CAAC,mBAAmB,IAAI,WAAW,CAAC,CAAC;AAAA,MACzC;AACA,YAAM,iBAAiB,QAAQ,OAAO,CAAC,MAAM,gBAAgB,CAAC,CAAC;AAC/D,YAAM,YAAY,QAAQ,SAAS,KAAK,eAAe,oBAAoB,aAAa,SAAS;AAEjG,UAAI,iBAAkB,iBAAgB;AAEtC,iBAAW,OAAO,SAAS;AACzB,cAAM,QAAQ,IAAI;AAClB,aAAK,OAAO,IAAI,KAAK;AACrB,cAAM,IAAI,KAAK,UAAU,KAAK;AAC9B,UAAE,aAAa;AACf,YAAI,UAAW,GAAE,YAAY;AAC7B,YAAI,oBAAoB,OAAO,oBAAoB,IAAK,GAAE,aAAa;AACvE,YAAI,oBAAoB,OAAO,oBAAoB,IAAK,GAAE,YAAY;AACtE,YAAI,UAAW,GAAE,aAAa;AAC9B,YAAI,iBAAkB,GAAE,eAAe;AACvC,YAAI,oBAAoB,QAAQ,aAAa,oBAAoB,eAAe,SAAS,GAAG;AAC1F,YAAE,cAAc;AAAA,QAClB;AAKA,cAAM,kBACJ,UAAU,WAAW,KACrB,QAAQ,WAAW,KACnB,CAAC,eACD,CAAC,oBACD,CAAC,oBACD,eAAe,UAAU;AAC3B,YAAI,mBAAmB,MAAM,SAAS,GAAG;AACvC,gBAAM,YAA4B;AAAA,YAChC;AAAA,YACA,QAAQ,aAAa,IAAI,UAAU,EAAE,KAAK;AAAA,YAC1C,eAAe,eAAe,WAAW,IAAI,uBAAuB,eAAe,CAAC,CAAE,IAAI;AAAA,UAC5F;AACA,eAAK,cAAc,OAAO,EAAE,OAAO,OAAO,WAAW,MAAM,CAAC;AAAA,QAC9D;AAAA,MACF;AAGA,iBAAW,KAAK,SAAS;AACvB,cAAM,QAAQ,WAAW,CAAC,MAAM;AAChC,UAAE,YAAY,CAAC,UAAU;AACvB,gBAAM,QAAQ,MAAM;AACpB,eAAK,OAAO,IAAI,KAAK;AACrB,gBAAM,IAAI,KAAK,UAAU,KAAK;AAC9B,YAAE,aAAa;AACf,YAAE,cAAc;AAChB,cAAI,MAAO,GAAE,gBAAgB;AAAA,QAC/B,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,QAAI,iBAAiB,eAAe;AAClC,cAAQ,IAAI,SAAS,SAAS,EAAE,KAAK,CAAC;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,cAAc,OAAe,OAAwB;AACnD,UAAM,OAAO,KAAK,YAAY,IAAI,KAAK;AACvC,QAAI,KAAM,MAAK,KAAK,KAAK;AAAA,QACpB,MAAK,YAAY,IAAI,OAAO,CAAC,KAAK,CAAC;AAAA,EAC1C;AAAA,EAEA,UAAU,OAA6B;AACrC,QAAI,IAAI,KAAK,OAAO,IAAI,KAAK;AAC7B,QAAI,CAAC,GAAG;AACN,UAAI;AAAA,QACF,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,eAAe;AAAA,QACf,cAAc;AAAA,QACd,aAAa;AAAA,MACf;AACA,WAAK,OAAO,IAAI,OAAO,CAAC;AAAA,IAC1B;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,SAA4B,WAAwC;AACjF,UAAM,UAAuB,CAAC;AAC9B,eAAW,SAAS,IAAI,IAAI,OAAO,GAAG;AACpC,YAAM,OAAO,KAAK,YAAY,IAAI,KAAK;AACvC,UAAI,KAAM,SAAQ,KAAK,GAAG,IAAI;AAAA,IAChC;AACA,QAAI,QAAQ,WAAW,EAAG,QAAO,cAAc;AAG/C,YAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAExC,UAAM,MAAM,oBAAI,IAAqF;AACrG,eAAW,SAAS,SAAS;AAC3B,YAAM,MAAM,aAAa,MAAM,SAAS;AACxC,UAAI,QAAQ,IAAI,IAAI,GAAG;AACvB,UAAI,CAAC,OAAO;AACV,gBAAQ,EAAE,WAAW,MAAM,WAAW,OAAO,oBAAI,IAAI,EAAE;AACvD,YAAI,IAAI,KAAK,KAAK;AAAA,MACpB;AACA,YAAM,aAAa,UAAU,QAAQ,MAAM,KAAK;AAChD,YAAM,SAAsB,EAAE,MAAM,SAAS,YAAY,WAAW,MAAM,MAAM;AAChF,iBAAW,CAAC,MAAM,OAAO,SAAS,KAAK,MAAM,OAAO;AAClD,mBAAW,QAAQ,WAAW,qBAAqB,MAAM,OAAO,SAAS,GAAG;AAC1E,gBAAM,MAAM,IAAI,KAAK,UAAU,EAAE,GAAG,MAAM,OAAO,CAAC;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAEA,UAAM,YAAY,oBAAI,IAA8B;AACpD,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK;AAC9B,UAAI,MAAM,MAAM,SAAS,EAAG;AAC5B,gBAAU,IAAI,KAAK,EAAE,WAAW,MAAM,WAAW,OAAO,MAAM,MAAM,CAAC;AAAA,IACvE;AACA,QAAI,UAAU,SAAS,EAAG,QAAO,cAAc;AAC/C,WAAO,WAAW,kBAAkB,EAAE,QAAQ,UAAU,CAAC;AAAA,EAC3D;AAAA;AAAA,EAGA,gBAAyC;AACvC,QAAI,KAAK,SAAU,QAAO,KAAK;AAC/B,UAAM,MAAsB,CAAC;AAC7B,eAAW,SAAS,KAAK,YAAY,KAAK,GAAG;AAC3C,YAAM,SAAS,KAAK,eAAe,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC;AACnD,YAAM,QAAQ,oBAAI,IAAoB;AACtC,iBAAW,CAAC,IAAI,KAAK,KAAK,OAAO,QAAQ;AACvC,mBAAW,CAAC,MAAM,IAAI,KAAK,MAAM,MAAO,OAAM,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,CAAC;AAAA,MACvF;AACA,UAAI,MAAM,OAAO,EAAG,KAAI,KAAK,EAAE,OAAO,MAAM,CAAC;AAAA,IAC/C;AAEA,QAAI,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,OAAO,EAAE,MAAM,IAAI;AAC9C,SAAK,WAAW;AAChB,WAAO;AAAA,EACT;AACF;AAYO,SAAS,kBACd,WAA+B,CAAC,GAChC,SACe;AACf,SAAO,IAAI,kBAAkB,UAAU,OAAO;AAChD;;;ACxXA,uBAA8B;AAC9B,sBAA8B;;;ACX9B,0BAAwB;AAgBxB,SAASC,gBAAe,SAA8B;AACpD,QAAM,MAAgB,CAAC;AACvB,aAAW,OAAO,QAAQ,UAAU;AAClC,QAAI,IAAI,SAAS,SAAU,YAAW,KAAK,IAAI,OAAQ,KAAI,KAAK,EAAE,KAAK;AAAA,EACzE;AACA,SAAO;AACT;AAGA,SAASC,YAAW,GAAsB,GAA+B;AACvE,MAAI,EAAE,WAAW,EAAE,OAAQ,QAAO;AAClC,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,EAAG,KAAI,EAAE,CAAC,MAAM,EAAE,CAAC,EAAG,QAAO;AAChE,SAAO;AACT;AAGA,SAAS,cAAc,KAAoC;AACzD,aAAW,MAAM,IAAI,QAAQ,OAAO,GAAG;AACrC,QAAI,OAAO,GAAG,SAAS,YAAY,GAAG,KAAK,SAAS,EAAG,QAAO;AAAA,EAChE;AACA,SAAO;AACT;AAGA,SAAS,YAAY,KAA2B;AAC9C,QAAM,MAAgB,CAAC;AACvB,QAAM,OAAO,oBAAI,IAAc;AAC/B,QAAM,QAAQ,CAAC,OAAuB;AACpC,QAAI,KAAK,IAAI,EAAE,EAAG;AAClB,SAAK,IAAI,EAAE;AACX,UAAM,IAAI,IAAI,MAAM,IAAI,EAAE;AAC1B,QAAI,CAAC,EAAG;AACR,QAAI,KAAK,CAAC;AACV,QAAI,EAAE,SAAS,aAAa,EAAE,SAAS,WAAY,YAAW,KAAK,EAAE,SAAU,OAAM,CAAC;AAAA,EACxF;AACA,QAAM,IAAI,IAAI;AACd,SAAO;AACT;AAGA,SAAS,iBAAiB,GAAe,GAAwB;AAC/D,MAAI,EAAE,SAAS,EAAE,KAAM,QAAO;AAC9B,MAAI,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,IAAK,QAAO,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE;AACtF,SAAO;AACT;AAGA,SAAS,WAAW,KAA6B;AAC/C,QAAM,MAAkB,CAAC;AACzB,QAAM,MAAM,IAAI,MAAM;AACtB,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK,GAAG;AAC/B,UAAM,KAAK;AACX,QAAI,IAAI,QAAQ,IAAI,EAAE,EAAG,KAAI,KAAK,EAAE;AAAA,EACtC;AACA,SAAO;AACT;AAKA,SAAS,cAAc,IAAgB,WAAiC;AACtE,QAAM,MAAM,GAAG,KAAK,MAAM,UAAU,OAAO,UAAU,GAAG,EAAE,KAAK;AAC/D,QAAM,WAAW,IAAI,QAAQ,SAAS,EAAE,EAAE,QAAQ,SAAS,EAAE;AAC7D,SAAO,SAAS,MAAM,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AACzD;AAGA,SAAS,YAAY,IAAiB,KAAiB,IAAgB,IAAwB;AAC7F,QAAM,UAAU,GAAG;AACnB,MAAI,QAAQ,cAAc,QAAQ,OAAQ,QAAO;AAEjD,QAAM,SAASD,gBAAe,OAAO;AACrC,QAAM,YAAY,QAAQ;AAE1B,MAAI,aAAa,UAAU,SAAS,GAAG,IAAI;AACzC,QAAIC,YAAW,cAAc,IAAI,SAAS,GAAG,MAAM,EAAG,QAAO;AAC7D,UAAM,UAAU,GAAG,KAAK,MAAM,UAAU,OAAO,UAAU,GAAG,EAAE,KAAK;AACnE,UAAM,QAAQ,QAAQ,WAAW,GAAG,IAAI,MAAM;AAC9C,OAAG,UAAU,UAAU,OAAO,UAAU,KAAK,GAAG,KAAK,GAAG,OAAO,KAAK,GAAG,CAAC,GAAG,KAAK,EAAE;AAClF,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAM,UAAU,IAAI,QAAQ,IAAI,GAAG,EAAE,GAAG;AACxC,MAAI,CAAC,WAAW,QAAQ,SAAS,GAAG,GAAI,QAAO;AAC/C,KAAG,WAAW,QAAQ,QAAQ,IAAI,GAAG,IAAI,QAAQ,WAAW,OAAO,KAAK,GAAG,CAAC,GAAG;AAC/E,SAAO;AACT;AAWA,SAAS,cAAc,KAAgC;AACrD,QAAM,KAAK,cAAc,GAAG;AAC5B,MAAI,CAAC,GAAI,QAAO;AAEhB,QAAM,KAAK,IAAI,oBAAAC,QAAY,GAAG,IAAI;AAElC,QAAM,OAAO,YAAY,GAAG;AAC5B,QAAM,YAA0B,CAAC;AACjC,aAAW,KAAK,KAAM,KAAI,EAAE,QAAQ,EAAE,KAAK,SAAS,GAAG,GAAI,WAAU,KAAK,EAAE,IAAI;AAIhF,QAAM,UAA2B,CAAC;AAClC,aAAW,MAAM,WAAW,GAAG,GAAG;AAChC,QAAI,IAAI,MAAM,IAAI,EAAE,EAAG;AACvB,UAAM,OAAO,IAAI,QAAQ,IAAI,EAAE;AAC/B,QAAI,CAAC,QAAQ,KAAK,KAAK,SAAS,GAAG,GAAI;AACvC,UAAM,YAAY,UAAU,KAAK,CAAC,MAAM,iBAAiB,KAAK,MAAM,CAAC,CAAC;AACtE,YAAQ,KAAK,EAAE,SAAS,MAAM,UAAU,CAAC;AAAA,EAC3C;AAIA,QAAM,eAAe,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI;AAClF,aAAW,KAAK,SAAS;AACvB,UAAM,IAAI,EAAE,QAAQ;AACpB,QAAI,aAAa,KAAK,CAAC,MAAM,MAAM,KAAK,iBAAiB,GAAG,CAAC,CAAC,EAAG;AAEjE,QAAI,EAAE,WAAW;AACf,YAAM,OAAO,EAAE,QAAQ;AACvB,YAAM,QAAQ,EAAE,QAAQ;AACxB,UAAI,QAAQ,KAAK,SAAS,GAAG,MAAM,KAAK,MAAM,KAAK,MAAO,IAAG,OAAO,KAAK,OAAO,KAAK,GAAG;AACxF,UAAI,SAAS,MAAM,SAAS,GAAG,MAAM,MAAM,MAAM,MAAM,MAAO,IAAG,OAAO,MAAM,OAAO,MAAM,GAAG;AAAA,IAChG,OAAO;AACL,SAAG,OAAO,EAAE,OAAO,EAAE,GAAG;AAAA,IAC1B;AAAA,EACF;AAGA,aAAW,KAAK,KAAM,KAAI,EAAE,SAAS,UAAW,aAAY,IAAI,KAAK,IAAI,CAAC;AAE1E,SAAO,GAAG,SAAS;AACrB;AAGO,SAAS,QAAQ,KAAyB;AAC/C,SAAO,cAAc,GAAG,KAAK;AAC/B;;;AC3JA,IAAAC,sBAA8B;;;ACPvB,IAAM,aAAkC,CAAC,MAAM;AAG/C,IAAM,UAAU;AA6ChB,SAAS,cAAc,IAAY,MAAuB;AAC/D,MAAI,YAAY,KAAK,EAAE,EAAG,QAAO;AACjC,QAAM,OAAO,KAAK,MAAM,GAAG,GAAG,EAAE,UAAU,EAAE,YAAY;AACxD,SAAO,KAAK,WAAW,gBAAgB,KAAK,KAAK,WAAW,OAAO,KAAK,KAAK,WAAW,GAAG;AAC7F;AAUO,IAAM,sBAA2C,oBAAI,IAAI;AAAA,EAC9D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,mBAAmB,KAAsB;AACvD,SAAO,oBAAoB,IAAI,GAAG;AACpC;AAOO,SAAS,gBAAgB,OAAmC;AACjE,aAAW,KAAK,OAAO;AACrB,UAAM,IAAI,EAAE,KAAK,YAAY;AAC7B,QAAI,MAAM,QAAQ,MAAM,kBAAmB,QAAO;AAClD,QAAI,EAAE,WAAW,IAAI,EAAG,QAAO;AAAA,EACjC;AACA,SAAO;AACT;AAGO,SAAS,gBAAgB,OAAmC;AACjE,aAAW,KAAK,MAAO,KAAI,OAAO,KAAK,EAAE,IAAI,EAAG,QAAO;AACvD,SAAO;AACT;AAKO,SAAS,KAAK,OAAe,KAAyB;AAC3D,SAAO,EAAE,MAAM,SAAS,OAAO,IAAI;AACrC;AAGO,SAAS,WAAW,KAAmF;AAC5G,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,IAAI,UAAU,SAAS,IAAI;AACpC;AAOO,SAAS,eAAe,KAAoC,QAAmC;AACpG,QAAM,WAAW,WAAW,GAAG;AAC/B,QAAM,KAAK,WAAW,OAAO;AAC7B,MAAI,CAAC,GAAI,QAAO;AAChB,QAAM,OAAO,OAAO,MAAM,GAAG,aAAa,GAAG,SAAS;AACtD,QAAM,KAAK,KAAK,QAAQ,GAAG;AAC3B,MAAI,OAAO,GAAI,QAAO;AACtB,MAAI,IAAI,KAAK;AACb,SAAO,IAAI,KAAK,UAAU,KAAK,KAAK,KAAK,CAAC,CAAE,EAAG,MAAK;AACpD,MAAI,KAAK,KAAK,OAAQ,QAAO;AAC7B,SAAO,KAAK,GAAG,cAAc,GAAG,GAAG,SAAS;AAC9C;;;AD3EA,IAAI,eAAoC;AAOxC,SAAS,aAA2B;AAClC,MAAI,aAAc,QAAO;AACzB,QAAM,UAAM,mCAAc,aAAe;AACzC,iBAAe,IAAI,QAAQ;AAC3B,SAAO;AACT;AAIO,SAAS,QAAQ,MAAc,KAAwC;AAC5E,QAAM,cAA4B,CAAC;AACnC,QAAM,MAAkB,eAAe,MAAM;AAC7C,QAAM,UAAU,IAAI;AAEpB,QAAM,SAAS,WAAW;AAC1B,QAAMC,YAAW,OAAO,MAAM,MAAM,EAAE,wBAAwB,KAAK,CAAC;AAEpE,QAAM,MAAqB,KAAK,SAAS,MAAM,IAAI,SAAS;AAC5D,QAAM,aAAyB;AAAA,IAC7B,IAAI;AAAA,IACJ,MAAM,IAAI;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV;AAAA,IACA,YAAY;AAAA,IACZ,QAAQA;AAAA,EACV;AACA,MAAI,QAAQ,IAAI,SAAS,UAAU;AAInC,QAAM,kBAAkB,CAAC,QAA2B,KAAa,WAA+B;AAC9F,QAAI,OAAO,WAAW,EAAG,QAAO,cAAc;AAC9C,UAAM,MAAM,IAAI,SAAS,QAAQ,EAAE,SAAS,QAAQ,SAAS,EAAE,SAAS,KAAK,WAAW,OAAO,EAAE,CAAC;AAClG,eAAW,KAAK,IAAI,UAAU;AAC5B,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,UAAU,EAAE;AAAA,QACZ,SAAS,EAAE;AAAA,QACX;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO,IAAI,WAAW,kBAAkB,IAAI,MAAM;AAAA,EACpD;AAEA,QAAM,cAAc,CAAC,QAA0B,IAAI,MAAM,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAI1F,QAAM,cAAc,CAAC,MAAc,UAAoB,QAA0B;AAC/E,UAAM,OAAO,KAAK;AAClB,QAAI,SAAS,SAAS;AACpB,YAAM,QAAQ,KAAK,SAAS;AAC5B,YAAM,KAAK,IAAI,MAAM,KAAK;AAC1B,YAAM,MAAM,KAAK,sBAAsB;AACvC,UAAI,MAAM;AAAA,QACR;AAAA,QACA,WAAW,IAAI,OAAO;AAAA,UACpB,QAAQ;AAAA,UACR,MAAM,MAAM,KAAK,IAAI,aAAa,IAAI,SAAS,IAAI;AAAA,UACnD,aAAa,QAAQ,KAAK,KAAK;AAAA,QACjC,CAAC;AAAA,MACH;AACA,UAAI,KAAK,EAAE;AACX;AAAA,IACF;AACA,QAAI,SAAS,YAAY;AACvB,YAAM,KAAK,IAAI,MAAM,KAAK;AAC1B,YAAM,MAAM,KAAK,sBAAsB;AACvC,UAAI,MAAM;AAAA,QACR;AAAA,QACA,cAAc,IAAI,KAAK,QAAQ,IAAI;AAAA,UACjC,QAAQ;AAAA,UACR,MAAM,MAAM,KAAK,IAAI,aAAa,IAAI,SAAS,IAAI;AAAA,QACrD,CAAC;AAAA,MACH;AACA,UAAI,KAAK,EAAE;AACX;AAAA,IACF;AACA,QAAI,SAAS,gBAAiB;AAC9B,QAAI,KAAK,WAAW,GAAG,GAAG;AAExB,iBAAW,KAAK,KAAK,cAAc,CAAC,EAAG,aAAY,GAAG,UAAU,GAAG;AACnE;AAAA,IACF;AACA,QAAI,KAAK,aAAa,MAAM,QAAQ,CAAC;AAAA,EACvC;AAIA,QAAM,eAAe,CAAC,MAAc,aAAiC;AACnE,UAAM,KAAK,IAAI,MAAM,KAAK;AAC1B,UAAM,OAAO,KAAK,WAAW,KAAK,UAAU,YAAY;AACxD,UAAM,MAAyB,KAAK,sBAAsB;AAC1D,UAAM,WAA8B,KAAK,SAAS,CAAC;AAEnD,UAAM,gBAAgB,mBAAmB,GAAG;AAC5C,UAAM,YAAY,OAAO;AACzB,UAAMC,UAAS,iBAAiB,aAAa,gBAAgB,QAAQ;AAErE,UAAM,OAAiB,YAAY;AACnC,SAAK,mBAAmB,gBAAgB,QAAQ;AAGhD,SAAK,cAAcA,UAAS,IAAI;AAIhC,QAAI,UAAqB,eAAe;AACxC,QAAI,cAAwB,CAAC;AAC7B,UAAM,UAAU,oBAAI,IAAuB;AAC3C,UAAM,QAAkB,CAAC;AAEzB,eAAW,KAAK,UAAU;AACxB,UAAI,EAAE,KAAK,YAAY,MAAM,SAAS;AACpC,sBAAc,YAAY,EAAE,KAAK;AACjC,cAAM,YAAY,eAAe,KAAK,IAAI;AAC1C,cAAM,SAAS,WAAW,GAAG,IAAI,OAAO;AACxC,cAAM,MAAoB;AAAA,UACxB,MAAM;AAAA,UACN,MAAM,aAAa;AAAA,UACnB,QAAQ,YAAY,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE;AAAA,QAChD;AACA,kBAAU;AAAA,UACR,MAAM;AAAA,UACN,UAAU,CAAC,GAAG;AAAA,UACd;AAAA,UACA,UAAU,SAAS,KAAK,OAAO,aAAa,OAAO,SAAS,IAAI;AAAA,UAChE,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,YAAY,aAAa;AAAA,QAC3B;AACA;AAAA,MACF;AACA,YAAM,IAAI,EAAE;AACZ,cAAQ,IAAI,EAAE,MAAM,EAAE,MAAM,UAAU,OAAO,MAAM,KAAK,OAAO,EAAE,CAAC;AAClE,YAAM,KAAK,EAAE,IAAI;AAAA,IACnB;AAEA,UAAM,QAAiB,EAAE,SAAS,SAAS,CAAC,GAAG,MAAM;AACrD,UAAMC,YAAW,gBAAgB,aAAa,KAAK,EAAE;AAGrD,UAAM,WAAuB,CAAC;AAC9B,QAAI,CAAC,eAAe;AAClB,iBAAW,KAAK,KAAK,cAAc,CAAC,EAAG,aAAY,GAAG,IAAI,QAAQ;AAAA,IACpE;AAEA,UAAM,KAAgB,cAAc,IAAI;AAAA,MACtC;AAAA,MACA,WAAW;AAAA,MACX,aAAa;AAAA,MACb,aAAa,MAAM,IAAI,UAAU,OAAO;AAAA,MACxC;AAAA,MACA,UAAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,MAAM,MAAM,KAAK,IAAI,aAAa,IAAI,SAAS,IAAI;AAAA,MACnD;AAAA,IACF,CAAC;AACD,QAAI,MAAM,IAAI,IAAI,EAAE;AAIpB,QAAI,KAAK;AACP,cAAQ,IAAI,IAAI;AAAA,QACd,QAAQ;AAAA,QACR,MAAM,KAAK,IAAI,aAAa,IAAI,SAAS;AAAA,QACzC,aAAa,IAAI,WAAW,KAAK,IAAI,SAAS,aAAa,IAAI,SAAS,SAAS,IAAI;AAAA,QACrF,cAAc,IAAI,SAAS,KAAK,IAAI,OAAO,aAAa,IAAI,OAAO,SAAS,IAAI;AAAA,QAChF,WAAW;AAAA,QACX,aAAa,IAAI,UAAU;AAAA,MAC7B,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAIA,QAAM,WAAW,IAAI,MAAM,IAAI,IAAI,IAAI;AACvC,cAAYF,WAAU,IAAI,MAAM,SAAS,QAAQ;AAEjD,SAAO,EAAE,KAAK,YAAY;AAC5B;;;AEhOO,IAAM,eAAyB;AAAA,EACpC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS,IAAY,MAAuB;AAC1C,WAAO,cAAc,IAAI,IAAI;AAAA,EAC/B;AAAA,EACA,MAAM,MAAc,KAAwC;AAC1D,WAAO,QAAQ,MAAM,GAAG;AAAA,EAC1B;AACF;AAGO,SAAS,qBAA+B;AAC7C,SAAO;AACT;AAGO,IAAM,cAAuB;AAAA,EAClC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM,KAAiB,OAAiB,MAAqC;AAC3E,WAAO,EAAE,MAAM,QAAQ,GAAG,GAAG,KAAK,MAAM,OAAO,CAAC,GAAG,aAAa,CAAC,EAAE;AAAA,EACrE;AACF;AAGO,SAAS,oBAA6B;AAC3C,SAAO;AACT;;;ACpDA,sBAA0B;AAkBnB,IAAM,WACX,OAAO,gBAAAG,YAAkB,aACrB,gBAAAA,UACC,gBAAAA,QAA+D;AAI/D,IAAM,YAAiC,CAAC,OAAO,KAAK;AAGpD,IAAMC,WAAU;AAYhB,SAAS,QAAQ,MAAuB;AAC7C,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,KAAK;AAAA,IACd,KAAK;AACH,aAAO,GAAG,QAAQ,KAAK,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI;AAAA,IACtD,KAAK;AACH,aAAO,GAAG,KAAK,UAAU,IAAI,IAAI,KAAK,KAAK,IAAI;AAAA,EACnD;AACF;AAGO,SAAS,gBAAgB,MAAwB;AACtD,MAAI,KAAK,SAAS,sBAAuB,QAAO;AAChD,MAAI,KAAK,SAAS,oBAAqB,QAAO;AAC9C,SAAO,SAAS,KAAK,KAAK,IAAI;AAChC;AAEO,SAAS,SAAS,MAAoC;AAC3D,SAAO,KAAK,SAAS,sBACjB,GAAG,KAAK,UAAU,IAAI,IAAI,KAAK,KAAK,IAAI,KACxC,KAAK;AACX;AAEO,SAAS,SAAS,MAA2B;AAClD,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAGO,SAAS,YAAY,MAAgC;AAC1D,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAaO,SAAS,mBAAmB,MAA+C;AAChF,QAAM,MAAoC,CAAC;AAC3C,QAAM,OAAO,oBAAI,IAAe;AAEhC,QAAM,QAAQ,CAAC,MAA0C;AACvD,QAAI,CAAC,KAAK,KAAK,IAAI,CAAC,EAAG;AACvB,SAAK,IAAI,CAAC;AACV,YAAQ,EAAE,MAAM;AAAA,MACd,KAAK;AAAA,MACL,KAAK;AACH,YAAI,KAAK,CAAC;AACV;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,cAAM,EAAE,UAAU;AAClB;AAAA,MACF,KAAK;AACH,cAAM,EAAE,IAAI;AACZ,cAAM,EAAE,KAAK;AACb;AAAA,MACF,KAAK;AACH,cAAM,EAAE,UAAU;AAClB,cAAM,EAAE,SAAS;AACjB;AAAA,MACF,KAAK;AACH,mBAAW,KAAK,EAAE,YAAa,OAAM,CAAC;AACtC;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAGH,mBAAW,KAAK,EAAE,UAAW,OAAM,CAAc;AACjD;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,cAAM,EAAE,IAAI;AACZ;AAAA,MACF,KAAK;AACH,mBAAW,KAAK,EAAE,KAAM,OAAM,CAAC;AAC/B;AAAA,MACF,KAAK;AACH,cAAM,EAAE,QAAQ;AAChB;AAAA,MACF,KAAK;AACH,cAAM,EAAE,UAAU;AAClB,cAAM,EAAE,SAAS;AACjB;AAAA,MACF,KAAK;AACH,mBAAW,MAAM,EAAE,SAAU,OAAM,EAAe;AAClD;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,IAAI;AACV,SAAO;AACT;AAEO,SAAS,aAAa,IAAY,MAAuB;AAC9D,MAAI,aAAa,KAAK,EAAE,EAAG,QAAO;AAClC,SAAO,yBAAyB,KAAK,IAAI;AAC3C;;;ACzKA,oBAAoC;AAwD7B,SAASC,SAAQ,MAAc,KAAwC;AAC5E,QAAM,cAA4B,CAAC;AACnC,QAAM,MAAkB,eAAe,KAAK;AAC5C,QAAM,UAAU,IAAI;AAEpB,QAAM,UAAM,cAAAC,OAAW,MAAM;AAAA,IAC3B,YAAY;AAAA,IACZ,SAAS,CAAC,OAAO,YAAY;AAAA,EAC/B,CAAC;AAED,QAAM,MAAqB,KAAK,SAAS,MAAM,IAAI,SAAS;AAC5D,QAAM,aAAyB;AAAA,IAC7B,IAAIC;AAAA,IACJ,MAAM,IAAI;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV;AAAA,IACA,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AACA,MAAI,QAAQ,IAAIA,UAAS,UAAU;AAInC,QAAM,SAAS,CAAC,SAAuC;AACrD,QAAI,KAAK,SAAS,QAAQ,KAAK,OAAO,KAAM,QAAO;AACnD,UAAMC,QAAmB;AAAA,MACvB,MAAMD;AAAA,MACN,OAAO,KAAK;AAAA,MACZ,KAAK,KAAK;AAAA,MACV,UAAU,KAAK,MACX,EAAE,MAAM,KAAK,IAAI,MAAM,MAAM,QAAQ,KAAK,IAAI,MAAM,OAAO,IAC3D;AAAA,MACJ,QAAQ,KAAK,MAAM,EAAE,MAAM,KAAK,IAAI,IAAI,MAAM,QAAQ,KAAK,IAAI,IAAI,OAAO,IAAI;AAAA,IAChF;AACA,WAAOC;AAAA,EACT;AAEA,QAAM,UAAU,CAAC,SACf,KAAK,SAAS,QAAQ,KAAK,OAAO,OAAO,KAAK,KAAK,MAAM,KAAK,OAAO,KAAK,GAAG;AAG/E,QAAM,aAAa,CAAC,MAAuC,WAA6B;AACtF,UAAM,UAAuB,EAAE,MAAM,QAAQ,IAAI,GAAG,OAAO;AAC3D,WAAO,IAAI,MAAM,OAAO;AAAA,MACtB,MAAM,OAAO,IAAI,KAAK,EAAE,MAAMD,UAAS,OAAO,GAAG,KAAK,EAAE;AAAA,MACxD,MAAM,SAAS,IAAI;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AAIA,QAAM,cAAc,CAAC,QACnB,IACG,MAAM,KAAK,EACX,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAC1B,IAAI,CAAC,WAAW,EAAE,MAAM,EAAgB;AAE7C,QAAM,iBAAiB,CAAC,SAAkC;AACxD,UAAM,WAAW,OAAO,IAAI,KAAK;AACjC,UAAM,IAAI,KAAK;AAEf,UAAM,aAAa,CAAC,QAAsB,cAA4C;AACpF,YAAM,MAAoB,EAAE,MAAM,UAAU,MAAM,aAAa,QAAW,OAAO;AACjF,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU,CAAC,GAAG;AAAA,QACd;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,YAAY;AAAA,MACd;AAAA,IACF;AAEA,QAAI,KAAK,KAAM,QAAO,WAAW,CAAC,GAAG,IAAI;AAEzC,QAAI,EAAE,SAAS,iBAAiB;AAC9B,aAAO,WAAW,YAAY,EAAE,KAAK,GAAG,OAAO,CAAC,CAAC;AAAA,IACnD;AAEA,QAAI,EAAE,SAAS,0BAA0B;AACvC,YAAM,OAAO,EAAE;AAEf,UAAI,KAAK,SAAS,iBAAiB;AACjC,eAAO,WAAW,YAAY,KAAK,KAAK,GAAG,OAAO,IAAI,CAAC;AAAA,MACzD;AACA,UAAI,KAAK,SAAS,qBAAsB,QAAO,WAAW,CAAC,GAAG,IAAI;AAClE,YAAM,MAAM,WAAW,MAAM,KAAK;AAClC,YAAM,YAAY,OAAO,IAAI;AAC7B,YAAM,MAAoB,EAAE,MAAM,WAAW,MAAM,aAAa,QAAW,MAAM,IAAI;AACrF,aAAO;AAAA,QACL,MAAM,YAAY,IAAI;AAAA,QACtB,UAAU,CAAC,GAAG;AAAA,QACd;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,YAAY;AAAA,MACd;AAAA,IACF;AAEA,WAAO,eAAe;AAAA,EACxB;AAEA,QAAME,kBAAiB,CAAC,YAAiC;AACvD,UAAM,MAAgB,CAAC;AACvB,eAAW,OAAO,QAAQ,UAAU;AAClC,UAAI,IAAI,SAAS,SAAU,YAAW,KAAK,IAAI,OAAQ,KAAI,KAAK,EAAE,KAAK;AAAA,IACzE;AACA,WAAO;AAAA,EACT;AAIA,QAAM,iBAAiB,CAAC,SAAkC;AACxD,UAAM,IAAI,KAAK;AACf,QAAI,KAAK,KAAM,QAAO,EAAE,MAAM,UAAU,OAAO,MAAM,MAAM,OAAO,IAAI,KAAK,OAAU;AACrF,QAAI,EAAE,SAAS,iBAAiB;AAC9B,aAAO,EAAE,MAAM,UAAU,OAAO,EAAE,OAAO,MAAM,OAAO,CAAC,KAAK,OAAU;AAAA,IACxE;AACA,QAAI,EAAE,SAAS,0BAA0B;AACvC,UAAI,EAAE,WAAW,SAAS,sBAAsB;AAC9C,eAAO,EAAE,MAAM,UAAU,OAAO,MAAM,MAAM,OAAO,CAAC,KAAK,OAAU;AAAA,MACrE;AACA,aAAO,EAAE,MAAM,WAAW,MAAM,WAAW,EAAE,YAAY,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,OAAU;AAAA,IAChG;AAEA,WAAO,EAAE,MAAM,WAAW,MAAM,WAAW,GAAiB,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,OAAU;AAAA,EACnG;AAIA,QAAM,kBAAkB,CAAC,KAA+B,aACtD,IAAI,SAAS,gBAAgB,cAAc,KAAK,QAAQ,IAAI,aAAa,KAAK,QAAQ;AAGxF,QAAM,cAAc,CAClB,MACA,UACA,QACS;AACT,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK,WAAW;AACd,cAAM,KAAK,IAAI,MAAM,KAAK;AAC1B,YAAI,MAAM;AAAA,UACR;AAAA,UACA,WAAW,IAAI,KAAK,OAAO;AAAA,YACzB,QAAQ;AAAA,YACR,MAAM,OAAO,IAAI;AAAA,YACjB,aAAa,QAAQ,KAAK,KAAK,KAAK;AAAA,UACtC,CAAC;AAAA,QACH;AACA,YAAI,KAAK,EAAE;AACX;AAAA,MACF;AAAA,MACA,KAAK,0BAA0B;AAC7B,cAAM,OAAO,KAAK;AAClB,YAAI,KAAK,SAAS,qBAAsB;AAGxC,YAAI,KAAK,SAAS,gBAAgB,KAAK,SAAS,eAAe;AAC7D,cAAI,KAAK,gBAAgB,MAAM,QAAQ,CAAC;AACxC;AAAA,QACF;AAGA,cAAM,KAAK,IAAI,MAAM,KAAK;AAC1B,cAAM,MAAM,WAAW,MAAM,KAAK;AAClC,YAAI,MAAM,IAAI,IAAI,WAAW,IAAI,KAAK,EAAE,QAAQ,UAAU,MAAM,OAAO,IAAI,EAAE,CAAC,CAAC;AAC/E,YAAI,KAAK,EAAE;AAIX,mBAAW,OAAO,mBAAmB,IAAI,EAAG,KAAI,KAAK,gBAAgB,KAAK,QAAQ,CAAC;AACnF;AAAA,MACF;AAAA,MACA,KAAK,kBAAkB;AACrB,cAAM,KAAK,IAAI,MAAM,KAAK;AAC1B,cAAM,MAAM,WAAW,KAAK,YAAY,IAAI;AAC5C,YAAI,MAAM,IAAI,IAAI,WAAW,IAAI,KAAK,EAAE,QAAQ,UAAU,MAAM,OAAO,IAAI,EAAE,CAAC,CAAC;AAC/E,YAAI,KAAK,EAAE;AACX,mBAAW,OAAO,mBAAmB,KAAK,UAAU,GAAG;AACrD,cAAI,KAAK,gBAAgB,KAAK,QAAQ,CAAC;AAAA,QACzC;AACA;AAAA,MACF;AAAA,MACA,KAAK;AACH,YAAI,KAAK,aAAa,MAAM,QAAQ,CAAC;AACrC;AAAA,MACF,KAAK;AACH,YAAI,KAAK,cAAc,MAAM,QAAQ,CAAC;AACtC;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,MAAmB,aAAiC;AACzE,UAAM,KAAK,IAAI,MAAM,KAAK;AAC1B,UAAM,WAAuB,CAAC;AAC9B,eAAW,KAAK,KAAK,SAAU,aAAY,GAAG,IAAI,QAAQ;AAC1D,QAAI,MAAM,IAAI,IAAI,eAAe,IAAI,EAAE,UAAU,QAAQ,UAAU,MAAM,OAAO,IAAI,EAAE,CAAC,CAAC;AACxF,YAAQ,IAAI,IAAI;AAAA,MACd,QAAQ;AAAA,MACR,MAAM,OAAO,IAAI,KAAK,EAAE,MAAMF,UAAS,OAAO,GAAG,KAAK,EAAE;AAAA,MACxD,aAAa,OAAO,KAAK,eAAe;AAAA,MACxC,cAAc,OAAO,KAAK,eAAe;AAAA,MACzC,WAAW;AAAA,MACX,aAAa;AAAA,IACf,CAAC;AACD,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,CAAC,MAAkB,aAAiC;AACvE,UAAM,KAAK,IAAI,MAAM,KAAK;AAC1B,UAAM,UAA6B,KAAK;AACxC,UAAM,MAAM,QAAQ,QAAQ,IAAI;AAChC,UAAM,YAAY,gBAAgB,QAAQ,IAAI;AAE9C,UAAM,OAAiB,YAAY;AACnC,SAAK,cAAc;AAEnB,QAAI,UAAqB,eAAe;AACxC,UAAM,UAAU,oBAAI,IAAuB;AAC3C,UAAM,QAAkB,CAAC;AACzB,UAAM,UAAqB,CAAC;AAE5B,eAAW,QAAQ,QAAQ,YAAY;AACrC,UAAI,KAAK,SAAS,sBAAsB;AACtC,gBAAQ,KAAK,WAAW,KAAK,UAAU,IAAI,CAAC;AAC5C,aAAK,iBAAiB;AACtB;AAAA,MACF;AACA,YAAM,OAAO,SAAS,KAAK,IAAI;AAC/B,UAAI,SAAS,eAAe,SAAS,SAAS;AAC5C,kBAAU,eAAe,IAAI;AAC7B;AAAA,MACF;AACA,UAAI,SAAS,MAAO,MAAK,SAAS;AAAA,eACzB,SAAS,MAAO,MAAK,SAAS;AAAA,eAC9B,SAAS,0BAA2B,MAAK,mBAAmB;AAAA,eAC5D,WAAW,KAAK,IAAI,EAAG,MAAK,mBAAmB;AACxD,cAAQ,IAAI,MAAM,eAAe,IAAI,CAAC;AACtC,YAAM,KAAK,IAAI;AAAA,IACjB;AAEA,UAAM,QAAiB,EAAE,SAAS,SAAS,MAAM;AAEjD,UAAM,WAAuB,CAAC;AAC9B,eAAW,KAAK,KAAK,SAAU,aAAY,GAAG,IAAI,QAAQ;AAC1D,eAAW,OAAO,UAAU;AAC1B,YAAM,KAAK,IAAI,MAAM,IAAI,GAAG;AAC5B,UAAI,MAAM,GAAG,SAAS,QAAQ;AAC5B,aAAK,qBAAqB;AAC1B;AAAA,MACF;AAAA,IACF;AAGA,QAAIG,YAAqB,cAAc;AACvC,QAAI,CAAC,QAAQ,YAAY;AACvB,YAAM,SAASD,gBAAe,OAAO;AACrC,UAAI,OAAO,SAAS,GAAG;AACrB,cAAM,MAAM,IAAI,SAAS,QAAQ;AAAA,UAC/B,SAAS;AAAA,UACT,SAAS,EAAE,SAAS,KAAK,WAAW,YAAY,SAAY,OAAO;AAAA,QACrE,CAAC;AACD,QAAAC,YAAW,IAAI,WAAW,kBAAkB,IAAI,MAAM;AACtD,mBAAW,KAAK,IAAI,UAAU;AAC5B,sBAAY,KAAK;AAAA,YACf,MAAM;AAAA,YACN,UAAU,EAAE;AAAA,YACZ,SAAS,EAAE;AAAA,YACX,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,UAAM,YAAyB,YAAY,cAAc;AACzD,UAAM,KAAgB,cAAc,IAAI;AAAA,MACtC;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,aAAa,QAAQ;AAAA,MACrB;AAAA,MACA,UAAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,MAAM,OAAO,IAAI;AAAA,MACjB;AAAA,IACF,CAAC;AACD,QAAI,MAAM,IAAI,IAAI,EAAE;AAEpB,UAAM,QACJ,SAAS,SAAS,IACd,OAAO,KAAK,SAAS,CAAC,CAAe,KAAK,OAAO,KAAK,SAAS,GAAG,EAAE,CAAe,IACjF;AAAA,MACE,MAAMH;AAAA,MACN,OAAO,OAAO,KAAK,SAAS,CAAC,CAAe,EAAG;AAAA,MAC/C,KAAK,OAAO,KAAK,SAAS,GAAG,EAAE,CAAe,EAAG;AAAA,IACnD,IACA,OACF;AACN,YAAQ,IAAI,IAAI;AAAA,MACd,QAAQ;AAAA,MACR,MAAM,OAAO,IAAI,KAAK,EAAE,MAAMA,UAAS,OAAO,GAAG,KAAK,EAAE;AAAA,MACxD,aAAa,OAAO,OAAO;AAAA,MAC3B,cAAc,KAAK,iBAAiB,OAAO,KAAK,cAAc,IAAI;AAAA,MAClE,WAAW;AAAA,MACX,aAAa,QAAQ;AAAA,IACvB,CAAC;AACD,WAAO;AAAA,EACT;AAIA,QAAM,QAAsC,CAAC;AAC7C,WAAS,KAAK;AAAA,IACZ,WAAWI,OAA4B;AACrC,YAAM,KAAKA,MAAK,IAAI;AACpB,MAAAA,MAAK,KAAK;AAAA,IACZ;AAAA,IACA,YAAYA,OAA6B;AACvC,YAAM,KAAKA,MAAK,IAAI;AACpB,MAAAA,MAAK,KAAK;AAAA,IACZ;AAAA,EACF,CAAC;AAED,QAAM,WAAW,IAAI,MAAM,IAAI,IAAI,IAAI;AACvC,aAAW,KAAK,OAAO;AACrB,UAAM,KAAK,EAAE,SAAS,gBAAgB,cAAc,GAAG,IAAI,IAAI,IAAI,aAAa,GAAG,IAAI,IAAI;AAC3F,aAAS,SAAS,KAAK,EAAE;AAAA,EAC3B;AAEA,SAAO,EAAE,KAAK,YAAY;AAC5B;;;ACnYO,IAAM,cAAwB;AAAA,EACnC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS,IAAY,MAAuB;AAC1C,WAAO,aAAa,IAAI,IAAI;AAAA,EAC9B;AAAA,EACA,MAAM,MAAc,KAAwC;AAC1D,WAAOC,SAAQ,MAAM,GAAG;AAAA,EAC1B;AACF;AAGO,SAAS,oBAA8B;AAC5C,SAAO;AACT;;;ACnBA,IAAAC,uBAAwB;AAoBxB,IAAMC,aAAiC,CAAC,OAAO,KAAK;AAUpD,SAAS,SAAS,KAAiB,KAA2B;AAC5D,QAAM,MAAM,IAAI,MAAM,IAAI,GAAG;AAC7B,QAAM,UAAU,KAAK;AACrB,MAAI,WAAW,OAAO,QAAQ,SAAS,UAAU;AAC/C,WAAO,EAAE,MAAM,QAAQ,MAAM,QAAQ,QAAQ,WAAW,KAAK;AAAA,EAC/D;AACA,MAAI,KAAK;AACP,UAAM,KAAK,IAAI,QAAQ,IAAI,IAAI,KAAK,IAAI;AACxC,QAAI,GAAI,QAAO,EAAE,MAAM,GAAG,KAAK,MAAM,IAAI,KAAK,OAAO,IAAI,KAAK,GAAG,GAAG,QAAQ,MAAM;AAAA,EACpF;AACA,SAAO,EAAE,MAAM,IAAI,QAAQ,MAAM;AACnC;AAGA,SAASC,gBAAe,SAA8B;AACpD,QAAM,MAAgB,CAAC;AACvB,aAAW,OAAO,QAAQ,UAAU;AAClC,QAAI,IAAI,SAAS,SAAU,YAAW,KAAK,IAAI,OAAQ,KAAI,KAAK,EAAE,KAAK;AAAA,EACzE;AACA,SAAO;AACT;AAKA,SAASC,eAAc,KAAoC;AACzD,aAAW,MAAM,IAAI,QAAQ,OAAO,GAAG;AACrC,QAAI,OAAO,GAAG,SAAS,YAAY,GAAG,KAAK,SAAS,EAAG,QAAO;AAAA,EAChE;AACA,SAAO;AACT;AAGA,SAASC,aAAY,KAA2B;AAC9C,QAAM,MAAgB,CAAC;AACvB,QAAM,OAAO,oBAAI,IAAc;AAC/B,QAAM,QAAQ,CAAC,OAAuB;AACpC,QAAI,KAAK,IAAI,EAAE,EAAG;AAClB,SAAK,IAAI,EAAE;AACX,UAAM,IAAI,IAAI,MAAM,IAAI,EAAE;AAC1B,QAAI,CAAC,EAAG;AACR,QAAI,KAAK,CAAC;AACV,QAAI,EAAE,SAAS,aAAa,EAAE,SAAS,WAAY,YAAW,KAAK,EAAE,SAAU,OAAM,CAAC;AAAA,EACxF;AACA,QAAM,IAAI,IAAI;AACd,SAAO;AACT;AAGA,SAASC,kBAAiB,GAAe,GAAwB;AAC/D,MAAI,EAAE,SAAS,EAAE,KAAM,QAAO;AAC9B,MAAI,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,IAAK,QAAO,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE;AACtF,SAAO;AACT;AAWA,SAASC,aAAY,IAAiB,KAAiB,IAAgB,IAAwB;AAC7F,QAAM,UAAU,GAAG;AAEnB,MAAI,QAAQ,cAAc,QAAQ,OAAQ,QAAO;AAEjD,QAAM,SAASJ,gBAAe,OAAO;AACrC,QAAM,YAAY,QAAQ;AAE1B,MAAI,aAAa,UAAU,SAAS,GAAG,IAAI;AACzC,UAAM,UAAU,GAAG,KAAK,MAAM,UAAU,OAAO,UAAU,GAAG;AAE5D,UAAM,QAAQ,QAAQ,WAAW,GAAG,IAAI,MAAM;AAC9C,UAAM,OAAO,GAAG,KAAK,GAAG,OAAO,KAAK,GAAG,CAAC,GAAG,KAAK;AAChD,QAAI,YAAY,MAAM;AACpB,SAAG,UAAU,UAAU,OAAO,UAAU,KAAK,IAAI;AACjD,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,MAAI,GAAG,YAAa,QAAO;AAC3B,QAAM,OAAO,IAAI,QAAQ,IAAI,GAAG,EAAE;AAClC,QAAM,UAAU,MAAM;AACtB,MAAI,CAAC,WAAW,QAAQ,SAAS,GAAG,GAAI,QAAO;AAE/C,QAAM,WAAW,QAAQ,QAAQ,IAAI,GAAG,IAAI;AAC5C,KAAG,WAAW,UAAU,eAAe,OAAO,KAAK,GAAG,CAAC,GAAG;AAC1D,SAAO;AACT;AAQA,SAAS,eAAe,SAAgC;AACtD,QAAM,IAAI,mBAAmB,KAAK,OAAO;AACzC,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE;AAChC,MAAI,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE;AACvB,QAAM,KAAK,QAAQ,CAAC;AACpB,MAAI,OAAO,KAAK;AACd,QAAI,QAAQ;AACZ,WAAO,IAAI,QAAQ,QAAQ,KAAK,GAAG;AACjC,YAAM,IAAI,QAAQ,CAAC;AACnB,UAAI,MAAM,IAAK,UAAS;AAAA,eACf,MAAM,KAAK;AAClB,iBAAS;AACT,YAAI,UAAU,GAAG;AACf,eAAK;AACL;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,WAAW,OAAO,OAAO,OAAO,KAAK;AACnC,UAAM,IAAI;AACV,SAAK;AACL,WAAO,IAAI,QAAQ,QAAQ,KAAK,GAAG;AACjC,UAAI,QAAQ,CAAC,MAAM,GAAG;AACpB,aAAK;AACL;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AACL,WAAO,IAAI,QAAQ,QAAQ,KAAK,GAAG;AACjC,UAAI,SAAS,KAAK,QAAQ,CAAC,CAAE,EAAG;AAAA,IAClC;AAAA,EACF;AACA,SAAO,QAAQ,MAAM,UAAU,CAAC;AAClC;AASA,SAAS,oBACP,IACA,KACA,IACA,QACA,MACM;AACN,QAAM,OAAO,OAAO;AACpB,MAAI,CAAC,QAAQ,KAAK,SAAS,GAAG,GAAI;AAClC,QAAM,UAAU,eAAe,GAAG,KAAK,MAAM,KAAK,OAAO,KAAK,GAAG,CAAC;AAClE,MAAI,CAAC,QAAS;AAEd,QAAM,SAAsB,CAAC;AAC7B,aAAW,KAAK,MAAM;AACpB,QAAI,EAAE,SAAS,aAAa,CAAC,EAAE,QAAQ,EAAE,KAAK,SAAS,GAAG,GAAI;AAC9D,QAAIG,kBAAiB,OAAO,MAAM,EAAE,IAAI,EAAG,QAAO,KAAK,CAAC;AAAA,EAC1D;AAEA,QAAM,UAAU,OAAO;AAAA,IACrB,CAAC,MAAM,CAAC,OAAO,KAAK,CAAC,MAAM,MAAM,KAAK,EAAE,QAAQ,EAAE,QAAQA,kBAAiB,EAAE,MAAM,EAAE,IAAI,CAAC;AAAA,EAC5F;AACA,MAAI,QAAQ,WAAW,EAAG;AAE1B,QAAM,QAAQ,QAAQ,CAAC;AACvB,QAAM,YAAY,IAAI,QAAQ,IAAI,MAAM,EAAE,GAAG;AAC7C,MAAI,CAAC,aAAa,UAAU,SAAS,GAAG,GAAI;AAC5C,MAAI,eAAe,GAAG,KAAK,MAAM,UAAU,OAAO,UAAU,GAAG,CAAC,EAAG;AAGnE,KAAG,WAAW,UAAU,QAAQ,IAAI,MAAM,IAAI,QAAQ,IAAI,OAAO,EAAE;AACrE;AAGA,SAASE,eAAc,KAAgC;AACrD,QAAM,KAAKJ,eAAc,GAAG;AAC5B,MAAI,CAAC,GAAI,QAAO;AAEhB,QAAM,KAAK,IAAI,qBAAAK,QAAY,GAAG,IAAI;AAElC,QAAM,OAAOJ,aAAY,GAAG;AAC5B,QAAM,YAA0B,CAAC;AACjC,aAAW,KAAK,KAAM,KAAI,EAAE,QAAQ,EAAE,KAAK,SAAS,GAAG,GAAI,WAAU,KAAK,EAAE,IAAI;AAKhF,QAAM,UAA2B,CAAC;AAClC,aAAW,MAAMK,YAAW,GAAG,GAAG;AAChC,QAAI,IAAI,MAAM,IAAI,EAAE,EAAG;AACvB,UAAM,OAAO,IAAI,QAAQ,IAAI,EAAE;AAC/B,QAAI,CAAC,QAAQ,KAAK,KAAK,SAAS,GAAG,GAAI;AACvC,UAAM,YAAY,UAAU,KAAK,CAAC,MAAMJ,kBAAiB,KAAK,MAAM,CAAC,CAAC;AACtE,YAAQ,KAAK,EAAE,SAAS,MAAM,UAAU,CAAC;AAAA,EAC3C;AAIA,QAAM,eAAe,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI;AAClF,aAAW,KAAK,SAAS;AACvB,UAAMK,QAAO,EAAE,QAAQ;AACvB,UAAM,gBAAgB,aAAa,KAAK,CAAC,MAAM,MAAMA,SAAQL,kBAAiB,GAAGK,KAAI,CAAC;AACtF,QAAI,cAAe;AAEnB,QAAI,EAAE,WAAW;AAEf,0BAAoB,IAAI,KAAK,IAAI,EAAE,SAAS,IAAI;AAEhD,YAAM,OAAO,EAAE,QAAQ;AACvB,YAAM,QAAQ,EAAE,QAAQ;AACxB,UAAI,QAAQ,KAAK,SAAS,GAAG,MAAM,KAAK,MAAM,KAAK,MAAO,IAAG,OAAO,KAAK,OAAO,KAAK,GAAG;AACxF,UAAI,SAAS,MAAM,SAAS,GAAG,MAAM,MAAM,MAAM,MAAM,OAAO;AAC5D,WAAG,OAAO,MAAM,OAAO,MAAM,GAAG;AAAA,MAClC;AAAA,IACF,OAAO;AACL,SAAG,OAAOA,MAAK,OAAOA,MAAK,GAAG;AAAA,IAChC;AAAA,EACF;AAGA,aAAW,KAAK,MAAM;AACpB,QAAI,EAAE,SAAS,UAAW,CAAAJ,aAAY,IAAI,KAAK,IAAI,CAAC;AAAA,EACtD;AAEA,SAAO,GAAG,SAAS;AACrB;AAGA,SAASG,YAAW,KAA6B;AAM/C,QAAM,MAAkB,CAAC;AACzB,QAAM,MAAM,IAAI,MAAM;AACtB,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK,GAAG;AAC/B,UAAM,KAAK;AACX,QAAI,IAAI,QAAQ,IAAI,EAAE,EAAG,KAAI,KAAK,EAAE;AAAA,EACtC;AACA,SAAO;AACT;AAKA,SAAS,UAAU,KAAiB,SAAmC;AACrE,MAAI,QAAQ,SAAS,YAAY,QAAQ,SAAS,WAAW,EAAG,QAAO;AAEvE,QAAM,UAAU,QAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS;AACjE,MAAI,WAAW,QAAQ,SAAS,WAAW;AACzC,WAAO,cAAc,SAAS,KAAK,QAAQ,IAAI,EAAE,IAAI;AAAA,EACvD;AAEA,QAAM,SAASP,gBAAe,OAAO;AACrC,SAAO,cAAc,OAAO,KAAK,GAAG,CAAC;AACvC;AAEA,SAAS,SAAS,KAAiB,MAAc,OAA0B;AACzE,MAAI,MAAM,SAAS,UAAU;AAC3B,QAAI,MAAM,UAAU,KAAM,QAAO;AACjC,QAAI,MAAM,UAAU,MAAO,QAAO;AAClC,WAAO,GAAG,IAAI,KAAK,OAAO,MAAM,KAAK,CAAC;AAAA,EACxC;AACA,SAAO,GAAG,IAAI,KAAK,SAAS,KAAK,MAAM,IAAI,EAAE,IAAI;AACnD;AAEA,SAAS,aAAa,KAAiB,IAAuB;AAC5D,QAAM,QAAkB,CAAC;AAEzB,QAAM,MAAM,UAAU,KAAK,GAAG,OAAO;AACrC,MAAI,QAAQ,KAAM,OAAM,KAAK,GAAG;AAEhC,aAAW,QAAQ,GAAG,MAAM,OAAO;AACjC,UAAM,IAAI,GAAG,MAAM,QAAQ,IAAI,IAAI;AACnC,QAAI,CAAC,EAAG;AACR,UAAM,OAAO,SAAS,KAAK,MAAM,CAAC;AAClC,QAAI,KAAK,SAAS,EAAG,OAAM,KAAK,IAAI;AAAA,EACtC;AAEA,aAAW,OAAO,GAAG,MAAM,QAAS,OAAM,KAAK,OAAO,SAAS,KAAK,GAAG,EAAE,IAAI,GAAG;AAEhF,QAAM,UAAU,MAAM,SAAS,IAAI,IAAI,MAAM,KAAK,GAAG,CAAC,KAAK;AAC3D,QAAM,MAAM,GAAG;AAEf,MAAI,GAAG,SAAS,WAAW,GAAG;AAC5B,WAAO,GAAG,cAAc,IAAI,GAAG,GAAG,OAAO,QAAQ,IAAI,GAAG,GAAG,OAAO,MAAM,GAAG;AAAA,EAC7E;AAEA,QAAM,QAAQ,GAAG,SAAS,IAAI,CAAC,MAAM,UAAU,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE;AAC/D,SAAO,IAAI,GAAG,GAAG,OAAO,IAAI,KAAK,KAAK,GAAG;AAC3C;AAEA,SAAS,UAAU,KAAiB,IAAsB;AACxD,QAAM,OAAO,IAAI,MAAM,IAAI,EAAE;AAC7B,MAAI,CAAC,KAAM,QAAO;AAClB,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,KAAK;AAAA,IACd,KAAK;AACH,aAAO,MAAM,KAAK,KAAK;AAAA,IACzB,KAAK,QAAQ;AACX,YAAM,EAAE,MAAM,OAAO,IAAI,SAAS,KAAK,KAAK,IAAI;AAChD,aAAO,SAAS,OAAO,IAAI,MAAM,IAAI,IAAI;AAAA,IAC3C;AAAA,IACA,KAAK;AACH,aAAO,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,UAAU,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA,IAClE,KAAK;AACH,aAAO,aAAa,KAAK,IAAI;AAAA,EACjC;AACF;AAEA,SAAS,QAAQ,KAAyB;AACxC,QAAM,OAAO,IAAI,MAAM,IAAI,IAAI,IAAI;AACnC,MAAI,CAAC,QAAQ,KAAK,SAAS,WAAY,QAAO,UAAU,KAAK,IAAI,IAAI;AACrE,SAAO,KAAK,SAAS,IAAI,CAAC,MAAM,UAAU,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE;AAC5D;AAIA,SAASS,SAAQ,KAAyB;AACxC,QAAM,WAAWJ,eAAc,GAAG;AAClC,SAAO,YAAY,QAAQ,GAAG;AAChC;AAEO,IAAM,aAAsB;AAAA,EACjC,MAAM;AAAA,EACN,OAAON;AAAA,EACP,MAAM,KAAiB,OAAiB,MAAqC;AAC3E,UAAM,OAAOU,SAAQ,GAAG;AACxB,WAAO,EAAE,MAAM,KAAK,MAAM,OAAO,CAAC,GAAG,aAAa,CAAC,EAAE;AAAA,EACvD;AACF;AAGO,SAAS,mBAA4B;AAC1C,SAAO;AACT;;;AC9WO,SAAS,UAAU,IAA6B;AACrD,QAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,EAAE,CAAC,KAAK;AACrC,MAAI,MAAM,SAAS,MAAM,EAAG,QAAO;AACnC,MAAI,MAAM,SAAS,MAAM,EAAG,QAAO;AACnC,SAAO;AACT;AAGO,SAAS,WAAW,IAA6B;AACtD,QAAM,SAAS,GAAG,MAAM,KAAK,CAAC,EAAE,CAAC,KAAK,IAAI,YAAY;AACtD,MAAI,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,MAAM,EAAG,QAAO;AAC9D,SAAO;AACT;AAGA,SAASC,OAAM,KAAgC;AAC7C,aAAW,OAAO,IAAI,QAAQ,OAAO,EAAG,QAAO,IAAI;AACnD,SAAO;AACT;AAGA,SAAS,YAAY,UAAsC;AACzD,QAAM,UAAU,oBAAI,IAA0B;AAC9C,aAAW,KAAK,UAAU;AACxB,UAAM,QAAS,EAAE,SAAS,MAAM,KAAK,CAAC,EAAE,CAAC,KAAK;AAC9C,QAAI,SAAS,QAAQ,IAAI,KAAK;AAC9B,QAAI,CAAC,QAAQ;AACX,eAAS,CAAC;AACV,cAAQ,IAAI,OAAO,MAAM;AAAA,IAC3B;AACA,WAAO,KAAK,CAAC;AAAA,EACf;AACA,QAAM,SAAiB,CAAC;AACxB,aAAW,CAAC,OAAO,IAAI,KAAK,SAAS;AACnC,WAAO,KAAK,EAAE,OAAO,UAAU,GAAG,KAAK,YAA4B,UAAU,KAAK,CAAC;AAAA,EACrF;AACA,SAAO;AACT;AAUA,SAAS,gBACP,MACA,IACA,MACA,UACA,UACA,QACA,MACa;AACb,QAAM,SAAS,kBAAkB,EAAE,MAAM,MAAM;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,cAAc,MAAM;AAAA,IAAC;AAAA,EACvB,CAAC;AACD,QAAM,MAAM,OAAO;AAInB,aAAW,QAAQ,IAAI,MAAM,OAAO,EAAG,MAAK,KAAK,cAAc;AAE/D,QAAM,MAAoB;AAAA,IACxB;AAAA,IACA,eAAe;AAAA,IACf;AAAA;AAAA;AAAA;AAAA,IAIA,WAAW,mBAAmB,KAAK,QAAQ;AAAA,IAC3C;AAAA,IACA;AAAA,EACF;AACA,SAAO,EAAE,KAAK,KAAK,QAAQ,YAAY,QAAQ,EAAE;AACnD;AAGA,SAAS,eAAe,WAAuB,IAAY,UAAiC;AAC1F,0BAAwB,WAAW,UAAU,UAAU;AACvD,QAAM,UAAU,iBAAiB,EAAE;AAAA,IACjC;AAAA,IACA,EAAE,UAAU,IAAI,KAAK,CAAC,GAAG,YAAY,oBAAI,IAAI,EAAE;AAAA,IAC/C;AAAA,MACE;AAAA,MACA;AAAA,MACA,MAAM,oBAAoB;AAAA,MAC1B,KAAKA,OAAM,SAAS;AAAA,MACpB,cAAc,MAAM;AAAA,MAAC;AAAA,IACvB;AAAA,EACF;AACA,SAAO,QAAQ;AACjB;AAGO,SAAS,eACd,MACA,IACA,MACA,UACA,UACA,QACQ;AACR,QAAM,EAAE,KAAK,KAAK,OAAO,IAAI,gBAAgB,MAAM,IAAI,MAAM,UAAU,UAAU,QAAQ,eAAe;AACxG,QAAM,EAAE,KAAK,UAAU,IAAI,UAAU,KAAK,QAAQ,GAAG;AACrD,SAAO,eAAe,WAAW,IAAI,QAAQ;AAC/C;AASA,SAAS,YACP,MACA,IACA,UACA,UACA,QACA,MACa;AACb,QAAM,SAAS,mBAAmB,EAAE,MAAM,MAAM;AAAA,IAC9C;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,QAAQ,CAAC;AAAA,IACT,cAAc,MAAM;AAAA,IAAC;AAAA,EACvB,CAAC;AACD,QAAM,MAAM,OAAO;AACnB,QAAM,MAAoB;AAAA,IACxB;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA,WAAW,mBAAmB,KAAK,QAAQ;AAAA,IAC3C;AAAA,IACA;AAAA,EACF;AACA,SAAO,EAAE,KAAK,KAAK,QAAQ,YAAY,QAAQ,EAAE;AACnD;AAGA,SAAS,mBAAmB,WAAuB,IAAY,UAAiC;AAC9F,0BAAwB,WAAW,UAAU,UAAU;AACvD,QAAM,UAAU,kBAAkB,EAAE;AAAA,IAClC;AAAA,IACA,EAAE,UAAU,IAAI,KAAK,CAAC,GAAG,YAAY,oBAAI,IAAI,EAAE;AAAA,IAC/C;AAAA,MACE;AAAA,MACA;AAAA,MACA,MAAM,oBAAoB;AAAA,MAC1B,KAAKA,OAAM,SAAS;AAAA,MACpB,cAAc,MAAM;AAAA,MAAC;AAAA,IACvB;AAAA,EACF;AACA,SAAO,QAAQ;AACjB;AAGO,SAAS,gBACd,MACA,IACA,UACA,UACA,QACQ;AACR,QAAM,EAAE,KAAK,KAAK,OAAO,IAAI,YAAY,MAAM,IAAI,UAAU,UAAU,QAAQ,eAAe;AAC9F,QAAM,EAAE,KAAK,UAAU,IAAI,UAAU,KAAK,QAAQ,GAAG;AACrD,SAAO,mBAAmB,WAAW,IAAI,QAAQ;AACnD;;;AThJA,IAAM,kBAAqC,CAAC,QAAQ,QAAQ,SAAS,MAAM;AAE3E,SAAS,eAAe,SAAiD;AACvE,SAAO;AAAA,IACL,UAAU,QAAQ,YAAY;AAAA,IAC9B,UAAU,QAAQ,YAAY,CAAC;AAAA,IAC/B,QAAQ,QAAQ,UAAU;AAAA,IAC1B,QAAQ,QAAQ,UAAU;AAAA,IAC1B,SAAS,QAAQ,WAAW;AAAA,EAC9B;AACF;AAGA,SAAS,YAAY,IAAY,SAAqC;AAEpE,QAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,EAAE,CAAC,KAAK;AACrC,SAAO,QAAQ,KAAK,CAAC,QAAQ,MAAM,SAAS,GAAG,CAAC;AAClD;AA6CA,SAAS,eAAe,UAAiD;AACvE,MAAI,SAAS,aAAa,UAAU;AAClC,WAAO,kBAAkB,CAAC,GAAG,EAAE,OAAO,SAAS,SAAS,CAAC;AAAA,EAC3D;AAEA,SAAO,uBAAuB;AAChC;AAEO,SAAS,cAAc,UAA0B,CAAC,GAAY;AACnE,QAAM,WAAW,eAAe,OAAO;AACvC,QAAM,WAAW,eAAe;AAChC,QAAM,WAAW;AAIjB,MAAI,iBAAuC;AAC3C,QAAM,cAAc,MAAsB,mBAAmB,eAAe,QAAQ;AAEpF,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,IAAI,WAA0B;AAC5B,aAAO,YAAY;AAAA,IACrB;AAAA,IACA;AAAA,IACA,UAAU,MAAc,IAAoC;AAC1D,UAAI,CAAC,YAAY,IAAI,SAAS,OAAO,EAAG,QAAO,EAAE,MAAM,KAAK,KAAK;AACjE,YAAM,OAAO,UAAU,EAAE;AACzB,UAAI,SAAS,MAAM;AACjB,cAAM,MAAM,eAAe,MAAM,IAAI,MAAM,YAAY,GAAG,UAAU,SAAS,MAAM;AACnF,eAAO,EAAE,MAAM,KAAK,KAAK,KAAK;AAAA,MAChC;AAEA,UAAI,WAAW,EAAE,MAAM,MAAM;AAC3B,cAAM,MAAM,gBAAgB,MAAM,IAAI,YAAY,GAAG,UAAU,SAAS,MAAM;AAC9E,eAAO,EAAE,MAAM,KAAK,KAAK,KAAK;AAAA,MAChC;AACA,aAAO,EAAE,MAAM,KAAK,KAAK;AAAA,IAC3B;AAAA,EACF;AACF;;;ApDxIA,IAAM,UAAU,oBAAI,IAAqB;AAEzC,SAAS,UAAU,SAAkC;AACnD,QAAM,MAAM,KAAK,UAAU,WAAW,CAAC,CAAC;AACxC,MAAI,SAAS,QAAQ,IAAI,GAAG;AAC5B,MAAI,CAAC,QAAQ;AACX,aAAS,cAAc,OAAO;AAC9B,YAAQ,IAAI,KAAK,MAAM;AAAA,EACzB;AACA,SAAO;AACT;AAMe,SAAR,cAA2D,QAAwB;AACxF,QAAM,UAAU,KAAK,aAAa,KAAK,CAAC;AACxC,QAAM,SAAS,UAAU,OAAO;AAChC,SAAO,OAAO,UAAU,QAAQ,KAAK,YAAY,EAAE;AACrD;","names":["childIds","pc","isInherited","normalizer","normalizer","computed","asElement","asEl","metaFlag","declaresCustomProperties","targetedByStructuralPseudo","DISPLAY","baseConditionStyleMap","outerMergeSafe","metaOf","hasSpreadAttrs","isComponentNode","hasOwnAttrs","targetedByStructuralPseudo","asEl","metaOf","establishesContext","hasSpreadAttrs","isComponentNode","hasOwnAttrs","targetedByStructuralPseudo","DISPLAY","computed","BASE_KEY","computed","computed","BASE_KEY","computed","computed","BASE_KEY","computed","BASE_KEY","computed","BASE_KEY","NON_COLLAPSIBLE_VALUES","computed","BASE_KEY","computed","ALIGN_ITEMS","JUSTIFY_ITEMS","PLACE_ITEMS","JUSTIFY_CONTENT","BASE_KEY","withBaseDecls","computed","BASE_KEY","NON_COLLAPSIBLE_VALUES","computed","SIDE_SET","BASE_KEY","NON_COLLAPSIBLE_VALUES","computed","NON_COLLAPSIBLE_VALUES","computed","opaque","opaque","LEGACY_PSEUDO_ELEMENTS","import_node_module","path","moduleBase","path","LEGACY_PSEUDO_ELEMENTS","staticTokensOf","sameTokens","MagicString","import_node_module","document","opaque","computed","babelTraverse","FILE_ID","doParse","babelParse","FILE_ID","span","staticTokensOf","computed","path","doParse","import_magic_string","JSX_LANGS","staticTokensOf","primarySource","collectKept","strictlyContains","editClasses","surgicalPrint","MagicString","backrefIds","span","doPrint","eolOf"]}