@collie-lang/compiler 1.3.3 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/rewrite.ts","../src/codegen.ts","../src/html-codegen.ts","../src/diagnostics.ts","../src/dialect.ts","../src/props.ts","../src/parser.ts","../src/fixes.ts","../src/format.ts","../src/convert.ts"],"sourcesContent":["import type { NormalizedCollieDialectOptions } from \"@collie-lang/config\";\nimport { generateRenderModule } from \"./codegen.ts\";\nimport { generateHtml } from \"./html-codegen.ts\";\nimport { parse } from \"./parser.ts\";\nimport type { ParseResult, TemplateUnit } from \"./parser.ts\";\nimport type { Diagnostic } from \"./diagnostics.ts\";\nimport type { RootNode } from \"./ast.ts\";\nimport type { SourceSpan } from \"./diagnostics.ts\";\n\nexport type {\n CollieConfig,\n CollieCssOptions,\n CollieCssStrategy,\n CollieDialectOptions,\n CollieDialectPropsOptions,\n CollieDialectTokenKind,\n CollieDialectTokenRule,\n CollieDialectTokens,\n CollieDiagnosticLevel,\n CollieProjectConfig,\n CollieCompilerOptions,\n CollieFeatureOptions,\n CollieEditorOptions,\n HtmlProjectOptions,\n ReactProjectOptions,\n NormalizedCollieCssOptions,\n NormalizedCollieConfig,\n NormalizedCollieDialectOptions,\n NormalizedCollieDialectPropsOptions,\n NormalizedCollieDialectTokenRule,\n NormalizedCollieDialectTokens,\n NormalizedCollieProjectConfig\n} from \"@collie-lang/config\";\nexport {\n defineConfig,\n loadConfig,\n loadAndNormalizeConfig,\n normalizeConfig\n} from \"@collie-lang/config\";\n\nexport type {\n Diagnostic,\n DiagnosticFix,\n DiagnosticSeverity,\n SourcePos,\n SourceSpan\n} from \"./diagnostics.ts\";\nexport { applyFixes, fixAllFromDiagnostics } from \"./fixes.ts\";\nexport type { ParseResult, TemplateUnit } from \"./parser.ts\";\nexport type {\n Attribute,\n ClassAliasDecl,\n ClassAliasesDecl,\n ComponentNode,\n ConditionalBranch,\n ConditionalNode,\n ElementNode,\n ExpressionNode,\n ForNode,\n JSXPassthroughNode,\n Node,\n PropsDecl,\n PropsField,\n RootNode,\n SlotBlock,\n TextChunk,\n TextExprPart,\n TextNode,\n TextPart\n} from \"./ast.ts\";\nexport type { FormatOptions, FormatResult } from \"./format.ts\";\nexport { formatCollie } from \"./format.ts\";\nexport type { ConvertTsxOptions, ConvertTsxResult } from \"./convert.ts\";\nexport { convertTsxToCollie } from \"./convert.ts\";\n\nexport interface ParseCollieOptions {\n filename?: string;\n dialect?: NormalizedCollieDialectOptions;\n}\n\nexport interface BaseCompileOptions {\n filename?: string;\n /** @deprecated Legacy component module option. */\n componentNameHint?: string;\n dialect?: NormalizedCollieDialectOptions;\n}\n\nexport interface JsxCompileOptions extends BaseCompileOptions {\n jsxRuntime?: \"classic\" | \"automatic\";\n}\n\nexport interface TsxCompileOptions extends BaseCompileOptions {\n jsxRuntime?: \"classic\" | \"automatic\";\n}\n\nexport interface HtmlCompileOptions extends BaseCompileOptions {\n pretty?: boolean;\n}\n\nexport interface CollieCompileMeta {\n id?: string;\n rawId?: string;\n filename?: string;\n span?: SourceSpan;\n}\n\nexport interface CompileResult {\n code: string;\n map?: any;\n diagnostics: Diagnostic[];\n meta?: CollieCompileMeta;\n}\n\nexport interface ConvertCollieResult {\n tsx: string;\n diagnostics: Diagnostic[];\n meta?: CollieCompileMeta;\n}\n\nexport interface CompileTemplateOptions {\n filename?: string;\n jsxRuntime?: \"classic\" | \"automatic\";\n flavor?: \"jsx\" | \"tsx\";\n}\n\nexport type CollieDocument = ParseResult;\n/** @deprecated Legacy component-compile options. Prefer CompileTemplateOptions. */\nexport type CompileOptions = JsxCompileOptions;\n\nexport function parseCollie(source: string, options: ParseCollieOptions = {}): CollieDocument {\n const result = parse(source, { dialect: options.dialect });\n if (!options.filename) {\n return {\n templates: result.templates.map((template) => ({\n ...template,\n diagnostics: normalizeDiagnostics(template.diagnostics)\n })),\n diagnostics: normalizeDiagnostics(result.diagnostics)\n };\n }\n return {\n templates: result.templates.map((template) => ({\n ...template,\n diagnostics: normalizeDiagnostics(template.diagnostics, options.filename)\n })),\n diagnostics: normalizeDiagnostics(result.diagnostics, options.filename)\n };\n}\n\nexport function compileTemplate(\n template: TemplateUnit,\n options: CompileTemplateOptions = {}\n): CompileResult {\n const diagnostics = normalizeDiagnostics(template.diagnostics, options.filename);\n const jsxRuntime = options.jsxRuntime ?? \"automatic\";\n const flavor = options.flavor ?? \"tsx\";\n\n let code = createStubRender(flavor);\n if (!hasErrors(diagnostics)) {\n code = generateRenderModule(template.ast, { jsxRuntime, flavor });\n }\n\n const meta = buildCompileMeta(template, options.filename);\n return { code, diagnostics, map: undefined, meta };\n}\n\n/**\n * @deprecated Legacy component module wrapper.\n * Use compileTemplate for registry-driven render modules.\n */\nexport function compileToJsx(\n sourceOrAst: string | RootNode | CollieDocument,\n options: JsxCompileOptions = {}\n): CompileResult {\n const document = normalizeDocument(sourceOrAst, options.filename, options.dialect);\n const diagnostics = normalizeDiagnostics(document.diagnostics, options.filename);\n const template = document.templates[0];\n const componentName = options.componentNameHint ?? \"CollieTemplate\";\n const jsxRuntime = options.jsxRuntime ?? \"automatic\";\n\n let code = createStubComponent(componentName, \"jsx\");\n if (!hasErrors(diagnostics) && template) {\n const renderResult = compileTemplate(template, {\n filename: options.filename,\n jsxRuntime,\n flavor: \"jsx\"\n });\n code = wrapRenderModuleAsComponent(renderResult.code, componentName, \"jsx\");\n }\n\n const meta = buildCompileMeta(template, options.filename);\n return { code, diagnostics, map: undefined, meta };\n}\n\n/**\n * @deprecated Legacy component module wrapper.\n * Use compileTemplate for registry-driven render modules.\n */\nexport function compileToTsx(\n sourceOrAst: string | RootNode | CollieDocument,\n options: TsxCompileOptions = {}\n): CompileResult {\n const document = normalizeDocument(sourceOrAst, options.filename, options.dialect);\n const diagnostics = normalizeDiagnostics(document.diagnostics, options.filename);\n const template = document.templates[0];\n const componentName = options.componentNameHint ?? \"CollieTemplate\";\n const jsxRuntime = options.jsxRuntime ?? \"automatic\";\n\n let code = createStubComponent(componentName, \"tsx\");\n if (!hasErrors(diagnostics) && template) {\n const renderResult = compileTemplate(template, {\n filename: options.filename,\n jsxRuntime,\n flavor: \"tsx\"\n });\n code = wrapRenderModuleAsComponent(renderResult.code, componentName, \"tsx\");\n }\n\n const meta = buildCompileMeta(template, options.filename);\n return { code, diagnostics, map: undefined, meta };\n}\n\n/**\n * @deprecated Legacy component module wrapper.\n * Use compileTemplate for registry-driven render modules.\n */\nexport function convertCollieToTsx(source: string, options: TsxCompileOptions = {}): ConvertCollieResult {\n const result = compileToTsx(source, options);\n return {\n tsx: result.code,\n diagnostics: result.diagnostics,\n meta: result.meta\n };\n}\n\nexport function compileToHtml(\n sourceOrAst: string | RootNode | CollieDocument,\n options: HtmlCompileOptions = {}\n): CompileResult {\n const document = normalizeDocument(sourceOrAst, options.filename, options.dialect);\n const diagnostics = normalizeDiagnostics(document.diagnostics, options.filename);\n const template = document.templates[0];\n\n let code = createStubHtml();\n if (!hasErrors(diagnostics) && template) {\n code = generateHtml(template.ast);\n }\n\n const meta = buildCompileMeta(template, options.filename);\n return { code, diagnostics, map: undefined, meta };\n}\n\n/**\n * @deprecated Legacy component module wrapper.\n * Use compileTemplate for registry-driven render modules.\n */\nexport function compile(source: string, options: CompileOptions = {}): CompileResult {\n return compileToJsx(source, options);\n}\n\nexport { parseCollie as parse };\n\nfunction normalizeDocument(\n sourceOrAst: string | RootNode | CollieDocument,\n filename?: string,\n dialect?: NormalizedCollieDialectOptions\n): CollieDocument {\n if (typeof sourceOrAst === \"string\") {\n return parseCollie(sourceOrAst, { filename, dialect });\n }\n\n if (isCollieDocument(sourceOrAst)) {\n if (!filename) {\n return sourceOrAst;\n }\n return attachFilenameToDocument(sourceOrAst, filename);\n }\n\n if (isRootNode(sourceOrAst)) {\n const id = sourceOrAst.id ?? sourceOrAst.rawId ?? \"\";\n const rawId = sourceOrAst.rawId ?? sourceOrAst.id ?? \"\";\n const template: TemplateUnit = {\n id,\n rawId,\n span: sourceOrAst.idTokenSpan,\n ast: sourceOrAst,\n diagnostics: []\n };\n return { templates: [template], diagnostics: [] };\n }\n\n throw new TypeError(\"Collie compiler expected source text, a parsed document, or a root node.\");\n}\n\nfunction isRootNode(value: unknown): value is RootNode {\n return !!value && typeof value === \"object\" && (value as { type?: unknown }).type === \"Root\";\n}\n\nfunction isCollieDocument(value: unknown): value is CollieDocument {\n return (\n !!value &&\n typeof value === \"object\" &&\n Array.isArray((value as { templates?: unknown }).templates) &&\n Array.isArray((value as { diagnostics?: unknown }).diagnostics)\n );\n}\n\nfunction hasErrors(diagnostics: Diagnostic[]): boolean {\n return diagnostics.some((diag) => diag.severity === \"error\");\n}\n\nfunction createStubComponent(name: string, flavor: \"jsx\" | \"tsx\"): string {\n if (flavor === \"tsx\") {\n return [\n \"export type Props = Record<string, never>;\",\n `export default function ${name}(props: Props) {`,\n \" return null;\",\n \"}\"\n ].join(\"\\n\");\n }\n return [`export default function ${name}(props) {`, \" return null;\", \"}\"].join(\"\\n\");\n}\n\nfunction createStubRender(flavor: \"jsx\" | \"tsx\"): string {\n if (flavor === \"tsx\") {\n return [\n \"export type Props = Record<string, never>;\",\n \"export function render(props: any) {\",\n \" return null;\",\n \"}\"\n ].join(\"\\n\");\n }\n return [\"export function render(props) {\", \" return null;\", \"}\"].join(\"\\n\");\n}\n\nfunction wrapRenderModuleAsComponent(\n renderModule: string,\n name: string,\n flavor: \"jsx\" | \"tsx\"\n): string {\n const signature = flavor === \"tsx\" ? `export default function ${name}(props: Props) {` : `export default function ${name}(props) {`;\n const wrapper = [signature, \" return render(props);\", \"}\"].join(\"\\n\");\n return `${renderModule}\\n\\n${wrapper}`;\n}\n\nfunction createStubHtml(): string {\n return \"\";\n}\n\nfunction buildCompileMeta(\n template: TemplateUnit | undefined,\n filename?: string\n): CollieCompileMeta | undefined {\n const meta: CollieCompileMeta = {};\n if (filename) {\n meta.filename = filename;\n }\n if (template?.rawId) {\n meta.rawId = template.rawId;\n }\n if (template?.id) {\n meta.id = template.id;\n }\n if (template?.span) {\n meta.span = template.span;\n }\n\n return meta.id || meta.rawId || meta.filename ? meta : undefined;\n}\nfunction attachFilenameToDocument(document: CollieDocument, filename?: string): CollieDocument {\n if (!filename) {\n return document;\n }\n return {\n templates: document.templates.map((template) => ({\n ...template,\n diagnostics: normalizeDiagnostics(template.diagnostics, filename)\n })),\n diagnostics: normalizeDiagnostics(document.diagnostics, filename)\n };\n}\n\nfunction normalizeDiagnostics(diagnostics: Diagnostic[], filename?: string): Diagnostic[] {\n return diagnostics.map((diag) => {\n const filePath = diag.filePath ?? diag.file ?? filename;\n const file = diag.file ?? filename;\n const range = diag.range ?? diag.span;\n\n if (filePath === diag.filePath && file === diag.file && range === diag.range) {\n return diag;\n }\n\n return {\n ...diag,\n filePath,\n file,\n range\n };\n });\n}\n","import type { PropDeclKind } from \"./ast.ts\";\n\n/**\n * Template environment for tracking prop aliases and local variables during code generation.\n * \n * This is a pure data structure with no hidden state or side effects.\n * It is created once per template and passed through the rewriting process\n * to enable deterministic identifier resolution.\n * \n * - propAliases: Map of prop names declared in #props to their kind (value or callable)\n * - localsStack: Stack of local variable scopes (e.g., @for loop variables)\n */\nexport interface TemplateEnv {\n propAliases: Map<string, PropDeclKind>;\n localsStack: Array<Set<string>>;\n}\n\n/**\n * Create a new TemplateEnv from prop declarations.\n */\nexport function createTemplateEnv(\n propsDecls?: Array<{ name: string; kind: PropDeclKind }>\n): TemplateEnv {\n const propAliases = new Map<string, PropDeclKind>();\n if (propsDecls) {\n for (const decl of propsDecls) {\n propAliases.set(decl.name, decl.kind);\n }\n }\n return {\n propAliases,\n localsStack: []\n };\n}\n\n/**\n * Push a new local scope with the given variable names.\n * Call this when entering a new scope (e.g., @for loop).\n */\nexport function pushLocals(env: TemplateEnv, names: string[]): void {\n const locals = new Set<string>(names);\n env.localsStack.push(locals);\n}\n\n/**\n * Pop the most recent local scope.\n * Call this when exiting a scope (e.g., end of @for loop body).\n */\nexport function popLocals(env: TemplateEnv): void {\n env.localsStack.pop();\n}\n\n/**\n * Check if a name is a local variable in the current scope.\n * Locals shadow prop aliases.\n */\nexport function isLocal(env: TemplateEnv, name: string): boolean {\n for (let i = env.localsStack.length - 1; i >= 0; i--) {\n if (env.localsStack[i].has(name)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if a name is a prop alias declared in #props.\n * Returns true only if it's in propAliases and not shadowed by a local.\n */\nexport function isPropAlias(env: TemplateEnv, name: string): boolean {\n if (isLocal(env, name)) {\n return false;\n }\n return env.propAliases.has(name);\n}\n\n/**\n * Result of expression rewriting with usage metadata for diagnostics.\n */\nexport interface RewriteResult {\n code: string; // rewritten expression\n usedBare: Set<string>; // bare identifiers encountered\n usedPropsDot: Set<string>; // props.<name> occurrences encountered\n callSitesBare: Set<string>; // bare identifiers used as calls: name(...)\n callSitesPropsDot: Set<string>; // props.name(...) occurrences\n rewrittenAliases: Set<string>; // prop aliases rewritten to props.<name>\n}\n\nconst IGNORED_IDENTIFIERS = new Set([\n \"null\",\n \"undefined\",\n \"true\",\n \"false\",\n \"NaN\",\n \"Infinity\",\n \"this\",\n \"props\"\n]);\n\nconst RESERVED_KEYWORDS = new Set([\n \"await\",\n \"break\",\n \"case\",\n \"catch\",\n \"class\",\n \"const\",\n \"continue\",\n \"debugger\",\n \"default\",\n \"delete\",\n \"do\",\n \"else\",\n \"enum\",\n \"export\",\n \"extends\",\n \"false\",\n \"finally\",\n \"for\",\n \"function\",\n \"if\",\n \"import\",\n \"in\",\n \"instanceof\",\n \"let\",\n \"new\",\n \"null\",\n \"return\",\n \"super\",\n \"switch\",\n \"this\",\n \"throw\",\n \"true\",\n \"try\",\n \"typeof\",\n \"var\",\n \"void\",\n \"while\",\n \"with\",\n \"yield\"\n]);\n\n/**\n * Rewrite expression, converting bare prop aliases to props.<name>.\n * Returns rewritten code plus metadata about identifier usage for diagnostics.\n * \n * This function is PURE and does not mutate the AST or environment.\n * The output is deterministic TSX with explicit props.<name> references,\n * making it suitable for future Collie → TSX conversion tooling.\n * \n * @param expression - The original expression string from the template\n * @param env - Template environment with prop aliases and locals\n * @returns RewriteResult with rewritten code and usage metadata\n */\nexport function rewriteExpression(expression: string, env: TemplateEnv): RewriteResult {\n let i = 0;\n let state: \"code\" | \"single\" | \"double\" | \"template\" | \"line\" | \"block\" = \"code\";\n let output = \"\";\n \n const usedBare = new Set<string>();\n const usedPropsDot = new Set<string>();\n const callSitesBare = new Set<string>();\n const callSitesPropsDot = new Set<string>();\n const rewrittenAliases = new Set<string>();\n\n while (i < expression.length) {\n const ch = expression[i];\n\n if (state === \"code\") {\n if (ch === \"'\" || ch === \"\\\"\") {\n state = ch === \"'\" ? \"single\" : \"double\";\n output += ch;\n i++;\n continue;\n }\n if (ch === \"`\") {\n state = \"template\";\n output += ch;\n i++;\n continue;\n }\n if (ch === \"/\" && expression[i + 1] === \"/\") {\n state = \"line\";\n output += ch;\n i++;\n continue;\n }\n if (ch === \"/\" && expression[i + 1] === \"*\") {\n state = \"block\";\n output += ch;\n i++;\n continue;\n }\n if (isIdentifierStart(ch)) {\n const start = i;\n i++;\n while (i < expression.length && isIdentifierPart(expression[i])) {\n i++;\n }\n const name = expression.slice(start, i);\n const prevNonSpace = findPreviousNonSpace(expression, start - 1);\n const nextNonSpace = findNextNonSpace(expression, i);\n const isMemberAccess = prevNonSpace === \".\";\n const isObjectKey = nextNonSpace === \":\" && (prevNonSpace === \"{\" || prevNonSpace === \",\");\n const isCall = nextNonSpace === \"(\";\n\n // Track props.<name> usage\n if (prevNonSpace === \".\" && start >= 2) {\n const propsStart = findPreviousIdentifierStart(expression, start - 2);\n if (propsStart !== null) {\n const possibleProps = expression.slice(propsStart, start - 1).trim();\n if (possibleProps === \"props\") {\n usedPropsDot.add(name);\n if (isCall) {\n callSitesPropsDot.add(name);\n }\n }\n }\n }\n\n if (\n isMemberAccess ||\n isObjectKey ||\n isLocal(env, name) ||\n shouldIgnoreIdentifier(name)\n ) {\n output += name;\n continue;\n }\n\n // Check if this identifier is a prop alias\n if (isPropAlias(env, name)) {\n // Rewrite to props.<name>\n output += `props.${name}`;\n rewrittenAliases.add(name);\n if (isCall) {\n callSitesBare.add(name);\n }\n continue;\n }\n\n // Not a prop alias, track as bare identifier\n usedBare.add(name);\n if (isCall) {\n callSitesBare.add(name);\n }\n output += name;\n continue;\n }\n\n output += ch;\n i++;\n continue;\n }\n\n if (state === \"line\") {\n output += ch;\n if (ch === \"\\n\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n\n if (state === \"block\") {\n output += ch;\n if (ch === \"*\" && expression[i + 1] === \"/\") {\n output += \"/\";\n i += 2;\n state = \"code\";\n continue;\n }\n i++;\n continue;\n }\n\n if (state === \"single\") {\n output += ch;\n if (ch === \"\\\\\") {\n if (i + 1 < expression.length) {\n output += expression[i + 1];\n i += 2;\n continue;\n }\n }\n if (ch === \"'\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n\n if (state === \"double\") {\n output += ch;\n if (ch === \"\\\\\") {\n if (i + 1 < expression.length) {\n output += expression[i + 1];\n i += 2;\n continue;\n }\n }\n if (ch === \"\\\"\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n\n if (state === \"template\") {\n output += ch;\n if (ch === \"\\\\\") {\n if (i + 1 < expression.length) {\n output += expression[i + 1];\n i += 2;\n continue;\n }\n }\n if (ch === \"`\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n }\n\n return { code: output, usedBare, usedPropsDot, callSitesBare, callSitesPropsDot, rewrittenAliases };\n}\n\n/**\n * Rewrite JSX expression containing embedded braces.\n * \n * This function is PURE and does not mutate the AST or environment.\n * Recursively processes expressions within braces, maintaining deterministic output.\n * \n * @param expression - The JSX expression string with potential {...} sections\n * @param env - Template environment with prop aliases and locals\n * @returns RewriteResult with rewritten code and aggregated usage metadata\n */\nexport function rewriteJsxExpression(expression: string, env: TemplateEnv): RewriteResult {\n let output = \"\";\n let i = 0;\n \n const usedBare = new Set<string>();\n const usedPropsDot = new Set<string>();\n const callSitesBare = new Set<string>();\n const callSitesPropsDot = new Set<string>();\n const rewrittenAliases = new Set<string>();\n\n while (i < expression.length) {\n const ch = expression[i];\n if (ch === \"{\") {\n const braceResult = readBalancedBraces(expression, i + 1);\n if (!braceResult) {\n output += expression.slice(i);\n break;\n }\n const result = rewriteExpression(braceResult.content, env);\n output += `{${result.code}}`;\n \n // Merge metadata\n for (const name of result.usedBare) usedBare.add(name);\n for (const name of result.usedPropsDot) usedPropsDot.add(name);\n for (const name of result.callSitesBare) callSitesBare.add(name);\n for (const name of result.callSitesPropsDot) callSitesPropsDot.add(name);\n for (const name of result.rewrittenAliases) rewrittenAliases.add(name);\n \n i = braceResult.endIndex + 1;\n continue;\n }\n output += ch;\n i++;\n }\n\n return { code: output, usedBare, usedPropsDot, callSitesBare, callSitesPropsDot, rewrittenAliases };\n}\n\nfunction readBalancedBraces(\n source: string,\n startIndex: number\n): { content: string; endIndex: number } | null {\n let i = startIndex;\n let depth = 1;\n let state: \"code\" | \"single\" | \"double\" | \"template\" | \"line\" | \"block\" = \"code\";\n\n while (i < source.length) {\n const ch = source[i];\n\n if (state === \"code\") {\n if (ch === \"'\" || ch === \"\\\"\") {\n state = ch === \"'\" ? \"single\" : \"double\";\n i++;\n continue;\n }\n if (ch === \"`\") {\n state = \"template\";\n i++;\n continue;\n }\n if (ch === \"/\" && source[i + 1] === \"/\") {\n state = \"line\";\n i += 2;\n continue;\n }\n if (ch === \"/\" && source[i + 1] === \"*\") {\n state = \"block\";\n i += 2;\n continue;\n }\n if (ch === \"{\") {\n depth += 1;\n } else if (ch === \"}\") {\n depth -= 1;\n if (depth === 0) {\n return { content: source.slice(startIndex, i), endIndex: i };\n }\n }\n i++;\n continue;\n }\n\n if (state === \"line\") {\n if (ch === \"\\n\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n\n if (state === \"block\") {\n if (ch === \"*\" && source[i + 1] === \"/\") {\n i += 2;\n state = \"code\";\n continue;\n }\n i++;\n continue;\n }\n\n if (state === \"single\") {\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === \"'\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n\n if (state === \"double\") {\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === \"\\\"\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n\n if (state === \"template\") {\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === \"`\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n }\n\n return null;\n}\n\nfunction findPreviousNonSpace(text: string, index: number): string | null {\n for (let i = index; i >= 0; i--) {\n const ch = text[i];\n if (!/\\s/.test(ch)) {\n return ch;\n }\n }\n return null;\n}\n\nfunction findNextNonSpace(text: string, index: number): string | null {\n for (let i = index; i < text.length; i++) {\n const ch = text[i];\n if (!/\\s/.test(ch)) {\n return ch;\n }\n }\n return null;\n}\n\nfunction findPreviousIdentifierStart(text: string, index: number): number | null {\n // Skip backwards over whitespace\n let i = index;\n while (i >= 0 && /\\s/.test(text[i])) {\n i--;\n }\n if (i < 0) return null;\n \n // Now we should be at the end of an identifier, walk back to find its start\n if (!isIdentifierPart(text[i])) {\n return null;\n }\n \n while (i > 0 && isIdentifierPart(text[i - 1])) {\n i--;\n }\n \n return i;\n}\n\nfunction isIdentifierStart(ch: string): boolean {\n return /[A-Za-z_$]/.test(ch);\n}\n\nfunction isIdentifierPart(ch: string): boolean {\n return /[A-Za-z0-9_$]/.test(ch);\n}\n\nfunction shouldIgnoreIdentifier(name: string): boolean {\n return IGNORED_IDENTIFIERS.has(name) || RESERVED_KEYWORDS.has(name);\n}\n","import type {\n Attribute,\n ClassAliasesDecl,\n ComponentNode,\n ConditionalBranch,\n ConditionalNode,\n ElementNode,\n ForNode,\n JSXPassthroughNode,\n Node,\n PropsDecl,\n RootNode,\n SlotBlock,\n TextNode\n} from \"./ast.ts\";\nimport { createTemplateEnv, isLocal, isPropAlias, popLocals, pushLocals, rewriteExpression, rewriteJsxExpression, type TemplateEnv } from \"./rewrite.ts\";\n\nexport interface RenderCodegenOptions {\n jsxRuntime: \"automatic\" | \"classic\";\n flavor: \"jsx\" | \"tsx\";\n}\n\nexport function generateRenderModule(root: RootNode, options: RenderCodegenOptions): string {\n const { prelude, propsType, propsDestructure, jsx, isTsx } = buildModuleParts(root, options);\n const parts: string[] = [...prelude, propsType];\n\n if (!isTsx) {\n parts.push(`/** @param {any} props */`);\n }\n\n const functionLines = [\n isTsx ? \"export function render(props: any) {\" : \"export function render(props) {\"\n ];\n if (propsDestructure) {\n functionLines.push(` ${propsDestructure}`);\n }\n functionLines.push(` return ${jsx};`, `}`);\n parts.push(functionLines.join(\"\\n\"));\n\n return parts.join(\"\\n\\n\");\n}\n\ninterface ModuleParts {\n prelude: string[];\n propsType: string;\n propsDestructure: string | null;\n jsx: string;\n isTsx: boolean;\n}\n\nfunction buildModuleParts(\n root: RootNode,\n options: { jsxRuntime: \"automatic\" | \"classic\"; flavor: \"jsx\" | \"tsx\" }\n): ModuleParts {\n const { jsxRuntime, flavor } = options;\n const isTsx = flavor === \"tsx\";\n\n // Build environments for code generation (does not mutate AST)\n const aliasEnv = buildClassAliasEnvironment(root.classAliases);\n const env = createTemplateEnv(root.propsDecls);\n \n // Generate TSX output with explicit props.<name> for prop aliases\n // This ensures deterministic output for future conversion tools\n const jsx = renderRootChildren(root.children, aliasEnv, env);\n const propsDestructure = emitPropsDestructure(root.props);\n\n const prelude: string[] = [];\n\n if (root.clientComponent) {\n prelude.push(`\"use client\";`);\n }\n\n // Classic runtime needs React in scope for JSX transforms.\n if (jsxRuntime === \"classic\" && templateUsesJsx(root)) {\n prelude.push(`import React from \"react\";`);\n }\n\n // JS-safe typedef for Props (JSDoc)\n const propsType = emitPropsType(root.props, flavor);\n\n return { prelude, propsType, propsDestructure, jsx, isTsx };\n}\n\nfunction buildClassAliasEnvironment(\n decl?: ClassAliasesDecl\n): Map<string, readonly string[]> {\n const env = new Map<string, readonly string[]>();\n if (!decl) {\n return env;\n }\n for (const alias of decl.aliases) {\n env.set(alias.name, alias.classes);\n }\n return env;\n}\n\nfunction renderRootChildren(\n children: Node[],\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n return emitNodesExpression(children, aliasEnv, env);\n}\n\nfunction templateUsesJsx(root: RootNode): boolean {\n if (root.children.length === 0) {\n return false;\n }\n if (root.children.length > 1) {\n return true;\n }\n return nodeUsesJsx(root.children[0]);\n}\n\nfunction nodeUsesJsx(node: Node): boolean {\n if (node.type === \"Element\" || node.type === \"Text\" || node.type === \"Component\") {\n return true;\n }\n if (node.type === \"Expression\" || node.type === \"JSXPassthrough\") {\n return false;\n }\n if (node.type === \"Conditional\") {\n return node.branches.some((branch) => branchUsesJsx(branch));\n }\n if (node.type === \"For\") {\n return node.body.some((child) => nodeUsesJsx(child));\n }\n return false;\n}\n\nfunction branchUsesJsx(branch: ConditionalBranch): boolean {\n if (!branch.body.length) {\n return false;\n }\n return branch.body.some((child) => nodeUsesJsx(child));\n}\n\nfunction emitNodeInJsx(\n node: Node,\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n if (node.type === \"Text\") {\n return emitText(node, env);\n }\n if (node.type === \"Expression\") {\n return `{${emitExpressionValue(node.value, env)}}`;\n }\n if (node.type === \"JSXPassthrough\") {\n return `{${emitJsxExpression(node.expression, env)}}`;\n }\n if (node.type === \"Conditional\") {\n return `{${emitConditionalExpression(node, aliasEnv, env)}}`;\n }\n if (node.type === \"For\") {\n return `{${emitForExpression(node, aliasEnv, env)}}`;\n }\n if (node.type === \"Component\") {\n return wrapWithGuard(emitComponent(node, aliasEnv, env), node.guard, \"jsx\", env);\n }\n return wrapWithGuard(emitElement(node, aliasEnv, env), node.guard, \"jsx\", env);\n}\n\nfunction emitElement(\n node: ElementNode,\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n const expanded = expandClasses(node.classes, aliasEnv);\n const classAttr = expanded.length ? ` className=\"${expanded.join(\" \")}\"` : \"\";\n const attrs = emitAttributes(node.attributes, aliasEnv, env);\n const allAttrs = classAttr + attrs;\n const children = emitChildrenWithSpacing(node.children, aliasEnv, env);\n \n if (children.length > 0) {\n return `<${node.name}${allAttrs}>${children}</${node.name}>`;\n } else {\n return `<${node.name}${allAttrs} />`;\n }\n}\n\nfunction emitComponent(\n node: ComponentNode,\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n const attrs = emitAttributes(node.attributes, aliasEnv, env);\n const slotProps = emitSlotProps(node, aliasEnv, env);\n const allAttrs = `${attrs}${slotProps}`;\n const children = emitChildrenWithSpacing(node.children, aliasEnv, env);\n \n if (children.length > 0) {\n return `<${node.name}${allAttrs}>${children}</${node.name}>`;\n } else {\n return `<${node.name}${allAttrs} />`;\n }\n}\n\nfunction emitChildrenWithSpacing(\n children: Node[],\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n if (children.length === 0) {\n return \"\";\n }\n \n const parts: string[] = [];\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n const emitted = emitNodeInJsx(child, aliasEnv, env);\n parts.push(emitted);\n \n // Add space between text and following element/component\n // but NOT between element/component and element/component\n if (i < children.length - 1) {\n const nextChild = children[i + 1];\n const needsSpace = \n child.type === \"Text\" &&\n (nextChild.type === \"Element\" || nextChild.type === \"Component\" || nextChild.type === \"Expression\" || nextChild.type === \"JSXPassthrough\");\n \n if (needsSpace) {\n parts.push(\" \");\n }\n }\n }\n \n return parts.join(\"\");\n}\n\nfunction emitAttributes(\n attributes: Attribute[],\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n if (attributes.length === 0) {\n return \"\";\n }\n \n return attributes.map(attr => {\n if (attr.value === null) {\n return ` ${attr.name}`;\n }\n return ` ${attr.name}=${emitAttributeValue(attr.value, env)}`;\n }).join(\"\");\n}\n\nfunction emitSlotProps(\n node: ComponentNode,\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n if (!node.slots || node.slots.length === 0) {\n return \"\";\n }\n return node.slots\n .map((slot) => {\n const expr = emitNodesExpression(slot.children, aliasEnv, env);\n return ` ${slot.name}={${expr}}`;\n })\n .join(\"\");\n}\n\nfunction wrapWithGuard(\n rendered: string,\n guard: string | undefined,\n context: \"jsx\" | \"expression\",\n env: TemplateEnv\n): string {\n if (!guard) {\n return rendered;\n }\n const condition = emitExpressionValue(guard, env);\n const expression = `(${condition}) && ${rendered}`;\n return context === \"jsx\" ? `{${expression}}` : expression;\n}\n\nfunction emitForExpression(\n node: ForNode,\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n const arrayExpr = emitExpressionValue(node.arrayExpr, env);\n pushLocals(env, [node.itemName]);\n const body = emitNodesExpression(node.body, aliasEnv, env);\n popLocals(env);\n return `(${arrayExpr} ?? []).map((${node.itemName}) => ${body})`;\n}\n\nfunction expandClasses(\n classes: readonly string[],\n aliasEnv: Map<string, readonly string[]>\n): string[] {\n // Alias expansion is a pure compile-time macro. The parser guarantees diagnostics for\n // undefined aliases, so codegen simply replaces $alias tokens with their literal class list.\n const result: string[] = [];\n for (const cls of classes) {\n const match = cls.match(/^\\$([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!match) {\n result.push(cls);\n continue;\n }\n const aliasClasses = aliasEnv.get(match[1]);\n if (!aliasClasses) {\n continue;\n }\n result.push(...aliasClasses);\n }\n return result;\n}\n\nfunction emitExpressionValue(expression: string, env: TemplateEnv): string {\n return rewriteExpression(expression, env).code;\n}\n\nfunction emitJsxExpression(expression: string, env: TemplateEnv): string {\n const trimmed = expression.trimStart();\n if (trimmed.startsWith(\"<\")) {\n return rewriteJsxExpression(expression, env).code;\n }\n return rewriteExpression(expression, env).code;\n}\n\nfunction emitAttributeValue(value: string, env: TemplateEnv): string {\n const trimmed = value.trim();\n if (trimmed.startsWith(\"\\\"\") || trimmed.startsWith(\"'\")) {\n return value;\n }\n if (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) {\n const inner = trimmed.slice(1, -1);\n const rewritten = rewriteExpression(inner, env).code;\n return `{${rewritten}}`;\n }\n return rewriteExpression(trimmed, env).code;\n}\n\nfunction emitText(node: TextNode, env: TemplateEnv): string {\n if (!node.parts.length) {\n return \"\";\n }\n\n return node.parts\n .map((part) => {\n if (part.type === \"text\") {\n return escapeText(part.value);\n }\n return `{${emitExpressionValue(part.value, env)}}`;\n })\n .join(\"\");\n}\n\nfunction emitConditionalExpression(\n node: ConditionalNode,\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n if (!node.branches.length) {\n return \"null\";\n }\n const first = node.branches[0];\n if (node.branches.length === 1 && first.test) {\n const test = emitExpressionValue(first.test, env);\n return `(${test}) && ${emitBranchExpression(first, aliasEnv, env)}`;\n }\n const hasElse = node.branches[node.branches.length - 1].test === undefined;\n let fallback = hasElse\n ? emitBranchExpression(node.branches[node.branches.length - 1], aliasEnv, env)\n : \"null\";\n const startIndex = hasElse ? node.branches.length - 2 : node.branches.length - 1;\n if (startIndex < 0) {\n return fallback;\n }\n for (let i = startIndex; i >= 0; i--) {\n const branch = node.branches[i];\n const test = branch.test ? emitExpressionValue(branch.test, env) : \"false\";\n fallback = `(${test}) ? ${emitBranchExpression(branch, aliasEnv, env)} : ${fallback}`;\n }\n return fallback;\n}\n\nfunction emitBranchExpression(\n branch: ConditionalBranch,\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n return emitNodesExpression(branch.body, aliasEnv, env);\n}\n\nfunction emitNodesExpression(\n children: Node[],\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n if (children.length === 0) {\n return \"null\";\n }\n if (children.length === 1) {\n return emitSingleNodeExpression(children[0], aliasEnv, env);\n }\n return `<>${children.map((child) => emitNodeInJsx(child, aliasEnv, env)).join(\"\")}</>`;\n}\n\nfunction emitSingleNodeExpression(\n node: Node,\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n if (node.type === \"Expression\") {\n return emitExpressionValue(node.value, env);\n }\n if (node.type === \"JSXPassthrough\") {\n return emitJsxExpression(node.expression, env);\n }\n if (node.type === \"Conditional\") {\n return emitConditionalExpression(node, aliasEnv, env);\n }\n if (node.type === \"For\") {\n return emitForExpression(node, aliasEnv, env);\n }\n if (node.type === \"Element\") {\n return wrapWithGuard(emitElement(node, aliasEnv, env), node.guard, \"expression\", env);\n }\n if (node.type === \"Component\") {\n return wrapWithGuard(emitComponent(node, aliasEnv, env), node.guard, \"expression\", env);\n }\n if (node.type === \"Text\") {\n return `<>${emitNodeInJsx(node, aliasEnv, env)}</>`;\n }\n return emitNodeInJsx(node, aliasEnv, env);\n}\n\nfunction emitPropsType(props: PropsDecl | undefined, flavor: \"jsx\" | \"tsx\"): string {\n if (flavor === \"tsx\") {\n return emitTsPropsType(props);\n }\n return emitJsDocPropsType(props);\n}\n\nfunction emitJsDocPropsType(props?: PropsDecl): string {\n // Emit JS-safe JSDoc typedef (Rollup can parse this, and TS tooling can read it).\n if (!props) {\n return \"/** @typedef {any} Props */\";\n }\n if (!props.fields.length) {\n return \"/** @typedef {{}} Props */\";\n }\n\n // Build an object type like: { foo: string; bar?: number }\n const fields = props.fields\n .map((field) => {\n const optional = field.optional ? \"?\" : \"\";\n return `${field.name}${optional}: ${field.typeText}`;\n })\n .join(\"; \");\n\n return `/** @typedef {{ ${fields} }} Props */`;\n}\n\nfunction emitTsPropsType(props?: PropsDecl): string {\n if (!props || props.fields.length === 0) {\n return \"export type Props = Record<string, never>;\";\n }\n\n const lines = props.fields.map((field) => {\n const optional = field.optional ? \"?\" : \"\";\n return ` ${field.name}${optional}: ${field.typeText};`;\n });\n\n return [\"export interface Props {\", ...lines, \"}\"].join(\"\\n\");\n}\n\nfunction emitPropsDestructure(props?: PropsDecl): string | null {\n if (!props || props.fields.length === 0) {\n return null;\n }\n const names = props.fields.map((field) => field.name);\n return `const { ${names.join(\", \")} } = props ?? {};`;\n}\n\nfunction escapeText(value: string): string {\n return value.replace(/[&<>{}]/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&amp;\";\n case \"<\":\n return \"&lt;\";\n case \">\":\n return \"&gt;\";\n case \"{\":\n return \"&#123;\";\n case \"}\":\n return \"&#125;\";\n default:\n return char;\n }\n });\n}\n","import type {\n Attribute,\n ClassAliasesDecl,\n ElementNode,\n Node,\n RootNode,\n TextNode\n} from \"./ast.ts\";\n\nexport interface HtmlCodegenOptions {\n indent?: string;\n}\n\n// Attribute rendering overview:\n// - renderAttributes flattens classes and AST-provided attributes into `name=\"value\"` strings.\n// - extractStaticAttributeValue peels the literal text from the parser's raw attribute field and hands it to\n// escapeHtmlAttribute so that &, <, >, and \" inside the value are safely encoded.\n// - When inline attributes were parsed as a single chunk (e.g. `src=\"/foo\" alt=\"bar\"`), the chunk's closing quote\n// was treated as part of the literal, causing escapeHtmlAttribute to turn the boundary `\"` into `&quot;` and break\n// subsequent attributes. The logic below isolates the raw value and feeds any leftover attribute text back through\n// the same renderer so only the actual attribute contents are escaped.\n\n/**\n * HTML emitter currently supports only static markup; dynamic expressions and control flow will be added later.\n */\nexport function generateHtml(root: RootNode, options: HtmlCodegenOptions = {}): string {\n const indent = options.indent ?? \" \";\n const aliasEnv = buildClassAliasEnvironment(root.classAliases);\n const rendered = emitNodes(root.children, aliasEnv, indent, 0);\n return rendered.trimEnd();\n}\n\nfunction emitNodes(\n children: Node[],\n aliasEnv: Map<string, readonly string[]>,\n indent: string,\n depth: number\n): string {\n let html = \"\";\n for (const child of children) {\n const chunk = emitNode(child, aliasEnv, indent, depth);\n if (chunk) {\n html += chunk;\n }\n }\n return html;\n}\n\nfunction emitNode(\n node: Node,\n aliasEnv: Map<string, readonly string[]>,\n indent: string,\n depth: number\n): string {\n switch (node.type) {\n case \"Element\":\n return emitElement(node, aliasEnv, indent, depth);\n case \"Text\":\n return emitTextBlock(node, indent, depth);\n default:\n return \"\";\n }\n}\n\nfunction emitElement(\n node: ElementNode,\n aliasEnv: Map<string, readonly string[]>,\n indent: string,\n depth: number\n): string {\n const indentText = indent.repeat(depth);\n const classNames = expandClasses(node.classes, aliasEnv);\n const attrs = renderAttributes(node.attributes, classNames);\n const openTag = `<${node.name}${attrs}>`;\n\n if (node.children.length === 0) {\n return `${indentText}${openTag}</${node.name}>\\n`;\n }\n\n if (node.children.length === 1 && node.children[0].type === \"Text\") {\n const inline = emitInlineText(node.children[0]);\n if (inline !== null) {\n return `${indentText}${openTag}${inline}</${node.name}>\\n`;\n }\n }\n\n const children = emitNodes(node.children, aliasEnv, indent, depth + 1);\n if (!children) {\n return `${indentText}${openTag}</${node.name}>\\n`;\n }\n\n return `${indentText}${openTag}\\n${children}${indentText}</${node.name}>\\n`;\n}\n\nfunction renderAttributes(attributes: Attribute[], classNames: readonly string[]): string {\n const segments: string[] = [];\n if (classNames.length) {\n segments.push(`class=\"${escapeAttributeValue(classNames.join(\" \"))}\"`);\n }\n for (const attr of attributes) {\n if (attr.value === null) {\n segments.push(attr.name);\n continue;\n }\n const literal = extractStaticAttributeValue(attr.value);\n if (literal === null) {\n continue;\n }\n const name = attr.name === \"className\" ? \"class\" : attr.name;\n segments.push(`${name}=\"${escapeAttributeValue(literal)}\"`);\n }\n if (!segments.length) {\n return \"\";\n }\n return \" \" + segments.join(\" \");\n}\n\nfunction emitTextBlock(node: TextNode, indent: string, depth: number): string {\n const inline = emitInlineText(node);\n if (inline === null || inline.trim().length === 0) {\n return \"\";\n }\n return `${indent.repeat(depth)}${inline}\\n`;\n}\n\nfunction emitInlineText(node: TextNode): string | null {\n if (!node.parts.length) {\n return \"\";\n }\n let text = \"\";\n for (const part of node.parts) {\n if (part.type !== \"text\") {\n return null;\n }\n text += escapeStaticText(part.value);\n }\n return text;\n}\n\nfunction extractStaticAttributeValue(raw: string): string | null {\n const trimmed = raw.trim();\n if (trimmed.length < 2) {\n return null;\n }\n const quote = trimmed[0];\n if ((quote !== '\"' && quote !== \"'\") || trimmed[trimmed.length - 1] !== quote) {\n return null;\n }\n const body = trimmed.slice(1, -1);\n let result = \"\";\n let escaping = false;\n for (const char of body) {\n if (escaping) {\n result += unescapeChar(char, quote);\n escaping = false;\n continue;\n }\n if (char === \"\\\\\") {\n escaping = true;\n } else {\n result += char;\n }\n }\n if (escaping) {\n result += \"\\\\\";\n }\n return result;\n}\n\nfunction unescapeChar(char: string, quote: string): string {\n switch (char) {\n case \"n\":\n return \"\\n\";\n case \"r\":\n return \"\\r\";\n case \"t\":\n return \"\\t\";\n case \"\\\\\":\n return \"\\\\\";\n case '\"':\n return '\"';\n case \"'\":\n return \"'\";\n default:\n if (char === quote) {\n return quote;\n }\n return char;\n }\n}\n\nfunction buildClassAliasEnvironment(\n decl?: ClassAliasesDecl\n): Map<string, readonly string[]> {\n const env = new Map<string, readonly string[]>();\n if (!decl) {\n return env;\n }\n for (const alias of decl.aliases) {\n env.set(alias.name, alias.classes);\n }\n return env;\n}\n\nfunction expandClasses(\n classes: readonly string[],\n aliasEnv: Map<string, readonly string[]>\n): string[] {\n const result: string[] = [];\n for (const cls of classes) {\n const match = cls.match(/^\\$([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!match) {\n result.push(cls);\n continue;\n }\n const aliasClasses = aliasEnv.get(match[1]);\n if (!aliasClasses) {\n continue;\n }\n result.push(...aliasClasses);\n }\n return result;\n}\n\nfunction escapeStaticText(value: string): string {\n return value.replace(/[&<>{}]/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&amp;\";\n case \"<\":\n return \"&lt;\";\n case \">\":\n return \"&gt;\";\n case \"{\":\n return \"&#123;\";\n case \"}\":\n return \"&#125;\";\n default:\n return char;\n }\n });\n}\n\nfunction escapeAttributeValue(value: string): string {\n return value.replace(/[\"&<>]/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&amp;\";\n case \"<\":\n return \"&lt;\";\n case \">\":\n return \"&gt;\";\n case '\"':\n return \"&quot;\";\n default:\n return char;\n }\n });\n}\n","export type DiagnosticSeverity = \"error\" | \"warning\";\n\nexport type DiagnosticCode =\n | \"COLLIE001\"\n | \"COLLIE002\"\n | \"COLLIE003\"\n | \"COLLIE004\"\n | \"COLLIE005\"\n | \"COLLIE101\"\n | \"COLLIE102\"\n | \"COLLIE103\"\n | \"COLLIE104\"\n | \"COLLIE105\"\n | \"COLLIE106\"\n | \"COLLIE201\"\n | \"COLLIE202\"\n | \"COLLIE203\"\n | \"COLLIE204\"\n | \"COLLIE205\"\n | \"COLLIE206\"\n | \"COLLIE207\"\n | \"COLLIE208\"\n | \"COLLIE209\"\n | \"COLLIE210\"\n | \"COLLIE211\"\n | \"COLLIE212\"\n | \"COLLIE213\"\n | \"COLLIE301\"\n | \"COLLIE302\"\n | \"COLLIE303\"\n | \"COLLIE304\"\n | \"COLLIE305\"\n | \"COLLIE306\"\n | \"COLLIE307\"\n | \"COLLIE401\"\n | \"COLLIE402\"\n | \"COLLIE501\"\n | \"COLLIE502\"\n | \"COLLIE503\"\n | \"COLLIE601\"\n | \"COLLIE701\"\n | \"COLLIE702\"\n | \"COLLIE703\"\n | \"COLLIE_ID_NOT_PASCAL_CASE\"\n | \"dialect.token.disallowed\"\n | \"dialect.token.nonPreferred\"\n | \"props.missingDeclaration\"\n | \"props.unusedDeclaration\"\n | \"props.style.nonPreferred\"\n | \"props.block.recommendedOrRequired\";\n\nexport interface SourcePos {\n line: number;\n col: number;\n offset: number;\n}\n\nexport interface SourceSpan {\n start: SourcePos;\n end: SourcePos;\n}\n\nexport interface Diagnostic {\n severity: DiagnosticSeverity;\n message: string;\n span?: SourceSpan;\n range?: SourceSpan;\n code?: DiagnosticCode;\n file?: string;\n filePath?: string;\n fix?: DiagnosticFix;\n data?: DiagnosticData;\n}\n\nexport interface DiagnosticFix {\n range: SourceSpan;\n replacementText: string;\n}\n\nexport interface DiagnosticData {\n kind: string;\n [key: string]: unknown;\n}\n\nexport function createSpan(line: number, col: number, length: number, lineOffset: number): SourceSpan {\n const startOffset = lineOffset + col - 1;\n return {\n start: { line, col, offset: startOffset },\n end: { line, col: col + length, offset: startOffset + length }\n };\n}\n","import type {\n ConditionalBranch,\n ConditionalNode,\n ForNode,\n Node,\n RootNode\n} from \"./ast.ts\";\nimport type { Diagnostic, DiagnosticSeverity, SourceSpan } from \"./diagnostics.ts\";\nimport type {\n CollieDiagnosticLevel,\n NormalizedCollieDialectOptions,\n NormalizedCollieDialectTokenRule\n} from \"@collie-lang/config\";\n\ninterface TokenOccurrence {\n kind: \"if\" | \"elseIf\" | \"else\" | \"for\" | \"id\";\n token: string;\n span?: SourceSpan;\n}\n\nexport function enforceDialect(\n root: RootNode,\n config: NormalizedCollieDialectOptions\n): Diagnostic[] {\n const diagnostics: Diagnostic[] = [];\n\n if (root.idToken) {\n diagnostics.push(\n ...evaluateToken(\n { kind: \"id\", token: root.idToken, span: root.idTokenSpan },\n config.tokens.id\n )\n );\n }\n\n walkNodes(root.children, (occurrence) => {\n const rule = config.tokens[occurrence.kind];\n diagnostics.push(...evaluateToken(occurrence, rule));\n });\n\n return diagnostics;\n}\n\nfunction walkNodes(nodes: Node[], onToken: (occurrence: TokenOccurrence) => void): void {\n for (const node of nodes) {\n if (node.type === \"For\") {\n onFor(node, onToken);\n walkNodes(node.body, onToken);\n continue;\n }\n if (node.type === \"Conditional\") {\n onConditional(node, onToken);\n continue;\n }\n if (node.type === \"Element\" || node.type === \"Component\") {\n walkNodes(node.children, onToken);\n if (node.type === \"Component\" && node.slots) {\n for (const slot of node.slots) {\n walkNodes(slot.children, onToken);\n }\n }\n continue;\n }\n }\n}\n\nfunction onFor(node: ForNode, onToken: (occurrence: TokenOccurrence) => void): void {\n if (!node.token) {\n return;\n }\n onToken({ kind: \"for\", token: node.token, span: node.tokenSpan });\n}\n\nfunction onConditional(\n node: ConditionalNode,\n onToken: (occurrence: TokenOccurrence) => void\n): void {\n for (const branch of node.branches) {\n onBranch(branch, onToken);\n walkNodes(branch.body, onToken);\n }\n}\n\nfunction onBranch(\n branch: ConditionalBranch,\n onToken: (occurrence: TokenOccurrence) => void\n): void {\n if (!branch.token || !branch.kind) {\n return;\n }\n onToken({ kind: branch.kind, token: branch.token, span: branch.tokenSpan });\n}\n\nfunction evaluateToken(\n occurrence: TokenOccurrence,\n rule: NormalizedCollieDialectTokenRule\n): Diagnostic[] {\n const diagnostics: Diagnostic[] = [];\n const used = occurrence.token;\n const preferred = rule.preferred;\n const isAllowed = rule.allow.includes(used);\n\n if (!isAllowed) {\n const severity = levelToSeverity(rule.onDisallowed);\n if (severity) {\n diagnostics.push(\n createDialectDiagnostic(\n \"dialect.token.disallowed\",\n severity,\n used,\n preferred,\n occurrence.span,\n `Token \"${used}\" is not allowed for ${occurrence.kind}. Preferred: \"${preferred}\".`\n )\n );\n }\n return diagnostics;\n }\n\n if (used !== preferred) {\n const severity = levelToSeverity(rule.onDisallowed);\n if (severity) {\n diagnostics.push(\n createDialectDiagnostic(\n \"dialect.token.nonPreferred\",\n severity,\n used,\n preferred,\n occurrence.span,\n `Token \"${used}\" is allowed but not preferred for ${occurrence.kind}. Preferred: \"${preferred}\".`\n )\n );\n }\n }\n\n return diagnostics;\n}\n\nfunction createDialectDiagnostic(\n code: \"dialect.token.disallowed\" | \"dialect.token.nonPreferred\",\n severity: DiagnosticSeverity,\n used: string,\n preferred: string,\n span: SourceSpan | undefined,\n message: string\n): Diagnostic {\n const fix = span\n ? {\n range: span,\n replacementText: preferred\n }\n : undefined;\n\n return {\n severity,\n code,\n message: message.replace(/\\\\s+/g, \" \"),\n span,\n fix\n };\n}\n\nfunction levelToSeverity(level: CollieDiagnosticLevel): DiagnosticSeverity | null {\n if (level === \"off\") {\n return null;\n }\n if (level === \"error\") {\n return \"error\";\n }\n return \"warning\";\n}\n","import type {\n Attribute,\n ConditionalNode,\n ElementNode,\n ComponentNode,\n ForNode,\n Node,\n PropsField,\n RootNode,\n TextNode\n} from \"./ast.ts\";\nimport type { Diagnostic, DiagnosticSeverity, SourceSpan } from \"./diagnostics.ts\";\nimport type { CollieDiagnosticLevel, NormalizedCollieDialectPropsOptions } from \"@collie-lang/config\";\nimport { createTemplateEnv, rewriteExpression, rewriteJsxExpression } from \"./rewrite.ts\";\n\ninterface UsageOccurrence {\n name: string;\n kind: \"local\" | \"namespace\";\n index: number;\n length: number;\n}\n\ninterface UsageTracker {\n span?: SourceSpan;\n count: number;\n}\n\nconst IGNORED_IDENTIFIERS = new Set([\n \"null\",\n \"undefined\",\n \"true\",\n \"false\",\n \"NaN\",\n \"Infinity\",\n \"this\",\n \"props\"\n]);\n\nconst RESERVED_KEYWORDS = new Set([\n \"await\",\n \"break\",\n \"case\",\n \"catch\",\n \"class\",\n \"const\",\n \"continue\",\n \"debugger\",\n \"default\",\n \"delete\",\n \"do\",\n \"else\",\n \"enum\",\n \"export\",\n \"extends\",\n \"false\",\n \"finally\",\n \"for\",\n \"function\",\n \"if\",\n \"import\",\n \"in\",\n \"instanceof\",\n \"let\",\n \"new\",\n \"null\",\n \"return\",\n \"super\",\n \"switch\",\n \"this\",\n \"throw\",\n \"true\",\n \"try\",\n \"typeof\",\n \"var\",\n \"void\",\n \"while\",\n \"with\",\n \"yield\"\n]);\n\nexport function enforceProps(\n root: RootNode,\n propsConfig: NormalizedCollieDialectPropsOptions\n): Diagnostic[] {\n const diagnostics: Diagnostic[] = [];\n const declaredProps = new Map<string, PropsField>();\n const usedLocal = new Map<string, UsageTracker>();\n const usedNamespace = new Map<string, UsageTracker>();\n const usedAny = new Set<string>();\n const missingReported = new Set<string>();\n const localStyleReported = new Set<string>();\n const namespaceStyleReported = new Set<string>();\n\n if (root.props?.fields) {\n for (const field of root.props.fields) {\n declaredProps.set(field.name, field);\n }\n }\n\n const preferStyle = propsConfig.preferAccessStyle;\n const flagLocalStyle = !propsConfig.allowDeclaredLocals || preferStyle === \"namespace\";\n const flagNamespaceStyle = !propsConfig.allowPropsNamespace || preferStyle === \"locals\";\n\n const walkNodes = (nodes: Node[], locals: Set<string>): void => {\n for (const node of nodes) {\n if (node.type === \"Conditional\") {\n handleConditional(node, locals);\n continue;\n }\n if (node.type === \"For\") {\n handleFor(node, locals);\n continue;\n }\n if (node.type === \"Expression\") {\n handleExpression(node.value, node.span, locals);\n continue;\n }\n if (node.type === \"JSXPassthrough\") {\n handleExpression(node.expression, node.span, locals);\n continue;\n }\n if (node.type === \"Text\") {\n handleText(node.parts, locals);\n continue;\n }\n if (node.type === \"Element\") {\n handleElement(node, locals);\n continue;\n }\n if (node.type === \"Component\") {\n handleComponent(node, locals);\n continue;\n }\n }\n };\n\n const handleConditional = (node: ConditionalNode, locals: Set<string>): void => {\n for (const branch of node.branches) {\n if (branch.test) {\n handleExpression(branch.test, branch.testSpan, locals);\n }\n walkNodes(branch.body, locals);\n }\n };\n\n const handleFor = (node: ForNode, locals: Set<string>): void => {\n handleExpression(node.arrayExpr, node.arrayExprSpan, locals);\n const nextLocals = new Set(locals);\n nextLocals.add(node.itemName);\n walkNodes(node.body, nextLocals);\n };\n\n const handleElement = (node: ElementNode, locals: Set<string>): void => {\n if (node.guard) {\n handleExpression(node.guard, node.guardSpan, locals);\n }\n handleAttributes(node.attributes, locals);\n walkNodes(node.children, locals);\n };\n\n const handleComponent = (node: ComponentNode, locals: Set<string>): void => {\n if (node.guard) {\n handleExpression(node.guard, node.guardSpan, locals);\n }\n handleAttributes(node.attributes, locals);\n if (node.slots) {\n for (const slot of node.slots) {\n walkNodes(slot.children, locals);\n }\n }\n walkNodes(node.children, locals);\n };\n\n const handleText = (parts: TextNode[\"parts\"], locals: Set<string>): void => {\n for (const part of parts) {\n if (part.type === \"expr\") {\n handleExpression(part.value, part.span, locals);\n }\n }\n };\n\n const handleAttributes = (attributes: Attribute[], locals: Set<string>): void => {\n for (const attr of attributes) {\n if (!attr.value) continue;\n const trimmed = attr.value.trim();\n if (!trimmed || trimmed.startsWith(\"'\") || trimmed.startsWith(\"\\\"\")) {\n continue;\n }\n handleExpression(trimmed, undefined, locals);\n }\n };\n\n const handleExpression = (\n expression: string,\n span: SourceSpan | undefined,\n locals: Set<string>\n ): void => {\n const occurrences = scanExpression(expression);\n for (const occurrence of occurrences) {\n const name = occurrence.name;\n if (occurrence.kind === \"local\" && locals.has(name)) {\n continue;\n }\n if (shouldIgnoreIdentifier(name)) {\n continue;\n }\n const usageSpan = span ? offsetSpan(span, occurrence.index, occurrence.length) : undefined;\n if (occurrence.kind === \"namespace\") {\n recordUsage(usedNamespace, name, usageSpan);\n usedAny.add(name);\n if (\n propsConfig.requireDeclarationForLocals &&\n !declaredProps.has(name) &&\n !missingReported.has(name)\n ) {\n const severity = levelToSeverity(propsConfig.diagnostics.missingDeclaration);\n if (severity) {\n diagnostics.push(createMissingDeclarationDiagnostic(name, severity, usageSpan));\n missingReported.add(name);\n }\n }\n if (flagNamespaceStyle && !namespaceStyleReported.has(name)) {\n const severity = levelToSeverity(propsConfig.diagnostics.style);\n if (severity) {\n diagnostics.push(\n createStyleDiagnostic(\n name,\n \"namespace\",\n severity,\n usageSpan,\n propsConfig.allowPropsNamespace\n )\n );\n namespaceStyleReported.add(name);\n }\n }\n continue;\n }\n\n recordUsage(usedLocal, name, usageSpan);\n usedAny.add(name);\n if (\n propsConfig.requireDeclarationForLocals &&\n !declaredProps.has(name) &&\n !missingReported.has(name)\n ) {\n const severity = levelToSeverity(propsConfig.diagnostics.missingDeclaration);\n if (severity) {\n diagnostics.push(createMissingDeclarationDiagnostic(name, severity, usageSpan));\n missingReported.add(name);\n }\n }\n\n if (flagLocalStyle && !localStyleReported.has(name)) {\n const severity = levelToSeverity(propsConfig.diagnostics.style);\n if (severity) {\n diagnostics.push(\n createStyleDiagnostic(name, \"local\", severity, usageSpan, propsConfig.allowDeclaredLocals)\n );\n localStyleReported.add(name);\n }\n }\n }\n };\n\n walkNodes(root.children, new Set());\n\n if (root.props?.fields) {\n for (const field of root.props.fields) {\n if (!usedAny.has(field.name)) {\n const severity = levelToSeverity(propsConfig.diagnostics.unusedDeclaration);\n if (severity) {\n diagnostics.push({\n severity,\n code: \"props.unusedDeclaration\",\n message: `Prop \"${field.name}\" is declared but never used.`,\n span: field.span\n });\n }\n }\n }\n }\n\n if (\n propsConfig.requirePropsBlockWhen.enabled &&\n !root.props &&\n usedAny.size >= propsConfig.requirePropsBlockWhen.minUniquePropsUsed\n ) {\n const severity = levelToSeverity(propsConfig.requirePropsBlockWhen.severity);\n if (severity) {\n diagnostics.push({\n severity,\n code: \"props.block.recommendedOrRequired\",\n message: `Props block recommended: ${usedAny.size} unique prop${usedAny.size === 1 ? \"\" : \"s\"} used.`\n });\n }\n }\n\n return diagnostics;\n}\n\nfunction createMissingDeclarationDiagnostic(\n name: string,\n severity: DiagnosticSeverity,\n span?: SourceSpan\n): Diagnostic {\n return {\n severity,\n code: \"props.missingDeclaration\",\n message: `Prop \\`${name}\\` is used but not declared in \\`#props\\`.`,\n span,\n data: {\n kind: \"addPropDeclaration\",\n propName: name\n }\n };\n}\n\nfunction createStyleDiagnostic(\n name: string,\n kind: \"local\" | \"namespace\",\n severity: DiagnosticSeverity,\n span: SourceSpan | undefined,\n allowed: boolean\n): Diagnostic {\n if (kind === \"namespace\") {\n const message = allowed\n ? `props.${name} is allowed but not preferred; use \"${name}\" instead.`\n : `props.${name} is disabled; use \"${name}\" instead.`;\n return {\n severity,\n code: \"props.style.nonPreferred\",\n message,\n span\n };\n }\n\n const message = allowed\n ? `\"${name}\" is allowed but not preferred; use props.${name} instead.`\n : `\"${name}\" is disabled; use props.${name} instead.`;\n\n return {\n severity,\n code: \"props.style.nonPreferred\",\n message,\n span\n };\n}\n\nfunction recordUsage(map: Map<string, UsageTracker>, name: string, span?: SourceSpan): void {\n const existing = map.get(name);\n if (existing) {\n existing.count += 1;\n return;\n }\n map.set(name, { count: 1, span });\n}\n\nfunction scanExpression(expression: string): UsageOccurrence[] {\n const occurrences: UsageOccurrence[] = [];\n let i = 0;\n let state: \"code\" | \"single\" | \"double\" | \"template\" | \"line\" | \"block\" = \"code\";\n\n while (i < expression.length) {\n const ch = expression[i];\n\n if (state === \"code\") {\n if (ch === \"'\" || ch === \"\\\"\") {\n state = ch === \"'\" ? \"single\" : \"double\";\n i++;\n continue;\n }\n if (ch === \"`\") {\n state = \"template\";\n i++;\n continue;\n }\n if (ch === \"/\" && expression[i + 1] === \"/\") {\n state = \"line\";\n i += 2;\n continue;\n }\n if (ch === \"/\" && expression[i + 1] === \"*\") {\n state = \"block\";\n i += 2;\n continue;\n }\n if (isIdentifierStart(ch)) {\n const start = i;\n i++;\n while (i < expression.length && isIdentifierPart(expression[i])) {\n i++;\n }\n const name = expression.slice(start, i);\n const prevNonSpace = findPreviousNonSpace(expression, start - 1);\n if (name === \"props\" && prevNonSpace !== \".\") {\n const namespace = readNamespaceAccess(expression, i);\n if (namespace) {\n occurrences.push({\n name: namespace.name,\n kind: \"namespace\",\n index: namespace.index,\n length: namespace.name.length\n });\n i = namespace.endIndex;\n continue;\n }\n }\n if (prevNonSpace !== \".\") {\n occurrences.push({ name, kind: \"local\", index: start, length: name.length });\n }\n continue;\n }\n i++;\n continue;\n }\n\n if (state === \"line\") {\n if (ch === \"\\n\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n\n if (state === \"block\") {\n if (ch === \"*\" && expression[i + 1] === \"/\") {\n state = \"code\";\n i += 2;\n continue;\n }\n i++;\n continue;\n }\n\n if (state === \"single\") {\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === \"'\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n\n if (state === \"double\") {\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === \"\\\"\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n\n if (state === \"template\") {\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === \"`\") {\n state = \"code\";\n i++;\n continue;\n }\n i++;\n continue;\n }\n }\n\n return occurrences;\n}\n\nfunction readNamespaceAccess(\n expression: string,\n startIndex: number\n): { name: string; index: number; endIndex: number } | null {\n let i = startIndex;\n while (i < expression.length && /\\s/.test(expression[i])) {\n i++;\n }\n if (expression[i] === \"?\") {\n if (expression[i + 1] !== \".\") {\n return null;\n }\n i += 2;\n } else if (expression[i] === \".\") {\n i++;\n } else {\n return null;\n }\n while (i < expression.length && /\\s/.test(expression[i])) {\n i++;\n }\n if (!isIdentifierStart(expression[i])) {\n return null;\n }\n const propStart = i;\n i++;\n while (i < expression.length && isIdentifierPart(expression[i])) {\n i++;\n }\n return {\n name: expression.slice(propStart, i),\n index: propStart,\n endIndex: i\n };\n}\n\nfunction findPreviousNonSpace(text: string, index: number): string | null {\n for (let i = index; i >= 0; i--) {\n const ch = text[i];\n if (!/\\s/.test(ch)) {\n return ch;\n }\n }\n return null;\n}\n\nfunction isIdentifierStart(ch: string): boolean {\n return /[A-Za-z_$]/.test(ch);\n}\n\nfunction isIdentifierPart(ch: string): boolean {\n return /[A-Za-z0-9_$]/.test(ch);\n}\n\nfunction shouldIgnoreIdentifier(name: string): boolean {\n return IGNORED_IDENTIFIERS.has(name) || RESERVED_KEYWORDS.has(name);\n}\n\nfunction levelToSeverity(level: CollieDiagnosticLevel): DiagnosticSeverity | null {\n if (level === \"off\") {\n return null;\n }\n if (level === \"error\") {\n return \"error\";\n }\n return \"warning\";\n}\n\nfunction offsetSpan(base: SourceSpan, index: number, length: number): SourceSpan {\n const startOffset = base.start.offset + index;\n const startCol = base.start.col + index;\n return {\n start: {\n line: base.start.line,\n col: startCol,\n offset: startOffset\n },\n end: {\n line: base.start.line,\n col: startCol + length,\n offset: startOffset + length\n }\n };\n}\n\n/**\n * Enforce #props diagnostics for the new prop aliases feature.\n * Only runs when root.propsDecls exists.\n */\nexport function enforcePropAliases(root: RootNode): Diagnostic[] {\n // Only run diagnostics if #props block exists\n if (!root.propsDecls || root.propsDecls.length === 0) {\n return [];\n }\n\n const diagnostics: Diagnostic[] = [];\n const declaredProps = new Map(root.propsDecls.map(d => [d.name, d]));\n \n // Collect all usage metadata from expressions throughout the template\n const allUsage = collectTemplateUsage(root);\n \n // D1: Bare identifier used but not declared\n for (const name of allUsage.usedBare) {\n if (!declaredProps.has(name) && !shouldIgnoreForDiagnostics(name)) {\n diagnostics.push({\n severity: \"warning\",\n code: \"props.missingDeclaration\",\n message: `Identifier \"${name}\" is used without \"props.\" but is not declared in #props. Declare \"${name}\" in #props or use \"props.${name}\".`\n });\n }\n }\n \n // D2: Declared but unused\n for (const [name, decl] of declaredProps) {\n const usedAsBare = allUsage.usedBareAliases.has(name);\n const usedAsProps = allUsage.usedPropsDot.has(name);\n \n if (!usedAsBare && !usedAsProps) {\n diagnostics.push({\n severity: \"warning\",\n code: \"props.unusedDeclaration\",\n message: `Prop \"${name}\" is declared in #props but never used in this template.`,\n span: decl.span\n });\n }\n }\n \n // D3: Declared but used as props.subtitle (unnecessary)\n for (const name of allUsage.usedPropsDot) {\n if (declaredProps.has(name)) {\n diagnostics.push({\n severity: \"warning\",\n code: \"props.style.nonPreferred\",\n message: `\"props.${name}\" is unnecessary because \"${name}\" is declared in #props. Use \"{${name}}\" instead.`\n });\n }\n }\n \n // D4: Callable cue mismatch\n for (const [name, decl] of declaredProps) {\n const isCallable = decl.kind === \"callable\";\n const usedAsCall = allUsage.callSitesBare.has(name);\n const usedAsValue = allUsage.usedBareAliases.has(name) && !usedAsCall;\n \n if (isCallable && usedAsValue) {\n diagnostics.push({\n severity: \"warning\",\n code: \"props.style.nonPreferred\",\n message: `\"${name}\" is declared as callable in #props (${name}()) but used as a value.`\n });\n } else if (!isCallable && usedAsCall) {\n diagnostics.push({\n severity: \"warning\",\n code: \"props.style.nonPreferred\",\n message: `\"${name}\" is declared as a value in #props but used as a function call.`\n });\n }\n }\n \n return diagnostics;\n}\n\n/**\n * Aggregate usage metadata from all expressions in the template.\n */\ninterface TemplateUsage {\n usedBare: Set<string>; // All bare identifiers (not prop aliases)\n usedBareAliases: Set<string>; // Bare identifiers that ARE prop aliases (were rewritten)\n usedPropsDot: Set<string>; // props.<name> usage\n callSitesBare: Set<string>; // Bare identifiers used as calls\n callSitesPropsDot: Set<string>; // props.<name> used as calls\n}\n\nfunction collectTemplateUsage(root: RootNode): TemplateUsage {\n const usage: TemplateUsage = {\n usedBare: new Set(),\n usedBareAliases: new Set(),\n usedPropsDot: new Set(),\n callSitesBare: new Set(),\n callSitesPropsDot: new Set()\n };\n \n const env = createTemplateEnv(root.propsDecls);\n \n function mergeResult(result: any) {\n // Merge usedBare\n for (const name of result.usedBare) {\n usage.usedBare.add(name);\n }\n \n for (const name of result.rewrittenAliases) {\n usage.usedBareAliases.add(name);\n }\n for (const name of result.usedPropsDot) {\n usage.usedPropsDot.add(name);\n }\n for (const name of result.callSitesBare) {\n usage.callSitesBare.add(name);\n }\n for (const name of result.callSitesPropsDot) {\n usage.callSitesPropsDot.add(name);\n }\n }\n \n function analyzeExpression(expr: string | undefined) {\n if (!expr) return;\n const result = rewriteExpression(expr, env);\n mergeResult(result);\n }\n \n function analyzeJsxExpression(expr: string | undefined) {\n if (!expr) return;\n const result = rewriteJsxExpression(expr, env);\n mergeResult(result);\n }\n \n function walkNode(node: Node) {\n switch (node.type) {\n case \"Text\":\n for (const part of node.parts) {\n if (part.type === \"expr\") {\n analyzeExpression(part.value);\n }\n }\n break;\n \n case \"Expression\":\n analyzeExpression(node.value);\n break;\n \n case \"JSXPassthrough\":\n analyzeJsxExpression(node.expression);\n break;\n \n case \"Element\":\n if (node.guard) {\n analyzeExpression(node.guard);\n }\n for (const attr of node.attributes) {\n if (attr.value) {\n analyzeAttributeValue(attr.value);\n }\n }\n for (const child of node.children) {\n walkNode(child);\n }\n break;\n \n case \"Component\":\n if (node.guard) {\n analyzeExpression(node.guard);\n }\n for (const attr of node.attributes) {\n if (attr.value) {\n analyzeAttributeValue(attr.value);\n }\n }\n if (node.slots) {\n for (const slot of node.slots) {\n for (const child of slot.children) {\n walkNode(child);\n }\n }\n }\n for (const child of node.children) {\n walkNode(child);\n }\n break;\n \n case \"Conditional\":\n for (const branch of node.branches) {\n if (branch.test) {\n analyzeExpression(branch.test);\n }\n for (const child of branch.body) {\n walkNode(child);\n }\n }\n break;\n \n case \"For\":\n analyzeExpression(node.arrayExpr);\n // Note: node.itemName is a local, it shadows props\n for (const child of node.body) {\n walkNode(child);\n }\n break;\n }\n }\n \n function analyzeAttributeValue(value: string) {\n const trimmed = value.trim();\n if (trimmed.startsWith('\"') || trimmed.startsWith(\"'\")) {\n return; // String literal\n }\n if (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) {\n const inner = trimmed.slice(1, -1);\n analyzeExpression(inner);\n } else {\n analyzeExpression(trimmed);\n }\n }\n \n // Walk the entire tree\n for (const child of root.children) {\n walkNode(child);\n }\n \n return usage;\n}\n\nfunction shouldIgnoreForDiagnostics(name: string): boolean {\n return IGNORED_IDENTIFIERS.has(name) || RESERVED_KEYWORDS.has(name);\n}\n","import type {\n Attribute,\n ClassAliasDecl,\n ClassAliasesDecl,\n ComponentNode,\n ConditionalBranch,\n ConditionalNode,\n ElementNode,\n ExpressionNode,\n ForNode,\n JSXPassthroughNode,\n Node,\n PropDecl,\n PropsField,\n RootNode,\n SlotBlock,\n TextNode\n} from \"./ast.ts\";\nimport type { NormalizedCollieDialectOptions } from \"@collie-lang/config\";\nimport { type Diagnostic, type DiagnosticCode, type SourceSpan, createSpan } from \"./diagnostics.ts\";\nimport { enforceDialect } from \"./dialect.ts\";\nimport { enforceProps, enforcePropAliases } from \"./props.ts\";\n\nexport interface TemplateUnit {\n id: string;\n rawId: string;\n span?: SourceSpan;\n ast: RootNode;\n diagnostics: Diagnostic[];\n}\n\nexport interface ParseResult {\n templates: TemplateUnit[];\n diagnostics: Diagnostic[];\n}\n\nexport interface ParseOptions {\n dialect?: NormalizedCollieDialectOptions;\n}\n\ninterface ConditionalBranchContext {\n kind: \"ConditionalBranch\";\n owner: ConditionalNode;\n branch: ConditionalBranch;\n children: Node[];\n}\n\ninterface SlotContext {\n kind: \"Slot\";\n owner: ComponentNode;\n slot: SlotBlock;\n children: Node[];\n}\n\ntype ParentNode = RootNode | ElementNode | ComponentNode | ForNode | ConditionalBranchContext | SlotContext;\n\ninterface StackItem {\n node: ParentNode;\n level: number;\n}\n\ninterface BranchLocation {\n branch: ConditionalBranch;\n line: number;\n column: number;\n lineOffset: number;\n length: number;\n}\n\ninterface ConditionalChainState {\n node: ConditionalNode;\n level: number;\n hasElse: boolean;\n}\n\nconst ELEMENT_NAME = /^[A-Za-z][A-Za-z0-9_-]*/;\nconst CLASS_NAME = /^[A-Za-z0-9_$-]+/;\nconst TEMPLATE_ID_PATTERN = /^[A-Za-z][A-Za-z0-9._-]*$/;\n\nfunction getIndentLevel(line: string): number {\n const match = line.match(/^\\s*/);\n return match ? match[0].length / 2 : 0;\n}\n\nfunction getIdValueSpan(\n lineContent: string,\n indent: number,\n lineNumber: number,\n lineOffset: number,\n tokenLength: number,\n valueLength: number\n): SourceSpan | undefined {\n if (valueLength <= 0) {\n return undefined;\n }\n\n let cursor = tokenLength;\n while (cursor < lineContent.length && /\\s/.test(lineContent[cursor])) {\n cursor++;\n }\n if (lineContent[cursor] === \":\" || lineContent[cursor] === \"=\") {\n cursor++;\n while (cursor < lineContent.length && /\\s/.test(lineContent[cursor])) {\n cursor++;\n }\n }\n\n const column = indent + cursor + 1;\n return createSpan(lineNumber, column, valueLength, lineOffset);\n}\n\ninterface TemplateHeader {\n id: string;\n rawId: string;\n span?: SourceSpan;\n bodyStartIndex: number;\n}\n\nexport function parse(source: string, options: ParseOptions = {}): ParseResult {\n const diagnostics: Diagnostic[] = [];\n const templates: TemplateUnit[] = [];\n\n const normalized = source.replace(/\\r\\n?/g, \"\\n\");\n const lines = normalized.split(\"\\n\");\n const lineOffsets = buildLineOffsets(lines);\n\n let currentHeader: TemplateHeader | null = null;\n let sawIdBlock = false;\n const seenIds = new Map<string, SourceSpan | undefined>();\n\n const finalizeTemplate = (endIndex: number): void => {\n if (!currentHeader) {\n return;\n }\n const result = parseTemplateBlock(lines, lineOffsets, currentHeader.bodyStartIndex, endIndex, options);\n const prefixedDiagnostics = prefixDiagnostics(result.diagnostics, currentHeader.id);\n const unit: TemplateUnit = {\n id: currentHeader.id,\n rawId: currentHeader.rawId,\n span: currentHeader.span,\n ast: result.root,\n diagnostics: prefixedDiagnostics\n };\n templates.push(unit);\n diagnostics.push(...prefixedDiagnostics);\n currentHeader = null;\n };\n\n for (let i = 0; i < lines.length; i++) {\n const rawLine = lines[i];\n const lineNumber = i + 1;\n const lineOffset = lineOffsets[i];\n\n if (/^\\s*$/.test(rawLine)) {\n continue;\n }\n\n const indentMatch = rawLine.match(/^\\s*/) ?? [\"\"];\n const indent = indentMatch[0].length;\n const lineContent = rawLine.slice(indent);\n const trimmed = lineContent.trimEnd();\n\n const idMatch = trimmed.match(/^#id\\b(.*)$/);\n if (idMatch) {\n if (indent !== 0) {\n pushDiag(\n diagnostics,\n \"COLLIE701\",\n \"#id directives must appear at the top level.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n continue;\n }\n\n finalizeTemplate(i);\n sawIdBlock = true;\n\n const remainderRaw = idMatch[1] ?? \"\";\n if (remainderRaw && !/^[\\s:=]/.test(remainderRaw)) {\n pushDiag(\n diagnostics,\n \"COLLIE702\",\n 'Invalid #id directive syntax. Use \"#id <id>\".',\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n }\n let valuePart = remainderRaw.trim();\n if (valuePart.startsWith(\"=\") || valuePart.startsWith(\":\")) {\n valuePart = valuePart.slice(1).trim();\n }\n\n const valueSpan = getIdValueSpan(\n lineContent,\n indent,\n lineNumber,\n lineOffset,\n \"#id\".length,\n valuePart.length\n );\n const valueColumn = valueSpan?.start.col ?? indent + 1;\n const valueLength = valueSpan ? valuePart.length : trimmed.length;\n\n if (!valuePart) {\n pushDiag(\n diagnostics,\n \"COLLIE702\",\n \"#id directives must specify an identifier value.\",\n lineNumber,\n valueColumn,\n lineOffset,\n valueLength\n );\n } else if (!TEMPLATE_ID_PATTERN.test(valuePart)) {\n pushDiag(\n diagnostics,\n \"COLLIE702\",\n 'Invalid #id value. IDs must match \"^[A-Za-z][A-Za-z0-9._-]*$\".',\n lineNumber,\n valueColumn,\n lineOffset,\n valueLength\n );\n }\n\n if (valuePart && TEMPLATE_ID_PATTERN.test(valuePart)) {\n const previous = seenIds.get(valuePart);\n if (previous) {\n const previousLine = previous.start.line;\n pushDiag(\n diagnostics,\n \"COLLIE703\",\n `Duplicate #id \"${valuePart}\" (first declared on line ${previousLine}).`,\n lineNumber,\n valueColumn,\n lineOffset,\n valueLength\n );\n } else {\n seenIds.set(valuePart, valueSpan);\n }\n }\n\n currentHeader = {\n id: valuePart,\n rawId: valuePart,\n span: valueSpan,\n bodyStartIndex: i + 1\n };\n continue;\n }\n\n if (!sawIdBlock && !currentHeader) {\n pushDiag(\n diagnostics,\n \"COLLIE701\",\n \"Content before the first #id block is not allowed.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n }\n }\n\n finalizeTemplate(lines.length);\n\n if (!sawIdBlock) {\n pushDiag(\n diagnostics,\n \"COLLIE701\",\n \"A .collie file must contain at least one #id block.\",\n 1,\n 1,\n 0\n );\n }\n\n return { templates, diagnostics };\n}\n\nfunction parseTemplateBlock(\n lines: string[],\n lineOffsets: number[],\n startIndex: number,\n endIndex: number,\n options: ParseOptions\n): { root: RootNode; diagnostics: Diagnostic[] } {\n const diagnostics: Diagnostic[] = [];\n const root: RootNode = { type: \"Root\", children: [] };\n const stack: StackItem[] = [{ node: root, level: -1 }];\n let propsBlockLevel: number | null = null;\n let classesBlockLevel: number | null = null;\n let sawTopLevelTemplateNode = false;\n const conditionalChains = new Map<number, ConditionalChainState>();\n const branchLocations: BranchLocation[] = [];\n\n let i = startIndex;\n\n while (i < endIndex) {\n const rawLine = lines[i];\n const lineNumber = i + 1;\n const lineOffset = lineOffsets[i];\n i++;\n\n if (/^\\s*$/.test(rawLine)) {\n continue;\n }\n\n const tabIndex = rawLine.indexOf(\"\\t\");\n if (tabIndex !== -1) {\n pushDiag(\n diagnostics,\n \"COLLIE001\",\n \"Tabs are not allowed; use spaces for indentation.\",\n lineNumber,\n tabIndex + 1,\n lineOffset\n );\n continue;\n }\n\n const indentMatch = rawLine.match(/^\\s*/) ?? [\"\"];\n const indent = indentMatch[0].length;\n const lineContent = rawLine.slice(indent);\n const trimmed = lineContent.trimEnd();\n\n if (indent % 2 !== 0) {\n pushDiag(\n diagnostics,\n \"COLLIE002\",\n \"Indentation must be multiples of two spaces.\",\n lineNumber,\n indent + 1,\n lineOffset\n );\n continue;\n }\n\n let level = indent / 2;\n\n if (propsBlockLevel !== null && level <= propsBlockLevel) {\n propsBlockLevel = null;\n }\n if (classesBlockLevel !== null && level <= classesBlockLevel) {\n classesBlockLevel = null;\n }\n\n const isInPropsBlock = propsBlockLevel !== null && level > propsBlockLevel;\n const isInClassesBlock = classesBlockLevel !== null && level > classesBlockLevel;\n\n while (stack.length > 1 && stack[stack.length - 1].level >= level) {\n stack.pop();\n }\n\n const parentLevel = stack[stack.length - 1].level;\n if (level > parentLevel + 1 && !isInPropsBlock && !isInClassesBlock) {\n pushDiag(\n diagnostics,\n \"COLLIE003\",\n \"Indentation jumped more than one level.\",\n lineNumber,\n indent + 1,\n lineOffset\n );\n level = parentLevel + 1;\n }\n\n cleanupConditionalChains(conditionalChains, level);\n const isElseIfLine = /^@elseIf\\b/.test(trimmed);\n const isElseLine = /^@else\\b/.test(trimmed) && !isElseIfLine;\n if (!isElseIfLine && !isElseLine) {\n conditionalChains.delete(level);\n }\n\n if (trimmed === \"classes\") {\n if (level !== 0) {\n pushDiag(\n diagnostics,\n \"COLLIE301\",\n \"Classes block must be at the top level.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else if (sawTopLevelTemplateNode) {\n pushDiag(\n diagnostics,\n \"COLLIE302\",\n \"Classes block must appear before any template nodes.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else {\n if (!root.classAliases) {\n root.classAliases = { aliases: [] };\n }\n classesBlockLevel = level;\n }\n continue;\n }\n\n if (trimmed === \"props\") {\n pushDiag(\n diagnostics,\n \"COLLIE103\",\n \"`props` must be declared using `#props`.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n if (level === 0) {\n propsBlockLevel = level;\n }\n continue;\n }\n\n if (trimmed === \"#props\") {\n if (level !== 0) {\n pushDiag(\n diagnostics,\n \"COLLIE102\",\n \"#props block must be at the top level.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else if (root.props) {\n pushDiag(\n diagnostics,\n \"COLLIE101\",\n \"Only one #props block is allowed per #id.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else {\n root.props = { fields: [] };\n root.propsDecls = [];\n }\n if (level === 0) {\n propsBlockLevel = level;\n }\n continue;\n }\n\n if (trimmed === \"@client\") {\n if (level !== 0) {\n pushDiag(\n diagnostics,\n \"COLLIE401\",\n \"@client must appear at the top level before any other blocks.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else if (sawTopLevelTemplateNode) {\n pushDiag(\n diagnostics,\n \"COLLIE401\",\n \"@client must appear before any template nodes.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else if (root.clientComponent) {\n pushDiag(\n diagnostics,\n \"COLLIE402\",\n \"@client can only appear once per file.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else {\n root.clientComponent = true;\n }\n continue;\n }\n\n if (propsBlockLevel !== null && level > propsBlockLevel) {\n if (level !== propsBlockLevel + 1) {\n pushDiag(\n diagnostics,\n \"COLLIE102\",\n \"#props lines must be indented two spaces under the #props header.\",\n lineNumber,\n indent + 1,\n lineOffset\n );\n continue;\n }\n\n const decl = parsePropDecl(lineContent, lineNumber, indent + 1, lineOffset, diagnostics);\n if (decl && root.propsDecls) {\n // Check for duplicates\n const existing = root.propsDecls.find((d) => d.name === decl.name);\n if (existing) {\n pushDiag(\n diagnostics,\n \"COLLIE106\",\n `Duplicate prop declaration \"${decl.name}\".`,\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else {\n root.propsDecls.push(decl);\n }\n }\n continue;\n }\n\n if (classesBlockLevel !== null && level > classesBlockLevel) {\n if (level !== classesBlockLevel + 1) {\n pushDiag(\n diagnostics,\n \"COLLIE303\",\n \"Classes lines must be indented two spaces under the classes header.\",\n lineNumber,\n indent + 1,\n lineOffset\n );\n continue;\n }\n\n const alias = parseClassAliasLine(trimmed, lineNumber, indent + 1, lineOffset, diagnostics);\n if (alias && root.classAliases) {\n root.classAliases.aliases.push(alias);\n }\n continue;\n }\n\n const parent = stack[stack.length - 1].node;\n\n if (trimmed.startsWith(\"@for\")) {\n const forHeader = parseForHeader(\n lineContent,\n lineNumber,\n indent + 1,\n lineOffset,\n diagnostics\n );\n if (!forHeader) {\n continue;\n }\n const forNode: ForNode = {\n type: \"For\",\n itemName: forHeader.itemName,\n arrayExpr: forHeader.arrayExpr,\n body: [],\n token: forHeader.token,\n tokenSpan: forHeader.tokenSpan,\n arrayExprSpan: forHeader.arrayExprSpan\n };\n addChildToParent(parent, forNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n stack.push({ node: forNode, level });\n continue;\n }\n\n if (trimmed.startsWith(\"@if\")) {\n const header = parseConditionalHeader(\n \"if\",\n lineContent,\n lineNumber,\n indent + 1,\n lineOffset,\n diagnostics\n );\n if (!header) {\n continue;\n }\n const chain: ConditionalNode = { type: \"Conditional\", branches: [] };\n const branch: ConditionalBranch = {\n kind: \"if\",\n test: header.test,\n body: [],\n token: header.token,\n tokenSpan: header.tokenSpan,\n testSpan: header.testSpan\n };\n chain.branches.push(branch);\n addChildToParent(parent, chain);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n conditionalChains.set(level, { node: chain, level, hasElse: false });\n branchLocations.push({\n branch,\n line: lineNumber,\n column: indent + 1,\n lineOffset,\n length: header.directiveLength\n });\n if (header.inlineBody) {\n const inlineNode = parseInlineNode(\n header.inlineBody,\n lineNumber,\n header.inlineColumn ?? indent + 1,\n lineOffset,\n diagnostics\n );\n if (inlineNode) {\n branch.body.push(inlineNode);\n }\n } else {\n stack.push({ node: createConditionalBranchContext(chain, branch), level });\n }\n continue;\n }\n\n if (isElseIfLine) {\n const chain = conditionalChains.get(level);\n if (!chain) {\n pushDiag(\n diagnostics,\n \"COLLIE205\",\n \"@elseIf must follow an @if at the same indentation level.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n continue;\n }\n if (chain.hasElse) {\n pushDiag(\n diagnostics,\n \"COLLIE207\",\n \"@elseIf cannot appear after an @else in the same chain.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n continue;\n }\n const header = parseConditionalHeader(\n \"elseIf\",\n lineContent,\n lineNumber,\n indent + 1,\n lineOffset,\n diagnostics\n );\n if (!header) {\n continue;\n }\n const branch: ConditionalBranch = {\n kind: \"elseIf\",\n test: header.test,\n body: [],\n token: header.token,\n tokenSpan: header.tokenSpan,\n testSpan: header.testSpan\n };\n chain.node.branches.push(branch);\n branchLocations.push({\n branch,\n line: lineNumber,\n column: indent + 1,\n lineOffset,\n length: header.directiveLength\n });\n if (header.inlineBody) {\n const inlineNode = parseInlineNode(\n header.inlineBody,\n lineNumber,\n header.inlineColumn ?? indent + 1,\n lineOffset,\n diagnostics\n );\n if (inlineNode) {\n branch.body.push(inlineNode);\n }\n } else {\n stack.push({ node: createConditionalBranchContext(chain.node, branch), level });\n }\n continue;\n }\n\n if (isElseLine) {\n const chain = conditionalChains.get(level);\n if (!chain) {\n pushDiag(\n diagnostics,\n \"COLLIE206\",\n \"@else must follow an @if at the same indentation level.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n continue;\n }\n if (chain.hasElse) {\n pushDiag(\n diagnostics,\n \"COLLIE203\",\n \"An @if chain can only have one @else branch.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n continue;\n }\n const header = parseElseHeader(lineContent, lineNumber, indent + 1, lineOffset, diagnostics);\n if (!header) {\n continue;\n }\n const branch: ConditionalBranch = {\n kind: \"else\",\n test: undefined,\n body: [],\n token: header.token,\n tokenSpan: header.tokenSpan\n };\n chain.node.branches.push(branch);\n chain.hasElse = true;\n branchLocations.push({\n branch,\n line: lineNumber,\n column: indent + 1,\n lineOffset,\n length: header.directiveLength\n });\n if (header.inlineBody) {\n const inlineNode = parseInlineNode(\n header.inlineBody,\n lineNumber,\n header.inlineColumn ?? indent + 1,\n lineOffset,\n diagnostics\n );\n if (inlineNode) {\n branch.body.push(inlineNode);\n }\n } else {\n stack.push({ node: createConditionalBranchContext(chain.node, branch), level });\n }\n continue;\n }\n\n const slotMatch = trimmed.match(/^@([A-Za-z_][A-Za-z0-9_]*)$/);\n if (slotMatch) {\n const slotName = slotMatch[1];\n if (!isComponentNode(parent)) {\n pushDiag(\n diagnostics,\n \"COLLIE501\",\n `Slot '${slotName}' must be a direct child of a component.`,\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n stack.push({ node: createStandaloneSlotContext(slotName), level });\n continue;\n }\n\n if (!parent.slots) {\n parent.slots = [];\n }\n const existing = parent.slots.find((slot) => slot.name === slotName);\n const slotBlock: SlotBlock =\n existing ??\n {\n type: \"Slot\",\n name: slotName,\n children: []\n };\n if (!existing) {\n parent.slots.push(slotBlock);\n } else {\n pushDiag(\n diagnostics,\n \"COLLIE503\",\n `Duplicate slot '${slotName}' inside ${parent.name}.`,\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n }\n stack.push({ node: createSlotContext(parent, slotBlock), level });\n continue;\n }\n\n if (trimmed.startsWith(\"@\")) {\n pushDiag(\n diagnostics,\n \"COLLIE502\",\n \"Invalid slot syntax. Use @slotName on its own line.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n const fallbackName = trimmed.slice(1).split(/\\s+/)[0] || \"slot\";\n stack.push({ node: createStandaloneSlotContext(fallbackName), level });\n continue;\n }\n\n if (lineContent.startsWith(\"=\")) {\n // Check if this starts a multiline JSX block\n const payload = lineContent.slice(1).trim();\n \n // If it's a function or expression that starts with ( or <, collect multiline content\n if (payload.endsWith(\"(\") || payload.endsWith(\"<\") || (i < endIndex && level < getIndentLevel(lines[i]))) {\n // Collect all indented children\n let jsxContent = payload;\n while (i < endIndex) {\n const nextRaw = lines[i];\n const nextIndent = getIndentLevel(nextRaw);\n const nextTrimmed = nextRaw.trim();\n \n // Include lines that are:\n // 1. More indented than the = line (children)\n // 2. At the same level but are just closing parens/braces\n if (nextIndent > level && nextTrimmed.length > 0) {\n jsxContent += \"\\n\" + nextRaw;\n i++;\n } else if (nextIndent === level && /^[)\\]}]+$/.test(nextTrimmed)) {\n // Include closing parens/braces at the same level\n jsxContent += \"\\n\" + nextRaw;\n i++;\n // After the closing paren, we're done\n break;\n } else {\n break;\n }\n }\n \n const jsxNode: JSXPassthroughNode = {\n type: \"JSXPassthrough\",\n expression: jsxContent\n };\n addChildToParent(parent, jsxNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n continue;\n }\n \n const jsxNode = parseJSXPassthrough(lineContent, lineNumber, indent + 1, lineOffset, diagnostics);\n if (jsxNode) {\n addChildToParent(parent, jsxNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n }\n continue;\n }\n\n if (lineContent.startsWith(\"|\")) {\n const textNode = parseTextLine(lineContent, lineNumber, indent + 1, lineOffset, diagnostics);\n if (textNode) {\n addChildToParent(parent, textNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n }\n continue;\n }\n\n if (lineContent.startsWith(\"{{\")) {\n const exprNode = parseExpressionLine(lineContent, lineNumber, indent + 1, lineOffset, diagnostics);\n if (exprNode) {\n addChildToParent(parent, exprNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n }\n continue;\n }\n\n // Check if this line starts an element/component with potential multiline attributes\n let fullLine = trimmed;\n let multilineEnd = i;\n \n if (trimmed.includes(\"(\") && !trimmed.includes(\")\")) {\n // Multiline attributes - collect subsequent lines\n let parenDepth = (trimmed.match(/\\(/g) || []).length - (trimmed.match(/\\)/g) || []).length;\n while (multilineEnd < endIndex && parenDepth > 0) {\n const nextRaw = lines[multilineEnd];\n multilineEnd++;\n fullLine += \"\\n\" + nextRaw;\n parenDepth += (nextRaw.match(/\\(/g) || []).length - (nextRaw.match(/\\)/g) || []).length;\n }\n // Update i to skip the lines we consumed\n i = multilineEnd;\n }\n\n const elementResult = parseElementWithInfo(fullLine, lineNumber, indent + 1, lineOffset, diagnostics);\n if (!elementResult) {\n // Try parsing as text if element parsing failed\n const textNode = parseTextPayload(trimmed, lineNumber, indent + 1, lineOffset, diagnostics);\n if (textNode && textNode.parts.length > 0) {\n addChildToParent(parent, textNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n }\n continue;\n }\n\n const element = elementResult.node;\n let hasIndentedAttributeLines = false;\n if ((element.type === \"Element\" || element.type === \"Component\") && element.children.length === 0) {\n const indentedAttributes = collectIndentedAttributeLines(\n lines,\n lineOffsets,\n i,\n endIndex,\n level,\n diagnostics\n );\n if (indentedAttributes.attributes.length > 0) {\n element.attributes.push(...indentedAttributes.attributes);\n hasIndentedAttributeLines = true;\n }\n i = indentedAttributes.nextIndex;\n }\n\n addChildToParent(parent, element);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n stack.push({ node: element, level });\n if (hasIndentedAttributeLines) {\n // Treat attribute-only lines as an intermediate indent step for children.\n stack.push({ node: element, level: level + 1 });\n }\n }\n\n if (root.classAliases) {\n validateClassAliasDefinitions(root.classAliases, diagnostics);\n }\n validateClassAliasUsages(root, diagnostics);\n\n for (const info of branchLocations) {\n if (info.branch.body.length === 0) {\n pushDiag(\n diagnostics,\n \"COLLIE208\",\n \"Conditional branches must include an inline body or indented block.\",\n info.line,\n info.column,\n info.lineOffset,\n info.length || 3\n );\n }\n }\n\n if (options.dialect) {\n diagnostics.push(...enforceDialect(root, options.dialect));\n diagnostics.push(...enforceProps(root, options.dialect.props));\n }\n \n // Enforce #props alias diagnostics (only when #props exists)\n diagnostics.push(...enforcePropAliases(root));\n\n return { root, diagnostics };\n}\n\nfunction buildLineOffsets(lines: string[]): number[] {\n const offsets: number[] = [];\n let offset = 0;\n for (const line of lines) {\n offsets.push(offset);\n offset += line.length + 1;\n }\n return offsets;\n}\n\nfunction prefixDiagnostics(diagnostics: Diagnostic[], templateId?: string): Diagnostic[] {\n if (!templateId) {\n return diagnostics;\n }\n const prefix = `In template \"${templateId}\": `;\n return diagnostics.map((diag) => {\n if (diag.message.startsWith(prefix)) {\n return diag;\n }\n return { ...diag, message: `${prefix}${diag.message}` };\n });\n}\n\nfunction cleanupConditionalChains(state: Map<number, ConditionalChainState>, level: number): void {\n for (const key of Array.from(state.keys())) {\n if (key > level) {\n state.delete(key);\n }\n }\n}\n\nfunction addChildToParent(parent: ParentNode, child: Node): void {\n if (isForParent(parent)) {\n parent.body.push(child);\n } else {\n parent.children.push(child);\n }\n}\n\nfunction isForParent(parent: ParentNode): parent is ForNode {\n return \"type\" in parent && parent.type === \"For\";\n}\n\nfunction isComponentNode(parent: ParentNode): parent is ComponentNode {\n return \"type\" in parent && parent.type === \"Component\";\n}\n\ninterface ConditionalHeaderResult {\n test?: string;\n inlineBody?: string;\n inlineColumn?: number;\n directiveLength: number;\n token: string;\n tokenSpan?: SourceSpan;\n testSpan?: SourceSpan;\n}\n\nfunction parseConditionalHeader(\n kind: \"if\" | \"elseIf\",\n lineContent: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ConditionalHeaderResult | null {\n const trimmed = lineContent.trimEnd();\n const token = kind === \"if\" ? \"@if\" : \"@elseIf\";\n if (!trimmed.startsWith(token)) {\n pushDiag(\n diagnostics,\n \"COLLIE201\",\n kind === \"if\" ? \"Invalid @if syntax. Use @if (condition).\" : \"Invalid @elseIf syntax. Use @elseIf (condition).\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || token.length\n );\n return null;\n }\n const tokenSpan = createSpan(lineNumber, column, token.length, lineOffset);\n const remainder = trimmed.slice(token.length);\n if (!remainder.trim()) {\n pushDiag(\n diagnostics,\n \"COLLIE201\",\n kind === \"if\" ? \"@if condition cannot be empty.\" : \"@elseIf condition cannot be empty.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || token.length\n );\n return null;\n }\n\n const remainderTrimmed = remainder.trimStart();\n const usesParens = remainderTrimmed.startsWith(\"(\");\n \n // Require parentheses\n if (!usesParens) {\n pushDiag(\n diagnostics,\n \"COLLIE211\",\n kind === \"if\" ? \"@if requires parentheses: @if (condition)\" : \"@elseIf requires parentheses: @elseIf (condition)\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || token.length\n );\n return null;\n }\n \n let testRaw = \"\";\n let remainderRaw = \"\";\n\n const openIndex = trimmed.indexOf(\"(\", token.length);\n const closeIndex = trimmed.lastIndexOf(\")\");\n if (openIndex === -1 || closeIndex <= openIndex) {\n pushDiag(\n diagnostics,\n \"COLLIE212\",\n kind === \"if\" ? \"Unclosed parentheses in @if ( ... )\" : \"Unclosed parentheses in @elseIf ( ... )\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || token.length\n );\n return null;\n }\n testRaw = trimmed.slice(openIndex + 1, closeIndex);\n remainderRaw = trimmed.slice(closeIndex + 1);\n\n const test = testRaw.trim();\n if (!test) {\n pushDiag(\n diagnostics,\n \"COLLIE201\",\n kind === \"if\" ? \"@if condition cannot be empty.\" : \"@elseIf condition cannot be empty.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 3\n );\n return null;\n }\n const testLeadingWhitespace = testRaw.length - testRaw.trimStart().length;\n const testColumn = usesParens\n ? column + trimmed.indexOf(\"(\", token.length) + 1 + testLeadingWhitespace\n : column + token.length + (remainder.length - remainder.trimStart().length) + testLeadingWhitespace;\n const testSpan = createSpan(lineNumber, testColumn, test.length, lineOffset);\n const inlineBody = remainderRaw.trim();\n const remainderOffset = trimmed.length - remainderRaw.length;\n const leadingWhitespace = remainderRaw.length - inlineBody.length;\n const inlineColumn =\n inlineBody.length > 0 ? column + remainderOffset + leadingWhitespace : undefined;\n return {\n test,\n inlineBody: inlineBody.length ? inlineBody : undefined,\n inlineColumn,\n directiveLength: trimmed.length || 3,\n token,\n tokenSpan,\n testSpan\n };\n}\n\nfunction parseElseHeader(\n lineContent: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ConditionalHeaderResult | null {\n const trimmed = lineContent.trimEnd();\n const match = trimmed.match(/^@else\\b(.*)$/);\n if (!match) {\n pushDiag(\n diagnostics,\n \"COLLIE203\",\n \"Invalid @else syntax.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n const token = \"@else\";\n const tokenSpan = createSpan(lineNumber, column, token.length, lineOffset);\n const remainderRaw = match[1] ?? \"\";\n const remainderTrimmed = remainderRaw.trim();\n \n // Reject @else with condition (parentheses)\n if (remainderTrimmed.startsWith(\"(\")) {\n pushDiag(\n diagnostics,\n \"COLLIE213\",\n \"@else does not accept a condition\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n \n const inlineBody = remainderTrimmed;\n const remainderOffset = trimmed.length - remainderRaw.length;\n const leadingWhitespace = remainderRaw.length - inlineBody.length;\n const inlineColumn =\n inlineBody.length > 0 ? column + remainderOffset + leadingWhitespace : undefined;\n return {\n inlineBody: inlineBody.length ? inlineBody : undefined,\n inlineColumn,\n directiveLength: trimmed.length || 4,\n token,\n tokenSpan\n };\n}\n\ninterface ForHeaderResult {\n itemName: string;\n arrayExpr: string;\n token: string;\n tokenSpan?: SourceSpan;\n arrayExprSpan?: SourceSpan;\n}\n\nfunction parseForHeader(\n lineContent: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ForHeaderResult | null {\n const trimmed = lineContent.trimEnd();\n const token = \"@for\";\n \n if (!trimmed.startsWith(token)) {\n pushDiag(\n diagnostics,\n \"COLLIE210\",\n \"Invalid @for syntax. Use @for (item in array).\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n \n const tokenSpan = createSpan(lineNumber, column, token.length, lineOffset);\n const remainder = trimmed.slice(token.length).trimStart();\n \n // Require parentheses\n if (!remainder.startsWith(\"(\")) {\n pushDiag(\n diagnostics,\n \"COLLIE211\",\n \"@for requires parentheses: @for (item in array)\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n \n const openIndex = trimmed.indexOf(\"(\", token.length);\n const closeIndex = trimmed.lastIndexOf(\")\");\n \n if (openIndex === -1 || closeIndex <= openIndex) {\n pushDiag(\n diagnostics,\n \"COLLIE212\",\n \"Unclosed parentheses in @for ( ... )\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n \n const content = trimmed.slice(openIndex + 1, closeIndex).trim();\n const match = content.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s+in\\s+(.+)$/);\n \n if (!match) {\n pushDiag(\n diagnostics,\n \"COLLIE210\",\n \"Invalid @for syntax. Use @for (item in array).\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n \n const itemName = match[1];\n const arrayExprRaw = match[2];\n \n if (!itemName || !arrayExprRaw) {\n pushDiag(\n diagnostics,\n \"COLLIE210\",\n \"Invalid @for syntax. Use @for (item in array).\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n \n const arrayExpr = arrayExprRaw.trim();\n if (!arrayExpr) {\n pushDiag(\n diagnostics,\n \"COLLIE210\",\n \"@for array expression cannot be empty.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n \n const arrayExprLeadingWhitespace = arrayExprRaw.length - arrayExprRaw.trimStart().length;\n const contentStart = openIndex + 1;\n const arrayExprStartInContent = content.length - arrayExprRaw.length;\n const arrayExprColumn = column + contentStart + arrayExprStartInContent + arrayExprLeadingWhitespace;\n const arrayExprSpan = createSpan(lineNumber, arrayExprColumn, arrayExpr.length, lineOffset);\n \n return { itemName, arrayExpr, token, tokenSpan, arrayExprSpan };\n}\n\nfunction parseInlineNode(\n source: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): Node | null {\n const trimmed = source.trim();\n if (!trimmed) {\n return null;\n }\n\n if (trimmed.startsWith(\"|\")) {\n return parseTextLine(trimmed, lineNumber, column, lineOffset, diagnostics);\n }\n\n if (trimmed.startsWith(\"{{\")) {\n return parseExpressionLine(trimmed, lineNumber, column, lineOffset, diagnostics);\n }\n\n if (trimmed.startsWith(\"@\")) {\n pushDiag(\n diagnostics,\n \"COLLIE209\",\n \"Inline conditional bodies may only contain elements, text, or expressions.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length\n );\n return null;\n }\n\n return parseElement(trimmed, lineNumber, column, lineOffset, diagnostics);\n}\n\nfunction createConditionalBranchContext(\n owner: ConditionalNode,\n branch: ConditionalBranch\n): ConditionalBranchContext {\n return {\n kind: \"ConditionalBranch\",\n owner,\n branch,\n children: branch.body\n };\n}\n\nfunction createSlotContext(owner: ComponentNode, slot: SlotBlock): SlotContext {\n return {\n kind: \"Slot\",\n owner,\n slot,\n children: slot.children\n };\n}\n\nfunction createStandaloneSlotContext(name: string): SlotContext {\n const owner: ComponentNode = {\n type: \"Component\",\n name: \"__invalid_slot__\",\n attributes: [],\n children: []\n };\n const slot: SlotBlock = { type: \"Slot\", name, children: [] };\n return createSlotContext(owner, slot);\n}\n\nfunction parseTextLine(\n lineContent: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): TextNode | null {\n const trimmed = lineContent.trimEnd();\n let payload = trimmed;\n let payloadColumn = column;\n\n if (payload.startsWith(\"|\")) {\n payload = payload.slice(1);\n payloadColumn += 1;\n\n if (payload.startsWith(\" \")) {\n payload = payload.slice(1);\n payloadColumn += 1;\n }\n }\n\n return parseTextPayload(payload, lineNumber, payloadColumn, lineOffset, diagnostics);\n}\n\nfunction parseTextPayload(\n payload: string,\n lineNumber: number,\n payloadColumn: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): TextNode | null {\n const parts: TextNode[\"parts\"] = [];\n let cursor = 0;\n let textBuffer = \"\";\n\n const flushText = (): void => {\n if (textBuffer.length) {\n parts.push({ type: \"text\", value: textBuffer });\n textBuffer = \"\";\n }\n };\n\n while (cursor < payload.length) {\n const ch = payload[cursor];\n\n if (ch === \"{\") {\n flushText();\n if (payload[cursor + 1] === \"{\") {\n const exprStart = cursor;\n const exprEnd = payload.indexOf(\"}}\", cursor + 2);\n if (exprEnd === -1) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression must end with }}.\",\n lineNumber,\n payloadColumn + exprStart,\n lineOffset\n );\n textBuffer += payload.slice(exprStart);\n break;\n }\n const inner = payload.slice(exprStart + 2, exprEnd).trim();\n if (!inner) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression cannot be empty.\",\n lineNumber,\n payloadColumn + exprStart,\n lineOffset,\n exprEnd - exprStart\n );\n } else {\n const innerRaw = payload.slice(exprStart + 2, exprEnd);\n const leadingWhitespace = innerRaw.length - innerRaw.trimStart().length;\n const exprColumn = payloadColumn + exprStart + 2 + leadingWhitespace;\n parts.push({\n type: \"expr\",\n value: inner,\n span: createSpan(lineNumber, exprColumn, inner.length, lineOffset)\n });\n }\n cursor = exprEnd + 2;\n continue;\n }\n\n const exprStart = cursor;\n const exprEnd = payload.indexOf(\"}\", cursor + 1);\n if (exprEnd === -1) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression must end with }.\",\n lineNumber,\n payloadColumn + exprStart,\n lineOffset\n );\n textBuffer += payload.slice(exprStart);\n break;\n }\n const inner = payload.slice(exprStart + 1, exprEnd).trim();\n if (!inner) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression cannot be empty.\",\n lineNumber,\n payloadColumn + exprStart,\n lineOffset,\n exprEnd - exprStart\n );\n } else {\n const innerRaw = payload.slice(exprStart + 1, exprEnd);\n const leadingWhitespace = innerRaw.length - innerRaw.trimStart().length;\n const exprColumn = payloadColumn + exprStart + 1 + leadingWhitespace;\n parts.push({\n type: \"expr\",\n value: inner,\n span: createSpan(lineNumber, exprColumn, inner.length, lineOffset)\n });\n }\n cursor = exprEnd + 1;\n continue;\n }\n\n if (ch === \"}\") {\n flushText();\n if (payload[cursor + 1] === \"}\") {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression closing }} must follow an opening {{.\",\n lineNumber,\n payloadColumn + cursor,\n lineOffset,\n 2\n );\n cursor += 2;\n continue;\n }\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression closing } must follow an opening {.\",\n lineNumber,\n payloadColumn + cursor,\n lineOffset\n );\n cursor += 1;\n continue;\n }\n\n textBuffer += ch;\n cursor += 1;\n }\n\n flushText();\n\n return { type: \"Text\", parts };\n}\n\nfunction parseExpressionLine(\n line: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ExpressionNode | null {\n const trimmed = line.trimEnd();\n const closeIndex = trimmed.indexOf(\"}}\");\n if (closeIndex === -1) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Expression lines must end with }}.\",\n lineNumber,\n column,\n lineOffset\n );\n return null;\n }\n\n if (trimmed.slice(closeIndex + 2).trim().length) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Expression lines cannot contain text after the closing }}.\",\n lineNumber,\n column + closeIndex + 2,\n lineOffset\n );\n return null;\n }\n\n const inner = trimmed.slice(2, closeIndex).trim();\n if (!inner) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Expression cannot be empty.\",\n lineNumber,\n column,\n lineOffset,\n closeIndex + 2\n );\n return null;\n }\n const innerRaw = trimmed.slice(2, closeIndex);\n const leadingWhitespace = innerRaw.length - innerRaw.trimStart().length;\n const exprColumn = column + 2 + leadingWhitespace;\n return {\n type: \"Expression\",\n value: inner,\n span: createSpan(lineNumber, exprColumn, inner.length, lineOffset)\n };\n}\n\nfunction parseJSXPassthrough(\n line: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): JSXPassthroughNode | null {\n if (!line.startsWith(\"=\")) {\n return null;\n }\n \n const payload = line.slice(1).trim();\n if (!payload) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"JSX passthrough expression cannot be empty.\",\n lineNumber,\n column,\n lineOffset\n );\n return null;\n }\n\n const rawPayload = line.slice(1);\n const leadingWhitespace = rawPayload.length - rawPayload.trimStart().length;\n const exprColumn = column + 1 + leadingWhitespace;\n\n return {\n type: \"JSXPassthrough\",\n expression: payload,\n span: createSpan(lineNumber, exprColumn, payload.length, lineOffset)\n };\n}\n\n// function parsePropsField(\n// line: string,\n// lineNumber: number,\n// column: number,\n// lineOffset: number,\n// diagnostics: Diagnostic[]\n// ): PropsField | null {\n// const match = line.match(/^([A-Za-z_][A-Za-z0-9_]*)(\\??)\\s*:\\s*(.+)$/);\n// if (!match) {\n// pushDiag(\n// diagnostics,\n// \"COLLIE102\",\n// \"Props lines must be in the form `name[:?] Type`.\",\n// lineNumber,\n// column,\n// lineOffset,\n// Math.max(line.length, 1)\n// );\n// return null;\n// }\n\n// const [, name, optionalFlag, typePart] = match;\n// const typeText = typePart.trim();\n// if (!typeText) {\n// pushDiag(\n// diagnostics,\n// \"COLLIE102\",\n// \"Props lines must provide a type after the colon.\",\n// lineNumber,\n// column,\n// lineOffset,\n// Math.max(line.length, 1)\n// );\n// return null;\n// }\n\n// return {\n// name,\n// optional: optionalFlag === \"?\",\n// typeText,\n// span: createSpan(lineNumber, column, Math.max(line.length, 1), lineOffset)\n// };\n// }\n\nfunction parseClassAliasLine(\n line: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ClassAliasDecl | null {\n const match = line.match(/^([^=]+?)\\s*=\\s*(.+)$/);\n if (!match) {\n pushDiag(\n diagnostics,\n \"COLLIE304\",\n \"Classes lines must be in the form `name = class.tokens`.\",\n lineNumber,\n column,\n lineOffset,\n Math.max(line.length, 1)\n );\n return null;\n }\n\n const rawName = match[1].trim();\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(rawName)) {\n pushDiag(\n diagnostics,\n \"COLLIE305\",\n `Class alias name '${rawName}' must be a valid identifier.`,\n lineNumber,\n column,\n lineOffset,\n Math.max(rawName.length, 1)\n );\n return null;\n }\n\n const rhs = match[2];\n const rhsIndex = line.indexOf(rhs);\n const rhsColumn = rhsIndex >= 0 ? column + rhsIndex : column;\n const classes = parseAliasClasses(rhs, lineNumber, rhsColumn, lineOffset, diagnostics);\n if (!classes.length) {\n return null;\n }\n\n const nameIndex = line.indexOf(rawName);\n const nameColumn = nameIndex >= 0 ? column + nameIndex : column;\n const span = createSpan(lineNumber, nameColumn, rawName.length, lineOffset);\n\n return { name: rawName, classes, span };\n}\n\nfunction parseAliasClasses(\n rhs: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): string[] {\n const trimmed = rhs.trim();\n if (!trimmed) {\n pushDiag(\n diagnostics,\n \"COLLIE304\",\n \"Classes lines must provide one or more class tokens after '='.\",\n lineNumber,\n column,\n lineOffset,\n Math.max(rhs.length, 1)\n );\n return [];\n }\n\n const withoutDotPrefix = trimmed.startsWith(\".\") ? trimmed.slice(1) : trimmed;\n const parts = withoutDotPrefix.split(\".\");\n const classes: string[] = [];\n for (const part of parts) {\n const token = part.trim();\n if (!token) {\n pushDiag(\n diagnostics,\n \"COLLIE304\",\n \"Classes lines must provide one or more class tokens after '='.\",\n lineNumber,\n column,\n lineOffset,\n Math.max(rhs.length, 1)\n );\n return [];\n }\n classes.push(token);\n }\n\n return classes;\n}\n\nfunction validateClassAliasDefinitions(\n classAliases: ClassAliasesDecl,\n diagnostics: Diagnostic[]\n): void {\n const seen = new Map<string, ClassAliasDecl>();\n for (const alias of classAliases.aliases) {\n const previous = seen.get(alias.name);\n if (previous) {\n if (alias.span) {\n diagnostics.push({\n severity: \"error\",\n code: \"COLLIE306\",\n message: `Duplicate class alias '${alias.name}'.`,\n span: alias.span\n });\n } else {\n pushDiag(diagnostics, \"COLLIE306\", `Duplicate class alias '${alias.name}'.`, 1, 1, 0);\n }\n continue;\n }\n seen.set(alias.name, alias);\n }\n}\n\nfunction validateClassAliasUsages(root: RootNode, diagnostics: Diagnostic[]): void {\n const defined = new Set<string>(root.classAliases?.aliases.map((alias) => alias.name) ?? []);\n for (const child of root.children) {\n validateNodeClassAliases(child, defined, diagnostics);\n }\n}\n\nfunction validateNodeClassAliases(\n node: Node,\n defined: Set<string>,\n diagnostics: Diagnostic[]\n): void {\n if (node.type === \"Element\" || node.type === \"Component\") {\n const spans = node.type === \"Element\" ? (node.classSpans ?? []) : [];\n const classes = node.type === \"Element\" ? node.classes : [];\n classes.forEach((cls, index) => {\n const match = cls.match(/^\\$([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!match) {\n return;\n }\n const aliasName = match[1];\n if (defined.has(aliasName)) {\n return;\n }\n const span = spans[index];\n if (span) {\n diagnostics.push({\n severity: \"error\",\n code: \"COLLIE307\",\n message: `Undefined class alias '${aliasName}'.`,\n span\n });\n } else {\n pushDiag(diagnostics, \"COLLIE307\", `Undefined class alias '${aliasName}'.`, 1, 1, 0);\n }\n });\n for (const child of node.children) {\n validateNodeClassAliases(child, defined, diagnostics);\n }\n if (node.type === \"Component\" && node.slots) {\n for (const slot of node.slots) {\n for (const child of slot.children) {\n validateNodeClassAliases(child, defined, diagnostics);\n }\n }\n }\n return;\n }\n\n if (node.type === \"Conditional\") {\n for (const branch of node.branches) {\n for (const child of branch.body) {\n validateNodeClassAliases(child, defined, diagnostics);\n }\n }\n }\n\n if (node.type === \"For\") {\n for (const child of node.body) {\n validateNodeClassAliases(child, defined, diagnostics);\n }\n }\n}\n\ninterface ParsedElementResult {\n node: ElementNode | ComponentNode;\n hasAttributeGroup: boolean;\n}\n\ninterface AttributeTokenParseResult {\n attributes: Attribute[];\n rest: string;\n restColumn: number;\n}\n\nfunction parseAttributeTokensFromStart(\n source: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): AttributeTokenParseResult | null {\n let remaining = source;\n let consumed = 0;\n let parsedAny = false;\n const attributes: Attribute[] = [];\n\n while (remaining.length > 0) {\n if (!/^([A-Za-z][A-Za-z0-9_-]*)\\s*=/.test(remaining)) {\n break;\n }\n parsedAny = true;\n const before = remaining;\n const next = parseAndAddAttribute(\n remaining,\n attributes,\n diagnostics,\n lineNumber,\n column + consumed,\n lineOffset\n );\n if (next.length === before.length) {\n break;\n }\n consumed += before.length - next.length;\n remaining = next;\n }\n\n if (!parsedAny) {\n return null;\n }\n\n return {\n attributes,\n rest: remaining,\n restColumn: column + consumed\n };\n}\n\nfunction parseAttributeLine(\n source: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): Attribute[] | null {\n const result = parseAttributeTokensFromStart(\n source,\n lineNumber,\n column,\n lineOffset,\n diagnostics\n );\n if (!result || result.rest.length > 0) {\n return null;\n }\n return result.attributes;\n}\n\nfunction parseElementWithInfo(\n line: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ParsedElementResult | null {\n let name: string;\n let cursor = 0;\n let hasAttributeGroup = false;\n\n if (line[cursor] === \".\") {\n // Implicit div shorthand (e.g. `.foo` -> `div.foo`)\n name = \"div\";\n } else {\n const nameMatch = line.match(/^([A-Za-z][A-Za-z0-9_]*)/);\n if (!nameMatch) {\n // Don't push diagnostic here - let the caller handle fallback to text\n return null;\n }\n name = nameMatch[1];\n cursor = name.length;\n }\n\n // Check what follows the name\n const nextPart = line.slice(cursor);\n const isComponent = /^[A-Z]/.test(name);\n \n // Components must have parentheses or be at EOL\n if (isComponent && nextPart.length > 0) {\n const trimmedNext = nextPart.trimStart();\n if (trimmedNext.length > 0 && !trimmedNext.startsWith(\"(\")) {\n // This looks like a component name but has no parentheses - probably text\n return null;\n }\n }\n \n // If it's something other than '.', '(', whitespace, or EOL, it's probably not an element\n if (cursor < line.length) {\n const nextChar = line[cursor];\n if (nextChar !== \".\" && nextChar !== \"(\" && !/\\s/.test(nextChar)) {\n // This is probably text, not an element\n return null;\n }\n }\n\n // Parse classes (only for elements, not components)\n const classes: string[] = [];\n const classSpans: SourceSpan[] = [];\n\n if (!isComponent) {\n while (cursor < line.length && line[cursor] === \".\") {\n cursor++; // skip the dot\n const classMatch = line.slice(cursor).match(/^([A-Za-z0-9_$-]+)/);\n if (!classMatch) {\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n \"Class names must contain only letters, numbers, underscores, hyphens, or `$` (for aliases).\",\n lineNumber,\n column + cursor,\n lineOffset\n );\n return null;\n }\n const className = classMatch[1];\n classes.push(className);\n classSpans.push(createSpan(lineNumber, column + cursor, className.length, lineOffset));\n cursor += className.length;\n }\n }\n\n // Parse attributes if parentheses are present\n const attributes: Attribute[] = [];\n if (cursor < line.length && line[cursor] === \"(\") {\n const attrResult = parseAttributes(line, cursor, lineNumber, column, lineOffset, diagnostics);\n if (!attrResult) {\n return null;\n }\n attributes.push(...attrResult.attributes);\n hasAttributeGroup = true;\n cursor = attrResult.endIndex;\n }\n\n // Parse optional guard expression\n let guard: string | undefined;\n let guardSpan: SourceSpan | undefined;\n const guardProbeStart = cursor;\n while (cursor < line.length && /\\s/.test(line[cursor])) {\n cursor++;\n }\n if (cursor < line.length && line[cursor] === \"?\") {\n const guardColumn = column + cursor;\n cursor++;\n const guardRaw = line.slice(cursor);\n const guardExpr = guardRaw.trim();\n if (!guardExpr) {\n pushDiag(\n diagnostics,\n \"COLLIE601\",\n \"Guard expressions require a condition after '?'.\",\n lineNumber,\n guardColumn,\n lineOffset\n );\n } else {\n guard = guardExpr;\n const leadingWhitespace = guardRaw.length - guardRaw.trimStart().length;\n const guardExprColumn = column + cursor + leadingWhitespace;\n guardSpan = createSpan(lineNumber, guardExprColumn, guardExpr.length, lineOffset);\n }\n cursor = line.length;\n } else {\n cursor = guardProbeStart;\n }\n\n // Parse inline text or children\n const restRaw = line.slice(cursor);\n let rest = restRaw.trimStart();\n let restColumn = column + cursor + (restRaw.length - rest.length);\n const children: Node[] = [];\n\n if (rest.length > 0) {\n const inlineAttrs = parseAttributeTokensFromStart(\n rest,\n lineNumber,\n restColumn,\n lineOffset,\n diagnostics\n );\n if (inlineAttrs) {\n attributes.push(...inlineAttrs.attributes);\n rest = inlineAttrs.rest;\n restColumn = inlineAttrs.restColumn;\n }\n\n if (rest.length > 0) {\n if (!rest.startsWith(\"|\")) {\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n \"Inline text must start with '|'.\",\n lineNumber,\n restColumn,\n lineOffset,\n Math.max(rest.length, 1)\n );\n } else {\n let payload = rest.slice(1);\n let payloadColumn = restColumn + 1;\n if (payload.startsWith(\" \")) {\n payload = payload.slice(1);\n payloadColumn += 1;\n }\n const textNode = parseTextPayload(\n payload,\n lineNumber,\n payloadColumn,\n lineOffset,\n diagnostics\n );\n if (textNode) {\n children.push(textNode);\n }\n }\n }\n }\n\n if (isComponent) {\n const component: ComponentNode = {\n type: \"Component\",\n name,\n attributes,\n children\n };\n if (guard) {\n component.guard = guard;\n component.guardSpan = guardSpan;\n }\n return { node: component, hasAttributeGroup };\n } else {\n const element: ElementNode = {\n type: \"Element\",\n name,\n classes,\n attributes,\n children\n };\n if (classSpans.length) {\n element.classSpans = classSpans;\n }\n if (guard) {\n element.guard = guard;\n element.guardSpan = guardSpan;\n }\n return { node: element, hasAttributeGroup };\n }\n}\n\nfunction parseElement(\n line: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ElementNode | ComponentNode | null {\n const result = parseElementWithInfo(line, lineNumber, column, lineOffset, diagnostics);\n return result ? result.node : null;\n}\n\nfunction collectIndentedAttributeLines(\n lines: string[],\n lineOffsets: number[],\n startIndex: number,\n endIndex: number,\n parentLevel: number,\n diagnostics: Diagnostic[]\n): { attributes: Attribute[]; nextIndex: number } {\n const attributes: Attribute[] = [];\n let index = startIndex;\n\n while (index < endIndex) {\n const rawLine = lines[index];\n if (/^\\s*$/.test(rawLine)) {\n break;\n }\n if (rawLine.includes(\"\\t\")) {\n break;\n }\n const indentMatch = rawLine.match(/^\\s*/) ?? [\"\"];\n const indent = indentMatch[0].length;\n if (indent % 2 !== 0) {\n break;\n }\n const level = indent / 2;\n if (level !== parentLevel + 1) {\n break;\n }\n\n const lineContent = rawLine.slice(indent);\n const trimmed = lineContent.trimEnd();\n const leadingWhitespace = trimmed.length - trimmed.trimStart().length;\n const attrLine = trimmed.trimStart();\n if (!attrLine) {\n break;\n }\n\n const lineNumber = index + 1;\n const lineOffset = lineOffsets[index];\n const attrColumn = indent + 1 + leadingWhitespace;\n const lineAttributes = parseAttributeLine(\n attrLine,\n lineNumber,\n attrColumn,\n lineOffset,\n diagnostics\n );\n if (!lineAttributes) {\n break;\n }\n\n attributes.push(...lineAttributes);\n index++;\n }\n\n return { attributes, nextIndex: index };\n}\n\ninterface ParseAttributesResult {\n attributes: Attribute[];\n endIndex: number;\n}\n\nfunction parseAttributes(\n line: string,\n startIndex: number,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ParseAttributesResult | null {\n if (line[startIndex] !== \"(\") {\n return null;\n }\n\n const attributes: Attribute[] = [];\n let cursor = startIndex + 1;\n let depth = 1;\n let attrBuffer = \"\";\n\n // Find the matching closing parenthesis\n while (cursor < line.length && depth > 0) {\n const ch = line[cursor];\n if (ch === \"(\") {\n depth++;\n attrBuffer += ch;\n } else if (ch === \")\") {\n depth--;\n if (depth > 0) {\n attrBuffer += ch;\n }\n } else {\n attrBuffer += ch;\n }\n cursor++;\n }\n\n if (depth !== 0) {\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n \"Unclosed attribute parentheses.\",\n lineNumber,\n column + startIndex,\n lineOffset\n );\n return null;\n }\n\n // Now parse the attributes from the buffer\n const trimmedAttrs = attrBuffer.trim();\n if (trimmedAttrs.length === 0) {\n return { attributes: [], endIndex: cursor };\n }\n\n // Parse each attribute\n // We need to handle multiline attributes properly\n const attrLines = trimmedAttrs.split(\"\\n\");\n let currentAttr = \"\";\n \n for (const attrLine of attrLines) {\n const trimmedLine = attrLine.trim();\n if (trimmedLine.length === 0) continue;\n\n // Check if this starts a new attribute (has an = sign at the top level)\n // or continues a previous one\n const eqIndex = trimmedLine.indexOf(\"=\");\n if (eqIndex > 0 && /^[A-Za-z][A-Za-z0-9_-]*\\s*=/.test(trimmedLine)) {\n // This is a new attribute\n if (currentAttr) {\n // Parse the previous attribute\n let remaining = parseAndAddAttribute(currentAttr, attributes, diagnostics, lineNumber, column, lineOffset);\n // Process any remaining attributes from the previous line\n while (remaining) {\n remaining = parseAndAddAttribute(remaining, attributes, diagnostics, lineNumber, column, lineOffset);\n }\n currentAttr = \"\";\n }\n currentAttr = trimmedLine;\n } else {\n // Continuation of previous attribute\n if (currentAttr) {\n currentAttr += \" \" + trimmedLine;\n } else {\n // Boolean attribute\n currentAttr = trimmedLine;\n }\n }\n }\n\n // Parse the last attribute and any remaining inline attributes\n if (currentAttr) {\n let remaining = parseAndAddAttribute(currentAttr, attributes, diagnostics, lineNumber, column, lineOffset);\n while (remaining) {\n remaining = parseAndAddAttribute(remaining, attributes, diagnostics, lineNumber, column, lineOffset);\n }\n }\n\n return { attributes, endIndex: cursor };\n}\n\n// Scan brace-wrapped attribute values as a single unit, balancing nested delimiters and quoted strings.\nfunction scanBraceAttributeValue(\n source: string,\n diagnostics: Diagnostic[],\n lineNumber: number,\n column: number,\n lineOffset: number\n): { value: string; rest: string } | null {\n if (!source.startsWith(\"{\")) {\n return null;\n }\n\n let braceDepth = 0;\n let parenDepth = 0;\n let bracketDepth = 0;\n let quote: \"'\" | '\"' | \"`\" | null = null;\n let escaped = false;\n\n for (let i = 0; i < source.length; i++) {\n const char = source[i];\n\n if (quote) {\n if (escaped) {\n escaped = false;\n continue;\n }\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (char === quote) {\n quote = null;\n }\n continue;\n }\n\n if (char === '\"' || char === \"'\" || char === \"`\") {\n quote = char;\n continue;\n }\n\n if (char === \"{\") {\n braceDepth++;\n continue;\n }\n if (char === \"}\") {\n braceDepth--;\n if (braceDepth === 0 && parenDepth === 0 && bracketDepth === 0) {\n return { value: source.slice(0, i + 1), rest: source.slice(i + 1).trim() };\n }\n continue;\n }\n if (char === \"(\") {\n parenDepth++;\n continue;\n }\n if (char === \")\") {\n if (parenDepth > 0) {\n parenDepth--;\n }\n continue;\n }\n if (char === \"[\") {\n bracketDepth++;\n continue;\n }\n if (char === \"]\") {\n if (bracketDepth > 0) {\n bracketDepth--;\n }\n }\n }\n\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n \"Unclosed brace in attribute value.\",\n lineNumber,\n column,\n lineOffset\n );\n return null;\n}\n\nfunction parseAndAddAttribute(\n attrStr: string,\n attributes: Attribute[],\n diagnostics: Diagnostic[],\n lineNumber: number,\n column: number,\n lineOffset: number\n): string {\n const trimmed = attrStr.trim();\n \n // Try to match attribute name and equals sign\n const nameMatch = trimmed.match(/^([A-Za-z][A-Za-z0-9_-]*)\\s*=\\s*/);\n if (nameMatch) {\n const attrName = nameMatch[1];\n const afterEquals = trimmed.slice(nameMatch[0].length);\n \n if (afterEquals.length === 0) {\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n `Attribute ${attrName} missing value`,\n lineNumber,\n column,\n lineOffset\n );\n return \"\";\n }\n\n const braceValue = scanBraceAttributeValue(afterEquals, diagnostics, lineNumber, column, lineOffset);\n if (braceValue) {\n attributes.push({ name: attrName, value: braceValue.value });\n return braceValue.rest;\n }\n\n // Extract the quoted value\n const quoteChar = afterEquals[0];\n if (quoteChar === '\"' || quoteChar === \"'\") {\n let i = 1;\n let value = \"\";\n let escaped = false;\n \n while (i < afterEquals.length) {\n const char = afterEquals[i];\n \n if (escaped) {\n value += char;\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === quoteChar) {\n // Found the closing quote\n attributes.push({ name: attrName, value: quoteChar + value + quoteChar });\n // Return remaining text after this attribute\n return afterEquals.slice(i + 1).trim();\n } else {\n value += char;\n }\n i++;\n }\n \n // Unclosed quote\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n `Unclosed quote in attribute ${attrName}`,\n lineNumber,\n column,\n lineOffset\n );\n return \"\";\n } else {\n // Unquoted value - take everything until space or end\n const unquotedMatch = afterEquals.match(/^(\\S+)/);\n if (unquotedMatch) {\n attributes.push({ name: attrName, value: unquotedMatch[1] });\n return afterEquals.slice(unquotedMatch[1].length).trim();\n }\n return \"\";\n }\n } else {\n // Boolean attribute\n const boolMatch = trimmed.match(/^([A-Za-z][A-Za-z0-9_-]*)(\\s+.*)?$/);\n if (boolMatch) {\n attributes.push({ name: boolMatch[1], value: null });\n return boolMatch[2] ? boolMatch[2].trim() : \"\";\n } else {\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n `Invalid attribute syntax: ${trimmed.slice(0, 30)}`,\n lineNumber,\n column,\n lineOffset\n );\n return \"\";\n }\n }\n}\n\nfunction parsePropDecl(\n line: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): PropDecl | null {\n const trimmed = line.trim();\n \n // Check for type hints (not allowed)\n if (trimmed.includes(\":\") || trimmed.includes(\"<\") || trimmed.includes(\"?\")) {\n pushDiag(\n diagnostics,\n \"COLLIE104\",\n 'Types are not supported in #props yet. Use \"name\" or \"name()\".',\n lineNumber,\n column,\n lineOffset,\n trimmed.length\n );\n return null;\n }\n \n // Check for callable form: name()\n const callableMatch = trimmed.match(/^([A-Za-z_$][A-Za-z0-9_$]*)\\(\\)$/);\n if (callableMatch) {\n const name = callableMatch[1];\n const nameStart = line.indexOf(name);\n const nameColumn = column + nameStart;\n return {\n name,\n kind: \"callable\",\n span: createSpan(lineNumber, nameColumn, name.length, lineOffset)\n };\n }\n \n // Check for value form: name\n const valueMatch = trimmed.match(/^([A-Za-z_$][A-Za-z0-9_$]*)$/);\n if (valueMatch) {\n const name = valueMatch[1];\n const nameStart = line.indexOf(name);\n const nameColumn = column + nameStart;\n return {\n name,\n kind: \"value\",\n span: createSpan(lineNumber, nameColumn, name.length, lineOffset)\n };\n }\n \n // Invalid syntax\n pushDiag(\n diagnostics,\n \"COLLIE105\",\n 'Invalid #props declaration. Use \"name\" or \"name()\".',\n lineNumber,\n column,\n lineOffset,\n trimmed.length\n );\n return null;\n}\n\nfunction pushDiag(\n diagnostics: Diagnostic[],\n code: DiagnosticCode,\n message: string,\n line: number,\n column: number,\n lineOffset: number,\n length = 1\n): void {\n diagnostics.push({\n severity: \"error\",\n code,\n message,\n span: createSpan(line, column, Math.max(length, 1), lineOffset)\n });\n}\n","import type { Diagnostic, DiagnosticFix, SourceSpan } from \"./diagnostics.ts\";\n\ninterface FixWithOffsets {\n fix: DiagnosticFix;\n start: number;\n end: number;\n}\n\ninterface FixApplyResult {\n text: string;\n applied: DiagnosticFix[];\n skipped: DiagnosticFix[];\n}\n\nexport function applyFixes(sourceText: string, fixes: DiagnosticFix[]): FixApplyResult {\n const normalized: FixWithOffsets[] = [];\n const skipped: DiagnosticFix[] = [];\n\n for (const fix of fixes) {\n const offsets = getSpanOffsets(fix.range);\n if (!offsets) {\n skipped.push(fix);\n continue;\n }\n if (offsets.start < 0 || offsets.end < offsets.start || offsets.end > sourceText.length) {\n skipped.push(fix);\n continue;\n }\n normalized.push({ fix, start: offsets.start, end: offsets.end });\n }\n\n normalized.sort((a, b) => (a.start === b.start ? a.end - b.end : a.start - b.start));\n\n const accepted: FixWithOffsets[] = [];\n let currentEnd = -1;\n for (const item of normalized) {\n if (item.start < currentEnd) {\n skipped.push(item.fix);\n continue;\n }\n accepted.push(item);\n currentEnd = item.end;\n }\n\n let text = sourceText;\n for (let i = accepted.length - 1; i >= 0; i--) {\n const { start, end, fix } = accepted[i];\n text = `${text.slice(0, start)}${fix.replacementText}${text.slice(end)}`;\n }\n\n return { text, applied: accepted.map((item) => item.fix), skipped };\n}\n\nexport function fixAllFromDiagnostics(\n sourceText: string,\n diagnostics: Diagnostic[]\n): FixApplyResult {\n const fixes = diagnostics.flatMap((diag) => (diag.fix ? [diag.fix] : []));\n return applyFixes(sourceText, fixes);\n}\n\nfunction getSpanOffsets(span: SourceSpan | undefined): { start: number; end: number } | null {\n if (!span) {\n return null;\n }\n const start = span.start?.offset;\n const end = span.end?.offset;\n if (!Number.isFinite(start) || !Number.isFinite(end)) {\n return null;\n }\n return { start, end };\n}\n","import type {\n Attribute,\n ClassAliasesDecl,\n Node,\n PropsDecl,\n RootNode,\n TextNode,\n TextPart\n} from \"./ast.ts\";\nimport type { Diagnostic } from \"./diagnostics.ts\";\nimport { parse } from \"./parser.ts\";\nimport type { TemplateUnit } from \"./parser.ts\";\n\nexport interface FormatOptions {\n indent?: number;\n}\n\nexport interface FormatResult {\n formatted: string;\n diagnostics: Diagnostic[];\n success: boolean;\n}\n\nexport function formatCollie(source: string, options: FormatOptions = {}): FormatResult {\n const indentSize = validateIndentOption(options.indent);\n const normalized = source.replace(/\\r\\n?/g, \"\\n\");\n const parseResult = parse(normalized);\n const diagnostics = normalizeDiagnostics(parseResult.diagnostics);\n const hasErrors = diagnostics.some((diag) => diag.severity === \"error\");\n\n if (hasErrors) {\n return {\n formatted: source,\n diagnostics,\n success: false\n };\n }\n\n const serialized = serializeTemplates(parseResult.templates, indentSize);\n const formatted = ensureTrailingNewline(serialized);\n\n return {\n formatted,\n diagnostics,\n success: true\n };\n}\n\nfunction normalizeDiagnostics(diagnostics: Diagnostic[]): Diagnostic[] {\n return diagnostics.map((diag) => {\n if (diag.range || !diag.span) {\n return diag;\n }\n return {\n ...diag,\n range: diag.span\n };\n });\n}\n\nfunction validateIndentOption(indent?: number): number {\n if (indent === undefined) {\n return 2;\n }\n if (!Number.isFinite(indent) || indent < 1) {\n throw new Error(\"Indent width must be a positive integer.\");\n }\n return Math.floor(indent);\n}\n\nfunction serializeTemplates(templates: TemplateUnit[], indentSize: number): string {\n const lines: string[] = [];\n\n for (const template of templates) {\n if (lines.length && lines[lines.length - 1] !== \"\") {\n lines.push(\"\");\n }\n const idValue = template.rawId || template.id;\n lines.push(cleanLine(`#id ${idValue}`));\n const body = serializeRoot(template.ast, indentSize);\n if (body.trim().length > 0) {\n lines.push(...body.split(\"\\n\"));\n }\n }\n\n while (lines.length && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction serializeRoot(root: RootNode, indentSize: number): string {\n const sections: string[][] = [];\n if (root.classAliases && root.classAliases.aliases.length > 0) {\n sections.push(formatClassAliases(root.classAliases, indentSize));\n }\n if (root.props && root.props.fields.length > 0) {\n sections.push(formatProps(root.props, indentSize));\n }\n if (root.children.length > 0) {\n sections.push(formatNodes(root.children, 0, indentSize));\n }\n\n const lines: string[] = [];\n for (const section of sections) {\n if (!section.length) continue;\n if (lines.length && lines[lines.length - 1] !== \"\") {\n lines.push(\"\");\n }\n for (const line of section) {\n lines.push(line);\n }\n }\n\n while (lines.length && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatClassAliases(decl: ClassAliasesDecl, indentSize: number): string[] {\n const indent = indentString(1, indentSize);\n const lines: string[] = [\"classes\"];\n for (const alias of decl.aliases) {\n const rhs = alias.classes.join(\".\");\n lines.push(cleanLine(`${indent}${alias.name} = ${rhs}`));\n }\n return lines;\n}\n\nfunction formatProps(props: PropsDecl, indentSize: number): string[] {\n const indent = indentString(1, indentSize);\n const lines: string[] = [\"props\"];\n for (const field of props.fields) {\n const optionalFlag = field.optional ? \"?\" : \"\";\n lines.push(cleanLine(`${indent}${field.name}${optionalFlag}: ${field.typeText.trim()}`));\n }\n return lines;\n}\n\nfunction formatNodes(nodes: Node[], level: number, indentSize: number): string[] {\n const lines: string[] = [];\n for (const node of nodes) {\n lines.push(...formatNode(node, level, indentSize));\n }\n return lines;\n}\n\nfunction formatNode(node: Node, level: number, indentSize: number): string[] {\n switch (node.type) {\n case \"Element\":\n return formatElement(node, level, indentSize);\n case \"Component\":\n return formatComponent(node, level, indentSize);\n case \"Text\":\n return [formatTextNode(node, level, indentSize)];\n case \"Expression\":\n return [cleanLine(`${indentString(level, indentSize)}{{ ${node.value} }}`)];\n case \"JSXPassthrough\":\n return formatJsxPassthrough(node.expression, level, indentSize);\n case \"For\":\n return formatFor(node, level, indentSize);\n case \"Conditional\":\n return formatConditional(node, level, indentSize);\n default:\n return [];\n }\n}\n\nfunction formatElement(node: Node & { type: \"Element\" }, level: number, indentSize: number): string[] {\n const indent = indentString(level, indentSize);\n let line = `${indent}${node.name}${formatClassList(node.classes)}`;\n const attrs = formatAttributes(node.attributes);\n if (attrs) {\n line += `(${attrs})`;\n }\n const children = formatNodes(node.children, level + 1, indentSize);\n if (children.length === 0) {\n return [cleanLine(line)];\n }\n return [cleanLine(line), ...children];\n}\n\nfunction formatComponent(node: Node & { type: \"Component\" }, level: number, indentSize: number): string[] {\n const indent = indentString(level, indentSize);\n let line = `${indent}${node.name}`;\n const attrs = formatAttributes(node.attributes);\n if (attrs) {\n line += `(${attrs})`;\n }\n const children = formatNodes(node.children, level + 1, indentSize);\n if (children.length === 0) {\n return [cleanLine(line)];\n }\n return [cleanLine(line), ...children];\n}\n\nfunction formatTextNode(node: TextNode, level: number, indentSize: number): string {\n const indent = indentString(level, indentSize);\n const text = renderTextParts(node.parts);\n return cleanLine(`${indent}| ${text}`);\n}\n\nfunction renderTextParts(parts: TextPart[]): string {\n return parts\n .map((part) => {\n if (part.type === \"text\") {\n return part.value;\n }\n return `{${part.value}}`;\n })\n .join(\"\");\n}\n\nfunction formatJsxPassthrough(expression: string, level: number, indentSize: number): string[] {\n const indent = indentString(level, indentSize);\n const childIndent = indentString(level + 1, indentSize);\n const normalized = expression.replace(/\\r\\n?/g, \"\\n\").trimEnd();\n if (!normalized.trim()) {\n return [cleanLine(`${indent}= ${normalized.trim()}`)];\n }\n const lines = normalized.split(\"\\n\");\n const [first, ...rest] = lines;\n const result: string[] = [cleanLine(`${indent}= ${first.trim()}`)];\n if (rest.length === 0) {\n return result;\n }\n\n const dedent = computeDedent(rest);\n for (const raw of rest) {\n if (!raw.trim()) {\n result.push(\"\");\n continue;\n }\n const withoutIndent = raw.slice(Math.min(dedent, raw.length)).trimEnd();\n result.push(cleanLine(`${childIndent}${withoutIndent}`));\n }\n return result;\n}\n\nfunction computeDedent(lines: string[]): number {\n let min = Number.POSITIVE_INFINITY;\n for (const line of lines) {\n if (!line.trim()) continue;\n const indentMatch = line.match(/^\\s*/);\n const indentLength = indentMatch ? indentMatch[0].length : 0;\n min = Math.min(min, indentLength);\n }\n return Number.isFinite(min) ? min : 0;\n}\n\nfunction formatFor(node: Node & { type: \"For\" }, level: number, indentSize: number): string[] {\n const indent = indentString(level, indentSize);\n const header = cleanLine(`${indent}@for ${node.itemName} in ${node.arrayExpr}`);\n const body = formatNodes(node.body, level + 1, indentSize);\n return body.length ? [header, ...body] : [header];\n}\n\nfunction formatConditional(node: Node & { type: \"Conditional\" }, level: number, indentSize: number): string[] {\n const indent = indentString(level, indentSize);\n const lines: string[] = [];\n node.branches.forEach((branch, index) => {\n let directive: string;\n if (index === 0) {\n directive = `@if (${branch.test ?? \"\"})`;\n } else if (branch.test) {\n directive = `@elseIf (${branch.test})`;\n } else {\n directive = \"@else\";\n }\n lines.push(cleanLine(`${indent}${directive}`));\n const body = formatNodes(branch.body, level + 1, indentSize);\n lines.push(...body);\n });\n return lines;\n}\n\nfunction formatAttributes(attributes: Attribute[]): string {\n if (!attributes.length) {\n return \"\";\n }\n const sorted = [...attributes].sort((a, b) => {\n if (a.name === b.name) return 0;\n if (a.name === \"class\") return -1;\n if (b.name === \"class\") return 1;\n return a.name.localeCompare(b.name);\n });\n return sorted\n .map((attr) => {\n if (attr.value === null) {\n return attr.name;\n }\n return `${attr.name}=${normalizeAttributeValue(attr.value)}`;\n })\n .join(\" \");\n}\n\nfunction normalizeAttributeValue(value: string): string {\n const trimmed = value.trim();\n if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"<\")) {\n return trimmed;\n }\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n return trimmed;\n }\n if (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\")) {\n const inner = trimmed.slice(1, -1).replace(/\"/g, '\\\\\"');\n return `\"${inner}\"`;\n }\n return trimmed;\n}\n\nfunction formatClassList(classes: string[]): string {\n if (!classes.length) return \"\";\n return classes.map((cls) => `.${cls}`).join(\"\");\n}\n\nfunction indentString(level: number, indentSize: number): string {\n return \" \".repeat(level * indentSize);\n}\n\nfunction ensureTrailingNewline(output: string): string {\n const trimmed = output.replace(/\\s+$/g, \"\");\n return trimmed.length ? `${trimmed}\\n` : \"\\n\";\n}\n\nfunction cleanLine(line: string): string {\n return line.replace(/[ \\t]+$/g, \"\");\n}\n","import ts from \"typescript\";\n\nexport interface ConvertTsxOptions {\n filename?: string;\n}\n\nexport interface ConvertTsxResult {\n collie: string;\n warnings: string[];\n}\n\ninterface PropField {\n name: string;\n optional: boolean;\n typeText: string;\n}\n\ninterface ComponentInfo {\n jsxRoot: ts.JsxChild;\n propsTypeName?: string;\n inlineProps?: PropField[];\n defaults: Map<string, string>;\n}\n\ninterface ConverterContext {\n sourceFile: ts.SourceFile;\n warnings: string[];\n}\n\nexport function convertTsxToCollie(source: string, options: ConvertTsxOptions = {}): ConvertTsxResult {\n const filename = options.filename ?? \"input.tsx\";\n const sourceFile = ts.createSourceFile(\n filename,\n source,\n ts.ScriptTarget.Latest,\n true,\n inferScriptKind(filename)\n );\n const warnings: string[] = [];\n const ctx: ConverterContext = { sourceFile, warnings };\n const propDeclarations = collectPropDeclarations(sourceFile);\n const component = findComponentInfo(sourceFile, propDeclarations, ctx);\n if (!component) {\n throw new Error(\"Could not find a component that returns JSX in this file.\");\n }\n\n const propsLines = buildPropsBlock(component, propDeclarations, ctx);\n const templateLines = convertJsxNode(component.jsxRoot, ctx, 0);\n if (!templateLines.length) {\n throw new Error(\"Unable to convert JSX tree to Collie template.\");\n }\n\n const sections: string[] = [];\n if (propsLines.length) {\n sections.push(propsLines.join(\"\\n\"));\n }\n sections.push(templateLines.join(\"\\n\"));\n\n const collie = `${sections.join(\"\\n\\n\").trimEnd()}\\n`;\n return { collie, warnings };\n}\n\nfunction inferScriptKind(filename: string): ts.ScriptKind {\n const dotIndex = filename.lastIndexOf(\".\");\n const ext = dotIndex === -1 ? \"\" : filename.slice(dotIndex).toLowerCase();\n if (ext === \".tsx\") return ts.ScriptKind.TSX;\n if (ext === \".jsx\") return ts.ScriptKind.JSX;\n if (ext === \".ts\") return ts.ScriptKind.TS;\n return ts.ScriptKind.JS;\n}\n\nfunction collectPropDeclarations(sourceFile: ts.SourceFile): Map<string, PropField[]> {\n const map = new Map<string, PropField[]>();\n for (const statement of sourceFile.statements) {\n if (ts.isInterfaceDeclaration(statement) && statement.name) {\n map.set(statement.name.text, extractPropsFromMembers(statement.members, sourceFile));\n } else if (ts.isTypeAliasDeclaration(statement) && ts.isTypeLiteralNode(statement.type)) {\n map.set(statement.name.text, extractPropsFromMembers(statement.type.members, sourceFile));\n }\n }\n return map;\n}\n\nfunction extractPropsFromMembers(members: readonly ts.TypeElement[], sourceFile: ts.SourceFile): PropField[] {\n const fields: PropField[] = [];\n for (const member of members) {\n if (!ts.isPropertySignature(member) || member.name === undefined) {\n continue;\n }\n const name = getPropertyName(member.name, sourceFile);\n if (!name) {\n continue;\n }\n const typeText = member.type ? member.type.getText(sourceFile).trim() : \"any\";\n fields.push({\n name,\n optional: Boolean(member.questionToken),\n typeText\n });\n }\n return fields;\n}\n\nfunction findComponentInfo(\n sourceFile: ts.SourceFile,\n declarations: Map<string, PropField[]>,\n ctx: ConverterContext\n): ComponentInfo | null {\n for (const statement of sourceFile.statements) {\n if (ts.isFunctionDeclaration(statement) && statement.body) {\n const jsx = findJsxReturn(statement.body);\n if (jsx) {\n const defaults = extractDefaultsFromParameters(statement.parameters, ctx);\n const propsInfo = resolvePropsFromParameters(statement.parameters, declarations, ctx);\n return {\n jsxRoot: jsx,\n propsTypeName: propsInfo.typeName,\n inlineProps: propsInfo.inline,\n defaults\n };\n }\n } else if (ts.isVariableStatement(statement)) {\n for (const decl of statement.declarationList.declarations) {\n const init = decl.initializer;\n if (!init) continue;\n if (ts.isArrowFunction(init) || ts.isFunctionExpression(init)) {\n const jsx = init.body ? findJsxInFunctionBody(init.body) : undefined;\n if (!jsx) {\n continue;\n }\n const defaults = extractDefaultsFromParameters(init.parameters, ctx);\n const propsInfo = resolvePropsFromParameters(init.parameters, declarations, ctx);\n if (!propsInfo.typeName && !propsInfo.inline && decl.type) {\n const inferred = resolvePropsFromTypeAnnotation(decl.type, sourceFile, declarations);\n if (inferred.typeName && !propsInfo.typeName) {\n propsInfo.typeName = inferred.typeName;\n }\n if (inferred.inline && !propsInfo.inline) {\n propsInfo.inline = inferred.inline;\n }\n }\n return {\n jsxRoot: jsx,\n propsTypeName: propsInfo.typeName,\n inlineProps: propsInfo.inline,\n defaults\n };\n }\n }\n }\n }\n return null;\n}\n\nfunction resolvePropsFromParameters(\n parameters: readonly ts.ParameterDeclaration[],\n declarations: Map<string, PropField[]>,\n ctx: ConverterContext\n): { typeName?: string; inline?: PropField[] } {\n if (!parameters.length) {\n return {};\n }\n const param = parameters[0];\n if (param.type) {\n const inferred = resolvePropsFromTypeAnnotation(param.type, ctx.sourceFile, declarations);\n if (inferred.inline) {\n return inferred;\n }\n if (inferred.typeName) {\n return inferred;\n }\n }\n return {};\n}\n\nfunction resolvePropsFromTypeAnnotation(\n typeNode: ts.TypeNode,\n sourceFile: ts.SourceFile,\n declarations: Map<string, PropField[]>\n): { typeName?: string; inline?: PropField[] } {\n if (ts.isTypeReferenceNode(typeNode)) {\n const referenced = getTypeReferenceName(typeNode.typeName);\n if (referenced && declarations.has(referenced)) {\n return { typeName: referenced };\n }\n const typeArg = typeNode.typeArguments?.[0];\n if (typeArg) {\n if (ts.isTypeReferenceNode(typeArg)) {\n const nested = getTypeReferenceName(typeArg.typeName);\n if (nested && declarations.has(nested)) {\n return { typeName: nested };\n }\n } else if (ts.isTypeLiteralNode(typeArg)) {\n return { inline: extractPropsFromMembers(typeArg.members, sourceFile) };\n }\n }\n }\n if (ts.isTypeLiteralNode(typeNode)) {\n return { inline: extractPropsFromMembers(typeNode.members, sourceFile) };\n }\n return {};\n}\n\nfunction getTypeReferenceName(typeName: ts.EntityName | ts.Expression): string | undefined {\n if (ts.isIdentifier(typeName)) {\n return typeName.text;\n }\n if (ts.isQualifiedName(typeName)) {\n return typeName.right.text;\n }\n if (ts.isPropertyAccessExpression(typeName)) {\n return getTypeReferenceName(typeName.name);\n }\n return undefined;\n}\n\nfunction findJsxReturn(body: ts.Block): ts.JsxChild | undefined {\n for (const statement of body.statements) {\n if (ts.isReturnStatement(statement) && statement.expression) {\n const jsx = unwrapJsx(statement.expression);\n if (jsx) {\n return jsx;\n }\n }\n }\n return undefined;\n}\n\nfunction findJsxInFunctionBody(body: ts.ConciseBody): ts.JsxChild | undefined {\n if (ts.isBlock(body)) {\n return findJsxReturn(body);\n }\n return unwrapJsx(body);\n}\n\nfunction unwrapJsx(expression: ts.Expression): ts.JsxChild | undefined {\n let current: ts.Expression = expression;\n while (ts.isParenthesizedExpression(current)) {\n current = current.expression;\n }\n if (ts.isJsxElement(current) || ts.isJsxFragment(current) || ts.isJsxSelfClosingElement(current)) {\n return current;\n }\n return undefined;\n}\n\nfunction extractDefaultsFromParameters(\n parameters: readonly ts.ParameterDeclaration[],\n ctx: ConverterContext\n): Map<string, string> {\n const defaults = new Map<string, string>();\n if (!parameters.length) {\n return defaults;\n }\n const param = parameters[0];\n if (!ts.isObjectBindingPattern(param.name)) {\n return defaults;\n }\n for (const element of param.name.elements) {\n if (!element.initializer) {\n continue;\n }\n const propName = getBindingElementPropName(element, ctx.sourceFile);\n if (!propName) {\n ctx.warnings.push(\"Skipping complex destructured default value.\");\n continue;\n }\n defaults.set(propName, element.initializer.getText(ctx.sourceFile).trim());\n }\n return defaults;\n}\n\nfunction getBindingElementPropName(element: ts.BindingElement, sourceFile: ts.SourceFile): string | undefined {\n const prop = element.propertyName;\n if (prop) {\n if (ts.isIdentifier(prop) || ts.isStringLiteral(prop) || ts.isNumericLiteral(prop)) {\n return prop.text;\n }\n return prop.getText(sourceFile);\n }\n if (ts.isIdentifier(element.name)) {\n return element.name.text;\n }\n return undefined;\n}\n\nfunction getPropertyName(name: ts.PropertyName, sourceFile: ts.SourceFile): string | undefined {\n if (ts.isIdentifier(name)) {\n return name.text;\n }\n if (ts.isStringLiteral(name) || ts.isNumericLiteral(name)) {\n return name.text;\n }\n return name.getText(sourceFile);\n}\n\nfunction buildPropsBlock(\n info: ComponentInfo,\n propDeclarations: Map<string, PropField[]>,\n ctx: ConverterContext\n): string[] {\n const fields =\n info.inlineProps ??\n (info.propsTypeName ? propDeclarations.get(info.propsTypeName) ?? [] : undefined) ??\n [];\n if (!fields.length && !info.defaults.size) {\n return [];\n }\n\n const lines = [\"props\"];\n if (fields.length) {\n for (const field of fields) {\n const def = info.defaults.get(field.name);\n let line = ` ${field.name}${field.optional ? \"?\" : \"\"}: ${field.typeText}`;\n if (def) {\n line += ` = ${def}`;\n }\n lines.push(line);\n }\n } else {\n for (const [name, defValue] of info.defaults.entries()) {\n lines.push(` ${name}: any = ${defValue}`);\n }\n }\n return lines;\n}\n\nfunction convertJsxNode(node: ts.JsxChild, ctx: ConverterContext, indent: number): string[] {\n if (ts.isJsxElement(node)) {\n return convertJsxElement(node, ctx, indent);\n }\n if (ts.isJsxSelfClosingElement(node)) {\n return convertJsxSelfClosing(node, ctx, indent);\n }\n if (ts.isJsxFragment(node)) {\n return convertJsxFragment(node, ctx, indent);\n }\n if (ts.isJsxText(node)) {\n return convertJsxText(node, ctx, indent);\n }\n if (ts.isJsxExpression(node)) {\n return convertJsxExpression(node, ctx, indent);\n }\n return [];\n}\n\nfunction convertJsxFragment(fragment: ts.JsxFragment, ctx: ConverterContext, indent: number): string[] {\n const lines: string[] = [];\n for (const child of fragment.children) {\n lines.push(...convertJsxNode(child, ctx, indent));\n }\n return lines;\n}\n\nfunction convertJsxElement(element: ts.JsxElement, ctx: ConverterContext, indent: number): string[] {\n const line = buildElementLine(element.openingElement, ctx, indent);\n const children: string[] = [];\n for (const child of element.children) {\n children.push(...convertJsxNode(child, ctx, indent + 1));\n }\n if (!children.length) {\n return [line];\n }\n return [line, ...children];\n}\n\nfunction convertJsxSelfClosing(element: ts.JsxSelfClosingElement, ctx: ConverterContext, indent: number): string[] {\n return [buildElementLine(element, ctx, indent)];\n}\n\nfunction buildElementLine(element: ts.JsxOpeningLikeElement, ctx: ConverterContext, indent: number): string {\n const indentStr = \" \".repeat(indent);\n const tagName = getTagName(element.tagName, ctx);\n const { classSegments, attributes } = convertAttributes(element.attributes, ctx);\n const classes = classSegments.length ? classSegments.map((cls) => `.${cls}`).join(\"\") : \"\";\n const attrString = attributes.length ? `(${attributes.join(\" \")})` : \"\";\n return `${indentStr}${tagName}${classes}${attrString}`;\n}\n\nfunction getTagName(tag: ts.JsxTagNameExpression, ctx: ConverterContext): string {\n const fallback = tag.getText(ctx.sourceFile);\n if (ts.isIdentifier(tag)) {\n return tag.text;\n }\n if (ts.isPropertyAccessExpression(tag)) {\n const left = getTagName(tag.expression as ts.JsxTagNameExpression, ctx);\n return `${left}.${tag.name.text}`;\n }\n if (tag.kind === ts.SyntaxKind.ThisKeyword) {\n return \"this\";\n }\n if (ts.isJsxNamespacedName(tag)) {\n return `${tag.namespace.text}:${tag.name.text}`;\n }\n return fallback;\n}\n\nfunction convertAttributes(attributes: ts.JsxAttributes, ctx: ConverterContext): {\n classSegments: string[];\n attributes: string[];\n} {\n const classSegments: string[] = [];\n const attrs: string[] = [];\n\n for (const attr of attributes.properties) {\n if (ts.isJsxAttribute(attr)) {\n const attrName = getAttributeName(attr.name, ctx);\n if (!attrName) {\n ctx.warnings.push(\"Skipping unsupported attribute name.\");\n continue;\n }\n if (attrName === \"className\" || attrName === \"class\") {\n const handled = handleClassAttribute(attr, ctx, classSegments, attrs);\n if (!handled) {\n attrs.push(formatAttribute(attrName === \"className\" ? \"className\" : attrName, attr.initializer, ctx));\n }\n continue;\n }\n attrs.push(formatAttribute(attrName, attr.initializer, ctx));\n } else if (ts.isJsxSpreadAttribute(attr)) {\n ctx.warnings.push(\"Spread attributes are not supported and were skipped.\");\n }\n }\n\n return { classSegments, attributes: attrs.filter(Boolean) };\n}\n\nfunction handleClassAttribute(\n attr: ts.JsxAttribute,\n ctx: ConverterContext,\n classSegments: string[],\n attrs: string[]\n): boolean {\n if (!attr.initializer) {\n return false;\n }\n if (ts.isStringLiteral(attr.initializer)) {\n classSegments.push(...splitClassNames(attr.initializer.text));\n return true;\n }\n if (ts.isJsxExpression(attr.initializer) && attr.initializer.expression) {\n const expressionText = attr.initializer.expression.getText(ctx.sourceFile).trim();\n attrs.push(`className={${expressionText}}`);\n return true;\n }\n ctx.warnings.push(\"Unsupported class attribute value; leaving as-is.\");\n return false;\n}\n\nfunction splitClassNames(value: string): string[] {\n return value\n .split(/\\s+/)\n .map((cls) => cls.trim())\n .filter(Boolean);\n}\n\nfunction formatAttribute(\n name: string,\n initializer: ts.JsxAttributeValue | undefined,\n ctx: ConverterContext\n): string {\n if (!initializer) {\n return name;\n }\n if (ts.isStringLiteral(initializer)) {\n return `${name}=\"${initializer.text}\"`;\n }\n if (ts.isJsxExpression(initializer)) {\n if (initializer.expression) {\n const expr = initializer.expression.getText(ctx.sourceFile).trim();\n return `${name}={${expr}}`;\n }\n return name;\n }\n ctx.warnings.push(\"Unsupported JSX attribute value; leaving as-is.\");\n return name;\n}\n\nfunction getAttributeName(name: ts.JsxAttributeName, ctx: ConverterContext): string | null {\n if (ts.isIdentifier(name)) {\n return name.text;\n }\n if (ts.isJsxNamespacedName(name)) {\n return `${name.namespace.text}:${name.name.text}`;\n }\n return null;\n}\n\nfunction convertJsxText(textNode: ts.JsxText, ctx: ConverterContext, indent: number): string[] {\n const text = textNode.getText(ctx.sourceFile).replace(/\\s+/g, \" \").trim();\n if (!text) {\n return [];\n }\n return [`${\" \".repeat(indent)}| ${text}`];\n}\n\nfunction convertJsxExpression(expressionNode: ts.JsxExpression, ctx: ConverterContext, indent: number): string[] {\n if (!expressionNode.expression) {\n return [];\n }\n const exprText = expressionNode.expression.getText(ctx.sourceFile).trim();\n if (!exprText) {\n return [];\n }\n return [`${\" \".repeat(indent)}{{ ${exprText} }}`];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACoBO,SAAS,kBACd,YACa;AACb,QAAM,cAAc,oBAAI,IAA0B;AAClD,MAAI,YAAY;AACd,eAAW,QAAQ,YAAY;AAC7B,kBAAY,IAAI,KAAK,MAAM,KAAK,IAAI;AAAA,IACtC;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA,aAAa,CAAC;AAAA,EAChB;AACF;AAMO,SAAS,WAAW,KAAkB,OAAuB;AAClE,QAAM,SAAS,IAAI,IAAY,KAAK;AACpC,MAAI,YAAY,KAAK,MAAM;AAC7B;AAMO,SAAS,UAAU,KAAwB;AAChD,MAAI,YAAY,IAAI;AACtB;AAMO,SAAS,QAAQ,KAAkB,MAAuB;AAC/D,WAAS,IAAI,IAAI,YAAY,SAAS,GAAG,KAAK,GAAG,KAAK;AACpD,QAAI,IAAI,YAAY,CAAC,EAAE,IAAI,IAAI,GAAG;AAChC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAMO,SAAS,YAAY,KAAkB,MAAuB;AACnE,MAAI,QAAQ,KAAK,IAAI,GAAG;AACtB,WAAO;AAAA,EACT;AACA,SAAO,IAAI,YAAY,IAAI,IAAI;AACjC;AAcA,IAAM,sBAAsB,oBAAI,IAAI;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,oBAAoB,oBAAI,IAAI;AAAA,EAChC;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,CAAC;AAcM,SAAS,kBAAkB,YAAoB,KAAiC;AACrF,MAAI,IAAI;AACR,MAAI,QAAsE;AAC1E,MAAI,SAAS;AAEb,QAAM,WAAW,oBAAI,IAAY;AACjC,QAAM,eAAe,oBAAI,IAAY;AACrC,QAAM,gBAAgB,oBAAI,IAAY;AACtC,QAAM,oBAAoB,oBAAI,IAAY;AAC1C,QAAM,mBAAmB,oBAAI,IAAY;AAEzC,SAAO,IAAI,WAAW,QAAQ;AAC5B,UAAM,KAAK,WAAW,CAAC;AAEvB,QAAI,UAAU,QAAQ;AACpB,UAAI,OAAO,OAAO,OAAO,KAAM;AAC7B,gBAAQ,OAAO,MAAM,WAAW;AAChC,kBAAU;AACV;AACA;AAAA,MACF;AACA,UAAI,OAAO,KAAK;AACd,gBAAQ;AACR,kBAAU;AACV;AACA;AAAA,MACF;AACA,UAAI,OAAO,OAAO,WAAW,IAAI,CAAC,MAAM,KAAK;AAC3C,gBAAQ;AACR,kBAAU;AACV;AACA;AAAA,MACF;AACA,UAAI,OAAO,OAAO,WAAW,IAAI,CAAC,MAAM,KAAK;AAC3C,gBAAQ;AACR,kBAAU;AACV;AACA;AAAA,MACF;AACA,UAAI,kBAAkB,EAAE,GAAG;AACzB,cAAM,QAAQ;AACd;AACA,eAAO,IAAI,WAAW,UAAU,iBAAiB,WAAW,CAAC,CAAC,GAAG;AAC/D;AAAA,QACF;AACA,cAAM,OAAO,WAAW,MAAM,OAAO,CAAC;AACtC,cAAM,eAAe,qBAAqB,YAAY,QAAQ,CAAC;AAC/D,cAAM,eAAe,iBAAiB,YAAY,CAAC;AACnD,cAAM,iBAAiB,iBAAiB;AACxC,cAAM,cAAc,iBAAiB,QAAQ,iBAAiB,OAAO,iBAAiB;AACtF,cAAM,SAAS,iBAAiB;AAGhC,YAAI,iBAAiB,OAAO,SAAS,GAAG;AACtC,gBAAM,aAAa,4BAA4B,YAAY,QAAQ,CAAC;AACpE,cAAI,eAAe,MAAM;AACvB,kBAAM,gBAAgB,WAAW,MAAM,YAAY,QAAQ,CAAC,EAAE,KAAK;AACnE,gBAAI,kBAAkB,SAAS;AAC7B,2BAAa,IAAI,IAAI;AACrB,kBAAI,QAAQ;AACV,kCAAkB,IAAI,IAAI;AAAA,cAC5B;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,YACE,kBACA,eACA,QAAQ,KAAK,IAAI,KACjB,uBAAuB,IAAI,GAC3B;AACA,oBAAU;AACV;AAAA,QACF;AAGA,YAAI,YAAY,KAAK,IAAI,GAAG;AAE1B,oBAAU,SAAS,IAAI;AACvB,2BAAiB,IAAI,IAAI;AACzB,cAAI,QAAQ;AACV,0BAAc,IAAI,IAAI;AAAA,UACxB;AACA;AAAA,QACF;AAGA,iBAAS,IAAI,IAAI;AACjB,YAAI,QAAQ;AACV,wBAAc,IAAI,IAAI;AAAA,QACxB;AACA,kBAAU;AACV;AAAA,MACF;AAEA,gBAAU;AACV;AACA;AAAA,IACF;AAEA,QAAI,UAAU,QAAQ;AACpB,gBAAU;AACV,UAAI,OAAO,MAAM;AACf,gBAAQ;AAAA,MACV;AACA;AACA;AAAA,IACF;AAEA,QAAI,UAAU,SAAS;AACrB,gBAAU;AACV,UAAI,OAAO,OAAO,WAAW,IAAI,CAAC,MAAM,KAAK;AAC3C,kBAAU;AACV,aAAK;AACL,gBAAQ;AACR;AAAA,MACF;AACA;AACA;AAAA,IACF;AAEA,QAAI,UAAU,UAAU;AACtB,gBAAU;AACV,UAAI,OAAO,MAAM;AACf,YAAI,IAAI,IAAI,WAAW,QAAQ;AAC7B,oBAAU,WAAW,IAAI,CAAC;AAC1B,eAAK;AACL;AAAA,QACF;AAAA,MACF;AACA,UAAI,OAAO,KAAK;AACd,gBAAQ;AAAA,MACV;AACA;AACA;AAAA,IACF;AAEA,QAAI,UAAU,UAAU;AACtB,gBAAU;AACV,UAAI,OAAO,MAAM;AACf,YAAI,IAAI,IAAI,WAAW,QAAQ;AAC7B,oBAAU,WAAW,IAAI,CAAC;AAC1B,eAAK;AACL;AAAA,QACF;AAAA,MACF;AACA,UAAI,OAAO,KAAM;AACf,gBAAQ;AAAA,MACV;AACA;AACA;AAAA,IACF;AAEA,QAAI,UAAU,YAAY;AACxB,gBAAU;AACV,UAAI,OAAO,MAAM;AACf,YAAI,IAAI,IAAI,WAAW,QAAQ;AAC7B,oBAAU,WAAW,IAAI,CAAC;AAC1B,eAAK;AACL;AAAA,QACF;AAAA,MACF;AACA,UAAI,OAAO,KAAK;AACd,gBAAQ;AAAA,MACV;AACA;AACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,QAAQ,UAAU,cAAc,eAAe,mBAAmB,iBAAiB;AACpG;AAYO,SAAS,qBAAqB,YAAoB,KAAiC;AACxF,MAAI,SAAS;AACb,MAAI,IAAI;AAER,QAAM,WAAW,oBAAI,IAAY;AACjC,QAAM,eAAe,oBAAI,IAAY;AACrC,QAAM,gBAAgB,oBAAI,IAAY;AACtC,QAAM,oBAAoB,oBAAI,IAAY;AAC1C,QAAM,mBAAmB,oBAAI,IAAY;AAEzC,SAAO,IAAI,WAAW,QAAQ;AAC5B,UAAM,KAAK,WAAW,CAAC;AACvB,QAAI,OAAO,KAAK;AACd,YAAM,cAAc,mBAAmB,YAAY,IAAI,CAAC;AACxD,UAAI,CAAC,aAAa;AAChB,kBAAU,WAAW,MAAM,CAAC;AAC5B;AAAA,MACF;AACA,YAAM,SAAS,kBAAkB,YAAY,SAAS,GAAG;AACzD,gBAAU,IAAI,OAAO,IAAI;AAGzB,iBAAW,QAAQ,OAAO,SAAU,UAAS,IAAI,IAAI;AACrD,iBAAW,QAAQ,OAAO,aAAc,cAAa,IAAI,IAAI;AAC7D,iBAAW,QAAQ,OAAO,cAAe,eAAc,IAAI,IAAI;AAC/D,iBAAW,QAAQ,OAAO,kBAAmB,mBAAkB,IAAI,IAAI;AACvE,iBAAW,QAAQ,OAAO,iBAAkB,kBAAiB,IAAI,IAAI;AAErE,UAAI,YAAY,WAAW;AAC3B;AAAA,IACF;AACA,cAAU;AACV;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,QAAQ,UAAU,cAAc,eAAe,mBAAmB,iBAAiB;AACpG;AAEA,SAAS,mBACP,QACA,YAC8C;AAC9C,MAAI,IAAI;AACR,MAAI,QAAQ;AACZ,MAAI,QAAsE;AAE1E,SAAO,IAAI,OAAO,QAAQ;AACxB,UAAM,KAAK,OAAO,CAAC;AAEnB,QAAI,UAAU,QAAQ;AACpB,UAAI,OAAO,OAAO,OAAO,KAAM;AAC7B,gBAAQ,OAAO,MAAM,WAAW;AAChC;AACA;AAAA,MACF;AACA,UAAI,OAAO,KAAK;AACd,gBAAQ;AACR;AACA;AAAA,MACF;AACA,UAAI,OAAO,OAAO,OAAO,IAAI,CAAC,MAAM,KAAK;AACvC,gBAAQ;AACR,aAAK;AACL;AAAA,MACF;AACA,UAAI,OAAO,OAAO,OAAO,IAAI,CAAC,MAAM,KAAK;AACvC,gBAAQ;AACR,aAAK;AACL;AAAA,MACF;AACA,UAAI,OAAO,KAAK;AACd,iBAAS;AAAA,MACX,WAAW,OAAO,KAAK;AACrB,iBAAS;AACT,YAAI,UAAU,GAAG;AACf,iBAAO,EAAE,SAAS,OAAO,MAAM,YAAY,CAAC,GAAG,UAAU,EAAE;AAAA,QAC7D;AAAA,MACF;AACA;AACA;AAAA,IACF;AAEA,QAAI,UAAU,QAAQ;AACpB,UAAI,OAAO,MAAM;AACf,gBAAQ;AAAA,MACV;AACA;AACA;AAAA,IACF;AAEA,QAAI,UAAU,SAAS;AACrB,UAAI,OAAO,OAAO,OAAO,IAAI,CAAC,MAAM,KAAK;AACvC,aAAK;AACL,gBAAQ;AACR;AAAA,MACF;AACA;AACA;AAAA,IACF;AAEA,QAAI,UAAU,UAAU;AACtB,UAAI,OAAO,MAAM;AACf,aAAK;AACL;AAAA,MACF;AACA,UAAI,OAAO,KAAK;AACd,gBAAQ;AAAA,MACV;AACA;AACA;AAAA,IACF;AAEA,QAAI,UAAU,UAAU;AACtB,UAAI,OAAO,MAAM;AACf,aAAK;AACL;AAAA,MACF;AACA,UAAI,OAAO,KAAM;AACf,gBAAQ;AAAA,MACV;AACA;AACA;AAAA,IACF;AAEA,QAAI,UAAU,YAAY;AACxB,UAAI,OAAO,MAAM;AACf,aAAK;AACL;AAAA,MACF;AACA,UAAI,OAAO,KAAK;AACd,gBAAQ;AAAA,MACV;AACA;AACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,MAAc,OAA8B;AACxE,WAAS,IAAI,OAAO,KAAK,GAAG,KAAK;AAC/B,UAAM,KAAK,KAAK,CAAC;AACjB,QAAI,CAAC,KAAK,KAAK,EAAE,GAAG;AAClB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,MAAc,OAA8B;AACpE,WAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,KAAK;AACxC,UAAM,KAAK,KAAK,CAAC;AACjB,QAAI,CAAC,KAAK,KAAK,EAAE,GAAG;AAClB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,4BAA4B,MAAc,OAA8B;AAE/E,MAAI,IAAI;AACR,SAAO,KAAK,KAAK,KAAK,KAAK,KAAK,CAAC,CAAC,GAAG;AACnC;AAAA,EACF;AACA,MAAI,IAAI,EAAG,QAAO;AAGlB,MAAI,CAAC,iBAAiB,KAAK,CAAC,CAAC,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,KAAK,iBAAiB,KAAK,IAAI,CAAC,CAAC,GAAG;AAC7C;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,IAAqB;AAC9C,SAAO,aAAa,KAAK,EAAE;AAC7B;AAEA,SAAS,iBAAiB,IAAqB;AAC7C,SAAO,gBAAgB,KAAK,EAAE;AAChC;AAEA,SAAS,uBAAuB,MAAuB;AACrD,SAAO,oBAAoB,IAAI,IAAI,KAAK,kBAAkB,IAAI,IAAI;AACpE;;;ACzfO,SAAS,qBAAqB,MAAgB,SAAuC;AAC1F,QAAM,EAAE,SAAS,WAAW,kBAAkB,KAAK,MAAM,IAAI,iBAAiB,MAAM,OAAO;AAC3F,QAAM,QAAkB,CAAC,GAAG,SAAS,SAAS;AAE9C,MAAI,CAAC,OAAO;AACV,UAAM,KAAK,2BAA2B;AAAA,EACxC;AAEA,QAAM,gBAAgB;AAAA,IACpB,QAAQ,yCAAyC;AAAA,EACnD;AACA,MAAI,kBAAkB;AACpB,kBAAc,KAAK,KAAK,gBAAgB,EAAE;AAAA,EAC5C;AACA,gBAAc,KAAK,YAAY,GAAG,KAAK,GAAG;AAC1C,QAAM,KAAK,cAAc,KAAK,IAAI,CAAC;AAEnC,SAAO,MAAM,KAAK,MAAM;AAC1B;AAUA,SAAS,iBACP,MACA,SACa;AACb,QAAM,EAAE,YAAY,OAAO,IAAI;AAC/B,QAAM,QAAQ,WAAW;AAGzB,QAAM,WAAW,2BAA2B,KAAK,YAAY;AAC7D,QAAM,MAAM,kBAAkB,KAAK,UAAU;AAI7C,QAAM,MAAM,mBAAmB,KAAK,UAAU,UAAU,GAAG;AAC3D,QAAM,mBAAmB,qBAAqB,KAAK,KAAK;AAExD,QAAM,UAAoB,CAAC;AAE3B,MAAI,KAAK,iBAAiB;AACxB,YAAQ,KAAK,eAAe;AAAA,EAC9B;AAGA,MAAI,eAAe,aAAa,gBAAgB,IAAI,GAAG;AACrD,YAAQ,KAAK,4BAA4B;AAAA,EAC3C;AAGA,QAAM,YAAY,cAAc,KAAK,OAAO,MAAM;AAElD,SAAO,EAAE,SAAS,WAAW,kBAAkB,KAAK,MAAM;AAC5D;AAEA,SAAS,2BACP,MACgC;AAChC,QAAM,MAAM,oBAAI,IAA+B;AAC/C,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,aAAW,SAAS,KAAK,SAAS;AAChC,QAAI,IAAI,MAAM,MAAM,MAAM,OAAO;AAAA,EACnC;AACA,SAAO;AACT;AAEA,SAAS,mBACP,UACA,UACA,KACQ;AACR,SAAO,oBAAoB,UAAU,UAAU,GAAG;AACpD;AAEA,SAAS,gBAAgB,MAAyB;AAChD,MAAI,KAAK,SAAS,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,SAAO,YAAY,KAAK,SAAS,CAAC,CAAC;AACrC;AAEA,SAAS,YAAY,MAAqB;AACxC,MAAI,KAAK,SAAS,aAAa,KAAK,SAAS,UAAU,KAAK,SAAS,aAAa;AAChF,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,gBAAgB,KAAK,SAAS,kBAAkB;AAChE,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,eAAe;AAC/B,WAAO,KAAK,SAAS,KAAK,CAAC,WAAW,cAAc,MAAM,CAAC;AAAA,EAC7D;AACA,MAAI,KAAK,SAAS,OAAO;AACvB,WAAO,KAAK,KAAK,KAAK,CAAC,UAAU,YAAY,KAAK,CAAC;AAAA,EACrD;AACA,SAAO;AACT;AAEA,SAAS,cAAc,QAAoC;AACzD,MAAI,CAAC,OAAO,KAAK,QAAQ;AACvB,WAAO;AAAA,EACT;AACA,SAAO,OAAO,KAAK,KAAK,CAAC,UAAU,YAAY,KAAK,CAAC;AACvD;AAEA,SAAS,cACP,MACA,UACA,KACQ;AACR,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO,SAAS,MAAM,GAAG;AAAA,EAC3B;AACA,MAAI,KAAK,SAAS,cAAc;AAC9B,WAAO,IAAI,oBAAoB,KAAK,OAAO,GAAG,CAAC;AAAA,EACjD;AACA,MAAI,KAAK,SAAS,kBAAkB;AAClC,WAAO,IAAI,kBAAkB,KAAK,YAAY,GAAG,CAAC;AAAA,EACpD;AACA,MAAI,KAAK,SAAS,eAAe;AAC/B,WAAO,IAAI,0BAA0B,MAAM,UAAU,GAAG,CAAC;AAAA,EAC3D;AACA,MAAI,KAAK,SAAS,OAAO;AACvB,WAAO,IAAI,kBAAkB,MAAM,UAAU,GAAG,CAAC;AAAA,EACnD;AACA,MAAI,KAAK,SAAS,aAAa;AAC7B,WAAO,cAAc,cAAc,MAAM,UAAU,GAAG,GAAG,KAAK,OAAO,OAAO,GAAG;AAAA,EACjF;AACA,SAAO,cAAc,YAAY,MAAM,UAAU,GAAG,GAAG,KAAK,OAAO,OAAO,GAAG;AAC/E;AAEA,SAAS,YACP,MACA,UACA,KACQ;AACR,QAAM,WAAW,cAAc,KAAK,SAAS,QAAQ;AACrD,QAAM,YAAY,SAAS,SAAS,eAAe,SAAS,KAAK,GAAG,CAAC,MAAM;AAC3E,QAAM,QAAQ,eAAe,KAAK,YAAY,UAAU,GAAG;AAC3D,QAAM,WAAW,YAAY;AAC7B,QAAM,WAAW,wBAAwB,KAAK,UAAU,UAAU,GAAG;AAErE,MAAI,SAAS,SAAS,GAAG;AACvB,WAAO,IAAI,KAAK,IAAI,GAAG,QAAQ,IAAI,QAAQ,KAAK,KAAK,IAAI;AAAA,EAC3D,OAAO;AACL,WAAO,IAAI,KAAK,IAAI,GAAG,QAAQ;AAAA,EACjC;AACF;AAEA,SAAS,cACP,MACA,UACA,KACQ;AACR,QAAM,QAAQ,eAAe,KAAK,YAAY,UAAU,GAAG;AAC3D,QAAM,YAAY,cAAc,MAAM,UAAU,GAAG;AACnD,QAAM,WAAW,GAAG,KAAK,GAAG,SAAS;AACrC,QAAM,WAAW,wBAAwB,KAAK,UAAU,UAAU,GAAG;AAErE,MAAI,SAAS,SAAS,GAAG;AACvB,WAAO,IAAI,KAAK,IAAI,GAAG,QAAQ,IAAI,QAAQ,KAAK,KAAK,IAAI;AAAA,EAC3D,OAAO;AACL,WAAO,IAAI,KAAK,IAAI,GAAG,QAAQ;AAAA,EACjC;AACF;AAEA,SAAS,wBACP,UACA,UACA,KACQ;AACR,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,QAAkB,CAAC;AACzB,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,UAAM,QAAQ,SAAS,CAAC;AACxB,UAAM,UAAU,cAAc,OAAO,UAAU,GAAG;AAClD,UAAM,KAAK,OAAO;AAIlB,QAAI,IAAI,SAAS,SAAS,GAAG;AAC3B,YAAM,YAAY,SAAS,IAAI,CAAC;AAChC,YAAM,aACJ,MAAM,SAAS,WACd,UAAU,SAAS,aAAa,UAAU,SAAS,eAAe,UAAU,SAAS,gBAAgB,UAAU,SAAS;AAE3H,UAAI,YAAY;AACd,cAAM,KAAK,GAAG;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,EAAE;AACtB;AAEA,SAAS,eACP,YACA,UACA,KACQ;AACR,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO,WAAW,IAAI,UAAQ;AAC5B,QAAI,KAAK,UAAU,MAAM;AACvB,aAAO,IAAI,KAAK,IAAI;AAAA,IACtB;AACA,WAAO,IAAI,KAAK,IAAI,IAAI,mBAAmB,KAAK,OAAO,GAAG,CAAC;AAAA,EAC7D,CAAC,EAAE,KAAK,EAAE;AACZ;AAEA,SAAS,cACP,MACA,UACA,KACQ;AACR,MAAI,CAAC,KAAK,SAAS,KAAK,MAAM,WAAW,GAAG;AAC1C,WAAO;AAAA,EACT;AACA,SAAO,KAAK,MACT,IAAI,CAAC,SAAS;AACb,UAAM,OAAO,oBAAoB,KAAK,UAAU,UAAU,GAAG;AAC7D,WAAO,IAAI,KAAK,IAAI,KAAK,IAAI;AAAA,EAC/B,CAAC,EACA,KAAK,EAAE;AACZ;AAEA,SAAS,cACP,UACA,OACA,SACA,KACQ;AACR,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,YAAY,oBAAoB,OAAO,GAAG;AAChD,QAAM,aAAa,IAAI,SAAS,QAAQ,QAAQ;AAChD,SAAO,YAAY,QAAQ,IAAI,UAAU,MAAM;AACjD;AAEA,SAAS,kBACP,MACA,UACA,KACQ;AACR,QAAM,YAAY,oBAAoB,KAAK,WAAW,GAAG;AACzD,aAAW,KAAK,CAAC,KAAK,QAAQ,CAAC;AAC/B,QAAM,OAAO,oBAAoB,KAAK,MAAM,UAAU,GAAG;AACzD,YAAU,GAAG;AACb,SAAO,IAAI,SAAS,gBAAgB,KAAK,QAAQ,QAAQ,IAAI;AAC/D;AAEA,SAAS,cACP,SACA,UACU;AAGV,QAAM,SAAmB,CAAC;AAC1B,aAAW,OAAO,SAAS;AACzB,UAAM,QAAQ,IAAI,MAAM,8BAA8B;AACtD,QAAI,CAAC,OAAO;AACV,aAAO,KAAK,GAAG;AACf;AAAA,IACF;AACA,UAAM,eAAe,SAAS,IAAI,MAAM,CAAC,CAAC;AAC1C,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AACA,WAAO,KAAK,GAAG,YAAY;AAAA,EAC7B;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,YAAoB,KAA0B;AACzE,SAAO,kBAAkB,YAAY,GAAG,EAAE;AAC5C;AAEA,SAAS,kBAAkB,YAAoB,KAA0B;AACvE,QAAM,UAAU,WAAW,UAAU;AACrC,MAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,WAAO,qBAAqB,YAAY,GAAG,EAAE;AAAA,EAC/C;AACA,SAAO,kBAAkB,YAAY,GAAG,EAAE;AAC5C;AAEA,SAAS,mBAAmB,OAAe,KAA0B;AACnE,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,QAAQ,WAAW,GAAI,KAAK,QAAQ,WAAW,GAAG,GAAG;AACvD,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAG;AACpD,UAAM,QAAQ,QAAQ,MAAM,GAAG,EAAE;AACjC,UAAM,YAAY,kBAAkB,OAAO,GAAG,EAAE;AAChD,WAAO,IAAI,SAAS;AAAA,EACtB;AACA,SAAO,kBAAkB,SAAS,GAAG,EAAE;AACzC;AAEA,SAAS,SAAS,MAAgB,KAA0B;AAC1D,MAAI,CAAC,KAAK,MAAM,QAAQ;AACtB,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,MACT,IAAI,CAAC,SAAS;AACb,QAAI,KAAK,SAAS,QAAQ;AACxB,aAAO,WAAW,KAAK,KAAK;AAAA,IAC9B;AACA,WAAO,IAAI,oBAAoB,KAAK,OAAO,GAAG,CAAC;AAAA,EACjD,CAAC,EACA,KAAK,EAAE;AACZ;AAEA,SAAS,0BACP,MACA,UACA,KACQ;AACR,MAAI,CAAC,KAAK,SAAS,QAAQ;AACzB,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,MAAI,KAAK,SAAS,WAAW,KAAK,MAAM,MAAM;AAC5C,UAAM,OAAO,oBAAoB,MAAM,MAAM,GAAG;AAChD,WAAO,IAAI,IAAI,QAAQ,qBAAqB,OAAO,UAAU,GAAG,CAAC;AAAA,EACnE;AACA,QAAM,UAAU,KAAK,SAAS,KAAK,SAAS,SAAS,CAAC,EAAE,SAAS;AACjE,MAAI,WAAW,UACX,qBAAqB,KAAK,SAAS,KAAK,SAAS,SAAS,CAAC,GAAG,UAAU,GAAG,IAC3E;AACJ,QAAM,aAAa,UAAU,KAAK,SAAS,SAAS,IAAI,KAAK,SAAS,SAAS;AAC/E,MAAI,aAAa,GAAG;AAClB,WAAO;AAAA,EACT;AACA,WAAS,IAAI,YAAY,KAAK,GAAG,KAAK;AACpC,UAAM,SAAS,KAAK,SAAS,CAAC;AAC9B,UAAM,OAAO,OAAO,OAAO,oBAAoB,OAAO,MAAM,GAAG,IAAI;AACnE,eAAW,IAAI,IAAI,OAAO,qBAAqB,QAAQ,UAAU,GAAG,CAAC,MAAM,QAAQ;AAAA,EACrF;AACA,SAAO;AACT;AAEA,SAAS,qBACP,QACA,UACA,KACQ;AACR,SAAO,oBAAoB,OAAO,MAAM,UAAU,GAAG;AACvD;AAEA,SAAS,oBACP,UACA,UACA,KACQ;AACR,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,EACT;AACA,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,yBAAyB,SAAS,CAAC,GAAG,UAAU,GAAG;AAAA,EAC5D;AACA,SAAO,KAAK,SAAS,IAAI,CAAC,UAAU,cAAc,OAAO,UAAU,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;AACnF;AAEA,SAAS,yBACP,MACA,UACA,KACQ;AACR,MAAI,KAAK,SAAS,cAAc;AAC9B,WAAO,oBAAoB,KAAK,OAAO,GAAG;AAAA,EAC5C;AACA,MAAI,KAAK,SAAS,kBAAkB;AAClC,WAAO,kBAAkB,KAAK,YAAY,GAAG;AAAA,EAC/C;AACA,MAAI,KAAK,SAAS,eAAe;AAC/B,WAAO,0BAA0B,MAAM,UAAU,GAAG;AAAA,EACtD;AACA,MAAI,KAAK,SAAS,OAAO;AACvB,WAAO,kBAAkB,MAAM,UAAU,GAAG;AAAA,EAC9C;AACA,MAAI,KAAK,SAAS,WAAW;AAC3B,WAAO,cAAc,YAAY,MAAM,UAAU,GAAG,GAAG,KAAK,OAAO,cAAc,GAAG;AAAA,EACtF;AACA,MAAI,KAAK,SAAS,aAAa;AAC7B,WAAO,cAAc,cAAc,MAAM,UAAU,GAAG,GAAG,KAAK,OAAO,cAAc,GAAG;AAAA,EACxF;AACA,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO,KAAK,cAAc,MAAM,UAAU,GAAG,CAAC;AAAA,EAChD;AACA,SAAO,cAAc,MAAM,UAAU,GAAG;AAC1C;AAEA,SAAS,cAAc,OAA8B,QAA+B;AAClF,MAAI,WAAW,OAAO;AACpB,WAAO,gBAAgB,KAAK;AAAA,EAC9B;AACA,SAAO,mBAAmB,KAAK;AACjC;AAEA,SAAS,mBAAmB,OAA2B;AAErD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,MAAI,CAAC,MAAM,OAAO,QAAQ;AACxB,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,MAAM,OAClB,IAAI,CAAC,UAAU;AACd,UAAM,WAAW,MAAM,WAAW,MAAM;AACxC,WAAO,GAAG,MAAM,IAAI,GAAG,QAAQ,KAAK,MAAM,QAAQ;AAAA,EACpD,CAAC,EACA,KAAK,IAAI;AAEZ,SAAO,mBAAmB,MAAM;AAClC;AAEA,SAAS,gBAAgB,OAA2B;AAClD,MAAI,CAAC,SAAS,MAAM,OAAO,WAAW,GAAG;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM,OAAO,IAAI,CAAC,UAAU;AACxC,UAAM,WAAW,MAAM,WAAW,MAAM;AACxC,WAAO,KAAK,MAAM,IAAI,GAAG,QAAQ,KAAK,MAAM,QAAQ;AAAA,EACtD,CAAC;AAED,SAAO,CAAC,4BAA4B,GAAG,OAAO,GAAG,EAAE,KAAK,IAAI;AAC9D;AAEA,SAAS,qBAAqB,OAAkC;AAC9D,MAAI,CAAC,SAAS,MAAM,OAAO,WAAW,GAAG;AACvC,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,MAAM,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI;AACpD,SAAO,WAAW,MAAM,KAAK,IAAI,CAAC;AACpC;AAEA,SAAS,WAAW,OAAuB;AACzC,SAAO,MAAM,QAAQ,YAAY,CAAC,SAAS;AACzC,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;ACvdO,SAAS,aAAa,MAAgB,UAA8B,CAAC,GAAW;AACrF,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,WAAWA,4BAA2B,KAAK,YAAY;AAC7D,QAAM,WAAW,UAAU,KAAK,UAAU,UAAU,QAAQ,CAAC;AAC7D,SAAO,SAAS,QAAQ;AAC1B;AAEA,SAAS,UACP,UACA,UACA,QACA,OACQ;AACR,MAAI,OAAO;AACX,aAAW,SAAS,UAAU;AAC5B,UAAM,QAAQ,SAAS,OAAO,UAAU,QAAQ,KAAK;AACrD,QAAI,OAAO;AACT,cAAQ;AAAA,IACV;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,SACP,MACA,UACA,QACA,OACQ;AACR,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAOC,aAAY,MAAM,UAAU,QAAQ,KAAK;AAAA,IAClD,KAAK;AACH,aAAO,cAAc,MAAM,QAAQ,KAAK;AAAA,IAC1C;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAASA,aACP,MACA,UACA,QACA,OACQ;AACR,QAAM,aAAa,OAAO,OAAO,KAAK;AACtC,QAAM,aAAaC,eAAc,KAAK,SAAS,QAAQ;AACvD,QAAM,QAAQ,iBAAiB,KAAK,YAAY,UAAU;AAC1D,QAAM,UAAU,IAAI,KAAK,IAAI,GAAG,KAAK;AAErC,MAAI,KAAK,SAAS,WAAW,GAAG;AAC9B,WAAO,GAAG,UAAU,GAAG,OAAO,KAAK,KAAK,IAAI;AAAA;AAAA,EAC9C;AAEA,MAAI,KAAK,SAAS,WAAW,KAAK,KAAK,SAAS,CAAC,EAAE,SAAS,QAAQ;AAClE,UAAM,SAAS,eAAe,KAAK,SAAS,CAAC,CAAC;AAC9C,QAAI,WAAW,MAAM;AACnB,aAAO,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,KAAK,KAAK,IAAI;AAAA;AAAA,IACvD;AAAA,EACF;AAEA,QAAM,WAAW,UAAU,KAAK,UAAU,UAAU,QAAQ,QAAQ,CAAC;AACrE,MAAI,CAAC,UAAU;AACb,WAAO,GAAG,UAAU,GAAG,OAAO,KAAK,KAAK,IAAI;AAAA;AAAA,EAC9C;AAEA,SAAO,GAAG,UAAU,GAAG,OAAO;AAAA,EAAK,QAAQ,GAAG,UAAU,KAAK,KAAK,IAAI;AAAA;AACxE;AAEA,SAAS,iBAAiB,YAAyB,YAAuC;AACxF,QAAM,WAAqB,CAAC;AAC5B,MAAI,WAAW,QAAQ;AACrB,aAAS,KAAK,UAAU,qBAAqB,WAAW,KAAK,GAAG,CAAC,CAAC,GAAG;AAAA,EACvE;AACA,aAAW,QAAQ,YAAY;AAC7B,QAAI,KAAK,UAAU,MAAM;AACvB,eAAS,KAAK,KAAK,IAAI;AACvB;AAAA,IACF;AACA,UAAM,UAAU,4BAA4B,KAAK,KAAK;AACtD,QAAI,YAAY,MAAM;AACpB;AAAA,IACF;AACA,UAAM,OAAO,KAAK,SAAS,cAAc,UAAU,KAAK;AACxD,aAAS,KAAK,GAAG,IAAI,KAAK,qBAAqB,OAAO,CAAC,GAAG;AAAA,EAC5D;AACA,MAAI,CAAC,SAAS,QAAQ;AACpB,WAAO;AAAA,EACT;AACA,SAAO,MAAM,SAAS,KAAK,GAAG;AAChC;AAEA,SAAS,cAAc,MAAgB,QAAgB,OAAuB;AAC5E,QAAM,SAAS,eAAe,IAAI;AAClC,MAAI,WAAW,QAAQ,OAAO,KAAK,EAAE,WAAW,GAAG;AACjD,WAAO;AAAA,EACT;AACA,SAAO,GAAG,OAAO,OAAO,KAAK,CAAC,GAAG,MAAM;AAAA;AACzC;AAEA,SAAS,eAAe,MAA+B;AACrD,MAAI,CAAC,KAAK,MAAM,QAAQ;AACtB,WAAO;AAAA,EACT;AACA,MAAI,OAAO;AACX,aAAW,QAAQ,KAAK,OAAO;AAC7B,QAAI,KAAK,SAAS,QAAQ;AACxB,aAAO;AAAA,IACT;AACA,YAAQ,iBAAiB,KAAK,KAAK;AAAA,EACrC;AACA,SAAO;AACT;AAEA,SAAS,4BAA4B,KAA4B;AAC/D,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,QAAQ,SAAS,GAAG;AACtB,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,QAAQ,CAAC;AACvB,MAAK,UAAU,OAAO,UAAU,OAAQ,QAAQ,QAAQ,SAAS,CAAC,MAAM,OAAO;AAC7E,WAAO;AAAA,EACT;AACA,QAAM,OAAO,QAAQ,MAAM,GAAG,EAAE;AAChC,MAAI,SAAS;AACb,MAAI,WAAW;AACf,aAAW,QAAQ,MAAM;AACvB,QAAI,UAAU;AACZ,gBAAU,aAAa,MAAM,KAAK;AAClC,iBAAW;AACX;AAAA,IACF;AACA,QAAI,SAAS,MAAM;AACjB,iBAAW;AAAA,IACb,OAAO;AACL,gBAAU;AAAA,IACZ;AAAA,EACF;AACA,MAAI,UAAU;AACZ,cAAU;AAAA,EACZ;AACA,SAAO;AACT;AAEA,SAAS,aAAa,MAAc,OAAuB;AACzD,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,UAAI,SAAS,OAAO;AAClB,eAAO;AAAA,MACT;AACA,aAAO;AAAA,EACX;AACF;AAEA,SAASF,4BACP,MACgC;AAChC,QAAM,MAAM,oBAAI,IAA+B;AAC/C,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,aAAW,SAAS,KAAK,SAAS;AAChC,QAAI,IAAI,MAAM,MAAM,MAAM,OAAO;AAAA,EACnC;AACA,SAAO;AACT;AAEA,SAASE,eACP,SACA,UACU;AACV,QAAM,SAAmB,CAAC;AAC1B,aAAW,OAAO,SAAS;AACzB,UAAM,QAAQ,IAAI,MAAM,8BAA8B;AACtD,QAAI,CAAC,OAAO;AACV,aAAO,KAAK,GAAG;AACf;AAAA,IACF;AACA,UAAM,eAAe,SAAS,IAAI,MAAM,CAAC,CAAC;AAC1C,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AACA,WAAO,KAAK,GAAG,YAAY;AAAA,EAC7B;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,SAAO,MAAM,QAAQ,YAAY,CAAC,SAAS;AACzC,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF,CAAC;AACH;AAEA,SAAS,qBAAqB,OAAuB;AACnD,SAAO,MAAM,QAAQ,WAAW,CAAC,SAAS;AACxC,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF,CAAC;AACH;;;AC9KO,SAAS,WAAW,MAAc,KAAa,QAAgB,YAAgC;AACpG,QAAM,cAAc,aAAa,MAAM;AACvC,SAAO;AAAA,IACL,OAAO,EAAE,MAAM,KAAK,QAAQ,YAAY;AAAA,IACxC,KAAK,EAAE,MAAM,KAAK,MAAM,QAAQ,QAAQ,cAAc,OAAO;AAAA,EAC/D;AACF;;;ACtEO,SAAS,eACd,MACA,QACc;AACd,QAAM,cAA4B,CAAC;AAEnC,MAAI,KAAK,SAAS;AAChB,gBAAY;AAAA,MACV,GAAG;AAAA,QACD,EAAE,MAAM,MAAM,OAAO,KAAK,SAAS,MAAM,KAAK,YAAY;AAAA,QAC1D,OAAO,OAAO;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,YAAU,KAAK,UAAU,CAAC,eAAe;AACvC,UAAM,OAAO,OAAO,OAAO,WAAW,IAAI;AAC1C,gBAAY,KAAK,GAAG,cAAc,YAAY,IAAI,CAAC;AAAA,EACrD,CAAC;AAED,SAAO;AACT;AAEA,SAAS,UAAU,OAAe,SAAsD;AACtF,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,OAAO;AACvB,YAAM,MAAM,OAAO;AACnB,gBAAU,KAAK,MAAM,OAAO;AAC5B;AAAA,IACF;AACA,QAAI,KAAK,SAAS,eAAe;AAC/B,oBAAc,MAAM,OAAO;AAC3B;AAAA,IACF;AACA,QAAI,KAAK,SAAS,aAAa,KAAK,SAAS,aAAa;AACxD,gBAAU,KAAK,UAAU,OAAO;AAChC,UAAI,KAAK,SAAS,eAAe,KAAK,OAAO;AAC3C,mBAAW,QAAQ,KAAK,OAAO;AAC7B,oBAAU,KAAK,UAAU,OAAO;AAAA,QAClC;AAAA,MACF;AACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,MAAM,MAAe,SAAsD;AAClF,MAAI,CAAC,KAAK,OAAO;AACf;AAAA,EACF;AACA,UAAQ,EAAE,MAAM,OAAO,OAAO,KAAK,OAAO,MAAM,KAAK,UAAU,CAAC;AAClE;AAEA,SAAS,cACP,MACA,SACM;AACN,aAAW,UAAU,KAAK,UAAU;AAClC,aAAS,QAAQ,OAAO;AACxB,cAAU,OAAO,MAAM,OAAO;AAAA,EAChC;AACF;AAEA,SAAS,SACP,QACA,SACM;AACN,MAAI,CAAC,OAAO,SAAS,CAAC,OAAO,MAAM;AACjC;AAAA,EACF;AACA,UAAQ,EAAE,MAAM,OAAO,MAAM,OAAO,OAAO,OAAO,MAAM,OAAO,UAAU,CAAC;AAC5E;AAEA,SAAS,cACP,YACA,MACc;AACd,QAAM,cAA4B,CAAC;AACnC,QAAM,OAAO,WAAW;AACxB,QAAM,YAAY,KAAK;AACvB,QAAM,YAAY,KAAK,MAAM,SAAS,IAAI;AAE1C,MAAI,CAAC,WAAW;AACd,UAAM,WAAW,gBAAgB,KAAK,YAAY;AAClD,QAAI,UAAU;AACZ,kBAAY;AAAA,QACV;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX,UAAU,IAAI,wBAAwB,WAAW,IAAI,iBAAiB,SAAS;AAAA,QACjF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,WAAW;AACtB,UAAM,WAAW,gBAAgB,KAAK,YAAY;AAClD,QAAI,UAAU;AACZ,kBAAY;AAAA,QACV;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX,UAAU,IAAI,sCAAsC,WAAW,IAAI,iBAAiB,SAAS;AAAA,QAC/F;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,wBACP,MACA,UACA,MACA,WACA,MACA,SACY;AACZ,QAAM,MAAM,OACR;AAAA,IACE,OAAO;AAAA,IACP,iBAAiB;AAAA,EACnB,IACA;AAEJ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS,QAAQ,QAAQ,SAAS,GAAG;AAAA,IACrC;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,OAAyD;AAChF,MAAI,UAAU,OAAO;AACnB,WAAO;AAAA,EACT;AACA,MAAI,UAAU,SAAS;AACrB,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AC/IA,IAAMC,uBAAsB,oBAAI,IAAI;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAMC,qBAAoB,oBAAI,IAAI;AAAA,EAChC;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,CAAC;AAEM,SAAS,aACd,MACA,aACc;AACd,QAAM,cAA4B,CAAC;AACnC,QAAM,gBAAgB,oBAAI,IAAwB;AAClD,QAAM,YAAY,oBAAI,IAA0B;AAChD,QAAM,gBAAgB,oBAAI,IAA0B;AACpD,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,kBAAkB,oBAAI,IAAY;AACxC,QAAM,qBAAqB,oBAAI,IAAY;AAC3C,QAAM,yBAAyB,oBAAI,IAAY;AAE/C,MAAI,KAAK,OAAO,QAAQ;AACtB,eAAW,SAAS,KAAK,MAAM,QAAQ;AACrC,oBAAc,IAAI,MAAM,MAAM,KAAK;AAAA,IACrC;AAAA,EACF;AAEA,QAAM,cAAc,YAAY;AAChC,QAAM,iBAAiB,CAAC,YAAY,uBAAuB,gBAAgB;AAC3E,QAAM,qBAAqB,CAAC,YAAY,uBAAuB,gBAAgB;AAE/E,QAAMC,aAAY,CAAC,OAAe,WAA8B;AAC9D,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,SAAS,eAAe;AAC/B,0BAAkB,MAAM,MAAM;AAC9B;AAAA,MACF;AACA,UAAI,KAAK,SAAS,OAAO;AACvB,kBAAU,MAAM,MAAM;AACtB;AAAA,MACF;AACA,UAAI,KAAK,SAAS,cAAc;AAC9B,yBAAiB,KAAK,OAAO,KAAK,MAAM,MAAM;AAC9C;AAAA,MACF;AACA,UAAI,KAAK,SAAS,kBAAkB;AAClC,yBAAiB,KAAK,YAAY,KAAK,MAAM,MAAM;AACnD;AAAA,MACF;AACA,UAAI,KAAK,SAAS,QAAQ;AACxB,mBAAW,KAAK,OAAO,MAAM;AAC7B;AAAA,MACF;AACA,UAAI,KAAK,SAAS,WAAW;AAC3B,sBAAc,MAAM,MAAM;AAC1B;AAAA,MACF;AACA,UAAI,KAAK,SAAS,aAAa;AAC7B,wBAAgB,MAAM,MAAM;AAC5B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,oBAAoB,CAAC,MAAuB,WAA8B;AAC9E,eAAW,UAAU,KAAK,UAAU;AAClC,UAAI,OAAO,MAAM;AACf,yBAAiB,OAAO,MAAM,OAAO,UAAU,MAAM;AAAA,MACvD;AACA,MAAAA,WAAU,OAAO,MAAM,MAAM;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,YAAY,CAAC,MAAe,WAA8B;AAC9D,qBAAiB,KAAK,WAAW,KAAK,eAAe,MAAM;AAC3D,UAAM,aAAa,IAAI,IAAI,MAAM;AACjC,eAAW,IAAI,KAAK,QAAQ;AAC5B,IAAAA,WAAU,KAAK,MAAM,UAAU;AAAA,EACjC;AAEA,QAAM,gBAAgB,CAAC,MAAmB,WAA8B;AACtE,QAAI,KAAK,OAAO;AACd,uBAAiB,KAAK,OAAO,KAAK,WAAW,MAAM;AAAA,IACrD;AACA,qBAAiB,KAAK,YAAY,MAAM;AACxC,IAAAA,WAAU,KAAK,UAAU,MAAM;AAAA,EACjC;AAEA,QAAM,kBAAkB,CAAC,MAAqB,WAA8B;AAC1E,QAAI,KAAK,OAAO;AACd,uBAAiB,KAAK,OAAO,KAAK,WAAW,MAAM;AAAA,IACrD;AACA,qBAAiB,KAAK,YAAY,MAAM;AACxC,QAAI,KAAK,OAAO;AACd,iBAAW,QAAQ,KAAK,OAAO;AAC7B,QAAAA,WAAU,KAAK,UAAU,MAAM;AAAA,MACjC;AAAA,IACF;AACA,IAAAA,WAAU,KAAK,UAAU,MAAM;AAAA,EACjC;AAEA,QAAM,aAAa,CAAC,OAA0B,WAA8B;AAC1E,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,SAAS,QAAQ;AACxB,yBAAiB,KAAK,OAAO,KAAK,MAAM,MAAM;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,mBAAmB,CAAC,YAAyB,WAA8B;AAC/E,eAAW,QAAQ,YAAY;AAC7B,UAAI,CAAC,KAAK,MAAO;AACjB,YAAM,UAAU,KAAK,MAAM,KAAK;AAChC,UAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,KAAK,QAAQ,WAAW,GAAI,GAAG;AACnE;AAAA,MACF;AACA,uBAAiB,SAAS,QAAW,MAAM;AAAA,IAC7C;AAAA,EACF;AAEA,QAAM,mBAAmB,CACvB,YACA,MACA,WACS;AACT,UAAM,cAAc,eAAe,UAAU;AAC7C,eAAW,cAAc,aAAa;AACpC,YAAM,OAAO,WAAW;AACxB,UAAI,WAAW,SAAS,WAAW,OAAO,IAAI,IAAI,GAAG;AACnD;AAAA,MACF;AACA,UAAIC,wBAAuB,IAAI,GAAG;AAChC;AAAA,MACF;AACA,YAAM,YAAY,OAAO,WAAW,MAAM,WAAW,OAAO,WAAW,MAAM,IAAI;AACjF,UAAI,WAAW,SAAS,aAAa;AACnC,oBAAY,eAAe,MAAM,SAAS;AAC1C,gBAAQ,IAAI,IAAI;AAChB,YACE,YAAY,+BACZ,CAAC,cAAc,IAAI,IAAI,KACvB,CAAC,gBAAgB,IAAI,IAAI,GACzB;AACA,gBAAM,WAAWC,iBAAgB,YAAY,YAAY,kBAAkB;AAC3E,cAAI,UAAU;AACZ,wBAAY,KAAK,mCAAmC,MAAM,UAAU,SAAS,CAAC;AAC9E,4BAAgB,IAAI,IAAI;AAAA,UAC1B;AAAA,QACF;AACA,YAAI,sBAAsB,CAAC,uBAAuB,IAAI,IAAI,GAAG;AAC3D,gBAAM,WAAWA,iBAAgB,YAAY,YAAY,KAAK;AAC9D,cAAI,UAAU;AACZ,wBAAY;AAAA,cACV;AAAA,gBACE;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,YAAY;AAAA,cACd;AAAA,YACF;AACA,mCAAuB,IAAI,IAAI;AAAA,UACjC;AAAA,QACF;AACA;AAAA,MACF;AAEA,kBAAY,WAAW,MAAM,SAAS;AACtC,cAAQ,IAAI,IAAI;AAChB,UACE,YAAY,+BACZ,CAAC,cAAc,IAAI,IAAI,KACvB,CAAC,gBAAgB,IAAI,IAAI,GACzB;AACA,cAAM,WAAWA,iBAAgB,YAAY,YAAY,kBAAkB;AAC3E,YAAI,UAAU;AACZ,sBAAY,KAAK,mCAAmC,MAAM,UAAU,SAAS,CAAC;AAC9E,0BAAgB,IAAI,IAAI;AAAA,QAC1B;AAAA,MACF;AAEA,UAAI,kBAAkB,CAAC,mBAAmB,IAAI,IAAI,GAAG;AACnD,cAAM,WAAWA,iBAAgB,YAAY,YAAY,KAAK;AAC9D,YAAI,UAAU;AACZ,sBAAY;AAAA,YACV,sBAAsB,MAAM,SAAS,UAAU,WAAW,YAAY,mBAAmB;AAAA,UAC3F;AACA,6BAAmB,IAAI,IAAI;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAAF,WAAU,KAAK,UAAU,oBAAI,IAAI,CAAC;AAElC,MAAI,KAAK,OAAO,QAAQ;AACtB,eAAW,SAAS,KAAK,MAAM,QAAQ;AACrC,UAAI,CAAC,QAAQ,IAAI,MAAM,IAAI,GAAG;AAC5B,cAAM,WAAWE,iBAAgB,YAAY,YAAY,iBAAiB;AAC1E,YAAI,UAAU;AACZ,sBAAY,KAAK;AAAA,YACf;AAAA,YACA,MAAM;AAAA,YACN,SAAS,SAAS,MAAM,IAAI;AAAA,YAC5B,MAAM,MAAM;AAAA,UACd,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MACE,YAAY,sBAAsB,WAClC,CAAC,KAAK,SACN,QAAQ,QAAQ,YAAY,sBAAsB,oBAClD;AACA,UAAM,WAAWA,iBAAgB,YAAY,sBAAsB,QAAQ;AAC3E,QAAI,UAAU;AACZ,kBAAY,KAAK;AAAA,QACf;AAAA,QACA,MAAM;AAAA,QACN,SAAS,4BAA4B,QAAQ,IAAI,eAAe,QAAQ,SAAS,IAAI,KAAK,GAAG;AAAA,MAC/F,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mCACP,MACA,UACA,MACY;AACZ,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,SAAS,UAAU,IAAI;AAAA,IACvB;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,EACF;AACF;AAEA,SAAS,sBACP,MACA,MACA,UACA,MACA,SACY;AACZ,MAAI,SAAS,aAAa;AACxB,UAAMC,WAAU,UACZ,SAAS,IAAI,uCAAuC,IAAI,eACxD,SAAS,IAAI,sBAAsB,IAAI;AAC3C,WAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,SAAAA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,UACZ,IAAI,IAAI,6CAA6C,IAAI,cACzD,IAAI,IAAI,4BAA4B,IAAI;AAE5C,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,YAAY,KAAgC,MAAc,MAAyB;AAC1F,QAAM,WAAW,IAAI,IAAI,IAAI;AAC7B,MAAI,UAAU;AACZ,aAAS,SAAS;AAClB;AAAA,EACF;AACA,MAAI,IAAI,MAAM,EAAE,OAAO,GAAG,KAAK,CAAC;AAClC;AAEA,SAAS,eAAe,YAAuC;AAC7D,QAAM,cAAiC,CAAC;AACxC,MAAI,IAAI;AACR,MAAI,QAAsE;AAE1E,SAAO,IAAI,WAAW,QAAQ;AAC5B,UAAM,KAAK,WAAW,CAAC;AAEvB,QAAI,UAAU,QAAQ;AACpB,UAAI,OAAO,OAAO,OAAO,KAAM;AAC7B,gBAAQ,OAAO,MAAM,WAAW;AAChC;AACA;AAAA,MACF;AACA,UAAI,OAAO,KAAK;AACd,gBAAQ;AACR;AACA;AAAA,MACF;AACA,UAAI,OAAO,OAAO,WAAW,IAAI,CAAC,MAAM,KAAK;AAC3C,gBAAQ;AACR,aAAK;AACL;AAAA,MACF;AACA,UAAI,OAAO,OAAO,WAAW,IAAI,CAAC,MAAM,KAAK;AAC3C,gBAAQ;AACR,aAAK;AACL;AAAA,MACF;AACA,UAAIC,mBAAkB,EAAE,GAAG;AACzB,cAAM,QAAQ;AACd;AACA,eAAO,IAAI,WAAW,UAAUC,kBAAiB,WAAW,CAAC,CAAC,GAAG;AAC/D;AAAA,QACF;AACA,cAAM,OAAO,WAAW,MAAM,OAAO,CAAC;AACtC,cAAM,eAAeC,sBAAqB,YAAY,QAAQ,CAAC;AAC/D,YAAI,SAAS,WAAW,iBAAiB,KAAK;AAC5C,gBAAM,YAAY,oBAAoB,YAAY,CAAC;AACnD,cAAI,WAAW;AACb,wBAAY,KAAK;AAAA,cACf,MAAM,UAAU;AAAA,cAChB,MAAM;AAAA,cACN,OAAO,UAAU;AAAA,cACjB,QAAQ,UAAU,KAAK;AAAA,YACzB,CAAC;AACD,gBAAI,UAAU;AACd;AAAA,UACF;AAAA,QACF;AACA,YAAI,iBAAiB,KAAK;AACxB,sBAAY,KAAK,EAAE,MAAM,MAAM,SAAS,OAAO,OAAO,QAAQ,KAAK,OAAO,CAAC;AAAA,QAC7E;AACA;AAAA,MACF;AACA;AACA;AAAA,IACF;AAEA,QAAI,UAAU,QAAQ;AACpB,UAAI,OAAO,MAAM;AACf,gBAAQ;AAAA,MACV;AACA;AACA;AAAA,IACF;AAEA,QAAI,UAAU,SAAS;AACrB,UAAI,OAAO,OAAO,WAAW,IAAI,CAAC,MAAM,KAAK;AAC3C,gBAAQ;AACR,aAAK;AACL;AAAA,MACF;AACA;AACA;AAAA,IACF;AAEA,QAAI,UAAU,UAAU;AACtB,UAAI,OAAO,MAAM;AACf,aAAK;AACL;AAAA,MACF;AACA,UAAI,OAAO,KAAK;AACd,gBAAQ;AAAA,MACV;AACA;AACA;AAAA,IACF;AAEA,QAAI,UAAU,UAAU;AACtB,UAAI,OAAO,MAAM;AACf,aAAK;AACL;AAAA,MACF;AACA,UAAI,OAAO,KAAM;AACf,gBAAQ;AAAA,MACV;AACA;AACA;AAAA,IACF;AAEA,QAAI,UAAU,YAAY;AACxB,UAAI,OAAO,MAAM;AACf,aAAK;AACL;AAAA,MACF;AACA,UAAI,OAAO,KAAK;AACd,gBAAQ;AACR;AACA;AAAA,MACF;AACA;AACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,oBACP,YACA,YAC0D;AAC1D,MAAI,IAAI;AACR,SAAO,IAAI,WAAW,UAAU,KAAK,KAAK,WAAW,CAAC,CAAC,GAAG;AACxD;AAAA,EACF;AACA,MAAI,WAAW,CAAC,MAAM,KAAK;AACzB,QAAI,WAAW,IAAI,CAAC,MAAM,KAAK;AAC7B,aAAO;AAAA,IACT;AACA,SAAK;AAAA,EACP,WAAW,WAAW,CAAC,MAAM,KAAK;AAChC;AAAA,EACF,OAAO;AACL,WAAO;AAAA,EACT;AACA,SAAO,IAAI,WAAW,UAAU,KAAK,KAAK,WAAW,CAAC,CAAC,GAAG;AACxD;AAAA,EACF;AACA,MAAI,CAACF,mBAAkB,WAAW,CAAC,CAAC,GAAG;AACrC,WAAO;AAAA,EACT;AACA,QAAM,YAAY;AAClB;AACA,SAAO,IAAI,WAAW,UAAUC,kBAAiB,WAAW,CAAC,CAAC,GAAG;AAC/D;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM,WAAW,MAAM,WAAW,CAAC;AAAA,IACnC,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AACF;AAEA,SAASC,sBAAqB,MAAc,OAA8B;AACxE,WAAS,IAAI,OAAO,KAAK,GAAG,KAAK;AAC/B,UAAM,KAAK,KAAK,CAAC;AACjB,QAAI,CAAC,KAAK,KAAK,EAAE,GAAG;AAClB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAASF,mBAAkB,IAAqB;AAC9C,SAAO,aAAa,KAAK,EAAE;AAC7B;AAEA,SAASC,kBAAiB,IAAqB;AAC7C,SAAO,gBAAgB,KAAK,EAAE;AAChC;AAEA,SAASJ,wBAAuB,MAAuB;AACrD,SAAOH,qBAAoB,IAAI,IAAI,KAAKC,mBAAkB,IAAI,IAAI;AACpE;AAEA,SAASG,iBAAgB,OAAyD;AAChF,MAAI,UAAU,OAAO;AACnB,WAAO;AAAA,EACT;AACA,MAAI,UAAU,SAAS;AACrB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,WAAW,MAAkB,OAAe,QAA4B;AAC/E,QAAM,cAAc,KAAK,MAAM,SAAS;AACxC,QAAM,WAAW,KAAK,MAAM,MAAM;AAClC,SAAO;AAAA,IACL,OAAO;AAAA,MACL,MAAM,KAAK,MAAM;AAAA,MACjB,KAAK;AAAA,MACL,QAAQ;AAAA,IACV;AAAA,IACA,KAAK;AAAA,MACH,MAAM,KAAK,MAAM;AAAA,MACjB,KAAK,WAAW;AAAA,MAChB,QAAQ,cAAc;AAAA,IACxB;AAAA,EACF;AACF;AAMO,SAAS,mBAAmB,MAA8B;AAE/D,MAAI,CAAC,KAAK,cAAc,KAAK,WAAW,WAAW,GAAG;AACpD,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,cAA4B,CAAC;AACnC,QAAM,gBAAgB,IAAI,IAAI,KAAK,WAAW,IAAI,OAAK,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAGnE,QAAM,WAAW,qBAAqB,IAAI;AAG1C,aAAW,QAAQ,SAAS,UAAU;AACpC,QAAI,CAAC,cAAc,IAAI,IAAI,KAAK,CAAC,2BAA2B,IAAI,GAAG;AACjE,kBAAY,KAAK;AAAA,QACf,UAAU;AAAA,QACV,MAAM;AAAA,QACN,SAAS,eAAe,IAAI,sEAAsE,IAAI,6BAA6B,IAAI;AAAA,MACzI,CAAC;AAAA,IACH;AAAA,EACF;AAGA,aAAW,CAAC,MAAM,IAAI,KAAK,eAAe;AACxC,UAAM,aAAa,SAAS,gBAAgB,IAAI,IAAI;AACpD,UAAM,cAAc,SAAS,aAAa,IAAI,IAAI;AAElD,QAAI,CAAC,cAAc,CAAC,aAAa;AAC/B,kBAAY,KAAK;AAAA,QACf,UAAU;AAAA,QACV,MAAM;AAAA,QACN,SAAS,SAAS,IAAI;AAAA,QACtB,MAAM,KAAK;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF;AAGA,aAAW,QAAQ,SAAS,cAAc;AACxC,QAAI,cAAc,IAAI,IAAI,GAAG;AAC3B,kBAAY,KAAK;AAAA,QACf,UAAU;AAAA,QACV,MAAM;AAAA,QACN,SAAS,UAAU,IAAI,6BAA6B,IAAI,kCAAkC,IAAI;AAAA,MAChG,CAAC;AAAA,IACH;AAAA,EACF;AAGA,aAAW,CAAC,MAAM,IAAI,KAAK,eAAe;AACxC,UAAM,aAAa,KAAK,SAAS;AACjC,UAAM,aAAa,SAAS,cAAc,IAAI,IAAI;AAClD,UAAM,cAAc,SAAS,gBAAgB,IAAI,IAAI,KAAK,CAAC;AAE3D,QAAI,cAAc,aAAa;AAC7B,kBAAY,KAAK;AAAA,QACf,UAAU;AAAA,QACV,MAAM;AAAA,QACN,SAAS,IAAI,IAAI,wCAAwC,IAAI;AAAA,MAC/D,CAAC;AAAA,IACH,WAAW,CAAC,cAAc,YAAY;AACpC,kBAAY,KAAK;AAAA,QACf,UAAU;AAAA,QACV,MAAM;AAAA,QACN,SAAS,IAAI,IAAI;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAaA,SAAS,qBAAqB,MAA+B;AAC3D,QAAM,QAAuB;AAAA,IAC3B,UAAU,oBAAI,IAAI;AAAA,IAClB,iBAAiB,oBAAI,IAAI;AAAA,IACzB,cAAc,oBAAI,IAAI;AAAA,IACtB,eAAe,oBAAI,IAAI;AAAA,IACvB,mBAAmB,oBAAI,IAAI;AAAA,EAC7B;AAEA,QAAM,MAAM,kBAAkB,KAAK,UAAU;AAE7C,WAAS,YAAY,QAAa;AAEhC,eAAW,QAAQ,OAAO,UAAU;AAClC,YAAM,SAAS,IAAI,IAAI;AAAA,IACzB;AAEA,eAAW,QAAQ,OAAO,kBAAkB;AAC1C,YAAM,gBAAgB,IAAI,IAAI;AAAA,IAChC;AACA,eAAW,QAAQ,OAAO,cAAc;AACtC,YAAM,aAAa,IAAI,IAAI;AAAA,IAC7B;AACA,eAAW,QAAQ,OAAO,eAAe;AACvC,YAAM,cAAc,IAAI,IAAI;AAAA,IAC9B;AACA,eAAW,QAAQ,OAAO,mBAAmB;AAC3C,YAAM,kBAAkB,IAAI,IAAI;AAAA,IAClC;AAAA,EACF;AAEA,WAAS,kBAAkB,MAA0B;AACnD,QAAI,CAAC,KAAM;AACX,UAAM,SAAS,kBAAkB,MAAM,GAAG;AAC1C,gBAAY,MAAM;AAAA,EACpB;AAEA,WAAS,qBAAqB,MAA0B;AACtD,QAAI,CAAC,KAAM;AACX,UAAM,SAAS,qBAAqB,MAAM,GAAG;AAC7C,gBAAY,MAAM;AAAA,EACpB;AAEA,WAAS,SAAS,MAAY;AAC5B,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,mBAAW,QAAQ,KAAK,OAAO;AAC7B,cAAI,KAAK,SAAS,QAAQ;AACxB,8BAAkB,KAAK,KAAK;AAAA,UAC9B;AAAA,QACF;AACA;AAAA,MAEF,KAAK;AACH,0BAAkB,KAAK,KAAK;AAC5B;AAAA,MAEF,KAAK;AACH,6BAAqB,KAAK,UAAU;AACpC;AAAA,MAEF,KAAK;AACH,YAAI,KAAK,OAAO;AACd,4BAAkB,KAAK,KAAK;AAAA,QAC9B;AACA,mBAAW,QAAQ,KAAK,YAAY;AAClC,cAAI,KAAK,OAAO;AACd,kCAAsB,KAAK,KAAK;AAAA,UAClC;AAAA,QACF;AACA,mBAAW,SAAS,KAAK,UAAU;AACjC,mBAAS,KAAK;AAAA,QAChB;AACA;AAAA,MAEF,KAAK;AACH,YAAI,KAAK,OAAO;AACd,4BAAkB,KAAK,KAAK;AAAA,QAC9B;AACA,mBAAW,QAAQ,KAAK,YAAY;AAClC,cAAI,KAAK,OAAO;AACd,kCAAsB,KAAK,KAAK;AAAA,UAClC;AAAA,QACF;AACA,YAAI,KAAK,OAAO;AACd,qBAAW,QAAQ,KAAK,OAAO;AAC7B,uBAAW,SAAS,KAAK,UAAU;AACjC,uBAAS,KAAK;AAAA,YAChB;AAAA,UACF;AAAA,QACF;AACA,mBAAW,SAAS,KAAK,UAAU;AACjC,mBAAS,KAAK;AAAA,QAChB;AACA;AAAA,MAEF,KAAK;AACH,mBAAW,UAAU,KAAK,UAAU;AAClC,cAAI,OAAO,MAAM;AACf,8BAAkB,OAAO,IAAI;AAAA,UAC/B;AACA,qBAAW,SAAS,OAAO,MAAM;AAC/B,qBAAS,KAAK;AAAA,UAChB;AAAA,QACF;AACA;AAAA,MAEF,KAAK;AACH,0BAAkB,KAAK,SAAS;AAEhC,mBAAW,SAAS,KAAK,MAAM;AAC7B,mBAAS,KAAK;AAAA,QAChB;AACA;AAAA,IACJ;AAAA,EACF;AAEA,WAAS,sBAAsB,OAAe;AAC5C,UAAM,UAAU,MAAM,KAAK;AAC3B,QAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,WAAW,GAAG,GAAG;AACtD;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAG;AACpD,YAAM,QAAQ,QAAQ,MAAM,GAAG,EAAE;AACjC,wBAAkB,KAAK;AAAA,IACzB,OAAO;AACL,wBAAkB,OAAO;AAAA,IAC3B;AAAA,EACF;AAGA,aAAW,SAAS,KAAK,UAAU;AACjC,aAAS,KAAK;AAAA,EAChB;AAEA,SAAO;AACT;AAEA,SAAS,2BAA2B,MAAuB;AACzD,SAAOJ,qBAAoB,IAAI,IAAI,KAAKC,mBAAkB,IAAI,IAAI;AACpE;;;ACzsBA,IAAM,sBAAsB;AAE5B,SAAS,eAAe,MAAsB;AAC5C,QAAM,QAAQ,KAAK,MAAM,MAAM;AAC/B,SAAO,QAAQ,MAAM,CAAC,EAAE,SAAS,IAAI;AACvC;AAEA,SAAS,eACP,aACA,QACA,YACA,YACA,aACA,aACwB;AACxB,MAAI,eAAe,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,MAAI,SAAS;AACb,SAAO,SAAS,YAAY,UAAU,KAAK,KAAK,YAAY,MAAM,CAAC,GAAG;AACpE;AAAA,EACF;AACA,MAAI,YAAY,MAAM,MAAM,OAAO,YAAY,MAAM,MAAM,KAAK;AAC9D;AACA,WAAO,SAAS,YAAY,UAAU,KAAK,KAAK,YAAY,MAAM,CAAC,GAAG;AACpE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,SAAS,SAAS;AACjC,SAAO,WAAW,YAAY,QAAQ,aAAa,UAAU;AAC/D;AASO,SAAS,MAAM,QAAgB,UAAwB,CAAC,GAAgB;AAC7E,QAAM,cAA4B,CAAC;AACnC,QAAM,YAA4B,CAAC;AAEnC,QAAM,aAAa,OAAO,QAAQ,UAAU,IAAI;AAChD,QAAM,QAAQ,WAAW,MAAM,IAAI;AACnC,QAAM,cAAc,iBAAiB,KAAK;AAE1C,MAAI,gBAAuC;AAC3C,MAAI,aAAa;AACjB,QAAM,UAAU,oBAAI,IAAoC;AAExD,QAAM,mBAAmB,CAAC,aAA2B;AACnD,QAAI,CAAC,eAAe;AAClB;AAAA,IACF;AACA,UAAM,SAAS,mBAAmB,OAAO,aAAa,cAAc,gBAAgB,UAAU,OAAO;AACrG,UAAM,sBAAsB,kBAAkB,OAAO,aAAa,cAAc,EAAE;AAClF,UAAM,OAAqB;AAAA,MACzB,IAAI,cAAc;AAAA,MAClB,OAAO,cAAc;AAAA,MACrB,MAAM,cAAc;AAAA,MACpB,KAAK,OAAO;AAAA,MACZ,aAAa;AAAA,IACf;AACA,cAAU,KAAK,IAAI;AACnB,gBAAY,KAAK,GAAG,mBAAmB;AACvC,oBAAgB;AAAA,EAClB;AAEA,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,UAAU,MAAM,CAAC;AACvB,UAAM,aAAa,IAAI;AACvB,UAAM,aAAa,YAAY,CAAC;AAEhC,QAAI,QAAQ,KAAK,OAAO,GAAG;AACzB;AAAA,IACF;AAEA,UAAM,cAAc,QAAQ,MAAM,MAAM,KAAK,CAAC,EAAE;AAChD,UAAM,SAAS,YAAY,CAAC,EAAE;AAC9B,UAAM,cAAc,QAAQ,MAAM,MAAM;AACxC,UAAM,UAAU,YAAY,QAAQ;AAEpC,UAAM,UAAU,QAAQ,MAAM,aAAa;AAC3C,QAAI,SAAS;AACX,UAAI,WAAW,GAAG;AAChB;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA,QAAQ;AAAA,QACV;AACA;AAAA,MACF;AAEA,uBAAiB,CAAC;AAClB,mBAAa;AAEb,YAAM,eAAe,QAAQ,CAAC,KAAK;AACnC,UAAI,gBAAgB,CAAC,UAAU,KAAK,YAAY,GAAG;AACjD;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA,QAAQ;AAAA,QACV;AAAA,MACF;AACA,UAAI,YAAY,aAAa,KAAK;AAClC,UAAI,UAAU,WAAW,GAAG,KAAK,UAAU,WAAW,GAAG,GAAG;AAC1D,oBAAY,UAAU,MAAM,CAAC,EAAE,KAAK;AAAA,MACtC;AAEA,YAAM,YAAY;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AACA,YAAM,cAAc,WAAW,MAAM,OAAO,SAAS;AACrD,YAAM,cAAc,YAAY,UAAU,SAAS,QAAQ;AAE3D,UAAI,CAAC,WAAW;AACd;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,WAAW,CAAC,oBAAoB,KAAK,SAAS,GAAG;AAC/C;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,UAAI,aAAa,oBAAoB,KAAK,SAAS,GAAG;AACpD,cAAM,WAAW,QAAQ,IAAI,SAAS;AACtC,YAAI,UAAU;AACZ,gBAAM,eAAe,SAAS,MAAM;AACpC;AAAA,YACE;AAAA,YACA;AAAA,YACA,kBAAkB,SAAS,6BAA6B,YAAY;AAAA,YACpE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF,OAAO;AACL,kBAAQ,IAAI,WAAW,SAAS;AAAA,QAClC;AAAA,MACF;AAEA,sBAAgB;AAAA,QACd,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,MAAM;AAAA,QACN,gBAAgB,IAAI;AAAA,MACtB;AACA;AAAA,IACF;AAEA,QAAI,CAAC,cAAc,CAAC,eAAe;AACjC;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,mBAAiB,MAAM,MAAM;AAE7B,MAAI,CAAC,YAAY;AACf;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,WAAW,YAAY;AAClC;AAEA,SAAS,mBACP,OACA,aACA,YACA,UACA,SAC+C;AAC/C,QAAM,cAA4B,CAAC;AACnC,QAAM,OAAiB,EAAE,MAAM,QAAQ,UAAU,CAAC,EAAE;AACpD,QAAM,QAAqB,CAAC,EAAE,MAAM,MAAM,OAAO,GAAG,CAAC;AACrD,MAAI,kBAAiC;AACrC,MAAI,oBAAmC;AACvC,MAAI,0BAA0B;AAC9B,QAAM,oBAAoB,oBAAI,IAAmC;AACjE,QAAM,kBAAoC,CAAC;AAE3C,MAAI,IAAI;AAER,SAAO,IAAI,UAAU;AACnB,UAAM,UAAU,MAAM,CAAC;AACvB,UAAM,aAAa,IAAI;AACvB,UAAM,aAAa,YAAY,CAAC;AAChC;AAEA,QAAI,QAAQ,KAAK,OAAO,GAAG;AACzB;AAAA,IACF;AAEA,UAAM,WAAW,QAAQ,QAAQ,GAAI;AACrC,QAAI,aAAa,IAAI;AACnB;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAM,cAAc,QAAQ,MAAM,MAAM,KAAK,CAAC,EAAE;AAChD,UAAM,SAAS,YAAY,CAAC,EAAE;AAC9B,UAAM,cAAc,QAAQ,MAAM,MAAM;AACxC,UAAM,UAAU,YAAY,QAAQ;AAEpC,QAAI,SAAS,MAAM,GAAG;AACpB;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS;AAErB,QAAI,oBAAoB,QAAQ,SAAS,iBAAiB;AACxD,wBAAkB;AAAA,IACpB;AACA,QAAI,sBAAsB,QAAQ,SAAS,mBAAmB;AAC5D,0BAAoB;AAAA,IACtB;AAEA,UAAM,iBAAiB,oBAAoB,QAAQ,QAAQ;AAC3D,UAAM,mBAAmB,sBAAsB,QAAQ,QAAQ;AAE/D,WAAO,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,CAAC,EAAE,SAAS,OAAO;AACjE,YAAM,IAAI;AAAA,IACZ;AAEA,UAAM,cAAc,MAAM,MAAM,SAAS,CAAC,EAAE;AAC5C,QAAI,QAAQ,cAAc,KAAK,CAAC,kBAAkB,CAAC,kBAAkB;AACnE;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT;AAAA,MACF;AACA,cAAQ,cAAc;AAAA,IACxB;AAEA,6BAAyB,mBAAmB,KAAK;AACjD,UAAM,eAAe,aAAa,KAAK,OAAO;AAC9C,UAAM,aAAa,WAAW,KAAK,OAAO,KAAK,CAAC;AAChD,QAAI,CAAC,gBAAgB,CAAC,YAAY;AAChC,wBAAkB,OAAO,KAAK;AAAA,IAChC;AAEA,QAAI,YAAY,WAAW;AACzB,UAAI,UAAU,GAAG;AACf;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA,QAAQ;AAAA,QACV;AAAA,MACF,WAAW,yBAAyB;AAClC;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA,QAAQ;AAAA,QACV;AAAA,MACF,OAAO;AACL,YAAI,CAAC,KAAK,cAAc;AACtB,eAAK,eAAe,EAAE,SAAS,CAAC,EAAE;AAAA,QACpC;AACA,4BAAoB;AAAA,MACtB;AACA;AAAA,IACF;AAEA,QAAI,YAAY,SAAS;AACvB;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA,QAAQ;AAAA,MACV;AACA,UAAI,UAAU,GAAG;AACf,0BAAkB;AAAA,MACpB;AACA;AAAA,IACF;AAEA,QAAI,YAAY,UAAU;AACxB,UAAI,UAAU,GAAG;AACf;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA,QAAQ;AAAA,QACV;AAAA,MACF,WAAW,KAAK,OAAO;AACrB;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA,QAAQ;AAAA,QACV;AAAA,MACF,OAAO;AACL,aAAK,QAAQ,EAAE,QAAQ,CAAC,EAAE;AAC1B,aAAK,aAAa,CAAC;AAAA,MACrB;AACA,UAAI,UAAU,GAAG;AACf,0BAAkB;AAAA,MACpB;AACA;AAAA,IACF;AAEA,QAAI,YAAY,WAAW;AACzB,UAAI,UAAU,GAAG;AACf;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA,QAAQ;AAAA,QACV;AAAA,MACF,WAAW,yBAAyB;AAClC;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA,QAAQ;AAAA,QACV;AAAA,MACF,WAAW,KAAK,iBAAiB;AAC/B;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA,QAAQ;AAAA,QACV;AAAA,MACF,OAAO;AACL,aAAK,kBAAkB;AAAA,MACzB;AACA;AAAA,IACF;AAEA,QAAI,oBAAoB,QAAQ,QAAQ,iBAAiB;AACvD,UAAI,UAAU,kBAAkB,GAAG;AACjC;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT;AAAA,QACF;AACA;AAAA,MACF;AAEA,YAAM,OAAO,cAAc,aAAa,YAAY,SAAS,GAAG,YAAY,WAAW;AACvF,UAAI,QAAQ,KAAK,YAAY;AAE3B,cAAM,WAAW,KAAK,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI;AACjE,YAAI,UAAU;AACZ;AAAA,YACE;AAAA,YACA;AAAA,YACA,+BAA+B,KAAK,IAAI;AAAA,YACxC;AAAA,YACA,SAAS;AAAA,YACT;AAAA,YACA,QAAQ;AAAA,UACV;AAAA,QACF,OAAO;AACL,eAAK,WAAW,KAAK,IAAI;AAAA,QAC3B;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,sBAAsB,QAAQ,QAAQ,mBAAmB;AAC3D,UAAI,UAAU,oBAAoB,GAAG;AACnC;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT;AAAA,QACF;AACA;AAAA,MACF;AAEA,YAAM,QAAQ,oBAAoB,SAAS,YAAY,SAAS,GAAG,YAAY,WAAW;AAC1F,UAAI,SAAS,KAAK,cAAc;AAC9B,aAAK,aAAa,QAAQ,KAAK,KAAK;AAAA,MACtC;AACA;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,MAAM,SAAS,CAAC,EAAE;AAEvC,QAAI,QAAQ,WAAW,MAAM,GAAG;AAC9B,YAAM,YAAY;AAAA,QAChB;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MACF;AACA,UAAI,CAAC,WAAW;AACd;AAAA,MACF;AACA,YAAM,UAAmB;AAAA,QACvB,MAAM;AAAA,QACN,UAAU,UAAU;AAAA,QACpB,WAAW,UAAU;AAAA,QACrB,MAAM,CAAC;AAAA,QACP,OAAO,UAAU;AAAA,QACjB,WAAW,UAAU;AAAA,QACrB,eAAe,UAAU;AAAA,MAC3B;AACA,uBAAiB,QAAQ,OAAO;AAChC,UAAI,WAAW,MAAM;AACnB,kCAA0B;AAAA,MAC5B;AACA,YAAM,KAAK,EAAE,MAAM,SAAS,MAAM,CAAC;AACnC;AAAA,IACF;AAEA,QAAI,QAAQ,WAAW,KAAK,GAAG;AAC7B,YAAM,SAAS;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MACF;AACA,UAAI,CAAC,QAAQ;AACX;AAAA,MACF;AACA,YAAM,QAAyB,EAAE,MAAM,eAAe,UAAU,CAAC,EAAE;AACnE,YAAM,SAA4B;AAAA,QAChC,MAAM;AAAA,QACN,MAAM,OAAO;AAAA,QACb,MAAM,CAAC;AAAA,QACP,OAAO,OAAO;AAAA,QACd,WAAW,OAAO;AAAA,QAClB,UAAU,OAAO;AAAA,MACnB;AACA,YAAM,SAAS,KAAK,MAAM;AAC1B,uBAAiB,QAAQ,KAAK;AAC9B,UAAI,WAAW,MAAM;AACnB,kCAA0B;AAAA,MAC5B;AACA,wBAAkB,IAAI,OAAO,EAAE,MAAM,OAAO,OAAO,SAAS,MAAM,CAAC;AACnE,sBAAgB,KAAK;AAAA,QACnB;AAAA,QACA,MAAM;AAAA,QACN,QAAQ,SAAS;AAAA,QACjB;AAAA,QACA,QAAQ,OAAO;AAAA,MACjB,CAAC;AACD,UAAI,OAAO,YAAY;AACrB,cAAM,aAAa;AAAA,UACjB,OAAO;AAAA,UACP;AAAA,UACA,OAAO,gBAAgB,SAAS;AAAA,UAChC;AAAA,UACA;AAAA,QACF;AACA,YAAI,YAAY;AACd,iBAAO,KAAK,KAAK,UAAU;AAAA,QAC7B;AAAA,MACF,OAAO;AACL,cAAM,KAAK,EAAE,MAAM,+BAA+B,OAAO,MAAM,GAAG,MAAM,CAAC;AAAA,MAC3E;AACA;AAAA,IACF;AAEA,QAAI,cAAc;AAChB,YAAM,QAAQ,kBAAkB,IAAI,KAAK;AACzC,UAAI,CAAC,OAAO;AACV;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA,QAAQ;AAAA,QACV;AACA;AAAA,MACF;AACA,UAAI,MAAM,SAAS;AACjB;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA,QAAQ;AAAA,QACV;AACA;AAAA,MACF;AACA,YAAM,SAAS;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MACF;AACA,UAAI,CAAC,QAAQ;AACX;AAAA,MACF;AACA,YAAM,SAA4B;AAAA,QAChC,MAAM;AAAA,QACN,MAAM,OAAO;AAAA,QACb,MAAM,CAAC;AAAA,QACP,OAAO,OAAO;AAAA,QACd,WAAW,OAAO;AAAA,QAClB,UAAU,OAAO;AAAA,MACnB;AACA,YAAM,KAAK,SAAS,KAAK,MAAM;AAC/B,sBAAgB,KAAK;AAAA,QACnB;AAAA,QACA,MAAM;AAAA,QACN,QAAQ,SAAS;AAAA,QACjB;AAAA,QACA,QAAQ,OAAO;AAAA,MACjB,CAAC;AACD,UAAI,OAAO,YAAY;AACrB,cAAM,aAAa;AAAA,UACjB,OAAO;AAAA,UACP;AAAA,UACA,OAAO,gBAAgB,SAAS;AAAA,UAChC;AAAA,UACA;AAAA,QACF;AACA,YAAI,YAAY;AACd,iBAAO,KAAK,KAAK,UAAU;AAAA,QAC7B;AAAA,MACF,OAAO;AACL,cAAM,KAAK,EAAE,MAAM,+BAA+B,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AAAA,MAChF;AACA;AAAA,IACF;AAEA,QAAI,YAAY;AACd,YAAM,QAAQ,kBAAkB,IAAI,KAAK;AACzC,UAAI,CAAC,OAAO;AACV;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA,QAAQ;AAAA,QACV;AACA;AAAA,MACF;AACA,UAAI,MAAM,SAAS;AACjB;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA,QAAQ;AAAA,QACV;AACA;AAAA,MACF;AACA,YAAM,SAAS,gBAAgB,aAAa,YAAY,SAAS,GAAG,YAAY,WAAW;AAC3F,UAAI,CAAC,QAAQ;AACX;AAAA,MACF;AACA,YAAM,SAA4B;AAAA,QAChC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM,CAAC;AAAA,QACP,OAAO,OAAO;AAAA,QACd,WAAW,OAAO;AAAA,MACpB;AACA,YAAM,KAAK,SAAS,KAAK,MAAM;AAC/B,YAAM,UAAU;AAChB,sBAAgB,KAAK;AAAA,QACnB;AAAA,QACA,MAAM;AAAA,QACN,QAAQ,SAAS;AAAA,QACjB;AAAA,QACA,QAAQ,OAAO;AAAA,MACjB,CAAC;AACD,UAAI,OAAO,YAAY;AACrB,cAAM,aAAa;AAAA,UACjB,OAAO;AAAA,UACP;AAAA,UACA,OAAO,gBAAgB,SAAS;AAAA,UAChC;AAAA,UACA;AAAA,QACF;AACA,YAAI,YAAY;AACd,iBAAO,KAAK,KAAK,UAAU;AAAA,QAC7B;AAAA,MACF,OAAO;AACL,cAAM,KAAK,EAAE,MAAM,+BAA+B,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AAAA,MAChF;AACA;AAAA,IACF;AAEA,UAAM,YAAY,QAAQ,MAAM,6BAA6B;AAC7D,QAAI,WAAW;AACb,YAAM,WAAW,UAAU,CAAC;AAC5B,UAAI,CAAC,gBAAgB,MAAM,GAAG;AAC5B;AAAA,UACE;AAAA,UACA;AAAA,UACA,SAAS,QAAQ;AAAA,UACjB;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA,QAAQ;AAAA,QACV;AACA,cAAM,KAAK,EAAE,MAAM,4BAA4B,QAAQ,GAAG,MAAM,CAAC;AACjE;AAAA,MACF;AAEA,UAAI,CAAC,OAAO,OAAO;AACjB,eAAO,QAAQ,CAAC;AAAA,MAClB;AACA,YAAM,WAAW,OAAO,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,QAAQ;AACnE,YAAM,YACJ,YACA;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,UAAU,CAAC;AAAA,MACb;AACF,UAAI,CAAC,UAAU;AACb,eAAO,MAAM,KAAK,SAAS;AAAA,MAC7B,OAAO;AACL;AAAA,UACE;AAAA,UACA;AAAA,UACA,mBAAmB,QAAQ,YAAY,OAAO,IAAI;AAAA,UAClD;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA,QAAQ;AAAA,QACV;AAAA,MACF;AACA,YAAM,KAAK,EAAE,MAAM,kBAAkB,QAAQ,SAAS,GAAG,MAAM,CAAC;AAChE;AAAA,IACF;AAEA,QAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA,QAAQ;AAAA,MACV;AACA,YAAM,eAAe,QAAQ,MAAM,CAAC,EAAE,MAAM,KAAK,EAAE,CAAC,KAAK;AACzD,YAAM,KAAK,EAAE,MAAM,4BAA4B,YAAY,GAAG,MAAM,CAAC;AACrE;AAAA,IACF;AAEA,QAAI,YAAY,WAAW,GAAG,GAAG;AAE/B,YAAM,UAAU,YAAY,MAAM,CAAC,EAAE,KAAK;AAG1C,UAAI,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG,KAAM,IAAI,YAAY,QAAQ,eAAe,MAAM,CAAC,CAAC,GAAI;AAExG,YAAI,aAAa;AACjB,eAAO,IAAI,UAAU;AACnB,gBAAM,UAAU,MAAM,CAAC;AACvB,gBAAM,aAAa,eAAe,OAAO;AACzC,gBAAM,cAAc,QAAQ,KAAK;AAKjC,cAAI,aAAa,SAAS,YAAY,SAAS,GAAG;AAChD,0BAAc,OAAO;AACrB;AAAA,UACF,WAAW,eAAe,SAAS,YAAY,KAAK,WAAW,GAAG;AAEhE,0BAAc,OAAO;AACrB;AAEA;AAAA,UACF,OAAO;AACL;AAAA,UACF;AAAA,QACF;AAEA,cAAMQ,WAA8B;AAAA,UAClC,MAAM;AAAA,UACN,YAAY;AAAA,QACd;AACA,yBAAiB,QAAQA,QAAO;AAChC,YAAI,WAAW,MAAM;AACnB,oCAA0B;AAAA,QAC5B;AACA;AAAA,MACF;AAEA,YAAM,UAAU,oBAAoB,aAAa,YAAY,SAAS,GAAG,YAAY,WAAW;AAChG,UAAI,SAAS;AACX,yBAAiB,QAAQ,OAAO;AAChC,YAAI,WAAW,MAAM;AACnB,oCAA0B;AAAA,QAC5B;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,YAAY,WAAW,GAAG,GAAG;AAC/B,YAAM,WAAW,cAAc,aAAa,YAAY,SAAS,GAAG,YAAY,WAAW;AAC3F,UAAI,UAAU;AACZ,yBAAiB,QAAQ,QAAQ;AACjC,YAAI,WAAW,MAAM;AACnB,oCAA0B;AAAA,QAC5B;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,YAAY,WAAW,IAAI,GAAG;AAChC,YAAM,WAAW,oBAAoB,aAAa,YAAY,SAAS,GAAG,YAAY,WAAW;AACjG,UAAI,UAAU;AACZ,yBAAiB,QAAQ,QAAQ;AACjC,YAAI,WAAW,MAAM;AACnB,oCAA0B;AAAA,QAC5B;AAAA,MACF;AACA;AAAA,IACF;AAGA,QAAI,WAAW;AACf,QAAI,eAAe;AAEnB,QAAI,QAAQ,SAAS,GAAG,KAAK,CAAC,QAAQ,SAAS,GAAG,GAAG;AAEnD,UAAI,cAAc,QAAQ,MAAM,KAAK,KAAK,CAAC,GAAG,UAAU,QAAQ,MAAM,KAAK,KAAK,CAAC,GAAG;AACpF,aAAO,eAAe,YAAY,aAAa,GAAG;AAChD,cAAM,UAAU,MAAM,YAAY;AAClC;AACA,oBAAY,OAAO;AACnB,uBAAe,QAAQ,MAAM,KAAK,KAAK,CAAC,GAAG,UAAU,QAAQ,MAAM,KAAK,KAAK,CAAC,GAAG;AAAA,MACnF;AAEA,UAAI;AAAA,IACN;AAEA,UAAM,gBAAgB,qBAAqB,UAAU,YAAY,SAAS,GAAG,YAAY,WAAW;AACpG,QAAI,CAAC,eAAe;AAElB,YAAM,WAAW,iBAAiB,SAAS,YAAY,SAAS,GAAG,YAAY,WAAW;AAC1F,UAAI,YAAY,SAAS,MAAM,SAAS,GAAG;AACzC,yBAAiB,QAAQ,QAAQ;AACjC,YAAI,WAAW,MAAM;AACnB,oCAA0B;AAAA,QAC5B;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAM,UAAU,cAAc;AAC9B,QAAI,4BAA4B;AAChC,SAAK,QAAQ,SAAS,aAAa,QAAQ,SAAS,gBAAgB,QAAQ,SAAS,WAAW,GAAG;AACjG,YAAM,qBAAqB;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,mBAAmB,WAAW,SAAS,GAAG;AAC5C,gBAAQ,WAAW,KAAK,GAAG,mBAAmB,UAAU;AACxD,oCAA4B;AAAA,MAC9B;AACA,UAAI,mBAAmB;AAAA,IACzB;AAEA,qBAAiB,QAAQ,OAAO;AAChC,QAAI,WAAW,MAAM;AACnB,gCAA0B;AAAA,IAC5B;AACA,UAAM,KAAK,EAAE,MAAM,SAAS,MAAM,CAAC;AACnC,QAAI,2BAA2B;AAE7B,YAAM,KAAK,EAAE,MAAM,SAAS,OAAO,QAAQ,EAAE,CAAC;AAAA,IAChD;AAAA,EACF;AAEA,MAAI,KAAK,cAAc;AACrB,kCAA8B,KAAK,cAAc,WAAW;AAAA,EAC9D;AACA,2BAAyB,MAAM,WAAW;AAE1C,aAAW,QAAQ,iBAAiB;AAClC,QAAI,KAAK,OAAO,KAAK,WAAW,GAAG;AACjC;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK,UAAU;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS;AACnB,gBAAY,KAAK,GAAG,eAAe,MAAM,QAAQ,OAAO,CAAC;AACzD,gBAAY,KAAK,GAAG,aAAa,MAAM,QAAQ,QAAQ,KAAK,CAAC;AAAA,EAC/D;AAGA,cAAY,KAAK,GAAG,mBAAmB,IAAI,CAAC;AAE5C,SAAO,EAAE,MAAM,YAAY;AAC7B;AAEA,SAAS,iBAAiB,OAA2B;AACnD,QAAM,UAAoB,CAAC;AAC3B,MAAI,SAAS;AACb,aAAW,QAAQ,OAAO;AACxB,YAAQ,KAAK,MAAM;AACnB,cAAU,KAAK,SAAS;AAAA,EAC1B;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,aAA2B,YAAmC;AACvF,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AACA,QAAM,SAAS,gBAAgB,UAAU;AACzC,SAAO,YAAY,IAAI,CAAC,SAAS;AAC/B,QAAI,KAAK,QAAQ,WAAW,MAAM,GAAG;AACnC,aAAO;AAAA,IACT;AACA,WAAO,EAAE,GAAG,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,OAAO,GAAG;AAAA,EACxD,CAAC;AACH;AAEA,SAAS,yBAAyB,OAA2C,OAAqB;AAChG,aAAW,OAAO,MAAM,KAAK,MAAM,KAAK,CAAC,GAAG;AAC1C,QAAI,MAAM,OAAO;AACf,YAAM,OAAO,GAAG;AAAA,IAClB;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,QAAoB,OAAmB;AAC/D,MAAI,YAAY,MAAM,GAAG;AACvB,WAAO,KAAK,KAAK,KAAK;AAAA,EACxB,OAAO;AACL,WAAO,SAAS,KAAK,KAAK;AAAA,EAC5B;AACF;AAEA,SAAS,YAAY,QAAuC;AAC1D,SAAO,UAAU,UAAU,OAAO,SAAS;AAC7C;AAEA,SAAS,gBAAgB,QAA6C;AACpE,SAAO,UAAU,UAAU,OAAO,SAAS;AAC7C;AAYA,SAAS,uBACP,MACA,aACA,YACA,QACA,YACA,aACgC;AAChC,QAAM,UAAU,YAAY,QAAQ;AACpC,QAAM,QAAQ,SAAS,OAAO,QAAQ;AACtC,MAAI,CAAC,QAAQ,WAAW,KAAK,GAAG;AAC9B;AAAA,MACE;AAAA,MACA;AAAA,MACA,SAAS,OAAO,6CAA6C;AAAA,MAC7D;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,UAAU,MAAM;AAAA,IAC1B;AACA,WAAO;AAAA,EACT;AACA,QAAM,YAAY,WAAW,YAAY,QAAQ,MAAM,QAAQ,UAAU;AACzE,QAAM,YAAY,QAAQ,MAAM,MAAM,MAAM;AAC5C,MAAI,CAAC,UAAU,KAAK,GAAG;AACrB;AAAA,MACE;AAAA,MACA;AAAA,MACA,SAAS,OAAO,mCAAmC;AAAA,MACnD;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,UAAU,MAAM;AAAA,IAC1B;AACA,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,UAAU,UAAU;AAC7C,QAAM,aAAa,iBAAiB,WAAW,GAAG;AAGlD,MAAI,CAAC,YAAY;AACf;AAAA,MACE;AAAA,MACA;AAAA,MACA,SAAS,OAAO,8CAA8C;AAAA,MAC9D;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,UAAU,MAAM;AAAA,IAC1B;AACA,WAAO;AAAA,EACT;AAEA,MAAI,UAAU;AACd,MAAI,eAAe;AAEnB,QAAM,YAAY,QAAQ,QAAQ,KAAK,MAAM,MAAM;AACnD,QAAM,aAAa,QAAQ,YAAY,GAAG;AAC1C,MAAI,cAAc,MAAM,cAAc,WAAW;AAC/C;AAAA,MACE;AAAA,MACA;AAAA,MACA,SAAS,OAAO,wCAAwC;AAAA,MACxD;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,UAAU,MAAM;AAAA,IAC1B;AACA,WAAO;AAAA,EACT;AACA,YAAU,QAAQ,MAAM,YAAY,GAAG,UAAU;AACjD,iBAAe,QAAQ,MAAM,aAAa,CAAC;AAE3C,QAAM,OAAO,QAAQ,KAAK;AAC1B,MAAI,CAAC,MAAM;AACT;AAAA,MACE;AAAA,MACA;AAAA,MACA,SAAS,OAAO,mCAAmC;AAAA,MACnD;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,UAAU;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AACA,QAAM,wBAAwB,QAAQ,SAAS,QAAQ,UAAU,EAAE;AACnE,QAAM,aAAa,aACf,SAAS,QAAQ,QAAQ,KAAK,MAAM,MAAM,IAAI,IAAI,wBAClD,SAAS,MAAM,UAAU,UAAU,SAAS,UAAU,UAAU,EAAE,UAAU;AAChF,QAAM,WAAW,WAAW,YAAY,YAAY,KAAK,QAAQ,UAAU;AAC3E,QAAM,aAAa,aAAa,KAAK;AACrC,QAAM,kBAAkB,QAAQ,SAAS,aAAa;AACtD,QAAM,oBAAoB,aAAa,SAAS,WAAW;AAC3D,QAAM,eACJ,WAAW,SAAS,IAAI,SAAS,kBAAkB,oBAAoB;AACzE,SAAO;AAAA,IACL;AAAA,IACA,YAAY,WAAW,SAAS,aAAa;AAAA,IAC7C;AAAA,IACA,iBAAiB,QAAQ,UAAU;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,gBACP,aACA,YACA,QACA,YACA,aACgC;AAChC,QAAM,UAAU,YAAY,QAAQ;AACpC,QAAM,QAAQ,QAAQ,MAAM,eAAe;AAC3C,MAAI,CAAC,OAAO;AACV;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,UAAU;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AACA,QAAM,QAAQ;AACd,QAAM,YAAY,WAAW,YAAY,QAAQ,MAAM,QAAQ,UAAU;AACzE,QAAM,eAAe,MAAM,CAAC,KAAK;AACjC,QAAM,mBAAmB,aAAa,KAAK;AAG3C,MAAI,iBAAiB,WAAW,GAAG,GAAG;AACpC;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,UAAU;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,aAAa;AACnB,QAAM,kBAAkB,QAAQ,SAAS,aAAa;AACtD,QAAM,oBAAoB,aAAa,SAAS,WAAW;AAC3D,QAAM,eACJ,WAAW,SAAS,IAAI,SAAS,kBAAkB,oBAAoB;AACzE,SAAO;AAAA,IACL,YAAY,WAAW,SAAS,aAAa;AAAA,IAC7C;AAAA,IACA,iBAAiB,QAAQ,UAAU;AAAA,IACnC;AAAA,IACA;AAAA,EACF;AACF;AAUA,SAAS,eACP,aACA,YACA,QACA,YACA,aACwB;AACxB,QAAM,UAAU,YAAY,QAAQ;AACpC,QAAM,QAAQ;AAEd,MAAI,CAAC,QAAQ,WAAW,KAAK,GAAG;AAC9B;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,UAAU;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,WAAW,YAAY,QAAQ,MAAM,QAAQ,UAAU;AACzE,QAAM,YAAY,QAAQ,MAAM,MAAM,MAAM,EAAE,UAAU;AAGxD,MAAI,CAAC,UAAU,WAAW,GAAG,GAAG;AAC9B;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,UAAU;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,QAAQ,QAAQ,KAAK,MAAM,MAAM;AACnD,QAAM,aAAa,QAAQ,YAAY,GAAG;AAE1C,MAAI,cAAc,MAAM,cAAc,WAAW;AAC/C;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,UAAU;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,QAAQ,MAAM,YAAY,GAAG,UAAU,EAAE,KAAK;AAC9D,QAAM,QAAQ,QAAQ,MAAM,wCAAwC;AAEpE,MAAI,CAAC,OAAO;AACV;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,UAAU;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,MAAM,CAAC;AACxB,QAAM,eAAe,MAAM,CAAC;AAE5B,MAAI,CAAC,YAAY,CAAC,cAAc;AAC9B;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,UAAU;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,aAAa,KAAK;AACpC,MAAI,CAAC,WAAW;AACd;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,UAAU;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,6BAA6B,aAAa,SAAS,aAAa,UAAU,EAAE;AAClF,QAAM,eAAe,YAAY;AACjC,QAAM,0BAA0B,QAAQ,SAAS,aAAa;AAC9D,QAAM,kBAAkB,SAAS,eAAe,0BAA0B;AAC1E,QAAM,gBAAgB,WAAW,YAAY,iBAAiB,UAAU,QAAQ,UAAU;AAE1F,SAAO,EAAE,UAAU,WAAW,OAAO,WAAW,cAAc;AAChE;AAEA,SAAS,gBACP,QACA,YACA,QACA,YACA,aACa;AACb,QAAM,UAAU,OAAO,KAAK;AAC5B,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,WAAO,cAAc,SAAS,YAAY,QAAQ,YAAY,WAAW;AAAA,EAC3E;AAEA,MAAI,QAAQ,WAAW,IAAI,GAAG;AAC5B,WAAO,oBAAoB,SAAS,YAAY,QAAQ,YAAY,WAAW;AAAA,EACjF;AAEA,MAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IACV;AACA,WAAO;AAAA,EACT;AAEA,SAAO,aAAa,SAAS,YAAY,QAAQ,YAAY,WAAW;AAC1E;AAEA,SAAS,+BACP,OACA,QAC0B;AAC1B,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,UAAU,OAAO;AAAA,EACnB;AACF;AAEA,SAAS,kBAAkB,OAAsB,MAA8B;AAC7E,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,UAAU,KAAK;AAAA,EACjB;AACF;AAEA,SAAS,4BAA4B,MAA2B;AAC9D,QAAM,QAAuB;AAAA,IAC3B,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY,CAAC;AAAA,IACb,UAAU,CAAC;AAAA,EACb;AACA,QAAM,OAAkB,EAAE,MAAM,QAAQ,MAAM,UAAU,CAAC,EAAE;AAC3D,SAAO,kBAAkB,OAAO,IAAI;AACtC;AAEA,SAAS,cACP,aACA,YACA,QACA,YACA,aACiB;AACjB,QAAM,UAAU,YAAY,QAAQ;AACpC,MAAI,UAAU;AACd,MAAI,gBAAgB;AAEpB,MAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,cAAU,QAAQ,MAAM,CAAC;AACzB,qBAAiB;AAEjB,QAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,gBAAU,QAAQ,MAAM,CAAC;AACzB,uBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,SAAO,iBAAiB,SAAS,YAAY,eAAe,YAAY,WAAW;AACrF;AAEA,SAAS,iBACP,SACA,YACA,eACA,YACA,aACiB;AACjB,QAAM,QAA2B,CAAC;AAClC,MAAI,SAAS;AACb,MAAI,aAAa;AAEjB,QAAM,YAAY,MAAY;AAC5B,QAAI,WAAW,QAAQ;AACrB,YAAM,KAAK,EAAE,MAAM,QAAQ,OAAO,WAAW,CAAC;AAC9C,mBAAa;AAAA,IACf;AAAA,EACF;AAEA,SAAO,SAAS,QAAQ,QAAQ;AAC9B,UAAM,KAAK,QAAQ,MAAM;AAEzB,QAAI,OAAO,KAAK;AACd,gBAAU;AACV,UAAI,QAAQ,SAAS,CAAC,MAAM,KAAK;AAC/B,cAAMC,aAAY;AAClB,cAAMC,WAAU,QAAQ,QAAQ,MAAM,SAAS,CAAC;AAChD,YAAIA,aAAY,IAAI;AAClB;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,gBAAgBD;AAAA,YAChB;AAAA,UACF;AACA,wBAAc,QAAQ,MAAMA,UAAS;AACrC;AAAA,QACF;AACA,cAAME,SAAQ,QAAQ,MAAMF,aAAY,GAAGC,QAAO,EAAE,KAAK;AACzD,YAAI,CAACC,QAAO;AACV;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,gBAAgBF;AAAA,YAChB;AAAA,YACAC,WAAUD;AAAA,UACZ;AAAA,QACF,OAAO;AACL,gBAAM,WAAW,QAAQ,MAAMA,aAAY,GAAGC,QAAO;AACrD,gBAAM,oBAAoB,SAAS,SAAS,SAAS,UAAU,EAAE;AACjE,gBAAM,aAAa,gBAAgBD,aAAY,IAAI;AACnD,gBAAM,KAAK;AAAA,YACT,MAAM;AAAA,YACN,OAAOE;AAAA,YACP,MAAM,WAAW,YAAY,YAAYA,OAAM,QAAQ,UAAU;AAAA,UACnE,CAAC;AAAA,QACH;AACA,iBAASD,WAAU;AACnB;AAAA,MACF;AAEA,YAAM,YAAY;AAClB,YAAM,UAAU,QAAQ,QAAQ,KAAK,SAAS,CAAC;AAC/C,UAAI,YAAY,IAAI;AAClB;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,gBAAgB;AAAA,UAChB;AAAA,QACF;AACA,sBAAc,QAAQ,MAAM,SAAS;AACrC;AAAA,MACF;AACA,YAAM,QAAQ,QAAQ,MAAM,YAAY,GAAG,OAAO,EAAE,KAAK;AACzD,UAAI,CAAC,OAAO;AACV;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,gBAAgB;AAAA,UAChB;AAAA,UACA,UAAU;AAAA,QACZ;AAAA,MACF,OAAO;AACL,cAAM,WAAW,QAAQ,MAAM,YAAY,GAAG,OAAO;AACrD,cAAM,oBAAoB,SAAS,SAAS,SAAS,UAAU,EAAE;AACjE,cAAM,aAAa,gBAAgB,YAAY,IAAI;AACnD,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,OAAO;AAAA,UACP,MAAM,WAAW,YAAY,YAAY,MAAM,QAAQ,UAAU;AAAA,QACnE,CAAC;AAAA,MACH;AACA,eAAS,UAAU;AACnB;AAAA,IACF;AAEA,QAAI,OAAO,KAAK;AACd,gBAAU;AACV,UAAI,QAAQ,SAAS,CAAC,MAAM,KAAK;AAC/B;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,gBAAgB;AAAA,UAChB;AAAA,UACA;AAAA,QACF;AACA,kBAAU;AACV;AAAA,MACF;AACA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,gBAAgB;AAAA,QAChB;AAAA,MACF;AACA,gBAAU;AACV;AAAA,IACF;AAEA,kBAAc;AACd,cAAU;AAAA,EACZ;AAEA,YAAU;AAEV,SAAO,EAAE,MAAM,QAAQ,MAAM;AAC/B;AAEA,SAAS,oBACP,MACA,YACA,QACA,YACA,aACuB;AACvB,QAAM,UAAU,KAAK,QAAQ;AAC7B,QAAM,aAAa,QAAQ,QAAQ,IAAI;AACvC,MAAI,eAAe,IAAI;AACrB;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,MAAM,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ;AAC/C;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,aAAa;AAAA,MACtB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,QAAQ,MAAM,GAAG,UAAU,EAAE,KAAK;AAChD,MAAI,CAAC,OAAO;AACV;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,IACf;AACA,WAAO;AAAA,EACT;AACA,QAAM,WAAW,QAAQ,MAAM,GAAG,UAAU;AAC5C,QAAM,oBAAoB,SAAS,SAAS,SAAS,UAAU,EAAE;AACjE,QAAM,aAAa,SAAS,IAAI;AAChC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM,WAAW,YAAY,YAAY,MAAM,QAAQ,UAAU;AAAA,EACnE;AACF;AAEA,SAAS,oBACP,MACA,YACA,QACA,YACA,aAC2B;AAC3B,MAAI,CAAC,KAAK,WAAW,GAAG,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,KAAK,MAAM,CAAC,EAAE,KAAK;AACnC,MAAI,CAAC,SAAS;AACZ;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,KAAK,MAAM,CAAC;AAC/B,QAAM,oBAAoB,WAAW,SAAS,WAAW,UAAU,EAAE;AACrE,QAAM,aAAa,SAAS,IAAI;AAEhC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,MAAM,WAAW,YAAY,YAAY,QAAQ,QAAQ,UAAU;AAAA,EACrE;AACF;AA8CA,SAAS,oBACP,MACA,YACA,QACA,YACA,aACuB;AACvB,QAAM,QAAQ,KAAK,MAAM,uBAAuB;AAChD,MAAI,CAAC,OAAO;AACV;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK,IAAI,KAAK,QAAQ,CAAC;AAAA,IACzB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,CAAC,EAAE,KAAK;AAC9B,MAAI,CAAC,2BAA2B,KAAK,OAAO,GAAG;AAC7C;AAAA,MACE;AAAA,MACA;AAAA,MACA,qBAAqB,OAAO;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,MAAM,CAAC;AACnB,QAAM,WAAW,KAAK,QAAQ,GAAG;AACjC,QAAM,YAAY,YAAY,IAAI,SAAS,WAAW;AACtD,QAAM,UAAU,kBAAkB,KAAK,YAAY,WAAW,YAAY,WAAW;AACrF,MAAI,CAAC,QAAQ,QAAQ;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,KAAK,QAAQ,OAAO;AACtC,QAAM,aAAa,aAAa,IAAI,SAAS,YAAY;AACzD,QAAM,OAAO,WAAW,YAAY,YAAY,QAAQ,QAAQ,UAAU;AAE1E,SAAO,EAAE,MAAM,SAAS,SAAS,KAAK;AACxC;AAEA,SAAS,kBACP,KACA,YACA,QACA,YACA,aACU;AACV,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,CAAC,SAAS;AACZ;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK,IAAI,IAAI,QAAQ,CAAC;AAAA,IACxB;AACA,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,mBAAmB,QAAQ,WAAW,GAAG,IAAI,QAAQ,MAAM,CAAC,IAAI;AACtE,QAAM,QAAQ,iBAAiB,MAAM,GAAG;AACxC,QAAM,UAAoB,CAAC;AAC3B,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,KAAK,KAAK;AACxB,QAAI,CAAC,OAAO;AACV;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK,IAAI,IAAI,QAAQ,CAAC;AAAA,MACxB;AACA,aAAO,CAAC;AAAA,IACV;AACA,YAAQ,KAAK,KAAK;AAAA,EACpB;AAEA,SAAO;AACT;AAEA,SAAS,8BACP,cACA,aACM;AACN,QAAM,OAAO,oBAAI,IAA4B;AAC7C,aAAW,SAAS,aAAa,SAAS;AACxC,UAAM,WAAW,KAAK,IAAI,MAAM,IAAI;AACpC,QAAI,UAAU;AACZ,UAAI,MAAM,MAAM;AACd,oBAAY,KAAK;AAAA,UACf,UAAU;AAAA,UACV,MAAM;AAAA,UACN,SAAS,0BAA0B,MAAM,IAAI;AAAA,UAC7C,MAAM,MAAM;AAAA,QACd,CAAC;AAAA,MACH,OAAO;AACL,iBAAS,aAAa,aAAa,0BAA0B,MAAM,IAAI,MAAM,GAAG,GAAG,CAAC;AAAA,MACtF;AACA;AAAA,IACF;AACA,SAAK,IAAI,MAAM,MAAM,KAAK;AAAA,EAC5B;AACF;AAEA,SAAS,yBAAyB,MAAgB,aAAiC;AACjF,QAAM,UAAU,IAAI,IAAY,KAAK,cAAc,QAAQ,IAAI,CAAC,UAAU,MAAM,IAAI,KAAK,CAAC,CAAC;AAC3F,aAAW,SAAS,KAAK,UAAU;AACjC,6BAAyB,OAAO,SAAS,WAAW;AAAA,EACtD;AACF;AAEA,SAAS,yBACP,MACA,SACA,aACM;AACN,MAAI,KAAK,SAAS,aAAa,KAAK,SAAS,aAAa;AACxD,UAAM,QAAQ,KAAK,SAAS,YAAa,KAAK,cAAc,CAAC,IAAK,CAAC;AACnE,UAAM,UAAU,KAAK,SAAS,YAAY,KAAK,UAAU,CAAC;AAC1D,YAAQ,QAAQ,CAAC,KAAK,UAAU;AAC9B,YAAM,QAAQ,IAAI,MAAM,8BAA8B;AACtD,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AACA,YAAM,YAAY,MAAM,CAAC;AACzB,UAAI,QAAQ,IAAI,SAAS,GAAG;AAC1B;AAAA,MACF;AACA,YAAM,OAAO,MAAM,KAAK;AACxB,UAAI,MAAM;AACR,oBAAY,KAAK;AAAA,UACf,UAAU;AAAA,UACV,MAAM;AAAA,UACN,SAAS,0BAA0B,SAAS;AAAA,UAC5C;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AACL,iBAAS,aAAa,aAAa,0BAA0B,SAAS,MAAM,GAAG,GAAG,CAAC;AAAA,MACrF;AAAA,IACF,CAAC;AACD,eAAW,SAAS,KAAK,UAAU;AACjC,+BAAyB,OAAO,SAAS,WAAW;AAAA,IACtD;AACA,QAAI,KAAK,SAAS,eAAe,KAAK,OAAO;AAC3C,iBAAW,QAAQ,KAAK,OAAO;AAC7B,mBAAW,SAAS,KAAK,UAAU;AACjC,mCAAyB,OAAO,SAAS,WAAW;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AACA;AAAA,EACF;AAEA,MAAI,KAAK,SAAS,eAAe;AAC/B,eAAW,UAAU,KAAK,UAAU;AAClC,iBAAW,SAAS,OAAO,MAAM;AAC/B,iCAAyB,OAAO,SAAS,WAAW;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAEA,MAAI,KAAK,SAAS,OAAO;AACvB,eAAW,SAAS,KAAK,MAAM;AAC7B,+BAAyB,OAAO,SAAS,WAAW;AAAA,IACtD;AAAA,EACF;AACF;AAaA,SAAS,8BACP,QACA,YACA,QACA,YACA,aACkC;AAClC,MAAI,YAAY;AAChB,MAAI,WAAW;AACf,MAAI,YAAY;AAChB,QAAM,aAA0B,CAAC;AAEjC,SAAO,UAAU,SAAS,GAAG;AAC3B,QAAI,CAAC,gCAAgC,KAAK,SAAS,GAAG;AACpD;AAAA,IACF;AACA,gBAAY;AACZ,UAAM,SAAS;AACf,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT;AAAA,IACF;AACA,QAAI,KAAK,WAAW,OAAO,QAAQ;AACjC;AAAA,IACF;AACA,gBAAY,OAAO,SAAS,KAAK;AACjC,gBAAY;AAAA,EACd;AAEA,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,YAAY,SAAS;AAAA,EACvB;AACF;AAEA,SAAS,mBACP,QACA,YACA,QACA,YACA,aACoB;AACpB,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,UAAU,OAAO,KAAK,SAAS,GAAG;AACrC,WAAO;AAAA,EACT;AACA,SAAO,OAAO;AAChB;AAEA,SAAS,qBACP,MACA,YACA,QACA,YACA,aAC4B;AAC5B,MAAI;AACJ,MAAI,SAAS;AACb,MAAI,oBAAoB;AAExB,MAAI,KAAK,MAAM,MAAM,KAAK;AAExB,WAAO;AAAA,EACT,OAAO;AACL,UAAM,YAAY,KAAK,MAAM,0BAA0B;AACvD,QAAI,CAAC,WAAW;AAEd,aAAO;AAAA,IACT;AACA,WAAO,UAAU,CAAC;AAClB,aAAS,KAAK;AAAA,EAChB;AAGA,QAAM,WAAW,KAAK,MAAM,MAAM;AAClC,QAAM,cAAc,SAAS,KAAK,IAAI;AAGtC,MAAI,eAAe,SAAS,SAAS,GAAG;AACtC,UAAM,cAAc,SAAS,UAAU;AACvC,QAAI,YAAY,SAAS,KAAK,CAAC,YAAY,WAAW,GAAG,GAAG;AAE1D,aAAO;AAAA,IACT;AAAA,EACF;AAGA,MAAI,SAAS,KAAK,QAAQ;AACxB,UAAM,WAAW,KAAK,MAAM;AAC5B,QAAI,aAAa,OAAO,aAAa,OAAO,CAAC,KAAK,KAAK,QAAQ,GAAG;AAEhE,aAAO;AAAA,IACT;AAAA,EACF;AAGA,QAAM,UAAoB,CAAC;AAC3B,QAAM,aAA2B,CAAC;AAElC,MAAI,CAAC,aAAa;AAChB,WAAO,SAAS,KAAK,UAAU,KAAK,MAAM,MAAM,KAAK;AACnD;AACA,YAAM,aAAa,KAAK,MAAM,MAAM,EAAE,MAAM,oBAAoB;AAChE,UAAI,CAAC,YAAY;AACf;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT;AAAA,QACF;AACA,eAAO;AAAA,MACT;AACA,YAAM,YAAY,WAAW,CAAC;AAC9B,cAAQ,KAAK,SAAS;AACtB,iBAAW,KAAK,WAAW,YAAY,SAAS,QAAQ,UAAU,QAAQ,UAAU,CAAC;AACrF,gBAAU,UAAU;AAAA,IACtB;AAAA,EACF;AAGA,QAAM,aAA0B,CAAC;AACjC,MAAI,SAAS,KAAK,UAAU,KAAK,MAAM,MAAM,KAAK;AAChD,UAAM,aAAa,gBAAgB,MAAM,QAAQ,YAAY,QAAQ,YAAY,WAAW;AAC5F,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AACA,eAAW,KAAK,GAAG,WAAW,UAAU;AACxC,wBAAoB;AACpB,aAAS,WAAW;AAAA,EACtB;AAGA,MAAI;AACJ,MAAI;AACJ,QAAM,kBAAkB;AACxB,SAAO,SAAS,KAAK,UAAU,KAAK,KAAK,KAAK,MAAM,CAAC,GAAG;AACtD;AAAA,EACF;AACA,MAAI,SAAS,KAAK,UAAU,KAAK,MAAM,MAAM,KAAK;AAChD,UAAM,cAAc,SAAS;AAC7B;AACA,UAAM,WAAW,KAAK,MAAM,MAAM;AAClC,UAAM,YAAY,SAAS,KAAK;AAChC,QAAI,CAAC,WAAW;AACd;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,OAAO;AACL,cAAQ;AACR,YAAM,oBAAoB,SAAS,SAAS,SAAS,UAAU,EAAE;AACjE,YAAM,kBAAkB,SAAS,SAAS;AAC1C,kBAAY,WAAW,YAAY,iBAAiB,UAAU,QAAQ,UAAU;AAAA,IAClF;AACA,aAAS,KAAK;AAAA,EAChB,OAAO;AACL,aAAS;AAAA,EACX;AAGA,QAAM,UAAU,KAAK,MAAM,MAAM;AACjC,MAAI,OAAO,QAAQ,UAAU;AAC7B,MAAI,aAAa,SAAS,UAAU,QAAQ,SAAS,KAAK;AAC1D,QAAM,WAAmB,CAAC;AAE1B,MAAI,KAAK,SAAS,GAAG;AACnB,UAAM,cAAc;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,aAAa;AACf,iBAAW,KAAK,GAAG,YAAY,UAAU;AACzC,aAAO,YAAY;AACnB,mBAAa,YAAY;AAAA,IAC3B;AAEA,QAAI,KAAK,SAAS,GAAG;AACnB,UAAI,CAAC,KAAK,WAAW,GAAG,GAAG;AACzB;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,KAAK,IAAI,KAAK,QAAQ,CAAC;AAAA,QACzB;AAAA,MACF,OAAO;AACL,YAAI,UAAU,KAAK,MAAM,CAAC;AAC1B,YAAI,gBAAgB,aAAa;AACjC,YAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,oBAAU,QAAQ,MAAM,CAAC;AACzB,2BAAiB;AAAA,QACnB;AACA,cAAM,WAAW;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,YAAI,UAAU;AACZ,mBAAS,KAAK,QAAQ;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,aAAa;AACf,UAAM,YAA2B;AAAA,MAC/B,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,OAAO;AACT,gBAAU,QAAQ;AAClB,gBAAU,YAAY;AAAA,IACxB;AACA,WAAO,EAAE,MAAM,WAAW,kBAAkB;AAAA,EAC9C,OAAO;AACL,UAAM,UAAuB;AAAA,MAC3B,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,WAAW,QAAQ;AACrB,cAAQ,aAAa;AAAA,IACvB;AACA,QAAI,OAAO;AACT,cAAQ,QAAQ;AAChB,cAAQ,YAAY;AAAA,IACtB;AACA,WAAO,EAAE,MAAM,SAAS,kBAAkB;AAAA,EAC5C;AACF;AAEA,SAAS,aACP,MACA,YACA,QACA,YACA,aACoC;AACpC,QAAM,SAAS,qBAAqB,MAAM,YAAY,QAAQ,YAAY,WAAW;AACrF,SAAO,SAAS,OAAO,OAAO;AAChC;AAEA,SAAS,8BACP,OACA,aACA,YACA,UACA,aACA,aACgD;AAChD,QAAM,aAA0B,CAAC;AACjC,MAAI,QAAQ;AAEZ,SAAO,QAAQ,UAAU;AACvB,UAAM,UAAU,MAAM,KAAK;AAC3B,QAAI,QAAQ,KAAK,OAAO,GAAG;AACzB;AAAA,IACF;AACA,QAAI,QAAQ,SAAS,GAAI,GAAG;AAC1B;AAAA,IACF;AACA,UAAM,cAAc,QAAQ,MAAM,MAAM,KAAK,CAAC,EAAE;AAChD,UAAM,SAAS,YAAY,CAAC,EAAE;AAC9B,QAAI,SAAS,MAAM,GAAG;AACpB;AAAA,IACF;AACA,UAAM,QAAQ,SAAS;AACvB,QAAI,UAAU,cAAc,GAAG;AAC7B;AAAA,IACF;AAEA,UAAM,cAAc,QAAQ,MAAM,MAAM;AACxC,UAAM,UAAU,YAAY,QAAQ;AACpC,UAAM,oBAAoB,QAAQ,SAAS,QAAQ,UAAU,EAAE;AAC/D,UAAM,WAAW,QAAQ,UAAU;AACnC,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AAEA,UAAM,aAAa,QAAQ;AAC3B,UAAM,aAAa,YAAY,KAAK;AACpC,UAAM,aAAa,SAAS,IAAI;AAChC,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,gBAAgB;AACnB;AAAA,IACF;AAEA,eAAW,KAAK,GAAG,cAAc;AACjC;AAAA,EACF;AAEA,SAAO,EAAE,YAAY,WAAW,MAAM;AACxC;AAOA,SAAS,gBACP,MACA,YACA,YACA,QACA,YACA,aAC8B;AAC9B,MAAI,KAAK,UAAU,MAAM,KAAK;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,aAA0B,CAAC;AACjC,MAAI,SAAS,aAAa;AAC1B,MAAI,QAAQ;AACZ,MAAI,aAAa;AAGjB,SAAO,SAAS,KAAK,UAAU,QAAQ,GAAG;AACxC,UAAM,KAAK,KAAK,MAAM;AACtB,QAAI,OAAO,KAAK;AACd;AACA,oBAAc;AAAA,IAChB,WAAW,OAAO,KAAK;AACrB;AACA,UAAI,QAAQ,GAAG;AACb,sBAAc;AAAA,MAChB;AAAA,IACF,OAAO;AACL,oBAAc;AAAA,IAChB;AACA;AAAA,EACF;AAEA,MAAI,UAAU,GAAG;AACf;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAGA,QAAM,eAAe,WAAW,KAAK;AACrC,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO,EAAE,YAAY,CAAC,GAAG,UAAU,OAAO;AAAA,EAC5C;AAIA,QAAM,YAAY,aAAa,MAAM,IAAI;AACzC,MAAI,cAAc;AAElB,aAAW,YAAY,WAAW;AAChC,UAAM,cAAc,SAAS,KAAK;AAClC,QAAI,YAAY,WAAW,EAAG;AAI9B,UAAM,UAAU,YAAY,QAAQ,GAAG;AACvC,QAAI,UAAU,KAAK,8BAA8B,KAAK,WAAW,GAAG;AAElE,UAAI,aAAa;AAEf,YAAI,YAAY,qBAAqB,aAAa,YAAY,aAAa,YAAY,QAAQ,UAAU;AAEzG,eAAO,WAAW;AAChB,sBAAY,qBAAqB,WAAW,YAAY,aAAa,YAAY,QAAQ,UAAU;AAAA,QACrG;AACA,sBAAc;AAAA,MAChB;AACA,oBAAc;AAAA,IAChB,OAAO;AAEL,UAAI,aAAa;AACf,uBAAe,MAAM;AAAA,MACvB,OAAO;AAEL,sBAAc;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAGA,MAAI,aAAa;AACf,QAAI,YAAY,qBAAqB,aAAa,YAAY,aAAa,YAAY,QAAQ,UAAU;AACzG,WAAO,WAAW;AAChB,kBAAY,qBAAqB,WAAW,YAAY,aAAa,YAAY,QAAQ,UAAU;AAAA,IACrG;AAAA,EACF;AAEA,SAAO,EAAE,YAAY,UAAU,OAAO;AACxC;AAGA,SAAS,wBACP,QACA,aACA,YACA,QACA,YACwC;AACxC,MAAI,CAAC,OAAO,WAAW,GAAG,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI,aAAa;AACjB,MAAI,aAAa;AACjB,MAAI,eAAe;AACnB,MAAI,QAAgC;AACpC,MAAI,UAAU;AAEd,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,OAAO,OAAO,CAAC;AAErB,QAAI,OAAO;AACT,UAAI,SAAS;AACX,kBAAU;AACV;AAAA,MACF;AACA,UAAI,SAAS,MAAM;AACjB,kBAAU;AACV;AAAA,MACF;AACA,UAAI,SAAS,OAAO;AAClB,gBAAQ;AAAA,MACV;AACA;AAAA,IACF;AAEA,QAAI,SAAS,OAAO,SAAS,OAAO,SAAS,KAAK;AAChD,cAAQ;AACR;AAAA,IACF;AAEA,QAAI,SAAS,KAAK;AAChB;AACA;AAAA,IACF;AACA,QAAI,SAAS,KAAK;AAChB;AACA,UAAI,eAAe,KAAK,eAAe,KAAK,iBAAiB,GAAG;AAC9D,eAAO,EAAE,OAAO,OAAO,MAAM,GAAG,IAAI,CAAC,GAAG,MAAM,OAAO,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE;AAAA,MAC3E;AACA;AAAA,IACF;AACA,QAAI,SAAS,KAAK;AAChB;AACA;AAAA,IACF;AACA,QAAI,SAAS,KAAK;AAChB,UAAI,aAAa,GAAG;AAClB;AAAA,MACF;AACA;AAAA,IACF;AACA,QAAI,SAAS,KAAK;AAChB;AACA;AAAA,IACF;AACA,QAAI,SAAS,KAAK;AAChB,UAAI,eAAe,GAAG;AACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,qBACP,SACA,YACA,aACA,YACA,QACA,YACQ;AACR,QAAM,UAAU,QAAQ,KAAK;AAG7B,QAAM,YAAY,QAAQ,MAAM,kCAAkC;AAClE,MAAI,WAAW;AACb,UAAM,WAAW,UAAU,CAAC;AAC5B,UAAM,cAAc,QAAQ,MAAM,UAAU,CAAC,EAAE,MAAM;AAErD,QAAI,YAAY,WAAW,GAAG;AAC5B;AAAA,QACE;AAAA,QACA;AAAA,QACA,aAAa,QAAQ;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,wBAAwB,aAAa,aAAa,YAAY,QAAQ,UAAU;AACnG,QAAI,YAAY;AACd,iBAAW,KAAK,EAAE,MAAM,UAAU,OAAO,WAAW,MAAM,CAAC;AAC3D,aAAO,WAAW;AAAA,IACpB;AAGA,UAAM,YAAY,YAAY,CAAC;AAC/B,QAAI,cAAc,OAAO,cAAc,KAAK;AAC1C,UAAI,IAAI;AACR,UAAI,QAAQ;AACZ,UAAI,UAAU;AAEd,aAAO,IAAI,YAAY,QAAQ;AAC7B,cAAM,OAAO,YAAY,CAAC;AAE1B,YAAI,SAAS;AACX,mBAAS;AACT,oBAAU;AAAA,QACZ,WAAW,SAAS,MAAM;AACxB,oBAAU;AAAA,QACZ,WAAW,SAAS,WAAW;AAE7B,qBAAW,KAAK,EAAE,MAAM,UAAU,OAAO,YAAY,QAAQ,UAAU,CAAC;AAExE,iBAAO,YAAY,MAAM,IAAI,CAAC,EAAE,KAAK;AAAA,QACvC,OAAO;AACL,mBAAS;AAAA,QACX;AACA;AAAA,MACF;AAGA;AAAA,QACE;AAAA,QACA;AAAA,QACA,+BAA+B,QAAQ;AAAA,QACvC;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,aAAO;AAAA,IACT,OAAO;AAEL,YAAM,gBAAgB,YAAY,MAAM,QAAQ;AAChD,UAAI,eAAe;AACjB,mBAAW,KAAK,EAAE,MAAM,UAAU,OAAO,cAAc,CAAC,EAAE,CAAC;AAC3D,eAAO,YAAY,MAAM,cAAc,CAAC,EAAE,MAAM,EAAE,KAAK;AAAA,MACzD;AACA,aAAO;AAAA,IACT;AAAA,EACF,OAAO;AAEL,UAAM,YAAY,QAAQ,MAAM,oCAAoC;AACpE,QAAI,WAAW;AACb,iBAAW,KAAK,EAAE,MAAM,UAAU,CAAC,GAAG,OAAO,KAAK,CAAC;AACnD,aAAO,UAAU,CAAC,IAAI,UAAU,CAAC,EAAE,KAAK,IAAI;AAAA,IAC9C,OAAO;AACL;AAAA,QACE;AAAA,QACA;AAAA,QACA,6BAA6B,QAAQ,MAAM,GAAG,EAAE,CAAC;AAAA,QACjD;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,cACP,MACA,YACA,QACA,YACA,aACiB;AACjB,QAAM,UAAU,KAAK,KAAK;AAG1B,MAAI,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAG;AAC3E;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IACV;AACA,WAAO;AAAA,EACT;AAGA,QAAM,gBAAgB,QAAQ,MAAM,kCAAkC;AACtE,MAAI,eAAe;AACjB,UAAM,OAAO,cAAc,CAAC;AAC5B,UAAM,YAAY,KAAK,QAAQ,IAAI;AACnC,UAAM,aAAa,SAAS;AAC5B,WAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,MAAM,WAAW,YAAY,YAAY,KAAK,QAAQ,UAAU;AAAA,IAClE;AAAA,EACF;AAGA,QAAM,aAAa,QAAQ,MAAM,8BAA8B;AAC/D,MAAI,YAAY;AACd,UAAM,OAAO,WAAW,CAAC;AACzB,UAAM,YAAY,KAAK,QAAQ,IAAI;AACnC,UAAM,aAAa,SAAS;AAC5B,WAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,MAAM,WAAW,YAAY,YAAY,KAAK,QAAQ,UAAU;AAAA,IAClE;AAAA,EACF;AAGA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV;AACA,SAAO;AACT;AAEA,SAAS,SACP,aACA,MACA,SACA,MACA,QACA,YACA,SAAS,GACH;AACN,cAAY,KAAK;AAAA,IACf,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,MAAM,WAAW,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,GAAG,UAAU;AAAA,EAChE,CAAC;AACH;;;AP9+EA,oBAKO;;;AQxBA,SAAS,WAAW,YAAoB,OAAwC;AACrF,QAAM,aAA+B,CAAC;AACtC,QAAM,UAA2B,CAAC;AAElC,aAAW,OAAO,OAAO;AACvB,UAAM,UAAU,eAAe,IAAI,KAAK;AACxC,QAAI,CAAC,SAAS;AACZ,cAAQ,KAAK,GAAG;AAChB;AAAA,IACF;AACA,QAAI,QAAQ,QAAQ,KAAK,QAAQ,MAAM,QAAQ,SAAS,QAAQ,MAAM,WAAW,QAAQ;AACvF,cAAQ,KAAK,GAAG;AAChB;AAAA,IACF;AACA,eAAW,KAAK,EAAE,KAAK,OAAO,QAAQ,OAAO,KAAK,QAAQ,IAAI,CAAC;AAAA,EACjE;AAEA,aAAW,KAAK,CAAC,GAAG,MAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAM;AAEnF,QAAM,WAA6B,CAAC;AACpC,MAAI,aAAa;AACjB,aAAW,QAAQ,YAAY;AAC7B,QAAI,KAAK,QAAQ,YAAY;AAC3B,cAAQ,KAAK,KAAK,GAAG;AACrB;AAAA,IACF;AACA,aAAS,KAAK,IAAI;AAClB,iBAAa,KAAK;AAAA,EACpB;AAEA,MAAI,OAAO;AACX,WAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC7C,UAAM,EAAE,OAAO,KAAK,IAAI,IAAI,SAAS,CAAC;AACtC,WAAO,GAAG,KAAK,MAAM,GAAG,KAAK,CAAC,GAAG,IAAI,eAAe,GAAG,KAAK,MAAM,GAAG,CAAC;AAAA,EACxE;AAEA,SAAO,EAAE,MAAM,SAAS,SAAS,IAAI,CAAC,SAAS,KAAK,GAAG,GAAG,QAAQ;AACpE;AAEO,SAAS,sBACd,YACA,aACgB;AAChB,QAAM,QAAQ,YAAY,QAAQ,CAAC,SAAU,KAAK,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,CAAE;AACxE,SAAO,WAAW,YAAY,KAAK;AACrC;AAEA,SAAS,eAAe,MAAqE;AAC3F,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,KAAK,OAAO;AAC1B,QAAM,MAAM,KAAK,KAAK;AACtB,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,CAAC,OAAO,SAAS,GAAG,GAAG;AACpD,WAAO;AAAA,EACT;AACA,SAAO,EAAE,OAAO,IAAI;AACtB;;;AChDO,SAAS,aAAa,QAAgB,UAAyB,CAAC,GAAiB;AACtF,QAAM,aAAa,qBAAqB,QAAQ,MAAM;AACtD,QAAM,aAAa,OAAO,QAAQ,UAAU,IAAI;AAChD,QAAM,cAAc,MAAM,UAAU;AACpC,QAAM,cAAc,qBAAqB,YAAY,WAAW;AAChE,QAAME,aAAY,YAAY,KAAK,CAAC,SAAS,KAAK,aAAa,OAAO;AAEtE,MAAIA,YAAW;AACb,WAAO;AAAA,MACL,WAAW;AAAA,MACX;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,aAAa,mBAAmB,YAAY,WAAW,UAAU;AACvE,QAAM,YAAY,sBAAsB,UAAU;AAElD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,SAAS;AAAA,EACX;AACF;AAEA,SAAS,qBAAqB,aAAyC;AACrE,SAAO,YAAY,IAAI,CAAC,SAAS;AAC/B,QAAI,KAAK,SAAS,CAAC,KAAK,MAAM;AAC5B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO,KAAK;AAAA,IACd;AAAA,EACF,CAAC;AACH;AAEA,SAAS,qBAAqB,QAAyB;AACrD,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT;AACA,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,SAAS,GAAG;AAC1C,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AACA,SAAO,KAAK,MAAM,MAAM;AAC1B;AAEA,SAAS,mBAAmB,WAA2B,YAA4B;AACjF,QAAM,QAAkB,CAAC;AAEzB,aAAW,YAAY,WAAW;AAChC,QAAI,MAAM,UAAU,MAAM,MAAM,SAAS,CAAC,MAAM,IAAI;AAClD,YAAM,KAAK,EAAE;AAAA,IACf;AACA,UAAM,UAAU,SAAS,SAAS,SAAS;AAC3C,UAAM,KAAK,UAAU,OAAO,OAAO,EAAE,CAAC;AACtC,UAAM,OAAO,cAAc,SAAS,KAAK,UAAU;AACnD,QAAI,KAAK,KAAK,EAAE,SAAS,GAAG;AAC1B,YAAM,KAAK,GAAG,KAAK,MAAM,IAAI,CAAC;AAAA,IAChC;AAAA,EACF;AAEA,SAAO,MAAM,UAAU,MAAM,MAAM,SAAS,CAAC,MAAM,IAAI;AACrD,UAAM,IAAI;AAAA,EACZ;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,cAAc,MAAgB,YAA4B;AACjE,QAAM,WAAuB,CAAC;AAC9B,MAAI,KAAK,gBAAgB,KAAK,aAAa,QAAQ,SAAS,GAAG;AAC7D,aAAS,KAAK,mBAAmB,KAAK,cAAc,UAAU,CAAC;AAAA,EACjE;AACA,MAAI,KAAK,SAAS,KAAK,MAAM,OAAO,SAAS,GAAG;AAC9C,aAAS,KAAK,YAAY,KAAK,OAAO,UAAU,CAAC;AAAA,EACnD;AACA,MAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,aAAS,KAAK,YAAY,KAAK,UAAU,GAAG,UAAU,CAAC;AAAA,EACzD;AAEA,QAAM,QAAkB,CAAC;AACzB,aAAW,WAAW,UAAU;AAC9B,QAAI,CAAC,QAAQ,OAAQ;AACrB,QAAI,MAAM,UAAU,MAAM,MAAM,SAAS,CAAC,MAAM,IAAI;AAClD,YAAM,KAAK,EAAE;AAAA,IACf;AACA,eAAW,QAAQ,SAAS;AAC1B,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AAEA,SAAO,MAAM,UAAU,MAAM,MAAM,SAAS,CAAC,MAAM,IAAI;AACrD,UAAM,IAAI;AAAA,EACZ;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,mBAAmB,MAAwB,YAA8B;AAChF,QAAM,SAAS,aAAa,GAAG,UAAU;AACzC,QAAM,QAAkB,CAAC,SAAS;AAClC,aAAW,SAAS,KAAK,SAAS;AAChC,UAAM,MAAM,MAAM,QAAQ,KAAK,GAAG;AAClC,UAAM,KAAK,UAAU,GAAG,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,EAAE,CAAC;AAAA,EACzD;AACA,SAAO;AACT;AAEA,SAAS,YAAY,OAAkB,YAA8B;AACnE,QAAM,SAAS,aAAa,GAAG,UAAU;AACzC,QAAM,QAAkB,CAAC,OAAO;AAChC,aAAW,SAAS,MAAM,QAAQ;AAChC,UAAM,eAAe,MAAM,WAAW,MAAM;AAC5C,UAAM,KAAK,UAAU,GAAG,MAAM,GAAG,MAAM,IAAI,GAAG,YAAY,KAAK,MAAM,SAAS,KAAK,CAAC,EAAE,CAAC;AAAA,EACzF;AACA,SAAO;AACT;AAEA,SAAS,YAAY,OAAe,OAAe,YAA8B;AAC/E,QAAM,QAAkB,CAAC;AACzB,aAAW,QAAQ,OAAO;AACxB,UAAM,KAAK,GAAG,WAAW,MAAM,OAAO,UAAU,CAAC;AAAA,EACnD;AACA,SAAO;AACT;AAEA,SAAS,WAAW,MAAY,OAAe,YAA8B;AAC3E,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,cAAc,MAAM,OAAO,UAAU;AAAA,IAC9C,KAAK;AACH,aAAO,gBAAgB,MAAM,OAAO,UAAU;AAAA,IAChD,KAAK;AACH,aAAO,CAAC,eAAe,MAAM,OAAO,UAAU,CAAC;AAAA,IACjD,KAAK;AACH,aAAO,CAAC,UAAU,GAAG,aAAa,OAAO,UAAU,CAAC,MAAM,KAAK,KAAK,KAAK,CAAC;AAAA,IAC5E,KAAK;AACH,aAAO,qBAAqB,KAAK,YAAY,OAAO,UAAU;AAAA,IAChE,KAAK;AACH,aAAO,UAAU,MAAM,OAAO,UAAU;AAAA,IAC1C,KAAK;AACH,aAAO,kBAAkB,MAAM,OAAO,UAAU;AAAA,IAClD;AACE,aAAO,CAAC;AAAA,EACZ;AACF;AAEA,SAAS,cAAc,MAAkC,OAAe,YAA8B;AACpG,QAAM,SAAS,aAAa,OAAO,UAAU;AAC7C,MAAI,OAAO,GAAG,MAAM,GAAG,KAAK,IAAI,GAAG,gBAAgB,KAAK,OAAO,CAAC;AAChE,QAAM,QAAQ,iBAAiB,KAAK,UAAU;AAC9C,MAAI,OAAO;AACT,YAAQ,IAAI,KAAK;AAAA,EACnB;AACA,QAAM,WAAW,YAAY,KAAK,UAAU,QAAQ,GAAG,UAAU;AACjE,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,CAAC,UAAU,IAAI,CAAC;AAAA,EACzB;AACA,SAAO,CAAC,UAAU,IAAI,GAAG,GAAG,QAAQ;AACtC;AAEA,SAAS,gBAAgB,MAAoC,OAAe,YAA8B;AACxG,QAAM,SAAS,aAAa,OAAO,UAAU;AAC7C,MAAI,OAAO,GAAG,MAAM,GAAG,KAAK,IAAI;AAChC,QAAM,QAAQ,iBAAiB,KAAK,UAAU;AAC9C,MAAI,OAAO;AACT,YAAQ,IAAI,KAAK;AAAA,EACnB;AACA,QAAM,WAAW,YAAY,KAAK,UAAU,QAAQ,GAAG,UAAU;AACjE,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,CAAC,UAAU,IAAI,CAAC;AAAA,EACzB;AACA,SAAO,CAAC,UAAU,IAAI,GAAG,GAAG,QAAQ;AACtC;AAEA,SAAS,eAAe,MAAgB,OAAe,YAA4B;AACjF,QAAM,SAAS,aAAa,OAAO,UAAU;AAC7C,QAAM,OAAO,gBAAgB,KAAK,KAAK;AACvC,SAAO,UAAU,GAAG,MAAM,KAAK,IAAI,EAAE;AACvC;AAEA,SAAS,gBAAgB,OAA2B;AAClD,SAAO,MACJ,IAAI,CAAC,SAAS;AACb,QAAI,KAAK,SAAS,QAAQ;AACxB,aAAO,KAAK;AAAA,IACd;AACA,WAAO,IAAI,KAAK,KAAK;AAAA,EACvB,CAAC,EACA,KAAK,EAAE;AACZ;AAEA,SAAS,qBAAqB,YAAoB,OAAe,YAA8B;AAC7F,QAAM,SAAS,aAAa,OAAO,UAAU;AAC7C,QAAM,cAAc,aAAa,QAAQ,GAAG,UAAU;AACtD,QAAM,aAAa,WAAW,QAAQ,UAAU,IAAI,EAAE,QAAQ;AAC9D,MAAI,CAAC,WAAW,KAAK,GAAG;AACtB,WAAO,CAAC,UAAU,GAAG,MAAM,KAAK,WAAW,KAAK,CAAC,EAAE,CAAC;AAAA,EACtD;AACA,QAAM,QAAQ,WAAW,MAAM,IAAI;AACnC,QAAM,CAAC,OAAO,GAAG,IAAI,IAAI;AACzB,QAAM,SAAmB,CAAC,UAAU,GAAG,MAAM,KAAK,MAAM,KAAK,CAAC,EAAE,CAAC;AACjE,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,cAAc,IAAI;AACjC,aAAW,OAAO,MAAM;AACtB,QAAI,CAAC,IAAI,KAAK,GAAG;AACf,aAAO,KAAK,EAAE;AACd;AAAA,IACF;AACA,UAAM,gBAAgB,IAAI,MAAM,KAAK,IAAI,QAAQ,IAAI,MAAM,CAAC,EAAE,QAAQ;AACtE,WAAO,KAAK,UAAU,GAAG,WAAW,GAAG,aAAa,EAAE,CAAC;AAAA,EACzD;AACA,SAAO;AACT;AAEA,SAAS,cAAc,OAAyB;AAC9C,MAAI,MAAM,OAAO;AACjB,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,KAAK,KAAK,EAAG;AAClB,UAAM,cAAc,KAAK,MAAM,MAAM;AACrC,UAAM,eAAe,cAAc,YAAY,CAAC,EAAE,SAAS;AAC3D,UAAM,KAAK,IAAI,KAAK,YAAY;AAAA,EAClC;AACA,SAAO,OAAO,SAAS,GAAG,IAAI,MAAM;AACtC;AAEA,SAAS,UAAU,MAA8B,OAAe,YAA8B;AAC5F,QAAM,SAAS,aAAa,OAAO,UAAU;AAC7C,QAAM,SAAS,UAAU,GAAG,MAAM,QAAQ,KAAK,QAAQ,OAAO,KAAK,SAAS,EAAE;AAC9E,QAAM,OAAO,YAAY,KAAK,MAAM,QAAQ,GAAG,UAAU;AACzD,SAAO,KAAK,SAAS,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,MAAM;AAClD;AAEA,SAAS,kBAAkB,MAAsC,OAAe,YAA8B;AAC5G,QAAM,SAAS,aAAa,OAAO,UAAU;AAC7C,QAAM,QAAkB,CAAC;AACzB,OAAK,SAAS,QAAQ,CAAC,QAAQ,UAAU;AACvC,QAAI;AACJ,QAAI,UAAU,GAAG;AACf,kBAAY,QAAQ,OAAO,QAAQ,EAAE;AAAA,IACvC,WAAW,OAAO,MAAM;AACtB,kBAAY,YAAY,OAAO,IAAI;AAAA,IACrC,OAAO;AACL,kBAAY;AAAA,IACd;AACA,UAAM,KAAK,UAAU,GAAG,MAAM,GAAG,SAAS,EAAE,CAAC;AAC7C,UAAM,OAAO,YAAY,OAAO,MAAM,QAAQ,GAAG,UAAU;AAC3D,UAAM,KAAK,GAAG,IAAI;AAAA,EACpB,CAAC;AACD,SAAO;AACT;AAEA,SAAS,iBAAiB,YAAiC;AACzD,MAAI,CAAC,WAAW,QAAQ;AACtB,WAAO;AAAA,EACT;AACA,QAAM,SAAS,CAAC,GAAG,UAAU,EAAE,KAAK,CAAC,GAAG,MAAM;AAC5C,QAAI,EAAE,SAAS,EAAE,KAAM,QAAO;AAC9B,QAAI,EAAE,SAAS,QAAS,QAAO;AAC/B,QAAI,EAAE,SAAS,QAAS,QAAO;AAC/B,WAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,EACpC,CAAC;AACD,SAAO,OACJ,IAAI,CAAC,SAAS;AACb,QAAI,KAAK,UAAU,MAAM;AACvB,aAAO,KAAK;AAAA,IACd;AACA,WAAO,GAAG,KAAK,IAAI,IAAI,wBAAwB,KAAK,KAAK,CAAC;AAAA,EAC5D,CAAC,EACA,KAAK,GAAG;AACb;AAEA,SAAS,wBAAwB,OAAuB;AACtD,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,WAAW,GAAG,GAAG;AACtD,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAG;AACpD,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAG;AACpD,UAAM,QAAQ,QAAQ,MAAM,GAAG,EAAE,EAAE,QAAQ,MAAM,KAAK;AACtD,WAAO,IAAI,KAAK;AAAA,EAClB;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,SAA2B;AAClD,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,SAAO,QAAQ,IAAI,CAAC,QAAQ,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE;AAChD;AAEA,SAAS,aAAa,OAAe,YAA4B;AAC/D,SAAO,IAAI,OAAO,QAAQ,UAAU;AACtC;AAEA,SAAS,sBAAsB,QAAwB;AACrD,QAAM,UAAU,OAAO,QAAQ,SAAS,EAAE;AAC1C,SAAO,QAAQ,SAAS,GAAG,OAAO;AAAA,IAAO;AAC3C;AAEA,SAAS,UAAU,MAAsB;AACvC,SAAO,KAAK,QAAQ,YAAY,EAAE;AACpC;;;AC1UA,wBAAe;AA6BR,SAAS,mBAAmB,QAAgB,UAA6B,CAAC,GAAqB;AACpG,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,aAAa,kBAAAC,QAAG;AAAA,IACpB;AAAA,IACA;AAAA,IACA,kBAAAA,QAAG,aAAa;AAAA,IAChB;AAAA,IACA,gBAAgB,QAAQ;AAAA,EAC1B;AACA,QAAM,WAAqB,CAAC;AAC5B,QAAM,MAAwB,EAAE,YAAY,SAAS;AACrD,QAAM,mBAAmB,wBAAwB,UAAU;AAC3D,QAAM,YAAY,kBAAkB,YAAY,kBAAkB,GAAG;AACrE,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC7E;AAEA,QAAM,aAAa,gBAAgB,WAAW,kBAAkB,GAAG;AACnE,QAAM,gBAAgB,eAAe,UAAU,SAAS,KAAK,CAAC;AAC9D,MAAI,CAAC,cAAc,QAAQ;AACzB,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AAEA,QAAM,WAAqB,CAAC;AAC5B,MAAI,WAAW,QAAQ;AACrB,aAAS,KAAK,WAAW,KAAK,IAAI,CAAC;AAAA,EACrC;AACA,WAAS,KAAK,cAAc,KAAK,IAAI,CAAC;AAEtC,QAAM,SAAS,GAAG,SAAS,KAAK,MAAM,EAAE,QAAQ,CAAC;AAAA;AACjD,SAAO,EAAE,QAAQ,SAAS;AAC5B;AAEA,SAAS,gBAAgB,UAAiC;AACxD,QAAM,WAAW,SAAS,YAAY,GAAG;AACzC,QAAM,MAAM,aAAa,KAAK,KAAK,SAAS,MAAM,QAAQ,EAAE,YAAY;AACxE,MAAI,QAAQ,OAAQ,QAAO,kBAAAA,QAAG,WAAW;AACzC,MAAI,QAAQ,OAAQ,QAAO,kBAAAA,QAAG,WAAW;AACzC,MAAI,QAAQ,MAAO,QAAO,kBAAAA,QAAG,WAAW;AACxC,SAAO,kBAAAA,QAAG,WAAW;AACvB;AAEA,SAAS,wBAAwB,YAAqD;AACpF,QAAM,MAAM,oBAAI,IAAyB;AACzC,aAAW,aAAa,WAAW,YAAY;AAC7C,QAAI,kBAAAA,QAAG,uBAAuB,SAAS,KAAK,UAAU,MAAM;AAC1D,UAAI,IAAI,UAAU,KAAK,MAAM,wBAAwB,UAAU,SAAS,UAAU,CAAC;AAAA,IACrF,WAAW,kBAAAA,QAAG,uBAAuB,SAAS,KAAK,kBAAAA,QAAG,kBAAkB,UAAU,IAAI,GAAG;AACvF,UAAI,IAAI,UAAU,KAAK,MAAM,wBAAwB,UAAU,KAAK,SAAS,UAAU,CAAC;AAAA,IAC1F;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,SAAoC,YAAwC;AAC3G,QAAM,SAAsB,CAAC;AAC7B,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,kBAAAA,QAAG,oBAAoB,MAAM,KAAK,OAAO,SAAS,QAAW;AAChE;AAAA,IACF;AACA,UAAM,OAAO,gBAAgB,OAAO,MAAM,UAAU;AACpD,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AACA,UAAM,WAAW,OAAO,OAAO,OAAO,KAAK,QAAQ,UAAU,EAAE,KAAK,IAAI;AACxE,WAAO,KAAK;AAAA,MACV;AAAA,MACA,UAAU,QAAQ,OAAO,aAAa;AAAA,MACtC;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,kBACP,YACA,cACA,KACsB;AACtB,aAAW,aAAa,WAAW,YAAY;AAC7C,QAAI,kBAAAA,QAAG,sBAAsB,SAAS,KAAK,UAAU,MAAM;AACzD,YAAM,MAAM,cAAc,UAAU,IAAI;AACxC,UAAI,KAAK;AACP,cAAM,WAAW,8BAA8B,UAAU,YAAY,GAAG;AACxE,cAAM,YAAY,2BAA2B,UAAU,YAAY,cAAc,GAAG;AACpF,eAAO;AAAA,UACL,SAAS;AAAA,UACT,eAAe,UAAU;AAAA,UACzB,aAAa,UAAU;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,kBAAAA,QAAG,oBAAoB,SAAS,GAAG;AAC5C,iBAAW,QAAQ,UAAU,gBAAgB,cAAc;AACzD,cAAM,OAAO,KAAK;AAClB,YAAI,CAAC,KAAM;AACX,YAAI,kBAAAA,QAAG,gBAAgB,IAAI,KAAK,kBAAAA,QAAG,qBAAqB,IAAI,GAAG;AAC7D,gBAAM,MAAM,KAAK,OAAO,sBAAsB,KAAK,IAAI,IAAI;AAC3D,cAAI,CAAC,KAAK;AACR;AAAA,UACF;AACA,gBAAM,WAAW,8BAA8B,KAAK,YAAY,GAAG;AACnE,gBAAM,YAAY,2BAA2B,KAAK,YAAY,cAAc,GAAG;AAC/E,cAAI,CAAC,UAAU,YAAY,CAAC,UAAU,UAAU,KAAK,MAAM;AACzD,kBAAM,WAAW,+BAA+B,KAAK,MAAM,YAAY,YAAY;AACnF,gBAAI,SAAS,YAAY,CAAC,UAAU,UAAU;AAC5C,wBAAU,WAAW,SAAS;AAAA,YAChC;AACA,gBAAI,SAAS,UAAU,CAAC,UAAU,QAAQ;AACxC,wBAAU,SAAS,SAAS;AAAA,YAC9B;AAAA,UACF;AACA,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,eAAe,UAAU;AAAA,YACzB,aAAa,UAAU;AAAA,YACvB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,2BACP,YACA,cACA,KAC6C;AAC7C,MAAI,CAAC,WAAW,QAAQ;AACtB,WAAO,CAAC;AAAA,EACV;AACA,QAAM,QAAQ,WAAW,CAAC;AAC1B,MAAI,MAAM,MAAM;AACd,UAAM,WAAW,+BAA+B,MAAM,MAAM,IAAI,YAAY,YAAY;AACxF,QAAI,SAAS,QAAQ;AACnB,aAAO;AAAA,IACT;AACA,QAAI,SAAS,UAAU;AACrB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,CAAC;AACV;AAEA,SAAS,+BACP,UACA,YACA,cAC6C;AAC7C,MAAI,kBAAAA,QAAG,oBAAoB,QAAQ,GAAG;AACpC,UAAM,aAAa,qBAAqB,SAAS,QAAQ;AACzD,QAAI,cAAc,aAAa,IAAI,UAAU,GAAG;AAC9C,aAAO,EAAE,UAAU,WAAW;AAAA,IAChC;AACA,UAAM,UAAU,SAAS,gBAAgB,CAAC;AAC1C,QAAI,SAAS;AACX,UAAI,kBAAAA,QAAG,oBAAoB,OAAO,GAAG;AACnC,cAAM,SAAS,qBAAqB,QAAQ,QAAQ;AACpD,YAAI,UAAU,aAAa,IAAI,MAAM,GAAG;AACtC,iBAAO,EAAE,UAAU,OAAO;AAAA,QAC5B;AAAA,MACF,WAAW,kBAAAA,QAAG,kBAAkB,OAAO,GAAG;AACxC,eAAO,EAAE,QAAQ,wBAAwB,QAAQ,SAAS,UAAU,EAAE;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AACA,MAAI,kBAAAA,QAAG,kBAAkB,QAAQ,GAAG;AAClC,WAAO,EAAE,QAAQ,wBAAwB,SAAS,SAAS,UAAU,EAAE;AAAA,EACzE;AACA,SAAO,CAAC;AACV;AAEA,SAAS,qBAAqB,UAA6D;AACzF,MAAI,kBAAAA,QAAG,aAAa,QAAQ,GAAG;AAC7B,WAAO,SAAS;AAAA,EAClB;AACA,MAAI,kBAAAA,QAAG,gBAAgB,QAAQ,GAAG;AAChC,WAAO,SAAS,MAAM;AAAA,EACxB;AACA,MAAI,kBAAAA,QAAG,2BAA2B,QAAQ,GAAG;AAC3C,WAAO,qBAAqB,SAAS,IAAI;AAAA,EAC3C;AACA,SAAO;AACT;AAEA,SAAS,cAAc,MAAyC;AAC9D,aAAW,aAAa,KAAK,YAAY;AACvC,QAAI,kBAAAA,QAAG,kBAAkB,SAAS,KAAK,UAAU,YAAY;AAC3D,YAAM,MAAM,UAAU,UAAU,UAAU;AAC1C,UAAI,KAAK;AACP,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,MAA+C;AAC5E,MAAI,kBAAAA,QAAG,QAAQ,IAAI,GAAG;AACpB,WAAO,cAAc,IAAI;AAAA,EAC3B;AACA,SAAO,UAAU,IAAI;AACvB;AAEA,SAAS,UAAU,YAAoD;AACrE,MAAI,UAAyB;AAC7B,SAAO,kBAAAA,QAAG,0BAA0B,OAAO,GAAG;AAC5C,cAAU,QAAQ;AAAA,EACpB;AACA,MAAI,kBAAAA,QAAG,aAAa,OAAO,KAAK,kBAAAA,QAAG,cAAc,OAAO,KAAK,kBAAAA,QAAG,wBAAwB,OAAO,GAAG;AAChG,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,8BACP,YACA,KACqB;AACrB,QAAM,WAAW,oBAAI,IAAoB;AACzC,MAAI,CAAC,WAAW,QAAQ;AACtB,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,WAAW,CAAC;AAC1B,MAAI,CAAC,kBAAAA,QAAG,uBAAuB,MAAM,IAAI,GAAG;AAC1C,WAAO;AAAA,EACT;AACA,aAAW,WAAW,MAAM,KAAK,UAAU;AACzC,QAAI,CAAC,QAAQ,aAAa;AACxB;AAAA,IACF;AACA,UAAM,WAAW,0BAA0B,SAAS,IAAI,UAAU;AAClE,QAAI,CAAC,UAAU;AACb,UAAI,SAAS,KAAK,8CAA8C;AAChE;AAAA,IACF;AACA,aAAS,IAAI,UAAU,QAAQ,YAAY,QAAQ,IAAI,UAAU,EAAE,KAAK,CAAC;AAAA,EAC3E;AACA,SAAO;AACT;AAEA,SAAS,0BAA0B,SAA4B,YAA+C;AAC5G,QAAM,OAAO,QAAQ;AACrB,MAAI,MAAM;AACR,QAAI,kBAAAA,QAAG,aAAa,IAAI,KAAK,kBAAAA,QAAG,gBAAgB,IAAI,KAAK,kBAAAA,QAAG,iBAAiB,IAAI,GAAG;AAClF,aAAO,KAAK;AAAA,IACd;AACA,WAAO,KAAK,QAAQ,UAAU;AAAA,EAChC;AACA,MAAI,kBAAAA,QAAG,aAAa,QAAQ,IAAI,GAAG;AACjC,WAAO,QAAQ,KAAK;AAAA,EACtB;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAuB,YAA+C;AAC7F,MAAI,kBAAAA,QAAG,aAAa,IAAI,GAAG;AACzB,WAAO,KAAK;AAAA,EACd;AACA,MAAI,kBAAAA,QAAG,gBAAgB,IAAI,KAAK,kBAAAA,QAAG,iBAAiB,IAAI,GAAG;AACzD,WAAO,KAAK;AAAA,EACd;AACA,SAAO,KAAK,QAAQ,UAAU;AAChC;AAEA,SAAS,gBACP,MACA,kBACA,KACU;AACV,QAAM,SACJ,KAAK,gBACJ,KAAK,gBAAgB,iBAAiB,IAAI,KAAK,aAAa,KAAK,CAAC,IAAI,WACvE,CAAC;AACH,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,SAAS,MAAM;AACzC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,QAAQ,CAAC,OAAO;AACtB,MAAI,OAAO,QAAQ;AACjB,eAAW,SAAS,QAAQ;AAC1B,YAAM,MAAM,KAAK,SAAS,IAAI,MAAM,IAAI;AACxC,UAAI,OAAO,KAAK,MAAM,IAAI,GAAG,MAAM,WAAW,MAAM,EAAE,KAAK,MAAM,QAAQ;AACzE,UAAI,KAAK;AACP,gBAAQ,MAAM,GAAG;AAAA,MACnB;AACA,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF,OAAO;AACL,eAAW,CAAC,MAAM,QAAQ,KAAK,KAAK,SAAS,QAAQ,GAAG;AACtD,YAAM,KAAK,KAAK,IAAI,WAAW,QAAQ,EAAE;AAAA,IAC3C;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,MAAmB,KAAuB,QAA0B;AAC1F,MAAI,kBAAAA,QAAG,aAAa,IAAI,GAAG;AACzB,WAAO,kBAAkB,MAAM,KAAK,MAAM;AAAA,EAC5C;AACA,MAAI,kBAAAA,QAAG,wBAAwB,IAAI,GAAG;AACpC,WAAO,sBAAsB,MAAM,KAAK,MAAM;AAAA,EAChD;AACA,MAAI,kBAAAA,QAAG,cAAc,IAAI,GAAG;AAC1B,WAAO,mBAAmB,MAAM,KAAK,MAAM;AAAA,EAC7C;AACA,MAAI,kBAAAA,QAAG,UAAU,IAAI,GAAG;AACtB,WAAO,eAAe,MAAM,KAAK,MAAM;AAAA,EACzC;AACA,MAAI,kBAAAA,QAAG,gBAAgB,IAAI,GAAG;AAC5B,WAAO,qBAAqB,MAAM,KAAK,MAAM;AAAA,EAC/C;AACA,SAAO,CAAC;AACV;AAEA,SAAS,mBAAmB,UAA0B,KAAuB,QAA0B;AACrG,QAAM,QAAkB,CAAC;AACzB,aAAW,SAAS,SAAS,UAAU;AACrC,UAAM,KAAK,GAAG,eAAe,OAAO,KAAK,MAAM,CAAC;AAAA,EAClD;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,SAAwB,KAAuB,QAA0B;AAClG,QAAM,OAAO,iBAAiB,QAAQ,gBAAgB,KAAK,MAAM;AACjE,QAAM,WAAqB,CAAC;AAC5B,aAAW,SAAS,QAAQ,UAAU;AACpC,aAAS,KAAK,GAAG,eAAe,OAAO,KAAK,SAAS,CAAC,CAAC;AAAA,EACzD;AACA,MAAI,CAAC,SAAS,QAAQ;AACpB,WAAO,CAAC,IAAI;AAAA,EACd;AACA,SAAO,CAAC,MAAM,GAAG,QAAQ;AAC3B;AAEA,SAAS,sBAAsB,SAAmC,KAAuB,QAA0B;AACjH,SAAO,CAAC,iBAAiB,SAAS,KAAK,MAAM,CAAC;AAChD;AAEA,SAAS,iBAAiB,SAAmC,KAAuB,QAAwB;AAC1G,QAAM,YAAY,KAAK,OAAO,MAAM;AACpC,QAAM,UAAU,WAAW,QAAQ,SAAS,GAAG;AAC/C,QAAM,EAAE,eAAe,WAAW,IAAI,kBAAkB,QAAQ,YAAY,GAAG;AAC/E,QAAM,UAAU,cAAc,SAAS,cAAc,IAAI,CAAC,QAAQ,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI;AACxF,QAAM,aAAa,WAAW,SAAS,IAAI,WAAW,KAAK,GAAG,CAAC,MAAM;AACrE,SAAO,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU;AACtD;AAEA,SAAS,WAAW,KAA8B,KAA+B;AAC/E,QAAM,WAAW,IAAI,QAAQ,IAAI,UAAU;AAC3C,MAAI,kBAAAA,QAAG,aAAa,GAAG,GAAG;AACxB,WAAO,IAAI;AAAA,EACb;AACA,MAAI,kBAAAA,QAAG,2BAA2B,GAAG,GAAG;AACtC,UAAM,OAAO,WAAW,IAAI,YAAuC,GAAG;AACtE,WAAO,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI;AAAA,EACjC;AACA,MAAI,IAAI,SAAS,kBAAAA,QAAG,WAAW,aAAa;AAC1C,WAAO;AAAA,EACT;AACA,MAAI,kBAAAA,QAAG,oBAAoB,GAAG,GAAG;AAC/B,WAAO,GAAG,IAAI,UAAU,IAAI,IAAI,IAAI,KAAK,IAAI;AAAA,EAC/C;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,YAA8B,KAGvD;AACA,QAAM,gBAA0B,CAAC;AACjC,QAAM,QAAkB,CAAC;AAEzB,aAAW,QAAQ,WAAW,YAAY;AACxC,QAAI,kBAAAA,QAAG,eAAe,IAAI,GAAG;AAC3B,YAAM,WAAW,iBAAiB,KAAK,MAAM,GAAG;AAChD,UAAI,CAAC,UAAU;AACb,YAAI,SAAS,KAAK,sCAAsC;AACxD;AAAA,MACF;AACA,UAAI,aAAa,eAAe,aAAa,SAAS;AACpD,cAAM,UAAU,qBAAqB,MAAM,KAAK,eAAe,KAAK;AACpE,YAAI,CAAC,SAAS;AACZ,gBAAM,KAAK,gBAAgB,aAAa,cAAc,cAAc,UAAU,KAAK,aAAa,GAAG,CAAC;AAAA,QACtG;AACA;AAAA,MACF;AACA,YAAM,KAAK,gBAAgB,UAAU,KAAK,aAAa,GAAG,CAAC;AAAA,IAC7D,WAAW,kBAAAA,QAAG,qBAAqB,IAAI,GAAG;AACxC,UAAI,SAAS,KAAK,uDAAuD;AAAA,IAC3E;AAAA,EACF;AAEA,SAAO,EAAE,eAAe,YAAY,MAAM,OAAO,OAAO,EAAE;AAC5D;AAEA,SAAS,qBACP,MACA,KACA,eACA,OACS;AACT,MAAI,CAAC,KAAK,aAAa;AACrB,WAAO;AAAA,EACT;AACA,MAAI,kBAAAA,QAAG,gBAAgB,KAAK,WAAW,GAAG;AACxC,kBAAc,KAAK,GAAG,gBAAgB,KAAK,YAAY,IAAI,CAAC;AAC5D,WAAO;AAAA,EACT;AACA,MAAI,kBAAAA,QAAG,gBAAgB,KAAK,WAAW,KAAK,KAAK,YAAY,YAAY;AACvE,UAAM,iBAAiB,KAAK,YAAY,WAAW,QAAQ,IAAI,UAAU,EAAE,KAAK;AAChF,UAAM,KAAK,cAAc,cAAc,GAAG;AAC1C,WAAO;AAAA,EACT;AACA,MAAI,SAAS,KAAK,mDAAmD;AACrE,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAyB;AAChD,SAAO,MACJ,MAAM,KAAK,EACX,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,EACvB,OAAO,OAAO;AACnB;AAEA,SAAS,gBACP,MACA,aACA,KACQ;AACR,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AACA,MAAI,kBAAAA,QAAG,gBAAgB,WAAW,GAAG;AACnC,WAAO,GAAG,IAAI,KAAK,YAAY,IAAI;AAAA,EACrC;AACA,MAAI,kBAAAA,QAAG,gBAAgB,WAAW,GAAG;AACnC,QAAI,YAAY,YAAY;AAC1B,YAAM,OAAO,YAAY,WAAW,QAAQ,IAAI,UAAU,EAAE,KAAK;AACjE,aAAO,GAAG,IAAI,KAAK,IAAI;AAAA,IACzB;AACA,WAAO;AAAA,EACT;AACA,MAAI,SAAS,KAAK,iDAAiD;AACnE,SAAO;AACT;AAEA,SAAS,iBAAiB,MAA2B,KAAsC;AACzF,MAAI,kBAAAA,QAAG,aAAa,IAAI,GAAG;AACzB,WAAO,KAAK;AAAA,EACd;AACA,MAAI,kBAAAA,QAAG,oBAAoB,IAAI,GAAG;AAChC,WAAO,GAAG,KAAK,UAAU,IAAI,IAAI,KAAK,KAAK,IAAI;AAAA,EACjD;AACA,SAAO;AACT;AAEA,SAAS,eAAe,UAAsB,KAAuB,QAA0B;AAC7F,QAAM,OAAO,SAAS,QAAQ,IAAI,UAAU,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACxE,MAAI,CAAC,MAAM;AACT,WAAO,CAAC;AAAA,EACV;AACA,SAAO,CAAC,GAAG,KAAK,OAAO,MAAM,CAAC,KAAK,IAAI,EAAE;AAC3C;AAEA,SAAS,qBAAqB,gBAAkC,KAAuB,QAA0B;AAC/G,MAAI,CAAC,eAAe,YAAY;AAC9B,WAAO,CAAC;AAAA,EACV;AACA,QAAM,WAAW,eAAe,WAAW,QAAQ,IAAI,UAAU,EAAE,KAAK;AACxE,MAAI,CAAC,UAAU;AACb,WAAO,CAAC;AAAA,EACV;AACA,SAAO,CAAC,GAAG,KAAK,OAAO,MAAM,CAAC,MAAM,QAAQ,KAAK;AACnD;;;AVxXO,SAAS,YAAY,QAAgB,UAA8B,CAAC,GAAmB;AAC5F,QAAM,SAAS,MAAM,QAAQ,EAAE,SAAS,QAAQ,QAAQ,CAAC;AACzD,MAAI,CAAC,QAAQ,UAAU;AACrB,WAAO;AAAA,MACL,WAAW,OAAO,UAAU,IAAI,CAAC,cAAc;AAAA,QAC7C,GAAG;AAAA,QACH,aAAaC,sBAAqB,SAAS,WAAW;AAAA,MACxD,EAAE;AAAA,MACF,aAAaA,sBAAqB,OAAO,WAAW;AAAA,IACtD;AAAA,EACF;AACA,SAAO;AAAA,IACL,WAAW,OAAO,UAAU,IAAI,CAAC,cAAc;AAAA,MAC7C,GAAG;AAAA,MACH,aAAaA,sBAAqB,SAAS,aAAa,QAAQ,QAAQ;AAAA,IAC1E,EAAE;AAAA,IACF,aAAaA,sBAAqB,OAAO,aAAa,QAAQ,QAAQ;AAAA,EACxE;AACF;AAEO,SAAS,gBACd,UACA,UAAkC,CAAC,GACpB;AACf,QAAM,cAAcA,sBAAqB,SAAS,aAAa,QAAQ,QAAQ;AAC/E,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,SAAS,QAAQ,UAAU;AAEjC,MAAI,OAAO,iBAAiB,MAAM;AAClC,MAAI,CAAC,UAAU,WAAW,GAAG;AAC3B,WAAO,qBAAqB,SAAS,KAAK,EAAE,YAAY,OAAO,CAAC;AAAA,EAClE;AAEA,QAAM,OAAO,iBAAiB,UAAU,QAAQ,QAAQ;AACxD,SAAO,EAAE,MAAM,aAAa,KAAK,QAAW,KAAK;AACnD;AAMO,SAAS,aACd,aACA,UAA6B,CAAC,GACf;AACf,QAAM,WAAW,kBAAkB,aAAa,QAAQ,UAAU,QAAQ,OAAO;AACjF,QAAM,cAAcA,sBAAqB,SAAS,aAAa,QAAQ,QAAQ;AAC/E,QAAM,WAAW,SAAS,UAAU,CAAC;AACrC,QAAM,gBAAgB,QAAQ,qBAAqB;AACnD,QAAM,aAAa,QAAQ,cAAc;AAEzC,MAAI,OAAO,oBAAoB,eAAe,KAAK;AACnD,MAAI,CAAC,UAAU,WAAW,KAAK,UAAU;AACvC,UAAM,eAAe,gBAAgB,UAAU;AAAA,MAC7C,UAAU,QAAQ;AAAA,MAClB;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AACD,WAAO,4BAA4B,aAAa,MAAM,eAAe,KAAK;AAAA,EAC5E;AAEA,QAAM,OAAO,iBAAiB,UAAU,QAAQ,QAAQ;AACxD,SAAO,EAAE,MAAM,aAAa,KAAK,QAAW,KAAK;AACnD;AAMO,SAAS,aACd,aACA,UAA6B,CAAC,GACf;AACf,QAAM,WAAW,kBAAkB,aAAa,QAAQ,UAAU,QAAQ,OAAO;AACjF,QAAM,cAAcA,sBAAqB,SAAS,aAAa,QAAQ,QAAQ;AAC/E,QAAM,WAAW,SAAS,UAAU,CAAC;AACrC,QAAM,gBAAgB,QAAQ,qBAAqB;AACnD,QAAM,aAAa,QAAQ,cAAc;AAEzC,MAAI,OAAO,oBAAoB,eAAe,KAAK;AACnD,MAAI,CAAC,UAAU,WAAW,KAAK,UAAU;AACvC,UAAM,eAAe,gBAAgB,UAAU;AAAA,MAC7C,UAAU,QAAQ;AAAA,MAClB;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AACD,WAAO,4BAA4B,aAAa,MAAM,eAAe,KAAK;AAAA,EAC5E;AAEA,QAAM,OAAO,iBAAiB,UAAU,QAAQ,QAAQ;AACxD,SAAO,EAAE,MAAM,aAAa,KAAK,QAAW,KAAK;AACnD;AAMO,SAAS,mBAAmB,QAAgB,UAA6B,CAAC,GAAwB;AACvG,QAAM,SAAS,aAAa,QAAQ,OAAO;AAC3C,SAAO;AAAA,IACL,KAAK,OAAO;AAAA,IACZ,aAAa,OAAO;AAAA,IACpB,MAAM,OAAO;AAAA,EACf;AACF;AAEO,SAAS,cACd,aACA,UAA8B,CAAC,GAChB;AACf,QAAM,WAAW,kBAAkB,aAAa,QAAQ,UAAU,QAAQ,OAAO;AACjF,QAAM,cAAcA,sBAAqB,SAAS,aAAa,QAAQ,QAAQ;AAC/E,QAAM,WAAW,SAAS,UAAU,CAAC;AAErC,MAAI,OAAO,eAAe;AAC1B,MAAI,CAAC,UAAU,WAAW,KAAK,UAAU;AACvC,WAAO,aAAa,SAAS,GAAG;AAAA,EAClC;AAEA,QAAM,OAAO,iBAAiB,UAAU,QAAQ,QAAQ;AACxD,SAAO,EAAE,MAAM,aAAa,KAAK,QAAW,KAAK;AACnD;AAMO,SAAS,QAAQ,QAAgB,UAA0B,CAAC,GAAkB;AACnF,SAAO,aAAa,QAAQ,OAAO;AACrC;AAIA,SAAS,kBACP,aACA,UACA,SACgB;AAChB,MAAI,OAAO,gBAAgB,UAAU;AACnC,WAAO,YAAY,aAAa,EAAE,UAAU,QAAQ,CAAC;AAAA,EACvD;AAEA,MAAI,iBAAiB,WAAW,GAAG;AACjC,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AACA,WAAO,yBAAyB,aAAa,QAAQ;AAAA,EACvD;AAEA,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,KAAK,YAAY,MAAM,YAAY,SAAS;AAClD,UAAM,QAAQ,YAAY,SAAS,YAAY,MAAM;AACrD,UAAM,WAAyB;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,MAAM,YAAY;AAAA,MAClB,KAAK;AAAA,MACL,aAAa,CAAC;AAAA,IAChB;AACA,WAAO,EAAE,WAAW,CAAC,QAAQ,GAAG,aAAa,CAAC,EAAE;AAAA,EAClD;AAEA,QAAM,IAAI,UAAU,0EAA0E;AAChG;AAEA,SAAS,WAAW,OAAmC;AACrD,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAa,MAA6B,SAAS;AACxF;AAEA,SAAS,iBAAiB,OAAyC;AACjE,SACE,CAAC,CAAC,SACF,OAAO,UAAU,YACjB,MAAM,QAAS,MAAkC,SAAS,KAC1D,MAAM,QAAS,MAAoC,WAAW;AAElE;AAEA,SAAS,UAAU,aAAoC;AACrD,SAAO,YAAY,KAAK,CAAC,SAAS,KAAK,aAAa,OAAO;AAC7D;AAEA,SAAS,oBAAoB,MAAc,QAA+B;AACxE,MAAI,WAAW,OAAO;AACpB,WAAO;AAAA,MACL;AAAA,MACA,2BAA2B,IAAI;AAAA,MAC/B;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACA,SAAO,CAAC,2BAA2B,IAAI,aAAa,kBAAkB,GAAG,EAAE,KAAK,IAAI;AACtF;AAEA,SAAS,iBAAiB,QAA+B;AACvD,MAAI,WAAW,OAAO;AACpB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACA,SAAO,CAAC,mCAAmC,kBAAkB,GAAG,EAAE,KAAK,IAAI;AAC7E;AAEA,SAAS,4BACP,cACA,MACA,QACQ;AACR,QAAM,YAAY,WAAW,QAAQ,2BAA2B,IAAI,qBAAqB,2BAA2B,IAAI;AACxH,QAAM,UAAU,CAAC,WAAW,2BAA2B,GAAG,EAAE,KAAK,IAAI;AACrE,SAAO,GAAG,YAAY;AAAA;AAAA,EAAO,OAAO;AACtC;AAEA,SAAS,iBAAyB;AAChC,SAAO;AACT;AAEA,SAAS,iBACP,UACA,UAC+B;AAC/B,QAAM,OAA0B,CAAC;AACjC,MAAI,UAAU;AACZ,SAAK,WAAW;AAAA,EAClB;AACA,MAAI,UAAU,OAAO;AACnB,SAAK,QAAQ,SAAS;AAAA,EACxB;AACA,MAAI,UAAU,IAAI;AAChB,SAAK,KAAK,SAAS;AAAA,EACrB;AACA,MAAI,UAAU,MAAM;AAClB,SAAK,OAAO,SAAS;AAAA,EACvB;AAEA,SAAO,KAAK,MAAM,KAAK,SAAS,KAAK,WAAW,OAAO;AACzD;AACA,SAAS,yBAAyB,UAA0B,UAAmC;AAC7F,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,WAAW,SAAS,UAAU,IAAI,CAAC,cAAc;AAAA,MAC/C,GAAG;AAAA,MACH,aAAaC,sBAAqB,SAAS,aAAa,QAAQ;AAAA,IAClE,EAAE;AAAA,IACF,aAAaA,sBAAqB,SAAS,aAAa,QAAQ;AAAA,EAClE;AACF;AAEA,SAASA,sBAAqB,aAA2B,UAAiC;AACxF,SAAO,YAAY,IAAI,CAAC,SAAS;AAC/B,UAAM,WAAW,KAAK,YAAY,KAAK,QAAQ;AAC/C,UAAM,OAAO,KAAK,QAAQ;AAC1B,UAAM,QAAQ,KAAK,SAAS,KAAK;AAEjC,QAAI,aAAa,KAAK,YAAY,SAAS,KAAK,QAAQ,UAAU,KAAK,OAAO;AAC5E,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AACH;","names":["buildClassAliasEnvironment","emitElement","expandClasses","IGNORED_IDENTIFIERS","RESERVED_KEYWORDS","walkNodes","shouldIgnoreIdentifier","levelToSeverity","message","isIdentifierStart","isIdentifierPart","findPreviousNonSpace","jsxNode","exprStart","exprEnd","inner","hasErrors","ts","normalizeDiagnostics","normalizeDiagnostics"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/rewrite.ts","../src/codegen.ts","../src/html-codegen.ts","../src/diagnostics.ts","../src/dialect.ts","../src/parser.ts","../src/fixes.ts","../src/format.ts","../src/convert.ts"],"sourcesContent":["import type { NormalizedCollieDialectOptions } from \"@collie-lang/config\";\nimport { generateRenderModule } from \"./codegen.ts\";\nimport { generateHtml } from \"./html-codegen.ts\";\nimport { parse } from \"./parser.ts\";\nimport type { ParseResult, TemplateUnit } from \"./parser.ts\";\nimport type { Diagnostic } from \"./diagnostics.ts\";\nimport type { RootNode } from \"./ast.ts\";\nimport type { SourceSpan } from \"./diagnostics.ts\";\n\nexport type {\n CollieConfig,\n CollieCssOptions,\n CollieCssStrategy,\n CollieDialectOptions,\n CollieDialectTokenKind,\n CollieDialectTokenRule,\n CollieDialectTokens,\n CollieDiagnosticLevel,\n CollieProjectConfig,\n CollieCompilerOptions,\n CollieFeatureOptions,\n CollieEditorOptions,\n HtmlProjectOptions,\n ReactProjectOptions,\n NormalizedCollieCssOptions,\n NormalizedCollieConfig,\n NormalizedCollieDialectOptions,\n NormalizedCollieDialectTokenRule,\n NormalizedCollieDialectTokens,\n NormalizedCollieProjectConfig\n} from \"@collie-lang/config\";\nexport {\n defineConfig,\n loadConfig,\n loadAndNormalizeConfig,\n normalizeConfig\n} from \"@collie-lang/config\";\n\nexport type {\n Diagnostic,\n DiagnosticFix,\n DiagnosticSeverity,\n SourcePos,\n SourceSpan\n} from \"./diagnostics.ts\";\nexport { applyFixes, fixAllFromDiagnostics } from \"./fixes.ts\";\nexport type { ParseResult, TemplateUnit } from \"./parser.ts\";\nexport type {\n Attribute,\n ClassAliasDecl,\n ClassAliasesDecl,\n ComponentNode,\n ConditionalBranch,\n ConditionalNode,\n ElementNode,\n ExpressionNode,\n ForNode,\n JSXPassthroughNode,\n Node,\n RootNode,\n SlotBlock,\n TextChunk,\n TextExprPart,\n TextNode,\n TextPart\n} from \"./ast.ts\";\nexport type { FormatOptions, FormatResult } from \"./format.ts\";\nexport { formatCollie } from \"./format.ts\";\nexport type { ConvertTsxOptions, ConvertTsxResult } from \"./convert.ts\";\nexport { convertTsxToCollie } from \"./convert.ts\";\n\nexport interface ParseCollieOptions {\n filename?: string;\n dialect?: NormalizedCollieDialectOptions;\n}\n\nexport interface BaseCompileOptions {\n filename?: string;\n /** @deprecated Legacy component module option. */\n componentNameHint?: string;\n dialect?: NormalizedCollieDialectOptions;\n}\n\nexport interface JsxCompileOptions extends BaseCompileOptions {\n jsxRuntime?: \"classic\" | \"automatic\";\n}\n\nexport interface TsxCompileOptions extends BaseCompileOptions {\n jsxRuntime?: \"classic\" | \"automatic\";\n}\n\nexport interface HtmlCompileOptions extends BaseCompileOptions {\n pretty?: boolean;\n}\n\nexport interface CollieCompileMeta {\n id?: string;\n rawId?: string;\n filename?: string;\n span?: SourceSpan;\n}\n\nexport interface CompileResult {\n code: string;\n map?: any;\n diagnostics: Diagnostic[];\n meta?: CollieCompileMeta;\n}\n\nexport interface ConvertCollieResult {\n tsx: string;\n diagnostics: Diagnostic[];\n meta?: CollieCompileMeta;\n}\n\nexport interface CompileTemplateOptions {\n filename?: string;\n jsxRuntime?: \"classic\" | \"automatic\";\n flavor?: \"jsx\" | \"tsx\";\n}\n\nexport type CollieDocument = ParseResult;\n/** @deprecated Legacy component-compile options. Prefer CompileTemplateOptions. */\nexport type CompileOptions = JsxCompileOptions;\n\nexport function parseCollie(source: string, options: ParseCollieOptions = {}): CollieDocument {\n const result = parse(source, { dialect: options.dialect });\n if (!options.filename) {\n return {\n templates: result.templates.map((template) => ({\n ...template,\n diagnostics: normalizeDiagnostics(template.diagnostics)\n })),\n diagnostics: normalizeDiagnostics(result.diagnostics)\n };\n }\n return {\n templates: result.templates.map((template) => ({\n ...template,\n diagnostics: normalizeDiagnostics(template.diagnostics, options.filename)\n })),\n diagnostics: normalizeDiagnostics(result.diagnostics, options.filename)\n };\n}\n\nexport function compileTemplate(\n template: TemplateUnit,\n options: CompileTemplateOptions = {}\n): CompileResult {\n const diagnostics = normalizeDiagnostics(template.diagnostics, options.filename);\n const jsxRuntime = options.jsxRuntime ?? \"automatic\";\n const flavor = options.flavor ?? \"tsx\";\n\n let code = createStubRender(flavor);\n if (!hasErrors(diagnostics)) {\n code = generateRenderModule(template.ast, { jsxRuntime, flavor });\n }\n\n const meta = buildCompileMeta(template, options.filename);\n return { code, diagnostics, map: undefined, meta };\n}\n\n/**\n * @deprecated Legacy component module wrapper.\n * Use compileTemplate for registry-driven render modules.\n */\nexport function compileToJsx(\n sourceOrAst: string | RootNode | CollieDocument,\n options: JsxCompileOptions = {}\n): CompileResult {\n const document = normalizeDocument(sourceOrAst, options.filename, options.dialect);\n const diagnostics = normalizeDiagnostics(document.diagnostics, options.filename);\n const template = document.templates[0];\n const componentName = options.componentNameHint ?? \"CollieTemplate\";\n const jsxRuntime = options.jsxRuntime ?? \"automatic\";\n\n let code = createStubComponent(componentName, \"jsx\");\n if (!hasErrors(diagnostics) && template) {\n const renderResult = compileTemplate(template, {\n filename: options.filename,\n jsxRuntime,\n flavor: \"jsx\"\n });\n code = wrapRenderModuleAsComponent(renderResult.code, componentName, \"jsx\");\n }\n\n const meta = buildCompileMeta(template, options.filename);\n return { code, diagnostics, map: undefined, meta };\n}\n\n/**\n * @deprecated Legacy component module wrapper.\n * Use compileTemplate for registry-driven render modules.\n */\nexport function compileToTsx(\n sourceOrAst: string | RootNode | CollieDocument,\n options: TsxCompileOptions = {}\n): CompileResult {\n const document = normalizeDocument(sourceOrAst, options.filename, options.dialect);\n const diagnostics = normalizeDiagnostics(document.diagnostics, options.filename);\n const template = document.templates[0];\n const componentName = options.componentNameHint ?? \"CollieTemplate\";\n const jsxRuntime = options.jsxRuntime ?? \"automatic\";\n\n let code = createStubComponent(componentName, \"tsx\");\n if (!hasErrors(diagnostics) && template) {\n const renderResult = compileTemplate(template, {\n filename: options.filename,\n jsxRuntime,\n flavor: \"tsx\"\n });\n code = wrapRenderModuleAsComponent(renderResult.code, componentName, \"tsx\");\n }\n\n const meta = buildCompileMeta(template, options.filename);\n return { code, diagnostics, map: undefined, meta };\n}\n\n/**\n * @deprecated Legacy component module wrapper.\n * Use compileTemplate for registry-driven render modules.\n */\nexport function convertCollieToTsx(source: string, options: TsxCompileOptions = {}): ConvertCollieResult {\n const result = compileToTsx(source, options);\n return {\n tsx: result.code,\n diagnostics: result.diagnostics,\n meta: result.meta\n };\n}\n\nexport function compileToHtml(\n sourceOrAst: string | RootNode | CollieDocument,\n options: HtmlCompileOptions = {}\n): CompileResult {\n const document = normalizeDocument(sourceOrAst, options.filename, options.dialect);\n const diagnostics = normalizeDiagnostics(document.diagnostics, options.filename);\n const template = document.templates[0];\n\n let code = createStubHtml();\n if (!hasErrors(diagnostics) && template) {\n code = generateHtml(template.ast);\n }\n\n const meta = buildCompileMeta(template, options.filename);\n return { code, diagnostics, map: undefined, meta };\n}\n\n/**\n * @deprecated Legacy component module wrapper.\n * Use compileTemplate for registry-driven render modules.\n */\nexport function compile(source: string, options: CompileOptions = {}): CompileResult {\n return compileToJsx(source, options);\n}\n\nexport { parseCollie as parse };\n\nfunction normalizeDocument(\n sourceOrAst: string | RootNode | CollieDocument,\n filename?: string,\n dialect?: NormalizedCollieDialectOptions\n): CollieDocument {\n if (typeof sourceOrAst === \"string\") {\n return parseCollie(sourceOrAst, { filename, dialect });\n }\n\n if (isCollieDocument(sourceOrAst)) {\n if (!filename) {\n return sourceOrAst;\n }\n return attachFilenameToDocument(sourceOrAst, filename);\n }\n\n if (isRootNode(sourceOrAst)) {\n const id = sourceOrAst.id ?? sourceOrAst.rawId ?? \"\";\n const rawId = sourceOrAst.rawId ?? sourceOrAst.id ?? \"\";\n const template: TemplateUnit = {\n id,\n rawId,\n span: sourceOrAst.idTokenSpan,\n ast: sourceOrAst,\n diagnostics: []\n };\n return { templates: [template], diagnostics: [] };\n }\n\n throw new TypeError(\"Collie compiler expected source text, a parsed document, or a root node.\");\n}\n\nfunction isRootNode(value: unknown): value is RootNode {\n return !!value && typeof value === \"object\" && (value as { type?: unknown }).type === \"Root\";\n}\n\nfunction isCollieDocument(value: unknown): value is CollieDocument {\n return (\n !!value &&\n typeof value === \"object\" &&\n Array.isArray((value as { templates?: unknown }).templates) &&\n Array.isArray((value as { diagnostics?: unknown }).diagnostics)\n );\n}\n\nfunction hasErrors(diagnostics: Diagnostic[]): boolean {\n return diagnostics.some((diag) => diag.severity === \"error\");\n}\n\nfunction createStubComponent(name: string, flavor: \"jsx\" | \"tsx\"): string {\n if (flavor === \"tsx\") {\n return [\n \"export type Inputs = Record<string, never>;\",\n `export default function ${name}(__inputs: Inputs) {`,\n \" return null;\",\n \"}\"\n ].join(\"\\n\");\n }\n return [`export default function ${name}(__inputs) {`, \" return null;\", \"}\"].join(\"\\n\");\n}\n\nfunction createStubRender(flavor: \"jsx\" | \"tsx\"): string {\n if (flavor === \"tsx\") {\n return [\n \"export type Inputs = Record<string, never>;\",\n \"export function render(__inputs: any) {\",\n \" return null;\",\n \"}\"\n ].join(\"\\n\");\n }\n return [\"export function render(__inputs) {\", \" return null;\", \"}\"].join(\"\\n\");\n}\n\nfunction wrapRenderModuleAsComponent(\n renderModule: string,\n name: string,\n flavor: \"jsx\" | \"tsx\"\n): string {\n const signature =\n flavor === \"tsx\"\n ? `export default function ${name}(__inputs: Inputs) {`\n : `export default function ${name}(__inputs) {`;\n const wrapper = [signature, \" return render(__inputs);\", \"}\"].join(\"\\n\");\n return `${renderModule}\\n\\n${wrapper}`;\n}\n\nfunction createStubHtml(): string {\n return \"\";\n}\n\nfunction buildCompileMeta(\n template: TemplateUnit | undefined,\n filename?: string\n): CollieCompileMeta | undefined {\n const meta: CollieCompileMeta = {};\n if (filename) {\n meta.filename = filename;\n }\n if (template?.rawId) {\n meta.rawId = template.rawId;\n }\n if (template?.id) {\n meta.id = template.id;\n }\n if (template?.span) {\n meta.span = template.span;\n }\n\n return meta.id || meta.rawId || meta.filename ? meta : undefined;\n}\nfunction attachFilenameToDocument(document: CollieDocument, filename?: string): CollieDocument {\n if (!filename) {\n return document;\n }\n return {\n templates: document.templates.map((template) => ({\n ...template,\n diagnostics: normalizeDiagnostics(template.diagnostics, filename)\n })),\n diagnostics: normalizeDiagnostics(document.diagnostics, filename)\n };\n}\n\nfunction normalizeDiagnostics(diagnostics: Diagnostic[], filename?: string): Diagnostic[] {\n return diagnostics.map((diag) => {\n const filePath = diag.filePath ?? diag.file ?? filename;\n const file = diag.file ?? filename;\n const range = diag.range ?? diag.span;\n\n if (filePath === diag.filePath && file === diag.file && range === diag.range) {\n return diag;\n }\n\n return {\n ...diag,\n filePath,\n file,\n range\n };\n });\n}\n","import type { InputDeclKind } from \"./ast.ts\";\n\n/**\n * Template environment for tracking inputs and local variables during code generation.\n * \n * This is a pure data structure with no hidden state or side effects.\n * It is created once per template and passed through expression processing.\n * \n * - inputNames: Set of input names declared in #inputs\n * - localsStack: Stack of local variable scopes (e.g., @for loop variables)\n */\nexport interface TemplateEnv {\n inputNames: Set<string>;\n localsStack: Array<Set<string>>;\n}\n\n/**\n * Create a new TemplateEnv from input declarations.\n */\nexport function createTemplateEnv(\n inputsDecls?: Array<{ name: string; kind: InputDeclKind }>\n): TemplateEnv {\n const inputNames = new Set<string>();\n if (inputsDecls) {\n for (const decl of inputsDecls) {\n inputNames.add(decl.name);\n }\n }\n return {\n inputNames,\n localsStack: []\n };\n}\n\n/**\n * Push a new local scope with the given variable names.\n * Call this when entering a new scope (e.g., @for loop).\n */\nexport function pushLocals(env: TemplateEnv, names: string[]): void {\n const locals = new Set<string>(names);\n env.localsStack.push(locals);\n}\n\n/**\n * Pop the most recent local scope.\n * Call this when exiting a scope (e.g., end of @for loop body).\n */\nexport function popLocals(env: TemplateEnv): void {\n env.localsStack.pop();\n}\n\n/**\n * Check if a name is a local variable in the current scope.\n * Locals shadow inputs.\n */\nexport function isLocal(env: TemplateEnv, name: string): boolean {\n for (let i = env.localsStack.length - 1; i >= 0; i--) {\n if (env.localsStack[i].has(name)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if a name is an input declared in #inputs.\n * Returns true only if it's in inputNames and not shadowed by a local.\n */\nexport function isInput(env: TemplateEnv, name: string): boolean {\n if (isLocal(env, name)) {\n return false;\n }\n return env.inputNames.has(name);\n}\n\n/**\n * Result of expression processing with usage metadata for diagnostics.\n */\nexport interface RewriteResult {\n code: string; // processed expression (unchanged from input)\n usedBare: Set<string>; // bare identifiers encountered\n callSitesBare: Set<string>; // bare identifiers used as calls: name(...)\n}\n\nconst IGNORED_IDENTIFIERS = new Set([\n \"null\",\n \"undefined\",\n \"true\",\n \"false\",\n \"NaN\",\n \"Infinity\",\n \"this\"\n]);\n\nconst RESERVED_KEYWORDS = new Set([\n \"async\",\n \"await\",\n \"break\",\n \"case\",\n \"catch\",\n \"class\",\n \"const\",\n \"continue\",\n \"debugger\",\n \"default\",\n \"delete\",\n \"do\",\n \"else\",\n \"enum\",\n \"export\",\n \"extends\",\n \"false\",\n \"finally\",\n \"for\",\n \"function\",\n \"if\",\n \"import\",\n \"in\",\n \"instanceof\",\n \"let\",\n \"new\",\n \"null\",\n \"return\",\n \"super\",\n \"switch\",\n \"this\",\n \"throw\",\n \"true\",\n \"try\",\n \"typeof\",\n \"var\",\n \"void\",\n \"while\",\n \"with\",\n \"yield\"\n]);\n\n/**\n * Process expression WITHOUT rewriting identifiers.\n * Returns the original code unchanged, plus metadata about identifier usage for diagnostics.\n * \n * This function is PURE and does not mutate the AST or environment.\n * Identifiers remain as bare names - JavaScript scoping rules apply naturally.\n * \n * @param expression - The original expression string from the template\n * @param env - Template environment with inputs and locals\n * @returns RewriteResult with original code and usage metadata\n */\nexport function rewriteExpression(expression: string, env: TemplateEnv): RewriteResult {\n const tokens = tokenizeExpression(expression);\n const usedBare = new Set<string>();\n const callSitesBare = new Set<string>();\n const localScopes: Array<Set<string>> = [new Set<string>()];\n\n analyzeTokens(tokens, 0, tokens.length, env, localScopes, usedBare, callSitesBare, false);\n\n return { code: expression, usedBare, callSitesBare };\n}\n\n/**\n * Process JSX expression containing embedded braces WITHOUT rewriting.\n * \n * This function is PURE and does not mutate the AST or environment.\n * Recursively processes expressions within braces, maintaining original code.\n * \n * @param expression - The JSX expression string with potential {...} sections\n * @param env - Template environment with inputs and locals\n * @returns RewriteResult with original code and aggregated usage metadata\n */\nexport function rewriteJsxExpression(expression: string, env: TemplateEnv): RewriteResult {\n let i = 0;\n \n const usedBare = new Set<string>();\n const callSitesBare = new Set<string>();\n\n while (i < expression.length) {\n const ch = expression[i];\n if (ch === \"{\") {\n const braceResult = readBalancedBraces(expression, i + 1);\n if (!braceResult) {\n break;\n }\n const result = rewriteExpression(braceResult.content, env);\n \n // Merge metadata\n for (const name of result.usedBare) usedBare.add(name);\n for (const name of result.callSitesBare) callSitesBare.add(name);\n \n i = braceResult.endIndex + 1;\n continue;\n }\n i++;\n }\n\n return { code: expression, usedBare, callSitesBare };\n}\n\nfunction readBalancedBraces(\n source: string,\n startIndex: number\n): { content: string; endIndex: number } | null {\n let i = startIndex;\n let depth = 1;\n let state: \"code\" | \"single\" | \"double\" | \"template\" | \"line\" | \"block\" = \"code\";\n\n while (i < source.length) {\n const ch = source[i];\n\n if (state === \"code\") {\n if (ch === \"'\" || ch === \"\\\"\") {\n state = ch === \"'\" ? \"single\" : \"double\";\n i++;\n continue;\n }\n if (ch === \"`\") {\n state = \"template\";\n i++;\n continue;\n }\n if (ch === \"/\" && source[i + 1] === \"/\") {\n state = \"line\";\n i += 2;\n continue;\n }\n if (ch === \"/\" && source[i + 1] === \"*\") {\n state = \"block\";\n i += 2;\n continue;\n }\n if (ch === \"{\") {\n depth += 1;\n } else if (ch === \"}\") {\n depth -= 1;\n if (depth === 0) {\n return { content: source.slice(startIndex, i), endIndex: i };\n }\n }\n i++;\n continue;\n }\n\n if (state === \"line\") {\n if (ch === \"\\n\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n\n if (state === \"block\") {\n if (ch === \"*\" && source[i + 1] === \"/\") {\n i += 2;\n state = \"code\";\n continue;\n }\n i++;\n continue;\n }\n\n if (state === \"single\") {\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === \"'\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n\n if (state === \"double\") {\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === \"\\\"\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n\n if (state === \"template\") {\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === \"`\") {\n state = \"code\";\n }\n i++;\n continue;\n }\n }\n\n return null;\n}\n\nfunction isIdentifierStart(ch: string): boolean {\n return /[A-Za-z_$]/.test(ch);\n}\n\nfunction isIdentifierPart(ch: string): boolean {\n return /[A-Za-z0-9_$]/.test(ch);\n}\n\nfunction shouldIgnoreIdentifier(name: string): boolean {\n return IGNORED_IDENTIFIERS.has(name) || RESERVED_KEYWORDS.has(name);\n}\n\ntype TokenType = \"identifier\" | \"literal\" | \"punctuator\";\n\ninterface Token {\n type: TokenType;\n value: string;\n}\n\nfunction tokenizeExpression(expression: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n\n while (i < expression.length) {\n const ch = expression[i];\n\n if (/\\s/.test(ch)) {\n i++;\n continue;\n }\n\n if (ch === \"/\" && expression[i + 1] === \"/\") {\n i += 2;\n while (i < expression.length && expression[i] !== \"\\n\") {\n i++;\n }\n continue;\n }\n\n if (ch === \"/\" && expression[i + 1] === \"*\") {\n i += 2;\n while (i < expression.length && !(expression[i] === \"*\" && expression[i + 1] === \"/\")) {\n i++;\n }\n i += 2;\n continue;\n }\n\n if (ch === \"'\" || ch === \"\\\"\") {\n i = skipStringLiteral(expression, i, ch);\n tokens.push({ type: \"literal\", value: \"string\" });\n continue;\n }\n\n if (ch === \"`\") {\n i = skipTemplateLiteral(expression, i);\n tokens.push({ type: \"literal\", value: \"template\" });\n continue;\n }\n\n if (isIdentifierStart(ch)) {\n const start = i;\n i++;\n while (i < expression.length && isIdentifierPart(expression[i])) {\n i++;\n }\n tokens.push({ type: \"identifier\", value: expression.slice(start, i) });\n continue;\n }\n\n if (/[0-9]/.test(ch)) {\n const start = i;\n i++;\n while (i < expression.length && /[0-9._]/.test(expression[i])) {\n i++;\n }\n tokens.push({ type: \"literal\", value: expression.slice(start, i) });\n continue;\n }\n\n if (expression.startsWith(\"...\", i)) {\n tokens.push({ type: \"punctuator\", value: \"...\" });\n i += 3;\n continue;\n }\n\n if (expression.startsWith(\"=>\", i)) {\n tokens.push({ type: \"punctuator\", value: \"=>\" });\n i += 2;\n continue;\n }\n\n if (expression.startsWith(\"?.\", i)) {\n tokens.push({ type: \"punctuator\", value: \"?.\" });\n i += 2;\n continue;\n }\n\n if (expression.startsWith(\"??\", i)) {\n tokens.push({ type: \"punctuator\", value: \"??\" });\n i += 2;\n continue;\n }\n\n tokens.push({ type: \"punctuator\", value: ch });\n i++;\n }\n\n return tokens;\n}\n\nfunction skipStringLiteral(source: string, start: number, quote: string): number {\n let i = start + 1;\n while (i < source.length) {\n const ch = source[i];\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === quote) {\n return i + 1;\n }\n i++;\n }\n return source.length;\n}\n\nfunction skipTemplateLiteral(source: string, start: number): number {\n let i = start + 1;\n while (i < source.length) {\n const ch = source[i];\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === \"`\") {\n return i + 1;\n }\n i++;\n }\n return source.length;\n}\n\nfunction analyzeTokens(\n tokens: Token[],\n start: number,\n end: number,\n env: TemplateEnv,\n scopes: Array<Set<string>>,\n usedBare: Set<string>,\n callSitesBare: Set<string>,\n allowStatements: boolean\n): void {\n let i = start;\n while (i < end) {\n const token = tokens[i];\n if (token.type === \"identifier\") {\n if (token.value === \"function\") {\n const fnResult = parseFunctionExpression(tokens, i, end, env, scopes, usedBare, callSitesBare);\n if (fnResult > i) {\n i = fnResult;\n continue;\n }\n }\n\n if (allowStatements && (token.value === \"const\" || token.value === \"let\" || token.value === \"var\")) {\n const declResult = parseVariableDeclaration(tokens, i, end, env, scopes, usedBare, callSitesBare);\n if (declResult > i) {\n i = declResult;\n continue;\n }\n }\n\n if (allowStatements && token.value === \"catch\") {\n const catchResult = parseCatchClause(tokens, i, end, env, scopes, usedBare, callSitesBare);\n if (catchResult > i) {\n i = catchResult;\n continue;\n }\n }\n\n const arrowResult = parseArrowFunction(tokens, i, end, env, scopes, usedBare, callSitesBare);\n if (arrowResult > i) {\n i = arrowResult;\n continue;\n }\n\n if (shouldIgnoreIdentifier(token.value)) {\n i++;\n continue;\n }\n\n if (isShadowed(env, scopes, token.value)) {\n i++;\n continue;\n }\n\n if (isMemberAccess(tokens, i) || isObjectKey(tokens, i)) {\n i++;\n continue;\n }\n\n usedBare.add(token.value);\n\n if (isCallSite(tokens, i)) {\n callSitesBare.add(token.value);\n }\n\n i++;\n continue;\n }\n\n if (token.type === \"punctuator\" && token.value === \"(\") {\n const arrowResult = parseArrowFunction(tokens, i, end, env, scopes, usedBare, callSitesBare);\n if (arrowResult > i) {\n i = arrowResult;\n continue;\n }\n }\n\n i++;\n }\n}\n\nfunction parseArrowFunction(\n tokens: Token[],\n index: number,\n end: number,\n env: TemplateEnv,\n scopes: Array<Set<string>>,\n usedBare: Set<string>,\n callSitesBare: Set<string>\n): number {\n const token = tokens[index];\n if (!token) {\n return index;\n }\n\n if (token.type === \"identifier\") {\n const next = tokens[index + 1];\n if (next && next.value === \"=>\") {\n const params = new Set<string>([token.value]);\n return analyzeArrowBody(tokens, index + 2, end, params, env, scopes, usedBare, callSitesBare);\n }\n }\n\n if (token.type === \"punctuator\" && token.value === \"(\") {\n const closeIndex = findMatchingToken(tokens, index, \"(\", \")\");\n if (closeIndex !== -1) {\n const afterClose = tokens[closeIndex + 1];\n if (afterClose && afterClose.value === \"=>\") {\n const params = new Set<string>();\n collectBindingNamesFromList(tokens, index + 1, closeIndex, params);\n return analyzeArrowBody(tokens, closeIndex + 2, end, params, env, scopes, usedBare, callSitesBare);\n }\n }\n }\n\n return index;\n}\n\nfunction analyzeArrowBody(\n tokens: Token[],\n start: number,\n end: number,\n params: Set<string>,\n env: TemplateEnv,\n scopes: Array<Set<string>>,\n usedBare: Set<string>,\n callSitesBare: Set<string>\n): number {\n const bodyToken = tokens[start];\n if (!bodyToken) {\n return start;\n }\n\n const scope = new Set<string>(params);\n scopes.push(scope);\n\n if (bodyToken.type === \"punctuator\" && bodyToken.value === \"{\") {\n const closeIndex = findMatchingToken(tokens, start, \"{\", \"}\");\n const bodyEnd = closeIndex === -1 ? end : closeIndex;\n analyzeTokens(tokens, start + 1, bodyEnd, env, scopes, usedBare, callSitesBare, true);\n scopes.pop();\n return closeIndex === -1 ? end : closeIndex + 1;\n }\n\n const bodyEnd = findExpressionEnd(tokens, start, end, EXPRESSION_TERMINATORS);\n analyzeTokens(tokens, start, bodyEnd, env, scopes, usedBare, callSitesBare, false);\n scopes.pop();\n return bodyEnd;\n}\n\nfunction parseFunctionExpression(\n tokens: Token[],\n index: number,\n end: number,\n env: TemplateEnv,\n scopes: Array<Set<string>>,\n usedBare: Set<string>,\n callSitesBare: Set<string>\n): number {\n let i = index + 1;\n const nameToken = tokens[i];\n let fnName: string | undefined;\n\n if (nameToken && nameToken.type === \"identifier\" && tokens[i + 1]?.value === \"(\") {\n fnName = nameToken.value;\n i++;\n }\n\n if (!tokens[i] || tokens[i].value !== \"(\") {\n return index;\n }\n\n const closeIndex = findMatchingToken(tokens, i, \"(\", \")\");\n if (closeIndex === -1) {\n return index;\n }\n\n const params = new Set<string>();\n collectBindingNamesFromList(tokens, i + 1, closeIndex, params);\n if (fnName) {\n params.add(fnName);\n }\n\n const bodyStart = closeIndex + 1;\n if (!tokens[bodyStart] || tokens[bodyStart].value !== \"{\") {\n return index;\n }\n\n const closeBody = findMatchingToken(tokens, bodyStart, \"{\", \"}\");\n const bodyEnd = closeBody === -1 ? end : closeBody;\n\n scopes.push(params);\n analyzeTokens(tokens, bodyStart + 1, bodyEnd, env, scopes, usedBare, callSitesBare, true);\n scopes.pop();\n\n return closeBody === -1 ? end : closeBody + 1;\n}\n\nfunction parseCatchClause(\n tokens: Token[],\n index: number,\n end: number,\n env: TemplateEnv,\n scopes: Array<Set<string>>,\n usedBare: Set<string>,\n callSitesBare: Set<string>\n): number {\n const next = tokens[index + 1];\n if (!next || next.value !== \"(\") {\n return index;\n }\n\n const closeIndex = findMatchingToken(tokens, index + 1, \"(\", \")\");\n if (closeIndex === -1) {\n return index;\n }\n\n const params = new Set<string>();\n collectBindingNamesFromList(tokens, index + 2, closeIndex, params);\n\n const bodyStart = closeIndex + 1;\n if (!tokens[bodyStart] || tokens[bodyStart].value !== \"{\") {\n return index;\n }\n\n const closeBody = findMatchingToken(tokens, bodyStart, \"{\", \"}\");\n const bodyEnd = closeBody === -1 ? end : closeBody;\n\n scopes.push(params);\n analyzeTokens(tokens, bodyStart + 1, bodyEnd, env, scopes, usedBare, callSitesBare, true);\n scopes.pop();\n\n return closeBody === -1 ? end : closeBody + 1;\n}\n\nfunction parseVariableDeclaration(\n tokens: Token[],\n index: number,\n end: number,\n env: TemplateEnv,\n scopes: Array<Set<string>>,\n usedBare: Set<string>,\n callSitesBare: Set<string>\n): number {\n let i = index + 1;\n const scope = scopes[scopes.length - 1];\n\n while (i < end) {\n const names = new Set<string>();\n const nextIndex = parseBindingPattern(tokens, i, end, names);\n if (nextIndex === i) {\n return index;\n }\n i = nextIndex;\n\n if (tokens[i] && tokens[i].value === \"=\") {\n const initStart = i + 1;\n const initEnd = findExpressionEnd(tokens, initStart, end, DECLARATION_TERMINATORS);\n analyzeTokens(tokens, initStart, initEnd, env, scopes, usedBare, callSitesBare, false);\n i = initEnd;\n }\n\n for (const name of names) {\n scope.add(name);\n }\n\n if (tokens[i] && tokens[i].value === \",\") {\n i++;\n continue;\n }\n break;\n }\n\n return i;\n}\n\nfunction parseBindingPattern(\n tokens: Token[],\n start: number,\n end: number,\n names: Set<string>\n): number {\n const token = tokens[start];\n if (!token) {\n return start;\n }\n if (token.type === \"identifier\") {\n names.add(token.value);\n return start + 1;\n }\n if (token.value === \"{\") {\n return parseObjectPattern(tokens, start + 1, end, names);\n }\n if (token.value === \"[\") {\n return parseArrayPattern(tokens, start + 1, end, names);\n }\n return start + 1;\n}\n\nfunction parseObjectPattern(\n tokens: Token[],\n start: number,\n end: number,\n names: Set<string>\n): number {\n let i = start;\n while (i < end) {\n const token = tokens[i];\n if (!token) {\n return i;\n }\n if (token.value === \"}\") {\n return i + 1;\n }\n if (token.value === \",\") {\n i++;\n continue;\n }\n if (token.value === \"...\") {\n i++;\n i = parseBindingPattern(tokens, i, end, names);\n i = skipDefaultValue(tokens, i, end, OBJECT_PATTERN_TERMINATORS);\n continue;\n }\n if (token.value === \"[\") {\n const closeIndex = findMatchingToken(tokens, i, \"[\", \"]\");\n i = closeIndex === -1 ? end : closeIndex + 1;\n if (tokens[i] && tokens[i].value === \":\") {\n i++;\n i = parseBindingPattern(tokens, i, end, names);\n i = skipDefaultValue(tokens, i, end, OBJECT_PATTERN_TERMINATORS);\n }\n continue;\n }\n if (token.type === \"identifier\" || token.type === \"literal\") {\n const key = token.value;\n i++;\n if (tokens[i] && tokens[i].value === \":\") {\n i++;\n i = parseBindingPattern(tokens, i, end, names);\n } else if (token.type === \"identifier\") {\n names.add(key);\n }\n i = skipDefaultValue(tokens, i, end, OBJECT_PATTERN_TERMINATORS);\n continue;\n }\n i++;\n }\n return i;\n}\n\nfunction parseArrayPattern(\n tokens: Token[],\n start: number,\n end: number,\n names: Set<string>\n): number {\n let i = start;\n while (i < end) {\n const token = tokens[i];\n if (!token) {\n return i;\n }\n if (token.value === \"]\") {\n return i + 1;\n }\n if (token.value === \",\") {\n i++;\n continue;\n }\n if (token.value === \"...\") {\n i++;\n i = parseBindingPattern(tokens, i, end, names);\n i = skipDefaultValue(tokens, i, end, ARRAY_PATTERN_TERMINATORS);\n continue;\n }\n i = parseBindingPattern(tokens, i, end, names);\n i = skipDefaultValue(tokens, i, end, ARRAY_PATTERN_TERMINATORS);\n if (tokens[i] && tokens[i].value === \",\") {\n i++;\n }\n }\n return i;\n}\n\nfunction collectBindingNamesFromList(\n tokens: Token[],\n start: number,\n end: number,\n names: Set<string>\n): void {\n let i = start;\n while (i < end) {\n if (tokens[i] && tokens[i].value === \",\") {\n i++;\n continue;\n }\n const nextIndex = parseBindingPattern(tokens, i, end, names);\n if (nextIndex === i) {\n i++;\n continue;\n }\n i = skipParameterSuffix(tokens, nextIndex, end);\n if (tokens[i] && tokens[i].value === \",\") {\n i++;\n }\n }\n}\n\nfunction skipParameterSuffix(tokens: Token[], start: number, end: number): number {\n if (!tokens[start]) {\n return start;\n }\n if (tokens[start].value === \"=\" || tokens[start].value === \":\") {\n return findExpressionEnd(tokens, start + 1, end, PARAMETER_TERMINATORS);\n }\n return start;\n}\n\nfunction skipDefaultValue(\n tokens: Token[],\n start: number,\n end: number,\n terminators: Set<string>\n): number {\n if (!tokens[start] || tokens[start].value !== \"=\") {\n return start;\n }\n return findExpressionEnd(tokens, start + 1, end, terminators);\n}\n\nfunction findMatchingToken(tokens: Token[], start: number, open: string, close: string): number {\n let depth = 0;\n for (let i = start; i < tokens.length; i++) {\n const value = tokens[i].value;\n if (value === open) {\n depth++;\n } else if (value === close) {\n depth--;\n if (depth === 0) {\n return i;\n }\n }\n }\n return -1;\n}\n\nfunction findExpressionEnd(\n tokens: Token[],\n start: number,\n end: number,\n terminators: Set<string>\n): number {\n let depthParen = 0;\n let depthBracket = 0;\n let depthBrace = 0;\n\n for (let i = start; i < end; i++) {\n const value = tokens[i].value;\n if (value === \"(\") {\n depthParen++;\n } else if (value === \")\") {\n if (depthParen === 0 && terminators.has(value)) {\n return i;\n }\n depthParen = Math.max(0, depthParen - 1);\n } else if (value === \"[\") {\n depthBracket++;\n } else if (value === \"]\") {\n if (depthBracket === 0 && terminators.has(value)) {\n return i;\n }\n depthBracket = Math.max(0, depthBracket - 1);\n } else if (value === \"{\") {\n depthBrace++;\n } else if (value === \"}\") {\n if (depthBrace === 0 && terminators.has(value)) {\n return i;\n }\n depthBrace = Math.max(0, depthBrace - 1);\n }\n\n if (depthParen === 0 && depthBracket === 0 && depthBrace === 0 && terminators.has(value)) {\n return i;\n }\n }\n\n return end;\n}\n\nfunction isMemberAccess(tokens: Token[], index: number): boolean {\n const prev = tokens[index - 1];\n return prev?.value === \".\" || prev?.value === \"?.\";\n}\n\nfunction isObjectKey(tokens: Token[], index: number): boolean {\n const next = tokens[index + 1];\n if (!next || next.value !== \":\") {\n return false;\n }\n const prev = tokens[index - 1];\n return prev?.value === \"{\" || prev?.value === \",\";\n}\n\nfunction isCallSite(tokens: Token[], index: number): boolean {\n const next = tokens[index + 1];\n return next?.value === \"(\";\n}\n\nfunction isShadowed(env: TemplateEnv, scopes: Array<Set<string>>, name: string): boolean {\n if (isLocal(env, name)) {\n return true;\n }\n for (let i = scopes.length - 1; i >= 0; i--) {\n if (scopes[i].has(name)) {\n return true;\n }\n }\n return false;\n}\n\nconst PARAMETER_TERMINATORS = new Set([\",\"]);\nconst OBJECT_PATTERN_TERMINATORS = new Set([\",\", \"}\"]);\nconst ARRAY_PATTERN_TERMINATORS = new Set([\",\", \"]\"]);\nconst EXPRESSION_TERMINATORS = new Set([\",\", \")\", \"]\", \"}\", \";\"]);\nconst DECLARATION_TERMINATORS = new Set([\",\", \")\", \"]\", \"}\", \";\"]);\n","import type {\n Attribute,\n ClassAliasesDecl,\n ComponentNode,\n ConditionalBranch,\n ConditionalNode,\n ElementNode,\n ForNode,\n JSXPassthroughNode,\n Node,\n InputsDecl,\n RootNode,\n SlotBlock,\n TextNode\n} from \"./ast.ts\";\nimport { createTemplateEnv, isLocal, isInput, popLocals, pushLocals, rewriteExpression, rewriteJsxExpression, type TemplateEnv } from \"./rewrite.ts\";\n\nexport interface RenderCodegenOptions {\n jsxRuntime: \"automatic\" | \"classic\";\n flavor: \"jsx\" | \"tsx\";\n}\n\nexport function generateRenderModule(root: RootNode, options: RenderCodegenOptions): string {\n const { prelude, inputsType, inputsPrelude, jsx, isTsx } = buildModuleParts(root, options);\n const parts: string[] = [...prelude, inputsType];\n\n if (!isTsx) {\n parts.push(`/** @param {any} __inputs */`);\n }\n\n const functionLines = [\n isTsx ? \"export function render(__inputs: any) {\" : \"export function render(__inputs) {\"\n ];\n if (inputsPrelude) {\n functionLines.push(` ${inputsPrelude}`);\n }\n functionLines.push(` return ${jsx};`, `}`);\n parts.push(functionLines.join(\"\\n\"));\n\n return parts.join(\"\\n\\n\");\n}\n\ninterface ModuleParts {\n prelude: string[];\n inputsType: string;\n inputsPrelude: string | null;\n jsx: string;\n isTsx: boolean;\n}\n\nfunction buildModuleParts(\n root: RootNode,\n options: { jsxRuntime: \"automatic\" | \"classic\"; flavor: \"jsx\" | \"tsx\" }\n): ModuleParts {\n const { jsxRuntime, flavor } = options;\n const isTsx = flavor === \"tsx\";\n\n // Build environments for code generation (does not mutate AST)\n const aliasEnv = buildClassAliasEnvironment(root.classAliases);\n const env = createTemplateEnv(root.inputsDecls);\n \n // Generate TSX output with bare identifiers for inputs\n const jsx = renderRootChildren(root.children, aliasEnv, env);\n const inputsPrelude = emitInputsPrelude(root.inputsDecls);\n\n const prelude: string[] = [];\n\n if (root.clientComponent) {\n prelude.push(`\"use client\";`);\n }\n\n // Classic runtime needs React in scope for JSX transforms.\n if (jsxRuntime === \"classic\" && templateUsesJsx(root)) {\n prelude.push(`import React from \"react\";`);\n }\n\n // JS-safe typedef for Inputs (JSDoc)\n const inputsType = emitInputsType(root.inputs, flavor);\n\n return { prelude, inputsType, inputsPrelude, jsx, isTsx };\n}\n\nfunction buildClassAliasEnvironment(\n decl?: ClassAliasesDecl\n): Map<string, readonly string[]> {\n const env = new Map<string, readonly string[]>();\n if (!decl) {\n return env;\n }\n for (const alias of decl.aliases) {\n env.set(alias.name, alias.classes);\n }\n return env;\n}\n\nfunction renderRootChildren(\n children: Node[],\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n return emitNodesExpression(children, aliasEnv, env);\n}\n\nfunction templateUsesJsx(root: RootNode): boolean {\n if (root.children.length === 0) {\n return false;\n }\n if (root.children.length > 1) {\n return true;\n }\n return nodeUsesJsx(root.children[0]);\n}\n\nfunction nodeUsesJsx(node: Node): boolean {\n if (node.type === \"Element\" || node.type === \"Text\" || node.type === \"Component\") {\n return true;\n }\n if (node.type === \"Expression\" || node.type === \"JSXPassthrough\") {\n return false;\n }\n if (node.type === \"Conditional\") {\n return node.branches.some((branch) => branchUsesJsx(branch));\n }\n if (node.type === \"For\") {\n return node.body.some((child) => nodeUsesJsx(child));\n }\n return false;\n}\n\nfunction branchUsesJsx(branch: ConditionalBranch): boolean {\n if (!branch.body.length) {\n return false;\n }\n return branch.body.some((child) => nodeUsesJsx(child));\n}\n\nfunction emitNodeInJsx(\n node: Node,\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n if (node.type === \"Text\") {\n return emitText(node, env);\n }\n if (node.type === \"Expression\") {\n return `{${emitExpressionValue(node.value, env)}}`;\n }\n if (node.type === \"JSXPassthrough\") {\n return `{${emitJsxExpression(node.expression, env)}}`;\n }\n if (node.type === \"Conditional\") {\n return `{${emitConditionalExpression(node, aliasEnv, env)}}`;\n }\n if (node.type === \"For\") {\n return `{${emitForExpression(node, aliasEnv, env)}}`;\n }\n if (node.type === \"Component\") {\n return wrapWithGuard(emitComponent(node, aliasEnv, env), node.guard, \"jsx\", env);\n }\n return wrapWithGuard(emitElement(node, aliasEnv, env), node.guard, \"jsx\", env);\n}\n\nfunction emitElement(\n node: ElementNode,\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n const expanded = expandClasses(node.classes, aliasEnv);\n const classAttr = expanded.length ? ` className=\"${expanded.join(\" \")}\"` : \"\";\n const attrs = emitAttributes(node.attributes, aliasEnv, env);\n const allAttrs = classAttr + attrs;\n const children = emitChildrenWithSpacing(node.children, aliasEnv, env);\n \n if (children.length > 0) {\n return `<${node.name}${allAttrs}>${children}</${node.name}>`;\n } else {\n return `<${node.name}${allAttrs} />`;\n }\n}\n\nfunction emitComponent(\n node: ComponentNode,\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n const attrs = emitAttributes(node.attributes, aliasEnv, env);\n const slotBindings = emitSlotBindings(node, aliasEnv, env);\n const allAttrs = `${attrs}${slotBindings}`;\n const children = emitChildrenWithSpacing(node.children, aliasEnv, env);\n \n if (children.length > 0) {\n return `<${node.name}${allAttrs}>${children}</${node.name}>`;\n } else {\n return `<${node.name}${allAttrs} />`;\n }\n}\n\nfunction emitChildrenWithSpacing(\n children: Node[],\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n if (children.length === 0) {\n return \"\";\n }\n \n const parts: string[] = [];\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n const emitted = emitNodeInJsx(child, aliasEnv, env);\n parts.push(emitted);\n \n // Add space between text and following element/component\n // but NOT between element/component and element/component\n if (i < children.length - 1) {\n const nextChild = children[i + 1];\n const needsSpace = \n child.type === \"Text\" &&\n (nextChild.type === \"Element\" || nextChild.type === \"Component\" || nextChild.type === \"Expression\" || nextChild.type === \"JSXPassthrough\");\n \n if (needsSpace) {\n parts.push(\" \");\n }\n }\n }\n \n return parts.join(\"\");\n}\n\nfunction emitAttributes(\n attributes: Attribute[],\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n if (attributes.length === 0) {\n return \"\";\n }\n \n return attributes.map(attr => {\n if (attr.value === null) {\n return ` ${attr.name}`;\n }\n return ` ${attr.name}=${emitAttributeValue(attr.value, env)}`;\n }).join(\"\");\n}\n\nfunction emitSlotBindings(\n node: ComponentNode,\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n if (!node.slots || node.slots.length === 0) {\n return \"\";\n }\n return node.slots\n .map((slot) => {\n const expr = emitNodesExpression(slot.children, aliasEnv, env);\n return ` ${slot.name}={${expr}}`;\n })\n .join(\"\");\n}\n\nfunction wrapWithGuard(\n rendered: string,\n guard: string | undefined,\n context: \"jsx\" | \"expression\",\n env: TemplateEnv\n): string {\n if (!guard) {\n return rendered;\n }\n const condition = emitExpressionValue(guard, env);\n const expression = `(${condition}) && ${rendered}`;\n return context === \"jsx\" ? `{${expression}}` : expression;\n}\n\nfunction emitForExpression(\n node: ForNode,\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n const arrayExpr = emitExpressionValue(node.arrayExpr, env);\n pushLocals(env, [node.itemName]);\n const body = emitNodesExpression(node.body, aliasEnv, env);\n popLocals(env);\n return `(${arrayExpr} ?? []).map((${node.itemName}) => ${body})`;\n}\n\nfunction expandClasses(\n classes: readonly string[],\n aliasEnv: Map<string, readonly string[]>\n): string[] {\n // Alias expansion is a pure compile-time macro. The parser guarantees diagnostics for\n // undefined aliases, so codegen simply replaces $alias tokens with their literal class list.\n const result: string[] = [];\n for (const cls of classes) {\n const match = cls.match(/^\\$([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!match) {\n result.push(cls);\n continue;\n }\n const aliasClasses = aliasEnv.get(match[1]);\n if (!aliasClasses) {\n continue;\n }\n result.push(...aliasClasses);\n }\n return result;\n}\n\nfunction emitExpressionValue(expression: string, env: TemplateEnv): string {\n return rewriteExpression(expression, env).code;\n}\n\nfunction emitJsxExpression(expression: string, env: TemplateEnv): string {\n const trimmed = expression.trimStart();\n if (trimmed.startsWith(\"<\")) {\n return rewriteJsxExpression(expression, env).code;\n }\n return rewriteExpression(expression, env).code;\n}\n\nfunction emitAttributeValue(value: string, env: TemplateEnv): string {\n const trimmed = value.trim();\n if (trimmed.startsWith(\"\\\"\") || trimmed.startsWith(\"'\")) {\n return value;\n }\n if (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) {\n const inner = trimmed.slice(1, -1);\n const rewritten = rewriteExpression(inner, env).code;\n return `{${rewritten}}`;\n }\n return rewriteExpression(trimmed, env).code;\n}\n\nfunction emitText(node: TextNode, env: TemplateEnv): string {\n if (!node.parts.length) {\n return \"\";\n }\n\n return node.parts\n .map((part) => {\n if (part.type === \"text\") {\n return escapeText(part.value);\n }\n return `{${emitExpressionValue(part.value, env)}}`;\n })\n .join(\"\");\n}\n\nfunction emitConditionalExpression(\n node: ConditionalNode,\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n if (!node.branches.length) {\n return \"null\";\n }\n const first = node.branches[0];\n if (node.branches.length === 1 && first.test) {\n const test = emitExpressionValue(first.test, env);\n return `(${test}) && ${emitBranchExpression(first, aliasEnv, env)}`;\n }\n const hasElse = node.branches[node.branches.length - 1].test === undefined;\n let fallback = hasElse\n ? emitBranchExpression(node.branches[node.branches.length - 1], aliasEnv, env)\n : \"null\";\n const startIndex = hasElse ? node.branches.length - 2 : node.branches.length - 1;\n if (startIndex < 0) {\n return fallback;\n }\n for (let i = startIndex; i >= 0; i--) {\n const branch = node.branches[i];\n const test = branch.test ? emitExpressionValue(branch.test, env) : \"false\";\n fallback = `(${test}) ? ${emitBranchExpression(branch, aliasEnv, env)} : ${fallback}`;\n }\n return fallback;\n}\n\nfunction emitBranchExpression(\n branch: ConditionalBranch,\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n return emitNodesExpression(branch.body, aliasEnv, env);\n}\n\nfunction emitNodesExpression(\n children: Node[],\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n if (children.length === 0) {\n return \"null\";\n }\n if (children.length === 1) {\n return emitSingleNodeExpression(children[0], aliasEnv, env);\n }\n return `<>${children.map((child) => emitNodeInJsx(child, aliasEnv, env)).join(\"\")}</>`;\n}\n\nfunction emitSingleNodeExpression(\n node: Node,\n aliasEnv: Map<string, readonly string[]>,\n env: TemplateEnv\n): string {\n if (node.type === \"Expression\") {\n return emitExpressionValue(node.value, env);\n }\n if (node.type === \"JSXPassthrough\") {\n return emitJsxExpression(node.expression, env);\n }\n if (node.type === \"Conditional\") {\n return emitConditionalExpression(node, aliasEnv, env);\n }\n if (node.type === \"For\") {\n return emitForExpression(node, aliasEnv, env);\n }\n if (node.type === \"Element\") {\n return wrapWithGuard(emitElement(node, aliasEnv, env), node.guard, \"expression\", env);\n }\n if (node.type === \"Component\") {\n return wrapWithGuard(emitComponent(node, aliasEnv, env), node.guard, \"expression\", env);\n }\n if (node.type === \"Text\") {\n return `<>${emitNodeInJsx(node, aliasEnv, env)}</>`;\n }\n return emitNodeInJsx(node, aliasEnv, env);\n}\n\nfunction emitInputsType(inputs: InputsDecl | undefined, flavor: \"jsx\" | \"tsx\"): string {\n if (flavor === \"tsx\") {\n return emitTsInputsType(inputs);\n }\n return emitJsDocInputsType(inputs);\n}\n\nfunction emitJsDocInputsType(inputs?: InputsDecl): string {\n // Emit JS-safe JSDoc typedef (Rollup can parse this, and TS tooling can read it).\n if (!inputs) {\n return \"/** @typedef {any} Inputs */\";\n }\n if (!inputs.fields.length) {\n return \"/** @typedef {{}} Inputs */\";\n }\n\n // Build an object type like: { foo: string; bar?: number }\n const fields = inputs.fields\n .map((field) => {\n const optional = field.optional ? \"?\" : \"\";\n return `${field.name}${optional}: ${field.typeText}`;\n })\n .join(\"; \");\n\n return `/** @typedef {{ ${fields} }} Inputs */`;\n}\n\nfunction emitTsInputsType(inputs?: InputsDecl): string {\n if (!inputs || inputs.fields.length === 0) {\n return \"export type Inputs = Record<string, never>;\";\n }\n\n const lines = inputs.fields.map((field) => {\n const optional = field.optional ? \"?\" : \"\";\n return ` ${field.name}${optional}: ${field.typeText};`;\n });\n\n return [\"export interface Inputs {\", ...lines, \"}\"].join(\"\\n\");\n}\n\nfunction emitInputsPrelude(inputsDecls?: Array<{ name: string; kind: any }>): string | null {\n if (!inputsDecls || inputsDecls.length === 0) {\n return null;\n }\n const names = inputsDecls.map((decl) => decl.name);\n return `const { ${names.join(\", \")} } = __inputs ?? {};`;\n}\n\nfunction escapeText(value: string): string {\n return value.replace(/[&<>{}]/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&amp;\";\n case \"<\":\n return \"&lt;\";\n case \">\":\n return \"&gt;\";\n case \"{\":\n return \"&#123;\";\n case \"}\":\n return \"&#125;\";\n default:\n return char;\n }\n });\n}\n","import type {\n Attribute,\n ClassAliasesDecl,\n ElementNode,\n Node,\n RootNode,\n TextNode\n} from \"./ast.ts\";\n\nexport interface HtmlCodegenOptions {\n indent?: string;\n}\n\n// Attribute rendering overview:\n// - renderAttributes flattens classes and AST-provided attributes into `name=\"value\"` strings.\n// - extractStaticAttributeValue peels the literal text from the parser's raw attribute field and hands it to\n// escapeHtmlAttribute so that &, <, >, and \" inside the value are safely encoded.\n// - When inline attributes were parsed as a single chunk (e.g. `src=\"/foo\" alt=\"bar\"`), the chunk's closing quote\n// was treated as part of the literal, causing escapeHtmlAttribute to turn the boundary `\"` into `&quot;` and break\n// subsequent attributes. The logic below isolates the raw value and feeds any leftover attribute text back through\n// the same renderer so only the actual attribute contents are escaped.\n\n/**\n * HTML emitter currently supports only static markup; dynamic expressions and control flow will be added later.\n */\nexport function generateHtml(root: RootNode, options: HtmlCodegenOptions = {}): string {\n const indent = options.indent ?? \" \";\n const aliasEnv = buildClassAliasEnvironment(root.classAliases);\n const rendered = emitNodes(root.children, aliasEnv, indent, 0);\n return rendered.trimEnd();\n}\n\nfunction emitNodes(\n children: Node[],\n aliasEnv: Map<string, readonly string[]>,\n indent: string,\n depth: number\n): string {\n let html = \"\";\n for (const child of children) {\n const chunk = emitNode(child, aliasEnv, indent, depth);\n if (chunk) {\n html += chunk;\n }\n }\n return html;\n}\n\nfunction emitNode(\n node: Node,\n aliasEnv: Map<string, readonly string[]>,\n indent: string,\n depth: number\n): string {\n switch (node.type) {\n case \"Element\":\n return emitElement(node, aliasEnv, indent, depth);\n case \"Text\":\n return emitTextBlock(node, indent, depth);\n default:\n return \"\";\n }\n}\n\nfunction emitElement(\n node: ElementNode,\n aliasEnv: Map<string, readonly string[]>,\n indent: string,\n depth: number\n): string {\n const indentText = indent.repeat(depth);\n const classNames = expandClasses(node.classes, aliasEnv);\n const attrs = renderAttributes(node.attributes, classNames);\n const openTag = `<${node.name}${attrs}>`;\n\n if (node.children.length === 0) {\n return `${indentText}${openTag}</${node.name}>\\n`;\n }\n\n if (node.children.length === 1 && node.children[0].type === \"Text\") {\n const inline = emitInlineText(node.children[0]);\n if (inline !== null) {\n return `${indentText}${openTag}${inline}</${node.name}>\\n`;\n }\n }\n\n const children = emitNodes(node.children, aliasEnv, indent, depth + 1);\n if (!children) {\n return `${indentText}${openTag}</${node.name}>\\n`;\n }\n\n return `${indentText}${openTag}\\n${children}${indentText}</${node.name}>\\n`;\n}\n\nfunction renderAttributes(attributes: Attribute[], classNames: readonly string[]): string {\n const segments: string[] = [];\n if (classNames.length) {\n segments.push(`class=\"${escapeAttributeValue(classNames.join(\" \"))}\"`);\n }\n for (const attr of attributes) {\n if (attr.value === null) {\n segments.push(attr.name);\n continue;\n }\n const literal = extractStaticAttributeValue(attr.value);\n if (literal === null) {\n continue;\n }\n const name = attr.name === \"className\" ? \"class\" : attr.name;\n segments.push(`${name}=\"${escapeAttributeValue(literal)}\"`);\n }\n if (!segments.length) {\n return \"\";\n }\n return \" \" + segments.join(\" \");\n}\n\nfunction emitTextBlock(node: TextNode, indent: string, depth: number): string {\n const inline = emitInlineText(node);\n if (inline === null || inline.trim().length === 0) {\n return \"\";\n }\n return `${indent.repeat(depth)}${inline}\\n`;\n}\n\nfunction emitInlineText(node: TextNode): string | null {\n if (!node.parts.length) {\n return \"\";\n }\n let text = \"\";\n for (const part of node.parts) {\n if (part.type !== \"text\") {\n return null;\n }\n text += escapeStaticText(part.value);\n }\n return text;\n}\n\nfunction extractStaticAttributeValue(raw: string): string | null {\n const trimmed = raw.trim();\n if (trimmed.length < 2) {\n return null;\n }\n const quote = trimmed[0];\n if ((quote !== '\"' && quote !== \"'\") || trimmed[trimmed.length - 1] !== quote) {\n return null;\n }\n const body = trimmed.slice(1, -1);\n let result = \"\";\n let escaping = false;\n for (const char of body) {\n if (escaping) {\n result += unescapeChar(char, quote);\n escaping = false;\n continue;\n }\n if (char === \"\\\\\") {\n escaping = true;\n } else {\n result += char;\n }\n }\n if (escaping) {\n result += \"\\\\\";\n }\n return result;\n}\n\nfunction unescapeChar(char: string, quote: string): string {\n switch (char) {\n case \"n\":\n return \"\\n\";\n case \"r\":\n return \"\\r\";\n case \"t\":\n return \"\\t\";\n case \"\\\\\":\n return \"\\\\\";\n case '\"':\n return '\"';\n case \"'\":\n return \"'\";\n default:\n if (char === quote) {\n return quote;\n }\n return char;\n }\n}\n\nfunction buildClassAliasEnvironment(\n decl?: ClassAliasesDecl\n): Map<string, readonly string[]> {\n const env = new Map<string, readonly string[]>();\n if (!decl) {\n return env;\n }\n for (const alias of decl.aliases) {\n env.set(alias.name, alias.classes);\n }\n return env;\n}\n\nfunction expandClasses(\n classes: readonly string[],\n aliasEnv: Map<string, readonly string[]>\n): string[] {\n const result: string[] = [];\n for (const cls of classes) {\n const match = cls.match(/^\\$([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!match) {\n result.push(cls);\n continue;\n }\n const aliasClasses = aliasEnv.get(match[1]);\n if (!aliasClasses) {\n continue;\n }\n result.push(...aliasClasses);\n }\n return result;\n}\n\nfunction escapeStaticText(value: string): string {\n return value.replace(/[&<>{}]/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&amp;\";\n case \"<\":\n return \"&lt;\";\n case \">\":\n return \"&gt;\";\n case \"{\":\n return \"&#123;\";\n case \"}\":\n return \"&#125;\";\n default:\n return char;\n }\n });\n}\n\nfunction escapeAttributeValue(value: string): string {\n return value.replace(/[\"&<>]/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&amp;\";\n case \"<\":\n return \"&lt;\";\n case \">\":\n return \"&gt;\";\n case '\"':\n return \"&quot;\";\n default:\n return char;\n }\n });\n}\n","export type DiagnosticSeverity = \"error\" | \"warning\";\n\nexport type DiagnosticCode =\n | \"COLLIE001\"\n | \"COLLIE002\"\n | \"COLLIE003\"\n | \"COLLIE004\"\n | \"COLLIE005\"\n | \"COLLIE101\"\n | \"COLLIE102\"\n | \"COLLIE103\"\n | \"COLLIE104\"\n | \"COLLIE105\"\n | \"COLLIE106\"\n | \"COLLIE201\"\n | \"COLLIE202\"\n | \"COLLIE203\"\n | \"COLLIE204\"\n | \"COLLIE205\"\n | \"COLLIE206\"\n | \"COLLIE207\"\n | \"COLLIE208\"\n | \"COLLIE209\"\n | \"COLLIE210\"\n | \"COLLIE211\"\n | \"COLLIE212\"\n | \"COLLIE213\"\n | \"COLLIE301\"\n | \"COLLIE302\"\n | \"COLLIE303\"\n | \"COLLIE304\"\n | \"COLLIE305\"\n | \"COLLIE306\"\n | \"COLLIE307\"\n | \"COLLIE401\"\n | \"COLLIE402\"\n | \"COLLIE501\"\n | \"COLLIE502\"\n | \"COLLIE503\"\n | \"COLLIE601\"\n | \"COLLIE701\"\n | \"COLLIE702\"\n | \"COLLIE703\"\n | \"COLLIE_ID_NOT_PASCAL_CASE\"\n | \"dialect.token.disallowed\"\n | \"dialect.token.nonPreferred\";\n\nexport interface SourcePos {\n line: number;\n col: number;\n offset: number;\n}\n\nexport interface SourceSpan {\n start: SourcePos;\n end: SourcePos;\n}\n\nexport interface Diagnostic {\n severity: DiagnosticSeverity;\n message: string;\n span?: SourceSpan;\n range?: SourceSpan;\n code?: DiagnosticCode;\n file?: string;\n filePath?: string;\n fix?: DiagnosticFix;\n data?: DiagnosticData;\n}\n\nexport interface DiagnosticFix {\n range: SourceSpan;\n replacementText: string;\n}\n\nexport interface DiagnosticData {\n kind: string;\n [key: string]: unknown;\n}\n\nexport function createSpan(line: number, col: number, length: number, lineOffset: number): SourceSpan {\n const startOffset = lineOffset + col - 1;\n return {\n start: { line, col, offset: startOffset },\n end: { line, col: col + length, offset: startOffset + length }\n };\n}\n","import type {\n ConditionalBranch,\n ConditionalNode,\n ForNode,\n Node,\n RootNode\n} from \"./ast.ts\";\nimport type { Diagnostic, DiagnosticSeverity, SourceSpan } from \"./diagnostics.ts\";\nimport type {\n CollieDiagnosticLevel,\n NormalizedCollieDialectOptions,\n NormalizedCollieDialectTokenRule\n} from \"@collie-lang/config\";\n\ninterface TokenOccurrence {\n kind: \"if\" | \"elseIf\" | \"else\" | \"for\" | \"id\";\n token: string;\n span?: SourceSpan;\n}\n\nexport function enforceDialect(\n root: RootNode,\n config: NormalizedCollieDialectOptions\n): Diagnostic[] {\n const diagnostics: Diagnostic[] = [];\n\n if (root.idToken) {\n diagnostics.push(\n ...evaluateToken(\n { kind: \"id\", token: root.idToken, span: root.idTokenSpan },\n config.tokens.id\n )\n );\n }\n\n walkNodes(root.children, (occurrence) => {\n const rule = config.tokens[occurrence.kind];\n diagnostics.push(...evaluateToken(occurrence, rule));\n });\n\n return diagnostics;\n}\n\nfunction walkNodes(nodes: Node[], onToken: (occurrence: TokenOccurrence) => void): void {\n for (const node of nodes) {\n if (node.type === \"For\") {\n onFor(node, onToken);\n walkNodes(node.body, onToken);\n continue;\n }\n if (node.type === \"Conditional\") {\n onConditional(node, onToken);\n continue;\n }\n if (node.type === \"Element\" || node.type === \"Component\") {\n walkNodes(node.children, onToken);\n if (node.type === \"Component\" && node.slots) {\n for (const slot of node.slots) {\n walkNodes(slot.children, onToken);\n }\n }\n continue;\n }\n }\n}\n\nfunction onFor(node: ForNode, onToken: (occurrence: TokenOccurrence) => void): void {\n if (!node.token) {\n return;\n }\n onToken({ kind: \"for\", token: node.token, span: node.tokenSpan });\n}\n\nfunction onConditional(\n node: ConditionalNode,\n onToken: (occurrence: TokenOccurrence) => void\n): void {\n for (const branch of node.branches) {\n onBranch(branch, onToken);\n walkNodes(branch.body, onToken);\n }\n}\n\nfunction onBranch(\n branch: ConditionalBranch,\n onToken: (occurrence: TokenOccurrence) => void\n): void {\n if (!branch.token || !branch.kind) {\n return;\n }\n onToken({ kind: branch.kind, token: branch.token, span: branch.tokenSpan });\n}\n\nfunction evaluateToken(\n occurrence: TokenOccurrence,\n rule: NormalizedCollieDialectTokenRule\n): Diagnostic[] {\n const diagnostics: Diagnostic[] = [];\n const used = occurrence.token;\n const preferred = rule.preferred;\n const isAllowed = rule.allow.includes(used);\n\n if (!isAllowed) {\n const severity = levelToSeverity(rule.onDisallowed);\n if (severity) {\n diagnostics.push(\n createDialectDiagnostic(\n \"dialect.token.disallowed\",\n severity,\n used,\n preferred,\n occurrence.span,\n `Token \"${used}\" is not allowed for ${occurrence.kind}. Preferred: \"${preferred}\".`\n )\n );\n }\n return diagnostics;\n }\n\n if (used !== preferred) {\n const severity = levelToSeverity(rule.onDisallowed);\n if (severity) {\n diagnostics.push(\n createDialectDiagnostic(\n \"dialect.token.nonPreferred\",\n severity,\n used,\n preferred,\n occurrence.span,\n `Token \"${used}\" is allowed but not preferred for ${occurrence.kind}. Preferred: \"${preferred}\".`\n )\n );\n }\n }\n\n return diagnostics;\n}\n\nfunction createDialectDiagnostic(\n code: \"dialect.token.disallowed\" | \"dialect.token.nonPreferred\",\n severity: DiagnosticSeverity,\n used: string,\n preferred: string,\n span: SourceSpan | undefined,\n message: string\n): Diagnostic {\n const fix = span\n ? {\n range: span,\n replacementText: preferred\n }\n : undefined;\n\n return {\n severity,\n code,\n message: message.replace(/\\\\s+/g, \" \"),\n span,\n fix\n };\n}\n\nfunction levelToSeverity(level: CollieDiagnosticLevel): DiagnosticSeverity | null {\n if (level === \"off\") {\n return null;\n }\n if (level === \"error\") {\n return \"error\";\n }\n return \"warning\";\n}\n","import type {\n Attribute,\n ClassAliasDecl,\n ClassAliasesDecl,\n ComponentNode,\n ConditionalBranch,\n ConditionalNode,\n ElementNode,\n ExpressionNode,\n ForNode,\n JSXPassthroughNode,\n Node,\n InputDecl,\n InputsField,\n RootNode,\n SlotBlock,\n TextNode\n} from \"./ast.ts\";\nimport type { NormalizedCollieDialectOptions } from \"@collie-lang/config\";\nimport { type Diagnostic, type DiagnosticCode, type SourceSpan, createSpan } from \"./diagnostics.ts\";\nimport { enforceDialect } from \"./dialect.ts\";\n\nexport interface TemplateUnit {\n id: string;\n rawId: string;\n span?: SourceSpan;\n ast: RootNode;\n diagnostics: Diagnostic[];\n}\n\nexport interface ParseResult {\n templates: TemplateUnit[];\n diagnostics: Diagnostic[];\n}\n\nexport interface ParseOptions {\n dialect?: NormalizedCollieDialectOptions;\n}\n\ninterface ConditionalBranchContext {\n kind: \"ConditionalBranch\";\n owner: ConditionalNode;\n branch: ConditionalBranch;\n children: Node[];\n}\n\ninterface SlotContext {\n kind: \"Slot\";\n owner: ComponentNode;\n slot: SlotBlock;\n children: Node[];\n}\n\ntype ParentNode = RootNode | ElementNode | ComponentNode | ForNode | ConditionalBranchContext | SlotContext;\n\ninterface StackItem {\n node: ParentNode;\n level: number;\n}\n\ninterface BranchLocation {\n branch: ConditionalBranch;\n line: number;\n column: number;\n lineOffset: number;\n length: number;\n}\n\ninterface ConditionalChainState {\n node: ConditionalNode;\n level: number;\n hasElse: boolean;\n}\n\nconst ELEMENT_NAME = /^[A-Za-z][A-Za-z0-9_-]*/;\nconst CLASS_NAME = /^[A-Za-z0-9_$-]+/;\nconst TEMPLATE_ID_PATTERN = /^[A-Za-z][A-Za-z0-9._-]*$/;\n\nfunction getIndentLevel(line: string): number {\n const match = line.match(/^\\s*/);\n return match ? match[0].length / 2 : 0;\n}\n\nfunction getIdValueSpan(\n lineContent: string,\n indent: number,\n lineNumber: number,\n lineOffset: number,\n tokenLength: number,\n valueLength: number\n): SourceSpan | undefined {\n if (valueLength <= 0) {\n return undefined;\n }\n\n let cursor = tokenLength;\n while (cursor < lineContent.length && /\\s/.test(lineContent[cursor])) {\n cursor++;\n }\n if (lineContent[cursor] === \":\" || lineContent[cursor] === \"=\") {\n cursor++;\n while (cursor < lineContent.length && /\\s/.test(lineContent[cursor])) {\n cursor++;\n }\n }\n\n const column = indent + cursor + 1;\n return createSpan(lineNumber, column, valueLength, lineOffset);\n}\n\ninterface TemplateHeader {\n id: string;\n rawId: string;\n span?: SourceSpan;\n bodyStartIndex: number;\n}\n\nexport function parse(source: string, options: ParseOptions = {}): ParseResult {\n const diagnostics: Diagnostic[] = [];\n const templates: TemplateUnit[] = [];\n\n const normalized = source.replace(/\\r\\n?/g, \"\\n\");\n const lines = normalized.split(\"\\n\");\n const lineOffsets = buildLineOffsets(lines);\n\n let currentHeader: TemplateHeader | null = null;\n let sawIdBlock = false;\n const seenIds = new Map<string, SourceSpan | undefined>();\n\n const finalizeTemplate = (endIndex: number): void => {\n if (!currentHeader) {\n return;\n }\n const result = parseTemplateBlock(lines, lineOffsets, currentHeader.bodyStartIndex, endIndex, options);\n const prefixedDiagnostics = prefixDiagnostics(result.diagnostics, currentHeader.id);\n const unit: TemplateUnit = {\n id: currentHeader.id,\n rawId: currentHeader.rawId,\n span: currentHeader.span,\n ast: result.root,\n diagnostics: prefixedDiagnostics\n };\n templates.push(unit);\n diagnostics.push(...prefixedDiagnostics);\n currentHeader = null;\n };\n\n for (let i = 0; i < lines.length; i++) {\n const rawLine = lines[i];\n const lineNumber = i + 1;\n const lineOffset = lineOffsets[i];\n\n if (/^\\s*$/.test(rawLine)) {\n continue;\n }\n\n const indentMatch = rawLine.match(/^\\s*/) ?? [\"\"];\n const indent = indentMatch[0].length;\n const lineContent = rawLine.slice(indent);\n const trimmed = lineContent.trimEnd();\n\n const idMatch = trimmed.match(/^#id\\b(.*)$/);\n if (idMatch) {\n if (indent !== 0) {\n pushDiag(\n diagnostics,\n \"COLLIE701\",\n \"#id directives must appear at the top level.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n continue;\n }\n\n finalizeTemplate(i);\n sawIdBlock = true;\n\n const remainderRaw = idMatch[1] ?? \"\";\n if (remainderRaw && !/^[\\s:=]/.test(remainderRaw)) {\n pushDiag(\n diagnostics,\n \"COLLIE702\",\n 'Invalid #id directive syntax. Use \"#id <id>\".',\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n }\n let valuePart = remainderRaw.trim();\n if (valuePart.startsWith(\"=\") || valuePart.startsWith(\":\")) {\n valuePart = valuePart.slice(1).trim();\n }\n\n const valueSpan = getIdValueSpan(\n lineContent,\n indent,\n lineNumber,\n lineOffset,\n \"#id\".length,\n valuePart.length\n );\n const valueColumn = valueSpan?.start.col ?? indent + 1;\n const valueLength = valueSpan ? valuePart.length : trimmed.length;\n\n if (!valuePart) {\n pushDiag(\n diagnostics,\n \"COLLIE702\",\n \"#id directives must specify an identifier value.\",\n lineNumber,\n valueColumn,\n lineOffset,\n valueLength\n );\n } else if (!TEMPLATE_ID_PATTERN.test(valuePart)) {\n pushDiag(\n diagnostics,\n \"COLLIE702\",\n 'Invalid #id value. IDs must match \"^[A-Za-z][A-Za-z0-9._-]*$\".',\n lineNumber,\n valueColumn,\n lineOffset,\n valueLength\n );\n }\n\n if (valuePart && TEMPLATE_ID_PATTERN.test(valuePart)) {\n const previous = seenIds.get(valuePart);\n if (previous) {\n const previousLine = previous.start.line;\n pushDiag(\n diagnostics,\n \"COLLIE703\",\n `Duplicate #id \"${valuePart}\" (first declared on line ${previousLine}).`,\n lineNumber,\n valueColumn,\n lineOffset,\n valueLength\n );\n } else {\n seenIds.set(valuePart, valueSpan);\n }\n }\n\n currentHeader = {\n id: valuePart,\n rawId: valuePart,\n span: valueSpan,\n bodyStartIndex: i + 1\n };\n continue;\n }\n\n if (!sawIdBlock && !currentHeader) {\n pushDiag(\n diagnostics,\n \"COLLIE701\",\n \"Content before the first #id block is not allowed.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n }\n }\n\n finalizeTemplate(lines.length);\n\n if (!sawIdBlock) {\n pushDiag(\n diagnostics,\n \"COLLIE701\",\n \"A .collie file must contain at least one #id block.\",\n 1,\n 1,\n 0\n );\n }\n\n return { templates, diagnostics };\n}\n\nfunction parseTemplateBlock(\n lines: string[],\n lineOffsets: number[],\n startIndex: number,\n endIndex: number,\n options: ParseOptions\n): { root: RootNode; diagnostics: Diagnostic[] } {\n const diagnostics: Diagnostic[] = [];\n const root: RootNode = { type: \"Root\", children: [] };\n const stack: StackItem[] = [{ node: root, level: -1 }];\n let inputsBlockLevel: number | null = null;\n let classesBlockLevel: number | null = null;\n let sawTopLevelTemplateNode = false;\n const conditionalChains = new Map<number, ConditionalChainState>();\n const branchLocations: BranchLocation[] = [];\n\n let i = startIndex;\n\n while (i < endIndex) {\n const rawLine = lines[i];\n const lineNumber = i + 1;\n const lineOffset = lineOffsets[i];\n i++;\n\n if (/^\\s*$/.test(rawLine)) {\n continue;\n }\n\n const tabIndex = rawLine.indexOf(\"\\t\");\n if (tabIndex !== -1) {\n pushDiag(\n diagnostics,\n \"COLLIE001\",\n \"Tabs are not allowed; use spaces for indentation.\",\n lineNumber,\n tabIndex + 1,\n lineOffset\n );\n continue;\n }\n\n const indentMatch = rawLine.match(/^\\s*/) ?? [\"\"];\n const indent = indentMatch[0].length;\n const lineContent = rawLine.slice(indent);\n const trimmed = lineContent.trimEnd();\n\n if (indent % 2 !== 0) {\n pushDiag(\n diagnostics,\n \"COLLIE002\",\n \"Indentation must be multiples of two spaces.\",\n lineNumber,\n indent + 1,\n lineOffset\n );\n continue;\n }\n\n let level = indent / 2;\n\n if (inputsBlockLevel !== null && level <= inputsBlockLevel) {\n inputsBlockLevel = null;\n }\n if (classesBlockLevel !== null && level <= classesBlockLevel) {\n classesBlockLevel = null;\n }\n\n const isInInputsBlock = inputsBlockLevel !== null && level > inputsBlockLevel;\n const isInClassesBlock = classesBlockLevel !== null && level > classesBlockLevel;\n\n while (stack.length > 1 && stack[stack.length - 1].level >= level) {\n stack.pop();\n }\n\n const parentLevel = stack[stack.length - 1].level;\n if (level > parentLevel + 1 && !isInInputsBlock && !isInClassesBlock) {\n pushDiag(\n diagnostics,\n \"COLLIE003\",\n \"Indentation jumped more than one level.\",\n lineNumber,\n indent + 1,\n lineOffset\n );\n level = parentLevel + 1;\n }\n\n cleanupConditionalChains(conditionalChains, level);\n const isElseIfLine = /^@elseIf\\b/.test(trimmed);\n const isElseLine = /^@else\\b/.test(trimmed) && !isElseIfLine;\n if (!isElseIfLine && !isElseLine) {\n conditionalChains.delete(level);\n }\n\n if (trimmed === \"classes\") {\n if (level !== 0) {\n pushDiag(\n diagnostics,\n \"COLLIE301\",\n \"Classes block must be at the top level.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else if (sawTopLevelTemplateNode) {\n pushDiag(\n diagnostics,\n \"COLLIE302\",\n \"Classes block must appear before any template nodes.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else {\n if (!root.classAliases) {\n root.classAliases = { aliases: [] };\n }\n classesBlockLevel = level;\n }\n continue;\n }\n\n if (trimmed === \"#inputs\") {\n if (level !== 0) {\n pushDiag(\n diagnostics,\n \"COLLIE102\",\n \"#inputs block must be at the top level.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else if (root.inputs) {\n pushDiag(\n diagnostics,\n \"COLLIE101\",\n \"Only one #inputs block is allowed per #id.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else {\n root.inputs = { fields: [] };\n }\n if (level === 0) {\n if (!root.inputsDecls) {\n root.inputsDecls = [];\n }\n inputsBlockLevel = level;\n }\n continue;\n }\n\n if (trimmed === \"@client\") {\n if (level !== 0) {\n pushDiag(\n diagnostics,\n \"COLLIE401\",\n \"@client must appear at the top level before any other blocks.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else if (sawTopLevelTemplateNode) {\n pushDiag(\n diagnostics,\n \"COLLIE401\",\n \"@client must appear before any template nodes.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else if (root.clientComponent) {\n pushDiag(\n diagnostics,\n \"COLLIE402\",\n \"@client can only appear once per file.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else {\n root.clientComponent = true;\n }\n continue;\n }\n\n if (inputsBlockLevel !== null && level > inputsBlockLevel) {\n if (level !== inputsBlockLevel + 1) {\n pushDiag(\n diagnostics,\n \"COLLIE102\",\n \"#inputs lines must be indented two spaces under the #inputs header.\",\n lineNumber,\n indent + 1,\n lineOffset\n );\n continue;\n }\n\n const decl = parseInputDecl(lineContent, lineNumber, indent + 1, lineOffset, diagnostics);\n if (decl && root.inputsDecls) {\n // Check for duplicates\n const existing = root.inputsDecls.find((d) => d.name === decl.name);\n if (existing) {\n pushDiag(\n diagnostics,\n \"COLLIE106\",\n `Duplicate input declaration \"${decl.name}\".`,\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n } else {\n root.inputsDecls.push(decl);\n }\n }\n continue;\n }\n\n if (classesBlockLevel !== null && level > classesBlockLevel) {\n if (level !== classesBlockLevel + 1) {\n pushDiag(\n diagnostics,\n \"COLLIE303\",\n \"Classes lines must be indented two spaces under the classes header.\",\n lineNumber,\n indent + 1,\n lineOffset\n );\n continue;\n }\n\n const alias = parseClassAliasLine(trimmed, lineNumber, indent + 1, lineOffset, diagnostics);\n if (alias && root.classAliases) {\n root.classAliases.aliases.push(alias);\n }\n continue;\n }\n\n const parent = stack[stack.length - 1].node;\n\n if (trimmed.startsWith(\"@for\")) {\n const forHeader = parseForHeader(\n lineContent,\n lineNumber,\n indent + 1,\n lineOffset,\n diagnostics\n );\n if (!forHeader) {\n continue;\n }\n const forNode: ForNode = {\n type: \"For\",\n itemName: forHeader.itemName,\n arrayExpr: forHeader.arrayExpr,\n body: [],\n token: forHeader.token,\n tokenSpan: forHeader.tokenSpan,\n arrayExprSpan: forHeader.arrayExprSpan\n };\n addChildToParent(parent, forNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n stack.push({ node: forNode, level });\n continue;\n }\n\n if (trimmed.startsWith(\"@if\")) {\n const header = parseConditionalHeader(\n \"if\",\n lineContent,\n lineNumber,\n indent + 1,\n lineOffset,\n diagnostics\n );\n if (!header) {\n continue;\n }\n const chain: ConditionalNode = { type: \"Conditional\", branches: [] };\n const branch: ConditionalBranch = {\n kind: \"if\",\n test: header.test,\n body: [],\n token: header.token,\n tokenSpan: header.tokenSpan,\n testSpan: header.testSpan\n };\n chain.branches.push(branch);\n addChildToParent(parent, chain);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n conditionalChains.set(level, { node: chain, level, hasElse: false });\n branchLocations.push({\n branch,\n line: lineNumber,\n column: indent + 1,\n lineOffset,\n length: header.directiveLength\n });\n if (header.inlineBody) {\n const inlineNode = parseInlineNode(\n header.inlineBody,\n lineNumber,\n header.inlineColumn ?? indent + 1,\n lineOffset,\n diagnostics\n );\n if (inlineNode) {\n branch.body.push(inlineNode);\n }\n } else {\n stack.push({ node: createConditionalBranchContext(chain, branch), level });\n }\n continue;\n }\n\n if (isElseIfLine) {\n const chain = conditionalChains.get(level);\n if (!chain) {\n pushDiag(\n diagnostics,\n \"COLLIE205\",\n \"@elseIf must follow an @if at the same indentation level.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n continue;\n }\n if (chain.hasElse) {\n pushDiag(\n diagnostics,\n \"COLLIE207\",\n \"@elseIf cannot appear after an @else in the same chain.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n continue;\n }\n const header = parseConditionalHeader(\n \"elseIf\",\n lineContent,\n lineNumber,\n indent + 1,\n lineOffset,\n diagnostics\n );\n if (!header) {\n continue;\n }\n const branch: ConditionalBranch = {\n kind: \"elseIf\",\n test: header.test,\n body: [],\n token: header.token,\n tokenSpan: header.tokenSpan,\n testSpan: header.testSpan\n };\n chain.node.branches.push(branch);\n branchLocations.push({\n branch,\n line: lineNumber,\n column: indent + 1,\n lineOffset,\n length: header.directiveLength\n });\n if (header.inlineBody) {\n const inlineNode = parseInlineNode(\n header.inlineBody,\n lineNumber,\n header.inlineColumn ?? indent + 1,\n lineOffset,\n diagnostics\n );\n if (inlineNode) {\n branch.body.push(inlineNode);\n }\n } else {\n stack.push({ node: createConditionalBranchContext(chain.node, branch), level });\n }\n continue;\n }\n\n if (isElseLine) {\n const chain = conditionalChains.get(level);\n if (!chain) {\n pushDiag(\n diagnostics,\n \"COLLIE206\",\n \"@else must follow an @if at the same indentation level.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n continue;\n }\n if (chain.hasElse) {\n pushDiag(\n diagnostics,\n \"COLLIE203\",\n \"An @if chain can only have one @else branch.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n continue;\n }\n const header = parseElseHeader(lineContent, lineNumber, indent + 1, lineOffset, diagnostics);\n if (!header) {\n continue;\n }\n const branch: ConditionalBranch = {\n kind: \"else\",\n test: undefined,\n body: [],\n token: header.token,\n tokenSpan: header.tokenSpan\n };\n chain.node.branches.push(branch);\n chain.hasElse = true;\n branchLocations.push({\n branch,\n line: lineNumber,\n column: indent + 1,\n lineOffset,\n length: header.directiveLength\n });\n if (header.inlineBody) {\n const inlineNode = parseInlineNode(\n header.inlineBody,\n lineNumber,\n header.inlineColumn ?? indent + 1,\n lineOffset,\n diagnostics\n );\n if (inlineNode) {\n branch.body.push(inlineNode);\n }\n } else {\n stack.push({ node: createConditionalBranchContext(chain.node, branch), level });\n }\n continue;\n }\n\n const slotMatch = trimmed.match(/^@([A-Za-z_][A-Za-z0-9_]*)$/);\n if (slotMatch) {\n const slotName = slotMatch[1];\n if (!isComponentNode(parent)) {\n pushDiag(\n diagnostics,\n \"COLLIE501\",\n `Slot '${slotName}' must be a direct child of a component.`,\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n stack.push({ node: createStandaloneSlotContext(slotName), level });\n continue;\n }\n\n if (!parent.slots) {\n parent.slots = [];\n }\n const existing = parent.slots.find((slot) => slot.name === slotName);\n const slotBlock: SlotBlock =\n existing ??\n {\n type: \"Slot\",\n name: slotName,\n children: []\n };\n if (!existing) {\n parent.slots.push(slotBlock);\n } else {\n pushDiag(\n diagnostics,\n \"COLLIE503\",\n `Duplicate slot '${slotName}' inside ${parent.name}.`,\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n }\n stack.push({ node: createSlotContext(parent, slotBlock), level });\n continue;\n }\n\n if (trimmed.startsWith(\"@\")) {\n pushDiag(\n diagnostics,\n \"COLLIE502\",\n \"Invalid slot syntax. Use @slotName on its own line.\",\n lineNumber,\n indent + 1,\n lineOffset,\n trimmed.length\n );\n const fallbackName = trimmed.slice(1).split(/\\s+/)[0] || \"slot\";\n stack.push({ node: createStandaloneSlotContext(fallbackName), level });\n continue;\n }\n\n if (lineContent.startsWith(\"=\")) {\n // Check if this starts a multiline JSX block\n const payload = lineContent.slice(1).trim();\n \n // If it's a function or expression that starts with ( or <, collect multiline content\n if (payload.endsWith(\"(\") || payload.endsWith(\"<\") || (i < endIndex && level < getIndentLevel(lines[i]))) {\n // Collect all indented children\n let jsxContent = payload;\n while (i < endIndex) {\n const nextRaw = lines[i];\n const nextIndent = getIndentLevel(nextRaw);\n const nextTrimmed = nextRaw.trim();\n \n // Include lines that are:\n // 1. More indented than the = line (children)\n // 2. At the same level but are just closing parens/braces\n if (nextIndent > level && nextTrimmed.length > 0) {\n jsxContent += \"\\n\" + nextRaw;\n i++;\n } else if (nextIndent === level && /^[)\\]}]+$/.test(nextTrimmed)) {\n // Include closing parens/braces at the same level\n jsxContent += \"\\n\" + nextRaw;\n i++;\n // After the closing paren, we're done\n break;\n } else {\n break;\n }\n }\n \n const jsxNode: JSXPassthroughNode = {\n type: \"JSXPassthrough\",\n expression: jsxContent\n };\n addChildToParent(parent, jsxNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n continue;\n }\n \n const jsxNode = parseJSXPassthrough(lineContent, lineNumber, indent + 1, lineOffset, diagnostics);\n if (jsxNode) {\n addChildToParent(parent, jsxNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n }\n continue;\n }\n\n if (lineContent.startsWith(\"|\")) {\n const textNode = parseTextLine(lineContent, lineNumber, indent + 1, lineOffset, diagnostics);\n if (textNode) {\n addChildToParent(parent, textNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n }\n continue;\n }\n\n if (lineContent.startsWith(\"{{\")) {\n const exprNode = parseExpressionLine(lineContent, lineNumber, indent + 1, lineOffset, diagnostics);\n if (exprNode) {\n addChildToParent(parent, exprNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n }\n continue;\n }\n\n // Check if this line starts an element/component with potential multiline attributes\n let fullLine = trimmed;\n let multilineEnd = i;\n \n if (trimmed.includes(\"(\") && !trimmed.includes(\")\")) {\n // Multiline attributes - collect subsequent lines\n let parenDepth = (trimmed.match(/\\(/g) || []).length - (trimmed.match(/\\)/g) || []).length;\n while (multilineEnd < endIndex && parenDepth > 0) {\n const nextRaw = lines[multilineEnd];\n multilineEnd++;\n fullLine += \"\\n\" + nextRaw;\n parenDepth += (nextRaw.match(/\\(/g) || []).length - (nextRaw.match(/\\)/g) || []).length;\n }\n // Update i to skip the lines we consumed\n i = multilineEnd;\n }\n\n const elementResult = parseElementWithInfo(fullLine, lineNumber, indent + 1, lineOffset, diagnostics);\n if (!elementResult) {\n // Try parsing as text if element parsing failed\n const textNode = parseTextPayload(trimmed, lineNumber, indent + 1, lineOffset, diagnostics);\n if (textNode && textNode.parts.length > 0) {\n addChildToParent(parent, textNode);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n }\n continue;\n }\n\n const element = elementResult.node;\n let hasIndentedAttributeLines = false;\n if ((element.type === \"Element\" || element.type === \"Component\") && element.children.length === 0) {\n const indentedAttributes = collectIndentedAttributeLines(\n lines,\n lineOffsets,\n i,\n endIndex,\n level,\n diagnostics\n );\n if (indentedAttributes.attributes.length > 0) {\n element.attributes.push(...indentedAttributes.attributes);\n hasIndentedAttributeLines = true;\n }\n i = indentedAttributes.nextIndex;\n }\n\n addChildToParent(parent, element);\n if (parent === root) {\n sawTopLevelTemplateNode = true;\n }\n stack.push({ node: element, level });\n if (hasIndentedAttributeLines) {\n // Treat attribute-only lines as an intermediate indent step for children.\n stack.push({ node: element, level: level + 1 });\n }\n }\n\n if (root.classAliases) {\n validateClassAliasDefinitions(root.classAliases, diagnostics);\n }\n validateClassAliasUsages(root, diagnostics);\n\n for (const info of branchLocations) {\n if (info.branch.body.length === 0) {\n pushDiag(\n diagnostics,\n \"COLLIE208\",\n \"Conditional branches must include an inline body or indented block.\",\n info.line,\n info.column,\n info.lineOffset,\n info.length || 3\n );\n }\n }\n\n if (options.dialect) {\n diagnostics.push(...enforceDialect(root, options.dialect));\n }\n\n return { root, diagnostics };\n}\n\nfunction buildLineOffsets(lines: string[]): number[] {\n const offsets: number[] = [];\n let offset = 0;\n for (const line of lines) {\n offsets.push(offset);\n offset += line.length + 1;\n }\n return offsets;\n}\n\nfunction prefixDiagnostics(diagnostics: Diagnostic[], templateId?: string): Diagnostic[] {\n if (!templateId) {\n return diagnostics;\n }\n const prefix = `In template \"${templateId}\": `;\n return diagnostics.map((diag) => {\n if (diag.message.startsWith(prefix)) {\n return diag;\n }\n return { ...diag, message: `${prefix}${diag.message}` };\n });\n}\n\nfunction cleanupConditionalChains(state: Map<number, ConditionalChainState>, level: number): void {\n for (const key of Array.from(state.keys())) {\n if (key > level) {\n state.delete(key);\n }\n }\n}\n\nfunction addChildToParent(parent: ParentNode, child: Node): void {\n if (isForParent(parent)) {\n parent.body.push(child);\n } else {\n parent.children.push(child);\n }\n}\n\nfunction isForParent(parent: ParentNode): parent is ForNode {\n return \"type\" in parent && parent.type === \"For\";\n}\n\nfunction isComponentNode(parent: ParentNode): parent is ComponentNode {\n return \"type\" in parent && parent.type === \"Component\";\n}\n\ninterface ConditionalHeaderResult {\n test?: string;\n inlineBody?: string;\n inlineColumn?: number;\n directiveLength: number;\n token: string;\n tokenSpan?: SourceSpan;\n testSpan?: SourceSpan;\n}\n\nfunction parseConditionalHeader(\n kind: \"if\" | \"elseIf\",\n lineContent: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ConditionalHeaderResult | null {\n const trimmed = lineContent.trimEnd();\n const token = kind === \"if\" ? \"@if\" : \"@elseIf\";\n if (!trimmed.startsWith(token)) {\n pushDiag(\n diagnostics,\n \"COLLIE201\",\n kind === \"if\" ? \"Invalid @if syntax. Use @if (condition).\" : \"Invalid @elseIf syntax. Use @elseIf (condition).\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || token.length\n );\n return null;\n }\n const tokenSpan = createSpan(lineNumber, column, token.length, lineOffset);\n const remainder = trimmed.slice(token.length);\n if (!remainder.trim()) {\n pushDiag(\n diagnostics,\n \"COLLIE201\",\n kind === \"if\" ? \"@if condition cannot be empty.\" : \"@elseIf condition cannot be empty.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || token.length\n );\n return null;\n }\n\n const remainderTrimmed = remainder.trimStart();\n const usesParens = remainderTrimmed.startsWith(\"(\");\n \n // Require parentheses\n if (!usesParens) {\n pushDiag(\n diagnostics,\n \"COLLIE211\",\n kind === \"if\" ? \"@if requires parentheses: @if (condition)\" : \"@elseIf requires parentheses: @elseIf (condition)\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || token.length\n );\n return null;\n }\n \n let testRaw = \"\";\n let remainderRaw = \"\";\n\n const openIndex = trimmed.indexOf(\"(\", token.length);\n const closeIndex = trimmed.lastIndexOf(\")\");\n if (openIndex === -1 || closeIndex <= openIndex) {\n pushDiag(\n diagnostics,\n \"COLLIE212\",\n kind === \"if\" ? \"Unclosed parentheses in @if ( ... )\" : \"Unclosed parentheses in @elseIf ( ... )\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || token.length\n );\n return null;\n }\n testRaw = trimmed.slice(openIndex + 1, closeIndex);\n remainderRaw = trimmed.slice(closeIndex + 1);\n\n const test = testRaw.trim();\n if (!test) {\n pushDiag(\n diagnostics,\n \"COLLIE201\",\n kind === \"if\" ? \"@if condition cannot be empty.\" : \"@elseIf condition cannot be empty.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 3\n );\n return null;\n }\n const testLeadingWhitespace = testRaw.length - testRaw.trimStart().length;\n const testColumn = usesParens\n ? column + trimmed.indexOf(\"(\", token.length) + 1 + testLeadingWhitespace\n : column + token.length + (remainder.length - remainder.trimStart().length) + testLeadingWhitespace;\n const testSpan = createSpan(lineNumber, testColumn, test.length, lineOffset);\n const inlineBody = remainderRaw.trim();\n const remainderOffset = trimmed.length - remainderRaw.length;\n const leadingWhitespace = remainderRaw.length - inlineBody.length;\n const inlineColumn =\n inlineBody.length > 0 ? column + remainderOffset + leadingWhitespace : undefined;\n return {\n test,\n inlineBody: inlineBody.length ? inlineBody : undefined,\n inlineColumn,\n directiveLength: trimmed.length || 3,\n token,\n tokenSpan,\n testSpan\n };\n}\n\nfunction parseElseHeader(\n lineContent: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ConditionalHeaderResult | null {\n const trimmed = lineContent.trimEnd();\n const match = trimmed.match(/^@else\\b(.*)$/);\n if (!match) {\n pushDiag(\n diagnostics,\n \"COLLIE203\",\n \"Invalid @else syntax.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n const token = \"@else\";\n const tokenSpan = createSpan(lineNumber, column, token.length, lineOffset);\n const remainderRaw = match[1] ?? \"\";\n const remainderTrimmed = remainderRaw.trim();\n \n // Reject @else with condition (parentheses)\n if (remainderTrimmed.startsWith(\"(\")) {\n pushDiag(\n diagnostics,\n \"COLLIE213\",\n \"@else does not accept a condition\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n \n const inlineBody = remainderTrimmed;\n const remainderOffset = trimmed.length - remainderRaw.length;\n const leadingWhitespace = remainderRaw.length - inlineBody.length;\n const inlineColumn =\n inlineBody.length > 0 ? column + remainderOffset + leadingWhitespace : undefined;\n return {\n inlineBody: inlineBody.length ? inlineBody : undefined,\n inlineColumn,\n directiveLength: trimmed.length || 4,\n token,\n tokenSpan\n };\n}\n\ninterface ForHeaderResult {\n itemName: string;\n arrayExpr: string;\n token: string;\n tokenSpan?: SourceSpan;\n arrayExprSpan?: SourceSpan;\n}\n\nfunction parseForHeader(\n lineContent: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ForHeaderResult | null {\n const trimmed = lineContent.trimEnd();\n const token = \"@for\";\n \n if (!trimmed.startsWith(token)) {\n pushDiag(\n diagnostics,\n \"COLLIE210\",\n \"Invalid @for syntax. Use @for (item in array).\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n \n const tokenSpan = createSpan(lineNumber, column, token.length, lineOffset);\n const remainder = trimmed.slice(token.length).trimStart();\n \n // Require parentheses\n if (!remainder.startsWith(\"(\")) {\n pushDiag(\n diagnostics,\n \"COLLIE211\",\n \"@for requires parentheses: @for (item in array)\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n \n const openIndex = trimmed.indexOf(\"(\", token.length);\n const closeIndex = trimmed.lastIndexOf(\")\");\n \n if (openIndex === -1 || closeIndex <= openIndex) {\n pushDiag(\n diagnostics,\n \"COLLIE212\",\n \"Unclosed parentheses in @for ( ... )\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n \n const content = trimmed.slice(openIndex + 1, closeIndex).trim();\n const match = content.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s+in\\s+(.+)$/);\n \n if (!match) {\n pushDiag(\n diagnostics,\n \"COLLIE210\",\n \"Invalid @for syntax. Use @for (item in array).\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n \n const itemName = match[1];\n const arrayExprRaw = match[2];\n \n if (!itemName || !arrayExprRaw) {\n pushDiag(\n diagnostics,\n \"COLLIE210\",\n \"Invalid @for syntax. Use @for (item in array).\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n \n const arrayExpr = arrayExprRaw.trim();\n if (!arrayExpr) {\n pushDiag(\n diagnostics,\n \"COLLIE210\",\n \"@for array expression cannot be empty.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length || 4\n );\n return null;\n }\n \n const arrayExprLeadingWhitespace = arrayExprRaw.length - arrayExprRaw.trimStart().length;\n const contentStart = openIndex + 1;\n const arrayExprStartInContent = content.length - arrayExprRaw.length;\n const arrayExprColumn = column + contentStart + arrayExprStartInContent + arrayExprLeadingWhitespace;\n const arrayExprSpan = createSpan(lineNumber, arrayExprColumn, arrayExpr.length, lineOffset);\n \n return { itemName, arrayExpr, token, tokenSpan, arrayExprSpan };\n}\n\nfunction parseInlineNode(\n source: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): Node | null {\n const trimmed = source.trim();\n if (!trimmed) {\n return null;\n }\n\n if (trimmed.startsWith(\"|\")) {\n return parseTextLine(trimmed, lineNumber, column, lineOffset, diagnostics);\n }\n\n if (trimmed.startsWith(\"{{\")) {\n return parseExpressionLine(trimmed, lineNumber, column, lineOffset, diagnostics);\n }\n\n if (trimmed.startsWith(\"@\")) {\n pushDiag(\n diagnostics,\n \"COLLIE209\",\n \"Inline conditional bodies may only contain elements, text, or expressions.\",\n lineNumber,\n column,\n lineOffset,\n trimmed.length\n );\n return null;\n }\n\n return parseElement(trimmed, lineNumber, column, lineOffset, diagnostics);\n}\n\nfunction createConditionalBranchContext(\n owner: ConditionalNode,\n branch: ConditionalBranch\n): ConditionalBranchContext {\n return {\n kind: \"ConditionalBranch\",\n owner,\n branch,\n children: branch.body\n };\n}\n\nfunction createSlotContext(owner: ComponentNode, slot: SlotBlock): SlotContext {\n return {\n kind: \"Slot\",\n owner,\n slot,\n children: slot.children\n };\n}\n\nfunction createStandaloneSlotContext(name: string): SlotContext {\n const owner: ComponentNode = {\n type: \"Component\",\n name: \"__invalid_slot__\",\n attributes: [],\n children: []\n };\n const slot: SlotBlock = { type: \"Slot\", name, children: [] };\n return createSlotContext(owner, slot);\n}\n\nfunction parseTextLine(\n lineContent: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): TextNode | null {\n const trimmed = lineContent.trimEnd();\n let payload = trimmed;\n let payloadColumn = column;\n\n if (payload.startsWith(\"|\")) {\n payload = payload.slice(1);\n payloadColumn += 1;\n\n if (payload.startsWith(\" \")) {\n payload = payload.slice(1);\n payloadColumn += 1;\n }\n }\n\n return parseTextPayload(payload, lineNumber, payloadColumn, lineOffset, diagnostics);\n}\n\nfunction parseTextPayload(\n payload: string,\n lineNumber: number,\n payloadColumn: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): TextNode | null {\n const parts: TextNode[\"parts\"] = [];\n let cursor = 0;\n let textBuffer = \"\";\n\n const flushText = (): void => {\n if (textBuffer.length) {\n parts.push({ type: \"text\", value: textBuffer });\n textBuffer = \"\";\n }\n };\n\n while (cursor < payload.length) {\n const ch = payload[cursor];\n\n if (ch === \"{\") {\n flushText();\n if (payload[cursor + 1] === \"{\") {\n const exprStart = cursor;\n const exprEnd = payload.indexOf(\"}}\", cursor + 2);\n if (exprEnd === -1) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression must end with }}.\",\n lineNumber,\n payloadColumn + exprStart,\n lineOffset\n );\n textBuffer += payload.slice(exprStart);\n break;\n }\n const inner = payload.slice(exprStart + 2, exprEnd).trim();\n if (!inner) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression cannot be empty.\",\n lineNumber,\n payloadColumn + exprStart,\n lineOffset,\n exprEnd - exprStart\n );\n } else {\n const innerRaw = payload.slice(exprStart + 2, exprEnd);\n const leadingWhitespace = innerRaw.length - innerRaw.trimStart().length;\n const exprColumn = payloadColumn + exprStart + 2 + leadingWhitespace;\n parts.push({\n type: \"expr\",\n value: inner,\n span: createSpan(lineNumber, exprColumn, inner.length, lineOffset)\n });\n }\n cursor = exprEnd + 2;\n continue;\n }\n\n const exprStart = cursor;\n const exprEnd = payload.indexOf(\"}\", cursor + 1);\n if (exprEnd === -1) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression must end with }.\",\n lineNumber,\n payloadColumn + exprStart,\n lineOffset\n );\n textBuffer += payload.slice(exprStart);\n break;\n }\n const inner = payload.slice(exprStart + 1, exprEnd).trim();\n if (!inner) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression cannot be empty.\",\n lineNumber,\n payloadColumn + exprStart,\n lineOffset,\n exprEnd - exprStart\n );\n } else {\n const innerRaw = payload.slice(exprStart + 1, exprEnd);\n const leadingWhitespace = innerRaw.length - innerRaw.trimStart().length;\n const exprColumn = payloadColumn + exprStart + 1 + leadingWhitespace;\n parts.push({\n type: \"expr\",\n value: inner,\n span: createSpan(lineNumber, exprColumn, inner.length, lineOffset)\n });\n }\n cursor = exprEnd + 1;\n continue;\n }\n\n if (ch === \"}\") {\n flushText();\n if (payload[cursor + 1] === \"}\") {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression closing }} must follow an opening {{.\",\n lineNumber,\n payloadColumn + cursor,\n lineOffset,\n 2\n );\n cursor += 2;\n continue;\n }\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Inline expression closing } must follow an opening {.\",\n lineNumber,\n payloadColumn + cursor,\n lineOffset\n );\n cursor += 1;\n continue;\n }\n\n textBuffer += ch;\n cursor += 1;\n }\n\n flushText();\n\n return { type: \"Text\", parts };\n}\n\nfunction parseExpressionLine(\n line: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ExpressionNode | null {\n const trimmed = line.trimEnd();\n const closeIndex = trimmed.indexOf(\"}}\");\n if (closeIndex === -1) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Expression lines must end with }}.\",\n lineNumber,\n column,\n lineOffset\n );\n return null;\n }\n\n if (trimmed.slice(closeIndex + 2).trim().length) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Expression lines cannot contain text after the closing }}.\",\n lineNumber,\n column + closeIndex + 2,\n lineOffset\n );\n return null;\n }\n\n const inner = trimmed.slice(2, closeIndex).trim();\n if (!inner) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"Expression cannot be empty.\",\n lineNumber,\n column,\n lineOffset,\n closeIndex + 2\n );\n return null;\n }\n const innerRaw = trimmed.slice(2, closeIndex);\n const leadingWhitespace = innerRaw.length - innerRaw.trimStart().length;\n const exprColumn = column + 2 + leadingWhitespace;\n return {\n type: \"Expression\",\n value: inner,\n span: createSpan(lineNumber, exprColumn, inner.length, lineOffset)\n };\n}\n\nfunction parseJSXPassthrough(\n line: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): JSXPassthroughNode | null {\n if (!line.startsWith(\"=\")) {\n return null;\n }\n \n const payload = line.slice(1).trim();\n if (!payload) {\n pushDiag(\n diagnostics,\n \"COLLIE005\",\n \"JSX passthrough expression cannot be empty.\",\n lineNumber,\n column,\n lineOffset\n );\n return null;\n }\n\n const rawPayload = line.slice(1);\n const leadingWhitespace = rawPayload.length - rawPayload.trimStart().length;\n const exprColumn = column + 1 + leadingWhitespace;\n\n return {\n type: \"JSXPassthrough\",\n expression: payload,\n span: createSpan(lineNumber, exprColumn, payload.length, lineOffset)\n };\n}\n\nfunction parseClassAliasLine(\n line: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ClassAliasDecl | null {\n const match = line.match(/^([^=]+?)\\s*=\\s*(.+)$/);\n if (!match) {\n pushDiag(\n diagnostics,\n \"COLLIE304\",\n \"Classes lines must be in the form `name = class.tokens`.\",\n lineNumber,\n column,\n lineOffset,\n Math.max(line.length, 1)\n );\n return null;\n }\n\n const rawName = match[1].trim();\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(rawName)) {\n pushDiag(\n diagnostics,\n \"COLLIE305\",\n `Class alias name '${rawName}' must be a valid identifier.`,\n lineNumber,\n column,\n lineOffset,\n Math.max(rawName.length, 1)\n );\n return null;\n }\n\n const rhs = match[2];\n const rhsIndex = line.indexOf(rhs);\n const rhsColumn = rhsIndex >= 0 ? column + rhsIndex : column;\n const classes = parseAliasClasses(rhs, lineNumber, rhsColumn, lineOffset, diagnostics);\n if (!classes.length) {\n return null;\n }\n\n const nameIndex = line.indexOf(rawName);\n const nameColumn = nameIndex >= 0 ? column + nameIndex : column;\n const span = createSpan(lineNumber, nameColumn, rawName.length, lineOffset);\n\n return { name: rawName, classes, span };\n}\n\nfunction parseAliasClasses(\n rhs: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): string[] {\n const trimmed = rhs.trim();\n if (!trimmed) {\n pushDiag(\n diagnostics,\n \"COLLIE304\",\n \"Classes lines must provide one or more class tokens after '='.\",\n lineNumber,\n column,\n lineOffset,\n Math.max(rhs.length, 1)\n );\n return [];\n }\n\n const withoutDotPrefix = trimmed.startsWith(\".\") ? trimmed.slice(1) : trimmed;\n const parts = withoutDotPrefix.split(\".\");\n const classes: string[] = [];\n for (const part of parts) {\n const token = part.trim();\n if (!token) {\n pushDiag(\n diagnostics,\n \"COLLIE304\",\n \"Classes lines must provide one or more class tokens after '='.\",\n lineNumber,\n column,\n lineOffset,\n Math.max(rhs.length, 1)\n );\n return [];\n }\n classes.push(token);\n }\n\n return classes;\n}\n\nfunction validateClassAliasDefinitions(\n classAliases: ClassAliasesDecl,\n diagnostics: Diagnostic[]\n): void {\n const seen = new Map<string, ClassAliasDecl>();\n for (const alias of classAliases.aliases) {\n const previous = seen.get(alias.name);\n if (previous) {\n if (alias.span) {\n diagnostics.push({\n severity: \"error\",\n code: \"COLLIE306\",\n message: `Duplicate class alias '${alias.name}'.`,\n span: alias.span\n });\n } else {\n pushDiag(diagnostics, \"COLLIE306\", `Duplicate class alias '${alias.name}'.`, 1, 1, 0);\n }\n continue;\n }\n seen.set(alias.name, alias);\n }\n}\n\nfunction validateClassAliasUsages(root: RootNode, diagnostics: Diagnostic[]): void {\n const defined = new Set<string>(root.classAliases?.aliases.map((alias) => alias.name) ?? []);\n for (const child of root.children) {\n validateNodeClassAliases(child, defined, diagnostics);\n }\n}\n\nfunction validateNodeClassAliases(\n node: Node,\n defined: Set<string>,\n diagnostics: Diagnostic[]\n): void {\n if (node.type === \"Element\" || node.type === \"Component\") {\n const spans = node.type === \"Element\" ? (node.classSpans ?? []) : [];\n const classes = node.type === \"Element\" ? node.classes : [];\n classes.forEach((cls, index) => {\n const match = cls.match(/^\\$([A-Za-z_][A-Za-z0-9_]*)$/);\n if (!match) {\n return;\n }\n const aliasName = match[1];\n if (defined.has(aliasName)) {\n return;\n }\n const span = spans[index];\n if (span) {\n diagnostics.push({\n severity: \"error\",\n code: \"COLLIE307\",\n message: `Undefined class alias '${aliasName}'.`,\n span\n });\n } else {\n pushDiag(diagnostics, \"COLLIE307\", `Undefined class alias '${aliasName}'.`, 1, 1, 0);\n }\n });\n for (const child of node.children) {\n validateNodeClassAliases(child, defined, diagnostics);\n }\n if (node.type === \"Component\" && node.slots) {\n for (const slot of node.slots) {\n for (const child of slot.children) {\n validateNodeClassAliases(child, defined, diagnostics);\n }\n }\n }\n return;\n }\n\n if (node.type === \"Conditional\") {\n for (const branch of node.branches) {\n for (const child of branch.body) {\n validateNodeClassAliases(child, defined, diagnostics);\n }\n }\n }\n\n if (node.type === \"For\") {\n for (const child of node.body) {\n validateNodeClassAliases(child, defined, diagnostics);\n }\n }\n}\n\ninterface ParsedElementResult {\n node: ElementNode | ComponentNode;\n hasAttributeGroup: boolean;\n}\n\ninterface AttributeTokenParseResult {\n attributes: Attribute[];\n rest: string;\n restColumn: number;\n}\n\nfunction parseAttributeTokensFromStart(\n source: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): AttributeTokenParseResult | null {\n let remaining = source;\n let consumed = 0;\n let parsedAny = false;\n const attributes: Attribute[] = [];\n\n while (remaining.length > 0) {\n if (!/^([A-Za-z][A-Za-z0-9_-]*)\\s*=/.test(remaining)) {\n break;\n }\n parsedAny = true;\n const before = remaining;\n const next = parseAndAddAttribute(\n remaining,\n attributes,\n diagnostics,\n lineNumber,\n column + consumed,\n lineOffset\n );\n if (next.length === before.length) {\n break;\n }\n consumed += before.length - next.length;\n remaining = next;\n }\n\n if (!parsedAny) {\n return null;\n }\n\n return {\n attributes,\n rest: remaining,\n restColumn: column + consumed\n };\n}\n\nfunction parseAttributeLine(\n source: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): Attribute[] | null {\n const result = parseAttributeTokensFromStart(\n source,\n lineNumber,\n column,\n lineOffset,\n diagnostics\n );\n if (!result || result.rest.length > 0) {\n return null;\n }\n return result.attributes;\n}\n\nfunction parseElementWithInfo(\n line: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ParsedElementResult | null {\n let name: string;\n let cursor = 0;\n let hasAttributeGroup = false;\n\n if (line[cursor] === \".\") {\n // Implicit div shorthand (e.g. `.foo` -> `div.foo`)\n name = \"div\";\n } else {\n const nameMatch = line.match(/^([A-Za-z][A-Za-z0-9_]*)/);\n if (!nameMatch) {\n // Don't push diagnostic here - let the caller handle fallback to text\n return null;\n }\n name = nameMatch[1];\n cursor = name.length;\n }\n\n // Check what follows the name\n const nextPart = line.slice(cursor);\n const isComponent = /^[A-Z]/.test(name);\n \n // Components must have parentheses or be at EOL\n if (isComponent && nextPart.length > 0) {\n const trimmedNext = nextPart.trimStart();\n if (trimmedNext.length > 0 && !trimmedNext.startsWith(\"(\")) {\n // This looks like a component name but has no parentheses - probably text\n return null;\n }\n }\n \n // If it's something other than '.', '(', whitespace, or EOL, it's probably not an element\n if (cursor < line.length) {\n const nextChar = line[cursor];\n if (nextChar !== \".\" && nextChar !== \"(\" && !/\\s/.test(nextChar)) {\n // This is probably text, not an element\n return null;\n }\n }\n\n // Parse classes (only for elements, not components)\n const classes: string[] = [];\n const classSpans: SourceSpan[] = [];\n\n if (!isComponent) {\n while (cursor < line.length && line[cursor] === \".\") {\n cursor++; // skip the dot\n const classMatch = line.slice(cursor).match(/^([A-Za-z0-9_$-]+)/);\n if (!classMatch) {\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n \"Class names must contain only letters, numbers, underscores, hyphens, or `$` (for aliases).\",\n lineNumber,\n column + cursor,\n lineOffset\n );\n return null;\n }\n const className = classMatch[1];\n classes.push(className);\n classSpans.push(createSpan(lineNumber, column + cursor, className.length, lineOffset));\n cursor += className.length;\n }\n }\n\n // Parse attributes if parentheses are present\n const attributes: Attribute[] = [];\n if (cursor < line.length && line[cursor] === \"(\") {\n const attrResult = parseAttributes(line, cursor, lineNumber, column, lineOffset, diagnostics);\n if (!attrResult) {\n return null;\n }\n attributes.push(...attrResult.attributes);\n hasAttributeGroup = true;\n cursor = attrResult.endIndex;\n }\n\n // Parse optional guard expression\n let guard: string | undefined;\n let guardSpan: SourceSpan | undefined;\n const guardProbeStart = cursor;\n while (cursor < line.length && /\\s/.test(line[cursor])) {\n cursor++;\n }\n if (cursor < line.length && line[cursor] === \"?\") {\n const guardColumn = column + cursor;\n cursor++;\n const guardRaw = line.slice(cursor);\n const guardExpr = guardRaw.trim();\n if (!guardExpr) {\n pushDiag(\n diagnostics,\n \"COLLIE601\",\n \"Guard expressions require a condition after '?'.\",\n lineNumber,\n guardColumn,\n lineOffset\n );\n } else {\n guard = guardExpr;\n const leadingWhitespace = guardRaw.length - guardRaw.trimStart().length;\n const guardExprColumn = column + cursor + leadingWhitespace;\n guardSpan = createSpan(lineNumber, guardExprColumn, guardExpr.length, lineOffset);\n }\n cursor = line.length;\n } else {\n cursor = guardProbeStart;\n }\n\n // Parse inline text or children\n const restRaw = line.slice(cursor);\n let rest = restRaw.trimStart();\n let restColumn = column + cursor + (restRaw.length - rest.length);\n const children: Node[] = [];\n\n if (rest.length > 0) {\n const inlineAttrs = parseAttributeTokensFromStart(\n rest,\n lineNumber,\n restColumn,\n lineOffset,\n diagnostics\n );\n if (inlineAttrs) {\n attributes.push(...inlineAttrs.attributes);\n rest = inlineAttrs.rest;\n restColumn = inlineAttrs.restColumn;\n }\n\n if (rest.length > 0) {\n if (!rest.startsWith(\"|\")) {\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n \"Inline text must start with '|'.\",\n lineNumber,\n restColumn,\n lineOffset,\n Math.max(rest.length, 1)\n );\n } else {\n let payload = rest.slice(1);\n let payloadColumn = restColumn + 1;\n if (payload.startsWith(\" \")) {\n payload = payload.slice(1);\n payloadColumn += 1;\n }\n const textNode = parseTextPayload(\n payload,\n lineNumber,\n payloadColumn,\n lineOffset,\n diagnostics\n );\n if (textNode) {\n children.push(textNode);\n }\n }\n }\n }\n\n if (isComponent) {\n const component: ComponentNode = {\n type: \"Component\",\n name,\n attributes,\n children\n };\n if (guard) {\n component.guard = guard;\n component.guardSpan = guardSpan;\n }\n return { node: component, hasAttributeGroup };\n } else {\n const element: ElementNode = {\n type: \"Element\",\n name,\n classes,\n attributes,\n children\n };\n if (classSpans.length) {\n element.classSpans = classSpans;\n }\n if (guard) {\n element.guard = guard;\n element.guardSpan = guardSpan;\n }\n return { node: element, hasAttributeGroup };\n }\n}\n\nfunction parseElement(\n line: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ElementNode | ComponentNode | null {\n const result = parseElementWithInfo(line, lineNumber, column, lineOffset, diagnostics);\n return result ? result.node : null;\n}\n\nfunction collectIndentedAttributeLines(\n lines: string[],\n lineOffsets: number[],\n startIndex: number,\n endIndex: number,\n parentLevel: number,\n diagnostics: Diagnostic[]\n): { attributes: Attribute[]; nextIndex: number } {\n const attributes: Attribute[] = [];\n let index = startIndex;\n\n while (index < endIndex) {\n const rawLine = lines[index];\n if (/^\\s*$/.test(rawLine)) {\n break;\n }\n if (rawLine.includes(\"\\t\")) {\n break;\n }\n const indentMatch = rawLine.match(/^\\s*/) ?? [\"\"];\n const indent = indentMatch[0].length;\n if (indent % 2 !== 0) {\n break;\n }\n const level = indent / 2;\n if (level !== parentLevel + 1) {\n break;\n }\n\n const lineContent = rawLine.slice(indent);\n const trimmed = lineContent.trimEnd();\n const leadingWhitespace = trimmed.length - trimmed.trimStart().length;\n const attrLine = trimmed.trimStart();\n if (!attrLine) {\n break;\n }\n\n const lineNumber = index + 1;\n const lineOffset = lineOffsets[index];\n const attrColumn = indent + 1 + leadingWhitespace;\n const lineAttributes = parseAttributeLine(\n attrLine,\n lineNumber,\n attrColumn,\n lineOffset,\n diagnostics\n );\n if (!lineAttributes) {\n break;\n }\n\n attributes.push(...lineAttributes);\n index++;\n }\n\n return { attributes, nextIndex: index };\n}\n\ninterface ParseAttributesResult {\n attributes: Attribute[];\n endIndex: number;\n}\n\nfunction parseAttributes(\n line: string,\n startIndex: number,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): ParseAttributesResult | null {\n if (line[startIndex] !== \"(\") {\n return null;\n }\n\n const attributes: Attribute[] = [];\n let cursor = startIndex + 1;\n let depth = 1;\n let attrBuffer = \"\";\n\n // Find the matching closing parenthesis\n while (cursor < line.length && depth > 0) {\n const ch = line[cursor];\n if (ch === \"(\") {\n depth++;\n attrBuffer += ch;\n } else if (ch === \")\") {\n depth--;\n if (depth > 0) {\n attrBuffer += ch;\n }\n } else {\n attrBuffer += ch;\n }\n cursor++;\n }\n\n if (depth !== 0) {\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n \"Unclosed attribute parentheses.\",\n lineNumber,\n column + startIndex,\n lineOffset\n );\n return null;\n }\n\n // Now parse the attributes from the buffer\n const trimmedAttrs = attrBuffer.trim();\n if (trimmedAttrs.length === 0) {\n return { attributes: [], endIndex: cursor };\n }\n\n // Parse each attribute\n // We need to handle multiline attributes properly\n const attrLines = trimmedAttrs.split(\"\\n\");\n let currentAttr = \"\";\n \n for (const attrLine of attrLines) {\n const trimmedLine = attrLine.trim();\n if (trimmedLine.length === 0) continue;\n\n // Check if this starts a new attribute (has an = sign at the top level)\n // or continues a previous one\n const eqIndex = trimmedLine.indexOf(\"=\");\n if (eqIndex > 0 && /^[A-Za-z][A-Za-z0-9_-]*\\s*=/.test(trimmedLine)) {\n // This is a new attribute\n if (currentAttr) {\n // Parse the previous attribute\n let remaining = parseAndAddAttribute(currentAttr, attributes, diagnostics, lineNumber, column, lineOffset);\n // Process any remaining attributes from the previous line\n while (remaining) {\n remaining = parseAndAddAttribute(remaining, attributes, diagnostics, lineNumber, column, lineOffset);\n }\n currentAttr = \"\";\n }\n currentAttr = trimmedLine;\n } else {\n // Continuation of previous attribute\n if (currentAttr) {\n currentAttr += \" \" + trimmedLine;\n } else {\n // Boolean attribute\n currentAttr = trimmedLine;\n }\n }\n }\n\n // Parse the last attribute and any remaining inline attributes\n if (currentAttr) {\n let remaining = parseAndAddAttribute(currentAttr, attributes, diagnostics, lineNumber, column, lineOffset);\n while (remaining) {\n remaining = parseAndAddAttribute(remaining, attributes, diagnostics, lineNumber, column, lineOffset);\n }\n }\n\n return { attributes, endIndex: cursor };\n}\n\n// Scan brace-wrapped attribute values as a single unit, balancing nested delimiters and quoted strings.\nfunction scanBraceAttributeValue(\n source: string,\n diagnostics: Diagnostic[],\n lineNumber: number,\n column: number,\n lineOffset: number\n): { value: string; rest: string } | null {\n if (!source.startsWith(\"{\")) {\n return null;\n }\n\n let braceDepth = 0;\n let parenDepth = 0;\n let bracketDepth = 0;\n let quote: \"'\" | '\"' | \"`\" | null = null;\n let escaped = false;\n\n for (let i = 0; i < source.length; i++) {\n const char = source[i];\n\n if (quote) {\n if (escaped) {\n escaped = false;\n continue;\n }\n if (char === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (char === quote) {\n quote = null;\n }\n continue;\n }\n\n if (char === '\"' || char === \"'\" || char === \"`\") {\n quote = char;\n continue;\n }\n\n if (char === \"{\") {\n braceDepth++;\n continue;\n }\n if (char === \"}\") {\n braceDepth--;\n if (braceDepth === 0 && parenDepth === 0 && bracketDepth === 0) {\n return { value: source.slice(0, i + 1), rest: source.slice(i + 1).trim() };\n }\n continue;\n }\n if (char === \"(\") {\n parenDepth++;\n continue;\n }\n if (char === \")\") {\n if (parenDepth > 0) {\n parenDepth--;\n }\n continue;\n }\n if (char === \"[\") {\n bracketDepth++;\n continue;\n }\n if (char === \"]\") {\n if (bracketDepth > 0) {\n bracketDepth--;\n }\n }\n }\n\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n \"Unclosed brace in attribute value.\",\n lineNumber,\n column,\n lineOffset\n );\n return null;\n}\n\nfunction parseAndAddAttribute(\n attrStr: string,\n attributes: Attribute[],\n diagnostics: Diagnostic[],\n lineNumber: number,\n column: number,\n lineOffset: number\n): string {\n const trimmed = attrStr.trim();\n \n // Try to match attribute name and equals sign\n const nameMatch = trimmed.match(/^([A-Za-z][A-Za-z0-9_-]*)\\s*=\\s*/);\n if (nameMatch) {\n const attrName = nameMatch[1];\n const afterEquals = trimmed.slice(nameMatch[0].length);\n \n if (afterEquals.length === 0) {\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n `Attribute ${attrName} missing value`,\n lineNumber,\n column,\n lineOffset\n );\n return \"\";\n }\n\n const braceValue = scanBraceAttributeValue(afterEquals, diagnostics, lineNumber, column, lineOffset);\n if (braceValue) {\n attributes.push({ name: attrName, value: braceValue.value });\n return braceValue.rest;\n }\n\n // Extract the quoted value\n const quoteChar = afterEquals[0];\n if (quoteChar === '\"' || quoteChar === \"'\") {\n let i = 1;\n let value = \"\";\n let escaped = false;\n \n while (i < afterEquals.length) {\n const char = afterEquals[i];\n \n if (escaped) {\n value += char;\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === quoteChar) {\n // Found the closing quote\n attributes.push({ name: attrName, value: quoteChar + value + quoteChar });\n // Return remaining text after this attribute\n return afterEquals.slice(i + 1).trim();\n } else {\n value += char;\n }\n i++;\n }\n \n // Unclosed quote\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n `Unclosed quote in attribute ${attrName}`,\n lineNumber,\n column,\n lineOffset\n );\n return \"\";\n } else {\n // Unquoted value - take everything until space or end\n const unquotedMatch = afterEquals.match(/^(\\S+)/);\n if (unquotedMatch) {\n attributes.push({ name: attrName, value: unquotedMatch[1] });\n return afterEquals.slice(unquotedMatch[1].length).trim();\n }\n return \"\";\n }\n } else {\n // Boolean attribute\n const boolMatch = trimmed.match(/^([A-Za-z][A-Za-z0-9_-]*)(\\s+.*)?$/);\n if (boolMatch) {\n attributes.push({ name: boolMatch[1], value: null });\n return boolMatch[2] ? boolMatch[2].trim() : \"\";\n } else {\n pushDiag(\n diagnostics,\n \"COLLIE004\",\n `Invalid attribute syntax: ${trimmed.slice(0, 30)}`,\n lineNumber,\n column,\n lineOffset\n );\n return \"\";\n }\n }\n}\n\nfunction parseInputDecl(\n line: string,\n lineNumber: number,\n column: number,\n lineOffset: number,\n diagnostics: Diagnostic[]\n): InputDecl | null {\n const trimmed = line.trim();\n \n // Check for type hints (not allowed)\n if (trimmed.includes(\":\") || trimmed.includes(\"<\") || trimmed.includes(\"?\")) {\n pushDiag(\n diagnostics,\n \"COLLIE104\",\n 'Types are not supported in #inputs yet. Use \"name\".',\n lineNumber,\n column,\n lineOffset,\n trimmed.length\n );\n return null;\n }\n \n // Check for value form: name\n const valueMatch = trimmed.match(/^([A-Za-z_$][A-Za-z0-9_$]*)$/);\n if (valueMatch) {\n const name = valueMatch[1];\n const nameStart = line.indexOf(name);\n const nameColumn = column + nameStart;\n return {\n name,\n kind: \"value\",\n span: createSpan(lineNumber, nameColumn, name.length, lineOffset)\n };\n }\n \n // Invalid syntax\n pushDiag(\n diagnostics,\n \"COLLIE105\",\n 'Invalid #inputs declaration. Use \"name\".',\n lineNumber,\n column,\n lineOffset,\n trimmed.length\n );\n return null;\n}\n\nfunction pushDiag(\n diagnostics: Diagnostic[],\n code: DiagnosticCode,\n message: string,\n line: number,\n column: number,\n lineOffset: number,\n length = 1\n): void {\n diagnostics.push({\n severity: \"error\",\n code,\n message,\n span: createSpan(line, column, Math.max(length, 1), lineOffset)\n });\n}\n","import type { Diagnostic, DiagnosticFix, SourceSpan } from \"./diagnostics.ts\";\n\ninterface FixWithOffsets {\n fix: DiagnosticFix;\n start: number;\n end: number;\n}\n\ninterface FixApplyResult {\n text: string;\n applied: DiagnosticFix[];\n skipped: DiagnosticFix[];\n}\n\nexport function applyFixes(sourceText: string, fixes: DiagnosticFix[]): FixApplyResult {\n const normalized: FixWithOffsets[] = [];\n const skipped: DiagnosticFix[] = [];\n\n for (const fix of fixes) {\n const offsets = getSpanOffsets(fix.range);\n if (!offsets) {\n skipped.push(fix);\n continue;\n }\n if (offsets.start < 0 || offsets.end < offsets.start || offsets.end > sourceText.length) {\n skipped.push(fix);\n continue;\n }\n normalized.push({ fix, start: offsets.start, end: offsets.end });\n }\n\n normalized.sort((a, b) => (a.start === b.start ? a.end - b.end : a.start - b.start));\n\n const accepted: FixWithOffsets[] = [];\n let currentEnd = -1;\n for (const item of normalized) {\n if (item.start < currentEnd) {\n skipped.push(item.fix);\n continue;\n }\n accepted.push(item);\n currentEnd = item.end;\n }\n\n let text = sourceText;\n for (let i = accepted.length - 1; i >= 0; i--) {\n const { start, end, fix } = accepted[i];\n text = `${text.slice(0, start)}${fix.replacementText}${text.slice(end)}`;\n }\n\n return { text, applied: accepted.map((item) => item.fix), skipped };\n}\n\nexport function fixAllFromDiagnostics(\n sourceText: string,\n diagnostics: Diagnostic[]\n): FixApplyResult {\n const fixes = diagnostics.flatMap((diag) => (diag.fix ? [diag.fix] : []));\n return applyFixes(sourceText, fixes);\n}\n\nfunction getSpanOffsets(span: SourceSpan | undefined): { start: number; end: number } | null {\n if (!span) {\n return null;\n }\n const start = span.start?.offset;\n const end = span.end?.offset;\n if (!Number.isFinite(start) || !Number.isFinite(end)) {\n return null;\n }\n return { start, end };\n}\n","import type {\n Attribute,\n ClassAliasesDecl,\n Node,\n InputsDecl,\n RootNode,\n TextNode,\n TextPart\n} from \"./ast.ts\";\nimport type { Diagnostic } from \"./diagnostics.ts\";\nimport { parse } from \"./parser.ts\";\nimport type { TemplateUnit } from \"./parser.ts\";\n\nexport interface FormatOptions {\n indent?: number;\n}\n\nexport interface FormatResult {\n formatted: string;\n diagnostics: Diagnostic[];\n success: boolean;\n}\n\nexport function formatCollie(source: string, options: FormatOptions = {}): FormatResult {\n const indentSize = validateIndentOption(options.indent);\n const normalized = source.replace(/\\r\\n?/g, \"\\n\");\n const parseResult = parse(normalized);\n const diagnostics = normalizeDiagnostics(parseResult.diagnostics);\n const hasErrors = diagnostics.some((diag) => diag.severity === \"error\");\n\n if (hasErrors) {\n return {\n formatted: source,\n diagnostics,\n success: false\n };\n }\n\n const serialized = serializeTemplates(parseResult.templates, indentSize);\n const formatted = ensureTrailingNewline(serialized);\n\n return {\n formatted,\n diagnostics,\n success: true\n };\n}\n\nfunction normalizeDiagnostics(diagnostics: Diagnostic[]): Diagnostic[] {\n return diagnostics.map((diag) => {\n if (diag.range || !diag.span) {\n return diag;\n }\n return {\n ...diag,\n range: diag.span\n };\n });\n}\n\nfunction validateIndentOption(indent?: number): number {\n if (indent === undefined) {\n return 2;\n }\n if (!Number.isFinite(indent) || indent < 1) {\n throw new Error(\"Indent width must be a positive integer.\");\n }\n return Math.floor(indent);\n}\n\nfunction serializeTemplates(templates: TemplateUnit[], indentSize: number): string {\n const lines: string[] = [];\n\n for (const template of templates) {\n if (lines.length && lines[lines.length - 1] !== \"\") {\n lines.push(\"\");\n }\n const idValue = template.rawId || template.id;\n lines.push(cleanLine(`#id ${idValue}`));\n const body = serializeRoot(template.ast, indentSize);\n if (body.trim().length > 0) {\n lines.push(...body.split(\"\\n\"));\n }\n }\n\n while (lines.length && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction serializeRoot(root: RootNode, indentSize: number): string {\n const sections: string[][] = [];\n if (root.classAliases && root.classAliases.aliases.length > 0) {\n sections.push(formatClassAliases(root.classAliases, indentSize));\n }\n if (root.inputs && root.inputs.fields.length > 0) {\n sections.push(formatInputs(root.inputs, indentSize));\n }\n if (root.children.length > 0) {\n sections.push(formatNodes(root.children, 0, indentSize));\n }\n\n const lines: string[] = [];\n for (const section of sections) {\n if (!section.length) continue;\n if (lines.length && lines[lines.length - 1] !== \"\") {\n lines.push(\"\");\n }\n for (const line of section) {\n lines.push(line);\n }\n }\n\n while (lines.length && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatClassAliases(decl: ClassAliasesDecl, indentSize: number): string[] {\n const indent = indentString(1, indentSize);\n const lines: string[] = [\"classes\"];\n for (const alias of decl.aliases) {\n const rhs = alias.classes.join(\".\");\n lines.push(cleanLine(`${indent}${alias.name} = ${rhs}`));\n }\n return lines;\n}\n\nfunction formatInputs(inputs: InputsDecl, indentSize: number): string[] {\n const indent = indentString(1, indentSize);\n const lines: string[] = [\"#inputs\"];\n for (const field of inputs.fields) {\n const optionalFlag = field.optional ? \"?\" : \"\";\n lines.push(cleanLine(`${indent}${field.name}${optionalFlag}: ${field.typeText.trim()}`));\n }\n return lines;\n}\n\nfunction formatNodes(nodes: Node[], level: number, indentSize: number): string[] {\n const lines: string[] = [];\n for (const node of nodes) {\n lines.push(...formatNode(node, level, indentSize));\n }\n return lines;\n}\n\nfunction formatNode(node: Node, level: number, indentSize: number): string[] {\n switch (node.type) {\n case \"Element\":\n return formatElement(node, level, indentSize);\n case \"Component\":\n return formatComponent(node, level, indentSize);\n case \"Text\":\n return [formatTextNode(node, level, indentSize)];\n case \"Expression\":\n return [cleanLine(`${indentString(level, indentSize)}{{ ${node.value} }}`)];\n case \"JSXPassthrough\":\n return formatJsxPassthrough(node.expression, level, indentSize);\n case \"For\":\n return formatFor(node, level, indentSize);\n case \"Conditional\":\n return formatConditional(node, level, indentSize);\n default:\n return [];\n }\n}\n\nfunction formatElement(node: Node & { type: \"Element\" }, level: number, indentSize: number): string[] {\n const indent = indentString(level, indentSize);\n let line = `${indent}${node.name}${formatClassList(node.classes)}`;\n const attrs = formatAttributes(node.attributes);\n if (attrs) {\n line += `(${attrs})`;\n }\n const children = formatNodes(node.children, level + 1, indentSize);\n if (children.length === 0) {\n return [cleanLine(line)];\n }\n return [cleanLine(line), ...children];\n}\n\nfunction formatComponent(node: Node & { type: \"Component\" }, level: number, indentSize: number): string[] {\n const indent = indentString(level, indentSize);\n let line = `${indent}${node.name}`;\n const attrs = formatAttributes(node.attributes);\n if (attrs) {\n line += `(${attrs})`;\n }\n const children = formatNodes(node.children, level + 1, indentSize);\n if (children.length === 0) {\n return [cleanLine(line)];\n }\n return [cleanLine(line), ...children];\n}\n\nfunction formatTextNode(node: TextNode, level: number, indentSize: number): string {\n const indent = indentString(level, indentSize);\n const text = renderTextParts(node.parts);\n return cleanLine(`${indent}| ${text}`);\n}\n\nfunction renderTextParts(parts: TextPart[]): string {\n return parts\n .map((part) => {\n if (part.type === \"text\") {\n return part.value;\n }\n return `{${part.value}}`;\n })\n .join(\"\");\n}\n\nfunction formatJsxPassthrough(expression: string, level: number, indentSize: number): string[] {\n const indent = indentString(level, indentSize);\n const childIndent = indentString(level + 1, indentSize);\n const normalized = expression.replace(/\\r\\n?/g, \"\\n\").trimEnd();\n if (!normalized.trim()) {\n return [cleanLine(`${indent}= ${normalized.trim()}`)];\n }\n const lines = normalized.split(\"\\n\");\n const [first, ...rest] = lines;\n const result: string[] = [cleanLine(`${indent}= ${first.trim()}`)];\n if (rest.length === 0) {\n return result;\n }\n\n const dedent = computeDedent(rest);\n for (const raw of rest) {\n if (!raw.trim()) {\n result.push(\"\");\n continue;\n }\n const withoutIndent = raw.slice(Math.min(dedent, raw.length)).trimEnd();\n result.push(cleanLine(`${childIndent}${withoutIndent}`));\n }\n return result;\n}\n\nfunction computeDedent(lines: string[]): number {\n let min = Number.POSITIVE_INFINITY;\n for (const line of lines) {\n if (!line.trim()) continue;\n const indentMatch = line.match(/^\\s*/);\n const indentLength = indentMatch ? indentMatch[0].length : 0;\n min = Math.min(min, indentLength);\n }\n return Number.isFinite(min) ? min : 0;\n}\n\nfunction formatFor(node: Node & { type: \"For\" }, level: number, indentSize: number): string[] {\n const indent = indentString(level, indentSize);\n const header = cleanLine(`${indent}@for ${node.itemName} in ${node.arrayExpr}`);\n const body = formatNodes(node.body, level + 1, indentSize);\n return body.length ? [header, ...body] : [header];\n}\n\nfunction formatConditional(node: Node & { type: \"Conditional\" }, level: number, indentSize: number): string[] {\n const indent = indentString(level, indentSize);\n const lines: string[] = [];\n node.branches.forEach((branch, index) => {\n let directive: string;\n if (index === 0) {\n directive = `@if (${branch.test ?? \"\"})`;\n } else if (branch.test) {\n directive = `@elseIf (${branch.test})`;\n } else {\n directive = \"@else\";\n }\n lines.push(cleanLine(`${indent}${directive}`));\n const body = formatNodes(branch.body, level + 1, indentSize);\n lines.push(...body);\n });\n return lines;\n}\n\nfunction formatAttributes(attributes: Attribute[]): string {\n if (!attributes.length) {\n return \"\";\n }\n const sorted = [...attributes].sort((a, b) => {\n if (a.name === b.name) return 0;\n if (a.name === \"class\") return -1;\n if (b.name === \"class\") return 1;\n return a.name.localeCompare(b.name);\n });\n return sorted\n .map((attr) => {\n if (attr.value === null) {\n return attr.name;\n }\n return `${attr.name}=${normalizeAttributeValue(attr.value)}`;\n })\n .join(\" \");\n}\n\nfunction normalizeAttributeValue(value: string): string {\n const trimmed = value.trim();\n if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"<\")) {\n return trimmed;\n }\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n return trimmed;\n }\n if (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\")) {\n const inner = trimmed.slice(1, -1).replace(/\"/g, '\\\\\"');\n return `\"${inner}\"`;\n }\n return trimmed;\n}\n\nfunction formatClassList(classes: string[]): string {\n if (!classes.length) return \"\";\n return classes.map((cls) => `.${cls}`).join(\"\");\n}\n\nfunction indentString(level: number, indentSize: number): string {\n return \" \".repeat(level * indentSize);\n}\n\nfunction ensureTrailingNewline(output: string): string {\n const trimmed = output.replace(/\\s+$/g, \"\");\n return trimmed.length ? `${trimmed}\\n` : \"\\n\";\n}\n\nfunction cleanLine(line: string): string {\n return line.replace(/[ \\t]+$/g, \"\");\n}\n","import ts from \"typescript\";\n\nexport interface ConvertTsxOptions {\n filename?: string;\n}\n\nexport interface ConvertTsxResult {\n collie: string;\n warnings: string[];\n}\n\ninterface InputField {\n name: string;\n optional: boolean;\n typeText: string;\n}\n\ninterface ComponentInfo {\n jsxRoot: ts.JsxChild;\n inputsTypeName?: string;\n inlineInputs?: InputField[];\n defaults: Map<string, string>;\n}\n\ninterface ConverterContext {\n sourceFile: ts.SourceFile;\n warnings: string[];\n}\n\nexport function convertTsxToCollie(source: string, options: ConvertTsxOptions = {}): ConvertTsxResult {\n const filename = options.filename ?? \"input.tsx\";\n const sourceFile = ts.createSourceFile(\n filename,\n source,\n ts.ScriptTarget.Latest,\n true,\n inferScriptKind(filename)\n );\n const warnings: string[] = [];\n const ctx: ConverterContext = { sourceFile, warnings };\n const inputDeclarations = collectInputDeclarations(sourceFile);\n const component = findComponentInfo(sourceFile, inputDeclarations, ctx);\n if (!component) {\n throw new Error(\"Could not find a component that returns JSX in this file.\");\n }\n\n const inputsLines = buildInputsBlock(component, inputDeclarations, ctx);\n const templateLines = convertJsxNode(component.jsxRoot, ctx, 0);\n if (!templateLines.length) {\n throw new Error(\"Unable to convert JSX tree to Collie template.\");\n }\n\n const sections: string[] = [];\n if (inputsLines.length) {\n sections.push(inputsLines.join(\"\\n\"));\n }\n sections.push(templateLines.join(\"\\n\"));\n\n const collie = `${sections.join(\"\\n\\n\").trimEnd()}\\n`;\n return { collie, warnings };\n}\n\nfunction inferScriptKind(filename: string): ts.ScriptKind {\n const dotIndex = filename.lastIndexOf(\".\");\n const ext = dotIndex === -1 ? \"\" : filename.slice(dotIndex).toLowerCase();\n if (ext === \".tsx\") return ts.ScriptKind.TSX;\n if (ext === \".jsx\") return ts.ScriptKind.JSX;\n if (ext === \".ts\") return ts.ScriptKind.TS;\n return ts.ScriptKind.JS;\n}\n\nfunction collectInputDeclarations(sourceFile: ts.SourceFile): Map<string, InputField[]> {\n const map = new Map<string, InputField[]>();\n for (const statement of sourceFile.statements) {\n if (ts.isInterfaceDeclaration(statement) && statement.name) {\n map.set(statement.name.text, extractInputsFromMembers(statement.members, sourceFile));\n } else if (ts.isTypeAliasDeclaration(statement) && ts.isTypeLiteralNode(statement.type)) {\n map.set(statement.name.text, extractInputsFromMembers(statement.type.members, sourceFile));\n }\n }\n return map;\n}\n\nfunction extractInputsFromMembers(members: readonly ts.TypeElement[], sourceFile: ts.SourceFile): InputField[] {\n const fields: InputField[] = [];\n for (const member of members) {\n if (!ts.isPropertySignature(member) || member.name === undefined) {\n continue;\n }\n const name = getPropertyName(member.name, sourceFile);\n if (!name) {\n continue;\n }\n const typeText = member.type ? member.type.getText(sourceFile).trim() : \"any\";\n fields.push({\n name,\n optional: Boolean(member.questionToken),\n typeText\n });\n }\n return fields;\n}\n\nfunction findComponentInfo(\n sourceFile: ts.SourceFile,\n declarations: Map<string, InputField[]>,\n ctx: ConverterContext\n): ComponentInfo | null {\n for (const statement of sourceFile.statements) {\n if (ts.isFunctionDeclaration(statement) && statement.body) {\n const jsx = findJsxReturn(statement.body);\n if (jsx) {\n const defaults = extractDefaultsFromParameters(statement.parameters, ctx);\n const inputsInfo = resolveInputsFromParameters(statement.parameters, declarations, ctx);\n return {\n jsxRoot: jsx,\n inputsTypeName: inputsInfo.typeName,\n inlineInputs: inputsInfo.inline,\n defaults\n };\n }\n } else if (ts.isVariableStatement(statement)) {\n for (const decl of statement.declarationList.declarations) {\n const init = decl.initializer;\n if (!init) continue;\n if (ts.isArrowFunction(init) || ts.isFunctionExpression(init)) {\n const jsx = init.body ? findJsxInFunctionBody(init.body) : undefined;\n if (!jsx) {\n continue;\n }\n const defaults = extractDefaultsFromParameters(init.parameters, ctx);\n const inputsInfo = resolveInputsFromParameters(init.parameters, declarations, ctx);\n if (!inputsInfo.typeName && !inputsInfo.inline && decl.type) {\n const inferred = resolveInputsFromTypeAnnotation(decl.type, sourceFile, declarations);\n if (inferred.typeName && !inputsInfo.typeName) {\n inputsInfo.typeName = inferred.typeName;\n }\n if (inferred.inline && !inputsInfo.inline) {\n inputsInfo.inline = inferred.inline;\n }\n }\n return {\n jsxRoot: jsx,\n inputsTypeName: inputsInfo.typeName,\n inlineInputs: inputsInfo.inline,\n defaults\n };\n }\n }\n }\n }\n return null;\n}\n\nfunction resolveInputsFromParameters(\n parameters: readonly ts.ParameterDeclaration[],\n declarations: Map<string, InputField[]>,\n ctx: ConverterContext\n): { typeName?: string; inline?: InputField[] } {\n if (!parameters.length) {\n return {};\n }\n const param = parameters[0];\n if (param.type) {\n const inferred = resolveInputsFromTypeAnnotation(param.type, ctx.sourceFile, declarations);\n if (inferred.inline) {\n return inferred;\n }\n if (inferred.typeName) {\n return inferred;\n }\n }\n return {};\n}\n\nfunction resolveInputsFromTypeAnnotation(\n typeNode: ts.TypeNode,\n sourceFile: ts.SourceFile,\n declarations: Map<string, InputField[]>\n): { typeName?: string; inline?: InputField[] } {\n if (ts.isTypeReferenceNode(typeNode)) {\n const referenced = getTypeReferenceName(typeNode.typeName);\n if (referenced && declarations.has(referenced)) {\n return { typeName: referenced };\n }\n const typeArg = typeNode.typeArguments?.[0];\n if (typeArg) {\n if (ts.isTypeReferenceNode(typeArg)) {\n const nested = getTypeReferenceName(typeArg.typeName);\n if (nested && declarations.has(nested)) {\n return { typeName: nested };\n }\n } else if (ts.isTypeLiteralNode(typeArg)) {\n return { inline: extractInputsFromMembers(typeArg.members, sourceFile) };\n }\n }\n }\n if (ts.isTypeLiteralNode(typeNode)) {\n return { inline: extractInputsFromMembers(typeNode.members, sourceFile) };\n }\n return {};\n}\n\nfunction getTypeReferenceName(typeName: ts.EntityName | ts.Expression): string | undefined {\n if (ts.isIdentifier(typeName)) {\n return typeName.text;\n }\n if (ts.isQualifiedName(typeName)) {\n return typeName.right.text;\n }\n if (ts.isPropertyAccessExpression(typeName)) {\n return getTypeReferenceName(typeName.name);\n }\n return undefined;\n}\n\nfunction findJsxReturn(body: ts.Block): ts.JsxChild | undefined {\n for (const statement of body.statements) {\n if (ts.isReturnStatement(statement) && statement.expression) {\n const jsx = unwrapJsx(statement.expression);\n if (jsx) {\n return jsx;\n }\n }\n }\n return undefined;\n}\n\nfunction findJsxInFunctionBody(body: ts.ConciseBody): ts.JsxChild | undefined {\n if (ts.isBlock(body)) {\n return findJsxReturn(body);\n }\n return unwrapJsx(body);\n}\n\nfunction unwrapJsx(expression: ts.Expression): ts.JsxChild | undefined {\n let current: ts.Expression = expression;\n while (ts.isParenthesizedExpression(current)) {\n current = current.expression;\n }\n if (ts.isJsxElement(current) || ts.isJsxFragment(current) || ts.isJsxSelfClosingElement(current)) {\n return current;\n }\n return undefined;\n}\n\nfunction extractDefaultsFromParameters(\n parameters: readonly ts.ParameterDeclaration[],\n ctx: ConverterContext\n): Map<string, string> {\n const defaults = new Map<string, string>();\n if (!parameters.length) {\n return defaults;\n }\n const param = parameters[0];\n if (!ts.isObjectBindingPattern(param.name)) {\n return defaults;\n }\n for (const element of param.name.elements) {\n if (!element.initializer) {\n continue;\n }\n const inputName = getBindingElementInputName(element, ctx.sourceFile);\n if (!inputName) {\n ctx.warnings.push(\"Skipping complex destructured default value.\");\n continue;\n }\n defaults.set(inputName, element.initializer.getText(ctx.sourceFile).trim());\n }\n return defaults;\n}\n\nfunction getBindingElementInputName(element: ts.BindingElement, sourceFile: ts.SourceFile): string | undefined {\n const prop = element.propertyName;\n if (prop) {\n if (ts.isIdentifier(prop) || ts.isStringLiteral(prop) || ts.isNumericLiteral(prop)) {\n return prop.text;\n }\n return prop.getText(sourceFile);\n }\n if (ts.isIdentifier(element.name)) {\n return element.name.text;\n }\n return undefined;\n}\n\nfunction getPropertyName(name: ts.PropertyName, sourceFile: ts.SourceFile): string | undefined {\n if (ts.isIdentifier(name)) {\n return name.text;\n }\n if (ts.isStringLiteral(name) || ts.isNumericLiteral(name)) {\n return name.text;\n }\n return name.getText(sourceFile);\n}\n\nfunction buildInputsBlock(\n info: ComponentInfo,\n inputDeclarations: Map<string, InputField[]>,\n ctx: ConverterContext\n): string[] {\n const fields =\n info.inlineInputs ??\n (info.inputsTypeName ? inputDeclarations.get(info.inputsTypeName) ?? [] : undefined) ??\n [];\n if (!fields.length && !info.defaults.size) {\n return [];\n }\n\n const lines = [\"#inputs\"];\n if (fields.length) {\n for (const field of fields) {\n const def = info.defaults.get(field.name);\n // Emit as bare identifier, not function call\n let line = ` ${field.name}`;\n if (def) {\n ctx.warnings.push(`Default value for \"${field.name}\" cannot be preserved in Collie #inputs.`);\n }\n lines.push(line);\n }\n } else {\n for (const [name, defValue] of info.defaults.entries()) {\n ctx.warnings.push(`Default value for \"${name}\" cannot be preserved in Collie #inputs.`);\n lines.push(` ${name}`);\n }\n }\n return lines;\n}\n\nfunction convertJsxNode(node: ts.JsxChild, ctx: ConverterContext, indent: number): string[] {\n if (ts.isJsxElement(node)) {\n return convertJsxElement(node, ctx, indent);\n }\n if (ts.isJsxSelfClosingElement(node)) {\n return convertJsxSelfClosing(node, ctx, indent);\n }\n if (ts.isJsxFragment(node)) {\n return convertJsxFragment(node, ctx, indent);\n }\n if (ts.isJsxText(node)) {\n return convertJsxText(node, ctx, indent);\n }\n if (ts.isJsxExpression(node)) {\n return convertJsxExpression(node, ctx, indent);\n }\n return [];\n}\n\nfunction convertJsxFragment(fragment: ts.JsxFragment, ctx: ConverterContext, indent: number): string[] {\n const lines: string[] = [];\n for (const child of fragment.children) {\n lines.push(...convertJsxNode(child, ctx, indent));\n }\n return lines;\n}\n\nfunction convertJsxElement(element: ts.JsxElement, ctx: ConverterContext, indent: number): string[] {\n const line = buildElementLine(element.openingElement, ctx, indent);\n const children: string[] = [];\n for (const child of element.children) {\n children.push(...convertJsxNode(child, ctx, indent + 1));\n }\n if (!children.length) {\n return [line];\n }\n return [line, ...children];\n}\n\nfunction convertJsxSelfClosing(element: ts.JsxSelfClosingElement, ctx: ConverterContext, indent: number): string[] {\n return [buildElementLine(element, ctx, indent)];\n}\n\nfunction buildElementLine(element: ts.JsxOpeningLikeElement, ctx: ConverterContext, indent: number): string {\n const indentStr = \" \".repeat(indent);\n const tagName = getTagName(element.tagName, ctx);\n const { classSegments, attributes } = convertAttributes(element.attributes, ctx);\n const classes = classSegments.length ? classSegments.map((cls) => `.${cls}`).join(\"\") : \"\";\n const attrString = attributes.length ? `(${attributes.join(\" \")})` : \"\";\n return `${indentStr}${tagName}${classes}${attrString}`;\n}\n\nfunction getTagName(tag: ts.JsxTagNameExpression, ctx: ConverterContext): string {\n const fallback = tag.getText(ctx.sourceFile);\n if (ts.isIdentifier(tag)) {\n return tag.text;\n }\n if (ts.isPropertyAccessExpression(tag)) {\n const left = getTagName(tag.expression as ts.JsxTagNameExpression, ctx);\n return `${left}.${tag.name.text}`;\n }\n if (tag.kind === ts.SyntaxKind.ThisKeyword) {\n return \"this\";\n }\n if (ts.isJsxNamespacedName(tag)) {\n return `${tag.namespace.text}:${tag.name.text}`;\n }\n return fallback;\n}\n\nfunction convertAttributes(attributes: ts.JsxAttributes, ctx: ConverterContext): {\n classSegments: string[];\n attributes: string[];\n} {\n const classSegments: string[] = [];\n const attrs: string[] = [];\n\n for (const attr of attributes.properties) {\n if (ts.isJsxAttribute(attr)) {\n const attrName = getAttributeName(attr.name, ctx);\n if (!attrName) {\n ctx.warnings.push(\"Skipping unsupported attribute name.\");\n continue;\n }\n if (attrName === \"className\" || attrName === \"class\") {\n const handled = handleClassAttribute(attr, ctx, classSegments, attrs);\n if (!handled) {\n attrs.push(formatAttribute(attrName === \"className\" ? \"className\" : attrName, attr.initializer, ctx));\n }\n continue;\n }\n attrs.push(formatAttribute(attrName, attr.initializer, ctx));\n } else if (ts.isJsxSpreadAttribute(attr)) {\n ctx.warnings.push(\"Spread attributes are not supported and were skipped.\");\n }\n }\n\n return { classSegments, attributes: attrs.filter(Boolean) };\n}\n\nfunction handleClassAttribute(\n attr: ts.JsxAttribute,\n ctx: ConverterContext,\n classSegments: string[],\n attrs: string[]\n): boolean {\n if (!attr.initializer) {\n return false;\n }\n if (ts.isStringLiteral(attr.initializer)) {\n classSegments.push(...splitClassNames(attr.initializer.text));\n return true;\n }\n if (ts.isJsxExpression(attr.initializer) && attr.initializer.expression) {\n const expressionText = attr.initializer.expression.getText(ctx.sourceFile).trim();\n attrs.push(`className={${expressionText}}`);\n return true;\n }\n ctx.warnings.push(\"Unsupported class attribute value; leaving as-is.\");\n return false;\n}\n\nfunction splitClassNames(value: string): string[] {\n return value\n .split(/\\s+/)\n .map((cls) => cls.trim())\n .filter(Boolean);\n}\n\nfunction formatAttribute(\n name: string,\n initializer: ts.JsxAttributeValue | undefined,\n ctx: ConverterContext\n): string {\n if (!initializer) {\n return name;\n }\n if (ts.isStringLiteral(initializer)) {\n return `${name}=\"${initializer.text}\"`;\n }\n if (ts.isJsxExpression(initializer)) {\n if (initializer.expression) {\n const expr = initializer.expression.getText(ctx.sourceFile).trim();\n return `${name}={${expr}}`;\n }\n return name;\n }\n ctx.warnings.push(\"Unsupported JSX attribute value; leaving as-is.\");\n return name;\n}\n\nfunction getAttributeName(name: ts.JsxAttributeName, ctx: ConverterContext): string | null {\n if (ts.isIdentifier(name)) {\n return name.text;\n }\n if (ts.isJsxNamespacedName(name)) {\n return `${name.namespace.text}:${name.name.text}`;\n }\n return null;\n}\n\nfunction convertJsxText(textNode: ts.JsxText, ctx: ConverterContext, indent: number): string[] {\n const text = textNode.getText(ctx.sourceFile).replace(/\\s+/g, \" \").trim();\n if (!text) {\n return [];\n }\n return [`${\" \".repeat(indent)}| ${text}`];\n}\n\nfunction convertJsxExpression(expressionNode: ts.JsxExpression, ctx: ConverterContext, indent: number): string[] {\n if (!expressionNode.expression) {\n return [];\n }\n const exprText = expressionNode.expression.getText(ctx.sourceFile).trim();\n if (!exprText) {\n return [];\n }\n return [`${\" \".repeat(indent)}{{ ${exprText} }}`];\n}\n"],"mappings":"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","names":["bodyEnd","buildClassAliasEnvironment","emitElement","expandClasses","jsxNode","exprStart","exprEnd","inner","hasErrors","ts","normalizeDiagnostics","normalizeDiagnostics"]}