transone-cli 0.1.0 → 0.1.2

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.
@@ -0,0 +1,22 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/mp/build-mp.ts", "../src/mp/ts-loader.ts", "../src/mp/analyze.ts", "../src/mp/errors.ts", "../src/mp/fold.ts", "../src/mp/binding.ts", "../src/mp/types.ts", "../src/mp/wxml.ts", "../src/mp/styles.ts", "../src/mp/state.ts", "../src/mp/methods.ts", "../src/mp/compile.ts", "../src/mp/jsgen.ts"],
4
+ "sourcesContent": [
5
+ "import { cp, mkdir, readdir, rm, writeFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { basename, dirname, join, relative, resolve } from 'node:path';\nimport type { ResolvedConfig, BuildResult } from '../types';\nimport type { MpDialect } from './dialect';\nimport { loadTypescript } from './ts-loader';\nimport { CompileContext, CompiledUnit } from './types';\nimport { findRootClass } from './analyze';\nimport { compileUnit, finalizeComponentProperties } from './compile';\nimport { generatePageJs, generateComponentJs } from './jsgen';\n\nconst GENERATED_COMMENT = (dialectId: string): string =>\n `由 transone build --target ${dialectId} 生成,请勿手动编辑`;\n\n/**\n * 把 TSone 应用编译为小程序原生工程(微信 / 阿里 / 字节,差异见 MpDialect):\n * app.json / app.js / <appStyleFile> / 工程配置 + pages/<route>/<name>.* + components/<tag>/<tag>.*\n */\nexport async function buildMiniProgram(\n config: ResolvedConfig,\n dialect: MpDialect\n): Promise<BuildResult> {\n const mp = config.mp;\n if (!mp) {\n throw new Error('Mini program build requires config.mp');\n }\n\n const ts = await loadTypescript();\n const context: CompileContext = {\n ts,\n root: config.root,\n files: new Map(),\n components: new Map(),\n compiling: new Set(),\n callSites: new Map(),\n lengthUnit: mp.lengthUnit,\n dialect,\n warnings: [],\n };\n\n const pages: Array<{ route: string; unit: CompiledUnit }> = [];\n for (const [route, entry] of Object.entries(mp.pages)) {\n const rootClass = findRootClass(context, entry);\n const location = pageLocation(route);\n const unit = compileUnit(context, rootClass, {\n kind: 'page',\n name: location.name,\n });\n pages.push({ route, unit });\n }\n finalizeComponentProperties(context);\n for (const warning of context.warnings) {\n console.warn(`[transone mp] ${warning}`);\n }\n\n const outDir = mp.outDir;\n await rm(outDir, { recursive: true, force: true });\n await mkdir(outDir, { recursive: true });\n\n const assetsBuilt: string[] = [];\n const write = async (path: string, content: string): Promise<void> => {\n const target = join(outDir, path);\n await mkdir(dirname(target), { recursive: true });\n await writeFile(target, content, 'utf8');\n assetsBuilt.push(target);\n };\n\n // —— 应用级文件 ——\n await write(\n dialect.projectConfigFile,\n `${JSON.stringify(\n dialect.buildProjectConfig(mp, basename(config.root)),\n null,\n 2\n )}\\n`\n );\n\n await write(\n 'app.json',\n `${JSON.stringify(\n {\n pages: pages.map(({ route }) => appPagePath(route)),\n window: {\n ...dialect.windowDefaults(mp.navigationBarTitleText),\n ...mp.window,\n },\n ...(mp.tabBar !== undefined ? { tabBar: mp.tabBar } : {}),\n ...mp.appExtra,\n ...dialect.appJsonExtras(),\n },\n null,\n 2\n )}\\n`\n );\n\n await write(\n 'app.js',\n `App(${JSON.stringify(\n mp.globalData !== undefined ? { globalData: mp.globalData } : {}\n )});\\n`\n );\n if (dialect.sitemap) {\n await write(\n 'sitemap.json',\n `${JSON.stringify(\n {\n desc: GENERATED_COMMENT(dialect.id),\n rules: [{ action: 'allow', page: '*' }],\n },\n null,\n 2\n )}\\n`\n );\n }\n\n const globalStyles = new Set<string>();\n for (const { unit } of pages) {\n if (unit.globalStyle) {\n globalStyles.add(unit.globalStyle);\n }\n }\n await write(dialect.appStyleFile, `${[...globalStyles].join('\\n')}\\n`);\n\n // —— 页面 ——\n for (const { route, unit } of pages) {\n const base = pageFileBase(route);\n await write(`pages/${base}.${dialect.templateExt}`, unit.template);\n await write(`pages/${base}.${dialect.styleExt}`, `${unit.style}\\n`);\n await write(`pages/${base}.js`, generatePageJs(unit, dialect));\n await write(\n `pages/${base}.json`,\n `${JSON.stringify(\n {\n usingComponents: unit.usingComponents,\n ...mp.pageExtra?.[route],\n },\n null,\n 2\n )}\\n`\n );\n }\n\n // —— 自定义组件 ——\n for (const [tag, unit] of context.components) {\n await write(`components/${tag}/${tag}.${dialect.templateExt}`, unit.template);\n await write(`components/${tag}/${tag}.${dialect.styleExt}`, `${unit.style}\\n`);\n await write(`components/${tag}/${tag}.js`, generateComponentJs(unit, dialect));\n await write(\n `components/${tag}/${tag}.json`,\n `${JSON.stringify(\n dialect.componentJson(unit.usingComponents),\n null,\n 2\n )}\\n`\n );\n }\n\n // —— 静态资源目录(public/ 默认;不存在则跳过)——\n // 上面生成文件已写完,public 仅补产物中不存在的内容:避免覆盖生成文件。\n if (existsSync(mp.publicDir)) {\n for (const file of await listFiles(mp.publicDir)) {\n const target = join(outDir, file);\n if (!existsSync(target)) {\n await cp(join(mp.publicDir, file), target, {\n recursive: true,\n force: true,\n errorOnExist: false,\n });\n }\n }\n }\n\n return {\n root: config.root,\n outDir: resolve(outDir),\n assetsBuilt,\n };\n}\n\nfunction pageLocation(route: string): { directory: string; name: string } {\n const segments = route.replace(/^\\/+/, '').split('/').filter(Boolean);\n if (segments.length === 0) {\n return { directory: '', name: 'index' };\n }\n const name = segments[segments.length - 1];\n const directory = segments.slice(0, -1).join('/');\n return { directory, name };\n}\n\n/** 页面文件基名:route '/' -> 'index/index';'/about' -> 'about/about'。 */\nfunction pageFileBase(route: string): string {\n const location = pageLocation(route);\n const directory =\n location.directory === ''\n ? location.name\n : `${location.directory}/${location.name}`;\n return `${directory}/${location.name}`;\n}\n\nfunction appPagePath(route: string): string {\n return `pages/${pageFileBase(route)}`;\n}\n\n/** 递归列出目录下所有文件(相对根目录的路径)。 */\nasync function listFiles(root: string, dir: string = root): Promise<string[]> {\n const out: string[] = [];\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const abs = join(dir, entry.name);\n if (entry.isDirectory()) {\n out.push(...(await listFiles(root, abs)));\n } else {\n out.push(relative(root, abs));\n }\n }\n return out;\n}\n",
6
+ "import type * as tsTypes from 'typescript';\n\nlet tsModule: typeof tsTypes | null = null;\n\n/**\n * 惰性加载 TypeScript 编译器 API:只有 `transone build --target mp-weixin` 路径\n * 才加载,常规 build/dev 不受影响。模块级缓存避免重复加载。\n */\nexport async function loadTypescript(): Promise<typeof tsTypes> {\n if (tsModule) {\n return tsModule;\n }\n tsModule = await import('typescript');\n return tsModule;\n}\n",
7
+ "import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport type * as tsTypes from 'typescript';\nimport { mpError } from './errors';\nimport { ClassSource, CompileContext } from './types';\nimport { unwrapParentheses } from './fold';\n\ninterface ImportBinding {\n specifier: string;\n importedName: string;\n}\n\n/** 读取并缓存源文件。 */\nexport function readSource(\n context: CompileContext,\n filePath: string\n): tsTypes.SourceFile {\n const cached = context.files.get(filePath);\n if (cached) {\n return cached;\n }\n if (!existsSync(filePath)) {\n throw mpError(filePath, '源文件不存在');\n }\n const text = readFileSync(filePath, 'utf8');\n const source = context.ts.createSourceFile(\n filePath,\n text,\n context.ts.ScriptTarget.Latest,\n true,\n context.ts.ScriptKind.TS\n );\n context.files.set(filePath, source);\n return source;\n}\n\n/** 从页面入口定位根组件类:优先 createApp({ root }),其次导出的 Component 子类。 */\nexport function findRootClass(\n context: CompileContext,\n filePath: string\n): ClassSource {\n const { ts } = context;\n const source = readSource(context, filePath);\n const imports = collectImports(context.ts, source);\n const localClasses = collectLocalClasses(context.ts, source);\n\n // 1. createApp({ root: App })\n // 入口通常写作 `export const app = createApp({ root: App })`(VariableStatement\n // 初始化器)或独立表达式语句;两种形态都要识别。\n for (const expression of topLevelExpressions(ts, source)) {\n if (!context.ts.isCallExpression(expression)) {\n continue;\n }\n const calleeName = callName(context.ts, expression.expression);\n const isCreateApp =\n calleeName === 'createApp' ||\n (calleeName !== undefined &&\n imports.get(calleeName)?.importedName === 'createApp');\n if (!isCreateApp) {\n continue;\n }\n const rootExpr = createAppRoot(context.ts, expression);\n if (!rootExpr) {\n continue;\n }\n return resolveClassReference(context, { filePath, source }, rootExpr);\n }\n\n // 2. 导出的 Component 子类\n for (const statement of source.statements) {\n if (!context.ts.isClassDeclaration(statement)) {\n continue;\n }\n const name = statement.name?.text;\n if (!name || !isExported(context.ts, statement)) {\n continue;\n }\n if (\n isComponentSubclass(context, {\n filePath,\n source,\n declaration: statement,\n className: name,\n })\n ) {\n return {\n filePath,\n source,\n declaration: statement,\n className: name,\n };\n }\n }\n\n // 3. 本地(未导出)Component 子类,供 createApp 的 root 回退使用\n for (const [name, declaration] of localClasses) {\n if (\n isComponentSubclass(context, {\n filePath,\n source,\n declaration,\n className: name,\n })\n ) {\n return { filePath, source, declaration, className: name };\n }\n }\n\n throw mpError(\n filePath,\n '未找到可编译的页面组件:需要 createApp({ root }) 或导出的 Component 子类'\n );\n}\n\n/** 类解析所需的来源上下文(文件 + 已解析的源)。 */\nexport type ClassResolverContext = Pick<ClassSource, 'filePath' | 'source'>;\n\n/**\n * 解析一个类引用(标识符 / 类表达式)为 ClassSource。\n * 支持同文件类、相对路径导入的类;非相对导入会报错。\n */\nexport function resolveClassReference(\n context: CompileContext,\n from: ClassResolverContext,\n expr: tsTypes.Expression\n): ClassSource {\n const { ts } = context;\n expr = unwrapParentheses(ts, expr);\n\n if (ts.isClassExpression(expr) || ts.isClassDeclaration(expr)) {\n const name = expr.name?.text;\n if (!name) {\n throw mpError(from.filePath, '匿名组件类不支持编译到小程序');\n }\n return {\n filePath: from.filePath,\n source: from.source,\n declaration: expr,\n className: name,\n };\n }\n\n if (!ts.isIdentifier(expr)) {\n throw mpError(\n from.filePath,\n `组件引用必须是类名或类表达式: ${expr.getText().slice(0, 60)}`\n );\n }\n const name = expr.text;\n\n // 同文件类声明\n const local = collectLocalClasses(ts, from.source).get(name);\n if (local) {\n return {\n filePath: from.filePath,\n source: from.source,\n declaration: local,\n className: name,\n };\n }\n\n // 导入的类\n const imports = collectImports(ts, from.source);\n const binding = imports.get(name);\n if (binding) {\n return resolveImportedClass(context, from, name, binding);\n }\n\n throw mpError(from.filePath, `无法解析组件标识符 \"${name}\"`);\n}\n\n/** 判断类是否为 Component 子类(extends 一个从 transone 导入或名为 Component 的类)。 */\nexport function isComponentSubclass(\n context: CompileContext,\n classSource: ClassSource\n): boolean {\n const { ts } = context;\n const heritage = classSource.declaration.heritageClauses ?? [];\n const imports = collectImports(ts, classSource.source);\n for (const clause of heritage) {\n if (clause.token !== ts.SyntaxKind.ExtendsKeyword) {\n continue;\n }\n for (const type of clause.types) {\n if (!ts.isExpressionWithTypeArguments(type)) {\n continue;\n }\n const expression = unwrapParentheses(ts, type.expression);\n if (!ts.isIdentifier(expression)) {\n continue;\n }\n const binding = imports.get(expression.text);\n if (binding && binding.specifier.includes('transone')) {\n return true;\n }\n if (expression.text === 'Component') {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction resolveImportedClass(\n context: CompileContext,\n from: ClassResolverContext,\n localName: string,\n binding: ImportBinding\n): ClassSource {\n if (!binding.specifier.startsWith('.')) {\n throw mpError(\n from.filePath,\n `无法解析组件来源 \"${binding.specifier}\"(仅支持相对路径导入的组件)`\n );\n }\n const targetPath = resolveImportPath(from.filePath, binding.specifier);\n if (!targetPath) {\n throw mpError(\n from.filePath,\n `找不到导入文件 \"${binding.specifier}\"(相对 ${from.filePath})`\n );\n }\n const source = readSource(context, targetPath);\n const importedName = binding.importedName;\n const declaration = findExportedClass(context, source, importedName);\n if (!declaration) {\n throw mpError(\n targetPath,\n `找不到导出的组件类 \"${importedName}\"(从 ${localName} 导入)`\n );\n }\n return {\n filePath: targetPath,\n source,\n declaration,\n className: importedName,\n };\n}\n\nfunction findExportedClass(\n context: CompileContext,\n source: tsTypes.SourceFile,\n name: string\n): tsTypes.ClassDeclaration | undefined {\n const { ts } = context;\n for (const statement of source.statements) {\n if (ts.isClassDeclaration(statement) && statement.name?.text === name) {\n if (isExported(ts, statement)) {\n return statement;\n }\n }\n }\n // export { X }\n for (const statement of source.statements) {\n if (\n ts.isExportDeclaration(statement) &&\n statement.exportClause &&\n ts.isNamedExports(statement.exportClause)\n ) {\n for (const element of statement.exportClause.elements) {\n if (element.name.text === name) {\n const local = collectLocalClasses(ts, source).get(name);\n if (local) {\n return local;\n }\n }\n }\n }\n }\n return undefined;\n}\n\n/** 顶层可求值表达式:表达式语句 + 变量声明的初始化器(如 export const app = createApp(...))。 */\nfunction topLevelExpressions(\n ts: typeof tsTypes,\n source: tsTypes.SourceFile\n): tsTypes.Expression[] {\n const expressions: tsTypes.Expression[] = [];\n for (const statement of source.statements) {\n if (ts.isExpressionStatement(statement)) {\n expressions.push(statement.expression);\n continue;\n }\n if (ts.isVariableStatement(statement)) {\n for (const declaration of statement.declarationList.declarations) {\n if (declaration.initializer) {\n expressions.push(declaration.initializer);\n }\n }\n }\n }\n return expressions;\n}\n\nfunction createAppRoot(\n ts: typeof tsTypes,\n call: tsTypes.CallExpression\n): tsTypes.Expression | undefined {\n for (const argument of call.arguments) {\n const object = unwrapParentheses(ts, argument);\n if (!ts.isObjectLiteralExpression(object)) {\n continue;\n }\n for (const property of object.properties) {\n if (\n ts.isPropertyAssignment(property) &&\n ts.isIdentifier(property.name) &&\n property.name.text === 'root'\n ) {\n return property.initializer;\n }\n }\n }\n return undefined;\n}\n\nfunction collectLocalClasses(\n ts: typeof tsTypes,\n source: tsTypes.SourceFile\n): Map<string, tsTypes.ClassDeclaration> {\n const classes = new Map<string, tsTypes.ClassDeclaration>();\n for (const statement of source.statements) {\n if (ts.isClassDeclaration(statement) && statement.name) {\n classes.set(statement.name.text, statement);\n }\n }\n return classes;\n}\n\nfunction collectImports(\n ts: typeof tsTypes,\n source: tsTypes.SourceFile\n): Map<string, ImportBinding> {\n const imports = new Map<string, ImportBinding>();\n for (const statement of source.statements) {\n if (!ts.isImportDeclaration(statement)) {\n continue;\n }\n const specifier = statement.moduleSpecifier.getText().replace(/['\"]/g, '');\n const bindings = statement.importClause?.namedBindings;\n if (!bindings) {\n continue;\n }\n if (ts.isNamedImports(bindings)) {\n for (const element of bindings.elements) {\n imports.set(element.name.text, {\n specifier,\n importedName: element.propertyName?.text ?? element.name.text,\n });\n }\n } else if (ts.isNamespaceImport(bindings)) {\n imports.set(bindings.name.text, { specifier, importedName: '*' });\n }\n }\n return imports;\n}\n\nfunction resolveImportPath(\n fromFile: string,\n specifier: string\n): string | undefined {\n const base = resolve(dirname(fromFile), specifier);\n const candidates = [\n base,\n `${base}.ts`,\n `${base}.tsx`,\n join(base, 'index.ts'),\n join(base, 'index.tsx'),\n ];\n return candidates.find((candidate) => existsSync(candidate));\n}\n\nfunction isExported(\n ts: typeof tsTypes,\n declaration: tsTypes.ClassDeclaration\n): boolean {\n return (declaration.modifiers ?? []).some(\n (modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword\n );\n}\n\nfunction callName(\n ts: typeof tsTypes,\n expression: tsTypes.Expression\n): string | undefined {\n expression = unwrapParentheses(ts, expression);\n if (ts.isIdentifier(expression)) {\n return expression.text;\n }\n if (ts.isPropertyAccessExpression(expression)) {\n return expression.name.text;\n }\n return undefined;\n}\n",
8
+ "/** 小程序编译错误:携带出错文件,便于定位不可静态编译的源码。 */\nexport class MpCompileError extends Error {\n public readonly file: string;\n\n constructor(file: string, message: string) {\n super(`${message} (${file})`);\n this.name = 'MpCompileError';\n this.file = file;\n }\n}\n\nexport function mpError(file: string, message: string): MpCompileError {\n return new MpCompileError(file, message);\n}\n",
9
+ "import type * as tsTypes from 'typescript';\n\nexport type FoldedValue =\n | string\n | number\n | boolean\n | null\n | FoldedValue[]\n | { [key: string]: FoldedValue };\n\n/** 收集源文件顶层 const 声明(name -> 初始化表达式)。 */\nexport function collectModuleConsts(\n ts: typeof tsTypes,\n source: tsTypes.SourceFile\n): Map<string, tsTypes.Expression> {\n const consts = new Map<string, tsTypes.Expression>();\n for (const statement of source.statements) {\n if (!ts.isVariableStatement(statement)) {\n continue;\n }\n const isConst = statement.declarationList.flags & ts.NodeFlags.Const;\n if (!isConst) {\n continue;\n }\n for (const declaration of statement.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name) && declaration.initializer) {\n consts.set(declaration.name.text, declaration.initializer);\n }\n }\n }\n return consts;\n}\n\n/**\n * 常量折叠:把可静态求值的表达式折叠为 JSON 值。\n * 无法求值时返回 undefined(调用方决定如何报错)。\n */\nexport function foldExpression(\n ts: typeof tsTypes,\n node: tsTypes.Node,\n consts: Map<string, tsTypes.Expression>,\n seen = new Set<string>()\n): FoldedValue | undefined {\n node = unwrapParentheses(ts, node);\n\n if (ts.isStringLiteral(node)) {\n return node.text;\n }\n if (ts.isNoSubstitutionTemplateLiteral(node)) {\n // 含 {{}} 的模板串依赖运行时 TemplateEngine,不是常量\n if (node.text.includes('{{')) {\n return undefined;\n }\n return node.text;\n }\n if (ts.isNumericLiteral(node)) {\n return Number(node.text);\n }\n if (node.kind === ts.SyntaxKind.TrueKeyword) {\n return true;\n }\n if (node.kind === ts.SyntaxKind.FalseKeyword) {\n return false;\n }\n if (node.kind === ts.SyntaxKind.NullKeyword) {\n return null;\n }\n\n if (ts.isPrefixUnaryExpression(node)) {\n const operand = foldExpression(ts, node.operand, consts, seen);\n if (operand === undefined) {\n return undefined;\n }\n if (node.operator === ts.SyntaxKind.MinusToken) {\n return typeof operand === 'number' ? -operand : undefined;\n }\n if (node.operator === ts.SyntaxKind.PlusToken) {\n return typeof operand === 'number' ? operand : undefined;\n }\n if (node.operator === ts.SyntaxKind.ExclamationToken) {\n return !operand;\n }\n return undefined;\n }\n\n if (ts.isBinaryExpression(node)) {\n const left = foldExpression(ts, node.left, consts, seen);\n const right = foldExpression(ts, node.right, consts, seen);\n if (left === undefined || right === undefined) {\n return undefined;\n }\n return foldBinary(ts, node.operatorToken.kind, left, right);\n }\n\n if (ts.isConditionalExpression(node)) {\n const condition = foldExpression(ts, node.condition, consts, seen);\n if (typeof condition !== 'boolean') {\n return undefined;\n }\n return condition\n ? foldExpression(ts, node.whenTrue, consts, seen)\n : foldExpression(ts, node.whenFalse, consts, seen);\n }\n\n if (ts.isArrayLiteralExpression(node)) {\n const items: FoldedValue[] = [];\n for (const element of node.elements) {\n if (ts.isSpreadElement(element)) {\n const spread = foldExpression(ts, element.expression, consts, seen);\n if (!Array.isArray(spread)) {\n return undefined;\n }\n items.push(...spread);\n continue;\n }\n const value = foldExpression(ts, element, consts, seen);\n if (value === undefined) {\n return undefined;\n }\n items.push(value);\n }\n return items;\n }\n\n if (ts.isObjectLiteralExpression(node)) {\n const result: Record<string, FoldedValue> = {};\n for (const property of node.properties) {\n if (ts.isPropertyAssignment(property)) {\n const key = propertyNameText(ts, property.name);\n const value = foldExpression(ts, property.initializer, consts, seen);\n if (key === undefined || value === undefined) {\n return undefined;\n }\n result[key] = value;\n continue;\n }\n if (\n ts.isShorthandPropertyAssignment(property) &&\n ts.isIdentifier(property.name)\n ) {\n const initializer = consts.get(property.name.text);\n if (!initializer) {\n return undefined;\n }\n const value = foldExpression(ts, initializer, consts, seen);\n if (value === undefined) {\n return undefined;\n }\n result[property.name.text] = value;\n continue;\n }\n return undefined;\n }\n return result;\n }\n\n if (ts.isIdentifier(node)) {\n if (seen.has(node.text)) {\n return undefined;\n }\n const initializer = consts.get(node.text);\n if (!initializer) {\n return undefined;\n }\n seen.add(node.text);\n const value = foldExpression(ts, initializer, consts, seen);\n seen.delete(node.text);\n return value;\n }\n\n if (ts.isPropertyAccessExpression(node)) {\n const base = foldExpression(ts, node.expression, consts, seen);\n if (base === undefined) {\n return undefined;\n }\n if (Array.isArray(base)) {\n if (node.name.text === 'length') {\n return base.length;\n }\n return undefined;\n }\n if (typeof base === 'object' && base !== null) {\n return base[node.name.text];\n }\n return undefined;\n }\n\n if (ts.isElementAccessExpression(node)) {\n const base = foldExpression(ts, node.expression, consts, seen);\n const index = foldExpression(ts, node.argumentExpression, consts, seen);\n if (!Array.isArray(base) || typeof index !== 'number') {\n return undefined;\n }\n return base[index];\n }\n\n if (ts.isTemplateExpression(node)) {\n let result = '';\n if (node.head.text !== '') {\n result += node.head.text;\n }\n for (const span of node.templateSpans) {\n const value = foldExpression(ts, span.expression, consts, seen);\n if (value === undefined) {\n return undefined;\n }\n result += String(value);\n result += span.literal.text;\n }\n return result;\n }\n\n return undefined;\n}\n\nfunction foldBinary(\n ts: typeof tsTypes,\n operator: tsTypes.SyntaxKind,\n left: FoldedValue,\n right: FoldedValue\n): FoldedValue | undefined {\n switch (operator) {\n case ts.SyntaxKind.PlusToken:\n return `${left}${right}` as FoldedValue;\n case ts.SyntaxKind.MinusToken:\n return (left as number) - (right as number);\n case ts.SyntaxKind.AsteriskToken:\n return (left as number) * (right as number);\n case ts.SyntaxKind.SlashToken:\n return (left as number) / (right as number);\n case ts.SyntaxKind.PercentToken:\n return (left as number) % (right as number);\n case ts.SyntaxKind.EqualsEqualsEqualsToken:\n return left === right;\n case ts.SyntaxKind.ExclamationEqualsEqualsToken:\n return left !== right;\n case ts.SyntaxKind.LessThanToken:\n return (left as number) < (right as number);\n case ts.SyntaxKind.LessThanEqualsToken:\n return (left as number) <= (right as number);\n case ts.SyntaxKind.GreaterThanToken:\n return (left as number) > (right as number);\n case ts.SyntaxKind.GreaterThanEqualsToken:\n return (left as number) >= (right as number);\n case ts.SyntaxKind.AmpersandAmpersandToken:\n return Boolean(left) && Boolean(right);\n case ts.SyntaxKind.BarBarToken:\n return Boolean(left) || Boolean(right);\n default:\n return undefined;\n }\n}\n\nexport function propertyNameText(\n ts: typeof tsTypes,\n name: tsTypes.PropertyName\n): string | undefined {\n if (\n ts.isIdentifier(name) ||\n ts.isStringLiteral(name) ||\n ts.isNumericLiteral(name)\n ) {\n return name.text;\n }\n return undefined;\n}\n\nexport function unwrapParentheses<T extends tsTypes.Node>(\n ts: typeof tsTypes,\n node: T\n): T {\n let current: tsTypes.Node = node;\n while (ts.isParenthesizedExpression(current)) {\n current = current.expression;\n }\n return current as T;\n}\n\n/** this 表达式判断(TypeScript API 未导出 isThisExpression)。 */\nexport function isThisExpression(\n ts: typeof tsTypes,\n node: tsTypes.Node\n): node is tsTypes.ThisExpression {\n return node.kind === ts.SyntaxKind.ThisKeyword;\n}\n",
10
+ "import type * as tsTypes from 'typescript';\nimport {\n foldExpression,\n FoldedValue,\n isThisExpression,\n unwrapParentheses,\n} from './fold';\nimport { mpError } from './errors';\n\n/** 绑定表达式求值作用域:each 参数名 + render 内局部 const。 */\nexport interface BindingScope {\n params: Set<string>;\n locals: Map<string, tsTypes.Expression>;\n /** 模块级 const(name -> 初始化表达式)。 */\n consts: Map<string, tsTypes.Expression>;\n}\n\nexport interface BindingContext {\n ts: typeof tsTypes;\n scope: BindingScope;\n filePath: string;\n /** 组件模板中访问 this.props.X 时回调,用于收集 properties 声明。 */\n onProp?: (name: string) => void;\n}\n\n/**\n * 把 TypeScript 表达式转换为 WXML 数据绑定表达式({{...}} 内的部分)。\n * 支持:this.state / this.props 路径、字面量、三元、二元、each 参数、\n * render 局部 const、可折叠的模块级 const。\n */\nexport function toBinding(context: BindingContext, node: tsTypes.Node): string {\n const { ts } = context;\n node = unwrapParentheses(ts, node);\n\n if (ts.isPropertyAccessExpression(node)) {\n const statePath = thisStatePath(ts, node);\n if (statePath) {\n return statePath;\n }\n const propsPath = thisPropsPath(ts, node);\n if (propsPath) {\n context.onProp?.(propsPath.split('.')[0]);\n return propsPath;\n }\n\n const folded = foldExpression(ts, node, context.scope.consts);\n if (folded !== undefined) {\n return literalToBinding(folded);\n }\n\n const base = toBinding(context, node.expression);\n if (!isPathLike(base)) {\n throw mpError(\n context.filePath,\n `模板表达式不支持该属性访问: ${node.getText()}`\n );\n }\n return `${base}.${node.name.text}`;\n }\n\n if (ts.isElementAccessExpression(node)) {\n const folded = foldExpression(ts, node, context.scope.consts);\n if (folded !== undefined) {\n return literalToBinding(folded);\n }\n const base = toBinding(context, node.expression);\n const index = toBinding(context, node.argumentExpression);\n if (!isPathLike(base)) {\n throw mpError(\n context.filePath,\n `模板表达式不支持该下标访问: ${node.getText()}`\n );\n }\n return `${base}[${index}]`;\n }\n\n if (ts.isIdentifier(node)) {\n const { params, locals, consts } = context.scope;\n if (params.has(node.text)) {\n return node.text;\n }\n if (locals.has(node.text)) {\n return toBinding(context, locals.get(node.text)!);\n }\n if (consts.has(node.text)) {\n const folded = foldExpression(ts, node, consts);\n if (folded !== undefined) {\n return literalToBinding(folded);\n }\n return toBinding(context, consts.get(node.text)!);\n }\n throw mpError(context.filePath, `无法解析模板标识符 \"${node.text}\"`);\n }\n\n if (ts.isStringLiteral(node)) {\n return singleQuoted(node.text);\n }\n if (ts.isNumericLiteral(node)) {\n return node.text;\n }\n if (node.kind === ts.SyntaxKind.TrueKeyword) {\n return 'true';\n }\n if (node.kind === ts.SyntaxKind.FalseKeyword) {\n return 'false';\n }\n if (node.kind === ts.SyntaxKind.NullKeyword) {\n return 'null';\n }\n\n if (ts.isNoSubstitutionTemplateLiteral(node)) {\n // 含 {{}} 的模板串本身就是 WXML 绑定语法,直接透传\n if (node.text.includes('{{')) {\n return node.text;\n }\n return singleQuoted(node.text);\n }\n\n if (ts.isTemplateExpression(node)) {\n const parts: string[] = [];\n if (node.head.text !== '') {\n parts.push(singleQuoted(node.head.text));\n }\n for (const span of node.templateSpans) {\n parts.push(toBinding(context, span.expression));\n if (span.literal.text !== '') {\n parts.push(singleQuoted(span.literal.text));\n }\n }\n return parts.join(' + ');\n }\n\n if (ts.isBinaryExpression(node)) {\n return `(${toBinding(context, node.left)} ${node.operatorToken.getText()} ${toBinding(context, node.right)})`;\n }\n\n if (ts.isConditionalExpression(node)) {\n return `(${toBinding(context, node.condition)} ? ${toBinding(context, node.whenTrue)} : ${toBinding(context, node.whenFalse)})`;\n }\n\n if (ts.isPrefixUnaryExpression(node)) {\n const operator = ts.tokenToString(node.operator) ?? String(node.operator);\n return `(${operator}${toBinding(context, node.operand)})`;\n }\n\n if (ts.isArrayLiteralExpression(node)) {\n const folded = foldExpression(ts, node, context.scope.consts);\n if (folded !== undefined) {\n return literalToBinding(folded);\n }\n const items = node.elements.map((element) => toBinding(context, element));\n return `[${items.join(', ')}]`;\n }\n\n if (ts.isObjectLiteralExpression(node)) {\n const folded = foldExpression(ts, node, context.scope.consts);\n if (folded !== undefined) {\n return literalToBinding(folded);\n }\n throw mpError(\n context.filePath,\n `模板表达式中的对象字面量无法静态求值: ${node.getText()}`\n );\n }\n\n if (ts.isCallExpression(node)) {\n throw mpError(\n context.filePath,\n `模板表达式不支持函数调用(如 ${node.getText()}):WXML 无法执行方法,请在方法/state 中预先计算格式化结果`\n );\n }\n\n throw mpError(\n context.filePath,\n `不支持的模板表达式: ${node.getText() ?? node.kind}`\n );\n}\n\n/** this.state.a.b.c -> \"a.b.c\";非该形态返回 undefined。 */\nfunction thisStatePath(\n ts: typeof tsTypes,\n node: tsTypes.PropertyAccessExpression\n): string | undefined {\n return thisMemberPath(ts, node, 'state');\n}\n\n/** this.props.a.b -> \"a.b\";非该形态返回 undefined。 */\nfunction thisPropsPath(\n ts: typeof tsTypes,\n node: tsTypes.PropertyAccessExpression\n): string | undefined {\n return thisMemberPath(ts, node, 'props');\n}\n\nfunction thisMemberPath(\n ts: typeof tsTypes,\n node: tsTypes.PropertyAccessExpression,\n member: string\n): string | undefined {\n let current: tsTypes.Expression = node;\n const parts: string[] = [];\n while (ts.isPropertyAccessExpression(current)) {\n parts.unshift(current.name.text);\n current = current.expression;\n if (\n ts.isPropertyAccessExpression(current) &&\n isThisExpression(ts, current.expression)\n ) {\n if (current.name.text === member) {\n return parts.join('.');\n }\n return undefined;\n }\n if (ts.isElementAccessExpression(current)) {\n if (\n !ts.isStringLiteral(current.argumentExpression) ||\n !thisMemberBase(ts, current.expression)\n ) {\n return undefined;\n }\n parts.unshift(current.argumentExpression.text);\n current = current.expression;\n if (\n ts.isPropertyAccessExpression(current) &&\n current.name.text === member\n ) {\n return parts.join('.');\n }\n return undefined;\n }\n }\n return undefined;\n}\n\nfunction thisMemberBase(ts: typeof tsTypes, node: tsTypes.Expression): boolean {\n return (\n ts.isPropertyAccessExpression(node) && isThisExpression(ts, node.expression)\n );\n}\n\nfunction isPathLike(value: string): boolean {\n return /^[A-Za-z_$][\\w$]*(\\.[A-Za-z_$][\\w$]*)*$/.test(value);\n}\n\nfunction literalToBinding(value: FoldedValue): string {\n if (typeof value === 'string') {\n return singleQuoted(value);\n }\n if (typeof value === 'number') {\n return String(value);\n }\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n if (value === null) {\n return 'null';\n }\n if (Array.isArray(value)) {\n return `[${value.map(literalToBinding).join(', ')}]`;\n }\n const entries = Object.entries(value).map(\n ([key, item]) => `${key}: ${literalToBinding(item)}`\n );\n return `{${entries.join(', ')}}`;\n}\n\nfunction singleQuoted(value: string): string {\n return `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`;\n}\n",
11
+ "import type * as tsTypes from 'typescript';\nimport type { MpDialect } from './dialect';\n\nexport type UnitKind = 'page' | 'component';\n\n/** 一个 Component 子类的定位信息:文件 + 类声明。 */\nexport interface ClassSource {\n filePath: string;\n source: tsTypes.SourceFile;\n declaration: tsTypes.ClassLikeDeclaration;\n className: string;\n}\n\n/** 编译生成的函数条目(页面/组件方法或生命周期钩子)。 */\nexport interface FunctionEntry {\n key: string;\n fn: string;\n}\n\n/** 组件属性定义:propName -> WeChat 属性类型(String/Number/...)。 */\nexport type PropertyTypes = Record<string, string>;\n\n/** 编译产物单元:一个页面或一个自定义组件。 */\nexport interface CompiledUnit {\n kind: UnitKind;\n /** 页面为路由叶名(如 index),组件为 kebab-case 标签名。 */\n name: string;\n /** WXML 模板源码。 */\n template: string;\n /** 本单元作用域内的 WXSS(class 选择器)。 */\n style: string;\n /** 全局样式(body 选择器,页面单元会合并进 app.wxss)。 */\n globalStyle: string;\n /** data 初始值 JS 源码(对象字面量)。 */\n data: string;\n /** 自定义组件 properties(页面为空对象)。 */\n properties: PropertyTypes;\n /** 页面/组件 methods 条目(不含生命周期钩子)。 */\n methods: FunctionEntry[];\n /** 页面级生命周期(onLoad/onReady/onUnload)或组件 lifetimes。 */\n lifecycle: FunctionEntry[];\n /** 组件通过 triggerEvent 暴露的自定义事件名。 */\n customEvents: string[];\n /** 模板中引用到的 props 名(finalize 时并入 properties)。 */\n propsReferenced: Set<string>;\n /** usingComponents:tag -> 小程序绝对路径。 */\n usingComponents: Record<string, string>;\n}\n\n/** 编译过程中的上下文:跨模块共享的文件缓存与产物缓存。 */\nexport interface CompileContext {\n ts: typeof tsTypes;\n root: string;\n /** 已解析的源文件缓存(绝对路径 -> SourceFile)。 */\n files: Map<string, tsTypes.SourceFile>;\n /** 已编译完成的组件(tag -> unit)。 */\n components: Map<string, CompiledUnit>;\n /** 正在编译的组件 tag,用于检测循环引用。 */\n compiling: Set<string>;\n /** 组件调用点收集:tag -> 各调用点传的属性(name -> 类型)。 */\n callSites: Map<string, Array<Record<string, string>>>;\n /** 样式数字长度单位:'px'(默认)或 'rpx'(数值按 1px=2rpx 换算)。 */\n lengthUnit: 'px' | 'rpx';\n /** 跨端差异层:决定模板指令前缀、事件绑定、文件后缀、工程配置等平台差异。 */\n dialect: MpDialect;\n warnings: string[];\n}\n\nexport function warn(context: CompileContext, message: string): void {\n context.warnings.push(message);\n}\n",
12
+ "import type * as tsTypes from 'typescript';\nimport { toBinding, BindingScope } from './binding';\nimport {\n foldExpression,\n FoldedValue,\n isThisExpression,\n unwrapParentheses,\n} from './fold';\nimport { mpError } from './errors';\nimport { ClassSource, CompileContext, warn } from './types';\nimport { resolveClassReference, isComponentSubclass } from './analyze';\n\n/** 一个组件调用点通过 emitters 绑定的自定义事件。 */\nexport interface EmitterUsage {\n event: string;\n method: string;\n passArgs: boolean;\n}\n\n/** 模板编译期间收集的产物信息。 */\nexport interface TemplateBuilder {\n /** 模板绑定的事件处理方法名。 */\n handlers: Set<string>;\n /** 用到的自定义组件(tag -> 类来源)。 */\n usedComponents: Map<string, ClassSource>;\n /** 本模板中引用到的 props 名(组件需要声明 properties)。 */\n propsReferenced: Set<string>;\n /** 本模板的组件通过 triggerEvent 触发的事件名。 */\n customEvents: Set<string>;\n /** 父级需要生成的 emitters 包装方法。 */\n emitters: EmitterUsage[];\n}\n\ninterface TemplateEnv {\n builder: TemplateBuilder;\n scope: BindingScope;\n indent: number;\n extraAttrs: string[];\n /** 本地名 -> transone 原始导出名(处理 import 别名)。 */\n origins: Map<string, string>;\n /** 存在 hover 样式的选择器集合('.card'),用于生成 hover-class。 */\n hoverSelectors: Set<string>;\n}\n\nexport interface CompiledTemplate {\n template: string;\n builder: TemplateBuilder;\n}\n\n/** TSone 元素快捷方式(含 h/Tag),未从 transone 导入的同名调用也按工厂识别。 */\nconst ELEMENT_FACTORIES = new Set([\n 'h',\n 'Tag',\n 'Div',\n 'Span',\n 'P',\n 'Button',\n 'Input',\n 'Section',\n 'Main',\n 'Header',\n 'Footer',\n 'Nav',\n 'Article',\n 'Aside',\n 'H1',\n 'H2',\n 'H3',\n 'H4',\n 'H5',\n 'H6',\n 'Strong',\n 'Em',\n 'Small',\n 'Pre',\n 'Code',\n 'Blockquote',\n 'Ul',\n 'Ol',\n 'Li',\n 'A',\n 'Img',\n 'Form',\n 'Label',\n 'Textarea',\n 'Select',\n 'Option',\n 'Table',\n 'Thead',\n 'Tbody',\n 'Tr',\n 'Th',\n 'Td',\n]);\n\nconst SPECIAL_CALLS = new Set(['createComponent', 'each', 'slot']);\n\n/** HTML 标签 -> WXML 标签映射(WXML 只提供有限的基础组件)。 */\nconst TAG_MAP: Record<string, string> = {\n div: 'view',\n section: 'view',\n main: 'view',\n header: 'view',\n footer: 'view',\n article: 'view',\n aside: 'view',\n nav: 'view',\n ul: 'view',\n ol: 'view',\n li: 'view',\n blockquote: 'view',\n pre: 'view',\n code: 'view',\n table: 'view',\n thead: 'view',\n tbody: 'view',\n tr: 'view',\n th: 'view',\n td: 'view',\n p: 'view',\n form: 'form',\n label: 'label',\n h1: 'view',\n h2: 'view',\n h3: 'view',\n h4: 'view',\n h5: 'view',\n h6: 'view',\n span: 'text',\n strong: 'text',\n em: 'text',\n small: 'text',\n button: 'button',\n input: 'input',\n textarea: 'textarea',\n img: 'image',\n a: 'navigator',\n // —— 小程序专有组件(标签名即 WXML 标签)——\n view: 'view',\n text: 'text',\n image: 'image',\n navigator: 'navigator',\n 'scroll-view': 'scroll-view',\n swiper: 'swiper',\n 'swiper-item': 'swiper-item',\n picker: 'picker',\n 'picker-view': 'picker-view',\n 'picker-view-column': 'picker-view-column',\n switch: 'switch',\n checkbox: 'checkbox',\n 'checkbox-group': 'checkbox-group',\n radio: 'radio',\n 'radio-group': 'radio-group',\n slider: 'slider',\n progress: 'progress',\n icon: 'icon',\n 'rich-text': 'rich-text',\n video: 'video',\n camera: 'camera',\n 'live-player': 'live-player',\n 'live-pusher': 'live-pusher',\n map: 'map',\n canvas: 'canvas',\n 'cover-view': 'cover-view',\n 'cover-image': 'cover-image',\n 'movable-view': 'movable-view',\n 'movable-area': 'movable-area',\n 'web-view': 'web-view',\n ad: 'ad',\n 'official-account': 'official-account',\n 'open-data': 'open-data',\n // camelCase 别名(宽松接受)\n scrollView: 'scroll-view',\n swiperItem: 'swiper-item',\n pickerView: 'picker-view',\n pickerViewColumn: 'picker-view-column',\n checkboxGroup: 'checkbox-group',\n radioGroup: 'radio-group',\n richText: 'rich-text',\n coverView: 'cover-view',\n coverImage: 'cover-image',\n movableView: 'movable-view',\n movableArea: 'movable-area',\n webView: 'web-view',\n livePlayer: 'live-player',\n officialAccount: 'official-account',\n openData: 'open-data',\n};\n\n/** TSone 事件名 -> WXML 事件名(click 在 WXML 中是 tap)。 */\nconst EVENT_MAP: Record<string, string> = {\n click: 'tap',\n tap: 'tap',\n longpress: 'longpress',\n longtap: 'longtap',\n input: 'input',\n change: 'change',\n cancel: 'cancel',\n submit: 'submit',\n focus: 'focus',\n blur: 'blur',\n confirm: 'confirm',\n load: 'load',\n error: 'error',\n scroll: 'scroll',\n scrolltoupper: 'scrolltoupper',\n scrolltolower: 'scrolltolower',\n scrollToUpper: 'scrolltoupper',\n scrollToLower: 'scrolltolower',\n refresherrefresh: 'refresherrefresh',\n refresherpulldown: 'refresherpulldown',\n refresherrestore: 'refresherrestore',\n refresherabort: 'refresherabort',\n touchstart: 'touchstart',\n touchmove: 'touchmove',\n touchend: 'touchend',\n touchcancel: 'touchcancel',\n touchforcechange: 'touchforcechange',\n transitionend: 'transitionend',\n animationfinish: 'animationfinish',\n animationfail: 'animationfail',\n getphonenumber: 'getphonenumber',\n getuserinfo: 'getuserinfo',\n getcontact: 'getcontact',\n openshare: 'openshare',\n launchapp: 'launchapp',\n message: 'message',\n};\n\nconst TAG_KEYS = new Set([\n 'props',\n 'children',\n 'listeners',\n 'key',\n 'directions',\n]);\n\nfunction isEventProp(key: string): boolean {\n return /^on[A-Z]/.test(key) || /^on[a-z]/.test(key);\n}\n\nfunction eventNameFromProp(key: string): string {\n return key.slice(2).toLowerCase();\n}\n\nexport function compileTemplate(\n context: CompileContext,\n classSource: ClassSource,\n _kind: 'page' | 'component',\n hoverSelectors: Set<string> = new Set()\n): CompiledTemplate {\n const { ts } = context;\n const renderMethod = findMethod(context, classSource, 'render');\n if (!renderMethod) {\n throw mpError(\n classSource.filePath,\n `组件 ${classSource.className} 缺少 render() 方法`\n );\n }\n const body = renderMethod.body;\n if (!body) {\n throw mpError(classSource.filePath, 'render() 缺少方法体');\n }\n\n const locals = new Map<string, tsTypes.Expression>();\n let returnStatement: tsTypes.ReturnStatement | undefined;\n for (const statement of body.statements) {\n if (ts.isVariableStatement(statement)) {\n const isConst = statement.declarationList.flags & ts.NodeFlags.Const;\n if (!isConst) {\n throw mpError(\n classSource.filePath,\n 'render() 内只支持 const 局部变量(小程序模板是静态编译的)'\n );\n }\n for (const declaration of statement.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name) && declaration.initializer) {\n locals.set(declaration.name.text, declaration.initializer);\n }\n }\n continue;\n }\n if (ts.isReturnStatement(statement)) {\n returnStatement = statement;\n continue;\n }\n throw mpError(\n classSource.filePath,\n `render() 内不支持的语句(只支持 const 声明与 return): ${statement.getText().slice(0, 60)}`\n );\n }\n if (!returnStatement?.expression) {\n throw mpError(classSource.filePath, 'render() 必须以 return 表达式结束');\n }\n\n const consts = collectModuleConsts(context, classSource);\n const builder: TemplateBuilder = {\n handlers: new Set(),\n usedComponents: new Map(),\n propsReferenced: new Set(),\n customEvents: new Set(),\n emitters: [],\n };\n const env: TemplateEnv = {\n builder,\n scope: { params: new Set(), locals, consts },\n indent: 0,\n extraAttrs: [],\n origins: collectFactoryOrigins(ts, classSource.source),\n hoverSelectors,\n };\n\n const lines = buildNodeLines(\n context,\n classSource,\n returnStatement.expression,\n env\n );\n const header = `<!-- 由 transone build --target ${context.dialect.id} 生成,请勿手动编辑 -->`;\n return {\n template: [header, ...lines].join('\\n') + '\\n',\n builder,\n };\n}\n\nfunction buildNodeLines(\n context: CompileContext,\n classSource: ClassSource,\n node: tsTypes.Node,\n env: TemplateEnv,\n depth = 0\n): string[] {\n if (depth > 64) {\n throw mpError(classSource.filePath, '模板嵌套过深(可能是标识符循环引用)');\n }\n const { ts } = context;\n node = unwrapParentheses(ts, node);\n // 模板中常见 `{ ... } as VNode` 类型断言:类型信息在编译期即被丢弃\n node = unwrapTypeAssertions(ts, node);\n\n if (node.kind === ts.SyntaxKind.NullKeyword) {\n return [];\n }\n\n if (ts.isCallExpression(node)) {\n const localName = callName(ts, node.expression);\n const name = (localName && env.origins.get(localName)) ?? localName;\n if (name === 'createComponent') {\n return compileComponentCall(context, classSource, node, env, depth);\n }\n if (name === 'each') {\n return compileEach(context, classSource, node, env, depth);\n }\n if (name === 'slot') {\n return compileSlot(context, classSource, node, env);\n }\n if (name && ELEMENT_FACTORIES.has(name)) {\n return compileElementCall(context, classSource, node, env, depth);\n }\n throw mpError(\n classSource.filePath,\n `不支持的渲染调用 \"${name ?? '?'}\"(仅支持 h/Tag/元素快捷方式/createComponent/each/slot)`\n );\n }\n\n if (ts.isIdentifier(node)) {\n if (env.scope.params.has(node.text)) {\n return [indent(env.indent) + `{{${node.text}}}`];\n }\n const replacement = resolveIdentifierExpression(\n context,\n classSource,\n node,\n env\n );\n if (replacement) {\n return buildNodeLines(context, classSource, replacement, env, depth + 1);\n }\n throw mpError(classSource.filePath, `无法解析模板标识符 \"${node.text}\"`);\n }\n\n if (ts.isObjectLiteralExpression(node)) {\n const componentProp = objectProperty(ts, node, 'component');\n if (componentProp) {\n return compileComponentObject(context, classSource, node, env, depth);\n }\n throw mpError(\n classSource.filePath,\n `render() 中不支持的对象字面量: ${node.getText().slice(0, 60)}`\n );\n }\n\n if (ts.isConditionalExpression(node)) {\n return compileConditional(context, classSource, node, env, depth);\n }\n\n if (ts.isBinaryExpression(node)) {\n if (node.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken) {\n return compileLogicalAnd(context, classSource, node, env, depth);\n }\n throw mpError(\n classSource.filePath,\n `render() 中不支持的表达式(条件渲染请用三元或 &&): ${node.getText().slice(0, 60)}`\n );\n }\n\n if (ts.isArrayLiteralExpression(node)) {\n const lines: string[] = [];\n for (const element of node.elements) {\n if (ts.isSpreadElement(element)) {\n throw mpError(classSource.filePath, 'children 中不支持展开运算符');\n }\n lines.push(...buildNodeLines(context, classSource, element, env, depth));\n }\n return lines;\n }\n\n if (isTextNode(ts, node)) {\n return [indent(env.indent) + textContent(context, classSource, node, env)];\n }\n\n if (\n ts.isPropertyAccessExpression(node) ||\n ts.isElementAccessExpression(node)\n ) {\n return [\n indent(env.indent) +\n `{{${toBinding(bindingContext(context, classSource, env), node)}}}`,\n ];\n }\n\n throw mpError(\n classSource.filePath,\n `render() 中不支持的节点: ${node.getText().slice(0, 60)}`\n );\n}\n\nfunction compileElementCall(\n context: CompileContext,\n classSource: ClassSource,\n node: tsTypes.CallExpression,\n env: TemplateEnv,\n depth: number\n): string[] {\n const { ts } = context;\n const localName = callName(ts, node.expression)!;\n const name = env.origins.get(localName) ?? localName;\n const args = node.arguments;\n\n let tagExpr: tsTypes.Expression;\n let propsExpr: tsTypes.Expression | undefined;\n let childrenExpr: tsTypes.Expression | undefined;\n let listenersExpr: tsTypes.Expression | undefined;\n let directionsExpr: tsTypes.Expression | undefined;\n\n if (name === 'h' || name === 'Tag') {\n if (args.length === 0) {\n throw mpError(classSource.filePath, `${name}() 缺少标签参数`);\n }\n tagExpr = args[0];\n if (\n name === 'Tag' &&\n args.length >= 2 &&\n ts.isObjectLiteralExpression(args[1])\n ) {\n const options = args[1];\n propsExpr = objectProperty(ts, options, 'props');\n childrenExpr = objectProperty(ts, options, 'children');\n listenersExpr = objectProperty(ts, options, 'listeners');\n directionsExpr = objectProperty(ts, options, 'directions');\n } else {\n propsExpr = args[1];\n childrenExpr = args[2];\n listenersExpr = args[3];\n directionsExpr = args[5];\n }\n } else {\n // 元素快捷方式:Div({ props, children, ... })\n tagExpr = ts.factory.createStringLiteral(kebabCase(name));\n const options = args[0];\n if (options && ts.isObjectLiteralExpression(options)) {\n propsExpr = objectProperty(ts, options, 'props');\n childrenExpr = objectProperty(ts, options, 'children');\n listenersExpr = objectProperty(ts, options, 'listeners');\n directionsExpr = objectProperty(ts, options, 'directions');\n const directProps = options.properties.filter(\n (property) =>\n ts.isPropertyAssignment(property) &&\n ts.isIdentifier(property.name) &&\n !TAG_KEYS.has(property.name.text)\n );\n if (directProps.length > 0) {\n propsExpr = ts.factory.createObjectLiteralExpression([\n ...(propsExpr && ts.isObjectLiteralExpression(propsExpr)\n ? propsExpr.properties\n : []),\n ...directProps,\n ]);\n }\n }\n }\n\n if (!ts.isStringLiteral(tagExpr)) {\n throw mpError(classSource.filePath, '元素标签必须是字符串字面量');\n }\n return compileElement(\n context,\n classSource,\n tagExpr.text,\n propsExpr,\n childrenExpr,\n listenersExpr,\n directionsExpr,\n env,\n depth\n );\n}\n\nfunction compileElement(\n context: CompileContext,\n classSource: ClassSource,\n tagName: string,\n propsExpr: tsTypes.Expression | undefined,\n childrenExpr: tsTypes.Expression | undefined,\n listenersExpr: tsTypes.Expression | undefined,\n directionsExpr: tsTypes.Expression | undefined,\n env: TemplateEnv,\n depth: number\n): string[] {\n const { ts } = context;\n const wxmlTag = TAG_MAP[tagName];\n if (!wxmlTag) {\n throw mpError(\n classSource.filePath,\n `不支持的 HTML 标签 \"${tagName}\"(WXML 仅支持基础组件)`\n );\n }\n\n const attrs: string[] = [...env.extraAttrs];\n\n if (propsExpr !== undefined) {\n if (!ts.isObjectLiteralExpression(propsExpr)) {\n throw mpError(classSource.filePath, `元素 props 必须是对象字面量`);\n }\n for (const property of propsExpr.properties) {\n if (\n !ts.isPropertyAssignment(property) ||\n !ts.isIdentifier(property.name)\n ) {\n throw mpError(classSource.filePath, `元素 props 只支持静态属性名`);\n }\n const key = property.name.text;\n const value = property.initializer;\n if (key === 'key') {\n // key 仅用于 DOM diff,小程序无对应属性\n continue;\n }\n if (key === 'class' || key === 'className') {\n attrs.push(compileClassAttr(context, classSource, value, env));\n continue;\n }\n if (key === 'style') {\n attrs.push(compileStyleAttr(context, classSource, value, env));\n continue;\n }\n if (key === 'slot') {\n attrs.push(\n `slot=\"${compileLiteralString(context, classSource, value, 'slot 名称')}\"`\n );\n continue;\n }\n if (isEventProp(key)) {\n const event = eventNameFromProp(key);\n attrs.push(compileListener(context, classSource, event, value, env));\n continue;\n }\n attrs.push(compileGenericAttr(context, classSource, key, value, env));\n }\n }\n\n if (listenersExpr !== undefined) {\n if (!ts.isObjectLiteralExpression(listenersExpr)) {\n throw mpError(classSource.filePath, 'listeners 必须是对象字面量');\n }\n for (const property of listenersExpr.properties) {\n if (\n !ts.isPropertyAssignment(property) ||\n !ts.isIdentifier(property.name)\n ) {\n throw mpError(classSource.filePath, 'listeners 只支持静态事件名');\n }\n const event = property.name.text.split('.')[0];\n const hasModifiers = property.name.text !== event;\n if (hasModifiers) {\n warn(\n context,\n `${classSource.filePath}: 事件修饰符 \"${property.name.text}\" 在小程序中不生效`\n );\n }\n attrs.push(\n compileListener(context, classSource, event, property.initializer, env)\n );\n }\n }\n\n if (directionsExpr !== undefined) {\n if (!ts.isObjectLiteralExpression(directionsExpr)) {\n throw mpError(classSource.filePath, 'directions 必须是对象字面量');\n }\n const ifExpr = objectProperty(ts, directionsExpr, 'if');\n if (ifExpr) {\n const folded = foldExpression(ts, ifExpr, env.scope.consts);\n if (folded === false) {\n return [];\n }\n if (folded !== true) {\n attrs.push(\n `${context.dialect.directivePrefix}if=\"{{${toBinding(bindingContext(context, classSource, env), ifExpr)}}}\"`\n );\n }\n }\n const showExpr = objectProperty(ts, directionsExpr, 'show');\n if (showExpr) {\n const folded = foldExpression(ts, showExpr, env.scope.consts);\n if (folded === false) {\n attrs.push('hidden');\n } else if (folded !== true) {\n const binding = toBinding(\n bindingContext(context, classSource, env),\n showExpr\n );\n attrs.push(`hidden=\"{{!(${binding})}}\"`);\n }\n }\n if (objectProperty(ts, directionsExpr, 'model')) {\n throw mpError(\n classSource.filePath,\n 'directions.model 双向绑定暂不支持编译到小程序,请改用 value + bindinput'\n );\n }\n }\n\n const openTag =\n attrs.length > 0 ? `<${wxmlTag} ${attrs.join(' ')}>` : `<${wxmlTag}>`;\n const lines = [indent(env.indent) + openTag];\n const childLines = buildNodeLines(\n context,\n classSource,\n childrenExpr ?? ts.factory.createArrayLiteralExpression([]),\n {\n ...env,\n indent: env.indent + 1,\n },\n depth + 1\n );\n lines.push(...childLines);\n lines.push(indent(env.indent) + `</${wxmlTag}>`);\n return lines;\n}\n\nfunction compileConditional(\n context: CompileContext,\n classSource: ClassSource,\n node: tsTypes.ConditionalExpression,\n env: TemplateEnv,\n depth: number\n): string[] {\n const condition = toBinding(\n bindingContext(context, classSource, env),\n node.condition\n );\n const whenTrue = buildNodeLines(\n context,\n classSource,\n node.whenTrue,\n env,\n depth + 1\n );\n const whenFalse = buildNodeLines(\n context,\n classSource,\n node.whenFalse,\n env,\n depth + 1\n );\n const lines = [indent(env.indent) + `<block ${context.dialect.directivePrefix}if=\"{{${condition}}}\">`];\n lines.push(...whenTrue.map((line) => indent(env.indent + 1) + line));\n lines.push(indent(env.indent) + '</block>');\n if (whenFalse.length > 0) {\n lines.push(indent(env.indent) + `<block ${context.dialect.directivePrefix}else>`);\n lines.push(...whenFalse.map((line) => indent(env.indent + 1) + line));\n lines.push(indent(env.indent) + '</block>');\n }\n return lines;\n}\n\nfunction compileLogicalAnd(\n context: CompileContext,\n classSource: ClassSource,\n node: tsTypes.BinaryExpression,\n env: TemplateEnv,\n depth: number\n): string[] {\n const condition = toBinding(\n bindingContext(context, classSource, env),\n node.left\n );\n const inner = buildNodeLines(\n context,\n classSource,\n node.right,\n env,\n depth + 1\n );\n return [\n indent(env.indent) + `<block ${context.dialect.directivePrefix}if=\"{{${condition}}}\">`,\n ...inner.map((line) => indent(env.indent + 1) + line),\n indent(env.indent) + '</block>',\n ];\n}\n\nfunction compileEach(\n context: CompileContext,\n classSource: ClassSource,\n node: tsTypes.CallExpression,\n env: TemplateEnv,\n depth: number\n): string[] {\n const { ts } = context;\n const [itemsExpr, renderExpr, keyExpr] = node.arguments;\n if (!itemsExpr || !renderExpr) {\n throw mpError(classSource.filePath, 'each(items, render, key) 缺少参数');\n }\n if (!ts.isArrowFunction(renderExpr)) {\n throw mpError(classSource.filePath, 'each 的 render 参数必须是箭头函数');\n }\n\n const paramNames: string[] = [];\n for (const parameter of renderExpr.parameters) {\n if (!ts.isIdentifier(parameter.name)) {\n throw mpError(\n classSource.filePath,\n 'each 的参数必须是 (item, index) 标识符'\n );\n }\n paramNames.push(parameter.name.text);\n }\n if (paramNames.length > 2) {\n throw mpError(classSource.filePath, 'each 最多接受 (item, index) 两个参数');\n }\n\n const itemsBinding = toBinding(\n bindingContext(context, classSource, env),\n itemsExpr\n );\n const itemName = paramNames[0] ?? 'item';\n const indexName = paramNames[1] ?? 'index';\n const childScope: BindingScope = {\n ...env.scope,\n params: new Set([...env.scope.params, itemName, indexName]),\n };\n\n let keyAttr = '';\n if (keyExpr) {\n const keyBinding = eachKeyBinding(\n context,\n classSource,\n keyExpr,\n itemName,\n indexName\n );\n if (keyBinding) {\n keyAttr = ` ${context.dialect.directivePrefix}key=\"${keyBinding}\"`;\n }\n }\n const inner = buildNodeLines(\n context,\n classSource,\n renderExpr.body,\n {\n ...env,\n scope: childScope,\n indent: env.indent + 1,\n },\n depth + 1\n );\n\n return [\n indent(env.indent) +\n `<block ${context.dialect.directivePrefix}for=\"{{${itemsBinding}}}\" ${context.dialect.directivePrefix}for-item=\"${itemName}\" ${context.dialect.directivePrefix}for-index=\"${indexName}\"${keyAttr}>`,\n ...inner,\n indent(env.indent) + '</block>',\n ];\n}\n\nfunction eachKeyBinding(\n context: CompileContext,\n classSource: ClassSource,\n keyExpr: tsTypes.Node,\n itemName: string,\n indexName: string\n): string | undefined {\n const { ts } = context;\n keyExpr = unwrapParentheses(ts, keyExpr);\n // 框架签名 each(items, render, key),key 是 (item) => item.xxx 箭头函数\n if (ts.isArrowFunction(keyExpr)) {\n const body = arrowBodyExpression(ts, keyExpr);\n if (body === undefined) {\n throw mpError(\n classSource.filePath,\n 'each 的 key 必须是 (item) => item.xxx 或 (item, index) => index'\n );\n }\n keyExpr = body;\n }\n if (ts.isIdentifier(keyExpr)) {\n if (keyExpr.text === indexName) {\n return undefined;\n }\n if (keyExpr.text === itemName) {\n throw mpError(\n classSource.filePath,\n '列表 key 不能直接使用 item,请取 item 的成员'\n );\n }\n }\n if (\n ts.isPropertyAccessExpression(keyExpr) &&\n ts.isIdentifier(keyExpr.expression)\n ) {\n const base = keyExpr.expression.text;\n if (base === itemName) {\n return keyExpr.name.text;\n }\n }\n const nested = eachKeyPath(ts, keyExpr, itemName);\n if (nested) {\n return nested;\n }\n throw mpError(\n classSource.filePath,\n 'each 的 key 必须是 (item) => item.xxx 或 (item, index) => index'\n );\n}\n\nfunction arrowBodyExpression(\n ts: typeof tsTypes,\n arrow: tsTypes.ArrowFunction\n): tsTypes.Expression | undefined {\n const body = arrow.body;\n if (ts.isBlock(body)) {\n const statements = body.statements.filter(\n (statement) => !ts.isEmptyStatement(statement)\n );\n if (\n statements.length === 1 &&\n ts.isReturnStatement(statements[0]) &&\n statements[0].expression\n ) {\n return statements[0].expression;\n }\n return undefined;\n }\n return body;\n}\n\nfunction eachKeyPath(\n ts: typeof tsTypes,\n node: tsTypes.Node,\n itemName: string\n): string | undefined {\n node = unwrapParentheses(ts, node);\n if (!ts.isPropertyAccessExpression(node)) {\n return undefined;\n }\n let current: tsTypes.Expression = node;\n const parts: string[] = [];\n while (ts.isPropertyAccessExpression(current)) {\n parts.unshift(current.name.text);\n current = current.expression;\n }\n if (ts.isIdentifier(current) && current.text === itemName) {\n return parts.join('.');\n }\n return undefined;\n}\n\nfunction compileComponentCall(\n context: CompileContext,\n classSource: ClassSource,\n node: tsTypes.CallExpression,\n env: TemplateEnv,\n depth: number\n): string[] {\n const { ts } = context;\n const first = unwrapParentheses(ts, node.arguments[0]);\n // 对象形态:createComponent({ component, props, children, emitters, directions })\n if (\n ts.isObjectLiteralExpression(first) &&\n objectProperty(ts, first, 'component')\n ) {\n return compileComponentObject(context, classSource, first, env, depth);\n }\n const [classExpr, propsExpr, childrenExpr] = node.arguments;\n if (!classExpr) {\n throw mpError(classSource.filePath, 'createComponent 缺少组件类参数');\n }\n const directionsExpr = node.arguments[4];\n return compileComponent(\n context,\n classSource,\n classExpr,\n propsExpr,\n childrenExpr,\n undefined,\n directionsExpr,\n env,\n depth\n );\n}\n\nfunction compileComponentObject(\n context: CompileContext,\n classSource: ClassSource,\n node: tsTypes.ObjectLiteralExpression,\n env: TemplateEnv,\n depth: number\n): string[] {\n return compileComponent(\n context,\n classSource,\n objectProperty(context.ts, node, 'component')!,\n objectProperty(context.ts, node, 'props'),\n objectProperty(context.ts, node, 'children'),\n objectProperty(context.ts, node, 'emitters'),\n objectProperty(context.ts, node, 'directions'),\n env,\n depth\n );\n}\n\nfunction compileComponent(\n context: CompileContext,\n classSource: ClassSource,\n classExpr: tsTypes.Expression,\n propsExpr: tsTypes.Expression | undefined,\n childrenExpr: tsTypes.Expression | undefined,\n emittersExpr: tsTypes.Expression | undefined,\n directionsExpr: tsTypes.Expression | undefined,\n env: TemplateEnv,\n depth: number\n): string[] {\n const { ts } = context;\n const target = resolveClassReference(context, classSource, classExpr);\n if (!isComponentSubclass(context, target)) {\n throw mpError(\n classSource.filePath,\n `createComponent 只接受 Component 子类: ${target.className}`\n );\n }\n const tag = kebabCase(target.className);\n env.builder.usedComponents.set(tag, target);\n\n const attrs: string[] = [...env.extraAttrs];\n const callSiteProps: Record<string, string> = {};\n\n if (propsExpr !== undefined) {\n if (!ts.isObjectLiteralExpression(propsExpr)) {\n throw mpError(\n classSource.filePath,\n 'createComponent 的 props 必须是对象字面量'\n );\n }\n for (const property of propsExpr.properties) {\n if (\n !ts.isPropertyAssignment(property) ||\n !ts.isIdentifier(property.name)\n ) {\n throw mpError(classSource.filePath, '组件 props 只支持静态属性名');\n }\n const key = property.name.text;\n const value = property.initializer;\n if (ts.isArrowFunction(value) || ts.isFunctionExpression(value)) {\n throw mpError(\n classSource.filePath,\n `组件 props 传函数(${key})暂不支持编译到小程序,请改用 emitters + this.emit 模式`\n );\n }\n callSiteProps[key] = inferPropType(context, classSource, value, env);\n const folded = foldExpression(ts, value, env.scope.consts);\n if (folded !== undefined && folded !== null) {\n attrs.push(`${key}=\"${escapeAttr(literalToString(folded))}\"`);\n } else {\n const binding = toBinding(\n bindingContext(context, classSource, env),\n value\n );\n attrs.push(`${key}=\"{{${binding}}}\"`);\n }\n }\n const existing = context.callSites.get(tag) ?? [];\n existing.push(callSiteProps);\n context.callSites.set(tag, existing);\n }\n\n if (emittersExpr !== undefined) {\n if (!ts.isObjectLiteralExpression(emittersExpr)) {\n throw mpError(classSource.filePath, 'emitters 必须是对象字面量');\n }\n for (const property of emittersExpr.properties) {\n if (\n !ts.isPropertyAssignment(property) ||\n !ts.isIdentifier(property.name)\n ) {\n throw mpError(classSource.filePath, 'emitters 只支持静态事件名');\n }\n const usage = compileEmitterHandler(\n context,\n classSource,\n property.initializer\n );\n if (!usage) {\n throw mpError(\n classSource.filePath,\n 'emitters 处理器只支持 () => this.method() 或 (value) => this.method(value)'\n );\n }\n usage.event = property.name.text;\n env.builder.emitters.push(usage);\n attrs.push(\n `bind:${property.name.text}=\"__transone_emitter_${property.name.text}\"`\n );\n }\n }\n\n if (directionsExpr !== undefined) {\n if (!ts.isObjectLiteralExpression(directionsExpr)) {\n throw mpError(classSource.filePath, 'directions 必须是对象字面量');\n }\n const ifExpr = objectProperty(ts, directionsExpr, 'if');\n if (ifExpr) {\n const folded = foldExpression(ts, ifExpr, env.scope.consts);\n if (folded === false) {\n return [];\n }\n if (folded !== true) {\n attrs.push(\n `${context.dialect.directivePrefix}if=\"{{${toBinding(bindingContext(context, classSource, env), ifExpr)}}}\"`\n );\n }\n }\n }\n\n const openTag = attrs.length > 0 ? `<${tag} ${attrs.join(' ')}>` : `<${tag}>`;\n const lines = [indent(env.indent) + openTag];\n const childLines = buildNodeLines(\n context,\n classSource,\n childrenExpr ?? ts.factory.createArrayLiteralExpression([]),\n {\n ...env,\n indent: env.indent + 1,\n },\n depth + 1\n );\n lines.push(...childLines);\n lines.push(indent(env.indent) + `</${tag}>`);\n return lines;\n}\n\nfunction compileSlot(\n context: CompileContext,\n classSource: ClassSource,\n node: tsTypes.CallExpression,\n env: TemplateEnv\n): string[] {\n const nameExpr = node.arguments[0];\n if (!nameExpr) {\n return [indent(env.indent) + '<slot/>'];\n }\n const name = compileLiteralString(\n context,\n classSource,\n nameExpr,\n 'slot 名称'\n );\n return [indent(env.indent) + `<slot name=\"${name}\"/>`];\n}\n\nfunction compileListener(\n context: CompileContext,\n classSource: ClassSource,\n eventName: string,\n handlerExpr: tsTypes.Expression,\n env: TemplateEnv\n): string {\n const wxmlEvent = EVENT_MAP[eventName];\n if (!wxmlEvent) {\n throw mpError(\n classSource.filePath,\n `不支持的小程序事件 \"${eventName}\"(支持: ${Object.keys(EVENT_MAP).join('/')})`\n );\n }\n const method = compileHandlerMethod(context, classSource, handlerExpr);\n env.builder.handlers.add(method);\n return `${context.dialect.bindEvent(wxmlEvent)}=\"${method}\"`;\n}\n\nfunction compileHandlerMethod(\n context: CompileContext,\n classSource: ClassSource,\n handlerExpr: tsTypes.Expression\n): string {\n const { ts } = context;\n handlerExpr = unwrapParentheses(ts, handlerExpr);\n\n if (\n ts.isPropertyAccessExpression(handlerExpr) &&\n isThisExpression(ts, handlerExpr.expression)\n ) {\n return handlerExpr.name.text;\n }\n\n if (ts.isArrowFunction(handlerExpr)) {\n const call = singleMethodCall(ts, handlerExpr.body);\n if (call && call.args.length === 0) {\n return call.method;\n }\n // (e) => this.method(e):透传事件对象,方法里通过 e.currentTarget.dataset 取数;\n // 实参上的 TS 类型断言(e as TapEvent)不影响运行时语义,直接剥掉再匹配\n const arg =\n call && call.args.length === 1\n ? unwrapTypeAssertions(ts, call.args[0])\n : undefined;\n if (\n call &&\n call.args.length === 1 &&\n handlerExpr.parameters.length === 1 &&\n ts.isIdentifier(handlerExpr.parameters[0].name) &&\n arg !== undefined &&\n ts.isIdentifier(arg) &&\n handlerExpr.parameters[0].name.text === arg.text\n ) {\n return call.method;\n }\n }\n throw mpError(\n classSource.filePath,\n '事件处理器必须是 () => this.method()、this.method 或 (e) => this.method(e) 形式'\n );\n}\n\nfunction compileEmitterHandler(\n context: CompileContext,\n _classSource: ClassSource,\n handlerExpr: tsTypes.Expression\n): EmitterUsage | undefined {\n const { ts } = context;\n handlerExpr = unwrapParentheses(ts, handlerExpr);\n\n if (\n ts.isPropertyAccessExpression(handlerExpr) &&\n isThisExpression(ts, handlerExpr.expression)\n ) {\n return { event: 'pending', method: handlerExpr.name.text, passArgs: true };\n }\n if (!ts.isArrowFunction(handlerExpr)) {\n return undefined;\n }\n const call = singleMethodCall(ts, handlerExpr.body);\n if (!call) {\n return undefined;\n }\n if (call.args.length === 0) {\n return { event: 'pending', method: call.method, passArgs: false };\n }\n const arg =\n call.args.length === 1 ? unwrapTypeAssertions(ts, call.args[0]) : undefined;\n if (\n call.args.length === 1 &&\n handlerExpr.parameters.length === 1 &&\n ts.isIdentifier(handlerExpr.parameters[0].name) &&\n arg !== undefined &&\n ts.isIdentifier(arg) &&\n handlerExpr.parameters[0].name.text === arg.text\n ) {\n return { event: 'pending', method: call.method, passArgs: true };\n }\n return undefined;\n}\n\nfunction singleMethodCall(\n ts: typeof tsTypes,\n body: tsTypes.ConciseBody\n): { method: string; args: tsTypes.NodeArray<tsTypes.Expression> } | undefined {\n let callExpr: tsTypes.CallExpression | undefined;\n if (ts.isCallExpression(body)) {\n callExpr = body;\n } else if (ts.isBlock(body)) {\n const statements = body.statements.filter(\n (statement) => !ts.isEmptyStatement(statement)\n );\n if (statements.length !== 1 || !ts.isExpressionStatement(statements[0])) {\n return undefined;\n }\n const expression = statements[0].expression;\n if (!ts.isCallExpression(expression)) {\n return undefined;\n }\n callExpr = expression;\n } else {\n return undefined;\n }\n const callee = callExpr.expression;\n if (\n !ts.isPropertyAccessExpression(callee) ||\n !isThisExpression(ts, callee.expression)\n ) {\n return undefined;\n }\n return { method: callee.name.text, args: callExpr.arguments };\n}\n\n/** 剥掉表达式上的 TS 类型断言(as T / <T> / 非空断言),用于参数透传匹配。 */\nfunction unwrapTypeAssertions(\n ts: typeof tsTypes,\n expression: tsTypes.Node\n): tsTypes.Node {\n let node = expression;\n for (;;) {\n if (ts.isAsExpression(node)) {\n node = node.expression;\n continue;\n }\n if (ts.isTypeAssertionExpression(node)) {\n node = node.expression;\n continue;\n }\n if (ts.isNonNullExpression(node)) {\n node = node.expression;\n continue;\n }\n return node;\n }\n}\n\nfunction compileClassAttr(\n context: CompileContext,\n classSource: ClassSource,\n value: tsTypes.Expression,\n env: TemplateEnv\n): string {\n const { ts } = context;\n const folded = foldExpression(ts, value, env.scope.consts);\n if (typeof folded === 'string') {\n // 静态 class 命中 hover 样式时挂 hover-class(WXSS 无 :hover 伪类)\n const hoverClass = hoverClassName(folded, env.hoverSelectors);\n return hoverClass\n ? `class=\"${escapeAttr(folded)}\" hover-class=\"${hoverClass}\"`\n : `class=\"${escapeAttr(folded)}\"`;\n }\n // 折叠结果为 null 表示显式空 class(如某个 const 值为 null);折叠失败\n // (依赖 each 参数/state 的动态表达式)则回退为模板绑定。\n if (folded === null) {\n return '';\n }\n const text = rawTemplateText(ts, value);\n if (text !== undefined) {\n const hoverClass = hoverClassName(text, env.hoverSelectors);\n return hoverClass\n ? `class=\"${escapeAttr(text)}\" hover-class=\"${hoverClass}\"`\n : `class=\"${escapeAttr(text)}\"`;\n }\n return `class=\"{{${toBinding(bindingContext(context, classSource, env), value)}}}\"`;\n}\n\n/** 选择器 '.card' 命中 hover 样式时,返回微信 hover-class 类名('card-hover')。 */\nfunction hoverClassName(\n className: string,\n hoverSelectors: Set<string>\n): string | undefined {\n for (const single of className.split(/\\s+/)) {\n if (single === '') {\n continue;\n }\n if (hoverSelectors.has(single) || hoverSelectors.has(`.${single}`)) {\n return `${single.replace(/^\\./, '')}-hover`;\n }\n }\n return undefined;\n}\n\nfunction compileStyleAttr(\n context: CompileContext,\n classSource: ClassSource,\n value: tsTypes.Expression,\n env: TemplateEnv\n): string {\n const { ts } = context;\n const options = unwrapParentheses(ts, value);\n if (!ts.isObjectLiteralExpression(options)) {\n throw mpError(classSource.filePath, 'style 属性必须是对象字面量');\n }\n const declarations: string[] = [];\n for (const property of options.properties) {\n if (!ts.isPropertyAssignment(property) || !ts.isIdentifier(property.name)) {\n throw mpError(classSource.filePath, 'style 属性只支持静态键');\n }\n const cssKey = property.name.text.replace(/([A-Z])/g, '-$1').toLowerCase();\n const folded = foldExpression(ts, property.initializer, env.scope.consts);\n if (typeof folded !== 'string' && typeof folded !== 'number') {\n throw mpError(\n classSource.filePath,\n `style 属性值只支持静态字面量: ${property.name.text}`\n );\n }\n declarations.push(`${cssKey}: ${String(folded)};`);\n }\n return `style=\"${escapeAttr(declarations.join(' '))}\"`;\n}\n\nfunction compileGenericAttr(\n context: CompileContext,\n classSource: ClassSource,\n key: string,\n value: tsTypes.Expression,\n env: TemplateEnv\n): string {\n const { ts } = context;\n const attrName = wxmlAttrName(key);\n const folded = foldExpression(ts, value, env.scope.consts);\n if (folded !== undefined) {\n if (folded === false || folded === null) {\n return '';\n }\n if (folded === true) {\n return attrName;\n }\n return `${attrName}=\"${escapeAttr(literalToString(folded))}\"`;\n }\n const text = rawTemplateText(ts, value);\n if (text !== undefined) {\n return `${attrName}=\"${escapeAttr(text)}\"`;\n }\n return `${attrName}=\"{{${toBinding(bindingContext(context, classSource, env), value)}}}\"`;\n}\n\n/** 需要 kebab-case 输出的微信组件属性(如 scrollX -> scroll-x)。 */\nconst KEBAB_ATTRS: Record<string, string> = {\n scrollX: 'scroll-x',\n scrollY: 'scroll-y',\n scrollIntoView: 'scroll-into-view',\n scrollWithAnimation: 'scroll-with-animation',\n scrollAnchoring: 'scroll-anchoring',\n enableFlex: 'enable-flex',\n enableScroll: 'enable-scroll',\n enableZoom: 'enable-zoom',\n enablePassive: 'enable-passive',\n autoFocus: 'auto-focus',\n confirmType: 'confirm-type',\n confirmHold: 'confirm-hold',\n cursorSpacing: 'cursor-spacing',\n selectionStart: 'selection-start',\n selectionEnd: 'selection-end',\n showConfirmBar: 'show-confirm-bar',\n adjustPosition: 'adjust-position',\n holdKeyboard: 'hold-keyboard',\n disableDefaultPadding: 'disable-default-padding',\n disableAutoPush: 'disable-auto-push',\n disableBeforeInput: 'disable-before-input',\n showMarker: 'show-marker',\n enablePublish: 'enable-publish',\n markerCluster: 'marker-cluster',\n showLocation: 'show-location',\n showCompass: 'show-compass',\n enableSatellite: 'enable-satellite',\n enableTraffic: 'enable-traffic',\n enableBuilding: 'enable-building',\n enableRotate: 'enable-rotate',\n enableOverlooking: 'enable-overlooking',\n subKey: 'sub-key',\n enableLazy: 'enable-lazy',\n showMenuByLongpress: 'show-menu-by-longpress',\n openType: 'open-type',\n formType: 'form-type',\n unitId: 'unit-id',\n hoverClass: 'hover-class',\n hoverStartTime: 'hover-start-time',\n hoverStayTime: 'hover-stay-time',\n hoverStopPropagation: 'hover-stop-propagation',\n plain: 'plain',\n loading: 'loading',\n disabled: 'disabled',\n size: 'size',\n};\n\n/**\n * 属性名转 WXML:href -> url;data 前缀(dataId)转 data-id(dataset);\n * 白名单内 camelCase 转 kebab(scrollX -> scroll-x);其余原样输出。\n */\nfunction wxmlAttrName(key: string): string {\n if (key === 'href') {\n return 'url';\n }\n if (key.startsWith('data') && key.length > 4) {\n return `data${key\n .slice(4)\n .replace(/([A-Z])/g, '-$1')\n .toLowerCase()}`;\n }\n return KEBAB_ATTRS[key] ?? key;\n}\n\nfunction compileLiteralString(\n context: CompileContext,\n classSource: ClassSource,\n value: tsTypes.Expression,\n what: string\n): string {\n const { ts } = context;\n const folded = foldExpression(ts, value, new Map());\n if (typeof folded !== 'string') {\n throw mpError(classSource.filePath, `${what}必须是字符串字面量`);\n }\n return folded;\n}\n\nfunction textContent(\n context: CompileContext,\n classSource: ClassSource,\n node: tsTypes.Node,\n env: TemplateEnv\n): string {\n const { ts } = context;\n node = unwrapParentheses(ts, node);\n if (ts.isStringLiteral(node)) {\n return escapeXml(node.text);\n }\n if (ts.isNoSubstitutionTemplateLiteral(node)) {\n return node.text.includes('{{') ? node.text : escapeXml(node.text);\n }\n if (ts.isTemplateExpression(node)) {\n return `{{${toBinding(bindingContext(context, classSource, env), node)}}}`;\n }\n if (ts.isIdentifier(node)) {\n if (env.scope.params.has(node.text)) {\n return `{{${node.text}}}`;\n }\n const replacement = resolveIdentifierExpression(\n context,\n classSource,\n node,\n env\n );\n if (replacement) {\n return textContent(context, classSource, replacement, env);\n }\n throw mpError(classSource.filePath, `无法解析模板标识符 \"${node.text}\"`);\n }\n if (\n ts.isPropertyAccessExpression(node) ||\n ts.isElementAccessExpression(node)\n ) {\n return `{{${toBinding(bindingContext(context, classSource, env), node)}}}`;\n }\n throw mpError(\n classSource.filePath,\n `不支持的文本节点: ${node.getText().slice(0, 60)}`\n );\n}\n\nfunction isTextNode(ts: typeof tsTypes, node: tsTypes.Node): boolean {\n return (\n ts.isStringLiteral(node) ||\n ts.isNoSubstitutionTemplateLiteral(node) ||\n ts.isTemplateExpression(node)\n );\n}\n\nfunction resolveIdentifierExpression(\n _context: CompileContext,\n _classSource: ClassSource,\n node: tsTypes.Identifier,\n env: TemplateEnv\n): tsTypes.Expression | undefined {\n if (env.scope.locals.has(node.text)) {\n return env.scope.locals.get(node.text)!;\n }\n if (env.scope.consts.has(node.text)) {\n return env.scope.consts.get(node.text)!;\n }\n return undefined;\n}\n\nfunction bindingContext(\n context: CompileContext,\n classSource: ClassSource,\n env: TemplateEnv\n) {\n return {\n ts: context.ts,\n scope: env.scope,\n filePath: classSource.filePath,\n onProp: (name: string) => env.builder.propsReferenced.add(name),\n };\n}\n\nfunction callName(\n ts: typeof tsTypes,\n expression: tsTypes.Expression\n): string | undefined {\n expression = unwrapParentheses(ts, expression);\n if (ts.isIdentifier(expression)) {\n return expression.text;\n }\n if (ts.isPropertyAccessExpression(expression)) {\n return expression.name.text;\n }\n return undefined;\n}\n\nfunction objectProperty(\n ts: typeof tsTypes,\n object: tsTypes.ObjectLiteralExpression,\n key: string\n): tsTypes.Expression | undefined {\n for (const property of object.properties) {\n if (\n ts.isPropertyAssignment(property) &&\n ts.isIdentifier(property.name) &&\n property.name.text === key\n ) {\n return property.initializer;\n }\n }\n return undefined;\n}\n\nfunction collectModuleConsts(\n context: CompileContext,\n classSource: ClassSource\n): Map<string, tsTypes.Expression> {\n const consts = new Map<string, tsTypes.Expression>();\n for (const statement of classSource.source.statements) {\n if (!context.ts.isVariableStatement(statement)) {\n continue;\n }\n const isConst =\n statement.declarationList.flags & context.ts.NodeFlags.Const;\n if (!isConst) {\n continue;\n }\n for (const declaration of statement.declarationList.declarations) {\n if (\n context.ts.isIdentifier(declaration.name) &&\n declaration.initializer\n ) {\n consts.set(declaration.name.text, declaration.initializer);\n }\n }\n }\n return consts;\n}\n\n/** 收集从 transone 导入的本地名 -> 原始导出名(处理别名)。 */\nfunction collectFactoryOrigins(\n ts: typeof tsTypes,\n source: tsTypes.SourceFile\n): Map<string, string> {\n const origins = new Map<string, string>();\n for (const statement of source.statements) {\n if (!ts.isImportDeclaration(statement)) {\n continue;\n }\n const specifier = statement.moduleSpecifier.getText().replace(/['\"]/g, '');\n if (!specifier.includes('transone')) {\n continue;\n }\n const bindings = statement.importClause?.namedBindings;\n if (!bindings || !ts.isNamedImports(bindings)) {\n continue;\n }\n for (const element of bindings.elements) {\n const local = element.name.text;\n const original = element.propertyName?.text ?? local;\n if (ELEMENT_FACTORIES.has(original) || SPECIAL_CALLS.has(original)) {\n origins.set(local, original);\n }\n }\n }\n return origins;\n}\n\nfunction inferPropType(\n context: CompileContext,\n _classSource: ClassSource,\n value: tsTypes.Expression,\n env: TemplateEnv\n): string {\n const { ts } = context;\n const folded = foldExpression(ts, value, env.scope.consts);\n if (typeof folded === 'string') {\n return 'String';\n }\n if (typeof folded === 'number') {\n return 'Number';\n }\n if (typeof folded === 'boolean') {\n return 'Boolean';\n }\n if (Array.isArray(folded)) {\n return 'Array';\n }\n if (folded !== undefined && typeof folded === 'object') {\n return 'Object';\n }\n return 'null';\n}\n\nfunction rawTemplateText(\n ts: typeof tsTypes,\n node: tsTypes.Node\n): string | undefined {\n node = unwrapParentheses(ts, node);\n if (ts.isNoSubstitutionTemplateLiteral(node) && node.text.includes('{{')) {\n return node.text;\n }\n return undefined;\n}\n\nfunction literalToString(value: FoldedValue): string {\n return typeof value === 'string' ? value : String(value);\n}\n\nfunction kebabCase(name: string): string {\n const kebab = name\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/[^A-Za-z0-9-]/g, '')\n .toLowerCase();\n if (!kebab) {\n throw new Error(`无法从类名 \"${name}\" 生成组件标签名`);\n }\n return kebab;\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n}\n\nfunction escapeAttr(value: string): string {\n return escapeXml(value).replace(/\"/g, '&quot;');\n}\n\nfunction indent(level: number): string {\n return ' '.repeat(level);\n}\n\nexport function findMethod(\n context: CompileContext,\n classSource: ClassSource,\n name: string\n): tsTypes.MethodDeclaration | undefined {\n const { ts } = context;\n return classSource.declaration.members.find(\n (member): member is tsTypes.MethodDeclaration =>\n ts.isMethodDeclaration(member) && member.name.getText() === name\n );\n}\n\nexport { kebabCase };\n",
13
+ "import type * as tsTypes from 'typescript';\nimport { foldExpression, isThisExpression } from './fold';\nimport { mpError } from './errors';\nimport { ClassSource, CompileContext } from './types';\nimport { findMethod } from './wxml';\n\nexport interface CompiledStyles {\n /** 本单元作用域内的 WXSS(class 等选择器)。 */\n style: string;\n /** 全局样式(body 选择器,页面单元会合并进 app.wxss)。 */\n global: string;\n /** 存在 hover 样式的选择器(如 '.card'),模板据此生成 hover-class。 */\n hoverSelectors: Set<string>;\n}\n\ninterface StyleEntry {\n selector: string;\n properties: Record<string, string | number>;\n hover?: Record<string, string | number>;\n media?: Record<string, Record<string, string | number>>;\n}\n\n/** 无单位合法的 CSS 属性:数字值不加 px/rpx。 */\nconst UNITLESS_PROPERTIES = new Set([\n 'opacity',\n 'zIndex',\n 'fontWeight',\n 'lineHeight',\n 'flex',\n 'flexGrow',\n 'flexShrink',\n 'order',\n 'zoom',\n 'scale',\n 'transform',\n 'animationIterationCount',\n 'columnCount',\n 'fontSizeAdjust',\n]);\n\n/**\n * 编译 initStyles():只支持\n * `this.styleManager.addStyle('name', { selector, properties, media, hover })`\n * 字面量调用;body 选择器归入全局样式(小程序用 page 选择器)。\n */\nexport function compileStyles(\n context: CompileContext,\n classSource: ClassSource\n): CompiledStyles {\n const { ts } = context;\n const method = findMethod(context, classSource, 'initStyles');\n if (!method?.body) {\n return { style: '', global: '', hoverSelectors: new Set() };\n }\n\n const consts = collectModuleConsts(context, classSource);\n const entries: StyleEntry[] = [];\n for (const statement of method.body.statements) {\n if (ts.isEmptyStatement(statement)) {\n continue;\n }\n if (!ts.isExpressionStatement(statement)) {\n throw mpError(\n classSource.filePath,\n 'initStyles() 只支持 this.styleManager.addStyle(...) 调用'\n );\n }\n const expression = statement.expression;\n const entry = addStyleEntry(context, classSource, expression, consts);\n if (entry) {\n entries.push(entry);\n }\n }\n\n const local: string[] = [];\n const global: string[] = [];\n const hoverSelectors = new Set<string>();\n for (const entry of entries) {\n const target = entry.selector === 'body' ? global : local;\n target.push(renderStyle(entry, context.lengthUnit));\n if (entry.hover && entry.selector !== 'body') {\n hoverSelectors.add(entry.selector);\n }\n }\n\n return { style: local.join('\\n'), global: global.join('\\n'), hoverSelectors };\n}\n\nfunction addStyleEntry(\n context: CompileContext,\n classSource: ClassSource,\n expression: tsTypes.Expression,\n consts: Map<string, tsTypes.Expression>\n): StyleEntry | undefined {\n const { ts } = context;\n if (!ts.isCallExpression(expression)) {\n throw mpError(\n classSource.filePath,\n 'initStyles() 只支持 this.styleManager.addStyle(...) 调用'\n );\n }\n const callee = expression.expression;\n const manager = ts.isPropertyAccessExpression(callee)\n ? callee.expression\n : undefined;\n if (\n !ts.isPropertyAccessExpression(callee) ||\n callee.name.text !== 'addStyle' ||\n !manager ||\n !ts.isPropertyAccessExpression(manager) ||\n !isThisExpression(ts, manager.expression) ||\n manager.name.text !== 'styleManager'\n ) {\n throw mpError(\n classSource.filePath,\n 'initStyles() 只支持 this.styleManager.addStyle(...) 调用'\n );\n }\n const optionsExpr = expression.arguments[1];\n if (!optionsExpr || !ts.isObjectLiteralExpression(optionsExpr)) {\n throw mpError(\n classSource.filePath,\n 'addStyle 的第二个参数必须是对象字面量'\n );\n }\n\n const selector = foldObjectString(ts, optionsExpr, 'selector', consts);\n const properties = foldObjectRecord(ts, optionsExpr, 'properties', consts);\n const hover = foldObjectRecord(ts, optionsExpr, 'hover', consts);\n const media = foldMedia(ts, optionsExpr, consts);\n if (selector === undefined || properties === undefined) {\n throw mpError(\n classSource.filePath,\n 'addStyle 需要 selector 与 properties 字面量'\n );\n }\n return {\n selector,\n properties,\n ...(hover ? { hover } : {}),\n ...(media ? { media } : {}),\n };\n}\n\nfunction foldObjectString(\n ts: typeof tsTypes,\n object: tsTypes.ObjectLiteralExpression,\n key: string,\n consts: Map<string, tsTypes.Expression>\n): string | undefined {\n const value = objectProperty(ts, object, key);\n if (!value) {\n return undefined;\n }\n const folded = foldExpression(ts, value, consts);\n return typeof folded === 'string' ? folded : undefined;\n}\n\nfunction foldObjectRecord(\n ts: typeof tsTypes,\n object: tsTypes.ObjectLiteralExpression,\n key: string,\n consts: Map<string, tsTypes.Expression>\n): Record<string, string | number> | undefined {\n const value = objectProperty(ts, object, key);\n if (!value) {\n return undefined;\n }\n if (!ts.isObjectLiteralExpression(value)) {\n return undefined;\n }\n const result: Record<string, string | number> = {};\n for (const property of value.properties) {\n if (!ts.isPropertyAssignment(property) || !ts.isIdentifier(property.name)) {\n return undefined;\n }\n const folded = foldExpression(ts, property.initializer, consts);\n if (typeof folded !== 'string' && typeof folded !== 'number') {\n return undefined;\n }\n result[property.name.text] = folded;\n }\n return result;\n}\n\nfunction foldMedia(\n ts: typeof tsTypes,\n object: tsTypes.ObjectLiteralExpression,\n consts: Map<string, tsTypes.Expression>\n): Record<string, Record<string, string | number>> | undefined {\n const value = objectProperty(ts, object, 'media');\n if (!value) {\n return undefined;\n }\n if (!ts.isObjectLiteralExpression(value)) {\n return undefined;\n }\n const result: Record<string, Record<string, string | number>> = {};\n for (const property of value.properties) {\n if (\n !ts.isPropertyAssignment(property) ||\n !ts.isStringLiteral(property.name) ||\n !ts.isObjectLiteralExpression(property.initializer)\n ) {\n return undefined;\n }\n const props: Record<string, string | number> = {};\n for (const item of property.initializer.properties) {\n if (!ts.isPropertyAssignment(item) || !ts.isIdentifier(item.name)) {\n return undefined;\n }\n const folded = foldExpression(ts, item.initializer, consts);\n if (typeof folded !== 'string' && typeof folded !== 'number') {\n return undefined;\n }\n props[item.name.text] = folded;\n }\n result[property.name.text] = props;\n }\n return result;\n}\n\nfunction renderStyle(entry: StyleEntry, lengthUnit: 'px' | 'rpx'): string {\n // WXSS 没有 body,全局样式用 page 选择器\n const selector = entry.selector === 'body' ? 'page' : entry.selector;\n const parts: string[] = [];\n parts.push(`${selector} {\\n${convertToCss(entry.properties, lengthUnit)}\\n}`);\n if (entry.hover) {\n // WXSS 不支持 :hover 伪类,输出 hover-class 样式块(.xxx-hover)\n parts.push(\n `${selector}-hover {\\n${convertToCss(entry.hover, lengthUnit)}\\n}`\n );\n }\n for (const [query, properties] of Object.entries(entry.media ?? {})) {\n parts.push(\n `@media ${query} {\\n${selector} {\\n${convertToCss(\n properties,\n lengthUnit\n )}\\n}\\n}`\n );\n }\n return parts.join('\\n');\n}\n\nfunction convertToCss(\n properties: Record<string, string | number>,\n lengthUnit: 'px' | 'rpx'\n): string {\n return Object.entries(properties)\n .map(([key, value]) => {\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n return ` ${cssKey}: ${formatValue(key, value, lengthUnit)};`;\n })\n .join('\\n');\n}\n\nfunction formatValue(\n key: string,\n value: string | number,\n lengthUnit: 'px' | 'rpx'\n): string {\n if (typeof value !== 'number') {\n return value;\n }\n // 0 与无单位属性不追加单位\n if (value === 0 || UNITLESS_PROPERTIES.has(key)) {\n return String(value);\n }\n // 数值长度默认 px;rpx 模式下按 1px=2rpx 换算(375 设计稿基准)\n return lengthUnit === 'rpx' ? `${value * 2}rpx` : `${value}px`;\n}\n\nfunction objectProperty(\n ts: typeof tsTypes,\n object: tsTypes.ObjectLiteralExpression,\n key: string\n): tsTypes.Expression | undefined {\n for (const property of object.properties) {\n if (\n ts.isPropertyAssignment(property) &&\n ts.isIdentifier(property.name) &&\n property.name.text === key\n ) {\n return property.initializer;\n }\n }\n return undefined;\n}\n\nfunction collectModuleConsts(\n context: CompileContext,\n classSource: ClassSource\n): Map<string, tsTypes.Expression> {\n const consts = new Map<string, tsTypes.Expression>();\n for (const statement of classSource.source.statements) {\n if (!context.ts.isVariableStatement(statement)) {\n continue;\n }\n const isConst =\n statement.declarationList.flags & context.ts.NodeFlags.Const;\n if (!isConst) {\n continue;\n }\n for (const declaration of statement.declarationList.declarations) {\n if (\n context.ts.isIdentifier(declaration.name) &&\n declaration.initializer\n ) {\n consts.set(declaration.name.text, declaration.initializer);\n }\n }\n }\n return consts;\n}\n",
14
+ "import type * as tsTypes from 'typescript';\nimport { foldExpression } from './fold';\nimport { mpError } from './errors';\nimport { ClassSource, CompileContext } from './types';\nimport { findMethod } from './wxml';\n\n/**\n * 编译 initState() 为小程序 data 初始值(JS 对象字面量源码)。\n * 只支持静态可求值的字面量/模块常量/局部常量;其余表达式快速报错。\n */\nexport function compileState(\n context: CompileContext,\n classSource: ClassSource\n): string {\n const { ts } = context;\n const method = findMethod(context, classSource, 'initState');\n if (!method?.body) {\n return '{}';\n }\n\n const consts = collectModuleConsts(context, classSource);\n const locals = new Map<string, tsTypes.Expression>();\n let returnStatement: tsTypes.ReturnStatement | undefined;\n for (const statement of method.body.statements) {\n if (ts.isVariableStatement(statement)) {\n const isConst = statement.declarationList.flags & ts.NodeFlags.Const;\n if (!isConst) {\n throw mpError(\n classSource.filePath,\n 'initState() 内只支持 const 声明(data 需静态求值)'\n );\n }\n for (const declaration of statement.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name) && declaration.initializer) {\n locals.set(declaration.name.text, declaration.initializer);\n }\n }\n continue;\n }\n if (ts.isReturnStatement(statement)) {\n returnStatement = statement;\n continue;\n }\n throw mpError(\n classSource.filePath,\n `initState() 内不支持的语句(只支持 const 声明与 return): ${statement.getText().slice(0, 60)}`\n );\n }\n if (!returnStatement?.expression) {\n throw mpError(classSource.filePath, 'initState() 必须以 return 表达式结束');\n }\n\n const allConsts = new Map([...consts, ...locals]);\n const value = foldExpression(ts, returnStatement.expression, allConsts);\n if (value === undefined) {\n throw mpError(\n classSource.filePath,\n 'initState() 的结果必须能静态求值(只支持字面量、模块/局部常量与简单表达式)'\n );\n }\n return JSON.stringify(value, null, 2);\n}\n\nfunction collectModuleConsts(\n context: CompileContext,\n classSource: ClassSource\n): Map<string, tsTypes.Expression> {\n const consts = new Map<string, tsTypes.Expression>();\n for (const statement of classSource.source.statements) {\n if (!context.ts.isVariableStatement(statement)) {\n continue;\n }\n const isConst =\n statement.declarationList.flags & context.ts.NodeFlags.Const;\n if (!isConst) {\n continue;\n }\n for (const declaration of statement.declarationList.declarations) {\n if (\n context.ts.isIdentifier(declaration.name) &&\n declaration.initializer\n ) {\n consts.set(declaration.name.text, declaration.initializer);\n }\n }\n }\n return consts;\n}\n",
15
+ "import type * as tsTypes from 'typescript';\nimport { foldExpression, FoldedValue, isThisExpression } from './fold';\nimport { mpError } from './errors';\nimport { ClassSource, CompileContext, FunctionEntry, UnitKind } from './types';\n\nconst PAGE_LIFECYCLE: Record<string, string> = {\n beforeMount: 'onLoad',\n onMounted: 'onReady',\n onUnmounted: 'onUnload',\n // 小程序页面独有生命周期:同名方法直接映射(下拉刷新/触底加载/分享等)\n onShow: 'onShow',\n onHide: 'onHide',\n onPullDownRefresh: 'onPullDownRefresh',\n onReachBottom: 'onReachBottom',\n onShareAppMessage: 'onShareAppMessage',\n onPageScroll: 'onPageScroll',\n onResize: 'onResize',\n};\n\nconst COMPONENT_LIFECYCLE: Record<string, string> = {\n beforeMount: 'created',\n onMounted: 'attached',\n onUnmounted: 'detached',\n};\n\nexport interface CompiledMethods {\n methods: FunctionEntry[];\n lifecycle: FunctionEntry[];\n}\n\n/**\n * 编译事件方法与小程序的 data 语义桥:\n * - this.state.x -> this.data.x\n * - this.setState(obj) -> this.setData(obj)\n * - this.state.a.b = expr / += -> this.setData({ 'a.b': expr })\n * - 组件内 this.emit('name', args) -> this.triggerEvent('name', { args })\n * - 方法体中的模块常量原地折叠为字面量\n */\nexport function compileMethods(\n context: CompileContext,\n classSource: ClassSource,\n usedNames: Set<string>,\n kind: UnitKind,\n customEvents: Set<string>\n): CompiledMethods {\n const { ts } = context;\n const methods = new Map<string, tsTypes.MethodDeclaration>();\n for (const member of classSource.declaration.members) {\n if (\n ts.isMethodDeclaration(member) &&\n ts.isIdentifier(member.name) &&\n !isStatic(ts, member)\n ) {\n methods.set(member.name.text, member);\n }\n }\n\n const lifecycleMap = kind === 'page' ? PAGE_LIFECYCLE : COMPONENT_LIFECYCLE;\n const seed = new Set(usedNames);\n for (const hook of Object.keys(lifecycleMap)) {\n if (methods.has(hook)) {\n seed.add(hook);\n }\n }\n\n const queue = [...seed];\n const visited = new Set<string>();\n const entries: FunctionEntry[] = [];\n const lifecycleEntries: FunctionEntry[] = [];\n const emittedKeys = new Set<string>();\n\n while (queue.length > 0) {\n const name = queue.shift()!;\n if (visited.has(name)) {\n continue;\n }\n visited.add(name);\n const declaration = methods.get(name);\n if (!declaration) {\n throw mpError(classSource.filePath, `未找到事件处理方法 \"${name}\"`);\n }\n\n const lifecycleKey = lifecycleMap[name];\n const key = lifecycleKey ?? name;\n if (emittedKeys.has(key)) {\n throw mpError(\n classSource.filePath,\n `方法名 \"${key}\" 与小程序生命周期钩子冲突`\n );\n }\n emittedKeys.add(key);\n\n const fn = compileMethod(\n context,\n classSource,\n declaration,\n kind,\n customEvents,\n queue\n );\n if (lifecycleKey) {\n lifecycleEntries.push({ key, fn });\n } else {\n entries.push({ key, fn });\n }\n }\n\n return { methods: entries, lifecycle: lifecycleEntries };\n}\n\nfunction compileMethod(\n context: CompileContext,\n classSource: ClassSource,\n declaration: tsTypes.MethodDeclaration,\n kind: UnitKind,\n customEvents: Set<string>,\n referencedMethods: string[]\n): string {\n const { ts } = context;\n if (!declaration.body) {\n throw mpError(\n classSource.filePath,\n `方法 ${declaration.name.getText()} 缺少方法体`\n );\n }\n\n const params = declaration.parameters.map((parameter) =>\n ts.factory.createParameterDeclaration(\n undefined,\n parameter.dotDotDotToken,\n parameter.name,\n undefined,\n undefined,\n parameter.initializer\n )\n );\n const modifiers = isAsync(ts, declaration)\n ? [ts.factory.createModifier(ts.SyntaxKind.AsyncKeyword)]\n : undefined;\n\n const functionExpression = ts.factory.createFunctionExpression(\n modifiers,\n undefined,\n undefined,\n undefined,\n params,\n undefined,\n declaration.body\n );\n\n const consts = collectModuleConsts(context, classSource);\n const locals = new Set<string>();\n const transformerFactory: tsTypes.TransformerFactory<\n tsTypes.FunctionExpression\n > = (transformContext) => {\n return (root) =>\n visit(context, classSource, root, {\n transformContext,\n kind,\n customEvents,\n consts,\n locals,\n referencedMethods,\n }) as tsTypes.FunctionExpression;\n };\n const result = ts.transform(functionExpression, [transformerFactory]);\n const transformed = result.transformed[0] as tsTypes.FunctionExpression;\n result.dispose();\n\n const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });\n const printed = printer.printNode(\n ts.EmitHint.Expression,\n transformed,\n classSource.source\n );\n // ts.transform 只运行自定义 transformer,不会做类型擦除;\n // 方法体源码里残留的 TS 类型注解 / as 断言必须经 transpileModule 移除,\n // 否则生成的小程序 JS 无法被解析。\n const transpiled = ts.transpileModule(printed, {\n compilerOptions: { target: ts.ScriptTarget.ESNext, module: ts.ModuleKind.None },\n reportDiagnostics: false,\n });\n return transpiled.outputText.trim();\n}\n\ninterface VisitState {\n transformContext: tsTypes.TransformationContext;\n kind: UnitKind;\n customEvents: Set<string>;\n consts: Map<string, tsTypes.Expression>;\n locals: Set<string>;\n referencedMethods: string[];\n}\n\nfunction visit(\n context: CompileContext,\n classSource: ClassSource,\n node: tsTypes.Node,\n state: VisitState\n): tsTypes.Node {\n const { ts } = context;\n\n if (ts.isFunctionLike(node)) {\n for (const parameter of node.parameters) {\n if (ts.isIdentifier(parameter.name)) {\n state.locals.add(parameter.name.text);\n }\n }\n }\n\n if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name)) {\n state.locals.add(node.name.text);\n }\n\n // 赋值:this.state.path = expr / += ... -> this.setData({ path: ... })\n if (\n ts.isBinaryExpression(node) &&\n isAssignmentOperator(ts, node.operatorToken.kind)\n ) {\n if (isWholeStateAssignment(ts, node.left)) {\n throw mpError(\n classSource.filePath,\n '不支持替换整个 this.state,请改用 this.setState({ ... })'\n );\n }\n const path = statePath(ts, node.left);\n if (path !== undefined) {\n const assignment = buildStateAssignment(ts, node, classSource.filePath);\n return ts.visitEachChild(\n assignment,\n (child) => visit(context, classSource, child, state),\n state.transformContext\n );\n }\n }\n\n // this.setState(obj) -> this.setData(obj)\n if (ts.isCallExpression(node) && isThisMemberCall(ts, node, 'setState')) {\n const call = ts.factory.createCallExpression(\n ts.factory.createPropertyAccessExpression(\n ts.factory.createThis(),\n 'setData'\n ),\n undefined,\n node.arguments\n );\n return ts.visitEachChild(\n call,\n (child) => visit(context, classSource, child, state),\n state.transformContext\n );\n }\n\n // this.emit('name', args) -> this.triggerEvent('name', { args })\n if (ts.isCallExpression(node) && isThisMemberCall(ts, node, 'emit')) {\n if (state.kind !== 'component') {\n throw mpError(\n classSource.filePath,\n '页面组件不能使用 this.emit(组件间事件仅自定义组件支持)'\n );\n }\n const eventName = node.arguments[0];\n if (!ts.isStringLiteral(eventName)) {\n throw mpError(\n classSource.filePath,\n 'this.emit 的事件名必须是字符串字面量'\n );\n }\n state.customEvents.add(eventName.text);\n const args = ts.factory.createArrayLiteralExpression(\n node.arguments.slice(1)\n );\n const payload = ts.factory.createObjectLiteralExpression([\n ts.factory.createPropertyAssignment('args', args),\n ]);\n const call = ts.factory.createCallExpression(\n ts.factory.createPropertyAccessExpression(\n ts.factory.createThis(),\n 'triggerEvent'\n ),\n undefined,\n [eventName, payload]\n );\n return ts.visitEachChild(\n call,\n (child) => visit(context, classSource, child, state),\n state.transformContext\n );\n }\n\n // this.<method>(...) 调用收集(用于传递依赖;排除框架桥接方法)\n if (\n ts.isCallExpression(node) &&\n ts.isPropertyAccessExpression(node.expression) &&\n isThisExpression(ts, node.expression.expression)\n ) {\n const methodName = node.expression.name.text;\n if (!BRIDGE_METHODS.has(methodName)) {\n state.referencedMethods.push(methodName);\n }\n }\n\n // this.state -> this.data;this.props -> this.properties\n if (\n ts.isPropertyAccessExpression(node) &&\n isThisExpression(ts, node.expression)\n ) {\n if (node.name.text === 'state') {\n return ts.factory.createPropertyAccessExpression(\n ts.factory.createThis(),\n 'data'\n );\n }\n if (node.name.text === 'props') {\n if (state.kind !== 'component') {\n throw mpError(classSource.filePath, '页面组件不能访问 this.props');\n }\n return ts.factory.createPropertyAccessExpression(\n ts.factory.createThis(),\n 'properties'\n );\n }\n }\n\n // 方法体中的模块常量折叠为字面量\n if (\n ts.isIdentifier(node) &&\n !state.locals.has(node.text) &&\n state.consts.has(node.text)\n ) {\n const folded = foldExpression(\n ts,\n state.consts.get(node.text)!,\n state.consts\n );\n if (folded === undefined) {\n throw mpError(\n classSource.filePath,\n `方法中引用了无法静态求值的模块常量 \"${node.text}\"`\n );\n }\n return valueToNode(ts, folded);\n }\n\n return ts.visitEachChild(\n node,\n (child) => visit(context, classSource, child, state),\n state.transformContext\n );\n}\n\nconst BRIDGE_METHODS = new Set(['emit', 'setState', 'setData', 'triggerEvent']);\n\n/**\n * 把 this.state.path 赋值表达式改写为 this.setData({ path: value })。\n * 返回的节点带原始子节点,由调用方在 transform 管线内统一转换。\n */\nfunction buildStateAssignment(\n ts: typeof tsTypes,\n node: tsTypes.BinaryExpression,\n filePath: string\n): tsTypes.Expression {\n const path = statePath(ts, node.left);\n if (path === undefined) {\n throw new Error('internal: state assignment without state path');\n }\n const operator = node.operatorToken.kind;\n const isCompound = operator !== ts.SyntaxKind.EqualsToken;\n\n let value: tsTypes.Expression;\n if (isCompound) {\n const operatorText = compoundOperatorText(ts, operator);\n if (!operatorText) {\n throw new Error(\n `不支持的复合赋值: ${node.operatorToken.getText()} (${filePath})`\n );\n }\n value = ts.factory.createBinaryExpression(\n node.left,\n operatorText as tsTypes.BinaryOperator,\n node.right\n );\n } else {\n value = node.right;\n }\n\n const key = ts.factory.createStringLiteral(path);\n const object = ts.factory.createObjectLiteralExpression([\n ts.factory.createPropertyAssignment(key, value),\n ]);\n return ts.factory.createCallExpression(\n ts.factory.createPropertyAccessExpression(\n ts.factory.createThis(),\n 'setData'\n ),\n undefined,\n [object]\n );\n}\n\n/**\n * 提取 this.state 赋值路径:this.state.a.b[0].c -> \"a.b[0].c\"。\n * 非 this.state 赋值返回 undefined;不支持整体替换 this.state。\n */\nfunction statePath(\n ts: typeof tsTypes,\n left: tsTypes.Expression\n): string | undefined {\n const tokens: string[] = [];\n let current: tsTypes.Expression = left;\n for (;;) {\n if (ts.isPropertyAccessExpression(current)) {\n if (\n isThisExpression(ts, current.expression) &&\n current.name.text === 'state'\n ) {\n if (tokens.length === 0) {\n return undefined;\n }\n return tokens\n .reverse()\n .map((token) => (token.startsWith('[') ? token : `.${token}`))\n .join('')\n .slice(1);\n }\n tokens.push(current.name.text);\n current = current.expression;\n continue;\n }\n if (ts.isElementAccessExpression(current)) {\n const argument = current.argumentExpression;\n if (!ts.isStringLiteral(argument) && !ts.isNumericLiteral(argument)) {\n return undefined;\n }\n tokens.push(`[${argument.text}]`);\n current = current.expression;\n continue;\n }\n return undefined;\n }\n}\n\nfunction isAssignmentOperator(\n ts: typeof tsTypes,\n kind: tsTypes.SyntaxKind\n): boolean {\n return (\n kind === ts.SyntaxKind.EqualsToken ||\n kind === ts.SyntaxKind.PlusEqualsToken ||\n kind === ts.SyntaxKind.MinusEqualsToken ||\n kind === ts.SyntaxKind.AsteriskEqualsToken ||\n kind === ts.SyntaxKind.SlashEqualsToken ||\n kind === ts.SyntaxKind.PercentEqualsToken ||\n kind === ts.SyntaxKind.LessThanLessThanEqualsToken ||\n kind === ts.SyntaxKind.GreaterThanGreaterThanEqualsToken ||\n kind === ts.SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken ||\n kind === ts.SyntaxKind.AmpersandEqualsToken ||\n kind === ts.SyntaxKind.BarEqualsToken ||\n kind === ts.SyntaxKind.CaretEqualsToken ||\n kind === ts.SyntaxKind.AsteriskAsteriskEqualsToken ||\n kind === ts.SyntaxKind.AmpersandAmpersandEqualsToken ||\n kind === ts.SyntaxKind.BarBarEqualsToken ||\n kind === ts.SyntaxKind.QuestionQuestionEqualsToken\n );\n}\n\nfunction isWholeStateAssignment(\n ts: typeof tsTypes,\n left: tsTypes.Expression\n): boolean {\n return (\n ts.isPropertyAccessExpression(left) &&\n isThisExpression(ts, left.expression) &&\n left.name.text === 'state'\n );\n}\n\nfunction compoundOperatorText(\n ts: typeof tsTypes,\n kind: tsTypes.SyntaxKind\n): tsTypes.SyntaxKind | undefined {\n switch (kind) {\n case ts.SyntaxKind.PlusEqualsToken:\n return ts.SyntaxKind.PlusToken;\n case ts.SyntaxKind.MinusEqualsToken:\n return ts.SyntaxKind.MinusToken;\n case ts.SyntaxKind.AsteriskEqualsToken:\n return ts.SyntaxKind.AsteriskToken;\n case ts.SyntaxKind.SlashEqualsToken:\n return ts.SyntaxKind.SlashToken;\n case ts.SyntaxKind.PercentEqualsToken:\n return ts.SyntaxKind.PercentToken;\n default:\n return undefined;\n }\n}\n\nfunction isThisMemberCall(\n ts: typeof tsTypes,\n node: tsTypes.CallExpression,\n name: string\n): boolean {\n return (\n ts.isPropertyAccessExpression(node.expression) &&\n isThisExpression(ts, node.expression.expression) &&\n node.expression.name.text === name\n );\n}\n\nfunction isStatic(\n ts: typeof tsTypes,\n declaration: tsTypes.MethodDeclaration\n): boolean {\n return (declaration.modifiers ?? []).some(\n (modifier) => modifier.kind === ts.SyntaxKind.StaticKeyword\n );\n}\n\nfunction isAsync(\n ts: typeof tsTypes,\n declaration: tsTypes.MethodDeclaration\n): boolean {\n return (declaration.modifiers ?? []).some(\n (modifier) => modifier.kind === ts.SyntaxKind.AsyncKeyword\n );\n}\n\nfunction valueToNode(\n ts: typeof tsTypes,\n value: FoldedValue\n): tsTypes.Expression {\n if (typeof value === 'string') {\n return ts.factory.createStringLiteral(value);\n }\n if (typeof value === 'number') {\n return ts.factory.createNumericLiteral(String(value));\n }\n if (typeof value === 'boolean') {\n return value ? ts.factory.createTrue() : ts.factory.createFalse();\n }\n if (value === null) {\n return ts.factory.createNull();\n }\n if (Array.isArray(value)) {\n return ts.factory.createArrayLiteralExpression(\n value.map((item) => valueToNode(ts, item))\n );\n }\n return ts.factory.createObjectLiteralExpression(\n Object.entries(value).map(([key, item]) =>\n ts.factory.createPropertyAssignment(\n ts.factory.createStringLiteral(key),\n valueToNode(ts, item)\n )\n )\n );\n}\n\nfunction collectModuleConsts(\n context: CompileContext,\n classSource: ClassSource\n): Map<string, tsTypes.Expression> {\n const consts = new Map<string, tsTypes.Expression>();\n for (const statement of classSource.source.statements) {\n if (!context.ts.isVariableStatement(statement)) {\n continue;\n }\n const isConst =\n statement.declarationList.flags & context.ts.NodeFlags.Const;\n if (!isConst) {\n continue;\n }\n for (const declaration of statement.declarationList.declarations) {\n if (\n context.ts.isIdentifier(declaration.name) &&\n declaration.initializer\n ) {\n consts.set(declaration.name.text, declaration.initializer);\n }\n }\n }\n return consts;\n}\n",
16
+ "import { mpError } from './errors';\nimport {\n ClassSource,\n CompiledUnit,\n CompileContext,\n FunctionEntry,\n UnitKind,\n} from './types';\nimport { compileTemplate, kebabCase } from './wxml';\nimport { compileStyles } from './styles';\nimport { compileState } from './state';\nimport { compileMethods } from './methods';\n\nexport interface UnitOptions {\n kind: UnitKind;\n name: string;\n}\n\n/**\n * 编译一个页面或自定义组件单元。组件会被缓存(按 kebab 标签名),\n * 并通过 usedComponents 递归编译依赖的组件。\n */\nexport function compileUnit(\n context: CompileContext,\n classSource: ClassSource,\n options: UnitOptions\n): CompiledUnit {\n const { kind, name } = options;\n\n if (kind === 'component') {\n const cached = context.components.get(name);\n if (cached) {\n return cached;\n }\n if (context.compiling.has(name)) {\n throw mpError(classSource.filePath, `组件循环引用: ${name}`);\n }\n context.compiling.add(name);\n }\n\n try {\n // 先编译样式,拿到 hover 选择器集合供模板生成 hover-class\n const styles = compileStyles(context, classSource);\n const { template, builder } = compileTemplate(\n context,\n classSource,\n kind,\n styles.hoverSelectors\n );\n const data = compileState(context, classSource);\n\n const usedNames = new Set(builder.handlers);\n for (const emitter of builder.emitters) {\n usedNames.add(emitter.method);\n }\n const customEvents = new Set<string>();\n const compiledMethods = compileMethods(\n context,\n classSource,\n usedNames,\n kind,\n customEvents\n );\n\n // emitters 包装方法:还原 triggerEvent 的 e.detail.args\n const methods: FunctionEntry[] = [...compiledMethods.methods];\n for (const emitter of builder.emitters) {\n const key = `__transone_emitter_${emitter.event}`;\n const fn = emitter.passArgs\n ? `function(e) { this.${emitter.method}(...e.detail.args); }`\n : `function() { this.${emitter.method}(); }`;\n methods.push({ key, fn });\n }\n\n const usingComponents: Record<string, string> = {};\n for (const [tag, source] of builder.usedComponents) {\n compileUnit(context, source, { kind: 'component', name: tag });\n usingComponents[tag] = `/components/${tag}/${tag}`;\n }\n\n const unit: CompiledUnit = {\n kind,\n name,\n template,\n style: styles.style,\n globalStyle: styles.global,\n data,\n properties: {},\n propsReferenced: builder.propsReferenced,\n methods,\n lifecycle: compiledMethods.lifecycle,\n customEvents: [...customEvents],\n usingComponents,\n };\n\n if (kind === 'component') {\n context.components.set(name, unit);\n }\n return unit;\n } finally {\n if (kind === 'component') {\n context.compiling.delete(name);\n }\n }\n}\n\n/** 编译全部页面后,聚合调用点属性与模板 props 引用,生成组件 properties。 */\nexport function finalizeComponentProperties(context: CompileContext): void {\n for (const [tag, unit] of context.components) {\n const properties = new Map<string, string>();\n for (const callSite of context.callSites.get(tag) ?? []) {\n for (const [name, type] of Object.entries(callSite)) {\n if (!properties.has(name) || properties.get(name) === 'null') {\n properties.set(name, type);\n }\n }\n }\n for (const name of unit.propsReferenced) {\n if (!properties.has(name)) {\n properties.set(name, 'null');\n }\n }\n unit.properties = Object.fromEntries(properties);\n }\n}\n\nexport function componentTag(className: string): string {\n return kebabCase(className);\n}\n",
17
+ "import { CompiledUnit, PropertyTypes } from './types';\nimport type { MpDialect } from './dialect';\n\nconst GENERATED_HEADER = (dialectId: string): string =>\n `// 由 transone build --target ${dialectId} 生成,请勿手动编辑`;\n\n/** 生成页面 JS:Page({ data, methods, lifecycle })(CommonJS)。 */\nexport function generatePageJs(unit: CompiledUnit, dialect: MpDialect): string {\n const parts: string[] = [\n GENERATED_HEADER(dialect.id),\n 'Page({',\n ` data: ${embedData(unit.data)},`,\n ];\n for (const entry of [...unit.methods, ...unit.lifecycle]) {\n parts.push(` ${entry.key}: ${entry.fn},`);\n }\n parts.push('});');\n return parts.join('\\n') + '\\n';\n}\n\n/** 生成自定义组件 JS:Component({ properties, data, methods, lifetimes })。 */\nexport function generateComponentJs(unit: CompiledUnit, dialect: MpDialect): string {\n const parts: string[] = [GENERATED_HEADER(dialect.id), 'Component({'];\n parts.push(` properties: ${generatePropertiesSource(unit.properties)},`);\n parts.push(` data: ${embedData(unit.data)},`);\n parts.push(' methods: {');\n for (const entry of unit.methods) {\n parts.push(` ${entry.key}: ${entry.fn},`);\n }\n parts.push(' },');\n if (unit.lifecycle.length > 0) {\n parts.push(' lifetimes: {');\n for (const entry of unit.lifecycle) {\n parts.push(` ${entry.key}: ${entry.fn},`);\n }\n parts.push(' },');\n }\n parts.push('});');\n return parts.join('\\n') + '\\n';\n}\n\n/** 把 JSON 对象源码嵌入 Page/Component 的 data 字段(统一缩进)。 */\nfunction embedData(data: string): string {\n const body = data\n .trim()\n .replace(/^\\{/, '')\n .replace(/\\}$/, '')\n .trim();\n return `{\\n ${body.replace(/\\n/g, '\\n ')}\\n }`;\n}\n\n/** 生成 properties 对象源码:{ title: { type: String, value: '' } }。 */\nexport function generatePropertiesSource(properties: PropertyTypes): string {\n const entries = Object.entries(properties);\n if (entries.length === 0) {\n return '{}';\n }\n const lines = entries.map(\n ([name, type]) =>\n ` ${JSON.stringify(name)}: { type: ${type === 'null' ? 'null' : type}, value: '' },`\n );\n return `{\\n${lines.join('\\n')}\\n }`;\n}\n"
18
+ ],
19
+ "mappings": ";;;;;;AAAA;AACA,uBAAS;AACT,8BAAmB,kBAAS,4BAAgB;;;ACA5C,IAAI,WAAkC;AAMtC,eAAsB,cAAc,GAA4B;AAAA,EAC9D,IAAI,UAAU;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EACA,WAAW,MAAa;AAAA,EACxB,OAAO;AAAA;;;ACbT;AACA;;;ACAO,MAAM,uBAAuB,MAAM;AAAA,EACxB;AAAA,EAEhB,WAAW,CAAC,MAAc,SAAiB;AAAA,IACzC,MAAM,GAAG,YAAY,OAAO;AAAA,IAC5B,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA;AAEhB;AAEO,SAAS,OAAO,CAAC,MAAc,SAAiC;AAAA,EACrE,OAAO,IAAI,eAAe,MAAM,OAAO;AAAA;;;ACyBlC,SAAS,cAAc,CAC5B,IACA,MACA,QACA,OAAO,IAAI,KACc;AAAA,EACzB,OAAO,kBAAkB,IAAI,IAAI;AAAA,EAEjC,IAAI,GAAG,gBAAgB,IAAI,GAAG;AAAA,IAC5B,OAAO,KAAK;AAAA,EACd;AAAA,EACA,IAAI,GAAG,gCAAgC,IAAI,GAAG;AAAA,IAE5C,IAAI,KAAK,KAAK,SAAS,IAAI,GAAG;AAAA,MAC5B;AAAA,IACF;AAAA,IACA,OAAO,KAAK;AAAA,EACd;AAAA,EACA,IAAI,GAAG,iBAAiB,IAAI,GAAG;AAAA,IAC7B,OAAO,OAAO,KAAK,IAAI;AAAA,EACzB;AAAA,EACA,IAAI,KAAK,SAAS,GAAG,WAAW,aAAa;AAAA,IAC3C,OAAO;AAAA,EACT;AAAA,EACA,IAAI,KAAK,SAAS,GAAG,WAAW,cAAc;AAAA,IAC5C,OAAO;AAAA,EACT;AAAA,EACA,IAAI,KAAK,SAAS,GAAG,WAAW,aAAa;AAAA,IAC3C,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,GAAG,wBAAwB,IAAI,GAAG;AAAA,IACpC,MAAM,UAAU,eAAe,IAAI,KAAK,SAAS,QAAQ,IAAI;AAAA,IAC7D,IAAI,YAAY,WAAW;AAAA,MACzB;AAAA,IACF;AAAA,IACA,IAAI,KAAK,aAAa,GAAG,WAAW,YAAY;AAAA,MAC9C,OAAO,OAAO,YAAY,WAAW,CAAC,UAAU;AAAA,IAClD;AAAA,IACA,IAAI,KAAK,aAAa,GAAG,WAAW,WAAW;AAAA,MAC7C,OAAO,OAAO,YAAY,WAAW,UAAU;AAAA,IACjD;AAAA,IACA,IAAI,KAAK,aAAa,GAAG,WAAW,kBAAkB;AAAA,MACpD,OAAO,CAAC;AAAA,IACV;AAAA,IACA;AAAA,EACF;AAAA,EAEA,IAAI,GAAG,mBAAmB,IAAI,GAAG;AAAA,IAC/B,MAAM,OAAO,eAAe,IAAI,KAAK,MAAM,QAAQ,IAAI;AAAA,IACvD,MAAM,QAAQ,eAAe,IAAI,KAAK,OAAO,QAAQ,IAAI;AAAA,IACzD,IAAI,SAAS,aAAa,UAAU,WAAW;AAAA,MAC7C;AAAA,IACF;AAAA,IACA,OAAO,WAAW,IAAI,KAAK,cAAc,MAAM,MAAM,KAAK;AAAA,EAC5D;AAAA,EAEA,IAAI,GAAG,wBAAwB,IAAI,GAAG;AAAA,IACpC,MAAM,YAAY,eAAe,IAAI,KAAK,WAAW,QAAQ,IAAI;AAAA,IACjE,IAAI,OAAO,cAAc,WAAW;AAAA,MAClC;AAAA,IACF;AAAA,IACA,OAAO,YACH,eAAe,IAAI,KAAK,UAAU,QAAQ,IAAI,IAC9C,eAAe,IAAI,KAAK,WAAW,QAAQ,IAAI;AAAA,EACrD;AAAA,EAEA,IAAI,GAAG,yBAAyB,IAAI,GAAG;AAAA,IACrC,MAAM,QAAuB,CAAC;AAAA,IAC9B,WAAW,WAAW,KAAK,UAAU;AAAA,MACnC,IAAI,GAAG,gBAAgB,OAAO,GAAG;AAAA,QAC/B,MAAM,SAAS,eAAe,IAAI,QAAQ,YAAY,QAAQ,IAAI;AAAA,QAClE,IAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAAA,UAC1B;AAAA,QACF;AAAA,QACA,MAAM,KAAK,GAAG,MAAM;AAAA,QACpB;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,eAAe,IAAI,SAAS,QAAQ,IAAI;AAAA,MACtD,IAAI,UAAU,WAAW;AAAA,QACvB;AAAA,MACF;AAAA,MACA,MAAM,KAAK,KAAK;AAAA,IAClB;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,GAAG,0BAA0B,IAAI,GAAG;AAAA,IACtC,MAAM,SAAsC,CAAC;AAAA,IAC7C,WAAW,YAAY,KAAK,YAAY;AAAA,MACtC,IAAI,GAAG,qBAAqB,QAAQ,GAAG;AAAA,QACrC,MAAM,MAAM,iBAAiB,IAAI,SAAS,IAAI;AAAA,QAC9C,MAAM,QAAQ,eAAe,IAAI,SAAS,aAAa,QAAQ,IAAI;AAAA,QACnE,IAAI,QAAQ,aAAa,UAAU,WAAW;AAAA,UAC5C;AAAA,QACF;AAAA,QACA,OAAO,OAAO;AAAA,QACd;AAAA,MACF;AAAA,MACA,IACE,GAAG,8BAA8B,QAAQ,KACzC,GAAG,aAAa,SAAS,IAAI,GAC7B;AAAA,QACA,MAAM,cAAc,OAAO,IAAI,SAAS,KAAK,IAAI;AAAA,QACjD,IAAI,CAAC,aAAa;AAAA,UAChB;AAAA,QACF;AAAA,QACA,MAAM,QAAQ,eAAe,IAAI,aAAa,QAAQ,IAAI;AAAA,QAC1D,IAAI,UAAU,WAAW;AAAA,UACvB;AAAA,QACF;AAAA,QACA,OAAO,SAAS,KAAK,QAAQ;AAAA,QAC7B;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,GAAG,aAAa,IAAI,GAAG;AAAA,IACzB,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG;AAAA,MACvB;AAAA,IACF;AAAA,IACA,MAAM,cAAc,OAAO,IAAI,KAAK,IAAI;AAAA,IACxC,IAAI,CAAC,aAAa;AAAA,MAChB;AAAA,IACF;AAAA,IACA,KAAK,IAAI,KAAK,IAAI;AAAA,IAClB,MAAM,QAAQ,eAAe,IAAI,aAAa,QAAQ,IAAI;AAAA,IAC1D,KAAK,OAAO,KAAK,IAAI;AAAA,IACrB,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,GAAG,2BAA2B,IAAI,GAAG;AAAA,IACvC,MAAM,OAAO,eAAe,IAAI,KAAK,YAAY,QAAQ,IAAI;AAAA,IAC7D,IAAI,SAAS,WAAW;AAAA,MACtB;AAAA,IACF;AAAA,IACA,IAAI,MAAM,QAAQ,IAAI,GAAG;AAAA,MACvB,IAAI,KAAK,KAAK,SAAS,UAAU;AAAA,QAC/B,OAAO,KAAK;AAAA,MACd;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAAA,MAC7C,OAAO,KAAK,KAAK,KAAK;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,IAAI,GAAG,0BAA0B,IAAI,GAAG;AAAA,IACtC,MAAM,OAAO,eAAe,IAAI,KAAK,YAAY,QAAQ,IAAI;AAAA,IAC7D,MAAM,QAAQ,eAAe,IAAI,KAAK,oBAAoB,QAAQ,IAAI;AAAA,IACtE,IAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,OAAO,UAAU,UAAU;AAAA,MACrD;AAAA,IACF;AAAA,IACA,OAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,GAAG,qBAAqB,IAAI,GAAG;AAAA,IACjC,IAAI,SAAS;AAAA,IACb,IAAI,KAAK,KAAK,SAAS,IAAI;AAAA,MACzB,UAAU,KAAK,KAAK;AAAA,IACtB;AAAA,IACA,WAAW,QAAQ,KAAK,eAAe;AAAA,MACrC,MAAM,QAAQ,eAAe,IAAI,KAAK,YAAY,QAAQ,IAAI;AAAA,MAC9D,IAAI,UAAU,WAAW;AAAA,QACvB;AAAA,MACF;AAAA,MACA,UAAU,OAAO,KAAK;AAAA,MACtB,UAAU,KAAK,QAAQ;AAAA,IACzB;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAEA;AAAA;AAGF,SAAS,UAAU,CACjB,IACA,UACA,MACA,OACyB;AAAA,EACzB,QAAQ;AAAA,SACD,GAAG,WAAW;AAAA,MACjB,OAAO,GAAG,OAAO;AAAA,SACd,GAAG,WAAW;AAAA,MACjB,OAAQ,OAAmB;AAAA,SACxB,GAAG,WAAW;AAAA,MACjB,OAAQ,OAAmB;AAAA,SACxB,GAAG,WAAW;AAAA,MACjB,OAAQ,OAAmB;AAAA,SACxB,GAAG,WAAW;AAAA,MACjB,OAAQ,OAAmB;AAAA,SACxB,GAAG,WAAW;AAAA,MACjB,OAAO,SAAS;AAAA,SACb,GAAG,WAAW;AAAA,MACjB,OAAO,SAAS;AAAA,SACb,GAAG,WAAW;AAAA,MACjB,OAAQ,OAAmB;AAAA,SACxB,GAAG,WAAW;AAAA,MACjB,OAAQ,QAAoB;AAAA,SACzB,GAAG,WAAW;AAAA,MACjB,OAAQ,OAAmB;AAAA,SACxB,GAAG,WAAW;AAAA,MACjB,OAAQ,QAAoB;AAAA,SACzB,GAAG,WAAW;AAAA,MACjB,OAAO,QAAQ,IAAI,KAAK,QAAQ,KAAK;AAAA,SAClC,GAAG,WAAW;AAAA,MACjB,OAAO,QAAQ,IAAI,KAAK,QAAQ,KAAK;AAAA;AAAA,MAErC;AAAA;AAAA;AAIC,SAAS,gBAAgB,CAC9B,IACA,MACoB;AAAA,EACpB,IACE,GAAG,aAAa,IAAI,KACpB,GAAG,gBAAgB,IAAI,KACvB,GAAG,iBAAiB,IAAI,GACxB;AAAA,IACA,OAAO,KAAK;AAAA,EACd;AAAA,EACA;AAAA;AAGK,SAAS,iBAAyC,CACvD,IACA,MACG;AAAA,EACH,IAAI,UAAwB;AAAA,EAC5B,OAAO,GAAG,0BAA0B,OAAO,GAAG;AAAA,IAC5C,UAAU,QAAQ;AAAA,EACpB;AAAA,EACA,OAAO;AAAA;AAIF,SAAS,gBAAgB,CAC9B,IACA,MACgC;AAAA,EAChC,OAAO,KAAK,SAAS,GAAG,WAAW;AAAA;;;AF9Q9B,SAAS,UAAU,CACxB,SACA,UACoB;AAAA,EACpB,MAAM,SAAS,QAAQ,MAAM,IAAI,QAAQ;AAAA,EACzC,IAAI,QAAQ;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,IAAI,CAAC,WAAW,QAAQ,GAAG;AAAA,IACzB,MAAM,QAAQ,UAAU,sCAAQ;AAAA,EAClC;AAAA,EACA,MAAM,OAAO,aAAa,UAAU,MAAM;AAAA,EAC1C,MAAM,SAAS,QAAQ,GAAG,iBACxB,UACA,MACA,QAAQ,GAAG,aAAa,QACxB,MACA,QAAQ,GAAG,WAAW,EACxB;AAAA,EACA,QAAQ,MAAM,IAAI,UAAU,MAAM;AAAA,EAClC,OAAO;AAAA;AAIF,SAAS,aAAa,CAC3B,SACA,UACa;AAAA,EACb,QAAQ,OAAO;AAAA,EACf,MAAM,SAAS,WAAW,SAAS,QAAQ;AAAA,EAC3C,MAAM,UAAU,eAAe,QAAQ,IAAI,MAAM;AAAA,EACjD,MAAM,eAAe,oBAAoB,QAAQ,IAAI,MAAM;AAAA,EAK3D,WAAW,cAAc,oBAAoB,IAAI,MAAM,GAAG;AAAA,IACxD,IAAI,CAAC,QAAQ,GAAG,iBAAiB,UAAU,GAAG;AAAA,MAC5C;AAAA,IACF;AAAA,IACA,MAAM,aAAa,SAAS,QAAQ,IAAI,WAAW,UAAU;AAAA,IAC7D,MAAM,cACJ,eAAe,eACd,eAAe,aACd,QAAQ,IAAI,UAAU,GAAG,iBAAiB;AAAA,IAC9C,IAAI,CAAC,aAAa;AAAA,MAChB;AAAA,IACF;AAAA,IACA,MAAM,WAAW,cAAc,QAAQ,IAAI,UAAU;AAAA,IACrD,IAAI,CAAC,UAAU;AAAA,MACb;AAAA,IACF;AAAA,IACA,OAAO,sBAAsB,SAAS,EAAE,UAAU,OAAO,GAAG,QAAQ;AAAA,EACtE;AAAA,EAGA,WAAW,aAAa,OAAO,YAAY;AAAA,IACzC,IAAI,CAAC,QAAQ,GAAG,mBAAmB,SAAS,GAAG;AAAA,MAC7C;AAAA,IACF;AAAA,IACA,MAAM,OAAO,UAAU,MAAM;AAAA,IAC7B,IAAI,CAAC,QAAQ,CAAC,WAAW,QAAQ,IAAI,SAAS,GAAG;AAAA,MAC/C;AAAA,IACF;AAAA,IACA,IACE,oBAAoB,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb,WAAW;AAAA,IACb,CAAC,GACD;AAAA,MACA,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,aAAa;AAAA,QACb,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EAGA,YAAY,MAAM,gBAAgB,cAAc;AAAA,IAC9C,IACE,oBAAoB,SAAS;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW;AAAA,IACb,CAAC,GACD;AAAA,MACA,OAAO,EAAE,UAAU,QAAQ,aAAa,WAAW,KAAK;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,MAAM,QACJ,UACA,0JACF;AAAA;AAUK,SAAS,qBAAqB,CACnC,SACA,MACA,MACa;AAAA,EACb,QAAQ,OAAO;AAAA,EACf,OAAO,kBAAkB,IAAI,IAAI;AAAA,EAEjC,IAAI,GAAG,kBAAkB,IAAI,KAAK,GAAG,mBAAmB,IAAI,GAAG;AAAA,IAC7D,MAAM,QAAO,KAAK,MAAM;AAAA,IACxB,IAAI,CAAC,OAAM;AAAA,MACT,MAAM,QAAQ,KAAK,UAAU,sFAAgB;AAAA,IAC/C;AAAA,IACA,OAAO;AAAA,MACL,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,aAAa;AAAA,MACb,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EAEA,IAAI,CAAC,GAAG,aAAa,IAAI,GAAG;AAAA,IAC1B,MAAM,QACJ,KAAK,UACL,yFAAmB,KAAK,QAAQ,EAAE,MAAM,GAAG,EAAE,GAC/C;AAAA,EACF;AAAA,EACA,MAAM,OAAO,KAAK;AAAA,EAGlB,MAAM,QAAQ,oBAAoB,IAAI,KAAK,MAAM,EAAE,IAAI,IAAI;AAAA,EAC3D,IAAI,OAAO;AAAA,IACT,OAAO;AAAA,MACL,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,aAAa;AAAA,MACb,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EAGA,MAAM,UAAU,eAAe,IAAI,KAAK,MAAM;AAAA,EAC9C,MAAM,UAAU,QAAQ,IAAI,IAAI;AAAA,EAChC,IAAI,SAAS;AAAA,IACX,OAAO,qBAAqB,SAAS,MAAM,MAAM,OAAO;AAAA,EAC1D;AAAA,EAEA,MAAM,QAAQ,KAAK,UAAU,2DAAc,OAAO;AAAA;AAI7C,SAAS,mBAAmB,CACjC,SACA,aACS;AAAA,EACT,QAAQ,OAAO;AAAA,EACf,MAAM,WAAW,YAAY,YAAY,mBAAmB,CAAC;AAAA,EAC7D,MAAM,UAAU,eAAe,IAAI,YAAY,MAAM;AAAA,EACrD,WAAW,UAAU,UAAU;AAAA,IAC7B,IAAI,OAAO,UAAU,GAAG,WAAW,gBAAgB;AAAA,MACjD;AAAA,IACF;AAAA,IACA,WAAW,QAAQ,OAAO,OAAO;AAAA,MAC/B,IAAI,CAAC,GAAG,8BAA8B,IAAI,GAAG;AAAA,QAC3C;AAAA,MACF;AAAA,MACA,MAAM,aAAa,kBAAkB,IAAI,KAAK,UAAU;AAAA,MACxD,IAAI,CAAC,GAAG,aAAa,UAAU,GAAG;AAAA,QAChC;AAAA,MACF;AAAA,MACA,MAAM,UAAU,QAAQ,IAAI,WAAW,IAAI;AAAA,MAC3C,IAAI,WAAW,QAAQ,UAAU,SAAS,UAAU,GAAG;AAAA,QACrD,OAAO;AAAA,MACT;AAAA,MACA,IAAI,WAAW,SAAS,aAAa;AAAA,QACnC,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,oBAAoB,CAC3B,SACA,MACA,WACA,SACa;AAAA,EACb,IAAI,CAAC,QAAQ,UAAU,WAAW,GAAG,GAAG;AAAA,IACtC,MAAM,QACJ,KAAK,UACL,qDAAa,QAAQ,gGACvB;AAAA,EACF;AAAA,EACA,MAAM,aAAa,kBAAkB,KAAK,UAAU,QAAQ,SAAS;AAAA,EACrE,IAAI,CAAC,YAAY;AAAA,IACf,MAAM,QACJ,KAAK,UACL,+CAAY,QAAQ,gCAAiB,KAAK,gBAC5C;AAAA,EACF;AAAA,EACA,MAAM,SAAS,WAAW,SAAS,UAAU;AAAA,EAC7C,MAAM,eAAe,QAAQ;AAAA,EAC7B,MAAM,cAAc,kBAAkB,SAAS,QAAQ,YAAY;AAAA,EACnE,IAAI,CAAC,aAAa;AAAA,IAChB,MAAM,QACJ,YACA,2DAAc,6BAAmB,8BACnC;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EACb;AAAA;AAGF,SAAS,iBAAiB,CACxB,SACA,QACA,MACsC;AAAA,EACtC,QAAQ,OAAO;AAAA,EACf,WAAW,aAAa,OAAO,YAAY;AAAA,IACzC,IAAI,GAAG,mBAAmB,SAAS,KAAK,UAAU,MAAM,SAAS,MAAM;AAAA,MACrE,IAAI,WAAW,IAAI,SAAS,GAAG;AAAA,QAC7B,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAW,aAAa,OAAO,YAAY;AAAA,IACzC,IACE,GAAG,oBAAoB,SAAS,KAChC,UAAU,gBACV,GAAG,eAAe,UAAU,YAAY,GACxC;AAAA,MACA,WAAW,WAAW,UAAU,aAAa,UAAU;AAAA,QACrD,IAAI,QAAQ,KAAK,SAAS,MAAM;AAAA,UAC9B,MAAM,QAAQ,oBAAoB,IAAI,MAAM,EAAE,IAAI,IAAI;AAAA,UACtD,IAAI,OAAO;AAAA,YACT,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA;AAIF,SAAS,mBAAmB,CAC1B,IACA,QACsB;AAAA,EACtB,MAAM,cAAoC,CAAC;AAAA,EAC3C,WAAW,aAAa,OAAO,YAAY;AAAA,IACzC,IAAI,GAAG,sBAAsB,SAAS,GAAG;AAAA,MACvC,YAAY,KAAK,UAAU,UAAU;AAAA,MACrC;AAAA,IACF;AAAA,IACA,IAAI,GAAG,oBAAoB,SAAS,GAAG;AAAA,MACrC,WAAW,eAAe,UAAU,gBAAgB,cAAc;AAAA,QAChE,IAAI,YAAY,aAAa;AAAA,UAC3B,YAAY,KAAK,YAAY,WAAW;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,aAAa,CACpB,IACA,MACgC;AAAA,EAChC,WAAW,YAAY,KAAK,WAAW;AAAA,IACrC,MAAM,SAAS,kBAAkB,IAAI,QAAQ;AAAA,IAC7C,IAAI,CAAC,GAAG,0BAA0B,MAAM,GAAG;AAAA,MACzC;AAAA,IACF;AAAA,IACA,WAAW,YAAY,OAAO,YAAY;AAAA,MACxC,IACE,GAAG,qBAAqB,QAAQ,KAChC,GAAG,aAAa,SAAS,IAAI,KAC7B,SAAS,KAAK,SAAS,QACvB;AAAA,QACA,OAAO,SAAS;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA;AAGF,SAAS,mBAAmB,CAC1B,IACA,QACuC;AAAA,EACvC,MAAM,UAAU,IAAI;AAAA,EACpB,WAAW,aAAa,OAAO,YAAY;AAAA,IACzC,IAAI,GAAG,mBAAmB,SAAS,KAAK,UAAU,MAAM;AAAA,MACtD,QAAQ,IAAI,UAAU,KAAK,MAAM,SAAS;AAAA,IAC5C;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,cAAc,CACrB,IACA,QAC4B;AAAA,EAC5B,MAAM,UAAU,IAAI;AAAA,EACpB,WAAW,aAAa,OAAO,YAAY;AAAA,IACzC,IAAI,CAAC,GAAG,oBAAoB,SAAS,GAAG;AAAA,MACtC;AAAA,IACF;AAAA,IACA,MAAM,YAAY,UAAU,gBAAgB,QAAQ,EAAE,QAAQ,SAAS,EAAE;AAAA,IACzE,MAAM,WAAW,UAAU,cAAc;AAAA,IACzC,IAAI,CAAC,UAAU;AAAA,MACb;AAAA,IACF;AAAA,IACA,IAAI,GAAG,eAAe,QAAQ,GAAG;AAAA,MAC/B,WAAW,WAAW,SAAS,UAAU;AAAA,QACvC,QAAQ,IAAI,QAAQ,KAAK,MAAM;AAAA,UAC7B;AAAA,UACA,cAAc,QAAQ,cAAc,QAAQ,QAAQ,KAAK;AAAA,QAC3D,CAAC;AAAA,MACH;AAAA,IACF,EAAO,SAAI,GAAG,kBAAkB,QAAQ,GAAG;AAAA,MACzC,QAAQ,IAAI,SAAS,KAAK,MAAM,EAAE,WAAW,cAAc,IAAI,CAAC;AAAA,IAClE;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,iBAAiB,CACxB,UACA,WACoB;AAAA,EACpB,MAAM,OAAO,QAAQ,QAAQ,QAAQ,GAAG,SAAS;AAAA,EACjD,MAAM,aAAa;AAAA,IACjB;AAAA,IACA,GAAG;AAAA,IACH,GAAG;AAAA,IACH,KAAK,MAAM,UAAU;AAAA,IACrB,KAAK,MAAM,WAAW;AAAA,EACxB;AAAA,EACA,OAAO,WAAW,KAAK,CAAC,cAAc,WAAW,SAAS,CAAC;AAAA;AAG7D,SAAS,UAAU,CACjB,IACA,aACS;AAAA,EACT,QAAQ,YAAY,aAAa,CAAC,GAAG,KACnC,CAAC,aAAa,SAAS,SAAS,GAAG,WAAW,aAChD;AAAA;AAGF,SAAS,QAAQ,CACf,IACA,YACoB;AAAA,EACpB,aAAa,kBAAkB,IAAI,UAAU;AAAA,EAC7C,IAAI,GAAG,aAAa,UAAU,GAAG;AAAA,IAC/B,OAAO,WAAW;AAAA,EACpB;AAAA,EACA,IAAI,GAAG,2BAA2B,UAAU,GAAG;AAAA,IAC7C,OAAO,WAAW,KAAK;AAAA,EACzB;AAAA,EACA;AAAA;;;AG1WK,SAAS,SAAS,CAAC,SAAyB,MAA4B;AAAA,EAC7E,QAAQ,OAAO;AAAA,EACf,OAAO,kBAAkB,IAAI,IAAI;AAAA,EAEjC,IAAI,GAAG,2BAA2B,IAAI,GAAG;AAAA,IACvC,MAAM,YAAY,cAAc,IAAI,IAAI;AAAA,IACxC,IAAI,WAAW;AAAA,MACb,OAAO;AAAA,IACT;AAAA,IACA,MAAM,YAAY,cAAc,IAAI,IAAI;AAAA,IACxC,IAAI,WAAW;AAAA,MACb,QAAQ,SAAS,UAAU,MAAM,GAAG,EAAE,EAAE;AAAA,MACxC,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,SAAS,eAAe,IAAI,MAAM,QAAQ,MAAM,MAAM;AAAA,IAC5D,IAAI,WAAW,WAAW;AAAA,MACxB,OAAO,iBAAiB,MAAM;AAAA,IAChC;AAAA,IAEA,MAAM,OAAO,UAAU,SAAS,KAAK,UAAU;AAAA,IAC/C,IAAI,CAAC,WAAW,IAAI,GAAG;AAAA,MACrB,MAAM,QACJ,QAAQ,UACR,mFAAkB,KAAK,QAAQ,GACjC;AAAA,IACF;AAAA,IACA,OAAO,GAAG,QAAQ,KAAK,KAAK;AAAA,EAC9B;AAAA,EAEA,IAAI,GAAG,0BAA0B,IAAI,GAAG;AAAA,IACtC,MAAM,SAAS,eAAe,IAAI,MAAM,QAAQ,MAAM,MAAM;AAAA,IAC5D,IAAI,WAAW,WAAW;AAAA,MACxB,OAAO,iBAAiB,MAAM;AAAA,IAChC;AAAA,IACA,MAAM,OAAO,UAAU,SAAS,KAAK,UAAU;AAAA,IAC/C,MAAM,QAAQ,UAAU,SAAS,KAAK,kBAAkB;AAAA,IACxD,IAAI,CAAC,WAAW,IAAI,GAAG;AAAA,MACrB,MAAM,QACJ,QAAQ,UACR,mFAAkB,KAAK,QAAQ,GACjC;AAAA,IACF;AAAA,IACA,OAAO,GAAG,QAAQ;AAAA,EACpB;AAAA,EAEA,IAAI,GAAG,aAAa,IAAI,GAAG;AAAA,IACzB,QAAQ,QAAQ,QAAQ,WAAW,QAAQ;AAAA,IAC3C,IAAI,OAAO,IAAI,KAAK,IAAI,GAAG;AAAA,MACzB,OAAO,KAAK;AAAA,IACd;AAAA,IACA,IAAI,OAAO,IAAI,KAAK,IAAI,GAAG;AAAA,MACzB,OAAO,UAAU,SAAS,OAAO,IAAI,KAAK,IAAI,CAAE;AAAA,IAClD;AAAA,IACA,IAAI,OAAO,IAAI,KAAK,IAAI,GAAG;AAAA,MACzB,MAAM,SAAS,eAAe,IAAI,MAAM,MAAM;AAAA,MAC9C,IAAI,WAAW,WAAW;AAAA,QACxB,OAAO,iBAAiB,MAAM;AAAA,MAChC;AAAA,MACA,OAAO,UAAU,SAAS,OAAO,IAAI,KAAK,IAAI,CAAE;AAAA,IAClD;AAAA,IACA,MAAM,QAAQ,QAAQ,UAAU,2DAAc,KAAK,OAAO;AAAA,EAC5D;AAAA,EAEA,IAAI,GAAG,gBAAgB,IAAI,GAAG;AAAA,IAC5B,OAAO,aAAa,KAAK,IAAI;AAAA,EAC/B;AAAA,EACA,IAAI,GAAG,iBAAiB,IAAI,GAAG;AAAA,IAC7B,OAAO,KAAK;AAAA,EACd;AAAA,EACA,IAAI,KAAK,SAAS,GAAG,WAAW,aAAa;AAAA,IAC3C,OAAO;AAAA,EACT;AAAA,EACA,IAAI,KAAK,SAAS,GAAG,WAAW,cAAc;AAAA,IAC5C,OAAO;AAAA,EACT;AAAA,EACA,IAAI,KAAK,SAAS,GAAG,WAAW,aAAa;AAAA,IAC3C,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,GAAG,gCAAgC,IAAI,GAAG;AAAA,IAE5C,IAAI,KAAK,KAAK,SAAS,IAAI,GAAG;AAAA,MAC5B,OAAO,KAAK;AAAA,IACd;AAAA,IACA,OAAO,aAAa,KAAK,IAAI;AAAA,EAC/B;AAAA,EAEA,IAAI,GAAG,qBAAqB,IAAI,GAAG;AAAA,IACjC,MAAM,QAAkB,CAAC;AAAA,IACzB,IAAI,KAAK,KAAK,SAAS,IAAI;AAAA,MACzB,MAAM,KAAK,aAAa,KAAK,KAAK,IAAI,CAAC;AAAA,IACzC;AAAA,IACA,WAAW,QAAQ,KAAK,eAAe;AAAA,MACrC,MAAM,KAAK,UAAU,SAAS,KAAK,UAAU,CAAC;AAAA,MAC9C,IAAI,KAAK,QAAQ,SAAS,IAAI;AAAA,QAC5B,MAAM,KAAK,aAAa,KAAK,QAAQ,IAAI,CAAC;AAAA,MAC5C;AAAA,IACF;AAAA,IACA,OAAO,MAAM,KAAK,KAAK;AAAA,EACzB;AAAA,EAEA,IAAI,GAAG,mBAAmB,IAAI,GAAG;AAAA,IAC/B,OAAO,IAAI,UAAU,SAAS,KAAK,IAAI,KAAK,KAAK,cAAc,QAAQ,KAAK,UAAU,SAAS,KAAK,KAAK;AAAA,EAC3G;AAAA,EAEA,IAAI,GAAG,wBAAwB,IAAI,GAAG;AAAA,IACpC,OAAO,IAAI,UAAU,SAAS,KAAK,SAAS,OAAO,UAAU,SAAS,KAAK,QAAQ,OAAO,UAAU,SAAS,KAAK,SAAS;AAAA,EAC7H;AAAA,EAEA,IAAI,GAAG,wBAAwB,IAAI,GAAG;AAAA,IACpC,MAAM,WAAW,GAAG,cAAc,KAAK,QAAQ,KAAK,OAAO,KAAK,QAAQ;AAAA,IACxE,OAAO,IAAI,WAAW,UAAU,SAAS,KAAK,OAAO;AAAA,EACvD;AAAA,EAEA,IAAI,GAAG,yBAAyB,IAAI,GAAG;AAAA,IACrC,MAAM,SAAS,eAAe,IAAI,MAAM,QAAQ,MAAM,MAAM;AAAA,IAC5D,IAAI,WAAW,WAAW;AAAA,MACxB,OAAO,iBAAiB,MAAM;AAAA,IAChC;AAAA,IACA,MAAM,QAAQ,KAAK,SAAS,IAAI,CAAC,YAAY,UAAU,SAAS,OAAO,CAAC;AAAA,IACxE,OAAO,IAAI,MAAM,KAAK,IAAI;AAAA,EAC5B;AAAA,EAEA,IAAI,GAAG,0BAA0B,IAAI,GAAG;AAAA,IACtC,MAAM,SAAS,eAAe,IAAI,MAAM,QAAQ,MAAM,MAAM;AAAA,IAC5D,IAAI,WAAW,WAAW;AAAA,MACxB,OAAO,iBAAiB,MAAM;AAAA,IAChC;AAAA,IACA,MAAM,QACJ,QAAQ,UACR,iHAAuB,KAAK,QAAQ,GACtC;AAAA,EACF;AAAA,EAEA,IAAI,GAAG,iBAAiB,IAAI,GAAG;AAAA,IAC7B,MAAM,QACJ,QAAQ,UACR,wFAAkB,KAAK,QAAQ,yJACjC;AAAA,EACF;AAAA,EAEA,MAAM,QACJ,QAAQ,UACR,2DAAc,KAAK,QAAQ,KAAK,KAAK,MACvC;AAAA;AAIF,SAAS,aAAa,CACpB,IACA,MACoB;AAAA,EACpB,OAAO,eAAe,IAAI,MAAM,OAAO;AAAA;AAIzC,SAAS,aAAa,CACpB,IACA,MACoB;AAAA,EACpB,OAAO,eAAe,IAAI,MAAM,OAAO;AAAA;AAGzC,SAAS,cAAc,CACrB,IACA,MACA,QACoB;AAAA,EACpB,IAAI,UAA8B;AAAA,EAClC,MAAM,QAAkB,CAAC;AAAA,EACzB,OAAO,GAAG,2BAA2B,OAAO,GAAG;AAAA,IAC7C,MAAM,QAAQ,QAAQ,KAAK,IAAI;AAAA,IAC/B,UAAU,QAAQ;AAAA,IAClB,IACE,GAAG,2BAA2B,OAAO,KACrC,iBAAiB,IAAI,QAAQ,UAAU,GACvC;AAAA,MACA,IAAI,QAAQ,KAAK,SAAS,QAAQ;AAAA,QAChC,OAAO,MAAM,KAAK,GAAG;AAAA,MACvB;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,GAAG,0BAA0B,OAAO,GAAG;AAAA,MACzC,IACE,CAAC,GAAG,gBAAgB,QAAQ,kBAAkB,KAC9C,CAAC,eAAe,IAAI,QAAQ,UAAU,GACtC;AAAA,QACA;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,QAAQ,mBAAmB,IAAI;AAAA,MAC7C,UAAU,QAAQ;AAAA,MAClB,IACE,GAAG,2BAA2B,OAAO,KACrC,QAAQ,KAAK,SAAS,QACtB;AAAA,QACA,OAAO,MAAM,KAAK,GAAG;AAAA,MACvB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA;AAGF,SAAS,cAAc,CAAC,IAAoB,MAAmC;AAAA,EAC7E,OACE,GAAG,2BAA2B,IAAI,KAAK,iBAAiB,IAAI,KAAK,UAAU;AAAA;AAI/E,SAAS,UAAU,CAAC,OAAwB;AAAA,EAC1C,OAAO,0CAA0C,KAAK,KAAK;AAAA;AAG7D,SAAS,gBAAgB,CAAC,OAA4B;AAAA,EACpD,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,OAAO,aAAa,KAAK;AAAA,EAC3B;AAAA,EACA,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,OAAO,OAAO,KAAK;AAAA,EACrB;AAAA,EACA,IAAI,OAAO,UAAU,WAAW;AAAA,IAC9B,OAAO,QAAQ,SAAS;AAAA,EAC1B;AAAA,EACA,IAAI,UAAU,MAAM;AAAA,IAClB,OAAO;AAAA,EACT;AAAA,EACA,IAAI,MAAM,QAAQ,KAAK,GAAG;AAAA,IACxB,OAAO,IAAI,MAAM,IAAI,gBAAgB,EAAE,KAAK,IAAI;AAAA,EAClD;AAAA,EACA,MAAM,UAAU,OAAO,QAAQ,KAAK,EAAE,IACpC,EAAE,KAAK,UAAU,GAAG,QAAQ,iBAAiB,IAAI,GACnD;AAAA,EACA,OAAO,IAAI,QAAQ,KAAK,IAAI;AAAA;AAG9B,SAAS,YAAY,CAAC,OAAuB;AAAA,EAC3C,OAAO,IAAI,MAAM,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK;AAAA;;;ACvMtD,SAAS,IAAI,CAAC,SAAyB,SAAuB;AAAA,EACnE,QAAQ,SAAS,KAAK,OAAO;AAAA;;;ACnB/B,IAAM,oBAAoB,IAAI,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;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,gBAAgB,IAAI,IAAI,CAAC,mBAAmB,QAAQ,MAAM,CAAC;AAGjE,IAAM,UAAkC;AAAA,EACtC,KAAK;AAAA,EACL,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,YAAY;AAAA,EACZ,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,GAAG;AAAA,EACH,MAAM;AAAA,EACN,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AAAA,EACV,KAAK;AAAA,EACL,GAAG;AAAA,EAEH,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,WAAW;AAAA,EACX,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,sBAAsB;AAAA,EACtB,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,OAAO;AAAA,EACP,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,eAAe;AAAA,EACf,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,IAAI;AAAA,EACJ,oBAAoB;AAAA,EACpB,aAAa;AAAA,EAEb,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,UAAU;AACZ;AAGA,IAAM,YAAoC;AAAA,EACxC,OAAO;AAAA,EACP,KAAK;AAAA,EACL,WAAW;AAAA,EACX,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,SAAS;AACX;AAEA,IAAM,WAAW,IAAI,IAAI;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,WAAW,CAAC,KAAsB;AAAA,EACzC,OAAO,WAAW,KAAK,GAAG,KAAK,WAAW,KAAK,GAAG;AAAA;AAGpD,SAAS,iBAAiB,CAAC,KAAqB;AAAA,EAC9C,OAAO,IAAI,MAAM,CAAC,EAAE,YAAY;AAAA;AAG3B,SAAS,eAAe,CAC7B,SACA,aACA,OACA,iBAA8B,IAAI,KAChB;AAAA,EAClB,QAAQ,OAAO;AAAA,EACf,MAAM,eAAe,WAAW,SAAS,aAAa,QAAQ;AAAA,EAC9D,IAAI,CAAC,cAAc;AAAA,IACjB,MAAM,QACJ,YAAY,UACZ,gBAAM,YAAY,8CACpB;AAAA,EACF;AAAA,EACA,MAAM,OAAO,aAAa;AAAA,EAC1B,IAAI,CAAC,MAAM;AAAA,IACT,MAAM,QAAQ,YAAY,UAAU,yCAAgB;AAAA,EACtD;AAAA,EAEA,MAAM,SAAS,IAAI;AAAA,EACnB,IAAI;AAAA,EACJ,WAAW,aAAa,KAAK,YAAY;AAAA,IACvC,IAAI,GAAG,oBAAoB,SAAS,GAAG;AAAA,MACrC,MAAM,UAAU,UAAU,gBAAgB,QAAQ,GAAG,UAAU;AAAA,MAC/D,IAAI,CAAC,SAAS;AAAA,QACZ,MAAM,QACJ,YAAY,UACZ,gJACF;AAAA,MACF;AAAA,MACA,WAAW,eAAe,UAAU,gBAAgB,cAAc;AAAA,QAChE,IAAI,GAAG,aAAa,YAAY,IAAI,KAAK,YAAY,aAAa;AAAA,UAChE,OAAO,IAAI,YAAY,KAAK,MAAM,YAAY,WAAW;AAAA,QAC3D;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,GAAG,kBAAkB,SAAS,GAAG;AAAA,MACnC,kBAAkB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,MAAM,QACJ,YAAY,UACZ,sHAA2C,UAAU,QAAQ,EAAE,MAAM,GAAG,EAAE,GAC5E;AAAA,EACF;AAAA,EACA,IAAI,CAAC,iBAAiB,YAAY;AAAA,IAChC,MAAM,QAAQ,YAAY,UAAU,mEAA2B;AAAA,EACjE;AAAA,EAEA,MAAM,SAAS,oBAAoB,SAAS,WAAW;AAAA,EACvD,MAAM,UAA2B;AAAA,IAC/B,UAAU,IAAI;AAAA,IACd,gBAAgB,IAAI;AAAA,IACpB,iBAAiB,IAAI;AAAA,IACrB,cAAc,IAAI;AAAA,IAClB,UAAU,CAAC;AAAA,EACb;AAAA,EACA,MAAM,MAAmB;AAAA,IACvB;AAAA,IACA,OAAO,EAAE,QAAQ,IAAI,KAAO,QAAQ,OAAO;AAAA,IAC3C,QAAQ;AAAA,IACR,YAAY,CAAC;AAAA,IACb,SAAS,sBAAsB,IAAI,YAAY,MAAM;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,eACZ,SACA,aACA,gBAAgB,YAChB,GACF;AAAA,EACA,MAAM,SAAS,uCAAkC,QAAQ,QAAQ;AAAA,EACjE,OAAO;AAAA,IACL,UAAU,CAAC,QAAQ,GAAG,KAAK,EAAE,KAAK;AAAA,CAAI,IAAI;AAAA;AAAA,IAC1C;AAAA,EACF;AAAA;AAGF,SAAS,cAAc,CACrB,SACA,aACA,MACA,KACA,QAAQ,GACE;AAAA,EACV,IAAI,QAAQ,IAAI;AAAA,IACd,MAAM,QAAQ,YAAY,UAAU,8GAAoB;AAAA,EAC1D;AAAA,EACA,QAAQ,OAAO;AAAA,EACf,OAAO,kBAAkB,IAAI,IAAI;AAAA,EAEjC,OAAO,qBAAqB,IAAI,IAAI;AAAA,EAEpC,IAAI,KAAK,SAAS,GAAG,WAAW,aAAa;AAAA,IAC3C,OAAO,CAAC;AAAA,EACV;AAAA,EAEA,IAAI,GAAG,iBAAiB,IAAI,GAAG;AAAA,IAC7B,MAAM,YAAY,UAAS,IAAI,KAAK,UAAU;AAAA,IAC9C,MAAM,QAAQ,aAAa,IAAI,QAAQ,IAAI,SAAS,MAAM;AAAA,IAC1D,IAAI,SAAS,mBAAmB;AAAA,MAC9B,OAAO,qBAAqB,SAAS,aAAa,MAAM,KAAK,KAAK;AAAA,IACpE;AAAA,IACA,IAAI,SAAS,QAAQ;AAAA,MACnB,OAAO,YAAY,SAAS,aAAa,MAAM,KAAK,KAAK;AAAA,IAC3D;AAAA,IACA,IAAI,SAAS,QAAQ;AAAA,MACnB,OAAO,YAAY,SAAS,aAAa,MAAM,GAAG;AAAA,IACpD;AAAA,IACA,IAAI,QAAQ,kBAAkB,IAAI,IAAI,GAAG;AAAA,MACvC,OAAO,mBAAmB,SAAS,aAAa,MAAM,KAAK,KAAK;AAAA,IAClE;AAAA,IACA,MAAM,QACJ,YAAY,UACZ,qDAAa,QAAQ,yGACvB;AAAA,EACF;AAAA,EAEA,IAAI,GAAG,aAAa,IAAI,GAAG;AAAA,IACzB,IAAI,IAAI,MAAM,OAAO,IAAI,KAAK,IAAI,GAAG;AAAA,MACnC,OAAO,CAAC,OAAO,IAAI,MAAM,IAAI,KAAK,KAAK,QAAQ;AAAA,IACjD;AAAA,IACA,MAAM,cAAc,4BAClB,SACA,aACA,MACA,GACF;AAAA,IACA,IAAI,aAAa;AAAA,MACf,OAAO,eAAe,SAAS,aAAa,aAAa,KAAK,QAAQ,CAAC;AAAA,IACzE;AAAA,IACA,MAAM,QAAQ,YAAY,UAAU,2DAAc,KAAK,OAAO;AAAA,EAChE;AAAA,EAEA,IAAI,GAAG,0BAA0B,IAAI,GAAG;AAAA,IACtC,MAAM,gBAAgB,eAAe,IAAI,MAAM,WAAW;AAAA,IAC1D,IAAI,eAAe;AAAA,MACjB,OAAO,uBAAuB,SAAS,aAAa,MAAM,KAAK,KAAK;AAAA,IACtE;AAAA,IACA,MAAM,QACJ,YAAY,UACZ,0EAAwB,KAAK,QAAQ,EAAE,MAAM,GAAG,EAAE,GACpD;AAAA,EACF;AAAA,EAEA,IAAI,GAAG,wBAAwB,IAAI,GAAG;AAAA,IACpC,OAAO,mBAAmB,SAAS,aAAa,MAAM,KAAK,KAAK;AAAA,EAClE;AAAA,EAEA,IAAI,GAAG,mBAAmB,IAAI,GAAG;AAAA,IAC/B,IAAI,KAAK,cAAc,SAAS,GAAG,WAAW,yBAAyB;AAAA,MACrE,OAAO,kBAAkB,SAAS,aAAa,MAAM,KAAK,KAAK;AAAA,IACjE;AAAA,IACA,MAAM,QACJ,YAAY,UACZ,mIAAoC,KAAK,QAAQ,EAAE,MAAM,GAAG,EAAE,GAChE;AAAA,EACF;AAAA,EAEA,IAAI,GAAG,yBAAyB,IAAI,GAAG;AAAA,IACrC,MAAM,QAAkB,CAAC;AAAA,IACzB,WAAW,WAAW,KAAK,UAAU;AAAA,MACnC,IAAI,GAAG,gBAAgB,OAAO,GAAG;AAAA,QAC/B,MAAM,QAAQ,YAAY,UAAU,iEAAoB;AAAA,MAC1D;AAAA,MACA,MAAM,KAAK,GAAG,eAAe,SAAS,aAAa,SAAS,KAAK,KAAK,CAAC;AAAA,IACzE;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,WAAW,IAAI,IAAI,GAAG;AAAA,IACxB,OAAO,CAAC,OAAO,IAAI,MAAM,IAAI,YAAY,SAAS,aAAa,MAAM,GAAG,CAAC;AAAA,EAC3E;AAAA,EAEA,IACE,GAAG,2BAA2B,IAAI,KAClC,GAAG,0BAA0B,IAAI,GACjC;AAAA,IACA,OAAO;AAAA,MACL,OAAO,IAAI,MAAM,IACf,KAAK,UAAU,eAAe,SAAS,aAAa,GAAG,GAAG,IAAI;AAAA,IAClE;AAAA,EACF;AAAA,EAEA,MAAM,QACJ,YAAY,UACZ,wDAAqB,KAAK,QAAQ,EAAE,MAAM,GAAG,EAAE,GACjD;AAAA;AAGF,SAAS,kBAAkB,CACzB,SACA,aACA,MACA,KACA,OACU;AAAA,EACV,QAAQ,OAAO;AAAA,EACf,MAAM,YAAY,UAAS,IAAI,KAAK,UAAU;AAAA,EAC9C,MAAM,OAAO,IAAI,QAAQ,IAAI,SAAS,KAAK;AAAA,EAC3C,MAAM,OAAO,KAAK;AAAA,EAElB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EAEJ,IAAI,SAAS,OAAO,SAAS,OAAO;AAAA,IAClC,IAAI,KAAK,WAAW,GAAG;AAAA,MACrB,MAAM,QAAQ,YAAY,UAAU,GAAG,6CAAe;AAAA,IACxD;AAAA,IACA,UAAU,KAAK;AAAA,IACf,IACE,SAAS,SACT,KAAK,UAAU,KACf,GAAG,0BAA0B,KAAK,EAAE,GACpC;AAAA,MACA,MAAM,UAAU,KAAK;AAAA,MACrB,YAAY,eAAe,IAAI,SAAS,OAAO;AAAA,MAC/C,eAAe,eAAe,IAAI,SAAS,UAAU;AAAA,MACrD,gBAAgB,eAAe,IAAI,SAAS,WAAW;AAAA,MACvD,iBAAiB,eAAe,IAAI,SAAS,YAAY;AAAA,IAC3D,EAAO;AAAA,MACL,YAAY,KAAK;AAAA,MACjB,eAAe,KAAK;AAAA,MACpB,gBAAgB,KAAK;AAAA,MACrB,iBAAiB,KAAK;AAAA;AAAA,EAE1B,EAAO;AAAA,IAEL,UAAU,GAAG,QAAQ,oBAAoB,UAAU,IAAI,CAAC;AAAA,IACxD,MAAM,UAAU,KAAK;AAAA,IACrB,IAAI,WAAW,GAAG,0BAA0B,OAAO,GAAG;AAAA,MACpD,YAAY,eAAe,IAAI,SAAS,OAAO;AAAA,MAC/C,eAAe,eAAe,IAAI,SAAS,UAAU;AAAA,MACrD,gBAAgB,eAAe,IAAI,SAAS,WAAW;AAAA,MACvD,iBAAiB,eAAe,IAAI,SAAS,YAAY;AAAA,MACzD,MAAM,cAAc,QAAQ,WAAW,OACrC,CAAC,aACC,GAAG,qBAAqB,QAAQ,KAChC,GAAG,aAAa,SAAS,IAAI,KAC7B,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CACpC;AAAA,MACA,IAAI,YAAY,SAAS,GAAG;AAAA,QAC1B,YAAY,GAAG,QAAQ,8BAA8B;AAAA,UACnD,GAAI,aAAa,GAAG,0BAA0B,SAAS,IACnD,UAAU,aACV,CAAC;AAAA,UACL,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAAA,IACF;AAAA;AAAA,EAGF,IAAI,CAAC,GAAG,gBAAgB,OAAO,GAAG;AAAA,IAChC,MAAM,QAAQ,YAAY,UAAU,gFAAe;AAAA,EACrD;AAAA,EACA,OAAO,eACL,SACA,aACA,QAAQ,MACR,WACA,cACA,eACA,gBACA,KACA,KACF;AAAA;AAGF,SAAS,cAAc,CACrB,SACA,aACA,SACA,WACA,cACA,eACA,gBACA,KACA,OACU;AAAA,EACV,QAAQ,OAAO;AAAA,EACf,MAAM,UAAU,QAAQ;AAAA,EACxB,IAAI,CAAC,SAAS;AAAA,IACZ,MAAM,QACJ,YAAY,UACZ,+CAAiB,qEACnB;AAAA,EACF;AAAA,EAEA,MAAM,QAAkB,CAAC,GAAG,IAAI,UAAU;AAAA,EAE1C,IAAI,cAAc,WAAW;AAAA,IAC3B,IAAI,CAAC,GAAG,0BAA0B,SAAS,GAAG;AAAA,MAC5C,MAAM,QAAQ,YAAY,UAAU,qEAAmB;AAAA,IACzD;AAAA,IACA,WAAW,YAAY,UAAU,YAAY;AAAA,MAC3C,IACE,CAAC,GAAG,qBAAqB,QAAQ,KACjC,CAAC,GAAG,aAAa,SAAS,IAAI,GAC9B;AAAA,QACA,MAAM,QAAQ,YAAY,UAAU,qEAAmB;AAAA,MACzD;AAAA,MACA,MAAM,MAAM,SAAS,KAAK;AAAA,MAC1B,MAAM,QAAQ,SAAS;AAAA,MACvB,IAAI,QAAQ,OAAO;AAAA,QAEjB;AAAA,MACF;AAAA,MACA,IAAI,QAAQ,WAAW,QAAQ,aAAa;AAAA,QAC1C,MAAM,KAAK,iBAAiB,SAAS,aAAa,OAAO,GAAG,CAAC;AAAA,QAC7D;AAAA,MACF;AAAA,MACA,IAAI,QAAQ,SAAS;AAAA,QACnB,MAAM,KAAK,iBAAiB,SAAS,aAAa,OAAO,GAAG,CAAC;AAAA,QAC7D;AAAA,MACF;AAAA,MACA,IAAI,QAAQ,QAAQ;AAAA,QAClB,MAAM,KACJ,SAAS,qBAAqB,SAAS,aAAa,OAAO,mBAAS,IACtE;AAAA,QACA;AAAA,MACF;AAAA,MACA,IAAI,YAAY,GAAG,GAAG;AAAA,QACpB,MAAM,QAAQ,kBAAkB,GAAG;AAAA,QACnC,MAAM,KAAK,gBAAgB,SAAS,aAAa,OAAO,OAAO,GAAG,CAAC;AAAA,QACnE;AAAA,MACF;AAAA,MACA,MAAM,KAAK,mBAAmB,SAAS,aAAa,KAAK,OAAO,GAAG,CAAC;AAAA,IACtE;AAAA,EACF;AAAA,EAEA,IAAI,kBAAkB,WAAW;AAAA,IAC/B,IAAI,CAAC,GAAG,0BAA0B,aAAa,GAAG;AAAA,MAChD,MAAM,QAAQ,YAAY,UAAU,4DAAoB;AAAA,IAC1D;AAAA,IACA,WAAW,YAAY,cAAc,YAAY;AAAA,MAC/C,IACE,CAAC,GAAG,qBAAqB,QAAQ,KACjC,CAAC,GAAG,aAAa,SAAS,IAAI,GAC9B;AAAA,QACA,MAAM,QAAQ,YAAY,UAAU,4DAAoB;AAAA,MAC1D;AAAA,MACA,MAAM,QAAQ,SAAS,KAAK,KAAK,MAAM,GAAG,EAAE;AAAA,MAC5C,MAAM,eAAe,SAAS,KAAK,SAAS;AAAA,MAC5C,IAAI,cAAc;AAAA,QAChB,KACE,SACA,GAAG,YAAY,6CAAoB,SAAS,KAAK,wDACnD;AAAA,MACF;AAAA,MACA,MAAM,KACJ,gBAAgB,SAAS,aAAa,OAAO,SAAS,aAAa,GAAG,CACxE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,mBAAmB,WAAW;AAAA,IAChC,IAAI,CAAC,GAAG,0BAA0B,cAAc,GAAG;AAAA,MACjD,MAAM,QAAQ,YAAY,UAAU,6DAAqB;AAAA,IAC3D;AAAA,IACA,MAAM,SAAS,eAAe,IAAI,gBAAgB,IAAI;AAAA,IACtD,IAAI,QAAQ;AAAA,MACV,MAAM,SAAS,eAAe,IAAI,QAAQ,IAAI,MAAM,MAAM;AAAA,MAC1D,IAAI,WAAW,OAAO;AAAA,QACpB,OAAO,CAAC;AAAA,MACV;AAAA,MACA,IAAI,WAAW,MAAM;AAAA,QACnB,MAAM,KACJ,GAAG,QAAQ,QAAQ,wBAAwB,UAAU,eAAe,SAAS,aAAa,GAAG,GAAG,MAAM,MACxG;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAAM,WAAW,eAAe,IAAI,gBAAgB,MAAM;AAAA,IAC1D,IAAI,UAAU;AAAA,MACZ,MAAM,SAAS,eAAe,IAAI,UAAU,IAAI,MAAM,MAAM;AAAA,MAC5D,IAAI,WAAW,OAAO;AAAA,QACpB,MAAM,KAAK,QAAQ;AAAA,MACrB,EAAO,SAAI,WAAW,MAAM;AAAA,QAC1B,MAAM,UAAU,UACd,eAAe,SAAS,aAAa,GAAG,GACxC,QACF;AAAA,QACA,MAAM,KAAK,eAAe,aAAa;AAAA,MACzC;AAAA,IACF;AAAA,IACA,IAAI,eAAe,IAAI,gBAAgB,OAAO,GAAG;AAAA,MAC/C,MAAM,QACJ,YAAY,UACZ,iJACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,UACJ,MAAM,SAAS,IAAI,IAAI,WAAW,MAAM,KAAK,GAAG,OAAO,IAAI;AAAA,EAC7D,MAAM,QAAQ,CAAC,OAAO,IAAI,MAAM,IAAI,OAAO;AAAA,EAC3C,MAAM,aAAa,eACjB,SACA,aACA,gBAAgB,GAAG,QAAQ,6BAA6B,CAAC,CAAC,GAC1D;AAAA,OACK;AAAA,IACH,QAAQ,IAAI,SAAS;AAAA,EACvB,GACA,QAAQ,CACV;AAAA,EACA,MAAM,KAAK,GAAG,UAAU;AAAA,EACxB,MAAM,KAAK,OAAO,IAAI,MAAM,IAAI,KAAK,UAAU;AAAA,EAC/C,OAAO;AAAA;AAGT,SAAS,kBAAkB,CACzB,SACA,aACA,MACA,KACA,OACU;AAAA,EACV,MAAM,YAAY,UAChB,eAAe,SAAS,aAAa,GAAG,GACxC,KAAK,SACP;AAAA,EACA,MAAM,WAAW,eACf,SACA,aACA,KAAK,UACL,KACA,QAAQ,CACV;AAAA,EACA,MAAM,YAAY,eAChB,SACA,aACA,KAAK,WACL,KACA,QAAQ,CACV;AAAA,EACA,MAAM,QAAQ,CAAC,OAAO,IAAI,MAAM,IAAI,UAAU,QAAQ,QAAQ,wBAAwB,eAAe;AAAA,EACrG,MAAM,KAAK,GAAG,SAAS,IAAI,CAAC,SAAS,OAAO,IAAI,SAAS,CAAC,IAAI,IAAI,CAAC;AAAA,EACnE,MAAM,KAAK,OAAO,IAAI,MAAM,IAAI,UAAU;AAAA,EAC1C,IAAI,UAAU,SAAS,GAAG;AAAA,IACxB,MAAM,KAAK,OAAO,IAAI,MAAM,IAAI,UAAU,QAAQ,QAAQ,sBAAsB;AAAA,IAChF,MAAM,KAAK,GAAG,UAAU,IAAI,CAAC,SAAS,OAAO,IAAI,SAAS,CAAC,IAAI,IAAI,CAAC;AAAA,IACpE,MAAM,KAAK,OAAO,IAAI,MAAM,IAAI,UAAU;AAAA,EAC5C;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,iBAAiB,CACxB,SACA,aACA,MACA,KACA,OACU;AAAA,EACV,MAAM,YAAY,UAChB,eAAe,SAAS,aAAa,GAAG,GACxC,KAAK,IACP;AAAA,EACA,MAAM,QAAQ,eACZ,SACA,aACA,KAAK,OACL,KACA,QAAQ,CACV;AAAA,EACA,OAAO;AAAA,IACL,OAAO,IAAI,MAAM,IAAI,UAAU,QAAQ,QAAQ,wBAAwB;AAAA,IACvE,GAAG,MAAM,IAAI,CAAC,SAAS,OAAO,IAAI,SAAS,CAAC,IAAI,IAAI;AAAA,IACpD,OAAO,IAAI,MAAM,IAAI;AAAA,EACvB;AAAA;AAGF,SAAS,WAAW,CAClB,SACA,aACA,MACA,KACA,OACU;AAAA,EACV,QAAQ,OAAO;AAAA,EACf,OAAO,WAAW,YAAY,WAAW,KAAK;AAAA,EAC9C,IAAI,CAAC,aAAa,CAAC,YAAY;AAAA,IAC7B,MAAM,QAAQ,YAAY,UAAU,mDAA+B;AAAA,EACrE;AAAA,EACA,IAAI,CAAC,GAAG,gBAAgB,UAAU,GAAG;AAAA,IACnC,MAAM,QAAQ,YAAY,UAAU,2EAAyB;AAAA,EAC/D;AAAA,EAEA,MAAM,aAAuB,CAAC;AAAA,EAC9B,WAAW,aAAa,WAAW,YAAY;AAAA,IAC7C,IAAI,CAAC,GAAG,aAAa,UAAU,IAAI,GAAG;AAAA,MACpC,MAAM,QACJ,YAAY,UACZ,4EACF;AAAA,IACF;AAAA,IACA,WAAW,KAAK,UAAU,KAAK,IAAI;AAAA,EACrC;AAAA,EACA,IAAI,WAAW,SAAS,GAAG;AAAA,IACzB,MAAM,QAAQ,YAAY,UAAU,sEAA8B;AAAA,EACpE;AAAA,EAEA,MAAM,eAAe,UACnB,eAAe,SAAS,aAAa,GAAG,GACxC,SACF;AAAA,EACA,MAAM,WAAW,WAAW,MAAM;AAAA,EAClC,MAAM,YAAY,WAAW,MAAM;AAAA,EACnC,MAAM,aAA2B;AAAA,OAC5B,IAAI;AAAA,IACP,QAAQ,IAAI,IAAI,CAAC,GAAG,IAAI,MAAM,QAAQ,UAAU,SAAS,CAAC;AAAA,EAC5D;AAAA,EAEA,IAAI,UAAU;AAAA,EACd,IAAI,SAAS;AAAA,IACX,MAAM,aAAa,eACjB,SACA,aACA,SACA,UACA,SACF;AAAA,IACA,IAAI,YAAY;AAAA,MACd,UAAU,IAAI,QAAQ,QAAQ,uBAAuB;AAAA,IACvD;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,eACZ,SACA,aACA,WAAW,MACX;AAAA,OACK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ,IAAI,SAAS;AAAA,EACvB,GACA,QAAQ,CACV;AAAA,EAEA,OAAO;AAAA,IACL,OAAO,IAAI,MAAM,IACf,UAAU,QAAQ,QAAQ,yBAAyB,mBAAmB,QAAQ,QAAQ,4BAA4B,aAAa,QAAQ,QAAQ,6BAA6B,aAAa;AAAA,IAC3L,GAAG;AAAA,IACH,OAAO,IAAI,MAAM,IAAI;AAAA,EACvB;AAAA;AAGF,SAAS,cAAc,CACrB,SACA,aACA,SACA,UACA,WACoB;AAAA,EACpB,QAAQ,OAAO;AAAA,EACf,UAAU,kBAAkB,IAAI,OAAO;AAAA,EAEvC,IAAI,GAAG,gBAAgB,OAAO,GAAG;AAAA,IAC/B,MAAM,OAAO,oBAAoB,IAAI,OAAO;AAAA,IAC5C,IAAI,SAAS,WAAW;AAAA,MACtB,MAAM,QACJ,YAAY,UACZ,qFACF;AAAA,IACF;AAAA,IACA,UAAU;AAAA,EACZ;AAAA,EACA,IAAI,GAAG,aAAa,OAAO,GAAG;AAAA,IAC5B,IAAI,QAAQ,SAAS,WAAW;AAAA,MAC9B;AAAA,IACF;AAAA,IACA,IAAI,QAAQ,SAAS,UAAU;AAAA,MAC7B,MAAM,QACJ,YAAY,UACZ,sGACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,IACE,GAAG,2BAA2B,OAAO,KACrC,GAAG,aAAa,QAAQ,UAAU,GAClC;AAAA,IACA,MAAM,OAAO,QAAQ,WAAW;AAAA,IAChC,IAAI,SAAS,UAAU;AAAA,MACrB,OAAO,QAAQ,KAAK;AAAA,IACtB;AAAA,EACF;AAAA,EACA,MAAM,SAAS,YAAY,IAAI,SAAS,QAAQ;AAAA,EAChD,IAAI,QAAQ;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EACA,MAAM,QACJ,YAAY,UACZ,qFACF;AAAA;AAGF,SAAS,mBAAmB,CAC1B,IACA,OACgC;AAAA,EAChC,MAAM,OAAO,MAAM;AAAA,EACnB,IAAI,GAAG,QAAQ,IAAI,GAAG;AAAA,IACpB,MAAM,aAAa,KAAK,WAAW,OACjC,CAAC,cAAc,CAAC,GAAG,iBAAiB,SAAS,CAC/C;AAAA,IACA,IACE,WAAW,WAAW,KACtB,GAAG,kBAAkB,WAAW,EAAE,KAClC,WAAW,GAAG,YACd;AAAA,MACA,OAAO,WAAW,GAAG;AAAA,IACvB;AAAA,IACA;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,WAAW,CAClB,IACA,MACA,UACoB;AAAA,EACpB,OAAO,kBAAkB,IAAI,IAAI;AAAA,EACjC,IAAI,CAAC,GAAG,2BAA2B,IAAI,GAAG;AAAA,IACxC;AAAA,EACF;AAAA,EACA,IAAI,UAA8B;AAAA,EAClC,MAAM,QAAkB,CAAC;AAAA,EACzB,OAAO,GAAG,2BAA2B,OAAO,GAAG;AAAA,IAC7C,MAAM,QAAQ,QAAQ,KAAK,IAAI;AAAA,IAC/B,UAAU,QAAQ;AAAA,EACpB;AAAA,EACA,IAAI,GAAG,aAAa,OAAO,KAAK,QAAQ,SAAS,UAAU;AAAA,IACzD,OAAO,MAAM,KAAK,GAAG;AAAA,EACvB;AAAA,EACA;AAAA;AAGF,SAAS,oBAAoB,CAC3B,SACA,aACA,MACA,KACA,OACU;AAAA,EACV,QAAQ,OAAO;AAAA,EACf,MAAM,QAAQ,kBAAkB,IAAI,KAAK,UAAU,EAAE;AAAA,EAErD,IACE,GAAG,0BAA0B,KAAK,KAClC,eAAe,IAAI,OAAO,WAAW,GACrC;AAAA,IACA,OAAO,uBAAuB,SAAS,aAAa,OAAO,KAAK,KAAK;AAAA,EACvE;AAAA,EACA,OAAO,WAAW,WAAW,gBAAgB,KAAK;AAAA,EAClD,IAAI,CAAC,WAAW;AAAA,IACd,MAAM,QAAQ,YAAY,UAAU,4DAAyB;AAAA,EAC/D;AAAA,EACA,MAAM,iBAAiB,KAAK,UAAU;AAAA,EACtC,OAAO,iBACL,SACA,aACA,WACA,WACA,cACA,WACA,gBACA,KACA,KACF;AAAA;AAGF,SAAS,sBAAsB,CAC7B,SACA,aACA,MACA,KACA,OACU;AAAA,EACV,OAAO,iBACL,SACA,aACA,eAAe,QAAQ,IAAI,MAAM,WAAW,GAC5C,eAAe,QAAQ,IAAI,MAAM,OAAO,GACxC,eAAe,QAAQ,IAAI,MAAM,UAAU,GAC3C,eAAe,QAAQ,IAAI,MAAM,UAAU,GAC3C,eAAe,QAAQ,IAAI,MAAM,YAAY,GAC7C,KACA,KACF;AAAA;AAGF,SAAS,gBAAgB,CACvB,SACA,aACA,WACA,WACA,cACA,cACA,gBACA,KACA,OACU;AAAA,EACV,QAAQ,OAAO;AAAA,EACf,MAAM,SAAS,sBAAsB,SAAS,aAAa,SAAS;AAAA,EACpE,IAAI,CAAC,oBAAoB,SAAS,MAAM,GAAG;AAAA,IACzC,MAAM,QACJ,YAAY,UACZ,8DAAqC,OAAO,WAC9C;AAAA,EACF;AAAA,EACA,MAAM,MAAM,UAAU,OAAO,SAAS;AAAA,EACtC,IAAI,QAAQ,eAAe,IAAI,KAAK,MAAM;AAAA,EAE1C,MAAM,QAAkB,CAAC,GAAG,IAAI,UAAU;AAAA,EAC1C,MAAM,gBAAwC,CAAC;AAAA,EAE/C,IAAI,cAAc,WAAW;AAAA,IAC3B,IAAI,CAAC,GAAG,0BAA0B,SAAS,GAAG;AAAA,MAC5C,MAAM,QACJ,YAAY,UACZ,+EACF;AAAA,IACF;AAAA,IACA,WAAW,YAAY,UAAU,YAAY;AAAA,MAC3C,IACE,CAAC,GAAG,qBAAqB,QAAQ,KACjC,CAAC,GAAG,aAAa,SAAS,IAAI,GAC9B;AAAA,QACA,MAAM,QAAQ,YAAY,UAAU,qEAAmB;AAAA,MACzD;AAAA,MACA,MAAM,MAAM,SAAS,KAAK;AAAA,MAC1B,MAAM,QAAQ,SAAS;AAAA,MACvB,IAAI,GAAG,gBAAgB,KAAK,KAAK,GAAG,qBAAqB,KAAK,GAAG;AAAA,QAC/D,MAAM,QACJ,YAAY,UACZ,8CAAgB,iIAClB;AAAA,MACF;AAAA,MACA,cAAc,OAAO,cAAc,SAAS,aAAa,OAAO,GAAG;AAAA,MACnE,MAAM,SAAS,eAAe,IAAI,OAAO,IAAI,MAAM,MAAM;AAAA,MACzD,IAAI,WAAW,aAAa,WAAW,MAAM;AAAA,QAC3C,MAAM,KAAK,GAAG,QAAQ,WAAW,gBAAgB,MAAM,CAAC,IAAI;AAAA,MAC9D,EAAO;AAAA,QACL,MAAM,UAAU,UACd,eAAe,SAAS,aAAa,GAAG,GACxC,KACF;AAAA,QACA,MAAM,KAAK,GAAG,UAAU,YAAY;AAAA;AAAA,IAExC;AAAA,IACA,MAAM,WAAW,QAAQ,UAAU,IAAI,GAAG,KAAK,CAAC;AAAA,IAChD,SAAS,KAAK,aAAa;AAAA,IAC3B,QAAQ,UAAU,IAAI,KAAK,QAAQ;AAAA,EACrC;AAAA,EAEA,IAAI,iBAAiB,WAAW;AAAA,IAC9B,IAAI,CAAC,GAAG,0BAA0B,YAAY,GAAG;AAAA,MAC/C,MAAM,QAAQ,YAAY,UAAU,2DAAmB;AAAA,IACzD;AAAA,IACA,WAAW,YAAY,aAAa,YAAY;AAAA,MAC9C,IACE,CAAC,GAAG,qBAAqB,QAAQ,KACjC,CAAC,GAAG,aAAa,SAAS,IAAI,GAC9B;AAAA,QACA,MAAM,QAAQ,YAAY,UAAU,2DAAmB;AAAA,MACzD;AAAA,MACA,MAAM,QAAQ,sBACZ,SACA,aACA,SAAS,WACX;AAAA,MACA,IAAI,CAAC,OAAO;AAAA,QACV,MAAM,QACJ,YAAY,UACZ,wGACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,KAAK;AAAA,MAC5B,IAAI,QAAQ,SAAS,KAAK,KAAK;AAAA,MAC/B,MAAM,KACJ,QAAQ,SAAS,KAAK,4BAA4B,SAAS,KAAK,OAClE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,mBAAmB,WAAW;AAAA,IAChC,IAAI,CAAC,GAAG,0BAA0B,cAAc,GAAG;AAAA,MACjD,MAAM,QAAQ,YAAY,UAAU,6DAAqB;AAAA,IAC3D;AAAA,IACA,MAAM,SAAS,eAAe,IAAI,gBAAgB,IAAI;AAAA,IACtD,IAAI,QAAQ;AAAA,MACV,MAAM,SAAS,eAAe,IAAI,QAAQ,IAAI,MAAM,MAAM;AAAA,MAC1D,IAAI,WAAW,OAAO;AAAA,QACpB,OAAO,CAAC;AAAA,MACV;AAAA,MACA,IAAI,WAAW,MAAM;AAAA,QACnB,MAAM,KACJ,GAAG,QAAQ,QAAQ,wBAAwB,UAAU,eAAe,SAAS,aAAa,GAAG,GAAG,MAAM,MACxG;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,MAAM,SAAS,IAAI,IAAI,OAAO,MAAM,KAAK,GAAG,OAAO,IAAI;AAAA,EACvE,MAAM,QAAQ,CAAC,OAAO,IAAI,MAAM,IAAI,OAAO;AAAA,EAC3C,MAAM,aAAa,eACjB,SACA,aACA,gBAAgB,GAAG,QAAQ,6BAA6B,CAAC,CAAC,GAC1D;AAAA,OACK;AAAA,IACH,QAAQ,IAAI,SAAS;AAAA,EACvB,GACA,QAAQ,CACV;AAAA,EACA,MAAM,KAAK,GAAG,UAAU;AAAA,EACxB,MAAM,KAAK,OAAO,IAAI,MAAM,IAAI,KAAK,MAAM;AAAA,EAC3C,OAAO;AAAA;AAGT,SAAS,WAAW,CAClB,SACA,aACA,MACA,KACU;AAAA,EACV,MAAM,WAAW,KAAK,UAAU;AAAA,EAChC,IAAI,CAAC,UAAU;AAAA,IACb,OAAO,CAAC,OAAO,IAAI,MAAM,IAAI,SAAS;AAAA,EACxC;AAAA,EACA,MAAM,OAAO,qBACX,SACA,aACA,UACA,mBACF;AAAA,EACA,OAAO,CAAC,OAAO,IAAI,MAAM,IAAI,eAAe,SAAS;AAAA;AAGvD,SAAS,eAAe,CACtB,SACA,aACA,WACA,aACA,KACQ;AAAA,EACR,MAAM,YAAY,UAAU;AAAA,EAC5B,IAAI,CAAC,WAAW;AAAA,IACd,MAAM,QACJ,YAAY,UACZ,2DAAc,iCAAkB,OAAO,KAAK,SAAS,EAAE,KAAK,GAAG,SACjE;AAAA,EACF;AAAA,EACA,MAAM,SAAS,qBAAqB,SAAS,aAAa,WAAW;AAAA,EACrE,IAAI,QAAQ,SAAS,IAAI,MAAM;AAAA,EAC/B,OAAO,GAAG,QAAQ,QAAQ,UAAU,SAAS,MAAM;AAAA;AAGrD,SAAS,oBAAoB,CAC3B,SACA,aACA,aACQ;AAAA,EACR,QAAQ,OAAO;AAAA,EACf,cAAc,kBAAkB,IAAI,WAAW;AAAA,EAE/C,IACE,GAAG,2BAA2B,WAAW,KACzC,iBAAiB,IAAI,YAAY,UAAU,GAC3C;AAAA,IACA,OAAO,YAAY,KAAK;AAAA,EAC1B;AAAA,EAEA,IAAI,GAAG,gBAAgB,WAAW,GAAG;AAAA,IACnC,MAAM,OAAO,iBAAiB,IAAI,YAAY,IAAI;AAAA,IAClD,IAAI,QAAQ,KAAK,KAAK,WAAW,GAAG;AAAA,MAClC,OAAO,KAAK;AAAA,IACd;AAAA,IAGA,MAAM,MACJ,QAAQ,KAAK,KAAK,WAAW,IACzB,qBAAqB,IAAI,KAAK,KAAK,EAAE,IACrC;AAAA,IACN,IACE,QACA,KAAK,KAAK,WAAW,KACrB,YAAY,WAAW,WAAW,KAClC,GAAG,aAAa,YAAY,WAAW,GAAG,IAAI,KAC9C,QAAQ,aACR,GAAG,aAAa,GAAG,KACnB,YAAY,WAAW,GAAG,KAAK,SAAS,IAAI,MAC5C;AAAA,MACA,OAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA,EACA,MAAM,QACJ,YAAY,UACZ,iIACF;AAAA;AAGF,SAAS,qBAAqB,CAC5B,SACA,cACA,aAC0B;AAAA,EAC1B,QAAQ,OAAO;AAAA,EACf,cAAc,kBAAkB,IAAI,WAAW;AAAA,EAE/C,IACE,GAAG,2BAA2B,WAAW,KACzC,iBAAiB,IAAI,YAAY,UAAU,GAC3C;AAAA,IACA,OAAO,EAAE,OAAO,WAAW,QAAQ,YAAY,KAAK,MAAM,UAAU,KAAK;AAAA,EAC3E;AAAA,EACA,IAAI,CAAC,GAAG,gBAAgB,WAAW,GAAG;AAAA,IACpC;AAAA,EACF;AAAA,EACA,MAAM,OAAO,iBAAiB,IAAI,YAAY,IAAI;AAAA,EAClD,IAAI,CAAC,MAAM;AAAA,IACT;AAAA,EACF;AAAA,EACA,IAAI,KAAK,KAAK,WAAW,GAAG;AAAA,IAC1B,OAAO,EAAE,OAAO,WAAW,QAAQ,KAAK,QAAQ,UAAU,MAAM;AAAA,EAClE;AAAA,EACA,MAAM,MACJ,KAAK,KAAK,WAAW,IAAI,qBAAqB,IAAI,KAAK,KAAK,EAAE,IAAI;AAAA,EACpE,IACE,KAAK,KAAK,WAAW,KACrB,YAAY,WAAW,WAAW,KAClC,GAAG,aAAa,YAAY,WAAW,GAAG,IAAI,KAC9C,QAAQ,aACR,GAAG,aAAa,GAAG,KACnB,YAAY,WAAW,GAAG,KAAK,SAAS,IAAI,MAC5C;AAAA,IACA,OAAO,EAAE,OAAO,WAAW,QAAQ,KAAK,QAAQ,UAAU,KAAK;AAAA,EACjE;AAAA,EACA;AAAA;AAGF,SAAS,gBAAgB,CACvB,IACA,MAC6E;AAAA,EAC7E,IAAI;AAAA,EACJ,IAAI,GAAG,iBAAiB,IAAI,GAAG;AAAA,IAC7B,WAAW;AAAA,EACb,EAAO,SAAI,GAAG,QAAQ,IAAI,GAAG;AAAA,IAC3B,MAAM,aAAa,KAAK,WAAW,OACjC,CAAC,cAAc,CAAC,GAAG,iBAAiB,SAAS,CAC/C;AAAA,IACA,IAAI,WAAW,WAAW,KAAK,CAAC,GAAG,sBAAsB,WAAW,EAAE,GAAG;AAAA,MACvE;AAAA,IACF;AAAA,IACA,MAAM,aAAa,WAAW,GAAG;AAAA,IACjC,IAAI,CAAC,GAAG,iBAAiB,UAAU,GAAG;AAAA,MACpC;AAAA,IACF;AAAA,IACA,WAAW;AAAA,EACb,EAAO;AAAA,IACL;AAAA;AAAA,EAEF,MAAM,SAAS,SAAS;AAAA,EACxB,IACE,CAAC,GAAG,2BAA2B,MAAM,KACrC,CAAC,iBAAiB,IAAI,OAAO,UAAU,GACvC;AAAA,IACA;AAAA,EACF;AAAA,EACA,OAAO,EAAE,QAAQ,OAAO,KAAK,MAAM,MAAM,SAAS,UAAU;AAAA;AAI9D,SAAS,oBAAoB,CAC3B,IACA,YACc;AAAA,EACd,IAAI,OAAO;AAAA,EACX,UAAS;AAAA,IACP,IAAI,GAAG,eAAe,IAAI,GAAG;AAAA,MAC3B,OAAO,KAAK;AAAA,MACZ;AAAA,IACF;AAAA,IACA,IAAI,GAAG,0BAA0B,IAAI,GAAG;AAAA,MACtC,OAAO,KAAK;AAAA,MACZ;AAAA,IACF;AAAA,IACA,IAAI,GAAG,oBAAoB,IAAI,GAAG;AAAA,MAChC,OAAO,KAAK;AAAA,MACZ;AAAA,IACF;AAAA,IACA,OAAO;AAAA,EACT;AAAA;AAGF,SAAS,gBAAgB,CACvB,SACA,aACA,OACA,KACQ;AAAA,EACR,QAAQ,OAAO;AAAA,EACf,MAAM,SAAS,eAAe,IAAI,OAAO,IAAI,MAAM,MAAM;AAAA,EACzD,IAAI,OAAO,WAAW,UAAU;AAAA,IAE9B,MAAM,aAAa,eAAe,QAAQ,IAAI,cAAc;AAAA,IAC5D,OAAO,aACH,UAAU,WAAW,MAAM,mBAAmB,gBAC9C,UAAU,WAAW,MAAM;AAAA,EACjC;AAAA,EAGA,IAAI,WAAW,MAAM;AAAA,IACnB,OAAO;AAAA,EACT;AAAA,EACA,MAAM,OAAO,gBAAgB,IAAI,KAAK;AAAA,EACtC,IAAI,SAAS,WAAW;AAAA,IACtB,MAAM,aAAa,eAAe,MAAM,IAAI,cAAc;AAAA,IAC1D,OAAO,aACH,UAAU,WAAW,IAAI,mBAAmB,gBAC5C,UAAU,WAAW,IAAI;AAAA,EAC/B;AAAA,EACA,OAAO,YAAY,UAAU,eAAe,SAAS,aAAa,GAAG,GAAG,KAAK;AAAA;AAI/E,SAAS,cAAc,CACrB,WACA,gBACoB;AAAA,EACpB,WAAW,UAAU,UAAU,MAAM,KAAK,GAAG;AAAA,IAC3C,IAAI,WAAW,IAAI;AAAA,MACjB;AAAA,IACF;AAAA,IACA,IAAI,eAAe,IAAI,MAAM,KAAK,eAAe,IAAI,IAAI,QAAQ,GAAG;AAAA,MAClE,OAAO,GAAG,OAAO,QAAQ,OAAO,EAAE;AAAA,IACpC;AAAA,EACF;AAAA,EACA;AAAA;AAGF,SAAS,gBAAgB,CACvB,SACA,aACA,OACA,KACQ;AAAA,EACR,QAAQ,OAAO;AAAA,EACf,MAAM,UAAU,kBAAkB,IAAI,KAAK;AAAA,EAC3C,IAAI,CAAC,GAAG,0BAA0B,OAAO,GAAG;AAAA,IAC1C,MAAM,QAAQ,YAAY,UAAU,oEAAkB;AAAA,EACxD;AAAA,EACA,MAAM,eAAyB,CAAC;AAAA,EAChC,WAAW,YAAY,QAAQ,YAAY;AAAA,IACzC,IAAI,CAAC,GAAG,qBAAqB,QAAQ,KAAK,CAAC,GAAG,aAAa,SAAS,IAAI,GAAG;AAAA,MACzE,MAAM,QAAQ,YAAY,UAAU,wDAAgB;AAAA,IACtD;AAAA,IACA,MAAM,SAAS,SAAS,KAAK,KAAK,QAAQ,YAAY,KAAK,EAAE,YAAY;AAAA,IACzE,MAAM,SAAS,eAAe,IAAI,SAAS,aAAa,IAAI,MAAM,MAAM;AAAA,IACxE,IAAI,OAAO,WAAW,YAAY,OAAO,WAAW,UAAU;AAAA,MAC5D,MAAM,QACJ,YAAY,UACZ,6EAAsB,SAAS,KAAK,MACtC;AAAA,IACF;AAAA,IACA,aAAa,KAAK,GAAG,WAAW,OAAO,MAAM,IAAI;AAAA,EACnD;AAAA,EACA,OAAO,UAAU,WAAW,aAAa,KAAK,GAAG,CAAC;AAAA;AAGpD,SAAS,kBAAkB,CACzB,SACA,aACA,KACA,OACA,KACQ;AAAA,EACR,QAAQ,OAAO;AAAA,EACf,MAAM,WAAW,aAAa,GAAG;AAAA,EACjC,MAAM,SAAS,eAAe,IAAI,OAAO,IAAI,MAAM,MAAM;AAAA,EACzD,IAAI,WAAW,WAAW;AAAA,IACxB,IAAI,WAAW,SAAS,WAAW,MAAM;AAAA,MACvC,OAAO;AAAA,IACT;AAAA,IACA,IAAI,WAAW,MAAM;AAAA,MACnB,OAAO;AAAA,IACT;AAAA,IACA,OAAO,GAAG,aAAa,WAAW,gBAAgB,MAAM,CAAC;AAAA,EAC3D;AAAA,EACA,MAAM,OAAO,gBAAgB,IAAI,KAAK;AAAA,EACtC,IAAI,SAAS,WAAW;AAAA,IACtB,OAAO,GAAG,aAAa,WAAW,IAAI;AAAA,EACxC;AAAA,EACA,OAAO,GAAG,eAAe,UAAU,eAAe,SAAS,aAAa,GAAG,GAAG,KAAK;AAAA;AAIrF,IAAM,cAAsC;AAAA,EAC1C,SAAS;AAAA,EACT,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,WAAW;AAAA,EACX,aAAa;AAAA,EACb,aAAa;AAAA,EACb,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,uBAAuB;AAAA,EACvB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,eAAe;AAAA,EACf,cAAc;AAAA,EACd,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,qBAAqB;AAAA,EACrB,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,sBAAsB;AAAA,EACtB,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AACR;AAMA,SAAS,YAAY,CAAC,KAAqB;AAAA,EACzC,IAAI,QAAQ,QAAQ;AAAA,IAClB,OAAO;AAAA,EACT;AAAA,EACA,IAAI,IAAI,WAAW,MAAM,KAAK,IAAI,SAAS,GAAG;AAAA,IAC5C,OAAO,OAAO,IACX,MAAM,CAAC,EACP,QAAQ,YAAY,KAAK,EACzB,YAAY;AAAA,EACjB;AAAA,EACA,OAAO,YAAY,QAAQ;AAAA;AAG7B,SAAS,oBAAoB,CAC3B,SACA,aACA,OACA,MACQ;AAAA,EACR,QAAQ,OAAO;AAAA,EACf,MAAM,SAAS,eAAe,IAAI,OAAO,IAAI,GAAK;AAAA,EAClD,IAAI,OAAO,WAAW,UAAU;AAAA,IAC9B,MAAM,QAAQ,YAAY,UAAU,GAAG,4DAAe;AAAA,EACxD;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,WAAW,CAClB,SACA,aACA,MACA,KACQ;AAAA,EACR,QAAQ,OAAO;AAAA,EACf,OAAO,kBAAkB,IAAI,IAAI;AAAA,EACjC,IAAI,GAAG,gBAAgB,IAAI,GAAG;AAAA,IAC5B,OAAO,UAAU,KAAK,IAAI;AAAA,EAC5B;AAAA,EACA,IAAI,GAAG,gCAAgC,IAAI,GAAG;AAAA,IAC5C,OAAO,KAAK,KAAK,SAAS,IAAI,IAAI,KAAK,OAAO,UAAU,KAAK,IAAI;AAAA,EACnE;AAAA,EACA,IAAI,GAAG,qBAAqB,IAAI,GAAG;AAAA,IACjC,OAAO,KAAK,UAAU,eAAe,SAAS,aAAa,GAAG,GAAG,IAAI;AAAA,EACvE;AAAA,EACA,IAAI,GAAG,aAAa,IAAI,GAAG;AAAA,IACzB,IAAI,IAAI,MAAM,OAAO,IAAI,KAAK,IAAI,GAAG;AAAA,MACnC,OAAO,KAAK,KAAK;AAAA,IACnB;AAAA,IACA,MAAM,cAAc,4BAClB,SACA,aACA,MACA,GACF;AAAA,IACA,IAAI,aAAa;AAAA,MACf,OAAO,YAAY,SAAS,aAAa,aAAa,GAAG;AAAA,IAC3D;AAAA,IACA,MAAM,QAAQ,YAAY,UAAU,2DAAc,KAAK,OAAO;AAAA,EAChE;AAAA,EACA,IACE,GAAG,2BAA2B,IAAI,KAClC,GAAG,0BAA0B,IAAI,GACjC;AAAA,IACA,OAAO,KAAK,UAAU,eAAe,SAAS,aAAa,GAAG,GAAG,IAAI;AAAA,EACvE;AAAA,EACA,MAAM,QACJ,YAAY,UACZ,qDAAa,KAAK,QAAQ,EAAE,MAAM,GAAG,EAAE,GACzC;AAAA;AAGF,SAAS,UAAU,CAAC,IAAoB,MAA6B;AAAA,EACnE,OACE,GAAG,gBAAgB,IAAI,KACvB,GAAG,gCAAgC,IAAI,KACvC,GAAG,qBAAqB,IAAI;AAAA;AAIhC,SAAS,2BAA2B,CAClC,UACA,cACA,MACA,KACgC;AAAA,EAChC,IAAI,IAAI,MAAM,OAAO,IAAI,KAAK,IAAI,GAAG;AAAA,IACnC,OAAO,IAAI,MAAM,OAAO,IAAI,KAAK,IAAI;AAAA,EACvC;AAAA,EACA,IAAI,IAAI,MAAM,OAAO,IAAI,KAAK,IAAI,GAAG;AAAA,IACnC,OAAO,IAAI,MAAM,OAAO,IAAI,KAAK,IAAI;AAAA,EACvC;AAAA,EACA;AAAA;AAGF,SAAS,cAAc,CACrB,SACA,aACA,KACA;AAAA,EACA,OAAO;AAAA,IACL,IAAI,QAAQ;AAAA,IACZ,OAAO,IAAI;AAAA,IACX,UAAU,YAAY;AAAA,IACtB,QAAQ,CAAC,SAAiB,IAAI,QAAQ,gBAAgB,IAAI,IAAI;AAAA,EAChE;AAAA;AAGF,SAAS,SAAQ,CACf,IACA,YACoB;AAAA,EACpB,aAAa,kBAAkB,IAAI,UAAU;AAAA,EAC7C,IAAI,GAAG,aAAa,UAAU,GAAG;AAAA,IAC/B,OAAO,WAAW;AAAA,EACpB;AAAA,EACA,IAAI,GAAG,2BAA2B,UAAU,GAAG;AAAA,IAC7C,OAAO,WAAW,KAAK;AAAA,EACzB;AAAA,EACA;AAAA;AAGF,SAAS,cAAc,CACrB,IACA,QACA,KACgC;AAAA,EAChC,WAAW,YAAY,OAAO,YAAY;AAAA,IACxC,IACE,GAAG,qBAAqB,QAAQ,KAChC,GAAG,aAAa,SAAS,IAAI,KAC7B,SAAS,KAAK,SAAS,KACvB;AAAA,MACA,OAAO,SAAS;AAAA,IAClB;AAAA,EACF;AAAA,EACA;AAAA;AAGF,SAAS,mBAAmB,CAC1B,SACA,aACiC;AAAA,EACjC,MAAM,SAAS,IAAI;AAAA,EACnB,WAAW,aAAa,YAAY,OAAO,YAAY;AAAA,IACrD,IAAI,CAAC,QAAQ,GAAG,oBAAoB,SAAS,GAAG;AAAA,MAC9C;AAAA,IACF;AAAA,IACA,MAAM,UACJ,UAAU,gBAAgB,QAAQ,QAAQ,GAAG,UAAU;AAAA,IACzD,IAAI,CAAC,SAAS;AAAA,MACZ;AAAA,IACF;AAAA,IACA,WAAW,eAAe,UAAU,gBAAgB,cAAc;AAAA,MAChE,IACE,QAAQ,GAAG,aAAa,YAAY,IAAI,KACxC,YAAY,aACZ;AAAA,QACA,OAAO,IAAI,YAAY,KAAK,MAAM,YAAY,WAAW;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAIT,SAAS,qBAAqB,CAC5B,IACA,QACqB;AAAA,EACrB,MAAM,UAAU,IAAI;AAAA,EACpB,WAAW,aAAa,OAAO,YAAY;AAAA,IACzC,IAAI,CAAC,GAAG,oBAAoB,SAAS,GAAG;AAAA,MACtC;AAAA,IACF;AAAA,IACA,MAAM,YAAY,UAAU,gBAAgB,QAAQ,EAAE,QAAQ,SAAS,EAAE;AAAA,IACzE,IAAI,CAAC,UAAU,SAAS,UAAU,GAAG;AAAA,MACnC;AAAA,IACF;AAAA,IACA,MAAM,WAAW,UAAU,cAAc;AAAA,IACzC,IAAI,CAAC,YAAY,CAAC,GAAG,eAAe,QAAQ,GAAG;AAAA,MAC7C;AAAA,IACF;AAAA,IACA,WAAW,WAAW,SAAS,UAAU;AAAA,MACvC,MAAM,QAAQ,QAAQ,KAAK;AAAA,MAC3B,MAAM,WAAW,QAAQ,cAAc,QAAQ;AAAA,MAC/C,IAAI,kBAAkB,IAAI,QAAQ,KAAK,cAAc,IAAI,QAAQ,GAAG;AAAA,QAClE,QAAQ,IAAI,OAAO,QAAQ;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,aAAa,CACpB,SACA,cACA,OACA,KACQ;AAAA,EACR,QAAQ,OAAO;AAAA,EACf,MAAM,SAAS,eAAe,IAAI,OAAO,IAAI,MAAM,MAAM;AAAA,EACzD,IAAI,OAAO,WAAW,UAAU;AAAA,IAC9B,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,WAAW,UAAU;AAAA,IAC9B,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,WAAW,WAAW;AAAA,IAC/B,OAAO;AAAA,EACT;AAAA,EACA,IAAI,MAAM,QAAQ,MAAM,GAAG;AAAA,IACzB,OAAO;AAAA,EACT;AAAA,EACA,IAAI,WAAW,aAAa,OAAO,WAAW,UAAU;AAAA,IACtD,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,eAAe,CACtB,IACA,MACoB;AAAA,EACpB,OAAO,kBAAkB,IAAI,IAAI;AAAA,EACjC,IAAI,GAAG,gCAAgC,IAAI,KAAK,KAAK,KAAK,SAAS,IAAI,GAAG;AAAA,IACxE,OAAO,KAAK;AAAA,EACd;AAAA,EACA;AAAA;AAGF,SAAS,eAAe,CAAC,OAA4B;AAAA,EACnD,OAAO,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;AAAA;AAGzD,SAAS,SAAS,CAAC,MAAsB;AAAA,EACvC,MAAM,QAAQ,KACX,QAAQ,sBAAsB,OAAO,EACrC,QAAQ,kBAAkB,EAAE,EAC5B,YAAY;AAAA,EACf,IAAI,CAAC,OAAO;AAAA,IACV,MAAM,IAAI,MAAM,mCAAU,kDAAe;AAAA,EAC3C;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,SAAS,CAAC,OAAuB;AAAA,EACxC,OAAO,MACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM;AAAA;AAGzB,SAAS,UAAU,CAAC,OAAuB;AAAA,EACzC,OAAO,UAAU,KAAK,EAAE,QAAQ,MAAM,QAAQ;AAAA;AAGhD,SAAS,MAAM,CAAC,OAAuB;AAAA,EACrC,OAAO,KAAK,OAAO,KAAK;AAAA;AAGnB,SAAS,UAAU,CACxB,SACA,aACA,MACuC;AAAA,EACvC,QAAQ,OAAO;AAAA,EACf,OAAO,YAAY,YAAY,QAAQ,KACrC,CAAC,WACC,GAAG,oBAAoB,MAAM,KAAK,OAAO,KAAK,QAAQ,MAAM,IAChE;AAAA;;;AC9mDF,IAAM,sBAAsB,IAAI,IAAI;AAAA,EAClC;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;AAOM,SAAS,aAAa,CAC3B,SACA,aACgB;AAAA,EAChB,QAAQ,OAAO;AAAA,EACf,MAAM,SAAS,WAAW,SAAS,aAAa,YAAY;AAAA,EAC5D,IAAI,CAAC,QAAQ,MAAM;AAAA,IACjB,OAAO,EAAE,OAAO,IAAI,QAAQ,IAAI,gBAAgB,IAAI,IAAM;AAAA,EAC5D;AAAA,EAEA,MAAM,SAAS,qBAAoB,SAAS,WAAW;AAAA,EACvD,MAAM,UAAwB,CAAC;AAAA,EAC/B,WAAW,aAAa,OAAO,KAAK,YAAY;AAAA,IAC9C,IAAI,GAAG,iBAAiB,SAAS,GAAG;AAAA,MAClC;AAAA,IACF;AAAA,IACA,IAAI,CAAC,GAAG,sBAAsB,SAAS,GAAG;AAAA,MACxC,MAAM,QACJ,YAAY,UACZ,8EACF;AAAA,IACF;AAAA,IACA,MAAM,aAAa,UAAU;AAAA,IAC7B,MAAM,QAAQ,cAAc,SAAS,aAAa,YAAY,MAAM;AAAA,IACpE,IAAI,OAAO;AAAA,MACT,QAAQ,KAAK,KAAK;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,MAAM,QAAkB,CAAC;AAAA,EACzB,MAAM,SAAmB,CAAC;AAAA,EAC1B,MAAM,iBAAiB,IAAI;AAAA,EAC3B,WAAW,SAAS,SAAS;AAAA,IAC3B,MAAM,SAAS,MAAM,aAAa,SAAS,SAAS;AAAA,IACpD,OAAO,KAAK,YAAY,OAAO,QAAQ,UAAU,CAAC;AAAA,IAClD,IAAI,MAAM,SAAS,MAAM,aAAa,QAAQ;AAAA,MAC5C,eAAe,IAAI,MAAM,QAAQ;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,OAAO,EAAE,OAAO,MAAM,KAAK;AAAA,CAAI,GAAG,QAAQ,OAAO,KAAK;AAAA,CAAI,GAAG,eAAe;AAAA;AAG9E,SAAS,aAAa,CACpB,SACA,aACA,YACA,QACwB;AAAA,EACxB,QAAQ,OAAO;AAAA,EACf,IAAI,CAAC,GAAG,iBAAiB,UAAU,GAAG;AAAA,IACpC,MAAM,QACJ,YAAY,UACZ,8EACF;AAAA,EACF;AAAA,EACA,MAAM,SAAS,WAAW;AAAA,EAC1B,MAAM,UAAU,GAAG,2BAA2B,MAAM,IAChD,OAAO,aACP;AAAA,EACJ,IACE,CAAC,GAAG,2BAA2B,MAAM,KACrC,OAAO,KAAK,SAAS,cACrB,CAAC,WACD,CAAC,GAAG,2BAA2B,OAAO,KACtC,CAAC,iBAAiB,IAAI,QAAQ,UAAU,KACxC,QAAQ,KAAK,SAAS,gBACtB;AAAA,IACA,MAAM,QACJ,YAAY,UACZ,8EACF;AAAA,EACF;AAAA,EACA,MAAM,cAAc,WAAW,UAAU;AAAA,EACzC,IAAI,CAAC,eAAe,CAAC,GAAG,0BAA0B,WAAW,GAAG;AAAA,IAC9D,MAAM,QACJ,YAAY,UACZ,+FACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,iBAAiB,IAAI,aAAa,YAAY,MAAM;AAAA,EACrE,MAAM,aAAa,iBAAiB,IAAI,aAAa,cAAc,MAAM;AAAA,EACzE,MAAM,QAAQ,iBAAiB,IAAI,aAAa,SAAS,MAAM;AAAA,EAC/D,MAAM,QAAQ,UAAU,IAAI,aAAa,MAAM;AAAA,EAC/C,IAAI,aAAa,aAAa,eAAe,WAAW;AAAA,IACtD,MAAM,QACJ,YAAY,UACZ,qEACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL;AAAA,IACA;AAAA,OACI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,OACrB,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,EAC3B;AAAA;AAGF,SAAS,gBAAgB,CACvB,IACA,QACA,KACA,QACoB;AAAA,EACpB,MAAM,QAAQ,gBAAe,IAAI,QAAQ,GAAG;AAAA,EAC5C,IAAI,CAAC,OAAO;AAAA,IACV;AAAA,EACF;AAAA,EACA,MAAM,SAAS,eAAe,IAAI,OAAO,MAAM;AAAA,EAC/C,OAAO,OAAO,WAAW,WAAW,SAAS;AAAA;AAG/C,SAAS,gBAAgB,CACvB,IACA,QACA,KACA,QAC6C;AAAA,EAC7C,MAAM,QAAQ,gBAAe,IAAI,QAAQ,GAAG;AAAA,EAC5C,IAAI,CAAC,OAAO;AAAA,IACV;AAAA,EACF;AAAA,EACA,IAAI,CAAC,GAAG,0BAA0B,KAAK,GAAG;AAAA,IACxC;AAAA,EACF;AAAA,EACA,MAAM,SAA0C,CAAC;AAAA,EACjD,WAAW,YAAY,MAAM,YAAY;AAAA,IACvC,IAAI,CAAC,GAAG,qBAAqB,QAAQ,KAAK,CAAC,GAAG,aAAa,SAAS,IAAI,GAAG;AAAA,MACzE;AAAA,IACF;AAAA,IACA,MAAM,SAAS,eAAe,IAAI,SAAS,aAAa,MAAM;AAAA,IAC9D,IAAI,OAAO,WAAW,YAAY,OAAO,WAAW,UAAU;AAAA,MAC5D;AAAA,IACF;AAAA,IACA,OAAO,SAAS,KAAK,QAAQ;AAAA,EAC/B;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,SAAS,CAChB,IACA,QACA,QAC6D;AAAA,EAC7D,MAAM,QAAQ,gBAAe,IAAI,QAAQ,OAAO;AAAA,EAChD,IAAI,CAAC,OAAO;AAAA,IACV;AAAA,EACF;AAAA,EACA,IAAI,CAAC,GAAG,0BAA0B,KAAK,GAAG;AAAA,IACxC;AAAA,EACF;AAAA,EACA,MAAM,SAA0D,CAAC;AAAA,EACjE,WAAW,YAAY,MAAM,YAAY;AAAA,IACvC,IACE,CAAC,GAAG,qBAAqB,QAAQ,KACjC,CAAC,GAAG,gBAAgB,SAAS,IAAI,KACjC,CAAC,GAAG,0BAA0B,SAAS,WAAW,GAClD;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM,QAAyC,CAAC;AAAA,IAChD,WAAW,QAAQ,SAAS,YAAY,YAAY;AAAA,MAClD,IAAI,CAAC,GAAG,qBAAqB,IAAI,KAAK,CAAC,GAAG,aAAa,KAAK,IAAI,GAAG;AAAA,QACjE;AAAA,MACF;AAAA,MACA,MAAM,SAAS,eAAe,IAAI,KAAK,aAAa,MAAM;AAAA,MAC1D,IAAI,OAAO,WAAW,YAAY,OAAO,WAAW,UAAU;AAAA,QAC5D;AAAA,MACF;AAAA,MACA,MAAM,KAAK,KAAK,QAAQ;AAAA,IAC1B;AAAA,IACA,OAAO,SAAS,KAAK,QAAQ;AAAA,EAC/B;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,WAAW,CAAC,OAAmB,YAAkC;AAAA,EAExE,MAAM,WAAW,MAAM,aAAa,SAAS,SAAS,MAAM;AAAA,EAC5D,MAAM,QAAkB,CAAC;AAAA,EACzB,MAAM,KAAK,GAAG;AAAA,EAAe,aAAa,MAAM,YAAY,UAAU;AAAA,EAAM;AAAA,EAC5E,IAAI,MAAM,OAAO;AAAA,IAEf,MAAM,KACJ,GAAG;AAAA,EAAqB,aAAa,MAAM,OAAO,UAAU;AAAA,EAC9D;AAAA,EACF;AAAA,EACA,YAAY,OAAO,eAAe,OAAO,QAAQ,MAAM,SAAS,CAAC,CAAC,GAAG;AAAA,IACnE,MAAM,KACJ,UAAU;AAAA,EAAY;AAAA,EAAe,aACnC,YACA,UACF;AAAA;AAAA,EACF;AAAA,EACF;AAAA,EACA,OAAO,MAAM,KAAK;AAAA,CAAI;AAAA;AAGxB,SAAS,YAAY,CACnB,YACA,YACQ;AAAA,EACR,OAAO,OAAO,QAAQ,UAAU,EAC7B,IAAI,EAAE,KAAK,WAAW;AAAA,IACrB,MAAM,SAAS,IAAI,QAAQ,YAAY,KAAK,EAAE,YAAY;AAAA,IAC1D,OAAO,KAAK,WAAW,YAAY,KAAK,OAAO,UAAU;AAAA,GAC1D,EACA,KAAK;AAAA,CAAI;AAAA;AAGd,SAAS,WAAW,CAClB,KACA,OACA,YACQ;AAAA,EACR,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,UAAU,KAAK,oBAAoB,IAAI,GAAG,GAAG;AAAA,IAC/C,OAAO,OAAO,KAAK;AAAA,EACrB;AAAA,EAEA,OAAO,eAAe,QAAQ,GAAG,QAAQ,SAAS,GAAG;AAAA;AAGvD,SAAS,eAAc,CACrB,IACA,QACA,KACgC;AAAA,EAChC,WAAW,YAAY,OAAO,YAAY;AAAA,IACxC,IACE,GAAG,qBAAqB,QAAQ,KAChC,GAAG,aAAa,SAAS,IAAI,KAC7B,SAAS,KAAK,SAAS,KACvB;AAAA,MACA,OAAO,SAAS;AAAA,IAClB;AAAA,EACF;AAAA,EACA;AAAA;AAGF,SAAS,oBAAmB,CAC1B,SACA,aACiC;AAAA,EACjC,MAAM,SAAS,IAAI;AAAA,EACnB,WAAW,aAAa,YAAY,OAAO,YAAY;AAAA,IACrD,IAAI,CAAC,QAAQ,GAAG,oBAAoB,SAAS,GAAG;AAAA,MAC9C;AAAA,IACF;AAAA,IACA,MAAM,UACJ,UAAU,gBAAgB,QAAQ,QAAQ,GAAG,UAAU;AAAA,IACzD,IAAI,CAAC,SAAS;AAAA,MACZ;AAAA,IACF;AAAA,IACA,WAAW,eAAe,UAAU,gBAAgB,cAAc;AAAA,MAChE,IACE,QAAQ,GAAG,aAAa,YAAY,IAAI,KACxC,YAAY,aACZ;AAAA,QACA,OAAO,IAAI,YAAY,KAAK,MAAM,YAAY,WAAW;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA;;;AC9SF,SAAS,YAAY,CAC1B,SACA,aACQ;AAAA,EACR,QAAQ,OAAO;AAAA,EACf,MAAM,SAAS,WAAW,SAAS,aAAa,WAAW;AAAA,EAC3D,IAAI,CAAC,QAAQ,MAAM;AAAA,IACjB,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAAS,qBAAoB,SAAS,WAAW;AAAA,EACvD,MAAM,SAAS,IAAI;AAAA,EACnB,IAAI;AAAA,EACJ,WAAW,aAAa,OAAO,KAAK,YAAY;AAAA,IAC9C,IAAI,GAAG,oBAAoB,SAAS,GAAG;AAAA,MACrC,MAAM,UAAU,UAAU,gBAAgB,QAAQ,GAAG,UAAU;AAAA,MAC/D,IAAI,CAAC,SAAS;AAAA,QACZ,MAAM,QACJ,YAAY,UACZ,wGACF;AAAA,MACF;AAAA,MACA,WAAW,eAAe,UAAU,gBAAgB,cAAc;AAAA,QAChE,IAAI,GAAG,aAAa,YAAY,IAAI,KAAK,YAAY,aAAa;AAAA,UAChE,OAAO,IAAI,YAAY,KAAK,MAAM,YAAY,WAAW;AAAA,QAC3D;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,GAAG,kBAAkB,SAAS,GAAG;AAAA,MACnC,kBAAkB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,MAAM,QACJ,YAAY,UACZ,yHAA8C,UAAU,QAAQ,EAAE,MAAM,GAAG,EAAE,GAC/E;AAAA,EACF;AAAA,EACA,IAAI,CAAC,iBAAiB,YAAY;AAAA,IAChC,MAAM,QAAQ,YAAY,UAAU,sEAA8B;AAAA,EACpE;AAAA,EAEA,MAAM,YAAY,IAAI,IAAI,CAAC,GAAG,QAAQ,GAAG,MAAM,CAAC;AAAA,EAChD,MAAM,QAAQ,eAAe,IAAI,gBAAgB,YAAY,SAAS;AAAA,EACtE,IAAI,UAAU,WAAW;AAAA,IACvB,MAAM,QACJ,YAAY,UACZ,yMACF;AAAA,EACF;AAAA,EACA,OAAO,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA;AAGtC,SAAS,oBAAmB,CAC1B,SACA,aACiC;AAAA,EACjC,MAAM,SAAS,IAAI;AAAA,EACnB,WAAW,aAAa,YAAY,OAAO,YAAY;AAAA,IACrD,IAAI,CAAC,QAAQ,GAAG,oBAAoB,SAAS,GAAG;AAAA,MAC9C;AAAA,IACF;AAAA,IACA,MAAM,UACJ,UAAU,gBAAgB,QAAQ,QAAQ,GAAG,UAAU;AAAA,IACzD,IAAI,CAAC,SAAS;AAAA,MACZ;AAAA,IACF;AAAA,IACA,WAAW,eAAe,UAAU,gBAAgB,cAAc;AAAA,MAChE,IACE,QAAQ,GAAG,aAAa,YAAY,IAAI,KACxC,YAAY,aACZ;AAAA,QACA,OAAO,IAAI,YAAY,KAAK,MAAM,YAAY,WAAW;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA;;;ACjFT,IAAM,iBAAyC;AAAA,EAC7C,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EAEb,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,UAAU;AACZ;AAEA,IAAM,sBAA8C;AAAA,EAClD,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AACf;AAeO,SAAS,cAAc,CAC5B,SACA,aACA,WACA,MACA,cACiB;AAAA,EACjB,QAAQ,OAAO;AAAA,EACf,MAAM,UAAU,IAAI;AAAA,EACpB,WAAW,UAAU,YAAY,YAAY,SAAS;AAAA,IACpD,IACE,GAAG,oBAAoB,MAAM,KAC7B,GAAG,aAAa,OAAO,IAAI,KAC3B,CAAC,SAAS,IAAI,MAAM,GACpB;AAAA,MACA,QAAQ,IAAI,OAAO,KAAK,MAAM,MAAM;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,SAAS,SAAS,iBAAiB;AAAA,EACxD,MAAM,OAAO,IAAI,IAAI,SAAS;AAAA,EAC9B,WAAW,QAAQ,OAAO,KAAK,YAAY,GAAG;AAAA,IAC5C,IAAI,QAAQ,IAAI,IAAI,GAAG;AAAA,MACrB,KAAK,IAAI,IAAI;AAAA,IACf;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,CAAC,GAAG,IAAI;AAAA,EACtB,MAAM,UAAU,IAAI;AAAA,EACpB,MAAM,UAA2B,CAAC;AAAA,EAClC,MAAM,mBAAoC,CAAC;AAAA,EAC3C,MAAM,cAAc,IAAI;AAAA,EAExB,OAAO,MAAM,SAAS,GAAG;AAAA,IACvB,MAAM,OAAO,MAAM,MAAM;AAAA,IACzB,IAAI,QAAQ,IAAI,IAAI,GAAG;AAAA,MACrB;AAAA,IACF;AAAA,IACA,QAAQ,IAAI,IAAI;AAAA,IAChB,MAAM,cAAc,QAAQ,IAAI,IAAI;AAAA,IACpC,IAAI,CAAC,aAAa;AAAA,MAChB,MAAM,QAAQ,YAAY,UAAU,2DAAc,OAAO;AAAA,IAC3D;AAAA,IAEA,MAAM,eAAe,aAAa;AAAA,IAClC,MAAM,MAAM,gBAAgB;AAAA,IAC5B,IAAI,YAAY,IAAI,GAAG,GAAG;AAAA,MACxB,MAAM,QACJ,YAAY,UACZ,uBAAQ,+EACV;AAAA,IACF;AAAA,IACA,YAAY,IAAI,GAAG;AAAA,IAEnB,MAAM,KAAK,cACT,SACA,aACA,aACA,MACA,cACA,KACF;AAAA,IACA,IAAI,cAAc;AAAA,MAChB,iBAAiB,KAAK,EAAE,KAAK,GAAG,CAAC;AAAA,IACnC,EAAO;AAAA,MACL,QAAQ,KAAK,EAAE,KAAK,GAAG,CAAC;AAAA;AAAA,EAE5B;AAAA,EAEA,OAAO,EAAE,SAAS,SAAS,WAAW,iBAAiB;AAAA;AAGzD,SAAS,aAAa,CACpB,SACA,aACA,aACA,MACA,cACA,mBACQ;AAAA,EACR,QAAQ,OAAO;AAAA,EACf,IAAI,CAAC,YAAY,MAAM;AAAA,IACrB,MAAM,QACJ,YAAY,UACZ,gBAAM,YAAY,KAAK,QAAQ,kCACjC;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,YAAY,WAAW,IAAI,CAAC,cACzC,GAAG,QAAQ,2BACT,WACA,UAAU,gBACV,UAAU,MACV,WACA,WACA,UAAU,WACZ,CACF;AAAA,EACA,MAAM,YAAY,QAAQ,IAAI,WAAW,IACrC,CAAC,GAAG,QAAQ,eAAe,GAAG,WAAW,YAAY,CAAC,IACtD;AAAA,EAEJ,MAAM,qBAAqB,GAAG,QAAQ,yBACpC,WACA,WACA,WACA,WACA,QACA,WACA,YAAY,IACd;AAAA,EAEA,MAAM,SAAS,qBAAoB,SAAS,WAAW;AAAA,EACvD,MAAM,SAAS,IAAI;AAAA,EACnB,MAAM,qBAEF,CAAC,qBAAqB;AAAA,IACxB,OAAO,CAAC,SACN,MAAM,SAAS,aAAa,MAAM;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA;AAAA,EAEL,MAAM,SAAS,GAAG,UAAU,oBAAoB,CAAC,kBAAkB,CAAC;AAAA,EACpE,MAAM,cAAc,OAAO,YAAY;AAAA,EACvC,OAAO,QAAQ;AAAA,EAEf,MAAM,UAAU,GAAG,cAAc,EAAE,SAAS,GAAG,YAAY,SAAS,CAAC;AAAA,EACrE,MAAM,UAAU,QAAQ,UACtB,GAAG,SAAS,YACZ,aACA,YAAY,MACd;AAAA,EAIA,MAAM,aAAa,GAAG,gBAAgB,SAAS;AAAA,IAC7C,iBAAiB,EAAE,QAAQ,GAAG,aAAa,QAAQ,QAAQ,GAAG,WAAW,KAAK;AAAA,IAC9E,mBAAmB;AAAA,EACrB,CAAC;AAAA,EACD,OAAO,WAAW,WAAW,KAAK;AAAA;AAYpC,SAAS,KAAK,CACZ,SACA,aACA,MACA,OACc;AAAA,EACd,QAAQ,OAAO;AAAA,EAEf,IAAI,GAAG,eAAe,IAAI,GAAG;AAAA,IAC3B,WAAW,aAAa,KAAK,YAAY;AAAA,MACvC,IAAI,GAAG,aAAa,UAAU,IAAI,GAAG;AAAA,QACnC,MAAM,OAAO,IAAI,UAAU,KAAK,IAAI;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,GAAG,sBAAsB,IAAI,KAAK,GAAG,aAAa,KAAK,IAAI,GAAG;AAAA,IAChE,MAAM,OAAO,IAAI,KAAK,KAAK,IAAI;AAAA,EACjC;AAAA,EAGA,IACE,GAAG,mBAAmB,IAAI,KAC1B,qBAAqB,IAAI,KAAK,cAAc,IAAI,GAChD;AAAA,IACA,IAAI,uBAAuB,IAAI,KAAK,IAAI,GAAG;AAAA,MACzC,MAAM,QACJ,YAAY,UACZ,sGACF;AAAA,IACF;AAAA,IACA,MAAM,OAAO,UAAU,IAAI,KAAK,IAAI;AAAA,IACpC,IAAI,SAAS,WAAW;AAAA,MACtB,MAAM,aAAa,qBAAqB,IAAI,MAAM,YAAY,QAAQ;AAAA,MACtE,OAAO,GAAG,eACR,YACA,CAAC,UAAU,MAAM,SAAS,aAAa,OAAO,KAAK,GACnD,MAAM,gBACR;AAAA,IACF;AAAA,EACF;AAAA,EAGA,IAAI,GAAG,iBAAiB,IAAI,KAAK,iBAAiB,IAAI,MAAM,UAAU,GAAG;AAAA,IACvE,MAAM,OAAO,GAAG,QAAQ,qBACtB,GAAG,QAAQ,+BACT,GAAG,QAAQ,WAAW,GACtB,SACF,GACA,WACA,KAAK,SACP;AAAA,IACA,OAAO,GAAG,eACR,MACA,CAAC,UAAU,MAAM,SAAS,aAAa,OAAO,KAAK,GACnD,MAAM,gBACR;AAAA,EACF;AAAA,EAGA,IAAI,GAAG,iBAAiB,IAAI,KAAK,iBAAiB,IAAI,MAAM,MAAM,GAAG;AAAA,IACnE,IAAI,MAAM,SAAS,aAAa;AAAA,MAC9B,MAAM,QACJ,YAAY,UACZ,sJACF;AAAA,IACF;AAAA,IACA,MAAM,YAAY,KAAK,UAAU;AAAA,IACjC,IAAI,CAAC,GAAG,gBAAgB,SAAS,GAAG;AAAA,MAClC,MAAM,QACJ,YAAY,UACZ,0FACF;AAAA,IACF;AAAA,IACA,MAAM,aAAa,IAAI,UAAU,IAAI;AAAA,IACrC,MAAM,OAAO,GAAG,QAAQ,6BACtB,KAAK,UAAU,MAAM,CAAC,CACxB;AAAA,IACA,MAAM,UAAU,GAAG,QAAQ,8BAA8B;AAAA,MACvD,GAAG,QAAQ,yBAAyB,QAAQ,IAAI;AAAA,IAClD,CAAC;AAAA,IACD,MAAM,OAAO,GAAG,QAAQ,qBACtB,GAAG,QAAQ,+BACT,GAAG,QAAQ,WAAW,GACtB,cACF,GACA,WACA,CAAC,WAAW,OAAO,CACrB;AAAA,IACA,OAAO,GAAG,eACR,MACA,CAAC,UAAU,MAAM,SAAS,aAAa,OAAO,KAAK,GACnD,MAAM,gBACR;AAAA,EACF;AAAA,EAGA,IACE,GAAG,iBAAiB,IAAI,KACxB,GAAG,2BAA2B,KAAK,UAAU,KAC7C,iBAAiB,IAAI,KAAK,WAAW,UAAU,GAC/C;AAAA,IACA,MAAM,aAAa,KAAK,WAAW,KAAK;AAAA,IACxC,IAAI,CAAC,eAAe,IAAI,UAAU,GAAG;AAAA,MACnC,MAAM,kBAAkB,KAAK,UAAU;AAAA,IACzC;AAAA,EACF;AAAA,EAGA,IACE,GAAG,2BAA2B,IAAI,KAClC,iBAAiB,IAAI,KAAK,UAAU,GACpC;AAAA,IACA,IAAI,KAAK,KAAK,SAAS,SAAS;AAAA,MAC9B,OAAO,GAAG,QAAQ,+BAChB,GAAG,QAAQ,WAAW,GACtB,MACF;AAAA,IACF;AAAA,IACA,IAAI,KAAK,KAAK,SAAS,SAAS;AAAA,MAC9B,IAAI,MAAM,SAAS,aAAa;AAAA,QAC9B,MAAM,QAAQ,YAAY,UAAU,6DAAqB;AAAA,MAC3D;AAAA,MACA,OAAO,GAAG,QAAQ,+BAChB,GAAG,QAAQ,WAAW,GACtB,YACF;AAAA,IACF;AAAA,EACF;AAAA,EAGA,IACE,GAAG,aAAa,IAAI,KACpB,CAAC,MAAM,OAAO,IAAI,KAAK,IAAI,KAC3B,MAAM,OAAO,IAAI,KAAK,IAAI,GAC1B;AAAA,IACA,MAAM,SAAS,eACb,IACA,MAAM,OAAO,IAAI,KAAK,IAAI,GAC1B,MAAM,MACR;AAAA,IACA,IAAI,WAAW,WAAW;AAAA,MACxB,MAAM,QACJ,YAAY,UACZ,2GAAsB,KAAK,OAC7B;AAAA,IACF;AAAA,IACA,OAAO,YAAY,IAAI,MAAM;AAAA,EAC/B;AAAA,EAEA,OAAO,GAAG,eACR,MACA,CAAC,UAAU,MAAM,SAAS,aAAa,OAAO,KAAK,GACnD,MAAM,gBACR;AAAA;AAGF,IAAM,iBAAiB,IAAI,IAAI,CAAC,QAAQ,YAAY,WAAW,cAAc,CAAC;AAM9E,SAAS,oBAAoB,CAC3B,IACA,MACA,UACoB;AAAA,EACpB,MAAM,OAAO,UAAU,IAAI,KAAK,IAAI;AAAA,EACpC,IAAI,SAAS,WAAW;AAAA,IACtB,MAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AAAA,EACA,MAAM,WAAW,KAAK,cAAc;AAAA,EACpC,MAAM,aAAa,aAAa,GAAG,WAAW;AAAA,EAE9C,IAAI;AAAA,EACJ,IAAI,YAAY;AAAA,IACd,MAAM,eAAe,qBAAqB,IAAI,QAAQ;AAAA,IACtD,IAAI,CAAC,cAAc;AAAA,MACjB,MAAM,IAAI,MACR,qDAAa,KAAK,cAAc,QAAQ,MAAM,WAChD;AAAA,IACF;AAAA,IACA,QAAQ,GAAG,QAAQ,uBACjB,KAAK,MACL,cACA,KAAK,KACP;AAAA,EACF,EAAO;AAAA,IACL,QAAQ,KAAK;AAAA;AAAA,EAGf,MAAM,MAAM,GAAG,QAAQ,oBAAoB,IAAI;AAAA,EAC/C,MAAM,SAAS,GAAG,QAAQ,8BAA8B;AAAA,IACtD,GAAG,QAAQ,yBAAyB,KAAK,KAAK;AAAA,EAChD,CAAC;AAAA,EACD,OAAO,GAAG,QAAQ,qBAChB,GAAG,QAAQ,+BACT,GAAG,QAAQ,WAAW,GACtB,SACF,GACA,WACA,CAAC,MAAM,CACT;AAAA;AAOF,SAAS,SAAS,CAChB,IACA,MACoB;AAAA,EACpB,MAAM,SAAmB,CAAC;AAAA,EAC1B,IAAI,UAA8B;AAAA,EAClC,UAAS;AAAA,IACP,IAAI,GAAG,2BAA2B,OAAO,GAAG;AAAA,MAC1C,IACE,iBAAiB,IAAI,QAAQ,UAAU,KACvC,QAAQ,KAAK,SAAS,SACtB;AAAA,QACA,IAAI,OAAO,WAAW,GAAG;AAAA,UACvB;AAAA,QACF;AAAA,QACA,OAAO,OACJ,QAAQ,EACR,IAAI,CAAC,UAAW,MAAM,WAAW,GAAG,IAAI,QAAQ,IAAI,OAAQ,EAC5D,KAAK,EAAE,EACP,MAAM,CAAC;AAAA,MACZ;AAAA,MACA,OAAO,KAAK,QAAQ,KAAK,IAAI;AAAA,MAC7B,UAAU,QAAQ;AAAA,MAClB;AAAA,IACF;AAAA,IACA,IAAI,GAAG,0BAA0B,OAAO,GAAG;AAAA,MACzC,MAAM,WAAW,QAAQ;AAAA,MACzB,IAAI,CAAC,GAAG,gBAAgB,QAAQ,KAAK,CAAC,GAAG,iBAAiB,QAAQ,GAAG;AAAA,QACnE;AAAA,MACF;AAAA,MACA,OAAO,KAAK,IAAI,SAAS,OAAO;AAAA,MAChC,UAAU,QAAQ;AAAA,MAClB;AAAA,IACF;AAAA,IACA;AAAA,EACF;AAAA;AAGF,SAAS,oBAAoB,CAC3B,IACA,MACS;AAAA,EACT,OACE,SAAS,GAAG,WAAW,eACvB,SAAS,GAAG,WAAW,mBACvB,SAAS,GAAG,WAAW,oBACvB,SAAS,GAAG,WAAW,uBACvB,SAAS,GAAG,WAAW,oBACvB,SAAS,GAAG,WAAW,sBACvB,SAAS,GAAG,WAAW,+BACvB,SAAS,GAAG,WAAW,qCACvB,SAAS,GAAG,WAAW,gDACvB,SAAS,GAAG,WAAW,wBACvB,SAAS,GAAG,WAAW,kBACvB,SAAS,GAAG,WAAW,oBACvB,SAAS,GAAG,WAAW,+BACvB,SAAS,GAAG,WAAW,iCACvB,SAAS,GAAG,WAAW,qBACvB,SAAS,GAAG,WAAW;AAAA;AAI3B,SAAS,sBAAsB,CAC7B,IACA,MACS;AAAA,EACT,OACE,GAAG,2BAA2B,IAAI,KAClC,iBAAiB,IAAI,KAAK,UAAU,KACpC,KAAK,KAAK,SAAS;AAAA;AAIvB,SAAS,oBAAoB,CAC3B,IACA,MACgC;AAAA,EAChC,QAAQ;AAAA,SACD,GAAG,WAAW;AAAA,MACjB,OAAO,GAAG,WAAW;AAAA,SAClB,GAAG,WAAW;AAAA,MACjB,OAAO,GAAG,WAAW;AAAA,SAClB,GAAG,WAAW;AAAA,MACjB,OAAO,GAAG,WAAW;AAAA,SAClB,GAAG,WAAW;AAAA,MACjB,OAAO,GAAG,WAAW;AAAA,SAClB,GAAG,WAAW;AAAA,MACjB,OAAO,GAAG,WAAW;AAAA;AAAA,MAErB;AAAA;AAAA;AAIN,SAAS,gBAAgB,CACvB,IACA,MACA,MACS;AAAA,EACT,OACE,GAAG,2BAA2B,KAAK,UAAU,KAC7C,iBAAiB,IAAI,KAAK,WAAW,UAAU,KAC/C,KAAK,WAAW,KAAK,SAAS;AAAA;AAIlC,SAAS,QAAQ,CACf,IACA,aACS;AAAA,EACT,QAAQ,YAAY,aAAa,CAAC,GAAG,KACnC,CAAC,aAAa,SAAS,SAAS,GAAG,WAAW,aAChD;AAAA;AAGF,SAAS,OAAO,CACd,IACA,aACS;AAAA,EACT,QAAQ,YAAY,aAAa,CAAC,GAAG,KACnC,CAAC,aAAa,SAAS,SAAS,GAAG,WAAW,YAChD;AAAA;AAGF,SAAS,WAAW,CAClB,IACA,OACoB;AAAA,EACpB,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,OAAO,GAAG,QAAQ,oBAAoB,KAAK;AAAA,EAC7C;AAAA,EACA,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,OAAO,GAAG,QAAQ,qBAAqB,OAAO,KAAK,CAAC;AAAA,EACtD;AAAA,EACA,IAAI,OAAO,UAAU,WAAW;AAAA,IAC9B,OAAO,QAAQ,GAAG,QAAQ,WAAW,IAAI,GAAG,QAAQ,YAAY;AAAA,EAClE;AAAA,EACA,IAAI,UAAU,MAAM;AAAA,IAClB,OAAO,GAAG,QAAQ,WAAW;AAAA,EAC/B;AAAA,EACA,IAAI,MAAM,QAAQ,KAAK,GAAG;AAAA,IACxB,OAAO,GAAG,QAAQ,6BAChB,MAAM,IAAI,CAAC,SAAS,YAAY,IAAI,IAAI,CAAC,CAC3C;AAAA,EACF;AAAA,EACA,OAAO,GAAG,QAAQ,8BAChB,OAAO,QAAQ,KAAK,EAAE,IAAI,EAAE,KAAK,UAC/B,GAAG,QAAQ,yBACT,GAAG,QAAQ,oBAAoB,GAAG,GAClC,YAAY,IAAI,IAAI,CACtB,CACF,CACF;AAAA;AAGF,SAAS,oBAAmB,CAC1B,SACA,aACiC;AAAA,EACjC,MAAM,SAAS,IAAI;AAAA,EACnB,WAAW,aAAa,YAAY,OAAO,YAAY;AAAA,IACrD,IAAI,CAAC,QAAQ,GAAG,oBAAoB,SAAS,GAAG;AAAA,MAC9C;AAAA,IACF;AAAA,IACA,MAAM,UACJ,UAAU,gBAAgB,QAAQ,QAAQ,GAAG,UAAU;AAAA,IACzD,IAAI,CAAC,SAAS;AAAA,MACZ;AAAA,IACF;AAAA,IACA,WAAW,eAAe,UAAU,gBAAgB,cAAc;AAAA,MAChE,IACE,QAAQ,GAAG,aAAa,YAAY,IAAI,KACxC,YAAY,aACZ;AAAA,QACA,OAAO,IAAI,YAAY,KAAK,MAAM,YAAY,WAAW;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA;;;AC/iBF,SAAS,WAAW,CACzB,SACA,aACA,SACc;AAAA,EACd,QAAQ,MAAM,SAAS;AAAA,EAEvB,IAAI,SAAS,aAAa;AAAA,IACxB,MAAM,SAAS,QAAQ,WAAW,IAAI,IAAI;AAAA,IAC1C,IAAI,QAAQ;AAAA,MACV,OAAO;AAAA,IACT;AAAA,IACA,IAAI,QAAQ,UAAU,IAAI,IAAI,GAAG;AAAA,MAC/B,MAAM,QAAQ,YAAY,UAAU,yCAAW,MAAM;AAAA,IACvD;AAAA,IACA,QAAQ,UAAU,IAAI,IAAI;AAAA,EAC5B;AAAA,EAEA,IAAI;AAAA,IAEF,MAAM,SAAS,cAAc,SAAS,WAAW;AAAA,IACjD,QAAQ,UAAU,YAAY,gBAC5B,SACA,aACA,MACA,OAAO,cACT;AAAA,IACA,MAAM,OAAO,aAAa,SAAS,WAAW;AAAA,IAE9C,MAAM,YAAY,IAAI,IAAI,QAAQ,QAAQ;AAAA,IAC1C,WAAW,WAAW,QAAQ,UAAU;AAAA,MACtC,UAAU,IAAI,QAAQ,MAAM;AAAA,IAC9B;AAAA,IACA,MAAM,eAAe,IAAI;AAAA,IACzB,MAAM,kBAAkB,eACtB,SACA,aACA,WACA,MACA,YACF;AAAA,IAGA,MAAM,UAA2B,CAAC,GAAG,gBAAgB,OAAO;AAAA,IAC5D,WAAW,WAAW,QAAQ,UAAU;AAAA,MACtC,MAAM,MAAM,sBAAsB,QAAQ;AAAA,MAC1C,MAAM,KAAK,QAAQ,WACf,sBAAsB,QAAQ,gCAC9B,qBAAqB,QAAQ;AAAA,MACjC,QAAQ,KAAK,EAAE,KAAK,GAAG,CAAC;AAAA,IAC1B;AAAA,IAEA,MAAM,kBAA0C,CAAC;AAAA,IACjD,YAAY,KAAK,WAAW,QAAQ,gBAAgB;AAAA,MAClD,YAAY,SAAS,QAAQ,EAAE,MAAM,aAAa,MAAM,IAAI,CAAC;AAAA,MAC7D,gBAAgB,OAAO,eAAe,OAAO;AAAA,IAC/C;AAAA,IAEA,MAAM,OAAqB;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,OAAO;AAAA,MACd,aAAa,OAAO;AAAA,MACpB;AAAA,MACA,YAAY,CAAC;AAAA,MACb,iBAAiB,QAAQ;AAAA,MACzB;AAAA,MACA,WAAW,gBAAgB;AAAA,MAC3B,cAAc,CAAC,GAAG,YAAY;AAAA,MAC9B;AAAA,IACF;AAAA,IAEA,IAAI,SAAS,aAAa;AAAA,MACxB,QAAQ,WAAW,IAAI,MAAM,IAAI;AAAA,IACnC;AAAA,IACA,OAAO;AAAA,YACP;AAAA,IACA,IAAI,SAAS,aAAa;AAAA,MACxB,QAAQ,UAAU,OAAO,IAAI;AAAA,IAC/B;AAAA;AAAA;AAKG,SAAS,2BAA2B,CAAC,SAA+B;AAAA,EACzE,YAAY,KAAK,SAAS,QAAQ,YAAY;AAAA,IAC5C,MAAM,aAAa,IAAI;AAAA,IACvB,WAAW,YAAY,QAAQ,UAAU,IAAI,GAAG,KAAK,CAAC,GAAG;AAAA,MACvD,YAAY,MAAM,SAAS,OAAO,QAAQ,QAAQ,GAAG;AAAA,QACnD,IAAI,CAAC,WAAW,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,MAAM,QAAQ;AAAA,UAC5D,WAAW,IAAI,MAAM,IAAI;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,IACA,WAAW,QAAQ,KAAK,iBAAiB;AAAA,MACvC,IAAI,CAAC,WAAW,IAAI,IAAI,GAAG;AAAA,QACzB,WAAW,IAAI,MAAM,MAAM;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,KAAK,aAAa,OAAO,YAAY,UAAU;AAAA,EACjD;AAAA;;;ACxHF,IAAM,mBAAmB,CAAC,cACxB,qCAAgC;AAG3B,SAAS,cAAc,CAAC,MAAoB,SAA4B;AAAA,EAC7E,MAAM,QAAkB;AAAA,IACtB,iBAAiB,QAAQ,EAAE;AAAA,IAC3B;AAAA,IACA,WAAW,UAAU,KAAK,IAAI;AAAA,EAChC;AAAA,EACA,WAAW,SAAS,CAAC,GAAG,KAAK,SAAS,GAAG,KAAK,SAAS,GAAG;AAAA,IACxD,MAAM,KAAK,KAAK,MAAM,QAAQ,MAAM,KAAK;AAAA,EAC3C;AAAA,EACA,MAAM,KAAK,KAAK;AAAA,EAChB,OAAO,MAAM,KAAK;AAAA,CAAI,IAAI;AAAA;AAAA;AAIrB,SAAS,mBAAmB,CAAC,MAAoB,SAA4B;AAAA,EAClF,MAAM,QAAkB,CAAC,iBAAiB,QAAQ,EAAE,GAAG,aAAa;AAAA,EACpE,MAAM,KAAK,iBAAiB,yBAAyB,KAAK,UAAU,IAAI;AAAA,EACxE,MAAM,KAAK,WAAW,UAAU,KAAK,IAAI,IAAI;AAAA,EAC7C,MAAM,KAAK,cAAc;AAAA,EACzB,WAAW,SAAS,KAAK,SAAS;AAAA,IAChC,MAAM,KAAK,OAAO,MAAM,QAAQ,MAAM,KAAK;AAAA,EAC7C;AAAA,EACA,MAAM,KAAK,MAAM;AAAA,EACjB,IAAI,KAAK,UAAU,SAAS,GAAG;AAAA,IAC7B,MAAM,KAAK,gBAAgB;AAAA,IAC3B,WAAW,SAAS,KAAK,WAAW;AAAA,MAClC,MAAM,KAAK,OAAO,MAAM,QAAQ,MAAM,KAAK;AAAA,IAC7C;AAAA,IACA,MAAM,KAAK,MAAM;AAAA,EACnB;AAAA,EACA,MAAM,KAAK,KAAK;AAAA,EAChB,OAAO,MAAM,KAAK;AAAA,CAAI,IAAI;AAAA;AAAA;AAI5B,SAAS,SAAS,CAAC,MAAsB;AAAA,EACvC,MAAM,OAAO,KACV,KAAK,EACL,QAAQ,OAAO,EAAE,EACjB,QAAQ,OAAO,EAAE,EACjB,KAAK;AAAA,EACR,OAAO;AAAA,IAAQ,KAAK,QAAQ,OAAO;AAAA,GAAM;AAAA;AAAA;AAIpC,SAAS,wBAAwB,CAAC,YAAmC;AAAA,EAC1E,MAAM,UAAU,OAAO,QAAQ,UAAU;AAAA,EACzC,IAAI,QAAQ,WAAW,GAAG;AAAA,IACxB,OAAO;AAAA,EACT;AAAA,EACA,MAAM,QAAQ,QAAQ,IACpB,EAAE,MAAM,UACN,OAAO,KAAK,UAAU,IAAI,cAAc,SAAS,SAAS,SAAS,oBACvE;AAAA,EACA,OAAO;AAAA,EAAM,MAAM,KAAK;AAAA,CAAI;AAAA;AAAA;;;AZlD9B,IAAM,oBAAoB,CAAC,cACzB,kCAA6B;AAM/B,eAAsB,gBAAgB,CACpC,QACA,SACsB;AAAA,EACtB,MAAM,KAAK,OAAO;AAAA,EAClB,IAAI,CAAC,IAAI;AAAA,IACP,MAAM,IAAI,MAAM,uCAAuC;AAAA,EACzD;AAAA,EAEA,MAAM,KAAK,MAAM,eAAe;AAAA,EAChC,MAAM,UAA0B;AAAA,IAC9B;AAAA,IACA,MAAM,OAAO;AAAA,IACb,OAAO,IAAI;AAAA,IACX,YAAY,IAAI;AAAA,IAChB,WAAW,IAAI;AAAA,IACf,WAAW,IAAI;AAAA,IACf,YAAY,GAAG;AAAA,IACf;AAAA,IACA,UAAU,CAAC;AAAA,EACb;AAAA,EAEA,MAAM,QAAsD,CAAC;AAAA,EAC7D,YAAY,OAAO,UAAU,OAAO,QAAQ,GAAG,KAAK,GAAG;AAAA,IACrD,MAAM,YAAY,cAAc,SAAS,KAAK;AAAA,IAC9C,MAAM,WAAW,aAAa,KAAK;AAAA,IACnC,MAAM,OAAO,YAAY,SAAS,WAAW;AAAA,MAC3C,MAAM;AAAA,MACN,MAAM,SAAS;AAAA,IACjB,CAAC;AAAA,IACD,MAAM,KAAK,EAAE,OAAO,KAAK,CAAC;AAAA,EAC5B;AAAA,EACA,4BAA4B,OAAO;AAAA,EACnC,WAAW,WAAW,QAAQ,UAAU;AAAA,IACtC,QAAQ,KAAK,iBAAiB,SAAS;AAAA,EACzC;AAAA,EAEA,MAAM,SAAS,GAAG;AAAA,EAClB,MAAM,GAAG,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACjD,MAAM,MAAM,QAAQ,EAAE,WAAW,KAAK,CAAC;AAAA,EAEvC,MAAM,cAAwB,CAAC;AAAA,EAC/B,MAAM,QAAQ,OAAO,MAAc,YAAmC;AAAA,IACpE,MAAM,SAAS,MAAK,QAAQ,IAAI;AAAA,IAChC,MAAM,MAAM,SAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,IAChD,MAAM,UAAU,QAAQ,SAAS,MAAM;AAAA,IACvC,YAAY,KAAK,MAAM;AAAA;AAAA,EAIzB,MAAM,MACJ,QAAQ,mBACR,GAAG,KAAK,UACN,QAAQ,mBAAmB,IAAI,SAAS,OAAO,IAAI,CAAC,GACpD,MACA,CACF;AAAA,CACF;AAAA,EAEA,MAAM,MACJ,YACA,GAAG,KAAK,UACN;AAAA,IACE,OAAO,MAAM,IAAI,GAAG,YAAY,YAAY,KAAK,CAAC;AAAA,IAClD,QAAQ;AAAA,SACH,QAAQ,eAAe,GAAG,sBAAsB;AAAA,SAChD,GAAG;AAAA,IACR;AAAA,OACI,GAAG,WAAW,YAAY,EAAE,QAAQ,GAAG,OAAO,IAAI,CAAC;AAAA,OACpD,GAAG;AAAA,OACH,QAAQ,cAAc;AAAA,EAC3B,GACA,MACA,CACF;AAAA,CACF;AAAA,EAEA,MAAM,MACJ,UACA,OAAO,KAAK,UACV,GAAG,eAAe,YAAY,EAAE,YAAY,GAAG,WAAW,IAAI,CAAC,CACjE;AAAA,CACF;AAAA,EACA,IAAI,QAAQ,SAAS;AAAA,IACnB,MAAM,MACJ,gBACA,GAAG,KAAK,UACN;AAAA,MACE,MAAM,kBAAkB,QAAQ,EAAE;AAAA,MAClC,OAAO,CAAC,EAAE,QAAQ,SAAS,MAAM,IAAI,CAAC;AAAA,IACxC,GACA,MACA,CACF;AAAA,CACF;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,IAAI;AAAA,EACzB,aAAa,UAAU,OAAO;AAAA,IAC5B,IAAI,KAAK,aAAa;AAAA,MACpB,aAAa,IAAI,KAAK,WAAW;AAAA,IACnC;AAAA,EACF;AAAA,EACA,MAAM,MAAM,QAAQ,cAAc,GAAG,CAAC,GAAG,YAAY,EAAE,KAAK;AAAA,CAAI;AAAA,CAAK;AAAA,EAGrE,aAAa,OAAO,UAAU,OAAO;AAAA,IACnC,MAAM,OAAO,aAAa,KAAK;AAAA,IAC/B,MAAM,MAAM,SAAS,QAAQ,QAAQ,eAAe,KAAK,QAAQ;AAAA,IACjE,MAAM,MAAM,SAAS,QAAQ,QAAQ,YAAY,GAAG,KAAK;AAAA,CAAS;AAAA,IAClE,MAAM,MAAM,SAAS,WAAW,eAAe,MAAM,OAAO,CAAC;AAAA,IAC7D,MAAM,MACJ,SAAS,aACT,GAAG,KAAK,UACN;AAAA,MACE,iBAAiB,KAAK;AAAA,SACnB,GAAG,YAAY;AAAA,IACpB,GACA,MACA,CACF;AAAA,CACF;AAAA,EACF;AAAA,EAGA,YAAY,KAAK,SAAS,QAAQ,YAAY;AAAA,IAC5C,MAAM,MAAM,cAAc,OAAO,OAAO,QAAQ,eAAe,KAAK,QAAQ;AAAA,IAC5E,MAAM,MAAM,cAAc,OAAO,OAAO,QAAQ,YAAY,GAAG,KAAK;AAAA,CAAS;AAAA,IAC7E,MAAM,MAAM,cAAc,OAAO,UAAU,oBAAoB,MAAM,OAAO,CAAC;AAAA,IAC7E,MAAM,MACJ,cAAc,OAAO,YACrB,GAAG,KAAK,UACN,QAAQ,cAAc,KAAK,eAAe,GAC1C,MACA,CACF;AAAA,CACF;AAAA,EACF;AAAA,EAIA,IAAI,YAAW,GAAG,SAAS,GAAG;AAAA,IAC5B,WAAW,QAAQ,MAAM,UAAU,GAAG,SAAS,GAAG;AAAA,MAChD,MAAM,SAAS,MAAK,QAAQ,IAAI;AAAA,MAChC,IAAI,CAAC,YAAW,MAAM,GAAG;AAAA,QACvB,MAAM,GAAG,MAAK,GAAG,WAAW,IAAI,GAAG,QAAQ;AAAA,UACzC,WAAW;AAAA,UACX,OAAO;AAAA,UACP,cAAc;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,QAAQ,SAAQ,MAAM;AAAA,IACtB;AAAA,EACF;AAAA;AAGF,SAAS,YAAY,CAAC,OAAoD;AAAA,EACxE,MAAM,WAAW,MAAM,QAAQ,QAAQ,EAAE,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,EACpE,IAAI,SAAS,WAAW,GAAG;AAAA,IACzB,OAAO,EAAE,WAAW,IAAI,MAAM,QAAQ;AAAA,EACxC;AAAA,EACA,MAAM,OAAO,SAAS,SAAS,SAAS;AAAA,EACxC,MAAM,YAAY,SAAS,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG;AAAA,EAChD,OAAO,EAAE,WAAW,KAAK;AAAA;AAI3B,SAAS,YAAY,CAAC,OAAuB;AAAA,EAC3C,MAAM,WAAW,aAAa,KAAK;AAAA,EACnC,MAAM,YACJ,SAAS,cAAc,KACnB,SAAS,OACT,GAAG,SAAS,aAAa,SAAS;AAAA,EACxC,OAAO,GAAG,aAAa,SAAS;AAAA;AAGlC,SAAS,WAAW,CAAC,OAAuB;AAAA,EAC1C,OAAO,SAAS,aAAa,KAAK;AAAA;AAIpC,eAAe,SAAS,CAAC,MAAc,MAAc,MAAyB;AAAA,EAC5E,MAAM,MAAgB,CAAC;AAAA,EACvB,MAAM,UAAU,MAAM,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,EAC1D,WAAW,SAAS,SAAS;AAAA,IAC3B,MAAM,MAAM,MAAK,KAAK,MAAM,IAAI;AAAA,IAChC,IAAI,MAAM,YAAY,GAAG;AAAA,MACvB,IAAI,KAAK,GAAI,MAAM,UAAU,MAAM,GAAG,CAAE;AAAA,IAC1C,EAAO;AAAA,MACL,IAAI,KAAK,SAAS,MAAM,GAAG,CAAC;AAAA;AAAA,EAEhC;AAAA,EACA,OAAO;AAAA;",
20
+ "debugId": "E7E46438C9491C1264756E2164756E21",
21
+ "names": []
22
+ }
package/dist/cli.js CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  createProject,
6
6
  isTargetType,
7
7
  startDevServer
8
- } from "./index-30n2h2ep.js";
8
+ } from "./index-m62p34v6.js";
9
9
  import"./index-yb2wsc7f.js";
10
10
 
11
11
  // src/cli.ts
package/dist/create.d.ts CHANGED
@@ -9,8 +9,8 @@ export interface CreateProjectResult {
9
9
  files: string[];
10
10
  }
11
11
  /** Published framework version referenced by generated projects. */
12
- export declare const TRANSONE_FRAMEWORK_VERSION = "0.1.0";
12
+ export declare const TRANSONE_FRAMEWORK_VERSION = "0.1.2";
13
13
  /** Published CLI version referenced by generated projects. */
14
- export declare const TRANSONE_CLI_VERSION = "0.1.0";
14
+ export declare const TRANSONE_CLI_VERSION = "0.1.2";
15
15
  export declare const GITHUB_URL = "https://github.com/geektech-team/transone";
16
16
  export declare function createProject(options?: CreateProjectOptions): CreateProjectResult;