transone-cli 0.7.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -3
- package/README.zh-CN.md +27 -0
- package/dist/app/analyze.d.ts +2 -1
- package/dist/app/components.d.ts +4 -0
- package/dist/app/types.d.ts +3 -0
- package/dist/{build-mp-vk5ap2cw.js → build-mp-y5pwahsy.js} +824 -271
- package/dist/build-mp-y5pwahsy.js.map +24 -0
- package/dist/build.d.ts +3 -1
- package/dist/bundle-inputs.d.ts +6 -0
- package/dist/cli.d.ts +4 -2
- package/dist/cli.js +49 -16
- package/dist/cli.js.map +3 -3
- package/dist/components/discovery.d.ts +5 -0
- package/dist/components/index.d.ts +4 -0
- package/dist/components/report.d.ts +48 -0
- package/dist/components/resolution.d.ts +7 -0
- package/dist/components/types.d.ts +56 -0
- package/dist/components/web.d.ts +11 -0
- package/dist/config-inputs.d.ts +4 -0
- package/dist/create.d.ts +4 -4
- package/dist/{index-x5rrsfyb.js → index-2g3e5sjt.js} +1257 -1143
- package/dist/index-2g3e5sjt.js.map +32 -0
- package/dist/index-d51tp4y9.js +1402 -0
- package/dist/index-d51tp4y9.js.map +11 -0
- package/dist/index-j4h0wd27.js +489 -0
- package/dist/index-j4h0wd27.js.map +14 -0
- package/dist/index-xgn9fbc6.js +298 -0
- package/dist/index-xgn9fbc6.js.map +13 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.js +12 -4
- package/dist/index.js.map +2 -2
- package/dist/mp/inheritance.d.ts +17 -0
- package/dist/mp/inline.d.ts +22 -0
- package/dist/mp/methods.d.ts +1 -0
- package/dist/mp/source.d.ts +11 -0
- package/dist/mp/types.d.ts +8 -0
- package/dist/output-transaction.d.ts +19 -0
- package/dist/{project-ybacfze8.js → project-6tft5e77.js} +38 -6
- package/dist/{project-ybacfze8.js.map → project-6tft5e77.js.map} +3 -3
- package/dist/project.d.ts +2 -1
- package/dist/safe-path.d.ts +1 -0
- package/dist/scaffold.d.ts +6 -0
- package/dist/target/types.d.ts +7 -6
- package/dist/target/web-target.d.ts +1 -0
- package/dist/types.d.ts +13 -1
- package/dist/web-bundle.d.ts +3 -1
- package/dist/web-styles.d.ts +1 -1
- package/package.json +2 -2
- package/dist/build-mp-vk5ap2cw.js.map +0 -22
- package/dist/index-k1qfvp0y.js +0 -19
- package/dist/index-k1qfvp0y.js.map +0 -10
- package/dist/index-x5rrsfyb.js.map +0 -30
- package/dist/index-yb2wsc7f.js +0 -7
- package/dist/index-yb2wsc7f.js.map +0 -9
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/target/types.ts", "../src/config.ts", "../src/target/web-target.ts", "../src/build-output.ts", "../src/document-styles.ts", "../src/bundle-inputs.ts", "../src/web-bundle.ts", "../src/mp/dialect.ts", "../src/target/mp-target.ts", "../src/app/build-app.ts", "../src/app/errors.ts", "../src/app/analyze.ts", "../src/app/components.ts", "../src/target/app-target.ts", "../src/app/dialects.ts", "../src/target/registry.ts", "../src/build.ts", "../src/components/report.ts", "../src/create.ts", "../src/scaffold.ts", "../src/server.ts", "../src/proxy.ts", "../src/watch.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { ResolvedConfig } from '../types';\nimport type { BuildOptions, BuildResult } from '../types';\nimport { PLATFORM_DEFINITIONS, type BackendTarget } from 'transone/platform';\n\n/**\n * 目标端类型。\n *\n * 编译器按 Target 分发代码生成(见 positioning 7.3):\n * - web 直接渲染(HTML + 浏览器运行时,与 TSone 一致)\n * - mp-weixin WXML / WXSS / JS 静态转换\n * - mp-alipay AXML / ACSS 静态转换\n * - mp-bytedance TTML / TTSS 静态转换\n * - mp-xiaohongshu XHSML / CSS 静态转换\n * - app-* 原生应用源码生成(app-ios / app-android / app-harmony)\n */\nexport const TARGET_TYPES: readonly BackendTarget[] = [\n ...new Set(PLATFORM_DEFINITIONS.map((definition) => definition.target)),\n];\n\nexport type TargetType = BackendTarget;\n\nexport function isTargetType(value: unknown): value is TargetType {\n return (\n typeof value === 'string' &&\n (TARGET_TYPES as readonly string[]).includes(value)\n );\n}\n\n/** 小程序目标端类型(mp-*),config.mp 按平台分组时使用。 */\nexport type MpTargetType = Extract<TargetType, `mp-${string}`>;\nexport const MP_TARGET_TYPES: readonly MpTargetType[] = TARGET_TYPES.filter(\n (target): target is MpTargetType => target.startsWith('mp-')\n);\n\n/** 原生 App 目标端类型(app-*)。 */\nexport type AppTargetType = Extract<TargetType, `app-${string}`>;\nexport const APP_TARGET_TYPES: readonly AppTargetType[] = TARGET_TYPES.filter(\n (target): target is AppTargetType => target.startsWith('app-')\n);\n\nexport function isAppTargetType(value: unknown): value is AppTargetType {\n return (\n typeof value === 'string' &&\n (APP_TARGET_TYPES as readonly string[]).includes(value)\n );\n}\n\nexport function isMpTargetType(value: unknown): value is MpTargetType {\n return (\n typeof value === 'string' &&\n (MP_TARGET_TYPES as readonly string[]).includes(value)\n );\n}\n\n/**\n * 编译目标抽象:每个端一个实现,编译器按 Target 分发构建。\n *\n * 新增目标端时实现本接口并注册到 TargetRegistry,无需改动构建入口。\n */\nexport interface BuildTarget {\n readonly type: TargetType;\n /** 目标端产物形态描述(用于 CLI 输出与文档)。 */\n readonly label: string;\n build(config: ResolvedConfig, options: BuildOptions): Promise<BuildResult>;\n}\n",
|
|
6
|
+
"import type { TargetType } from './target/types';\nimport {\n getPlatformDefinition,\n normalizePlatform,\n Platform,\n PLATFORM_DEFINITIONS,\n} from 'transone/platform';\nimport { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport {\n APP_TARGET_TYPES,\n isAppTargetType,\n isMpTargetType,\n MP_TARGET_TYPES,\n} from './target/types';\nimport type {\n BuildConfig,\n AppConfig,\n AppConfigMap,\n LibraryConfig,\n MiniProgramConfig,\n ProxyOptions,\n ResolveConfigOptions,\n ResolvedConfig,\n ResolvedAppConfig,\n ResolvedLibraryConfig,\n ResolvedMiniProgramConfig,\n ServerConfig,\n UserConfig,\n UserAppConfig,\n UserMiniProgramConfig,\n TargetInput,\n ComponentScanConfig,\n} from './types';\n\ninterface MergedConfig {\n target?: TargetInput;\n components?: ComponentScanConfig;\n entry: string;\n pages?: Record<string, string>;\n server: {\n host: string;\n port: number;\n proxy: Record<string, string | ProxyOptions>;\n };\n build: {\n outDir: string;\n basePath: string;\n directoryPages: boolean;\n };\n library?: LibraryConfig;\n mp?: UserMiniProgramConfig;\n app?: UserAppConfig;\n}\n\ntype ConfigFileLoadResult =\n { exists: false } | { exists: true; config: unknown };\n\nconst DEFAULT_CONFIG: MergedConfig = {\n entry: 'src/main.ts',\n server: {\n host: '127.0.0.1',\n port: 52211,\n proxy: {},\n },\n build: {\n outDir: 'dist/build/h5',\n basePath: '',\n directoryPages: false,\n },\n};\n\nexport function defineConfig(config: UserConfig): UserConfig {\n return config;\n}\n\nexport async function resolveConfig(\n options: ResolveConfigOptions = {}\n): Promise<ResolvedConfig> {\n const root = resolve(options.root ?? process.cwd());\n const configFile = resolve(root, 'transone.config.ts');\n const hasInlineConfig = options.config !== undefined;\n const loadedConfig: ConfigFileLoadResult = hasInlineConfig\n ? { exists: false }\n : await loadConfigFile(configFile);\n let fileConfig: UserConfig = {};\n if (loadedConfig.exists) {\n const config = loadedConfig.config;\n validateUserConfig(config);\n fileConfig = config;\n }\n if (hasInlineConfig) {\n validateUserConfig(options.config);\n }\n const inlineOverrides = toInlineOverrides(options);\n validateUserConfig(inlineOverrides);\n const config = mergeConfig(fileConfig, options.config ?? {}, inlineOverrides);\n\n const entry = resolve(root, config.entry);\n if (!existsSync(entry) && !config.library) {\n throw new Error(`Entry file does not exist: ${entry}`);\n }\n const pages = await resolvePages(root, entry, config.pages);\n const platform = resolvePlatform(options.target ?? config.target);\n const target = getPlatformDefinition(platform).target;\n const explicitOutDir =\n options.outDir ?? options.config?.build?.outDir ?? fileConfig.build?.outDir;\n const webOutDir =\n explicitOutDir ??\n (platform === Platform.WebMobile || platform === Platform.WebPc\n ? `dist/build/${platform}`\n : config.build.outDir);\n // 公共小程序配置与当前平台配置合并,平台字段优先。\n const mpConfig = pickMpConfig(config.mp, target);\n const mpPages = mpConfig?.pages\n ? await resolvePages(root, entry, mpConfig.pages, {\n includeEntry: false,\n allowRoot: true,\n })\n : pages;\n // 任一 --target mp-* 都启用小程序构建;config.mp 缺失则走平台默认值。\n const mpEnabled = config.mp !== undefined || isMpTargetType(target);\n const appConfig = pickAppConfig(config.app, target);\n\n return {\n root,\n ...(loadedConfig.exists ? { configFile } : {}),\n entry,\n pages,\n target,\n platform,\n ...(config.components ? { components: config.components } : {}),\n server: {\n host: config.server.host,\n port: config.server.port,\n proxy: config.server.proxy,\n },\n build: {\n outDir: resolve(root, webOutDir),\n basePath: normalizeBasePath(config.build.basePath),\n directoryPages: config.build.directoryPages,\n },\n ...(config.library\n ? { library: resolveLibrary(root, config.library) }\n : {}),\n ...(mpEnabled\n ? {\n mp: resolveMiniProgram(\n root,\n options.mpOutDir ?? options.outDir,\n mpConfig ?? {},\n mpPages,\n target\n ),\n }\n : {}),\n ...(isAppTargetType(target)\n ? {\n app: await resolveApp(\n root,\n options.outDir,\n appConfig ?? {},\n target,\n pages\n ),\n }\n : {}),\n };\n}\n\nfunction isAppConfigMap(value: unknown): value is AppConfigMap {\n return (\n isRecord(value) && APP_TARGET_TYPES.some((platform) => platform in value)\n );\n}\n\nfunction pickAppConfig(\n app: UserAppConfig | undefined,\n target: TargetType\n): AppConfig | undefined {\n if (app === undefined) {\n return undefined;\n }\n if (isAppConfigMap(app)) {\n return {\n ...(app.host !== undefined ? { host: app.host } : {}),\n ...(isAppTargetType(target) ? app[target] : {}),\n };\n }\n return app;\n}\n\nasync function resolveApp(\n root: string,\n outDirOverride: string | undefined,\n app: AppConfig,\n target: TargetType,\n fallbackPages: Record<string, string>\n): Promise<ResolvedAppConfig> {\n return {\n ...(app.host !== undefined ? { host: app.host } : {}),\n appName: app.appName ?? 'TransOne',\n bundleId: app.bundleId ?? 'com.transone.app',\n outDir: resolve(\n root,\n outDirOverride ?? app.outDir ?? `dist/build/${target}`\n ),\n minPlatformVersion: app.minPlatformVersion ?? '16.0',\n publicDir: resolve(root, app.publicDir ?? 'public'),\n pages: app.pages\n ? await resolvePages(\n root,\n resolve(root, app.pages['/'] ?? 'src/main.ts'),\n app.pages,\n {\n includeEntry: false,\n allowRoot: true,\n }\n )\n : fallbackPages,\n };\n}\n\nconst MP_DEFAULT_OUT_DIRS: Record<string, string> = {\n 'mp-weixin': 'dist/build/mp-weixin',\n 'mp-alipay': 'dist/build/mp-alipay',\n 'mp-bytedance': 'dist/build/mp-bytedance',\n 'mp-xiaohongshu': 'dist/build/mp-xiaohongshu',\n};\n\n/** 公共配置先应用,再递归合并当前平台配置;数组和其他值整体替换。 */\nfunction pickMpConfig(\n mp: UserMiniProgramConfig | undefined,\n target: TargetType\n): MiniProgramConfig | undefined {\n if (mp === undefined) {\n return undefined;\n }\n const common = Object.fromEntries(\n Object.entries(mp).filter(\n ([key]) =>\n !MP_TARGET_TYPES.includes(key as (typeof MP_TARGET_TYPES)[number])\n )\n );\n const platform = isMpTargetType(target) ? mp[target] : undefined;\n return mergeMpRecords(common, { ...platform });\n}\n\nfunction mergeMpRecords(\n common: Record<string, unknown>,\n overrides: Record<string, unknown>\n): Record<string, unknown> {\n const merged = { ...common };\n for (const [key, value] of Object.entries(overrides)) {\n if (value === undefined) continue;\n const previous = Object.prototype.hasOwnProperty.call(common, key)\n ? common[key]\n : undefined;\n const next =\n isRecord(previous) && isRecord(value)\n ? mergeMpRecords(previous, value)\n : value;\n Object.defineProperty(merged, key, {\n value: next,\n enumerable: true,\n configurable: true,\n writable: true,\n });\n }\n return merged;\n}\n\nfunction resolveMiniProgram(\n root: string,\n outDirOverride: string | undefined,\n mp: MiniProgramConfig,\n pages: Record<string, string>,\n target: TargetType\n): ResolvedMiniProgramConfig {\n return {\n ...(mp.host !== undefined ? { host: mp.host } : {}),\n appId: mp.appId ?? 'touristappid',\n outDir: resolve(\n root,\n outDirOverride ??\n mp.outDir ??\n MP_DEFAULT_OUT_DIRS[target] ??\n 'dist/build/mp-weixin'\n ),\n navigationBarTitleText: mp.navigationBarTitleText ?? 'TransOne',\n pages,\n ...(mp.window !== undefined ? { window: mp.window } : {}),\n ...(mp.tabBar !== undefined ? { tabBar: mp.tabBar } : {}),\n ...(mp.appExtra !== undefined ? { appExtra: mp.appExtra } : {}),\n ...(mp.pageExtra !== undefined ? { pageExtra: mp.pageExtra } : {}),\n lengthUnit: mp.lengthUnit ?? 'px',\n publicDir: resolve(root, mp.publicDir ?? 'public'),\n ...(mp.globalData !== undefined ? { globalData: mp.globalData } : {}),\n };\n}\n\nfunction resolveLibrary(\n root: string,\n library: LibraryConfig\n): ResolvedLibraryConfig {\n return {\n entry: resolve(root, library.entry ?? 'src/index.ts'),\n outDir: resolve(root, library.outDir ?? 'dist'),\n external: library.external ?? [],\n tsconfigs: (library.tsconfigs ?? ['tsconfig.build.json']).map((path) =>\n resolve(root, path)\n ),\n dts: library.dts ?? true,\n splitting: library.splitting ?? true,\n sourcemap: library.sourcemap ?? true,\n minify: library.minify,\n };\n}\n\nfunction normalizeBasePath(base: string | undefined): string {\n const trimmed = (base ?? '').trim();\n if (!trimmed || trimmed === '/') {\n return '';\n }\n\n const withLeading = trimmed.startsWith('/') ? trimmed : `/${trimmed}`;\n return withLeading.endsWith('/') ? withLeading.slice(0, -1) : withLeading;\n}\n\nfunction resolvePlatform(target: unknown): Platform {\n const platform = normalizePlatform(target ?? Platform.Web);\n if (platform !== undefined) return platform;\n throw new Error(\n `Unknown build target \"${String(target)}\". ` +\n `Available targets: ${PLATFORM_DEFINITIONS.map((definition) => definition.platform).join(', ')}.`\n );\n}\n\nasync function resolvePages(\n root: string,\n entry: string,\n pages: Record<string, string> | undefined,\n options: { includeEntry?: boolean; allowRoot?: boolean } = {}\n): Promise<Record<string, string>> {\n const resolved: Record<string, string> =\n options.includeEntry === false ? {} : { '/': entry };\n for (const [route, pageEntry] of Object.entries(pages ?? {})) {\n const normalized = normalizePageRoute(route, options.allowRoot);\n const absolute = resolve(root, pageEntry);\n if (!existsSync(absolute)) {\n throw new Error(\n `Page entry file does not exist for \"${normalized}\": ${absolute}`\n );\n }\n resolved[normalized] = absolute;\n }\n return resolved;\n}\n\nfunction normalizePageRoute(route: string, allowRoot = false): string {\n if (route === '/') {\n if (allowRoot) {\n return '/';\n }\n throw new Error(\n 'Config pages must not redefine the root page \"/\"; use config.entry instead'\n );\n }\n const normalized = route.replace(/\\/+$/, '');\n if (normalized === '') {\n throw new Error(`Page route must not be empty: ${route}`);\n }\n return normalized;\n}\n\nlet configLoadSequence = 0;\n\nasync function loadConfigFile(\n configFile: string\n): Promise<ConfigFileLoadResult> {\n if (!existsSync(configFile)) {\n return { exists: false };\n }\n\n configLoadSequence += 1;\n const module = await import(\n `${configFile}?transone_config=${configLoadSequence}`\n );\n return { exists: true, config: module.default };\n}\n\nfunction toInlineOverrides(options: ResolveConfigOptions): UserConfig {\n const server: ServerConfig = {};\n const build: BuildConfig = {};\n\n if (options.host !== undefined) {\n server.host = options.host;\n }\n if (options.port !== undefined) {\n server.port = options.port;\n }\n if (options.outDir !== undefined) {\n build.outDir = options.outDir;\n }\n if (options.base !== undefined) {\n build.basePath = options.base;\n }\n\n return {\n ...(Object.keys(server).length > 0 ? { server } : {}),\n ...(Object.keys(build).length > 0 ? { build } : {}),\n };\n}\n\nfunction mergeConfig(...configs: UserConfig[]): MergedConfig {\n return configs.reduce<MergedConfig>((merged, config) => {\n const server = config.server;\n const build = config.build;\n\n return {\n target: config.target ?? merged.target,\n components: config.components\n ? { ...merged.components, ...config.components }\n : merged.components,\n entry: config.entry ?? merged.entry,\n pages: config.pages ?? merged.pages,\n server: {\n host: server?.host ?? merged.server.host,\n port: server?.port ?? merged.server.port,\n proxy: {\n ...merged.server.proxy,\n ...server?.proxy,\n },\n },\n build: {\n outDir: build?.outDir ?? merged.build.outDir,\n basePath: build?.basePath ?? merged.build.basePath,\n directoryPages: build?.directoryPages ?? merged.build.directoryPages,\n },\n library: config.library ?? merged.library,\n mp: config.mp ?? merged.mp,\n app: config.app ?? merged.app,\n };\n }, DEFAULT_CONFIG);\n}\n\nfunction validateUserConfig(config: unknown): asserts config is UserConfig {\n assertRecord(config, 'Config');\n\n if (\n config.target !== undefined &&\n normalizePlatform(config.target) === undefined\n ) {\n throw new Error(`Config target is invalid: ${String(config.target)}`);\n }\n if (config.components !== undefined) {\n assertRecord(config.components, 'Config components');\n for (const key of ['include', 'exclude'] as const) {\n if (config.components[key] !== undefined)\n assertStringArray(config.components[key], `Config components.${key}`);\n }\n }\n\n if (config.entry !== undefined && typeof config.entry !== 'string') {\n throw new Error('Config entry must be a string');\n }\n if (config.pages !== undefined) {\n validatePagesConfig(config.pages);\n }\n if (config.server !== undefined) {\n validateServerConfig(config.server);\n }\n if (config.build !== undefined) {\n validateBuildConfig(config.build);\n }\n if (config.library !== undefined) {\n validateLibraryConfig(config.library);\n }\n if (config.mp !== undefined) {\n validateMpConfig(config.mp);\n }\n if (config.app !== undefined) {\n validateAppConfig(config.app);\n }\n}\n\nfunction validateAppConfig(app: unknown): asserts app is UserAppConfig {\n assertRecord(app, 'Config app');\n validateApiHost(app.host, 'Config app.host');\n if (isAppConfigMap(app)) {\n const flatKeys = [\n 'appName',\n 'bundleId',\n 'outDir',\n 'minPlatformVersion',\n 'publicDir',\n 'pages',\n ];\n if (flatKeys.some((key) => key in app)) {\n throw new Error('Config app cannot mix flat fields with platform keys');\n }\n for (const platform of APP_TARGET_TYPES) {\n if (app[platform] !== undefined) {\n validateSingleAppConfig(app[platform], `Config app.${platform}`);\n }\n }\n return;\n }\n validateSingleAppConfig(app, 'Config app');\n}\n\nfunction validateSingleAppConfig(\n app: unknown,\n label: string\n): asserts app is AppConfig {\n assertRecord(app, label);\n validateApiHost(app.host, `${label}.host`);\n for (const key of [\n 'appName',\n 'bundleId',\n 'outDir',\n 'minPlatformVersion',\n 'publicDir',\n ] as const) {\n if (app[key] !== undefined && typeof app[key] !== 'string') {\n throw new Error(`${label}.${key} must be a string`);\n }\n }\n if (app.pages !== undefined) {\n validatePagesConfig(app.pages, `${label}.pages`);\n }\n}\n\n/** 公共字段和各平台字段分别校验,避免平台键使公共字段绕过校验。 */\nfunction validateMpConfig(mp: unknown): asserts mp is UserMiniProgramConfig {\n assertRecord(mp, 'Config mp');\n validateMiniProgramConfig(mp, 'Config mp');\n for (const platform of MP_TARGET_TYPES) {\n if (mp[platform] !== undefined) {\n validateMiniProgramConfig(mp[platform], `Config mp.${platform}`);\n }\n }\n}\n\nfunction validateMiniProgramConfig(\n mp: unknown,\n label: string\n): asserts mp is MiniProgramConfig {\n assertRecord(mp, label);\n validateApiHost(mp.host, `${label}.host`);\n\n for (const key of [\n 'appId',\n 'outDir',\n 'navigationBarTitleText',\n 'publicDir',\n ] as const) {\n if (mp[key] !== undefined && typeof mp[key] !== 'string') {\n throw new Error(`${label}.${key} must be a string`);\n }\n }\n if (mp.pages !== undefined) {\n validatePagesConfig(mp.pages, `${label}.pages`);\n }\n for (const key of ['window', 'tabBar', 'appExtra', 'globalData'] as const) {\n if (mp[key] !== undefined) {\n assertRecord(mp[key], `${label}.${key}`);\n }\n }\n if (mp.pageExtra !== undefined) {\n assertRecord(mp.pageExtra, `${label}.pageExtra`);\n for (const [route, extra] of Object.entries(mp.pageExtra)) {\n assertRecord(extra, `${label}.pageExtra.${route}`);\n }\n }\n if (\n mp.lengthUnit !== undefined &&\n mp.lengthUnit !== 'px' &&\n mp.lengthUnit !== 'rpx'\n ) {\n throw new Error(`${label}.lengthUnit must be 'px' or 'rpx'`);\n }\n}\n\nfunction validateLibraryConfig(\n library: unknown\n): asserts library is LibraryConfig {\n assertRecord(library, 'Config library');\n if (library.entry !== undefined && typeof library.entry !== 'string') {\n throw new Error('Config library.entry must be a string');\n }\n if (library.outDir !== undefined && typeof library.outDir !== 'string') {\n throw new Error('Config library.outDir must be a string');\n }\n if (library.external !== undefined) {\n assertStringArray(library.external, 'Config library.external');\n }\n if (library.tsconfigs !== undefined) {\n assertStringArray(library.tsconfigs, 'Config library.tsconfigs');\n }\n for (const key of ['dts', 'splitting', 'sourcemap', 'minify'] as const) {\n if (library[key] !== undefined && typeof library[key] !== 'boolean') {\n throw new Error(`Config library.${key} must be a boolean`);\n }\n }\n}\n\nfunction assertStringArray(value: unknown, name: string): void {\n if (!Array.isArray(value) || value.some((item) => typeof item !== 'string')) {\n throw new Error(`${name} must be an array of strings`);\n }\n}\n\nfunction validatePagesConfig(\n pages: unknown,\n label = 'Config pages'\n): asserts pages is Record<string, string> {\n assertRecord(pages, label);\n\n for (const [route, entry] of Object.entries(pages)) {\n if (!route.startsWith('/')) {\n throw new Error(`Page route must start with \"/\": ${route}`);\n }\n if (typeof entry !== 'string') {\n throw new Error(`Page entry for \"${route}\" must be a string`);\n }\n }\n}\n\nfunction validateServerConfig(server: unknown): asserts server is ServerConfig {\n assertRecord(server, 'Config server');\n\n if (server.host !== undefined && typeof server.host !== 'string') {\n throw new Error('Config server.host must be a string');\n }\n const port = server.port;\n if (\n port !== undefined &&\n (typeof port !== 'number' ||\n !Number.isInteger(port) ||\n port < 0 ||\n port > 65535)\n ) {\n throw new Error(\n 'Config server.port must be an integer between 0 and 65535'\n );\n }\n if (server.proxy === undefined) {\n return;\n }\n assertRecord(server.proxy, 'Config server.proxy');\n\n for (const [prefix, value] of Object.entries(server.proxy)) {\n if (!prefix.startsWith('/')) {\n throw new Error(`Proxy prefix must start with \"/\": ${prefix}`);\n }\n\n const target = getProxyTarget(value);\n validateProxyTarget(target);\n }\n}\n\nfunction validateBuildConfig(build: unknown): asserts build is BuildConfig {\n assertRecord(build, 'Config build');\n if (build.outDir !== undefined && typeof build.outDir !== 'string') {\n throw new Error('Config build.outDir must be a string');\n }\n if (build.basePath !== undefined && typeof build.basePath !== 'string') {\n throw new Error('Config build.basePath must be a string');\n }\n if (\n build.directoryPages !== undefined &&\n typeof build.directoryPages !== 'boolean'\n ) {\n throw new Error('Config build.directoryPages must be a boolean');\n }\n}\n\nfunction getProxyTarget(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n\n assertRecord(value, 'Proxy options');\n if (typeof value.target !== 'string') {\n throw new Error('Proxy target must be a string');\n }\n if (\n value.changeOrigin !== undefined &&\n typeof value.changeOrigin !== 'boolean'\n ) {\n throw new Error('Proxy changeOrigin must be a boolean');\n }\n if (value.rewrite !== undefined && typeof value.rewrite !== 'function') {\n throw new Error('Proxy rewrite must be a function');\n }\n\n return value.target;\n}\n\nfunction validateProxyTarget(target: string): void {\n try {\n const url = new URL(target);\n if (url.protocol === 'http:' || url.protocol === 'https:') {\n return;\n }\n } catch {\n // Keep the public error stable for malformed URLs and unsupported protocols.\n }\n\n throw new Error(`Proxy target must use http or https: ${target}`);\n}\n\nfunction assertRecord(\n value: unknown,\n name: string\n): asserts value is Record<string, unknown> {\n if (!isRecord(value)) {\n throw new Error(`${name} must be an object`);\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n (Object.getPrototypeOf(value) === Object.prototype ||\n Object.getPrototypeOf(value) === null)\n );\n}\n\nfunction validateApiHost(host: unknown, label: string): void {\n if (host === undefined) return;\n if (typeof host !== 'string') throw new Error(`${label} must be a string`);\n try {\n const url = new URL(host);\n if (url.protocol === 'http:' || url.protocol === 'https:') return;\n } catch {}\n throw new Error(`${label} must use http or https`);\n}\n",
|
|
7
|
+
"import { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, isAbsolute, relative, resolve, sep } from 'node:path';\nimport { isEntryJavaScriptOutput, isStylesheetOutput } from '../build-output';\nimport { emitComponentStyles, emitDocumentStyles } from '../document-styles';\nimport { assertSafeSubdirectoryDoesNotContain } from '../safe-path';\nimport { buildWebBundle } from '../web-bundle';\nimport {\n buildInputPaths,\n buildOutputPath,\n withBuildOutput,\n} from '../output-transaction';\nimport {\n createWebComponentContext,\n type WebComponentContext,\n} from '../components/web';\nimport type { BuildOptions, BuildResult, ResolvedConfig } from '../types';\nimport type { BuildTarget } from './types';\n\nconst INVALID_OUTPUT_DIRECTORY_MESSAGE =\n 'Build output must be a subdirectory of the project root';\n\ninterface BuiltPage {\n entry: string;\n assets: string[];\n javascriptAssets: string[];\n stylesheetAssets: string[];\n componentStylesheetAssets: string[];\n}\n\n/**\n * Web 目标端:复用 TSone 渲染策略,直接产出可运行的 H5 站点。\n *\n * 每个页面入口经 Bun 构建为浏览器 ESM,再以入口组件渲染出对应 HTML\n * 壳(SSR 形式)并注入构建产物,产物可直接静态部署。\n */\nexport class WebTarget implements BuildTarget {\n public readonly type = 'web' as const;\n public readonly label = '静态站点 / SPA(复用 TSone 策略化渲染)';\n\n public async build(\n config: ResolvedConfig,\n _options: BuildOptions\n ): Promise<BuildResult> {\n const entries = [...new Set(Object.values(config.pages))];\n\n for (const entry of entries) {\n await assertSafeSubdirectoryDoesNotContain(\n config.root,\n config.build.outDir,\n entry,\n INVALID_OUTPUT_DIRECTORY_MESSAGE\n );\n }\n const contexts = new Map(\n entries.map((entry) => [entry, createWebComponentContext(config, entry)])\n );\n const protectedPaths = buildInputPaths(\n config,\n entries,\n [...contexts.values()].flatMap((context) => context.sourcePaths)\n );\n return withBuildOutput(\n {\n root: config.root,\n outDir: config.build.outDir,\n protectedPaths,\n requireProjectSubdirectory: true,\n },\n (outDir) =>\n this.buildOutput(\n { ...config, build: { ...config.build, outDir } },\n contexts,\n protectedPaths\n )\n );\n }\n\n private async buildOutput(\n config: ResolvedConfig,\n contexts: Map<string, WebComponentContext>,\n protectedPaths: string[]\n ): Promise<BuildResult> {\n const entries = [...new Set(Object.values(config.pages))];\n // 动态加载:project.ts 依赖 'transone/dom'(框架 dist 的 DOM\n // 渲染模块),仅在站点渲染路径需要。\n const { renderProjectHtml } = await import('../project');\n for (const [route, entry] of Object.entries(config.pages)) {\n await renderProjectHtml(config, {}, entry, route, contexts.get(entry));\n }\n\n const builtByEntry = new Map<string, BuiltPage>();\n const failures: string[] = [];\n for (const entry of entries) {\n const built = await buildPage(\n config,\n entry,\n contexts.get(entry),\n protectedPaths\n );\n if (typeof built === 'string') {\n failures.push(built);\n continue;\n }\n builtByEntry.set(entry, built);\n }\n if (failures.length > 0) {\n throw buildFailure(failures);\n }\n\n const assetsBuilt: string[] = [];\n for (const [route, entry] of Object.entries(config.pages)) {\n const page = builtByEntry.get(entry);\n if (!page) {\n throw new Error(`Missing built assets for entry: ${entry}`);\n }\n const pageHtmlPath = htmlPath(config, route);\n const rendered = await renderProjectHtml(\n config,\n {\n head: page.stylesheetAssets.map((asset) => ({\n tag: 'link',\n attributes: {\n rel: 'stylesheet',\n href: toAssetUrl(config.build.outDir, pageHtmlPath, asset),\n },\n })),\n scripts: page.javascriptAssets.map((asset) => ({\n type: 'module',\n src: toAssetUrl(config.build.outDir, pageHtmlPath, asset),\n })),\n },\n page.entry,\n route,\n contexts.get(entry)\n );\n const { html, assets: documentStyles } = await emitDocumentStyles(\n rendered,\n config.build.outDir,\n (asset) => toAssetUrl(config.build.outDir, pageHtmlPath, asset),\n page.stylesheetAssets.map((asset) =>\n toAssetUrl(config.build.outDir, pageHtmlPath, asset)\n ),\n page.componentStylesheetAssets.map((asset) =>\n toAssetUrl(config.build.outDir, pageHtmlPath, asset)\n )\n );\n await mkdir(dirname(pageHtmlPath), { recursive: true });\n await writeFile(pageHtmlPath, html);\n assetsBuilt.push(...page.assets, ...documentStyles, pageHtmlPath);\n }\n\n return {\n root: config.root,\n outDir: config.build.outDir,\n assetsBuilt: [...new Set(assetsBuilt)],\n };\n }\n}\n\nasync function buildPage(\n config: ResolvedConfig,\n entry: string,\n components?: WebComponentContext,\n protectedPaths: string[] = []\n): Promise<BuiltPage | string> {\n let result: Awaited<ReturnType<typeof buildWebBundle>>['result'];\n let styles: ReadonlyMap<string, string>;\n try {\n const bundle = await buildWebBundle(\n {\n entrypoints: [entry],\n outdir: config.build.outDir,\n target: 'browser',\n format: 'esm',\n // 生产构建默认压缩;TRANSONE_MINIFY=0 时生成未压缩产物,便于排查问题\n minify: process.env.TRANSONE_MINIFY !== '0',\n naming: { entry: '[name]-[hash].[ext]', chunk: '[name]-[hash].[ext]' },\n throw: false,\n },\n components\n );\n protectedPaths.push(...bundle.inputPaths);\n result = bundle.result;\n styles = bundle.styles;\n } catch (error: unknown) {\n return pageFailureReason(entry, [errorMessage(error)]);\n }\n const assets = result.outputs.map((output) => resolve(output.path));\n const javascriptAssets = result.outputs\n .filter(isEntryJavaScriptOutput)\n .map((output) => resolve(output.path));\n const stylesheetAssets = result.outputs\n .filter(isStylesheetOutput)\n .map((output) => resolve(output.path));\n\n if (!result.success || assets.length === 0 || javascriptAssets.length === 0) {\n return pageFailureReason(\n entry,\n result.logs.map((log) => log.message),\n {\n success: result.success,\n hasOutput: assets.length > 0,\n hasJavaScript: javascriptAssets.length > 0,\n }\n );\n }\n\n const componentStylesheetAssets = await emitComponentStyles(\n styles,\n config.build.outDir\n );\n return {\n entry,\n assets: [...assets, ...componentStylesheetAssets],\n javascriptAssets,\n stylesheetAssets,\n componentStylesheetAssets,\n };\n}\n\nfunction pageFailureReason(\n entry: string,\n logs: string[],\n state?: { success: boolean; hasOutput: boolean; hasJavaScript: boolean }\n): string {\n const reasons = [\n state && !state.success ? 'Bun build reported failure' : '',\n state && !state.hasOutput ? 'Bun emitted no output files' : '',\n state && !state.hasJavaScript ? 'Bun emitted no JavaScript output' : '',\n ...logs,\n ].filter((reason) => reason !== '');\n\n return `${entry}: ${reasons.join('\\n')}`;\n}\n\nfunction buildFailure(failures: string[]): Error {\n if (failures.length === 1) {\n return new Error(`Failed to build TransOne application: ${failures[0]}`);\n }\n return new Error(\n `Failed to build TransOne application:\\n${failures\n .map((failure) => `- ${failure}`)\n .join('\\n')}`\n );\n}\n\nfunction htmlPath(config: ResolvedConfig, route: string): string {\n if (route === '/') {\n return buildOutputPath(config.build.outDir, 'index.html');\n }\n const relativeRoute = route.replace(/^\\/+/, '');\n if (config.build.directoryPages) {\n return buildOutputPath(config.build.outDir, `${relativeRoute}/index.html`);\n }\n return buildOutputPath(config.build.outDir, `${relativeRoute}.html`);\n}\n\nfunction toAssetUrl(\n outDir: string,\n fromHtmlFile: string,\n asset: string\n): string {\n const fromOutDir = relative(outDir, asset).split(sep).join('/');\n if (\n fromOutDir === '' ||\n fromOutDir === '..' ||\n fromOutDir.startsWith('../') ||\n isAbsolute(fromOutDir)\n ) {\n throw new Error(\n `Build asset must be inside the output directory: ${asset}`\n );\n }\n\n const fromHtmlDir = dirname(fromHtmlFile);\n const assetPath = relative(fromHtmlDir, asset).split(sep).join('/');\n return `./${assetPath}`;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n",
|
|
8
|
+
"interface BuildOutputDescriptor {\n path: string;\n kind: string;\n}\n\nexport function isEntryJavaScriptOutput(\n output: BuildOutputDescriptor\n): boolean {\n return output.kind === 'entry-point' && isJavaScriptPath(output.path);\n}\n\nexport function isStylesheetOutput(output: { path: string }): boolean {\n return /\\.css$/i.test(output.path);\n}\n\nfunction isJavaScriptPath(path: string): boolean {\n return /\\.(?:[cm]?js)$/i.test(path);\n}\n",
|
|
9
|
+
"import { createHash, randomUUID } from 'node:crypto';\nimport { rename, rm, writeFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\n\ninterface DocumentStyle {\n css: string;\n attributes: [string, string][];\n eligible: boolean;\n}\n\nexport interface DocumentStylesResult {\n html: string;\n assets: string[];\n}\n\n/** Externalize the document shell's CSS without changing stylesheet order. */\nexport async function emitDocumentStyles(\n html: string,\n outDir: string,\n assetUrl: (path: string) => string,\n stylesheets: string[],\n componentStylesheets: string[] = []\n): Promise<DocumentStylesResult> {\n const styles: DocumentStyle[] = [];\n const linked = new Set<string>();\n let hasHead = false;\n let hasHtml = false;\n let current: DocumentStyle | undefined;\n new HTMLRewriter()\n .on('html', {\n element() {\n hasHtml = true;\n },\n })\n .on('head', {\n element() {\n hasHead = true;\n },\n })\n .on('head link', {\n element(element) {\n if (\n !element\n .getAttribute('rel')\n ?.toLowerCase()\n .split(/\\s+/)\n .includes('stylesheet')\n )\n return;\n const href = element.getAttribute('href');\n if (href !== null) linked.add(href);\n },\n })\n .on('head style', {\n element(element) {\n const attributes = [...element.attributes];\n const type = element.getAttribute('type')?.trim().toLowerCase();\n current = {\n css: '',\n attributes,\n // Identified/annotated style elements may be manipulated by client code.\n eligible:\n (!type || type === 'text/css') &&\n attributes.every(([name]) =>\n ['type', 'media', 'title', 'nonce'].includes(name)\n ),\n };\n styles.push(current);\n },\n text(chunk) {\n if (current) current.css += chunk.text;\n },\n })\n .transform(html);\n\n const replacements = new Map<number, string>();\n const assets = new Set<string>();\n for (const [index, style] of styles.entries()) {\n if (!style.eligible || !style.css.trim() || hasRelativeResources(style.css))\n continue;\n const hash = createHash('sha256')\n .update(style.css)\n .digest('hex')\n .slice(0, 16);\n const path = resolve(outDir, `document-${hash}.css`);\n await writeStylesheet(path, style.css);\n assets.add(path);\n const attributes = style.attributes\n .map(([name, value]) => ` ${name}=\"${escapeAttribute(value)}\"`)\n .join('');\n replacements.set(\n index,\n `<link rel=\"stylesheet\" href=\"${escapeAttribute(assetUrl(path))}\"${attributes}>`\n );\n }\n\n const missing = [...new Set(stylesheets)].filter((href) => !linked.has(href));\n const componentLinks = renderStylesheetLinks(\n [...new Set(componentStylesheets)].filter((href) => !linked.has(href))\n );\n const importedLinks = renderStylesheetLinks(missing);\n if (!hasHead && (importedLinks || componentLinks)) {\n const head = `<head>${importedLinks}${componentLinks}</head>`;\n const output = hasHtml\n ? new HTMLRewriter()\n .on('html', {\n element(element) {\n element.prepend(head, { html: true });\n },\n })\n .transform(html)\n : html.replace(/^(\\s*<!doctype[^>]*>)?/i, (doctype) => doctype + head);\n return { html: output, assets: [...assets] };\n }\n let index = 0;\n const output = new HTMLRewriter()\n .on('head', {\n element(element) {\n element.prepend(importedLinks, { html: true });\n // Components used to append their StyleManager sheets after the shell.\n element.append(componentLinks, { html: true });\n },\n })\n .on('head style', {\n element(element) {\n const replacement = replacements.get(index++);\n if (replacement !== undefined)\n element.replace(replacement, { html: true });\n },\n })\n .transform(html);\n return { html: output, assets: [...assets] };\n}\n\nfunction renderStylesheetLinks(hrefs: string[]): string {\n return hrefs\n .map((href) => `<link rel=\"stylesheet\" href=\"${escapeAttribute(href)}\">`)\n .join('');\n}\n\nexport async function emitComponentStyles(\n styles: ReadonlyMap<string, string>,\n outDir: string\n): Promise<string[]> {\n const css = [...styles.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([, value]) => value)\n .join('\\n');\n if (!css) return [];\n const hash = createHash('sha256').update(css).digest('hex').slice(0, 16);\n const path = resolve(outDir, `components-${hash}.css`);\n await writeStylesheet(path, css);\n return [path];\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n}\n\nfunction hasRelativeResources(css: string): boolean {\n // Relative URLs in an inline sheet resolve against the document, which is\n // different from the emitted file. Keep those sheets inline to preserve them.\n if (/\\\\|@import\\b|(?:-webkit-)?image(?:-set)?\\(/i.test(css)) return true;\n for (const match of css.matchAll(/url\\(\\s*(['\"]?)(.*?)\\1\\s*\\)/gi)) {\n const url = match[2]!.trim();\n if (url && !/^(?:\\/|[a-z][a-z\\d+.-]*:)/i.test(url)) return true;\n }\n return false;\n}\n\nasync function writeStylesheet(path: string, css: string): Promise<void> {\n // Published hash URLs must never expose a truncated file during another render.\n const temporary = `${path}.${randomUUID()}.tmp`;\n try {\n await writeFile(temporary, css);\n await rename(temporary, path);\n } finally {\n await rm(temporary, { force: true });\n }\n}\n",
|
|
10
|
+
"import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport type { BunPlugin, BuildOutput } from 'bun';\n\n/** Observe the real bundler graph, including JS, styles, assets and side effects. */\nexport function createBundleInputTracker() {\n const inputs = new Set<string>();\n const plugin: BunPlugin = {\n name: 'transone-build-inputs',\n setup(build) {\n // Returning undefined lets the platform/style loaders continue unchanged.\n // This also captures file inputs on Bun versions without metafile support.\n build.onLoad({ filter: /.*/, namespace: 'file' }, ({ path }) => {\n inputs.add(resolve(path));\n return undefined;\n });\n },\n };\n return {\n plugin,\n paths(result: Pick<BuildOutput, 'metafile'>): string[] {\n for (const [path, input] of Object.entries(\n result.metafile?.inputs ?? {}\n )) {\n const file = resolve(path);\n // Virtual platform modules have namespace keys rather than file paths.\n if (!existsSync(file)) continue;\n inputs.add(file);\n for (const dependency of input.imports) {\n const resolved = resolve(dependency.path);\n if (existsSync(resolved)) inputs.add(resolved);\n // Bun records unused named imports as unresolved/external entries even\n // when they are local files. Protect those known sources as well.\n try {\n const imported = Bun.resolveSync(\n dependency.original ?? dependency.path,\n dirname(file)\n );\n if (existsSync(imported)) inputs.add(imported);\n } catch {\n // Builtins and genuinely external imports do not identify local inputs.\n }\n }\n }\n if (!result.metafile) {\n // Older Bun versions lack metadata and may skip loading unused imports.\n // Scan only files already observed by the bundler; no second TS program.\n for (const file of [...inputs]) {\n if (!/\\.[cm]?[jt]sx?$/i.test(file)) continue;\n const loader = file.endsWith('.tsx')\n ? 'tsx'\n : file.endsWith('.jsx')\n ? 'jsx'\n : /\\.[cm]?ts$/.test(file)\n ? 'ts'\n : 'js';\n try {\n for (const dependency of new Bun.Transpiler({ loader }).scanImports(\n readFileSync(file, 'utf8')\n )) {\n try {\n const path = Bun.resolveSync(dependency.path, dirname(file));\n if (existsSync(path)) inputs.add(path);\n } catch {\n /* Builtins/external imports do not identify local files. */\n }\n }\n } catch {\n /* Platform loaders may have transformed the original syntax. */\n }\n }\n }\n return [...inputs];\n },\n };\n}\n",
|
|
11
|
+
"import { createWebStylesPlugin } from './web-styles';\nimport { buildOutputPath } from './output-transaction';\nimport { createBundleInputTracker } from './bundle-inputs';\nimport type { WebComponentContext } from './components/web';\n\n/** Persist only the final bundle, retaining runtime cascade for shared selectors. */\nexport async function buildWebBundle(\n options: Parameters<typeof Bun.build>[0] & { outdir: string },\n components?: WebComponentContext\n) {\n // Omitting outdir is Bun's supported in-memory build mode.\n const { outdir, ...inMemoryOptions } = options;\n const inputs = createBundleInputTracker();\n let stylesPlugin = createWebStylesPlugin(new Set(), components?.transform);\n const buildOptions = {\n ...inMemoryOptions,\n metafile: true,\n ...(components?.active ? { entrypoints: [components.entrypoint] } : {}),\n };\n const plugins = () => [\n inputs.plugin,\n ...(inMemoryOptions.plugins ?? []),\n ...(components?.active ? [components.plugin] : []),\n stylesPlugin,\n ];\n let result = await Bun.build({ ...buildOptions, plugins: plugins() });\n if (\n result.success &&\n stylesPlugin.styles.size &&\n stylesPlugin.runtimeFiles.size\n ) {\n stylesPlugin = createWebStylesPlugin(\n stylesPlugin.runtimeFiles,\n components?.transform\n );\n result = await Bun.build({ ...buildOptions, plugins: plugins() });\n }\n const outputs: { path: string; kind: string; type: string }[] = [];\n if (result.success) {\n for (const output of result.outputs) {\n const path = buildOutputPath(outdir, output.path);\n const contents = await output.arrayBuffer();\n await Bun.write(path, contents);\n outputs.push({ path, kind: output.kind, type: output.type });\n }\n }\n return {\n result: { success: result.success, logs: result.logs, outputs },\n styles: stylesPlugin.styles,\n inputPaths: inputs.paths(result),\n };\n}\n",
|
|
12
|
+
"import type { ResolvedMiniProgramConfig } from '../types';\n\n/**\n * 跨端差异层:同一套 mp 编译器(AST 静态分析 → WXML 系模板 / WXSS 系样式 /\n * Page/Component JS)通过 MpDialect 描述各小程序平台的产物差异。\n *\n * 平台差异点(positioning 9.M3「沉淀跨端差异层」):\n * - 模板文件后缀:.wxml / .axml / .ttml\n * - 样式文件后缀与 app 样式文件名:.wxss / .acss / .ttss\n * - 模板指令前缀:wx: / a: / tt:\n * - 事件绑定写法:bindtap / onTap / bindtap\n * - 工程配置文件与字段:project.config.json / mini.project.json / project.config.json\n * - app.json 的 window 字段名(navigationBarTitleText vs defaultTitle)与顶层差异\n * - 组件 json(微信 multipleSlots;阿里 / 字节无需)\n * - 是否生成 sitemap.json(微信特有)\n */\nexport interface MpDialect {\n /** 目标端标识,与 TargetType 一致。 */\n id: string;\n /** 人类可读描述。 */\n label: string;\n /** 模板文件后缀(不含点)。 */\n templateExt: string;\n /** 样式文件后缀(不含点)。 */\n styleExt: string;\n /** 全局样式文件名(app.wxss / app.acss / app.ttss)。 */\n appStyleFile: string;\n /** 模板指令前缀(wx: / a: / tt:)。 */\n directivePrefix: string;\n /** 普通事件绑定:bindtap / onTap / bindtap。 */\n bindEvent: (eventName: string) => string;\n /** 阻止冒泡事件绑定:catchtap / catchTap / catchtap。 */\n catchEvent: (eventName: string) => string;\n /** 工程配置文件文件名(project.config.json / mini.project.json)。 */\n projectConfigFile: string;\n /** 工程配置文件内容。 */\n buildProjectConfig: (\n mp: ResolvedMiniProgramConfig,\n projectName: string\n ) => Record<string, unknown>;\n /** app.json.window 的默认字段(平台字段名映射)。 */\n windowDefaults: (title: string) => Record<string, unknown>;\n /** app.json 顶层额外字段(微信的 style / sitemapLocation)。 */\n appJsonExtras: () => Record<string, unknown>;\n /** 是否生成 sitemap.json(微信特有)。 */\n sitemap: boolean;\n /** 自定义组件 json 的固定字段。 */\n componentJson: (usingComponents: Record<string, string>) => Record<string, unknown>;\n}\n\n/** camelCase 事件名转 PascalCase(阿里 onTap / onTouchStart)。 */\nfunction pascalEvent(eventName: string): string {\n return eventName.charAt(0).toUpperCase() + eventName.slice(1);\n}\n\nconst WEIXIN_PROJECT_SETTING = {\n es6: true,\n postcss: true,\n minified: true,\n urlCheck: false,\n} as const;\n\nexport const MP_WEIXIN_DIALECT: MpDialect = {\n id: 'mp-weixin',\n label: '微信小程序原生工程(WXML / WXSS / JS 静态转换)',\n templateExt: 'wxml',\n styleExt: 'wxss',\n appStyleFile: 'app.wxss',\n directivePrefix: 'wx:',\n bindEvent: (event) => `bind${event}`,\n catchEvent: (event) => `catch${event}`,\n projectConfigFile: 'project.config.json',\n buildProjectConfig: (mp, projectName) => ({\n appid: mp.appId,\n projectname: projectName,\n compileType: 'miniprogram',\n setting: { ...WEIXIN_PROJECT_SETTING },\n }),\n windowDefaults: (title) => ({\n navigationBarTitleText: title,\n navigationBarBackgroundColor: '#ffffff',\n navigationBarTextStyle: 'black',\n backgroundTextStyle: 'light',\n }),\n appJsonExtras: () => ({\n lazyCodeLoading: 'requiredComponents',\n style: 'v2',\n sitemapLocation: 'sitemap.json',\n }),\n sitemap: true,\n componentJson: (usingComponents) => ({\n component: true,\n multipleSlots: true,\n usingComponents,\n }),\n};\n\nexport const MP_ALIPAY_DIALECT: MpDialect = {\n id: 'mp-alipay',\n label: '阿里小程序原生工程(AXML / ACSS / JS 静态转换)',\n templateExt: 'axml',\n styleExt: 'acss',\n appStyleFile: 'app.acss',\n directivePrefix: 'a:',\n bindEvent: (event) => `on${pascalEvent(event)}`,\n catchEvent: (event) => `catch${pascalEvent(event)}`,\n projectConfigFile: 'mini.project.json',\n buildProjectConfig: () => ({\n miniprogramRoot: './',\n component2: true,\n enableAppxNg: true,\n compileType: 'miniprogram',\n }),\n windowDefaults: (title) => ({\n defaultTitle: title,\n titleBarColor: '#ffffff',\n }),\n appJsonExtras: () => ({}),\n sitemap: false,\n componentJson: (usingComponents) => ({\n component: true,\n usingComponents,\n }),\n};\n\nexport const MP_BYTEDANCE_DIALECT: MpDialect = {\n id: 'mp-bytedance',\n label: '字节小程序原生工程(TTML / TTSS / JS 静态转换)',\n templateExt: 'ttml',\n styleExt: 'ttss',\n appStyleFile: 'app.ttss',\n directivePrefix: 'tt:',\n bindEvent: (event) => `bind${event}`,\n catchEvent: (event) => `catch${event}`,\n projectConfigFile: 'project.config.json',\n buildProjectConfig: (mp, projectName) => ({\n miniprogramRoot: './',\n compileType: 'miniprogram',\n projectname: projectName,\n appid: mp.appId,\n setting: { ...WEIXIN_PROJECT_SETTING },\n }),\n windowDefaults: (title) => ({\n navigationBarTitleText: title,\n navigationBarBackgroundColor: '#ffffff',\n navigationBarTextStyle: 'black',\n backgroundTextStyle: 'light',\n }),\n appJsonExtras: () => ({}),\n sitemap: false,\n componentJson: (usingComponents) => ({\n component: true,\n usingComponents,\n }),\n};\n\nexport const MP_XIAOHONGSHU_DIALECT: MpDialect = {\n id: 'mp-xiaohongshu',\n label: '小红书小程序原生工程(XHSML / CSS / JS 静态转换)',\n templateExt: 'xhsml',\n styleExt: 'css',\n appStyleFile: 'app.css',\n directivePrefix: 'xhs:',\n bindEvent: (event) => `bind${event}`,\n catchEvent: (event) => `catch${event}`,\n projectConfigFile: 'project.config.json',\n buildProjectConfig: (mp, projectName) => ({\n appid: mp.appId,\n projectname: projectName,\n compileType: 'miniprogram',\n }),\n windowDefaults: (title) => ({\n navigationBarTitleText: title,\n navigationBarBackgroundColor: '#ffffff',\n navigationBarTextStyle: 'black',\n backgroundTextStyle: 'light',\n }),\n appJsonExtras: () => ({}),\n sitemap: false,\n componentJson: (usingComponents) => ({\n component: true,\n multipleSlots: true,\n usingComponents,\n }),\n};\n\nexport const MP_DIALECTS: Record<string, MpDialect> = {\n 'mp-weixin': MP_WEIXIN_DIALECT,\n 'mp-alipay': MP_ALIPAY_DIALECT,\n 'mp-bytedance': MP_BYTEDANCE_DIALECT,\n 'mp-xiaohongshu': MP_XIAOHONGSHU_DIALECT,\n};\n",
|
|
13
|
+
"import type { BuildOptions, BuildResult, ResolvedConfig } from '../types';\nimport type { BuildTarget, TargetType } from './types';\nimport {\n MP_ALIPAY_DIALECT,\n MP_BYTEDANCE_DIALECT,\n MP_WEIXIN_DIALECT,\n MP_XIAOHONGSHU_DIALECT,\n type MpDialect,\n} from '../mp/dialect';\n\n/**\n * 小程序目标端通用实现:同一套 mp 编译器 + MpDialect 差异层。\n *\n * 流水线(src/mp/):\n * 入口 → 静态分析(定位 createApp root / Component 子类)\n * → 逐页面编译(模板 / 样式 / data / methods / 生命周期)\n * → 组件调用点属性聚合(properties)\n * → 按 dialect 生成平台原生工程(app.json / app.js / 样式 / pages / components)。\n *\n * 依赖 TypeScript 编译器 API,仅在小程序构建路径惰性加载。\n */\nexport class MpTarget implements BuildTarget {\n public constructor(private readonly dialect: MpDialect) {}\n\n public get type(): TargetType {\n return this.dialect.id as TargetType;\n }\n\n public get label(): string {\n return this.dialect.label;\n }\n\n public async build(\n config: ResolvedConfig,\n _options: BuildOptions\n ): Promise<BuildResult> {\n if (!config.mp) {\n throw new Error(\n 'Mini program build requires config.mp(请在 transone.config.ts 配置 mp 字段,' +\n '如 appId / pages / outDir)'\n );\n }\n // 动态加载:mp 编译器依赖 typescript API,仅在小程序构建路径加载\n const { buildMiniProgram } = await import('../mp/build-mp');\n return buildMiniProgram(config, this.dialect);\n }\n}\n\nexport const mpWeixinTarget = new MpTarget(MP_WEIXIN_DIALECT);\nexport const mpAlipayTarget = new MpTarget(MP_ALIPAY_DIALECT);\nexport const mpBytedanceTarget = new MpTarget(MP_BYTEDANCE_DIALECT);\nexport const mpXiaohongshuTarget = new MpTarget(MP_XIAOHONGSHU_DIALECT);\n",
|
|
14
|
+
"import { cp, mkdir, writeFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport type { BuildResult, ResolvedConfig } from '../types';\nimport { nativeError } from './errors';\nimport { analyzeNativeScreen } from './analyze';\nimport type { NativeDialect, NativeScreen } from './types';\nimport {\n buildInputPaths,\n buildOutputPath,\n withBuildOutput,\n} from '../output-transaction';\n\nexport async function buildNativeApp(\n config: ResolvedConfig,\n dialect: NativeDialect\n): Promise<BuildResult> {\n if (!config.app) throw new Error('Native app build requires config.app');\n const entries = Object.values(config.app.pages);\n if (entries.length !== 1)\n throw nativeError(config.entry, '首期原生 App 只支持一个页面');\n const sourcePaths: string[] = [];\n const screen = await analyzeNativeScreen(entries[0], config, (paths) =>\n sourcePaths.push(...paths)\n );\n return withBuildOutput(\n {\n root: config.root,\n outDir: config.app.outDir,\n protectedPaths: buildInputPaths(config, entries, [\n config.app.publicDir,\n ...sourcePaths,\n ]),\n },\n (outDir) => generateNativeApp(config, dialect, outDir, screen)\n );\n}\n\nasync function generateNativeApp(\n config: ResolvedConfig,\n dialect: NativeDialect,\n outDir: string,\n screen: NativeScreen\n): Promise<BuildResult> {\n const app = config.app!;\n const files = dialect.generateProject(screen, app);\n if (app.host !== undefined) {\n files[`${dialect.resourceDirectory}/transone.config.json`] =\n `${JSON.stringify({ host: app.host }, null, 2)}\\n`;\n }\n const assetsBuilt: string[] = [];\n for (const [relative, content] of Object.entries(files).sort(([a], [b]) =>\n a.localeCompare(b)\n )) {\n const target = buildOutputPath(outDir, relative);\n await mkdir(dirname(target), { recursive: true });\n await writeFile(target, content, 'utf8');\n assetsBuilt.push(target);\n }\n if (existsSync(app.publicDir))\n await cp(\n app.publicDir,\n buildOutputPath(outDir, dialect.resourceDirectory),\n { recursive: true }\n );\n return { root: config.root, outDir: resolve(outDir), assetsBuilt };\n}\n",
|
|
15
|
+
"import { basename } from 'node:path';\n\nexport function nativeError(filePath: string, message: string): Error {\n return new Error(`[transone app] ${basename(filePath)}: ${message}`);\n}\n",
|
|
16
|
+
"import { existsSync, readFileSync } from 'node:fs';\nimport { composeNativeScreen } from './components';\nimport type { ResolvedConfig } from '../types';\nimport type * as tsTypes from 'typescript';\nimport { loadTypescript } from '../mp/ts-loader';\nimport { nativeError } from './errors';\nimport type { NativeAction, NativeNode, NativeScreen, NativeStateEntry, NativeStyle, NativeTextPart } from './types';\n\nconst CONTAINERS = new Set(['view', 'main', 'div']);\nconst TEXT = new Set(['text', 'span', 'p', 'h1']);\nconst STYLE_KEYS = new Set(['color', 'backgroundColor', 'fontSize', 'fontWeight', 'padding', 'margin', 'width', 'height', 'borderRadius', 'textAlign']);\n\nexport async function analyzeNativeScreen(\n entry: string,\n config?: ResolvedConfig,\n onSourcePaths?: (paths: readonly string[]) => void\n): Promise<NativeScreen> {\n if (!existsSync(entry)) throw nativeError(entry, '源文件不存在');\n if (config) {\n const screen = composeNativeScreen(entry, config, onSourcePaths);\n if (screen) return screen;\n }\n const ts = await loadTypescript();\n const source = ts.createSourceFile(\n entry,\n readFileSync(entry, 'utf8'),\n ts.ScriptTarget.Latest,\n true\n );\n const component = source.statements.find((s): s is tsTypes.ClassDeclaration =>\n ts.isClassDeclaration(s)\n );\n if (!component) throw nativeError(entry, '未找到 Component 类');\n const state = readState(ts, component, entry);\n const actions = new Map<string, NativeAction>();\n for (const member of component.members)\n if (ts.isMethodDeclaration(member) && ts.isIdentifier(member.name)) {\n const action = readAction(ts, member, entry);\n if (action) actions.set(member.name.text, action);\n }\n const render = component.members.find(\n (m): m is tsTypes.MethodDeclaration =>\n ts.isMethodDeclaration(m) && m.name.getText(source) === 'render'\n );\n const value = render?.body?.statements.find(ts.isReturnStatement)?.expression;\n if (!value || !ts.isObjectLiteralExpression(value))\n throw nativeError(entry, 'render() 必须返回静态 VNode 对象');\n const root = readNode(\n ts,\n value,\n entry,\n new Set(state.map((item) => item.key)),\n actions\n );\n if (root.kind !== 'container')\n throw nativeError(entry, '根节点必须是容器节点');\n return { name: component.name?.text ?? 'App', state, root };\n}\n\nfunction readState(ts: typeof tsTypes, component: tsTypes.ClassDeclaration, file: string): NativeStateEntry[] {\n const method = component.members.find((m): m is tsTypes.MethodDeclaration => ts.isMethodDeclaration(m) && m.name.getText() === 'initState');\n const value = method?.body?.statements.find(ts.isReturnStatement)?.expression;\n if (!value) return [];\n if (!ts.isObjectLiteralExpression(value)) throw nativeError(file, 'initState() 必须返回对象字面量');\n return value.properties.map((item) => {\n if (!ts.isPropertyAssignment(item) || !ts.isIdentifier(item.name)) throw nativeError(file, 'state 必须使用标识符属性');\n const literal = literalValue(ts, item.initializer);\n if (literal === undefined) throw nativeError(file, `state.${item.name.text} 必须是字面量`);\n return { key: item.name.text, value: literal };\n });\n}\n\nfunction readAction(ts: typeof tsTypes, method: tsTypes.MethodDeclaration, file: string): NativeAction | undefined {\n const expression = method.body?.statements[0];\n if (!expression || !ts.isExpressionStatement(expression) || !ts.isBinaryExpression(expression.expression)) return undefined;\n const binary = expression.expression;\n if (!ts.isPropertyAccessExpression(binary.left) || !ts.isPropertyAccessExpression(binary.left.expression) || binary.left.expression.expression.kind !== ts.SyntaxKind.ThisKeyword || binary.left.expression.name.text !== 'state') return undefined;\n const value = literalValue(ts, binary.right); const key = binary.left.name.text;\n if ((binary.operatorToken.kind === ts.SyntaxKind.PlusEqualsToken || binary.operatorToken.kind === ts.SyntaxKind.MinusEqualsToken) && typeof value === 'number') return { kind: 'increment', key, by: binary.operatorToken.kind === ts.SyntaxKind.MinusEqualsToken ? -value : value };\n if (binary.operatorToken.kind === ts.SyntaxKind.EqualsToken && value !== undefined) return { kind: 'set-literal', key, value };\n throw nativeError(file, `方法 ${method.name.getText()} 不支持原生编译`);\n}\n\nfunction readNode(ts: typeof tsTypes, node: tsTypes.ObjectLiteralExpression, file: string, state: Set<string>, actions: Map<string, NativeAction>): NativeNode {\n const tag = stringValue(ts, get(ts, node, 'tag'), file, 'VNode tag');\n const style = readStyle(ts, get(ts, node, 'props'), file);\n const children = get(ts, node, 'children');\n const childNodes = children && ts.isArrayLiteralExpression(children) ? [...children.elements].filter(ts.isExpression) : [];\n if (CONTAINERS.has(tag)) return { kind: 'container', children: childNodes.map((child) => {\n if (!ts.isObjectLiteralExpression(child)) throw nativeError(file, '容器 children 只支持静态 VNode');\n return readNode(ts, child, file, state, actions);\n }), ...(style ? { style } : {}) };\n const parts = childNodes.flatMap((child) => readText(ts, child, file, state));\n if (TEXT.has(tag)) return { kind: 'text', parts, ...(style ? { style } : {}) };\n if (tag === 'button') return { kind: 'button', parts, action: readClick(ts, get(ts, node, 'listeners'), file, actions), ...(style ? { style } : {}) };\n throw nativeError(file, `不支持的原生节点: ${tag}`);\n}\n\nfunction readText(ts: typeof tsTypes, expression: tsTypes.Expression, file: string, state: Set<string>): NativeTextPart[] {\n const value = literalValue(ts, expression); if (typeof value !== 'string') throw nativeError(file, '文本 children 必须是字符串字面量');\n const result: NativeTextPart[] = []; const matcher = /{{([^}]+)}}/g; let cursor = 0; let match: RegExpExecArray | null;\n while ((match = matcher.exec(value))) { if (match.index > cursor) result.push({ kind: 'literal', value: value.slice(cursor, match.index) }); const key = match[1]; if (!/^[A-Za-z_$][\\w$]*$/.test(key) || !state.has(key)) throw nativeError(file, '只支持已声明 state 的 {{key}} 绑定'); result.push({ kind: 'state', key }); cursor = matcher.lastIndex; }\n if (cursor < value.length || result.length === 0) result.push({ kind: 'literal', value: value.slice(cursor) }); return result;\n}\n\nfunction readClick(ts: typeof tsTypes, listeners: tsTypes.Expression | undefined, file: string, actions: Map<string, NativeAction>): NativeAction {\n if (!listeners || !ts.isObjectLiteralExpression(listeners)) throw nativeError(file, 'button 必须声明 listeners.click');\n const handler = get(ts, listeners, 'click');\n const body = handler && ts.isArrowFunction(handler) ? handler.body : undefined;\n const expression = body && ts.isCallExpression(body) ? body : body && ts.isBlock(body) && ts.isExpressionStatement(body.statements[0]) ? body.statements[0].expression : undefined;\n if (!expression || !ts.isCallExpression(expression) || !ts.isPropertyAccessExpression(expression.expression) || expression.expression.expression.kind !== ts.SyntaxKind.ThisKeyword) throw nativeError(file, 'click 只支持调用 this.method()');\n const action = actions.get(expression.expression.name.text); if (!action) throw nativeError(file, `click 方法 ${expression.expression.name.text} 不支持原生编译`); return action;\n}\n\nfunction readStyle(ts: typeof tsTypes, props: tsTypes.Expression | undefined, file: string): NativeStyle | undefined {\n if (!props || !ts.isObjectLiteralExpression(props)) return undefined; const style = get(ts, props, 'style'); if (!style || !ts.isObjectLiteralExpression(style)) return undefined;\n const out: Record<string, string | number> = {}; for (const item of style.properties) { if (!ts.isPropertyAssignment(item) || !ts.isIdentifier(item.name) || !STYLE_KEYS.has(item.name.text)) throw nativeError(file, '不支持的原生样式属性'); const value = literalValue(ts, item.initializer); const keyword = item.name.text === 'color' || item.name.text === 'backgroundColor' || item.name.text === 'fontWeight' || item.name.text === 'textAlign'; if (keyword && (typeof value === 'string' || typeof value === 'number')) { out[item.name.text] = value; continue; } if (typeof value !== 'number' && !(typeof value === 'string' && /^\\d+(\\.\\d+)?px$/.test(value))) throw nativeError(file, `样式 ${item.name.text} 只支持数字或 px`); out[item.name.text] = typeof value === 'string' ? Number.parseFloat(value) : value; } return out as NativeStyle;\n}\n\nfunction get(ts: typeof tsTypes, node: tsTypes.ObjectLiteralExpression, name: string): tsTypes.Expression | undefined { const item = node.properties.find((p) => ts.isPropertyAssignment(p) && p.name.getText().replace(/['\"]/g, '') === name); return item && ts.isPropertyAssignment(item) ? item.initializer : undefined; }\nfunction stringValue(ts: typeof tsTypes, expression: tsTypes.Expression | undefined, file: string, label: string): string { const value = expression && literalValue(ts, expression); if (typeof value !== 'string') throw nativeError(file, `${label} 必须是字符串`); return value; }\nfunction literalValue(ts: typeof tsTypes, value: tsTypes.Expression): string | number | boolean | undefined { if (ts.isStringLiteral(value) || ts.isNoSubstitutionTemplateLiteral(value)) return value.text; if (ts.isNumericLiteral(value)) return Number(value.text); if (value.kind === ts.SyntaxKind.TrueKeyword) return true; if (value.kind === ts.SyntaxKind.FalseKeyword) return false; return undefined; }\n",
|
|
17
|
+
"import ts from 'typescript';\nimport { realpathSync } from 'node:fs';\nimport {\n createComponentIndex,\n type ClassReference,\n type ComponentIndex,\n type OwnedMember,\n} from '../components';\nimport type { ResolvedConfig } from '../types';\nimport { nativeError } from './errors';\nimport type {\n NativeAction,\n NativeNode,\n NativeScreen,\n NativeStateValue,\n NativeStyle,\n NativeTextPart,\n} from './types';\n\ntype Binding =\n { kind: 'literal'; value: NativeStateValue } | { kind: 'state'; key: string };\ninterface Instance {\n reference: ClassReference;\n prefix: string;\n state: Map<string, string>;\n props: Map<string, Binding>;\n}\nconst CONTAINERS = new Set(['view', 'main', 'div']);\nconst TEXT = new Set(['text', 'span', 'p', 'h1']);\nconst STYLES = new Set([\n 'color',\n 'backgroundColor',\n 'fontSize',\n 'fontWeight',\n 'padding',\n 'margin',\n 'width',\n 'height',\n 'borderRadius',\n 'textAlign',\n]);\nfunction fail(node: ts.Node, message: string): never {\n const source = node.getSourceFile();\n const point = source.getLineAndCharacterOfPosition(node.getStart());\n throw nativeError(\n `${source.fileName}`,\n `${point.line + 1}:${point.character + 1} ${message}`\n );\n}\nfunction unwrap(node: ts.Expression): ts.Expression {\n while (\n ts.isParenthesizedExpression(node) ||\n ts.isAsExpression(node) ||\n ts.isNonNullExpression(node) ||\n ts.isSatisfiesExpression(node)\n )\n node = node.expression;\n return node;\n}\nfunction name(node: ts.PropertyName): string {\n return ts.isIdentifier(node) ||\n ts.isStringLiteralLike(node) ||\n ts.isNumericLiteral(node)\n ? node.text\n : fail(node, '只支持静态属性名');\n}\nfunction property(\n node: ts.ObjectLiteralExpression,\n key: string\n): ts.Expression | undefined {\n const item = node.properties.find(\n (p) => !ts.isSpreadAssignment(p) && name(p.name) === key\n );\n if (!item) return undefined;\n if (ts.isPropertyAssignment(item)) return item.initializer;\n if (ts.isShorthandPropertyAssignment(item)) return item.name;\n return fail(item, '只支持静态对象属性');\n}\nfunction object(\n node: ts.Expression | undefined,\n label: string\n): ts.ObjectLiteralExpression {\n if (!node || !ts.isObjectLiteralExpression(unwrap(node))) {\n if (node) fail(node, `${label} 必须是静态对象`);\n throw new Error(`[transone app] 缺少 ${label}`);\n }\n return unwrap(node) as ts.ObjectLiteralExpression;\n}\nfunction returnValue(member: OwnedMember): ts.Expression {\n const declaration = member.declaration;\n if (\n !ts.isMethodDeclaration(declaration) ||\n !declaration.body ||\n declaration.parameters.length !== 0 ||\n declaration.modifiers?.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword) ||\n declaration.body.statements.length !== 1 ||\n !ts.isReturnStatement(declaration.body.statements[0]) ||\n !declaration.body.statements[0].expression\n )\n fail(\n declaration,\n `${declaration.name?.getText()} 只支持单个静态 return 表达式`\n );\n return declaration.body.statements[0].expression;\n}\n\n/** Only direct unconditional calls/initializers (and an optional mount) start a native app. */\nfunction isTopLevelStartup(call: ts.CallExpression): boolean {\n function outer(node: ts.Expression): ts.Expression {\n let value = node;\n while (\n value.parent &&\n (ts.isParenthesizedExpression(value.parent) ||\n ts.isAsExpression(value.parent) ||\n ts.isNonNullExpression(value.parent) ||\n ts.isSatisfiesExpression(value.parent))\n )\n value = value.parent;\n return value;\n }\n let expression = outer(call);\n const access = expression.parent;\n if (\n ts.isPropertyAccessExpression(access) &&\n access.name.text === 'mount' &&\n ts.isCallExpression(access.parent) &&\n access.parent.expression === access &&\n !access.parent.arguments.length\n )\n expression = outer(access.parent);\n const parent = expression.parent;\n if (ts.isExpressionStatement(parent) || ts.isExportAssignment(parent))\n return ts.isSourceFile(parent.parent);\n if (\n ts.isVariableDeclaration(parent) &&\n parent.initializer === expression &&\n ts.isIdentifier(parent.name) &&\n ts.isVariableDeclarationList(parent.parent)\n ) {\n const statement = parent.parent.parent;\n return (\n ts.isVariableStatement(statement) && ts.isSourceFile(statement.parent)\n );\n }\n return false;\n}\n\nfunction validateStaticMetadata(expression: ts.Expression): void {\n const node = unwrap(expression);\n if (\n ts.isStringLiteralLike(node) ||\n ts.isNumericLiteral(node) ||\n node.kind === ts.SyntaxKind.TrueKeyword ||\n node.kind === ts.SyntaxKind.FalseKeyword ||\n node.kind === ts.SyntaxKind.NullKeyword\n )\n return;\n if (ts.isObjectLiteralExpression(node)) {\n const seen = new Set<string>();\n for (const item of node.properties) {\n if (!ts.isPropertyAssignment(item))\n fail(item, '原生 createApp 文档配置只支持静态字面量属性');\n const key = name(item.name);\n if (seen.has(key))\n fail(item, `原生 createApp 文档配置存在重复属性 ${key}`);\n seen.add(key);\n validateStaticMetadata(item.initializer);\n }\n return;\n }\n if (ts.isArrayLiteralExpression(node)) {\n for (const value of node.elements) validateStaticMetadata(value);\n return;\n }\n fail(node, '原生 createApp 文档配置只支持静态字面量表达式');\n}\n\n/** Returns undefined only for the legacy plain-class fixture format. */\nexport function composeNativeScreen(\n entry: string,\n config: ResolvedConfig,\n onSourcePaths?: (paths: readonly string[]) => void\n): NativeScreen | undefined {\n const index = createComponentIndex({\n root: config.root,\n entrypoints: [entry],\n platform: config.platform,\n ...config.components,\n });\n onSourcePaths?.(index.sources.map((source) => source.fileName));\n const source = index.sources.find(\n (s) => realpathSync(s.fileName) === realpathSync(entry)\n );\n if (!source) throw nativeError(entry, '源文件不存在');\n const compiler = new NativeComposer(index);\n const roots: { reference: ts.Expression; props?: ts.Expression }[] = [];\n const startupCalls: ts.CallExpression[] = [];\n function findStartup(node: ts.Node): void {\n if (ts.isCallExpression(node) && compiler.frameworkCall(node, 'createApp'))\n startupCalls.push(node);\n // Inspect nested declarations too: a dynamic factory must not fall back to\n // compiling an unrelated plain class just because it has no top-level call.\n ts.forEachChild(node, findStartup);\n }\n findStartup(source);\n\n function createdApp(\n expression: ts.Expression,\n seen = new Set<ts.Node>()\n ): boolean {\n const value = unwrap(expression);\n if (seen.has(value)) return false;\n seen.add(value);\n if (ts.isCallExpression(value))\n return compiler.frameworkCall(value, 'createApp');\n const declaration = index.symbolAt(value)?.valueDeclaration;\n return (\n !!declaration &&\n ts.isVariableDeclaration(declaration) &&\n !!declaration.initializer &&\n createdApp(declaration.initializer, seen)\n );\n }\n function rejectInstalledPlugins(node: ts.Node): void {\n // An unused ordinary helper is not native startup. Calls that actually\n // install a plugin on the app at top level are outside the native subset.\n if (ts.isFunctionLike(node) || ts.isClassLike(node)) return;\n if (ts.isCallExpression(node)) {\n const callee = unwrap(node.expression);\n const receiver = ts.isPropertyAccessExpression(callee)\n ? callee.expression\n : ts.isElementAccessExpression(callee)\n ? callee.expression\n : undefined;\n const method = ts.isPropertyAccessExpression(callee)\n ? callee.name.text\n : ts.isElementAccessExpression(callee) &&\n ts.isStringLiteralLike(callee.argumentExpression)\n ? callee.argumentExpression.text\n : undefined;\n if (\n method === 'use' &&\n receiver &&\n (createdApp(receiver) || compiler.frameworkCall(node, 'use'))\n )\n fail(node, '原生 App 不支持路由或插件安装 app.use()');\n }\n ts.forEachChild(node, rejectInstalledPlugins);\n }\n rejectInstalledPlugins(source);\n\n for (const call of startupCalls) {\n if (!isTopLevelStartup(call))\n fail(\n call,\n '原生 createApp 必须直接位于顶层启动语句;不支持条件、函数或动态表达式'\n );\n if (call.arguments.length !== 1)\n fail(call, '原生 createApp 只支持一个静态 options 对象');\n const options = object(call.arguments[0], 'createApp options');\n const seen = new Set<string>();\n for (const option of options.properties) {\n if (ts.isSpreadAssignment(option))\n fail(option, '原生 createApp options 不支持对象展开');\n if (\n !ts.isPropertyAssignment(option) &&\n !ts.isShorthandPropertyAssignment(option)\n )\n fail(option, '原生 createApp options 只支持静态属性');\n const key = name(option.name);\n if (seen.has(key))\n fail(option, `原生 createApp options 存在重复属性 ${key}`);\n seen.add(key);\n if (!['root', 'rootProps', 'document', 'rootElement'].includes(key))\n fail(option, `原生 createApp 不支持 options.${key}`);\n // Browser-only presentation metadata may be shared with the same entry,\n // but evaluating it must not hide arbitrary startup JavaScript.\n if (key === 'document' || key === 'rootElement')\n validateStaticMetadata(\n ts.isPropertyAssignment(option) ? option.initializer : option.name\n );\n }\n const root = property(options, 'root');\n if (!root) fail(call, 'createApp 缺少 root');\n roots.push({ reference: root, props: property(options, 'rootProps') });\n }\n if (roots.length > 1)\n fail(roots[1].reference, '原生页面只支持一个 createApp 根组件');\n let reference = roots[0] && index.resolve(roots[0].reference, source);\n if (roots.length && (!reference || !index.isComponent(reference)))\n fail(roots[0].reference, 'root 必须是可解析的静态组件引用');\n if (!reference) {\n const local = index.classes.filter(\n (c) => c.source === source && index.isComponent(c)\n );\n const logical = local.filter(\n (c) => index.metadata(c).platforms.length === 0\n );\n const candidates = logical.length ? logical : local;\n if (candidates.length > 1)\n fail(candidates[1].declaration, '多个根组件,请使用 createApp({ root })');\n reference = candidates[0];\n }\n return reference ? compiler.screen(reference, roots[0]?.props) : undefined;\n}\n\nclass NativeComposer {\n private nextInstance = 0;\n private state: NativeScreen['state'] = [];\n private stack: string[] = [];\n constructor(private index: ComponentIndex) {}\n frameworkCall(call: ts.CallExpression, expected: string): boolean {\n const symbol = this.index.symbolAt(call.expression);\n return (\n symbol?.name === expected &&\n !!symbol.declarations?.some((d) =>\n /(?:^|\\/)transone\\/(?:lib|dist)\\//.test(\n d.getSourceFile().fileName.replace(/\\\\/g, '/')\n )\n )\n );\n }\n screen(reference: ClassReference, props?: ts.Expression): NativeScreen {\n const bindings = new Map<string, Binding>();\n if (props)\n for (const p of object(props, 'rootProps').properties) {\n if (!ts.isPropertyAssignment(p)) fail(p, 'rootProps 只支持静态属性');\n bindings.set(name(p.name), {\n kind: 'literal',\n value: this.literal(p.initializer),\n });\n }\n const root = this.instance(reference, bindings);\n if (root.kind !== 'container')\n fail(reference.declaration, '根节点必须是容器节点');\n return { name: reference.className, state: this.state, root };\n }\n private member(\n reference: ClassReference,\n key: string\n ): OwnedMember | undefined {\n return this.index\n .members(reference)\n .find(\n (m) =>\n m.declaration.name &&\n name(m.declaration.name) === key &&\n !(\n ts.canHaveModifiers(m.declaration) &&\n ts\n .getModifiers(m.declaration)\n ?.some(\n (modifier) => modifier.kind === ts.SyntaxKind.StaticKeyword\n )\n )\n );\n }\n private parent(member: OwnedMember, key: string): OwnedMember {\n const parent = this.index.metadata(member.owner).parent;\n const result = parent && this.member(parent, key);\n if (!result) fail(member.declaration, `无法解析 super.${key}`);\n return result;\n }\n private literal(\n expression: ts.Expression,\n seen = new Set<ts.Node>()\n ): NativeStateValue {\n const node = unwrap(expression);\n if (ts.isStringLiteralLike(node)) return node.text;\n if (ts.isNumericLiteral(node)) return Number(node.text);\n if (node.kind === ts.SyntaxKind.TrueKeyword) return true;\n if (node.kind === ts.SyntaxKind.FalseKeyword) return false;\n if (\n ts.isPrefixUnaryExpression(node) &&\n (node.operator === ts.SyntaxKind.MinusToken ||\n node.operator === ts.SyntaxKind.PlusToken)\n ) {\n const value = this.literal(node.operand, seen);\n if (typeof value === 'number')\n return node.operator === ts.SyntaxKind.MinusToken ? -value : value;\n }\n if (ts.isIdentifier(node) || ts.isPropertyAccessExpression(node)) {\n const declaration = this.index.symbolAt(node)?.valueDeclaration;\n if (\n declaration &&\n ts.isVariableDeclaration(declaration) &&\n declaration.initializer &&\n ts.isVariableDeclarationList(declaration.parent) &&\n declaration.parent.flags & ts.NodeFlags.Const\n ) {\n if (seen.has(declaration)) fail(node, '常量引用循环');\n return this.literal(\n declaration.initializer,\n new Set([...seen, declaration])\n );\n }\n }\n return fail(node, `不支持的原生表达式: ${node.getText()}`);\n }\n private initialState(\n member: OwnedMember,\n active = new Set<ts.Node>()\n ): Map<string, NativeStateValue> {\n if (active.has(member.declaration))\n fail(member.declaration, 'initState 循环');\n active.add(member.declaration);\n const value = object(returnValue(member), 'initState()');\n const values = new Map<string, NativeStateValue>();\n for (const p of value.properties) {\n if (ts.isSpreadAssignment(p)) {\n const call = unwrap(p.expression);\n if (\n !ts.isCallExpression(call) ||\n !ts.isPropertyAccessExpression(call.expression) ||\n call.expression.expression.kind !== ts.SyntaxKind.SuperKeyword ||\n call.expression.name.text !== 'initState' ||\n call.arguments.length\n )\n fail(p, 'state 展开只支持 super.initState()');\n for (const [key, value] of this.initialState(\n this.parent(member, 'initState'),\n active\n ))\n values.set(key, value);\n } else if (ts.isPropertyAssignment(p))\n values.set(name(p.name), this.literal(p.initializer));\n else fail(p, 'state 必须使用静态属性');\n }\n active.delete(member.declaration);\n return values;\n }\n private instance(\n logical: ClassReference,\n props: Map<string, Binding>\n ): NativeNode {\n const reference = this.index.select(logical);\n if (this.stack.includes(reference.id))\n fail(reference.declaration, `静态组件组合循环: ${reference.className}`);\n this.stack.push(reference.id);\n this.validateInstance(reference);\n const instance: Instance = {\n reference,\n prefix: `c${this.nextInstance++}_`,\n state: new Map(),\n props,\n };\n const init = this.member(reference, 'initState');\n if (init)\n for (const [key, value] of this.initialState(init)) {\n const scoped = `${instance.prefix}s${instance.state.size}_${key.replace(/[^A-Za-z0-9_]/g, '_')}`;\n instance.state.set(key, scoped);\n this.state.push({ key: scoped, value });\n }\n const styles = this.member(reference, 'initStyles');\n if (styles) this.validateStyles(styles);\n const render = this.member(reference, 'render');\n if (!render) fail(reference.declaration, '缺少 render()');\n const root = this.node(returnValue(render), instance, render);\n this.stack.pop();\n return root;\n }\n private validateInstance(reference: ClassReference): void {\n // Constructors and field initializers execute for every ancestor, even if\n // a child overrides the corresponding member. They cannot be discarded.\n for (const owner of this.index.hierarchy(reference))\n for (const member of owner.declaration.members) {\n if (ts.isConstructorDeclaration(member))\n fail(member, '原生组件不支持自定义 constructor');\n if (\n ts.isPropertyDeclaration(member) &&\n member.initializer &&\n !member.modifiers?.some(\n (modifier) => modifier.kind === ts.SyntaxKind.StaticKeyword\n )\n )\n fail(member, '原生组件不支持实例字段初始化;请使用 initState');\n }\n // Match the framework component lifecycle, including props updates and\n // error boundaries. Effective members preserve override and owner semantics;\n // empty hooks remain harmless, but lifecycle JavaScript has no native IR.\n for (const key of [\n 'beforeMount',\n 'onMounted',\n 'beforeUpdate',\n 'onUpdated',\n 'onPropsChange',\n 'beforeUnmount',\n 'onUnmounted',\n 'onErrorCaptured',\n ]) {\n const member = this.member(reference, key);\n if (\n member &&\n (!ts.isMethodDeclaration(member.declaration) ||\n member.declaration.body?.statements.length)\n )\n fail(\n member.declaration,\n `原生组件不支持生命周期 ${key} 中的 JavaScript`\n );\n }\n }\n private validateStyles(member: OwnedMember): void {\n const declaration = member.declaration;\n if (!ts.isMethodDeclaration(declaration) || !declaration.body)\n fail(declaration, '原生 initStyles 必须具有静态方法体');\n for (const statement of declaration.body.statements) {\n if (\n ts.isExpressionStatement(statement) &&\n ts.isCallExpression(statement.expression) &&\n ts.isPropertyAccessExpression(statement.expression.expression) &&\n statement.expression.expression.expression.kind ===\n ts.SyntaxKind.SuperKeyword &&\n statement.expression.expression.name.text === 'initStyles' &&\n !statement.expression.arguments.length\n )\n this.validateStyles(this.parent(member, 'initStyles'));\n else\n fail(\n statement,\n '原生 initStyles 不支持 CSS 规则;请使用 VNode 内联 style 或覆盖为空方法'\n );\n }\n }\n private binding(expression: ts.Expression, instance: Instance): Binding {\n const node = unwrap(expression);\n if (\n ts.isPropertyAccessExpression(node) &&\n ts.isPropertyAccessExpression(node.expression) &&\n node.expression.expression.kind === ts.SyntaxKind.ThisKeyword\n ) {\n const group = node.expression.name.text;\n const key = node.name.text;\n if (group === 'state') {\n const scoped = instance.state.get(key);\n if (!scoped) fail(node, `未声明的 state.${key}`);\n return { kind: 'state', key: scoped };\n }\n if (group === 'props') {\n const binding = instance.props.get(key);\n if (!binding) fail(node, `未提供的 props.${key}`);\n return binding;\n }\n }\n return { kind: 'literal', value: this.literal(node) };\n }\n private text(\n expression: ts.Expression,\n instance: Instance\n ): NativeTextPart[] {\n const value = this.binding(expression, instance);\n if (value.kind === 'state') return [value];\n if (typeof value.value !== 'string')\n return [{ kind: 'literal', value: String(value.value) }];\n const result: NativeTextPart[] = [];\n const matcher = /{{([^}]+)}}/g;\n let cursor = 0;\n let match: RegExpExecArray | null;\n while ((match = matcher.exec(value.value))) {\n if (match.index > cursor)\n result.push({\n kind: 'literal',\n value: value.value.slice(cursor, match.index),\n });\n const key = match[1].trim();\n const scoped = instance.state.get(key);\n const prop = instance.props.get(key);\n if (scoped) result.push({ kind: 'state', key: scoped });\n else if (prop)\n result.push(\n prop.kind === 'state'\n ? prop\n : { kind: 'literal', value: String(prop.value) }\n );\n else fail(expression, `只支持已声明 state/props 的 {{key}} 绑定: ${key}`);\n cursor = matcher.lastIndex;\n }\n if (cursor < value.value.length || !result.length)\n result.push({ kind: 'literal', value: value.value.slice(cursor) });\n return result;\n }\n private props(\n node: ts.Expression | undefined,\n instance: Instance\n ): Map<string, Binding> {\n const result = new Map<string, Binding>();\n if (!node) return result;\n for (const p of object(node, '组件 props').properties) {\n if (!ts.isPropertyAssignment(p)) fail(p, '组件 props 只支持静态属性');\n result.set(name(p.name), this.binding(p.initializer, instance));\n }\n return result;\n }\n private style(props: ts.Expression | undefined): NativeStyle | undefined {\n if (!props) return undefined;\n const p = object(props, 'VNode props');\n for (const field of p.properties)\n if (ts.isSpreadAssignment(field) || name(field.name) !== 'style')\n fail(field, '原生 VNode props 只支持 style');\n const style = property(p, 'style');\n if (!style) return undefined;\n const out: Record<string, string | number> = {};\n for (const item of object(style, 'style').properties) {\n if (!ts.isPropertyAssignment(item) || !STYLES.has(name(item.name)))\n fail(item, '不支持的原生样式属性');\n const key = name(item.name),\n value = this.literal(item.initializer);\n if (\n ['color', 'backgroundColor', 'fontWeight', 'textAlign'].includes(key) &&\n (typeof value === 'string' || typeof value === 'number')\n )\n out[key] = value;\n else if (typeof value === 'number') out[key] = value;\n else if (typeof value === 'string' && /^\\d+(\\.\\d+)?px$/.test(value))\n out[key] = parseFloat(value);\n else fail(item, `样式 ${key} 只支持数字或 px`);\n }\n return out as NativeStyle;\n }\n private node(\n expression: ts.Expression,\n instance: Instance,\n owner: OwnedMember\n ): NativeNode {\n const node = unwrap(expression);\n let tag: ts.Expression | undefined,\n props: ts.Expression | undefined,\n children: ts.Expression | undefined,\n listeners: ts.Expression | undefined;\n if (\n ts.isCallExpression(node) &&\n this.frameworkCall(node, 'createComponent')\n ) {\n const first = node.arguments[0];\n if (!first) fail(node, 'createComponent 缺少静态组件');\n if (ts.isObjectLiteralExpression(unwrap(first))) {\n if (node.arguments.length !== 1)\n fail(node, 'createComponent options 不支持额外参数/slots');\n return this.componentNode(\n unwrap(first) as ts.ObjectLiteralExpression,\n instance\n );\n }\n if (node.arguments.length > 2)\n fail(node, '原生组件不支持 children/slots 或额外参数');\n const reference = this.index.resolve(first, first.getSourceFile());\n if (!reference || !this.index.isComponent(reference))\n fail(node, 'createComponent 必须引用静态组件');\n return this.instance(reference, this.props(node.arguments[1], instance));\n } else if (ts.isCallExpression(node) && this.frameworkCall(node, 'h')) {\n if (node.arguments.length > 4) fail(node, 'h 不支持额外参数/slots');\n [tag, props, children, listeners] = node.arguments;\n } else if (ts.isObjectLiteralExpression(node)) {\n if (property(node, 'component'))\n return this.componentNode(node, instance);\n for (const p of node.properties)\n if (\n ts.isSpreadAssignment(p) ||\n !['tag', 'props', 'children', 'listeners'].includes(name(p.name))\n )\n fail(p, '不支持的原生 VNode 属性/slots');\n tag = property(node, 'tag');\n props = property(node, 'props');\n children = property(node, 'children');\n listeners = property(node, 'listeners');\n } else if (\n ts.isCallExpression(node) &&\n ts.isPropertyAccessExpression(node.expression) &&\n node.expression.expression.kind === ts.SyntaxKind.SuperKeyword &&\n node.expression.name.text === 'render' &&\n !node.arguments.length\n ) {\n const parent = this.parent(owner, 'render');\n return this.node(returnValue(parent), instance, parent);\n } else return fail(node, '只支持静态 h/createComponent/VNode 表达式');\n if (!tag) fail(node, 'VNode 缺少 tag');\n const tagName = this.literal(tag);\n if (typeof tagName !== 'string') fail(tag, 'VNode tag 必须是字符串');\n const style = this.style(props);\n let values: readonly ts.Expression[] = [];\n if (children) {\n const array = unwrap(children);\n if (!ts.isArrayLiteralExpression(array))\n fail(children, 'children 必须是静态数组');\n values = array.elements;\n }\n if (CONTAINERS.has(tagName)) {\n if (listeners) fail(listeners, '原生容器不支持 listeners');\n return {\n kind: 'container',\n children: values.map((child) => this.node(child, instance, owner)),\n ...(style ? { style } : {}),\n };\n }\n if (!TEXT.has(tagName) && tagName !== 'button')\n fail(tag, `不支持的原生节点: ${tagName}`);\n const parts = values.flatMap((value) => this.text(value, instance));\n if (tagName === 'button')\n return {\n kind: 'button',\n parts,\n action: this.click(listeners, instance),\n ...(style ? { style } : {}),\n };\n if (listeners) fail(listeners, '原生文本不支持 listeners');\n return { kind: 'text', parts, ...(style ? { style } : {}) };\n }\n private componentNode(\n options: ts.ObjectLiteralExpression,\n instance: Instance\n ): NativeNode {\n for (const p of options.properties)\n if (\n ts.isSpreadAssignment(p) ||\n !['component', 'props'].includes(name(p.name))\n )\n fail(p, '原生组件不支持 slots、emitters 或动态 options');\n const component = property(options, 'component');\n const reference =\n component && this.index.resolve(component, component.getSourceFile());\n if (!reference || !this.index.isComponent(reference))\n fail(options, 'createComponent 必须引用静态组件');\n return this.instance(\n reference,\n this.props(property(options, 'props'), instance)\n );\n }\n private click(\n listeners: ts.Expression | undefined,\n instance: Instance\n ): NativeAction {\n const options = object(listeners, 'button listeners.click');\n for (const p of options.properties)\n if (ts.isSpreadAssignment(p) || name(p.name) !== 'click')\n fail(p, '只支持 listeners.click');\n const handler = property(options, 'click');\n if (!handler || !ts.isArrowFunction(handler) || handler.parameters.length)\n fail(options, 'click 只支持 () => this.method()');\n const body = handler.body;\n const call =\n ts.isBlock(body) &&\n body.statements.length === 1 &&\n ts.isExpressionStatement(body.statements[0])\n ? body.statements[0].expression\n : body;\n if (\n !ts.isCallExpression(call) ||\n !ts.isPropertyAccessExpression(call.expression) ||\n call.expression.expression.kind !== ts.SyntaxKind.ThisKeyword ||\n call.arguments.length\n )\n fail(handler, 'click 只支持调用 this.method()');\n const member = this.member(instance.reference, call.expression.name.text);\n if (!member) fail(call, 'click 方法不存在');\n return this.action(member, instance, new Set());\n }\n private action(\n member: OwnedMember,\n instance: Instance,\n active: Set<ts.Node>\n ): NativeAction {\n if (active.has(member.declaration))\n fail(member.declaration, '原生方法调用循环');\n const declaration = member.declaration;\n if (\n !ts.isMethodDeclaration(declaration) ||\n !declaration.body ||\n declaration.parameters.length ||\n declaration.modifiers?.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword)\n )\n fail(declaration, '原生动作只支持同步无参数方法');\n const next = new Set([...active, declaration]);\n const actions: NativeAction[] = [];\n for (const statement of declaration.body.statements) {\n if (!ts.isExpressionStatement(statement))\n fail(statement, '方法不支持原生编译');\n const expression = unwrap(statement.expression);\n if (\n ts.isCallExpression(expression) &&\n ts.isPropertyAccessExpression(expression.expression) &&\n !expression.arguments.length\n ) {\n const target = expression.expression;\n let called: OwnedMember | undefined;\n if (target.expression.kind === ts.SyntaxKind.SuperKeyword)\n called = this.parent(member, target.name.text);\n else if (target.expression.kind === ts.SyntaxKind.ThisKeyword)\n called = this.member(instance.reference, target.name.text);\n if (!called) fail(expression, '方法不支持原生编译');\n actions.push(this.action(called, instance, next));\n continue;\n }\n if (\n ts.isBinaryExpression(expression) &&\n ts.isPropertyAccessExpression(expression.left) &&\n ts.isPropertyAccessExpression(expression.left.expression) &&\n expression.left.expression.expression.kind ===\n ts.SyntaxKind.ThisKeyword &&\n expression.left.expression.name.text === 'state'\n ) {\n const key = instance.state.get(expression.left.name.text);\n if (!key) fail(expression.left, '动作引用未声明 state');\n const value = this.literal(expression.right);\n const operator = expression.operatorToken.kind;\n const initial = this.state.find((s) => s.key === key)!.value;\n if (\n (operator === ts.SyntaxKind.PlusEqualsToken ||\n operator === ts.SyntaxKind.MinusEqualsToken) &&\n typeof value === 'number' &&\n typeof initial === 'number'\n )\n actions.push({\n kind: 'increment',\n key,\n by: operator === ts.SyntaxKind.MinusEqualsToken ? -value : value,\n });\n else if (\n operator === ts.SyntaxKind.EqualsToken &&\n typeof value === typeof initial\n )\n actions.push({ kind: 'set-literal', key, value });\n else fail(expression, '原生动作只支持同类型赋值或数值增减');\n continue;\n }\n fail(expression, '方法不支持原生编译');\n }\n if (!actions.length) fail(declaration, '原生动作不能为空');\n return actions.length === 1 ? actions[0] : { kind: 'sequence', actions };\n }\n}\n",
|
|
18
|
+
"import type { BuildOptions, BuildResult, ResolvedConfig } from '../types';\nimport { buildNativeApp } from '../app/build-app';\nimport type { NativeDialect } from '../app/types';\nimport type { BuildTarget, TargetType } from './types';\n\nexport class AppTarget implements BuildTarget {\n public constructor(private readonly dialect: NativeDialect) {}\n public get type(): TargetType { return this.dialect.id; }\n public get label(): string { return this.dialect.label; }\n public build(config: ResolvedConfig, _options: BuildOptions): Promise<BuildResult> { return buildNativeApp(config, this.dialect); }\n}\n",
|
|
19
|
+
"import type { NativeAction, NativeDialect, NativeNode, NativeScreen, NativeTextPart } from './types';\n\nfunction text(parts: NativeTextPart[], language: 'swift' | 'kotlin' | 'ark'): string {\n if (language === 'swift') {\n const value = parts.map((part) => part.kind === 'literal' ? part.value : `\\\\(${part.key})`).join('');\n return `\"${value.replace(/\"/g, '\\\\\"')}\"`;\n }\n if (language === 'kotlin') {\n return JSON.stringify(parts.map((part) => part.kind === 'literal' ? part.value : `$${part.key}`).join(''));\n }\n return parts.map((part) => part.kind === 'literal' ? JSON.stringify(part.value) : `this.${part.key}`).join(' + ') || '\"\"';\n}\nfunction action(node: Extract<NativeNode, { kind: 'button' }>, language: 'swift' | 'kotlin' | 'ark'): string {\n return nativeAction(node.action, language);\n}\nfunction nativeAction(action: NativeAction, language: 'swift' | 'kotlin' | 'ark'): string {\n if (action.kind === 'sequence') return action.actions.map(item => nativeAction(item, language)).join('; ');\n const target = language === 'ark' ? `this.${action.key}` : action.key;\n return action.kind === 'increment' ? `${target} ${action.by >= 0 ? '+=' : '-='} ${Math.abs(action.by)}` : `${target} = ${typeof action.value === 'string' ? JSON.stringify(action.value) : action.value}`;\n}\nfunction swiftNode(node: NativeNode, indent = ' '): string {\n if (node.kind === 'container') return `${indent}VStack {\\n${node.children.map((child) => swiftNode(child, `${indent} `)).join('\\n')}\\n${indent}}`;\n if (node.kind === 'text') return `${indent}Text(${text(node.parts, 'swift')})`;\n return `${indent}Button(${text(node.parts, 'swift')}) { ${action(node, 'swift')} }`;\n}\nfunction kotlinNode(node: NativeNode, indent = ' '): string {\n if (node.kind === 'container') return `${indent}Column {\\n${node.children.map((child) => kotlinNode(child, `${indent} `)).join('\\n')}\\n${indent}}`;\n if (node.kind === 'text') return `${indent}Text(${text(node.parts, 'kotlin')})`;\n return `${indent}Button(onClick = { ${action(node, 'kotlin')} }) { Text(${text(node.parts, 'kotlin')}) }`;\n}\nfunction arkNode(node: NativeNode, indent = ' '): string {\n if (node.kind === 'container') return `${indent}Column() {\\n${node.children.map((child) => arkNode(child, `${indent} `)).join('\\n')}\\n${indent}}`;\n if (node.kind === 'text') return `${indent}Text(${text(node.parts, 'ark')})`;\n return `${indent}Button(${text(node.parts, 'ark')}).onClick(() => { ${action(node, 'ark')} })`;\n}\nfunction swiftState(screen: NativeScreen): string { return screen.state.map((item) => ` @State private var ${item.key}: ${typeof item.value === 'number' ? 'Int' : typeof item.value === 'boolean' ? 'Bool' : 'String'} = ${JSON.stringify(item.value)}`).join('\\n'); }\nfunction kotlinState(screen: NativeScreen): string { return screen.state.map((item) => ` var ${item.key} by remember { mutableStateOf(${JSON.stringify(item.value)}) }`).join('\\n'); }\nfunction arkState(screen: NativeScreen): string { return screen.state.map((item) => ` @State ${item.key}: ${typeof item.value === 'number' ? 'number' : typeof item.value === 'boolean' ? 'boolean' : 'string'} = ${JSON.stringify(item.value)}`).join('\\n'); }\n\nexport const IOS_DIALECT: NativeDialect = {\n id: 'app-ios', label: 'iOS 原生 App(SwiftUI)', resourceDirectory: 'TransOneApp/Assets',\n generateProject(screen, config) {\n return {\n 'TransOneApp/TransOneApp.swift': `import SwiftUI\\n\\n@main struct TransOneApp: App { var body: some Scene { WindowGroup { ContentView() } } }\\n`,\n 'TransOneApp/ContentView.swift': `import SwiftUI\\n\\nstruct ContentView: View {\\n${swiftState(screen)}\\n var body: some View {\\n${swiftNode(screen.root)}\\n }\\n}\\n`,\n 'TransOneApp.xcodeproj/project.pbxproj': xcodeProject(config),\n 'TransOneApp/Assets.xcassets/Contents.json': '{\"info\":{\"author\":\"xcode\",\"version\":1}}\\n',\n };\n },\n};\n\nfunction xcodeProject(config: { appName: string; bundleId: string; minPlatformVersion: string }): string {\n const escapedName = config.appName.replace(/\"/g, '\\\\\"');\n return `// !$*UTF8*$!\n{\n archiveVersion = 1;\n classes = {};\n objectVersion = 56;\n objects = {\n\n/* Begin PBXBuildFile section */\n A00100000000000000000001 /* TransOneApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = A00100000000000000000011 /* TransOneApp.swift */; };\n A00100000000000000000002 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A00100000000000000000012 /* ContentView.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n A00100000000000000000011 /* TransOneApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransOneApp.swift; sourceTree = \"<group>\"; };\n A00100000000000000000012 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = \"<group>\"; };\n A00100000000000000000013 /* TransOneApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TransOneApp.app; sourceTree = BUILT_PRODUCTS_DIR; };\n/* End PBXFileReference section */\n\n/* Begin PBXGroup section */\n A00100000000000000000021 = {isa = PBXGroup; children = (A00100000000000000000022 /* TransOneApp */, A00100000000000000000023 /* Products */, ); sourceTree = \"<group>\"; };\n A00100000000000000000022 /* TransOneApp */ = {isa = PBXGroup; children = (A00100000000000000000011 /* TransOneApp.swift */, A00100000000000000000012 /* ContentView.swift */, ); path = TransOneApp; sourceTree = \"<group>\"; };\n A00100000000000000000023 /* Products */ = {isa = PBXGroup; children = (A00100000000000000000013 /* TransOneApp.app */, ); name = Products; sourceTree = \"<group>\"; };\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n A00100000000000000000031 /* TransOneApp */ = {isa = PBXNativeTarget; buildConfigurationList = A00100000000000000000041 /* Build configuration list for PBXNativeTarget \"TransOneApp\" */; buildPhases = (A00100000000000000000032 /* Sources */, A00100000000000000000033 /* Frameworks */, A00100000000000000000034 /* Resources */, ); buildRules = (); dependencies = (); name = TransOneApp; productName = TransOneApp; productReference = A00100000000000000000013 /* TransOneApp.app */; productType = \"com.apple.product-type.application\"; };\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n A00100000000000000000051 /* Project object */ = {isa = PBXProject; attributes = { LastUpgradeCheck = 2700; TargetAttributes = { A00100000000000000000031 = { CreatedOnToolsVersion = 27.0; }; }; }; buildConfigurationList = A00100000000000000000052 /* Build configuration list for PBXProject \"TransOneApp\" */; compatibilityVersion = \"Xcode 14.0\"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = (en, Base, ); mainGroup = A00100000000000000000021; productRefGroup = A00100000000000000000023; projectDirPath = \"\"; projectRoot = \"\"; targets = (A00100000000000000000031 /* TransOneApp */, ); };\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n A00100000000000000000034 /* Resources */ = {isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = (); runOnlyForDeploymentPostprocessing = 0; };\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n A00100000000000000000032 /* Sources */ = {isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = (A00100000000000000000001 /* TransOneApp.swift in Sources */, A00100000000000000000002 /* ContentView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; };\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXFrameworksBuildPhase section */\n A00100000000000000000033 /* Frameworks */ = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = (); runOnlyForDeploymentPostprocessing = 0; };\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n A00100000000000000000061 /* Debug */ = {isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; SWIFT_VERSION = 5.0; }; name = Debug; };\n A00100000000000000000062 /* Release */ = {isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; SWIFT_VERSION = 5.0; }; name = Release; };\n A00100000000000000000063 /* Debug */ = {isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CODE_SIGNING_ALLOWED = NO; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = ${config.minPlatformVersion}; PRODUCT_BUNDLE_IDENTIFIER = ${config.bundleId}; PRODUCT_NAME = \"${escapedName}\"; SDKROOT = iphoneos; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = \"1,2\"; }; name = Debug; };\n A00100000000000000000064 /* Release */ = {isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CODE_SIGNING_ALLOWED = NO; GENERATE_INFOPLIST_FILE = YES; IPHONEOS_DEPLOYMENT_TARGET = ${config.minPlatformVersion}; PRODUCT_BUNDLE_IDENTIFIER = ${config.bundleId}; PRODUCT_NAME = \"${escapedName}\"; SDKROOT = iphoneos; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = \"1,2\"; }; name = Release; };\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n A00100000000000000000041 /* Build configuration list for PBXNativeTarget \"TransOneApp\" */ = {isa = XCConfigurationList; buildConfigurations = (A00100000000000000000063 /* Debug */, A00100000000000000000064 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; };\n A00100000000000000000052 /* Build configuration list for PBXProject \"TransOneApp\" */ = {isa = XCConfigurationList; buildConfigurations = (A00100000000000000000061 /* Debug */, A00100000000000000000062 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; };\n/* End XCConfigurationList section */\n };\n rootObject = A00100000000000000000051 /* Project object */;\n}\n`;\n}\n\nexport const ANDROID_DIALECT: NativeDialect = {\n id: 'app-android', label: 'Android 原生 App(Jetpack Compose)', resourceDirectory: 'app/src/main/assets',\n generateProject(screen, config) {\n const pkg = config.bundleId.replace(/[^A-Za-z0-9_.]/g, '_'); const path = pkg.replace(/\\./g, '/');\n return {\n 'settings.gradle.kts': `rootProject.name = \"${config.appName}\"\\ninclude(\":app\")\\n`,\n 'build.gradle.kts': 'plugins { }\\n',\n 'app/build.gradle.kts': `plugins { id(\"com.android.application\") version \"8.5.0\" apply false }\\n`,\n 'app/src/main/AndroidManifest.xml': `<manifest package=\"${pkg}\" xmlns:android=\"http://schemas.android.com/apk/res/android\"><application android:label=\"${config.appName}\"><activity android:name=\".MainActivity\" android:exported=\"true\"><intent-filter><action android:name=\"android.intent.action.MAIN\"/><category android:name=\"android.intent.category.LAUNCHER\"/></intent-filter></activity></application></manifest>\\n`,\n [`app/src/main/java/${path}/MainActivity.kt`]: `package ${pkg}\\n\\nimport androidx.activity.ComponentActivity\\nimport androidx.activity.compose.setContent\\nimport androidx.compose.runtime.*\\nimport androidx.compose.foundation.layout.Column\\nimport androidx.compose.material3.*\\n\\nclass MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: android.os.Bundle?) { super.onCreate(savedInstanceState); setContent {\\n${kotlinState(screen)}\\n${kotlinNode(screen.root)}\\n} } }\\n`,\n };\n },\n};\n\nexport const HARMONY_DIALECT: NativeDialect = {\n id: 'app-harmony', label: 'HarmonyOS 原生 App(ArkUI)', resourceDirectory: 'entry/src/main/resources/rawfile',\n generateProject(screen, config) {\n return {\n 'AppScope/app.json5': `{ \"app\": { \"bundleName\": \"${config.bundleId}\", \"vendor\": \"TransOne\", \"versionCode\": 1, \"versionName\": \"1.0.0\" } }\\n`,\n 'AppScope/resources/base/element/string.json': `{ \"string\": [{ \"name\": \"app_name\", \"value\": \"${config.appName}\" }] }\\n`,\n 'entry/src/main/module.json5': '{ \"module\": { \"name\": \"entry\", \"type\": \"entry\", \"mainElement\": \"EntryAbility\" } }\\n',\n 'entry/src/main/ets/entryability/EntryAbility.ets': 'import UIAbility from \\'@ohos.app.ability.UIAbility\\';\\nexport default class EntryAbility extends UIAbility {}\\n',\n 'entry/src/main/ets/pages/Index.ets': `@Entry\\n@Component\\nstruct Index {\\n${arkState(screen)}\\n build() {\\n${arkNode(screen.root)}\\n }\\n}\\n`,\n };\n },\n};\n",
|
|
20
|
+
"import type { BuildTarget, TargetType } from './types';\nimport { WebTarget } from './web-target';\nimport {\n mpAlipayTarget,\n mpBytedanceTarget,\n mpWeixinTarget,\n mpXiaohongshuTarget,\n} from './mp-target';\nimport { AppTarget } from './app-target';\nimport { ANDROID_DIALECT, HARMONY_DIALECT, IOS_DIALECT } from '../app/dialects';\n\n/**\n * 目标端注册表:编译器按 Target 分发代码生成(positioning 7.3)。\n *\n * 注册 Web 与各小程序 target;\n * app-* 通过平台方言注册原生源码生成器。\n */\nexport class TargetRegistry {\n private readonly targets = new Map<TargetType, BuildTarget>();\n\n public constructor() {\n this.register(new WebTarget());\n this.register(mpWeixinTarget);\n this.register(mpAlipayTarget);\n this.register(mpBytedanceTarget);\n this.register(mpXiaohongshuTarget);\n this.register(new AppTarget(IOS_DIALECT));\n this.register(new AppTarget(ANDROID_DIALECT));\n this.register(new AppTarget(HARMONY_DIALECT));\n }\n\n public register(target: BuildTarget): void {\n this.targets.set(target.type, target);\n }\n\n public resolve(type: TargetType): BuildTarget {\n const target = this.targets.get(type);\n if (!target) {\n throw new Error(`Unknown build target: ${type}`);\n }\n return target;\n }\n\n public getAvailableTargets(): BuildTarget[] {\n return [...this.targets.values()];\n }\n}\n\nexport const targetRegistry = new TargetRegistry();\n",
|
|
21
|
+
"import { mkdirSync, writeFileSync } from 'node:fs';\nimport { dirname, isAbsolute, relative, resolve, sep } from 'node:path';\nimport type * as TypeScript from 'typescript';\nimport { loadTypescript } from './mp/ts-loader';\nimport { createBundleInputTracker } from './bundle-inputs';\nimport { buildInputPaths, withBuildOutput } from './output-transaction';\nimport { resolveConfig } from './config';\nimport { targetRegistry } from './target/registry';\nimport type { BuildOptions, BuildResult, ResolvedConfig } from './types';\n\n/**\n * TransOne 构建入口:解析配置后按 Target 分发到对应编译目标。\n *\n * 同一个入口文档,`transone build --target <端>` 产出对应平台原生产物\n * (positioning 1:一份源码,多端原生产物,零运行时桥接)。\n */\nexport async function build(options: BuildOptions = {}): Promise<BuildResult> {\n return buildConfigured(await resolveConfig(options), options);\n}\n\n/** Use the same resolved configuration for inspection and output generation. */\nexport async function buildConfigured(\n config: ResolvedConfig,\n options: BuildOptions = {}\n): Promise<BuildResult> {\n // 库构建与目标端无关:直接产出可发布的 ESM bundle + .d.ts。\n if (options.library) {\n return buildLibrary(config);\n }\n\n const target = targetRegistry.resolve(config.target);\n return target.build(config, options);\n}\n\nasync function buildLibrary(\n config: Awaited<ReturnType<typeof resolveConfig>>\n): Promise<BuildResult> {\n const library = config.library;\n if (!library) {\n throw new Error('TransOne library build requires config.library');\n }\n\n const declarations = library.dts\n ? await Promise.all(library.tsconfigs.map(loadDeclarationProject))\n : [];\n const protectedPaths = buildInputPaths(\n config,\n [library.entry],\n [...library.tsconfigs, ...declarations.flatMap((project) => project.inputs)]\n );\n return withBuildOutput(\n {\n root: config.root,\n outDir: library.outDir,\n protectedPaths,\n },\n async (outDir) => {\n const declarationAssets = declarations.flatMap((project) =>\n emitDeclarations(project, library.outDir, outDir)\n );\n const minify = library.minify ?? process.env.TRANSONE_MINIFY !== '0';\n const inputs = createBundleInputTracker();\n const result = await Bun.build({\n entrypoints: [library.entry],\n outdir: outDir,\n metafile: true,\n plugins: [inputs.plugin],\n root: dirname(library.entry),\n target: 'browser',\n format: 'esm',\n sourcemap: library.sourcemap ? 'linked' : undefined,\n splitting: library.splitting,\n minify,\n external: library.external,\n throw: false,\n });\n\n if (!result.success || result.outputs.length === 0) {\n throw new Error(\n `Failed to build TransOne library:\\n${result.logs\n .map((log) => log.message)\n .join('\\n')}`\n );\n }\n\n protectedPaths.push(...inputs.paths(result));\n const assetsBuilt = [\n ...declarationAssets,\n ...result.outputs.map((output) => resolve(output.path)),\n ];\n return {\n root: config.root,\n outDir,\n assetsBuilt: [...new Set(assetsBuilt)],\n };\n }\n );\n}\n\ninterface DeclarationProject {\n ts: typeof TypeScript;\n program: TypeScript.Program;\n diagnostics: readonly TypeScript.Diagnostic[];\n inputs: string[];\n configFile: string;\n}\n\nasync function loadDeclarationProject(\n configFile: string\n): Promise<DeclarationProject> {\n const ts = await loadTypescript();\n const inputs = new Set<string>();\n const diagnostics: TypeScript.Diagnostic[] = [];\n const parsed = ts.getParsedCommandLineOfConfigFile(\n configFile,\n {},\n {\n ...ts.sys,\n readFile: (path) => {\n inputs.add(resolve(path));\n return ts.sys.readFile(path);\n },\n onUnRecoverableConfigFileDiagnostic: (diagnostic) => {\n diagnostics.push(diagnostic);\n },\n }\n );\n if (!parsed) throw declarationError(ts, configFile, diagnostics);\n const program = ts.createProgram({\n rootNames: parsed.fileNames,\n options: parsed.options,\n projectReferences: parsed.projectReferences,\n });\n for (const source of program.getSourceFiles())\n inputs.add(resolve(source.fileName));\n return {\n ts,\n program,\n diagnostics: [...diagnostics, ...parsed.errors],\n inputs: [...inputs],\n configFile,\n };\n}\n\nfunction emitDeclarations(\n project: DeclarationProject,\n finalOutDir: string,\n staging: string\n): string[] {\n const { ts, program, configFile } = project;\n const diagnostics = [\n ...project.diagnostics,\n ...ts.getPreEmitDiagnostics(program),\n ];\n if (\n diagnostics.some(\n (diagnostic) => diagnostic.category === ts.DiagnosticCategory.Error\n )\n ) {\n throw declarationError(ts, configFile, diagnostics);\n }\n const assets: string[] = [];\n // Keep the compiler's original output paths when generating source/declaration\n // maps, but redirect the actual writes. Moving a sibling staging directory to\n // its destination then preserves both configured layout and relative sources.\n const emitted = program.emit(undefined, (file, content, byteOrderMark) => {\n const path = relative(finalOutDir, resolve(file));\n if (\n path === '' ||\n path === '..' ||\n path.startsWith(`..${sep}`) ||\n isAbsolute(path)\n ) {\n throw new Error(\n `TypeScript output must be inside library.outDir for recoverable publication: ${file} (${configFile})`\n );\n }\n const target = resolve(staging, path);\n mkdirSync(dirname(target), { recursive: true });\n writeFileSync(target, `${byteOrderMark ? '\\uFEFF' : ''}${content}`);\n assets.push(target);\n });\n if (\n emitted.emitSkipped ||\n emitted.diagnostics.some(\n (diagnostic) => diagnostic.category === ts.DiagnosticCategory.Error\n )\n ) {\n throw declarationError(ts, configFile, emitted.diagnostics);\n }\n return assets;\n}\n\nfunction declarationError(\n ts: typeof TypeScript,\n configFile: string,\n diagnostics: readonly TypeScript.Diagnostic[]\n): Error {\n return new Error(\n `TypeScript compilation failed for ${configFile}:\\n${ts.formatDiagnostics(\n diagnostics,\n {\n getCanonicalFileName: (file) => file,\n getCurrentDirectory: () => dirname(configFile),\n getNewLine: () => '\\n',\n }\n )}`\n );\n}\n",
|
|
22
|
+
"import { relative, sep } from 'node:path';\nimport {\n getPlatformDefinition,\n type ComponentPlatform,\n type Platform,\n} from 'transone/platform';\nimport { resolveConfig } from '../config';\nimport type { ResolveConfigOptions, ResolvedConfig } from '../types';\nimport { createComponentIndex } from './index';\nimport { canonicalPath } from './discovery';\nimport type { ClassReference, ComponentSelectionReason } from './types';\n\n/** JSON-safe source identity. Paths are relative to the project root. */\nexport interface ComponentReportLocation {\n source: string;\n className: string;\n /** One-based declaration start, including decorators where present. */\n line: number;\n column: number;\n}\n\nexport interface ComponentReportCandidate extends ComponentReportLocation {\n platforms: readonly ComponentPlatform[];\n}\n\nexport interface ComponentSelectionReportRow {\n /**\n * Relative entrypoints sharing this selection index. Web pages have independent\n * indexes, so one logical component can have a separate row for each page.\n */\n entrypoints: readonly string[];\n component: ComponentReportLocation;\n /** Null means an abstract logical component has no matching implementation. */\n implementation: ComponentReportLocation | null;\n reason: Exclude<ComponentSelectionReason, 'explicit'>;\n candidates: readonly ComponentReportCandidate[];\n}\n\n/**\n * Static discovered logical-component mappings, including unused components.\n * These rows do not establish runtime constructor usage or application reachability.\n * Explicit implementation references retain their own identities and are not rows.\n * Web mappings are scoped to each page entry; MiniProgram and App mappings retain\n * the configured shared page entrypoints.\n */\nexport interface ComponentSelectionReport {\n platform: Platform;\n scope: 'discovered-logical-components';\n components: readonly ComponentSelectionReportRow[];\n}\n\n/**\n * Resolve normal project configuration and inspect sources with the build matcher.\n * The project config is loaded as usual; component modules are read by TypeScript,\n * never imported or evaluated by this API. No build output is written.\n */\nexport async function reportComponents(\n options: ResolveConfigOptions = {}\n): Promise<ComponentSelectionReport> {\n return reportConfiguredComponents(await resolveConfig(options));\n}\n\n/** Inspect an already resolved application config without loading it again. */\nexport function reportConfiguredComponents(\n config: ResolvedConfig\n): ComponentSelectionReport {\n const family = getPlatformDefinition(config.platform).family;\n const pages =\n family === 'miniprogram'\n ? (config.mp?.pages ?? config.pages)\n : family === 'app'\n ? (config.app?.pages ?? config.pages)\n : config.pages;\n const entries = [...new Set(Object.values(pages))];\n // Match the backend's discovery boundary: Web builds one index per page.\n // Combining those roots can introduce candidates (or conflicts) from another page.\n const contexts =\n family === 'web' ? entries.map((entry) => [entry]) : [entries];\n const root = canonicalPath(config.root);\n const sourcePath = (path: string) =>\n relative(root, canonicalPath(path)).split(sep).join('/');\n const location = (reference: ClassReference): ComponentReportLocation => {\n const point = reference.source.getLineAndCharacterOfPosition(\n reference.declaration.getStart(reference.source)\n );\n return {\n source: sourcePath(reference.filePath),\n className: reference.className,\n line: point.line + 1,\n column: point.character + 1,\n };\n };\n const components: ComponentSelectionReportRow[] = [];\n for (const context of contexts) {\n const index = createComponentIndex({\n root: config.root,\n entrypoints: context,\n platform: config.platform,\n include: config.components?.include,\n exclude: config.components?.exclude,\n });\n const entrypoints = context.map(sourcePath).sort();\n for (const reference of index.classes) {\n if (!index.isComponent(reference) || index.metadata(reference).framework)\n continue;\n const decision = index.decision(reference);\n // Implementation classes are explicit-only references, not logical mappings.\n if (decision.reason === 'explicit') continue;\n components.push({\n entrypoints,\n component: location(reference),\n implementation: decision.implementation\n ? location(decision.implementation)\n : null,\n reason: decision.reason,\n candidates: decision.candidates\n .map((candidate) => ({\n ...location(candidate),\n platforms: [...index.metadata(candidate).platforms].sort(),\n }))\n .sort(compareLocations),\n });\n }\n }\n components.sort(\n (left, right) =>\n compareText(left.entrypoints.join('\\0'), right.entrypoints.join('\\0')) ||\n compareLocations(left.component, right.component)\n );\n return {\n platform: config.platform,\n scope: 'discovered-logical-components',\n components,\n };\n}\n\nfunction compareText(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\nfunction compareLocations(\n left: ComponentReportLocation,\n right: ComponentReportLocation\n): number {\n return (\n compareText(left.source, right.source) ||\n left.line - right.line ||\n left.column - right.column ||\n compareText(left.className, right.className)\n );\n}\n\n/** Human-readable rendering of the same structured, static mapping report. */\nexport function formatComponentSelectionReport(\n report: ComponentSelectionReport\n): string {\n const describe = (value: ComponentReportLocation) =>\n `${value.className} (${value.source}:${value.line}:${value.column})`;\n return [\n `TransOne component selection: ${report.platform}`,\n 'Scope: discovered logical component mappings; runtime constructor usage is not analyzed.',\n ...(report.components.length\n ? report.components.flatMap((row) => [\n `${describe(row.component)} -> ${row.implementation ? describe(row.implementation) : '(missing)'} [${row.reason}]`,\n ` Entrypoints: ${row.entrypoints.join(', ')}`,\n ...(row.candidates.length\n ? [\n ` Candidates: ${row.candidates.map((candidate) => `${describe(candidate)} [${candidate.platforms.join(', ')}]`).join('; ')}`,\n ]\n : []),\n ])\n : ['(no logical components discovered)']),\n ].join('\\n');\n}\n",
|
|
23
|
+
"import { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { basename, dirname, join } from 'node:path';\nimport { scaffoldFiles } from './scaffold';\n\nexport interface CreateProjectOptions {\n /** Target directory; defaults to the current working directory. */\n root?: string;\n /** Package name; defaults to the target directory basename. */\n name?: string;\n}\n\nexport interface CreateProjectResult {\n root: string;\n files: string[];\n}\n\n/** Framework version required by the generated component-family example. */\nexport const TRANSONE_FRAMEWORK_VERSION = '0.9.0';\n/** CLI version required by generated platform scripts. */\nexport const TRANSONE_CLI_VERSION = '0.10.0';\n\nexport const GITHUB_URL = 'https://github.com/geektech-team/transone';\n\nexport function createProject(\n options: CreateProjectOptions = {}\n): CreateProjectResult {\n const root = options.root ?? process.cwd();\n const name = options.name ?? basename(root);\n const files = scaffoldFiles(\n name,\n TRANSONE_FRAMEWORK_VERSION,\n TRANSONE_CLI_VERSION\n );\n\n const existing = files.filter((file) => existsSync(join(root, file.path)));\n if (existing.length > 0) {\n throw new Error(\n `Refusing to overwrite existing TransOne project files: ${existing\n .map((file) => file.path)\n .join(', ')}`\n );\n }\n\n mkdirSync(join(root, 'src'), { recursive: true });\n const created: string[] = [];\n for (const file of files) {\n mkdirSync(dirname(join(root, file.path)), { recursive: true });\n writeFileSync(join(root, file.path), file.content, {\n encoding: 'utf8',\n flag: 'wx',\n });\n created.push(file.path);\n }\n\n return { root, files: created };\n}\n",
|
|
24
|
+
"export interface ScaffoldFile {\n path: string;\n content: string;\n}\n\ninterface CardView {\n className: string;\n decorator: string;\n label: string;\n background: string;\n}\n\nconst cardViews: CardView[] = [\n {\n className: 'CardWebComponent',\n decorator: 'Web',\n label: 'Web Card',\n background: '#eff6ff',\n },\n {\n className: 'CardMiniprogramComponent',\n decorator: 'Miniprogram',\n label: 'Miniprogram Card',\n background: '#f0fdf4',\n },\n {\n className: 'CardAppComponent',\n decorator: 'App',\n label: 'App Card',\n background: '#f8fafc',\n },\n {\n className: 'CardMobileComponent',\n decorator: 'WebMobile',\n label: 'Mobile Web Card',\n background: '#f0fdf4',\n },\n {\n className: 'CardPcComponent',\n decorator: 'WebPc',\n label: 'PC Web Card',\n background: '#eef2ff',\n },\n {\n className: 'CardWeixinComponent',\n decorator: 'MiniprogramWeixin',\n label: 'Weixin Card',\n background: '#f0fdf4',\n },\n {\n className: 'CardAlipayComponent',\n decorator: 'MiniprogramAlipay',\n label: 'Alipay Card',\n background: '#eff6ff',\n },\n {\n className: 'CardIosComponent',\n decorator: 'AppIos',\n label: 'iOS Card',\n background: '#f8fafc',\n },\n {\n className: 'CardAndroidComponent',\n decorator: 'AppAndroid',\n label: 'Android Card',\n background: '#f0fdf4',\n },\n];\n\nfunction cardRender(label: string, background = '#ffffff'): string {\n return ` protected render(): VNode {\n return h('main', {\n style: { padding: '16px', borderRadius: '12px', backgroundColor: '${background}' },\n }, [\n h('h1', { style: { fontSize: '20px' } }, [this.props.title]),\n h('p', {}, ['${label}']),\n h('p', {}, ['Count: {{count}}']),\n h('button', {}, ['+1'], { click: () => this.increment() }),\n ]);\n }`;\n}\n\n/** Sources shared by create and its consumer-build verification. */\nexport function scaffoldFiles(\n name: string,\n frameworkVersion: string,\n cliVersion: string\n): ScaffoldFile[] {\n return [\n {\n path: 'package.json',\n content:\n JSON.stringify(\n {\n name,\n private: true,\n type: 'module',\n scripts: {\n dev: 'transone dev',\n 'dev:mobile': 'transone dev --target web-mobile',\n 'dev:pc': 'transone dev --target web-pc',\n build: 'transone build',\n 'build:web': 'transone build --target web',\n 'build:mobile': 'transone build --target web-mobile',\n 'build:pc': 'transone build --target web-pc',\n 'build:weixin': 'transone build --target miniprogram-weixin',\n 'build:alipay': 'transone build --target miniprogram-alipay',\n 'build:bytedance':\n 'transone build --target miniprogram-bytedance',\n 'build:xiaohongshu':\n 'transone build --target miniprogram-xiaohongshu',\n 'build:ios': 'transone build --target app-ios',\n 'build:android': 'transone build --target app-android',\n 'build:harmony': 'transone build --target app-harmony',\n typecheck: 'bunx tsc --noEmit',\n },\n dependencies: { transone: `^${frameworkVersion}` },\n devDependencies: {\n 'transone-cli': `^${cliVersion}`,\n typescript: '^5.3.3',\n },\n },\n null,\n 2\n ) + '\\n',\n },\n {\n path: 'transone.config.ts',\n content: `import { Platform } from 'transone';\nimport { defineConfig } from 'transone-cli';\n\nexport default defineConfig({\n entry: 'src/main.ts',\n target: Platform.Web,\n});\n`,\n },\n {\n path: 'tsconfig.json',\n content:\n JSON.stringify(\n {\n compilerOptions: {\n target: 'ESNext',\n module: 'ESNext',\n moduleResolution: 'Bundler',\n lib: ['ESNext', 'DOM', 'DOM.Iterable'],\n strict: true,\n noEmit: true,\n skipLibCheck: true,\n verbatimModuleSyntax: true,\n },\n include: ['src/**/*', 'transone.config.ts'],\n },\n null,\n 2\n ) + '\\n',\n },\n { path: '.gitignore', content: 'node_modules/\\ndist/\\n' },\n {\n path: 'src/main.ts',\n content: `import { createApp } from 'transone';\nimport { AppComponent } from './AppComponent';\n\nexport const app = createApp({\n root: AppComponent,\n document: { title: 'TransOne component variants' },\n});\napp.mount();\n`,\n },\n {\n path: 'src/AppComponent.ts',\n content: `import { BaseComponent, createComponent, h, type VNode } from 'transone';\nimport { CardComponent } from './components/card/CardComponent';\n\nexport class AppComponent extends BaseComponent<object, object> {\n protected initState(): object { return {}; }\n protected initStyles(): void {}\n\n protected render(): VNode {\n return h('main', { style: { padding: '16px' } }, [\n h('h1', {}, ['TransOne component variants']),\n createComponent({\n component: CardComponent,\n props: { title: 'Shared business, platform view' },\n }),\n ]);\n }\n}\n`,\n },\n {\n path: 'src/components/card/CardComponent.ts',\n content: `import { BaseComponent, h, type VNode } from 'transone';\n\nexport interface CardProps { title: string; }\nexport interface CardState { count: number; }\n\n/** Shared state and business methods; pages only import this class. */\nexport class CardComponent extends BaseComponent<CardProps, CardState> {\n protected initState(): CardState { return { count: 0 }; }\n protected initStyles(): void {}\n protected increment(): void { this.state.count += 1; }\n\n${cardRender('Shared Card')}\n}\n`,\n },\n ...cardViews.map((view) => ({\n path: `src/components/card/${view.className}.ts`,\n content: `import { ${view.decorator}, h, type VNode } from 'transone';\nimport { CardComponent } from './CardComponent';\n\n@${view.decorator}()\nexport class ${view.className} extends CardComponent {\n${cardRender(view.label, view.background)}\n}\n`,\n })),\n ];\n}\n",
|
|
25
|
+
"import { randomUUID } from 'node:crypto';\nimport { existsSync, realpathSync, statSync } from 'node:fs';\nimport { rm } from 'node:fs/promises';\nimport {\n basename,\n dirname,\n extname,\n isAbsolute,\n relative,\n resolve,\n sep,\n} from 'node:path';\nimport { isEntryJavaScriptOutput, isStylesheetOutput } from './build-output';\nimport { emitComponentStyles, emitDocumentStyles } from './document-styles';\nimport { resolveConfig } from './config';\nimport { createProxyHandler } from './proxy';\nimport { assertSafeSubdirectory } from './safe-path';\nimport { createFileWatcher, type FileWatcher } from './watch';\nimport { buildWebBundle } from './web-bundle';\nimport {\n createWebComponentContext,\n type WebComponentContext,\n} from './components/web';\nimport type { ResolveConfigOptions, ResolvedConfig } from './types';\n\nconst DEVELOPMENT_URL_PREFIX = '/dev';\nconst INVALID_DEVELOPMENT_DIRECTORY_MESSAGE =\n 'Development output must be a subdirectory of the project root';\nconst LIVE_RELOAD_PATH = '/__transone/reload';\nconst DEVELOPMENT_OUTPUT_RETENTION_MS = 5_000;\nconst WATCHED_EXTENSIONS = new Set([\n '.ts',\n '.tsx',\n '.js',\n '.mjs',\n '.cjs',\n '.json',\n '.css',\n '.html',\n]);\nconst IGNORED_WATCH_SEGMENTS = new Set([\n 'dist',\n 'node_modules',\n '.git',\n '.worktrees',\n]);\nconst LIVE_RELOAD_CLIENT_SCRIPT = [\n '<script type=\"module\">',\n 'const transoneReloadSource=new EventSource(',\n JSON.stringify(LIVE_RELOAD_PATH),\n ');',\n 'transoneReloadSource.addEventListener(\"reload\",()=>location.reload());',\n '</script>',\n].join('');\n\ntype DevServer = ReturnType<typeof Bun.serve>;\n\nexport interface StartDevServerOptions extends ResolveConfigOptions {\n watch?: boolean;\n}\n\nexport async function startDevServer(\n options: StartDevServerOptions = {}\n): Promise<DevServer> {\n if (options.watch) {\n return startWatchingDevServer(options);\n }\n const instance = await createServerInstance(options, false);\n return createServerHandle(\n () => instance,\n () => undefined\n );\n}\n\nasync function startWatchingDevServer(\n options: StartDevServerOptions\n): Promise<DevServer> {\n let instance = await createServerInstance(options, true);\n let watcher = createProjectWatcher(instance, onChange);\n\n async function onChange(changedPath: string): Promise<void> {\n const configFile = instance.config.configFile;\n const configRelativePath =\n configFile === undefined\n ? undefined\n : toRelativePath(instance.config.root, configFile);\n if (configRelativePath === changedPath) {\n await restart();\n return;\n }\n await rebuildAndReload();\n }\n\n async function rebuildAndReload(): Promise<void> {\n const entries = [...new Set(Object.values(instance.config.pages))];\n instance.markDirty(entries);\n for (const entry of entries) {\n const bundle = await instance.getBundle(entry);\n if (bundle instanceof Response) {\n console.error(\n 'TransOne rebuild failed; keeping the last working page.'\n );\n return;\n }\n }\n instance.liveReload?.broadcast();\n }\n\n async function restart(): Promise<void> {\n watcher.dispose();\n await instance.server.stop(true);\n await instance.dispose();\n instance = await createServerInstance(options, true);\n watcher = createProjectWatcher(instance, onChange);\n console.log(\n `TransOne dev server restarted at http://${instance.server.hostname}:${instance.server.port}`\n );\n }\n\n return createServerHandle(\n () => instance,\n () => watcher.dispose()\n );\n}\n\nfunction createProjectWatcher(\n instance: DevServerInstance,\n onChange: (changedPath: string) => Promise<void>\n): FileWatcher {\n const root = realpathSync(instance.config.root);\n const watchers: FileWatcher[] = [];\n try {\n watchers.push(\n createFileWatcher({\n root,\n isRelevant: (relativePath) => isWatchedFile(instance, relativePath),\n onChange: (changedPath) => {\n void onChange(changedPath);\n },\n })\n );\n for (const group of externalComponentWatchRoots(instance.config, root)) {\n const excluded = (instance.config.components?.exclude ?? []).map(\n (pattern) => new Bun.Glob(pattern.split(sep).join('/'))\n );\n watchers.push(\n createFileWatcher({\n root: group.root,\n isRelevant: (relativePath) => {\n const path = resolve(group.root, relativePath);\n if (\n isWithinOrEqual(root, path) ||\n !['.ts', '.tsx'].includes(extname(path).toLowerCase()) ||\n path.endsWith('.d.ts')\n )\n return false;\n if (\n path\n .split(sep)\n .some((segment) => IGNORED_WATCH_SEGMENTS.has(segment))\n )\n return false;\n const portable = path.split(sep).join('/');\n const fromApp = toRelativePath(root, path);\n return (\n group.patterns.some((pattern) => pattern.match(portable)) &&\n !excluded.some(\n (pattern) => pattern.match(fromApp) || pattern.match(portable)\n )\n );\n },\n onChange: (changedPath) => {\n void onChange(\n toRelativePath(root, resolve(group.root, changedPath))\n );\n },\n })\n );\n }\n } catch (error) {\n watchers.forEach((watcher) => watcher.dispose());\n throw error;\n }\n return {\n dispose: () => {\n watchers\n .splice(0)\n .reverse()\n .forEach((watcher) => watcher.dispose());\n },\n };\n}\n\n/** Watch explicit sibling scan roots even before their first variant exists. */\nfunction externalComponentWatchRoots(\n config: ResolvedConfig,\n appRoot: string\n): { root: string; patterns: Bun.Glob[] }[] {\n const groups: { root: string; patterns: Bun.Glob[] }[] = [];\n for (const include of config.components?.include ?? []) {\n const absolute = resolve(config.root, include);\n const wildcard = absolute.search(/[*?\\[\\]{}]/);\n const prefix = wildcard < 0 ? absolute : absolute.slice(0, wildcard);\n const directoryPattern =\n wildcard < 0 &&\n ((existsSync(absolute) && statSync(absolute).isDirectory()) ||\n !extname(absolute));\n let directory =\n wildcard < 0\n ? directoryPattern\n ? absolute\n : dirname(absolute)\n : prefix.endsWith(sep)\n ? prefix\n : dirname(prefix);\n while (!existsSync(directory)) {\n const parent = dirname(directory);\n if (parent === directory) break;\n directory = parent;\n }\n if (!existsSync(directory) || !statSync(directory).isDirectory()) continue;\n const canonical = realpathSync(directory);\n if (isWithinOrEqual(appRoot, canonical)) continue;\n const patternPath = directoryPattern\n ? resolve(absolute, '**', '*')\n : absolute;\n const pattern = new Bun.Glob(\n resolve(canonical, relative(directory, patternPath)).split(sep).join('/')\n );\n const parent = groups.find((group) =>\n isWithinOrEqual(group.root, canonical)\n );\n if (parent) {\n parent.patterns.push(pattern);\n continue;\n }\n const nested = groups.filter((group) =>\n isWithinOrEqual(canonical, group.root)\n );\n for (const group of nested) groups.splice(groups.indexOf(group), 1);\n groups.push({\n root: canonical,\n patterns: [pattern, ...nested.flatMap((group) => group.patterns)],\n });\n }\n return groups;\n}\n\ninterface DevServerInstance {\n server: DevServer;\n config: ResolvedConfig;\n getBundle: (\n entry: string,\n acquire?: boolean\n ) => Promise<DevelopmentBundle | Response>;\n markDirty: (entries: string[]) => void;\n dispose: () => Promise<void>;\n liveReload: LiveReloadHub | undefined;\n}\n\nasync function createServerInstance(\n options: StartDevServerOptions,\n watch: boolean\n): Promise<DevServerInstance> {\n const config = await resolveConfig(options);\n if (config.target !== 'web') {\n throw new Error(\n 'Development server only supports Web targets: web, web-mobile, web-pc'\n );\n }\n // 动态加载:project.ts 依赖 'transone/dom'(框架 dist 的 DOM 渲染\n // 模块),仅在需要预渲染页面 HTML 时加载,避免 dev/build 其他路径被拖累。\n const { renderProjectHtml } = await import('./project');\n for (const [route, entry] of Object.entries(config.pages)) {\n await renderProjectHtml(config, {}, entry, route);\n }\n const developmentOutDir = resolve(config.root, 'dist', 'dev', 'h5');\n await assertSafeSubdirectory(\n config.root,\n developmentOutDir,\n INVALID_DEVELOPMENT_DIRECTORY_MESSAGE\n );\n const proxy = createProxyHandler(config.server.proxy);\n const sessionId = createGenerationId();\n const sessionOutDir = resolve(developmentOutDir, sessionId);\n const artifacts = new Map<string, DevelopmentOutput>();\n const buildProject = createDevelopmentBuilder(\n sessionId,\n sessionOutDir,\n artifacts,\n config\n );\n const liveReload = watch ? createLiveReloadHub() : undefined;\n const bundles = new Map<string, DevelopmentBundle>();\n const dirtyEntries = new Set<string>();\n\n const getBundle = async (\n entry: string,\n acquire = false\n ): Promise<DevelopmentBundle | Response> => {\n const cached = bundles.get(entry);\n if (watch && cached !== undefined && !dirtyEntries.has(entry)) {\n if (acquire) cached.activeRequests += 1;\n return cached;\n }\n const bundle = await buildProject.build(entry);\n if (bundle instanceof Response) {\n if (watch) {\n dirtyEntries.add(entry);\n }\n return bundle;\n }\n if (watch) {\n bundles.set(entry, bundle);\n dirtyEntries.delete(entry);\n }\n if (acquire) bundle.activeRequests += 1;\n return bundle;\n };\n\n const server = Bun.serve({\n hostname: config.server.host,\n port: config.server.port,\n fetch: async (request) => {\n const reloadResponse = liveReload?.handleRequest(request);\n if (reloadResponse) {\n return reloadResponse;\n }\n return (\n (await proxy(request)) ??\n serveProjectRequest(\n request,\n config,\n config.pages,\n getBundle,\n artifacts,\n liveReload\n )\n );\n },\n });\n\n return {\n server,\n config,\n getBundle,\n markDirty: (entries) => {\n entries.forEach((entry) => dirtyEntries.add(entry));\n },\n dispose: buildProject.dispose,\n liveReload,\n };\n}\n\nfunction createServerHandle(\n getInstance: () => DevServerInstance,\n disposeWatcher: () => void\n): DevServer {\n return new Proxy({} as DevServer, {\n get(_target, property) {\n if (property === 'stop') {\n return async (closeActiveConnections?: boolean) => {\n disposeWatcher();\n const instance = getInstance();\n await instance.server.stop(closeActiveConnections);\n await instance.dispose();\n };\n }\n const server = getInstance().server as unknown as Record<\n PropertyKey,\n unknown\n >;\n const value = server[property];\n return typeof value === 'function'\n ? (value as (...args: unknown[]) => unknown).bind(server)\n : value;\n },\n });\n}\n\nasync function serveProjectRequest(\n request: Request,\n config: ResolvedConfig,\n pages: Record<string, string>,\n getBundle: (\n entry: string,\n acquire?: boolean\n ) => Promise<DevelopmentBundle | Response>,\n artifacts: Map<string, DevelopmentOutput>,\n liveReload: LiveReloadHub | undefined\n): Promise<Response> {\n const pathname = new URL(request.url).pathname;\n const route = pageRouteForPathname(pages, pathname);\n\n if (route !== undefined) {\n const entry = pages[route];\n const bundle = await getBundle(entry, true);\n if (bundle instanceof Response) {\n return bundle;\n }\n\n try {\n const { renderProjectHtml } = await import('./project');\n const rendered = await renderProjectHtml(\n config,\n {\n head: bundle.stylesheets.map(({ pathname: href }) => ({\n tag: 'link',\n attributes: { rel: 'stylesheet', href },\n })),\n scripts: [{ type: 'module', src: bundle.entry.pathname }],\n },\n entry,\n route,\n bundle.components\n );\n const html = await emitDevelopmentDocumentStyles(rendered, bundle);\n publishDevelopmentBundle(bundle, artifacts);\n return new Response(liveReload ? injectLiveReloadScript(html) : html, {\n headers: {\n 'content-type': 'text/html; charset=utf-8',\n 'cache-control': 'no-store',\n },\n });\n } catch (error: unknown) {\n console.error(error);\n return buildFailureResponse();\n } finally {\n releaseDevelopmentBundle(bundle);\n }\n }\n\n if (pathname === '/bundle.js') {\n const bundle = await getBundle(config.entry, true);\n if (bundle instanceof Response) {\n return bundle;\n }\n\n try {\n publishDevelopmentBundle(bundle, artifacts);\n return new Response(null, {\n status: 307,\n headers: {\n location: bundle.entry.pathname,\n 'cache-control': 'no-store',\n },\n });\n } catch (error: unknown) {\n console.error(error);\n return buildFailureResponse();\n } finally {\n releaseDevelopmentBundle(bundle);\n }\n }\n\n const artifact = artifacts.get(pathname);\n if (artifact) {\n return new Response(Bun.file(artifact.filePath), {\n headers: {\n 'content-type': artifact.type,\n 'cache-control': 'no-store',\n },\n });\n }\n\n // SPA history fallback:H5 端使用 history 模式路由时,刷新/直达深层路径\n // (如 /rankings/metro)在服务端没有对应页面,回落到入口页由前端路由接管。\n // 排除 API 路径与带扩展名的静态资源请求。\n if (\n pathname !== '/' &&\n !pathname.startsWith('/api/') &&\n !/\\.[a-zA-Z0-9]+$/.test(pathname)\n ) {\n const bundle = await getBundle(config.entry, true);\n if (!(bundle instanceof Response)) {\n try {\n const { renderProjectHtml } = await import('./project');\n const rendered = await renderProjectHtml(\n config,\n {\n head: bundle.stylesheets.map(({ pathname: href }) => ({\n tag: 'link',\n attributes: { rel: 'stylesheet', href },\n })),\n scripts: [{ type: 'module', src: bundle.entry.pathname }],\n },\n config.entry,\n '/',\n bundle.components\n );\n const html = await emitDevelopmentDocumentStyles(rendered, bundle);\n publishDevelopmentBundle(bundle, artifacts);\n return new Response(liveReload ? injectLiveReloadScript(html) : html, {\n headers: {\n 'content-type': 'text/html; charset=utf-8',\n 'cache-control': 'no-store',\n },\n });\n } catch (error: unknown) {\n console.error(error);\n return buildFailureResponse();\n } finally {\n releaseDevelopmentBundle(bundle);\n }\n }\n }\n\n return new Response('Not found', {\n status: 404,\n headers: { 'cache-control': 'no-store' },\n });\n}\n\nfunction pageRouteForPathname(\n pages: Record<string, string>,\n pathname: string\n): string | undefined {\n if (pages[pathname] !== undefined) {\n return pathname;\n }\n if (pathname === '/index.html') {\n return '/';\n }\n const candidate =\n pathname.length > 1 && pathname.endsWith('/')\n ? pathname.replace(/\\/+$/, '')\n : pathname;\n if (pages[candidate] !== undefined) {\n return candidate;\n }\n if (candidate.endsWith('/index.html')) {\n const base = candidate.slice(0, candidate.length - '/index.html'.length);\n if (base === '') {\n return '/';\n }\n if (pages[base] !== undefined) {\n return base;\n }\n }\n return undefined;\n}\n\nfunction injectLiveReloadScript(html: string): string {\n if (html.includes(LIVE_RELOAD_PATH)) {\n return html;\n }\n if (html.includes('</body>')) {\n return html.replace('</body>', `${LIVE_RELOAD_CLIENT_SCRIPT}</body>`);\n }\n return html + LIVE_RELOAD_CLIENT_SCRIPT;\n}\n\ninterface LiveReloadHub {\n handleRequest(request: Request): Response | undefined;\n broadcast(): void;\n}\n\nconst reloadEncoder = new TextEncoder();\n\nfunction createLiveReloadHub(): LiveReloadHub {\n const controllers = new Set<ReadableStreamDefaultController<Uint8Array>>();\n\n function handleRequest(request: Request): Response | undefined {\n if (new URL(request.url).pathname !== LIVE_RELOAD_PATH) {\n return undefined;\n }\n\n let streamController:\n ReadableStreamDefaultController<Uint8Array> | undefined;\n const stream = new ReadableStream<Uint8Array>({\n start: (controller) => {\n streamController = controller;\n controllers.add(controller);\n try {\n controller.enqueue(reloadEncoder.encode(': connected\\n\\n'));\n } catch {\n controllers.delete(controller);\n }\n },\n cancel: () => {\n if (streamController) {\n controllers.delete(streamController);\n }\n },\n });\n\n return new Response(stream, {\n headers: {\n 'content-type': 'text/event-stream',\n 'cache-control': 'no-store',\n },\n });\n }\n\n function broadcast(): void {\n const message = reloadEncoder.encode('event: reload\\ndata: {}\\n\\n');\n for (const controller of [...controllers]) {\n try {\n controller.enqueue(message);\n } catch {\n controllers.delete(controller);\n }\n }\n }\n\n return { handleRequest, broadcast };\n}\n\nfunction isWatchedFile(\n instance: DevServerInstance,\n relativePath: string\n): boolean {\n if (relativePath === '' || relativePath.startsWith('..')) {\n return false;\n }\n const segments = relativePath.split('/');\n if (segments.some((segment) => IGNORED_WATCH_SEGMENTS.has(segment))) {\n return false;\n }\n const absolutePath = resolve(instance.config.root, relativePath);\n if (isWithinOrEqual(instance.config.build.outDir, absolutePath)) {\n return false;\n }\n const base = basename(absolutePath);\n if (base.startsWith('.') && absolutePath !== instance.config.configFile) {\n return false;\n }\n return WATCHED_EXTENSIONS.has(extname(base).toLowerCase());\n}\n\nfunction toRelativePath(root: string, absolutePath: string): string {\n return relative(root, absolutePath).split(sep).join('/');\n}\n\nfunction isWithinOrEqual(parent: string, candidate: string): boolean {\n const pathFromParent = relative(parent, candidate);\n return (\n pathFromParent === '' ||\n (pathFromParent !== '..' &&\n !pathFromParent.startsWith(`..${sep}`) &&\n !isAbsolute(pathFromParent))\n );\n}\n\ninterface DevelopmentOutput {\n filePath: string;\n pathname: string;\n type: string;\n}\n\ninterface DevelopmentBundle {\n components: WebComponentContext;\n outDir: string;\n generationUrl: string;\n activeRequests: number;\n retire?: () => void;\n entry: DevelopmentOutput;\n stylesheets: DevelopmentOutput[];\n componentStylesheets: DevelopmentOutput[];\n artifacts: Map<string, DevelopmentOutput>;\n}\n\nasync function emitDevelopmentDocumentStyles(\n rendered: string,\n bundle: DevelopmentBundle\n): Promise<string> {\n const generationUrl = bundle.generationUrl;\n const result = await emitDocumentStyles(\n rendered,\n bundle.outDir,\n (path) => `${generationUrl}/${basename(path)}`,\n bundle.stylesheets.map((stylesheet) => stylesheet.pathname),\n bundle.componentStylesheets.map((stylesheet) => stylesheet.pathname)\n );\n for (const path of result.assets) {\n const pathname = `${generationUrl}/${basename(path)}`;\n bundle.artifacts.set(pathname, {\n filePath: path,\n pathname,\n type: 'text/css; charset=utf-8',\n });\n }\n return result.html;\n}\n\nfunction createDevelopmentBuilder(\n sessionId: string,\n sessionOutDir: string,\n artifacts: Map<string, DevelopmentOutput>,\n config: ResolvedConfig\n): {\n build: (entry: string) => Promise<DevelopmentBundle | Response>;\n dispose: () => Promise<void>;\n} {\n let queue = Promise.resolve();\n let disposed = false;\n let disposal: Promise<void> | undefined;\n const latestBundles = new Map<string, DevelopmentBundle>();\n const retirementTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\n function retire(bundle: DevelopmentBundle): void {\n bundle.retire = () => {\n const previousTimer = retirementTimers.get(bundle.outDir);\n if (previousTimer) clearTimeout(previousTimer);\n retirementTimers.delete(bundle.outDir);\n if (disposed || bundle.activeRequests > 0) return;\n // Let the browser finish loading the HTML response's assets before\n // removing this generation, including when SSR took longer than usual.\n const timer = setTimeout(() => {\n retirementTimers.delete(bundle.outDir);\n void removeDevelopmentBundle(bundle, artifacts).catch(\n (error: unknown) => console.error(error)\n );\n }, DEVELOPMENT_OUTPUT_RETENTION_MS);\n timer.unref();\n retirementTimers.set(bundle.outDir, timer);\n };\n bundle.retire();\n }\n\n function build(entry: string): Promise<DevelopmentBundle | Response> {\n const result = queue.then(async () => {\n if (disposed) return buildFailureResponse();\n const bundle = await buildProjectBundle(\n entry,\n sessionId,\n sessionOutDir,\n config\n );\n if (!(bundle instanceof Response)) {\n const previous = latestBundles.get(entry);\n latestBundles.set(entry, bundle);\n if (previous) retire(previous);\n }\n return bundle;\n });\n queue = result.then(\n () => undefined,\n () => undefined\n );\n return result;\n }\n\n function dispose(): Promise<void> {\n if (disposal) return disposal;\n disposed = true;\n retirementTimers.forEach((timer) => clearTimeout(timer));\n retirementTimers.clear();\n disposal = queue.then(async () => {\n await rm(sessionOutDir, { recursive: true, force: true });\n latestBundles.clear();\n artifacts.clear();\n });\n return disposal;\n }\n\n return { build, dispose };\n}\n\nfunction releaseDevelopmentBundle(bundle: DevelopmentBundle): void {\n bundle.activeRequests -= 1;\n bundle.retire?.();\n}\n\nasync function removeDevelopmentBundle(\n bundle: DevelopmentBundle,\n artifacts: Map<string, DevelopmentOutput>\n): Promise<void> {\n await rm(bundle.outDir, { recursive: true, force: true });\n for (const pathname of bundle.artifacts.keys()) {\n artifacts.delete(pathname);\n }\n}\n\nasync function buildProjectBundle(\n entry: string,\n sessionId: string,\n sessionOutDir: string,\n config: ResolvedConfig\n): Promise<DevelopmentBundle | Response> {\n const generationId = createGenerationId();\n const generationOutDir = resolve(sessionOutDir, generationId);\n const generationUrl = `${DEVELOPMENT_URL_PREFIX}/${sessionId}/${generationId}`;\n const buildOptions = {\n entrypoints: [entry],\n outdir: generationOutDir,\n target: 'browser' as const,\n format: 'esm' as const,\n sourcemap: 'inline' as const,\n throw: false,\n publicPath: `${generationUrl}/`,\n naming: {\n entry: '[name]-[hash].[ext]',\n chunk: '[name]-[hash].[ext]',\n asset: 'assets/[name]-[hash].[ext]',\n },\n };\n\n let success = false;\n try {\n const components = createWebComponentContext(config, entry);\n const { result, styles } = await buildWebBundle(buildOptions, components);\n const entryArtifact = result.outputs.find(isEntryJavaScriptOutput);\n if (!result.success || !entryArtifact) {\n result.logs.forEach((log) => console.error(log));\n if (!entryArtifact) {\n console.error('Failed to build project bundle: no JavaScript output');\n }\n return buildFailureResponse();\n }\n\n const pendingArtifacts = new Map<string, DevelopmentOutput>();\n const outputs = new Map<\n (typeof result.outputs)[number],\n DevelopmentOutput\n >();\n\n for (const output of result.outputs) {\n const developmentOutput = createDevelopmentOutput(\n generationOutDir,\n generationUrl,\n output\n );\n if (pendingArtifacts.has(developmentOutput.pathname)) {\n throw new Error(\n `Development output URL collision: ${developmentOutput.pathname}`\n );\n }\n pendingArtifacts.set(developmentOutput.pathname, developmentOutput);\n outputs.set(output, developmentOutput);\n }\n\n const entryOutput = outputs.get(entryArtifact);\n if (!entryOutput) {\n throw new Error('Development entry output was not indexed');\n }\n\n const componentStylesheets = (\n await emitComponentStyles(styles, generationOutDir)\n ).map((filePath) => ({\n filePath,\n pathname: `${generationUrl}/${basename(filePath)}`,\n type: 'text/css; charset=utf-8',\n }));\n for (const output of componentStylesheets)\n pendingArtifacts.set(output.pathname, output);\n\n success = true;\n return {\n outDir: generationOutDir,\n components,\n generationUrl,\n activeRequests: 0,\n entry: entryOutput,\n componentStylesheets,\n stylesheets: result.outputs\n .filter(isStylesheetOutput)\n .map((output) => outputs.get(output))\n .filter((output): output is DevelopmentOutput => output !== undefined),\n artifacts: pendingArtifacts,\n };\n } catch (error: unknown) {\n console.error(error);\n return buildFailureResponse();\n } finally {\n if (!success) {\n await rm(generationOutDir, { recursive: true, force: true });\n }\n }\n}\n\nfunction publishDevelopmentBundle(\n bundle: DevelopmentBundle,\n artifacts: Map<string, DevelopmentOutput>\n): void {\n for (const [pathname, output] of bundle.artifacts) {\n const existing = artifacts.get(pathname);\n if (existing) {\n if (existing.filePath === output.filePath) {\n continue;\n }\n throw new Error(`Development output URL collision: ${pathname}`);\n }\n artifacts.set(pathname, output);\n }\n}\n\nfunction createDevelopmentOutput(\n generationOutDir: string,\n generationUrl: string,\n output: { path: string; type: string }\n): DevelopmentOutput {\n const filePath = resolve(output.path);\n const pathFromGeneration = relative(generationOutDir, filePath);\n if (\n pathFromGeneration === '' ||\n pathFromGeneration === '..' ||\n pathFromGeneration.startsWith(`..${sep}`) ||\n isAbsolute(pathFromGeneration)\n ) {\n throw new Error(\n `Development output must not escape outside its generation directory: ${output.path}`\n );\n }\n\n const urlPath = pathFromGeneration\n .split(sep)\n .map((segment) => encodeURIComponent(segment))\n .join('/');\n\n return {\n filePath,\n pathname: `${generationUrl}/${urlPath}`,\n type: output.type,\n };\n}\n\nfunction createGenerationId(): string {\n return randomUUID().replace(/-/g, '');\n}\n\nfunction buildFailureResponse(): Response {\n return new Response('Failed to build project bundle', {\n status: 500,\n headers: { 'cache-control': 'no-store' },\n });\n}\n",
|
|
26
|
+
"import type { ProxyOptions, ServerConfig } from './types';\n\nconst HOP_BY_HOP_HEADERS = new Set([\n 'connection',\n 'keep-alive',\n 'proxy-authenticate',\n 'proxy-authorization',\n 'te',\n 'trailer',\n 'transfer-encoding',\n 'upgrade',\n]);\n\ninterface ProxyRule {\n prefix: string;\n target: URL;\n changeOrigin: boolean;\n rewrite?: (path: string) => string;\n}\n\nexport function createProxyHandler(\n proxy: ServerConfig['proxy']\n): (request: Request) => Promise<Response | undefined> {\n const rules = Object.entries(proxy ?? {})\n .map(([prefix, options]) => toProxyRule(prefix, options))\n .sort((first, second) => second.prefix.length - first.prefix.length);\n\n return async (request) => {\n const sourceUrl = new URL(request.url);\n const rule = rules.find(({ prefix }) =>\n sourceUrl.pathname.startsWith(prefix)\n );\n\n if (!rule) {\n return undefined;\n }\n\n const target = createTargetUrl(rule, sourceUrl);\n const headers = createRequestHeaders(request, sourceUrl, rule, target);\n const body =\n request.method === 'GET' || request.method === 'HEAD'\n ? undefined\n : request.body;\n\n try {\n const upstream = await fetch(target, {\n method: request.method,\n headers,\n body,\n signal: request.signal,\n redirect: 'manual',\n });\n\n return new Response(upstream.body, {\n status: upstream.status,\n statusText: upstream.statusText,\n headers: filterHeaders(upstream.headers),\n });\n } catch {\n return new Response('Bad Gateway', { status: 502 });\n }\n };\n}\n\nfunction toProxyRule(prefix: string, value: string | ProxyOptions): ProxyRule {\n const options = typeof value === 'string' ? { target: value } : value;\n\n return {\n prefix,\n target: new URL(options.target),\n changeOrigin: options.changeOrigin ?? false,\n ...(options.rewrite === undefined ? {} : { rewrite: options.rewrite }),\n };\n}\n\nfunction createTargetUrl(rule: ProxyRule, sourceUrl: URL): URL {\n const target = new URL(rule.target);\n const pathname = rule.rewrite?.(sourceUrl.pathname) ?? sourceUrl.pathname;\n\n target.pathname = joinPathnames(target.pathname, pathname);\n target.search = sourceUrl.search;\n return target;\n}\n\nfunction joinPathnames(basePathname: string, pathname: string): string {\n const base = basePathname === '/' ? '' : basePathname.replace(/\\/+$/, '');\n const path = pathname.startsWith('/') ? pathname : `/${pathname}`;\n\n return `${base}${path}` || '/';\n}\n\nfunction createRequestHeaders(\n request: Request,\n sourceUrl: URL,\n rule: ProxyRule,\n target: URL\n): Headers {\n const headers = filterHeaders(request.headers);\n const incomingHost = request.headers.get('host') ?? sourceUrl.host;\n\n headers.set('host', rule.changeOrigin ? target.host : incomingHost);\n return headers;\n}\n\nfunction filterHeaders(source: Headers): Headers {\n const headers = new Headers(source);\n const connection = headers.get('connection');\n\n if (connection) {\n connection.split(',').forEach((header) => {\n const name = header.trim();\n if (name) {\n headers.delete(name);\n }\n });\n }\n\n HOP_BY_HOP_HEADERS.forEach((header) => headers.delete(header));\n return headers;\n}\n",
|
|
27
|
+
"import { watch, type FSWatcher } from 'node:fs';\nimport { readdir, stat } from 'node:fs/promises';\nimport { isAbsolute, join, relative } from 'node:path';\n\nconst RECURSIVE_WATCH_UNSUPPORTED_ERROR = 'ERR_FEATURE_UNAVAILABLE_ON_PLATFORM';\nconst DEFAULT_DEBOUNCE_MS = 100;\nconst DEFAULT_POLL_INTERVAL_MS = 300;\n\nexport interface FileWatcherOptions {\n root: string;\n isRelevant: (relativePath: string) => boolean;\n onChange: (changedPath: string) => void;\n debounceMs?: number;\n pollIntervalMs?: number;\n}\n\nexport interface FileWatcher {\n dispose: () => void;\n}\n\nexport function createFileWatcher(options: FileWatcherOptions): FileWatcher {\n const debounceMs = options.debounceMs ?? DEFAULT_DEBOUNCE_MS;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const disposers: Array<() => void> = [];\n\n const scheduleChange = (relativePath: string): void => {\n if (timer) {\n clearTimeout(timer);\n }\n timer = setTimeout(() => {\n timer = undefined;\n options.onChange(relativePath);\n }, debounceMs);\n };\n\n disposers.push(() => {\n if (timer) {\n clearTimeout(timer);\n }\n });\n\n const nativeWatcher = tryCreateNativeWatcher(\n options.root,\n options.isRelevant,\n scheduleChange\n );\n if (nativeWatcher) {\n disposers.push(nativeWatcher);\n } else {\n disposers.push(\n createPollingWatcher(\n options.root,\n options.isRelevant,\n options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS,\n scheduleChange\n )\n );\n }\n\n return {\n dispose: () => {\n disposers.splice(0).reverse().forEach((dispose) => dispose());\n },\n };\n}\n\nfunction tryCreateNativeWatcher(\n root: string,\n isRelevant: (relativePath: string) => boolean,\n onRelevantChange: (relativePath: string) => void\n): (() => void) | undefined {\n let watcher: FSWatcher;\n try {\n watcher = watch(root, { recursive: true }, (_event, filename) => {\n if (typeof filename !== 'string') {\n return;\n }\n const relativePath = toRelativePath(root, filename);\n if (relativePath === undefined || !isRelevant(relativePath)) {\n return;\n }\n onRelevantChange(relativePath);\n });\n } catch (error: unknown) {\n if (isRecursiveWatchUnsupported(error)) {\n return undefined;\n }\n throw error;\n }\n\n return () => watcher.close();\n}\n\nfunction createPollingWatcher(\n root: string,\n isRelevant: (relativePath: string) => boolean,\n intervalMs: number,\n onRelevantChange: (relativePath: string) => void\n): () => void {\n let running = true;\n let snapshot = new Map<string, FileSnapshot>();\n let timer: ReturnType<typeof setInterval> | undefined;\n\n const scan = async (): Promise<void> => {\n if (!running) {\n return;\n }\n const next = new Map<string, FileSnapshot>();\n try {\n await collectRelevantFiles(root, isRelevant, next);\n } catch {\n return;\n }\n\n let changedPath: string | undefined;\n for (const [relativePath, snapshotEntry] of next) {\n const previous = snapshot.get(relativePath);\n if (\n !previous ||\n previous.mtimeMs !== snapshotEntry.mtimeMs ||\n previous.size !== snapshotEntry.size\n ) {\n changedPath = relativePath;\n break;\n }\n }\n if (changedPath === undefined) {\n for (const relativePath of snapshot.keys()) {\n if (!next.has(relativePath)) {\n changedPath = relativePath;\n break;\n }\n }\n }\n snapshot = next;\n if (changedPath !== undefined) {\n onRelevantChange(changedPath);\n }\n };\n\n void scan();\n timer = setInterval(() => {\n void scan();\n }, intervalMs);\n if (typeof timer.unref === 'function') {\n timer.unref();\n }\n\n return () => {\n running = false;\n if (timer) {\n clearInterval(timer);\n }\n };\n}\n\ninterface FileSnapshot {\n mtimeMs: number;\n size: number;\n}\n\nasync function collectRelevantFiles(\n root: string,\n isRelevant: (relativePath: string) => boolean,\n output: Map<string, FileSnapshot>\n): Promise<void> {\n const pendingDirectories = [''];\n while (pendingDirectories.length > 0) {\n const relativeDirectory = pendingDirectories.pop();\n if (relativeDirectory === undefined) {\n break;\n }\n const absoluteDirectory = join(root, relativeDirectory);\n let entries;\n try {\n entries = await readdir(absoluteDirectory, { withFileTypes: true });\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n const relativePath =\n relativeDirectory === '' ? entry.name : `${relativeDirectory}/${entry.name}`;\n if (entry.isDirectory()) {\n pendingDirectories.push(relativePath);\n continue;\n }\n if (!entry.isFile() || !isRelevant(relativePath)) {\n continue;\n }\n try {\n const info = await stat(join(root, relativePath));\n output.set(relativePath, { mtimeMs: info.mtimeMs, size: info.size });\n } catch {\n // The file vanished while the tree was being scanned.\n }\n }\n }\n}\n\nfunction toRelativePath(root: string, filename: string): string | undefined {\n const relativePath = isAbsolute(filename)\n ? relative(root, filename)\n : filename.split('\\\\').join('/');\n if (relativePath === '' || relativePath === '..' || relativePath.startsWith('../')) {\n return undefined;\n }\n return relativePath.split('\\\\').join('/');\n}\n\nfunction isRecursiveWatchUnsupported(error: unknown): boolean {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'code' in error &&\n error.code === RECURSIVE_WATCH_UNSUPPORTED_ERROR\n );\n}\n"
|
|
28
|
+
],
|
|
29
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAeO,IAAM,eAAyC;AAAA,EACpD,GAAG,IAAI,IAAI,qBAAqB,IAAI,CAAC,eAAe,WAAW,MAAM,CAAC;AACxE;AAIO,SAAS,YAAY,CAAC,OAAqC;AAAA,EAChE,OACE,OAAO,UAAU,YAChB,aAAmC,SAAS,KAAK;AAAA;AAM/C,IAAM,kBAA2C,aAAa,OACnE,CAAC,WAAmC,OAAO,WAAW,KAAK,CAC7D;AAIO,IAAM,mBAA6C,aAAa,OACrE,CAAC,WAAoC,OAAO,WAAW,MAAM,CAC/D;AAEO,SAAS,eAAe,CAAC,OAAwC;AAAA,EACtE,OACE,OAAO,UAAU,YAChB,iBAAuC,SAAS,KAAK;AAAA;AAInD,SAAS,cAAc,CAAC,OAAuC;AAAA,EACpE,OACE,OAAO,UAAU,YAChB,gBAAsC,SAAS,KAAK;AAAA;;;AC3CzD;AACA;AAkDA,IAAM,iBAA+B;AAAA,EACnC,OAAO;AAAA,EACP,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO,CAAC;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,gBAAgB;AAAA,EAClB;AACF;AAEO,SAAS,YAAY,CAAC,QAAgC;AAAA,EAC3D,OAAO;AAAA;AAGT,eAAsB,aAAa,CACjC,UAAgC,CAAC,GACR;AAAA,EACzB,MAAM,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,IAAI,CAAC;AAAA,EAClD,MAAM,aAAa,QAAQ,MAAM,oBAAoB;AAAA,EACrD,MAAM,kBAAkB,QAAQ,WAAW;AAAA,EAC3C,MAAM,eAAqC,kBACvC,EAAE,QAAQ,MAAM,IAChB,MAAM,eAAe,UAAU;AAAA,EACnC,IAAI,aAAyB,CAAC;AAAA,EAC9B,IAAI,aAAa,QAAQ;AAAA,IACvB,MAAM,UAAS,aAAa;AAAA,IAC5B,mBAAmB,OAAM;AAAA,IACzB,aAAa;AAAA,EACf;AAAA,EACA,IAAI,iBAAiB;AAAA,IACnB,mBAAmB,QAAQ,MAAM;AAAA,EACnC;AAAA,EACA,MAAM,kBAAkB,kBAAkB,OAAO;AAAA,EACjD,mBAAmB,eAAe;AAAA,EAClC,MAAM,SAAS,YAAY,YAAY,QAAQ,UAAU,CAAC,GAAG,eAAe;AAAA,EAE5E,MAAM,QAAQ,QAAQ,MAAM,OAAO,KAAK;AAAA,EACxC,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC,OAAO,SAAS;AAAA,IACzC,MAAM,IAAI,MAAM,8BAA8B,OAAO;AAAA,EACvD;AAAA,EACA,MAAM,QAAQ,MAAM,aAAa,MAAM,OAAO,OAAO,KAAK;AAAA,EAC1D,MAAM,WAAW,gBAAgB,QAAQ,UAAU,OAAO,MAAM;AAAA,EAChE,MAAM,SAAS,sBAAsB,QAAQ,EAAE;AAAA,EAC/C,MAAM,iBACJ,QAAQ,UAAU,QAAQ,QAAQ,OAAO,UAAU,WAAW,OAAO;AAAA,EACvE,MAAM,YACJ,mBACC,6CAAmC,oCAChC,cAAc,aACd,OAAO,MAAM;AAAA,EAEnB,MAAM,WAAW,aAAa,OAAO,IAAI,MAAM;AAAA,EAC/C,MAAM,UAAU,UAAU,QACtB,MAAM,aAAa,MAAM,OAAO,SAAS,OAAO;AAAA,IAC9C,cAAc;AAAA,IACd,WAAW;AAAA,EACb,CAAC,IACD;AAAA,EAEJ,MAAM,YAAY,OAAO,OAAO,aAAa,eAAe,MAAM;AAAA,EAClE,MAAM,YAAY,cAAc,OAAO,KAAK,MAAM;AAAA,EAElD,OAAO;AAAA,IACL;AAAA,OACI,aAAa,SAAS,EAAE,WAAW,IAAI,CAAC;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,OACI,OAAO,aAAa,EAAE,YAAY,OAAO,WAAW,IAAI,CAAC;AAAA,IAC7D,QAAQ;AAAA,MACN,MAAM,OAAO,OAAO;AAAA,MACpB,MAAM,OAAO,OAAO;AAAA,MACpB,OAAO,OAAO,OAAO;AAAA,IACvB;AAAA,IACA,OAAO;AAAA,MACL,QAAQ,QAAQ,MAAM,SAAS;AAAA,MAC/B,UAAU,kBAAkB,OAAO,MAAM,QAAQ;AAAA,MACjD,gBAAgB,OAAO,MAAM;AAAA,IAC/B;AAAA,OACI,OAAO,UACP,EAAE,SAAS,eAAe,MAAM,OAAO,OAAO,EAAE,IAChD,CAAC;AAAA,OACD,YACA;AAAA,MACE,IAAI,mBACF,MACA,QAAQ,YAAY,QAAQ,QAC5B,YAAY,CAAC,GACb,SACA,MACF;AAAA,IACF,IACA,CAAC;AAAA,OACD,gBAAgB,MAAM,IACtB;AAAA,MACE,KAAK,MAAM,WACT,MACA,QAAQ,QACR,aAAa,CAAC,GACd,QACA,KACF;AAAA,IACF,IACA,CAAC;AAAA,EACP;AAAA;AAGF,SAAS,cAAc,CAAC,OAAuC;AAAA,EAC7D,OACE,SAAS,KAAK,KAAK,iBAAiB,KAAK,CAAC,cAAa,YAAY,MAAK;AAAA;AAI5E,SAAS,aAAa,CACpB,KACA,QACuB;AAAA,EACvB,IAAI,QAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AAAA,EACA,IAAI,eAAe,GAAG,GAAG;AAAA,IACvB,OAAO;AAAA,SACD,IAAI,SAAS,YAAY,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;AAAA,SAC/C,gBAAgB,MAAM,IAAI,IAAI,UAAU,CAAC;AAAA,IAC/C;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAGT,eAAe,UAAU,CACvB,MACA,gBACA,KACA,QACA,eAC4B;AAAA,EAC5B,OAAO;AAAA,OACD,IAAI,SAAS,YAAY,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;AAAA,IACnD,SAAS,IAAI,WAAW;AAAA,IACxB,UAAU,IAAI,YAAY;AAAA,IAC1B,QAAQ,QACN,MACA,kBAAkB,IAAI,UAAU,cAAc,QAChD;AAAA,IACA,oBAAoB,IAAI,sBAAsB;AAAA,IAC9C,WAAW,QAAQ,MAAM,IAAI,aAAa,QAAQ;AAAA,IAClD,OAAO,IAAI,QACP,MAAM,aACJ,MACA,QAAQ,MAAM,IAAI,MAAM,QAAQ,aAAa,GAC7C,IAAI,OACJ;AAAA,MACE,cAAc;AAAA,MACd,WAAW;AAAA,IACb,CACF,IACA;AAAA,EACN;AAAA;AAGF,IAAM,sBAA8C;AAAA,EAClD,aAAa;AAAA,EACb,aAAa;AAAA,EACb,gBAAgB;AAAA,EAChB,kBAAkB;AACpB;AAGA,SAAS,YAAY,CACnB,IACA,QAC+B;AAAA,EAC/B,IAAI,OAAO,WAAW;AAAA,IACpB;AAAA,EACF;AAAA,EACA,MAAM,SAAS,OAAO,YACpB,OAAO,QAAQ,EAAE,EAAE,OACjB,EAAE,SACA,CAAC,gBAAgB,SAAS,GAAuC,CACrE,CACF;AAAA,EACA,MAAM,WAAW,eAAe,MAAM,IAAI,GAAG,UAAU;AAAA,EACvD,OAAO,eAAe,QAAQ,KAAK,SAAS,CAAC;AAAA;AAG/C,SAAS,cAAc,CACrB,QACA,WACyB;AAAA,EACzB,MAAM,SAAS,KAAK,OAAO;AAAA,EAC3B,YAAY,KAAK,UAAU,OAAO,QAAQ,SAAS,GAAG;AAAA,IACpD,IAAI,UAAU;AAAA,MAAW;AAAA,IACzB,MAAM,WAAW,OAAO,UAAU,eAAe,KAAK,QAAQ,GAAG,IAC7D,OAAO,OACP;AAAA,IACJ,MAAM,OACJ,SAAS,QAAQ,KAAK,SAAS,KAAK,IAChC,eAAe,UAAU,KAAK,IAC9B;AAAA,IACN,OAAO,eAAe,QAAQ,KAAK;AAAA,MACjC,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,kBAAkB,CACzB,MACA,gBACA,IACA,OACA,QAC2B;AAAA,EAC3B,OAAO;AAAA,OACD,GAAG,SAAS,YAAY,EAAE,MAAM,GAAG,KAAK,IAAI,CAAC;AAAA,IACjD,OAAO,GAAG,SAAS;AAAA,IACnB,QAAQ,QACN,MACA,kBACE,GAAG,UACH,oBAAoB,WACpB,sBACJ;AAAA,IACA,wBAAwB,GAAG,0BAA0B;AAAA,IACrD;AAAA,OACI,GAAG,WAAW,YAAY,EAAE,QAAQ,GAAG,OAAO,IAAI,CAAC;AAAA,OACnD,GAAG,WAAW,YAAY,EAAE,QAAQ,GAAG,OAAO,IAAI,CAAC;AAAA,OACnD,GAAG,aAAa,YAAY,EAAE,UAAU,GAAG,SAAS,IAAI,CAAC;AAAA,OACzD,GAAG,cAAc,YAAY,EAAE,WAAW,GAAG,UAAU,IAAI,CAAC;AAAA,IAChE,YAAY,GAAG,cAAc;AAAA,IAC7B,WAAW,QAAQ,MAAM,GAAG,aAAa,QAAQ;AAAA,OAC7C,GAAG,eAAe,YAAY,EAAE,YAAY,GAAG,WAAW,IAAI,CAAC;AAAA,EACrE;AAAA;AAGF,SAAS,cAAc,CACrB,MACA,SACuB;AAAA,EACvB,OAAO;AAAA,IACL,OAAO,QAAQ,MAAM,QAAQ,SAAS,cAAc;AAAA,IACpD,QAAQ,QAAQ,MAAM,QAAQ,UAAU,MAAM;AAAA,IAC9C,UAAU,QAAQ,YAAY,CAAC;AAAA,IAC/B,YAAY,QAAQ,aAAa,CAAC,qBAAqB,GAAG,IAAI,CAAC,SAC7D,QAAQ,MAAM,IAAI,CACpB;AAAA,IACA,KAAK,QAAQ,OAAO;AAAA,IACpB,WAAW,QAAQ,aAAa;AAAA,IAChC,WAAW,QAAQ,aAAa;AAAA,IAChC,QAAQ,QAAQ;AAAA,EAClB;AAAA;AAGF,SAAS,iBAAiB,CAAC,MAAkC;AAAA,EAC3D,MAAM,WAAW,QAAQ,IAAI,KAAK;AAAA,EAClC,IAAI,CAAC,WAAW,YAAY,KAAK;AAAA,IAC/B,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,QAAQ,WAAW,GAAG,IAAI,UAAU,IAAI;AAAA,EAC5D,OAAO,YAAY,SAAS,GAAG,IAAI,YAAY,MAAM,GAAG,EAAE,IAAI;AAAA;AAGhE,SAAS,eAAe,CAAC,QAA2B;AAAA,EAClD,MAAM,WAAW,kBAAkB,yBAAsB;AAAA,EACzD,IAAI,aAAa;AAAA,IAAW,OAAO;AAAA,EACnC,MAAM,IAAI,MACR,yBAAyB,OAAO,MAAM,SACpC,sBAAsB,qBAAqB,IAAI,CAAC,eAAe,WAAW,QAAQ,EAAE,KAAK,IAAI,IACjG;AAAA;AAGF,eAAe,YAAY,CACzB,MACA,OACA,OACA,UAA2D,CAAC,GAC3B;AAAA,EACjC,MAAM,WACJ,QAAQ,iBAAiB,QAAQ,CAAC,IAAI,EAAE,KAAK,MAAM;AAAA,EACrD,YAAY,OAAO,cAAc,OAAO,QAAQ,SAAS,CAAC,CAAC,GAAG;AAAA,IAC5D,MAAM,aAAa,mBAAmB,OAAO,QAAQ,SAAS;AAAA,IAC9D,MAAM,WAAW,QAAQ,MAAM,SAAS;AAAA,IACxC,IAAI,CAAC,WAAW,QAAQ,GAAG;AAAA,MACzB,MAAM,IAAI,MACR,uCAAuC,gBAAgB,UACzD;AAAA,IACF;AAAA,IACA,SAAS,cAAc;AAAA,EACzB;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,kBAAkB,CAAC,OAAe,YAAY,OAAe;AAAA,EACpE,IAAI,UAAU,KAAK;AAAA,IACjB,IAAI,WAAW;AAAA,MACb,OAAO;AAAA,IACT;AAAA,IACA,MAAM,IAAI,MACR,4EACF;AAAA,EACF;AAAA,EACA,MAAM,aAAa,MAAM,QAAQ,QAAQ,EAAE;AAAA,EAC3C,IAAI,eAAe,IAAI;AAAA,IACrB,MAAM,IAAI,MAAM,iCAAiC,OAAO;AAAA,EAC1D;AAAA,EACA,OAAO;AAAA;AAGT,IAAI,qBAAqB;AAEzB,eAAe,cAAc,CAC3B,YAC+B;AAAA,EAC/B,IAAI,CAAC,WAAW,UAAU,GAAG;AAAA,IAC3B,OAAO,EAAE,QAAQ,MAAM;AAAA,EACzB;AAAA,EAEA,sBAAsB;AAAA,EACtB,MAAM,SAAS,MACb,UAAG,8BAA8B;AAAA,EAEnC,OAAO,EAAE,QAAQ,MAAM,QAAQ,OAAO,QAAQ;AAAA;AAGhD,SAAS,iBAAiB,CAAC,SAA2C;AAAA,EACpE,MAAM,SAAuB,CAAC;AAAA,EAC9B,MAAM,QAAqB,CAAC;AAAA,EAE5B,IAAI,QAAQ,SAAS,WAAW;AAAA,IAC9B,OAAO,OAAO,QAAQ;AAAA,EACxB;AAAA,EACA,IAAI,QAAQ,SAAS,WAAW;AAAA,IAC9B,OAAO,OAAO,QAAQ;AAAA,EACxB;AAAA,EACA,IAAI,QAAQ,WAAW,WAAW;AAAA,IAChC,MAAM,SAAS,QAAQ;AAAA,EACzB;AAAA,EACA,IAAI,QAAQ,SAAS,WAAW;AAAA,IAC9B,MAAM,WAAW,QAAQ;AAAA,EAC3B;AAAA,EAEA,OAAO;AAAA,OACD,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,EAAE,OAAO,IAAI,CAAC;AAAA,OAC/C,OAAO,KAAK,KAAK,EAAE,SAAS,IAAI,EAAE,MAAM,IAAI,CAAC;AAAA,EACnD;AAAA;AAGF,SAAS,WAAW,IAAI,SAAqC;AAAA,EAC3D,OAAO,QAAQ,OAAqB,CAAC,QAAQ,WAAW;AAAA,IACtD,MAAM,SAAS,OAAO;AAAA,IACtB,MAAM,QAAQ,OAAO;AAAA,IAErB,OAAO;AAAA,MACL,QAAQ,OAAO,UAAU,OAAO;AAAA,MAChC,YAAY,OAAO,aACf,KAAK,OAAO,eAAe,OAAO,WAAW,IAC7C,OAAO;AAAA,MACX,OAAO,OAAO,SAAS,OAAO;AAAA,MAC9B,OAAO,OAAO,SAAS,OAAO;AAAA,MAC9B,QAAQ;AAAA,QACN,MAAM,QAAQ,QAAQ,OAAO,OAAO;AAAA,QACpC,MAAM,QAAQ,QAAQ,OAAO,OAAO;AAAA,QACpC,OAAO;AAAA,aACF,OAAO,OAAO;AAAA,aACd,QAAQ;AAAA,QACb;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,QAAQ,OAAO,UAAU,OAAO,MAAM;AAAA,QACtC,UAAU,OAAO,YAAY,OAAO,MAAM;AAAA,QAC1C,gBAAgB,OAAO,kBAAkB,OAAO,MAAM;AAAA,MACxD;AAAA,MACA,SAAS,OAAO,WAAW,OAAO;AAAA,MAClC,IAAI,OAAO,MAAM,OAAO;AAAA,MACxB,KAAK,OAAO,OAAO,OAAO;AAAA,IAC5B;AAAA,KACC,cAAc;AAAA;AAGnB,SAAS,kBAAkB,CAAC,QAA+C;AAAA,EACzE,aAAa,QAAQ,QAAQ;AAAA,EAE7B,IACE,OAAO,WAAW,aAClB,kBAAkB,OAAO,MAAM,MAAM,WACrC;AAAA,IACA,MAAM,IAAI,MAAM,6BAA6B,OAAO,OAAO,MAAM,GAAG;AAAA,EACtE;AAAA,EACA,IAAI,OAAO,eAAe,WAAW;AAAA,IACnC,aAAa,OAAO,YAAY,mBAAmB;AAAA,IACnD,WAAW,OAAO,CAAC,WAAW,SAAS,GAAY;AAAA,MACjD,IAAI,OAAO,WAAW,SAAS;AAAA,QAC7B,kBAAkB,OAAO,WAAW,MAAM,qBAAqB,KAAK;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,IAAI,OAAO,UAAU,aAAa,OAAO,OAAO,UAAU,UAAU;AAAA,IAClE,MAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AAAA,EACA,IAAI,OAAO,UAAU,WAAW;AAAA,IAC9B,oBAAoB,OAAO,KAAK;AAAA,EAClC;AAAA,EACA,IAAI,OAAO,WAAW,WAAW;AAAA,IAC/B,qBAAqB,OAAO,MAAM;AAAA,EACpC;AAAA,EACA,IAAI,OAAO,UAAU,WAAW;AAAA,IAC9B,oBAAoB,OAAO,KAAK;AAAA,EAClC;AAAA,EACA,IAAI,OAAO,YAAY,WAAW;AAAA,IAChC,sBAAsB,OAAO,OAAO;AAAA,EACtC;AAAA,EACA,IAAI,OAAO,OAAO,WAAW;AAAA,IAC3B,iBAAiB,OAAO,EAAE;AAAA,EAC5B;AAAA,EACA,IAAI,OAAO,QAAQ,WAAW;AAAA,IAC5B,kBAAkB,OAAO,GAAG;AAAA,EAC9B;AAAA;AAGF,SAAS,iBAAiB,CAAC,KAA4C;AAAA,EACrE,aAAa,KAAK,YAAY;AAAA,EAC9B,gBAAgB,IAAI,MAAM,iBAAiB;AAAA,EAC3C,IAAI,eAAe,GAAG,GAAG;AAAA,IACvB,MAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,SAAS,KAAK,CAAC,SAAQ,OAAO,IAAG,GAAG;AAAA,MACtC,MAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AAAA,IACA,WAAW,YAAY,kBAAkB;AAAA,MACvC,IAAI,IAAI,cAAc,WAAW;AAAA,QAC/B,wBAAwB,IAAI,WAAW,cAAc,UAAU;AAAA,MACjE;AAAA,IACF;AAAA,IACA;AAAA,EACF;AAAA,EACA,wBAAwB,KAAK,YAAY;AAAA;AAG3C,SAAS,uBAAuB,CAC9B,KACA,OAC0B;AAAA,EAC1B,aAAa,KAAK,KAAK;AAAA,EACvB,gBAAgB,IAAI,MAAM,GAAG,YAAY;AAAA,EACzC,WAAW,OAAO;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAY;AAAA,IACV,IAAI,IAAI,SAAS,aAAa,OAAO,IAAI,SAAS,UAAU;AAAA,MAC1D,MAAM,IAAI,MAAM,GAAG,SAAS,sBAAsB;AAAA,IACpD;AAAA,EACF;AAAA,EACA,IAAI,IAAI,UAAU,WAAW;AAAA,IAC3B,oBAAoB,IAAI,OAAO,GAAG,aAAa;AAAA,EACjD;AAAA;AAIF,SAAS,gBAAgB,CAAC,IAAkD;AAAA,EAC1E,aAAa,IAAI,WAAW;AAAA,EAC5B,0BAA0B,IAAI,WAAW;AAAA,EACzC,WAAW,YAAY,iBAAiB;AAAA,IACtC,IAAI,GAAG,cAAc,WAAW;AAAA,MAC9B,0BAA0B,GAAG,WAAW,aAAa,UAAU;AAAA,IACjE;AAAA,EACF;AAAA;AAGF,SAAS,yBAAyB,CAChC,IACA,OACiC;AAAA,EACjC,aAAa,IAAI,KAAK;AAAA,EACtB,gBAAgB,GAAG,MAAM,GAAG,YAAY;AAAA,EAExC,WAAW,OAAO;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAY;AAAA,IACV,IAAI,GAAG,SAAS,aAAa,OAAO,GAAG,SAAS,UAAU;AAAA,MACxD,MAAM,IAAI,MAAM,GAAG,SAAS,sBAAsB;AAAA,IACpD;AAAA,EACF;AAAA,EACA,IAAI,GAAG,UAAU,WAAW;AAAA,IAC1B,oBAAoB,GAAG,OAAO,GAAG,aAAa;AAAA,EAChD;AAAA,EACA,WAAW,OAAO,CAAC,UAAU,UAAU,YAAY,YAAY,GAAY;AAAA,IACzE,IAAI,GAAG,SAAS,WAAW;AAAA,MACzB,aAAa,GAAG,MAAM,GAAG,SAAS,KAAK;AAAA,IACzC;AAAA,EACF;AAAA,EACA,IAAI,GAAG,cAAc,WAAW;AAAA,IAC9B,aAAa,GAAG,WAAW,GAAG,iBAAiB;AAAA,IAC/C,YAAY,OAAO,UAAU,OAAO,QAAQ,GAAG,SAAS,GAAG;AAAA,MACzD,aAAa,OAAO,GAAG,mBAAmB,OAAO;AAAA,IACnD;AAAA,EACF;AAAA,EACA,IACE,GAAG,eAAe,aAClB,GAAG,eAAe,QAClB,GAAG,eAAe,OAClB;AAAA,IACA,MAAM,IAAI,MAAM,GAAG,wCAAwC;AAAA,EAC7D;AAAA;AAGF,SAAS,qBAAqB,CAC5B,SACkC;AAAA,EAClC,aAAa,SAAS,gBAAgB;AAAA,EACtC,IAAI,QAAQ,UAAU,aAAa,OAAO,QAAQ,UAAU,UAAU;AAAA,IACpE,MAAM,IAAI,MAAM,uCAAuC;AAAA,EACzD;AAAA,EACA,IAAI,QAAQ,WAAW,aAAa,OAAO,QAAQ,WAAW,UAAU;AAAA,IACtE,MAAM,IAAI,MAAM,wCAAwC;AAAA,EAC1D;AAAA,EACA,IAAI,QAAQ,aAAa,WAAW;AAAA,IAClC,kBAAkB,QAAQ,UAAU,yBAAyB;AAAA,EAC/D;AAAA,EACA,IAAI,QAAQ,cAAc,WAAW;AAAA,IACnC,kBAAkB,QAAQ,WAAW,0BAA0B;AAAA,EACjE;AAAA,EACA,WAAW,OAAO,CAAC,OAAO,aAAa,aAAa,QAAQ,GAAY;AAAA,IACtE,IAAI,QAAQ,SAAS,aAAa,OAAO,QAAQ,SAAS,WAAW;AAAA,MACnE,MAAM,IAAI,MAAM,kBAAkB,uBAAuB;AAAA,IAC3D;AAAA,EACF;AAAA;AAGF,SAAS,iBAAiB,CAAC,OAAgB,MAAoB;AAAA,EAC7D,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,KAAK,CAAC,SAAS,OAAO,SAAS,QAAQ,GAAG;AAAA,IAC3E,MAAM,IAAI,MAAM,GAAG,kCAAkC;AAAA,EACvD;AAAA;AAGF,SAAS,mBAAmB,CAC1B,OACA,QAAQ,gBACiC;AAAA,EACzC,aAAa,OAAO,KAAK;AAAA,EAEzB,YAAY,OAAO,UAAU,OAAO,QAAQ,KAAK,GAAG;AAAA,IAClD,IAAI,CAAC,MAAM,WAAW,GAAG,GAAG;AAAA,MAC1B,MAAM,IAAI,MAAM,mCAAmC,OAAO;AAAA,IAC5D;AAAA,IACA,IAAI,OAAO,UAAU,UAAU;AAAA,MAC7B,MAAM,IAAI,MAAM,mBAAmB,yBAAyB;AAAA,IAC9D;AAAA,EACF;AAAA;AAGF,SAAS,oBAAoB,CAAC,QAAiD;AAAA,EAC7E,aAAa,QAAQ,eAAe;AAAA,EAEpC,IAAI,OAAO,SAAS,aAAa,OAAO,OAAO,SAAS,UAAU;AAAA,IAChE,MAAM,IAAI,MAAM,qCAAqC;AAAA,EACvD;AAAA,EACA,MAAM,OAAO,OAAO;AAAA,EACpB,IACE,SAAS,cACR,OAAO,SAAS,YACf,CAAC,OAAO,UAAU,IAAI,KACtB,OAAO,KACP,OAAO,QACT;AAAA,IACA,MAAM,IAAI,MACR,2DACF;AAAA,EACF;AAAA,EACA,IAAI,OAAO,UAAU,WAAW;AAAA,IAC9B;AAAA,EACF;AAAA,EACA,aAAa,OAAO,OAAO,qBAAqB;AAAA,EAEhD,YAAY,QAAQ,UAAU,OAAO,QAAQ,OAAO,KAAK,GAAG;AAAA,IAC1D,IAAI,CAAC,OAAO,WAAW,GAAG,GAAG;AAAA,MAC3B,MAAM,IAAI,MAAM,qCAAqC,QAAQ;AAAA,IAC/D;AAAA,IAEA,MAAM,SAAS,eAAe,KAAK;AAAA,IACnC,oBAAoB,MAAM;AAAA,EAC5B;AAAA;AAGF,SAAS,mBAAmB,CAAC,OAA8C;AAAA,EACzE,aAAa,OAAO,cAAc;AAAA,EAClC,IAAI,MAAM,WAAW,aAAa,OAAO,MAAM,WAAW,UAAU;AAAA,IAClE,MAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AAAA,EACA,IAAI,MAAM,aAAa,aAAa,OAAO,MAAM,aAAa,UAAU;AAAA,IACtE,MAAM,IAAI,MAAM,wCAAwC;AAAA,EAC1D;AAAA,EACA,IACE,MAAM,mBAAmB,aACzB,OAAO,MAAM,mBAAmB,WAChC;AAAA,IACA,MAAM,IAAI,MAAM,+CAA+C;AAAA,EACjE;AAAA;AAGF,SAAS,cAAc,CAAC,OAAwB;AAAA,EAC9C,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,OAAO;AAAA,EACT;AAAA,EAEA,aAAa,OAAO,eAAe;AAAA,EACnC,IAAI,OAAO,MAAM,WAAW,UAAU;AAAA,IACpC,MAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AAAA,EACA,IACE,MAAM,iBAAiB,aACvB,OAAO,MAAM,iBAAiB,WAC9B;AAAA,IACA,MAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AAAA,EACA,IAAI,MAAM,YAAY,aAAa,OAAO,MAAM,YAAY,YAAY;AAAA,IACtE,MAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AAAA,EAEA,OAAO,MAAM;AAAA;AAGf,SAAS,mBAAmB,CAAC,QAAsB;AAAA,EACjD,IAAI;AAAA,IACF,MAAM,MAAM,IAAI,IAAI,MAAM;AAAA,IAC1B,IAAI,IAAI,aAAa,WAAW,IAAI,aAAa,UAAU;AAAA,MACzD;AAAA,IACF;AAAA,IACA,MAAM;AAAA,EAIR,MAAM,IAAI,MAAM,wCAAwC,QAAQ;AAAA;AAGlE,SAAS,YAAY,CACnB,OACA,MAC0C;AAAA,EAC1C,IAAI,CAAC,SAAS,KAAK,GAAG;AAAA,IACpB,MAAM,IAAI,MAAM,GAAG,wBAAwB;AAAA,EAC7C;AAAA;AAGF,SAAS,QAAQ,CAAC,OAAkD;AAAA,EAClE,OACE,OAAO,UAAU,YACjB,UAAU,QACV,CAAC,MAAM,QAAQ,KAAK,MACnB,OAAO,eAAe,KAAK,MAAM,OAAO,aACvC,OAAO,eAAe,KAAK,MAAM;AAAA;AAIvC,SAAS,eAAe,CAAC,MAAe,OAAqB;AAAA,EAC3D,IAAI,SAAS;AAAA,IAAW;AAAA,EACxB,IAAI,OAAO,SAAS;AAAA,IAAU,MAAM,IAAI,MAAM,GAAG,wBAAwB;AAAA,EACzE,IAAI;AAAA,IACF,MAAM,MAAM,IAAI,IAAI,IAAI;AAAA,IACxB,IAAI,IAAI,aAAa,WAAW,IAAI,aAAa;AAAA,MAAU;AAAA,IAC3D,MAAM;AAAA,EACR,MAAM,IAAI,MAAM,GAAG,8BAA8B;AAAA;;;ACnuBnD,6BAAgB;AAChB,oBAAS,2CAA+B;;;ACIjC,SAAS,uBAAuB,CACrC,QACS;AAAA,EACT,OAAO,OAAO,SAAS,iBAAiB,iBAAiB,OAAO,IAAI;AAAA;AAG/D,SAAS,kBAAkB,CAAC,QAAmC;AAAA,EACpE,OAAO,UAAU,KAAK,OAAO,IAAI;AAAA;AAGnC,SAAS,gBAAgB,CAAC,MAAuB;AAAA,EAC/C,OAAO,kBAAkB,KAAK,IAAI;AAAA;;;AChBpC;AACA;AACA,oBAAS;AAcT,eAAsB,kBAAkB,CACtC,MACA,QACA,UACA,aACA,uBAAiC,CAAC,GACH;AAAA,EAC/B,MAAM,SAA0B,CAAC;AAAA,EACjC,MAAM,SAAS,IAAI;AAAA,EACnB,IAAI,UAAU;AAAA,EACd,IAAI,UAAU;AAAA,EACd,IAAI;AAAA,EACJ,IAAI,aAAa,EACd,GAAG,QAAQ;AAAA,IACV,OAAO,GAAG;AAAA,MACR,UAAU;AAAA;AAAA,EAEd,CAAC,EACA,GAAG,QAAQ;AAAA,IACV,OAAO,GAAG;AAAA,MACR,UAAU;AAAA;AAAA,EAEd,CAAC,EACA,GAAG,aAAa;AAAA,IACf,OAAO,CAAC,SAAS;AAAA,MACf,IACE,CAAC,QACE,aAAa,KAAK,GACjB,YAAY,EACb,MAAM,KAAK,EACX,SAAS,YAAY;AAAA,QAExB;AAAA,MACF,MAAM,OAAO,QAAQ,aAAa,MAAM;AAAA,MACxC,IAAI,SAAS;AAAA,QAAM,OAAO,IAAI,IAAI;AAAA;AAAA,EAEtC,CAAC,EACA,GAAG,cAAc;AAAA,IAChB,OAAO,CAAC,SAAS;AAAA,MACf,MAAM,aAAa,CAAC,GAAG,QAAQ,UAAU;AAAA,MACzC,MAAM,OAAO,QAAQ,aAAa,MAAM,GAAG,KAAK,EAAE,YAAY;AAAA,MAC9D,UAAU;AAAA,QACR,KAAK;AAAA,QACL;AAAA,QAEA,WACG,CAAC,QAAQ,SAAS,eACnB,WAAW,MAAM,EAAE,UACjB,CAAC,QAAQ,SAAS,SAAS,OAAO,EAAE,SAAS,IAAI,CACnD;AAAA,MACJ;AAAA,MACA,OAAO,KAAK,OAAO;AAAA;AAAA,IAErB,IAAI,CAAC,OAAO;AAAA,MACV,IAAI;AAAA,QAAS,QAAQ,OAAO,MAAM;AAAA;AAAA,EAEtC,CAAC,EACA,UAAU,IAAI;AAAA,EAEjB,MAAM,eAAe,IAAI;AAAA,EACzB,MAAM,SAAS,IAAI;AAAA,EACnB,YAAY,QAAO,UAAU,OAAO,QAAQ,GAAG;AAAA,IAC7C,IAAI,CAAC,MAAM,YAAY,CAAC,MAAM,IAAI,KAAK,KAAK,qBAAqB,MAAM,GAAG;AAAA,MACxE;AAAA,IACF,MAAM,OAAO,WAAW,QAAQ,EAC7B,OAAO,MAAM,GAAG,EAChB,OAAO,KAAK,EACZ,MAAM,GAAG,EAAE;AAAA,IACd,MAAM,OAAO,SAAQ,QAAQ,YAAY,UAAU;AAAA,IACnD,MAAM,gBAAgB,MAAM,MAAM,GAAG;AAAA,IACrC,OAAO,IAAI,IAAI;AAAA,IACf,MAAM,aAAa,MAAM,WACtB,IAAI,EAAE,MAAM,WAAW,IAAI,SAAS,gBAAgB,KAAK,IAAI,EAC7D,KAAK,EAAE;AAAA,IACV,aAAa,IACX,QACA,gCAAgC,gBAAgB,SAAS,IAAI,CAAC,KAAK,aACrE;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,CAAC,GAAG,IAAI,IAAI,WAAW,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC;AAAA,EAC5E,MAAM,iBAAiB,sBACrB,CAAC,GAAG,IAAI,IAAI,oBAAoB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC,CACvE;AAAA,EACA,MAAM,gBAAgB,sBAAsB,OAAO;AAAA,EACnD,IAAI,CAAC,YAAY,iBAAiB,iBAAiB;AAAA,IACjD,MAAM,OAAO,SAAS,gBAAgB;AAAA,IACtC,MAAM,UAAS,UACX,IAAI,aAAa,EACd,GAAG,QAAQ;AAAA,MACV,OAAO,CAAC,SAAS;AAAA,QACf,QAAQ,QAAQ,MAAM,EAAE,MAAM,KAAK,CAAC;AAAA;AAAA,IAExC,CAAC,EACA,UAAU,IAAI,IACjB,KAAK,QAAQ,2BAA2B,CAAC,YAAY,UAAU,IAAI;AAAA,IACvE,OAAO,EAAE,MAAM,SAAQ,QAAQ,CAAC,GAAG,MAAM,EAAE;AAAA,EAC7C;AAAA,EACA,IAAI,QAAQ;AAAA,EACZ,MAAM,SAAS,IAAI,aAAa,EAC7B,GAAG,QAAQ;AAAA,IACV,OAAO,CAAC,SAAS;AAAA,MACf,QAAQ,QAAQ,eAAe,EAAE,MAAM,KAAK,CAAC;AAAA,MAE7C,QAAQ,OAAO,gBAAgB,EAAE,MAAM,KAAK,CAAC;AAAA;AAAA,EAEjD,CAAC,EACA,GAAG,cAAc;AAAA,IAChB,OAAO,CAAC,SAAS;AAAA,MACf,MAAM,cAAc,aAAa,IAAI,OAAO;AAAA,MAC5C,IAAI,gBAAgB;AAAA,QAClB,QAAQ,QAAQ,aAAa,EAAE,MAAM,KAAK,CAAC;AAAA;AAAA,EAEjD,CAAC,EACA,UAAU,IAAI;AAAA,EACjB,OAAO,EAAE,MAAM,QAAQ,QAAQ,CAAC,GAAG,MAAM,EAAE;AAAA;AAG7C,SAAS,qBAAqB,CAAC,OAAyB;AAAA,EACtD,OAAO,MACJ,IAAI,CAAC,SAAS,gCAAgC,gBAAgB,IAAI,KAAK,EACvE,KAAK,EAAE;AAAA;AAGZ,eAAsB,mBAAmB,CACvC,QACA,QACmB;AAAA,EACnB,MAAM,MAAM,CAAC,GAAG,OAAO,QAAQ,CAAC,EAC7B,KAAK,EAAE,KAAK,OAAO,EAAE,cAAc,CAAC,CAAC,EACrC,IAAI,IAAI,WAAW,KAAK,EACxB,KAAK;AAAA,CAAI;AAAA,EACZ,IAAI,CAAC;AAAA,IAAK,OAAO,CAAC;AAAA,EAClB,MAAM,OAAO,WAAW,QAAQ,EAAE,OAAO,GAAG,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAAA,EACvE,MAAM,OAAO,SAAQ,QAAQ,cAAc,UAAU;AAAA,EACrD,MAAM,gBAAgB,MAAM,GAAG;AAAA,EAC/B,OAAO,CAAC,IAAI;AAAA;AAGd,SAAS,eAAe,CAAC,OAAuB;AAAA,EAC9C,OAAO,MACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM;AAAA;AAGzB,SAAS,oBAAoB,CAAC,KAAsB;AAAA,EAGlD,IAAI,8CAA8C,KAAK,GAAG;AAAA,IAAG,OAAO;AAAA,EACpE,WAAW,SAAS,IAAI,SAAS,+BAA+B,GAAG;AAAA,IACjE,MAAM,MAAM,MAAM,GAAI,KAAK;AAAA,IAC3B,IAAI,OAAO,CAAC,6BAA6B,KAAK,GAAG;AAAA,MAAG,OAAO;AAAA,EAC7D;AAAA,EACA,OAAO;AAAA;AAGT,eAAe,eAAe,CAAC,MAAc,KAA4B;AAAA,EAEvE,MAAM,YAAY,GAAG,QAAQ,WAAW;AAAA,EACxC,IAAI;AAAA,IACF,MAAM,UAAU,WAAW,GAAG;AAAA,IAC9B,MAAM,OAAO,WAAW,IAAI;AAAA,YAC5B;AAAA,IACA,MAAM,GAAG,WAAW,EAAE,OAAO,KAAK,CAAC;AAAA;AAAA;;;ACrLvC,uBAAS;AACT,6BAAkB;AAIX,SAAS,wBAAwB,GAAG;AAAA,EACzC,MAAM,SAAS,IAAI;AAAA,EACnB,MAAM,SAAoB;AAAA,IACxB,MAAM;AAAA,IACN,KAAK,CAAC,OAAO;AAAA,MAGX,MAAM,OAAO,EAAE,QAAQ,MAAM,WAAW,OAAO,GAAG,GAAG,WAAW;AAAA,QAC9D,OAAO,IAAI,SAAQ,IAAI,CAAC;AAAA,QACxB;AAAA,OACD;AAAA;AAAA,EAEL;AAAA,EACA,OAAO;AAAA,IACL;AAAA,IACA,KAAK,CAAC,QAAiD;AAAA,MACrD,YAAY,MAAM,UAAU,OAAO,QACjC,OAAO,UAAU,UAAU,CAAC,CAC9B,GAAG;AAAA,QACD,MAAM,OAAO,SAAQ,IAAI;AAAA,QAEzB,IAAI,CAAC,YAAW,IAAI;AAAA,UAAG;AAAA,QACvB,OAAO,IAAI,IAAI;AAAA,QACf,WAAW,cAAc,MAAM,SAAS;AAAA,UACtC,MAAM,WAAW,SAAQ,WAAW,IAAI;AAAA,UACxC,IAAI,YAAW,QAAQ;AAAA,YAAG,OAAO,IAAI,QAAQ;AAAA,UAG7C,IAAI;AAAA,YACF,MAAM,WAAW,IAAI,YACnB,WAAW,YAAY,WAAW,MAClC,QAAQ,IAAI,CACd;AAAA,YACA,IAAI,YAAW,QAAQ;AAAA,cAAG,OAAO,IAAI,QAAQ;AAAA,YAC7C,MAAM;AAAA,QAGV;AAAA,MACF;AAAA,MACA,IAAI,CAAC,OAAO,UAAU;AAAA,QAGpB,WAAW,QAAQ,CAAC,GAAG,MAAM,GAAG;AAAA,UAC9B,IAAI,CAAC,mBAAmB,KAAK,IAAI;AAAA,YAAG;AAAA,UACpC,MAAM,SAAS,KAAK,SAAS,MAAM,IAC/B,QACA,KAAK,SAAS,MAAM,IAClB,QACA,aAAa,KAAK,IAAI,IACpB,OACA;AAAA,UACR,IAAI;AAAA,YACF,WAAW,cAAc,IAAI,IAAI,WAAW,EAAE,OAAO,CAAC,EAAE,YACtD,aAAa,MAAM,MAAM,CAC3B,GAAG;AAAA,cACD,IAAI;AAAA,gBACF,MAAM,OAAO,IAAI,YAAY,WAAW,MAAM,QAAQ,IAAI,CAAC;AAAA,gBAC3D,IAAI,YAAW,IAAI;AAAA,kBAAG,OAAO,IAAI,IAAI;AAAA,gBACrC,MAAM;AAAA,YAGV;AAAA,YACA,MAAM;AAAA,QAGV;AAAA,MACF;AAAA,MACA,OAAO,CAAC,GAAG,MAAM;AAAA;AAAA,EAErB;AAAA;;;ACpEF,eAAsB,cAAc,CAClC,SACA,YACA;AAAA,EAEA,QAAQ,WAAW,oBAAoB;AAAA,EACvC,MAAM,SAAS,yBAAyB;AAAA,EACxC,IAAI,eAAe,sBAAsB,IAAI,KAAO,YAAY,SAAS;AAAA,EACzE,MAAM,eAAe;AAAA,OAChB;AAAA,IACH,UAAU;AAAA,OACN,YAAY,SAAS,EAAE,aAAa,CAAC,WAAW,UAAU,EAAE,IAAI,CAAC;AAAA,EACvE;AAAA,EACA,MAAM,UAAU,MAAM;AAAA,IACpB,OAAO;AAAA,IACP,GAAI,gBAAgB,WAAW,CAAC;AAAA,IAChC,GAAI,YAAY,SAAS,CAAC,WAAW,MAAM,IAAI,CAAC;AAAA,IAChD;AAAA,EACF;AAAA,EACA,IAAI,SAAS,MAAM,IAAI,MAAM,KAAK,cAAc,SAAS,QAAQ,EAAE,CAAC;AAAA,EACpE,IACE,OAAO,WACP,aAAa,OAAO,QACpB,aAAa,aAAa,MAC1B;AAAA,IACA,eAAe,sBACb,aAAa,cACb,YAAY,SACd;AAAA,IACA,SAAS,MAAM,IAAI,MAAM,KAAK,cAAc,SAAS,QAAQ,EAAE,CAAC;AAAA,EAClE;AAAA,EACA,MAAM,UAA0D,CAAC;AAAA,EACjE,IAAI,OAAO,SAAS;AAAA,IAClB,WAAW,UAAU,OAAO,SAAS;AAAA,MACnC,MAAM,OAAO,gBAAgB,QAAQ,OAAO,IAAI;AAAA,MAChD,MAAM,WAAW,MAAM,OAAO,YAAY;AAAA,MAC1C,MAAM,IAAI,MAAM,MAAM,QAAQ;AAAA,MAC9B,QAAQ,KAAK,EAAE,MAAM,MAAM,OAAO,MAAM,MAAM,OAAO,KAAK,CAAC;AAAA,IAC7D;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,EAAE,SAAS,OAAO,SAAS,MAAM,OAAO,MAAM,QAAQ;AAAA,IAC9D,QAAQ,aAAa;AAAA,IACrB,YAAY,OAAO,MAAM,MAAM;AAAA,EACjC;AAAA;;;AJhCF,IAAM,mCACJ;AAAA;AAgBK,MAAM,UAAiC;AAAA,EAC5B,OAAO;AAAA,EACP,QAAQ;AAAA,OAEX,MAAK,CAChB,QACA,UACsB;AAAA,IACtB,MAAM,UAAU,CAAC,GAAG,IAAI,IAAI,OAAO,OAAO,OAAO,KAAK,CAAC,CAAC;AAAA,IAExD,WAAW,SAAS,SAAS;AAAA,MAC3B,MAAM,qCACJ,OAAO,MACP,OAAO,MAAM,QACb,OACA,gCACF;AAAA,IACF;AAAA,IACA,MAAM,WAAW,IAAI,IACnB,QAAQ,IAAI,CAAC,UAAU,CAAC,OAAO,0BAA0B,QAAQ,KAAK,CAAC,CAAC,CAC1E;AAAA,IACA,MAAM,iBAAiB,gBACrB,QACA,SACA,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,QAAQ,CAAC,YAAY,QAAQ,WAAW,CACjE;AAAA,IACA,OAAO,gBACL;AAAA,MACE,MAAM,OAAO;AAAA,MACb,QAAQ,OAAO,MAAM;AAAA,MACrB;AAAA,MACA,4BAA4B;AAAA,IAC9B,GACA,CAAC,WACC,KAAK,YACH,KAAK,QAAQ,OAAO,KAAK,OAAO,OAAO,OAAO,EAAE,GAChD,UACA,cACF,CACJ;AAAA;AAAA,OAGY,YAAW,CACvB,QACA,UACA,gBACsB;AAAA,IACtB,MAAM,UAAU,CAAC,GAAG,IAAI,IAAI,OAAO,OAAO,OAAO,KAAK,CAAC,CAAC;AAAA,IAGxD,QAAQ,sBAAsB,MAAa;AAAA,IAC3C,YAAY,OAAO,UAAU,OAAO,QAAQ,OAAO,KAAK,GAAG;AAAA,MACzD,MAAM,kBAAkB,QAAQ,CAAC,GAAG,OAAO,OAAO,SAAS,IAAI,KAAK,CAAC;AAAA,IACvE;AAAA,IAEA,MAAM,eAAe,IAAI;AAAA,IACzB,MAAM,WAAqB,CAAC;AAAA,IAC5B,WAAW,SAAS,SAAS;AAAA,MAC3B,MAAM,QAAQ,MAAM,UAClB,QACA,OACA,SAAS,IAAI,KAAK,GAClB,cACF;AAAA,MACA,IAAI,OAAO,UAAU,UAAU;AAAA,QAC7B,SAAS,KAAK,KAAK;AAAA,QACnB;AAAA,MACF;AAAA,MACA,aAAa,IAAI,OAAO,KAAK;AAAA,IAC/B;AAAA,IACA,IAAI,SAAS,SAAS,GAAG;AAAA,MACvB,MAAM,aAAa,QAAQ;AAAA,IAC7B;AAAA,IAEA,MAAM,cAAwB,CAAC;AAAA,IAC/B,YAAY,OAAO,UAAU,OAAO,QAAQ,OAAO,KAAK,GAAG;AAAA,MACzD,MAAM,OAAO,aAAa,IAAI,KAAK;AAAA,MACnC,IAAI,CAAC,MAAM;AAAA,QACT,MAAM,IAAI,MAAM,mCAAmC,OAAO;AAAA,MAC5D;AAAA,MACA,MAAM,eAAe,SAAS,QAAQ,KAAK;AAAA,MAC3C,MAAM,WAAW,MAAM,kBACrB,QACA;AAAA,QACE,MAAM,KAAK,iBAAiB,IAAI,CAAC,WAAW;AAAA,UAC1C,KAAK;AAAA,UACL,YAAY;AAAA,YACV,KAAK;AAAA,YACL,MAAM,WAAW,OAAO,MAAM,QAAQ,cAAc,KAAK;AAAA,UAC3D;AAAA,QACF,EAAE;AAAA,QACF,SAAS,KAAK,iBAAiB,IAAI,CAAC,WAAW;AAAA,UAC7C,MAAM;AAAA,UACN,KAAK,WAAW,OAAO,MAAM,QAAQ,cAAc,KAAK;AAAA,QAC1D,EAAE;AAAA,MACJ,GACA,KAAK,OACL,OACA,SAAS,IAAI,KAAK,CACpB;AAAA,MACA,QAAQ,MAAM,QAAQ,mBAAmB,MAAM,mBAC7C,UACA,OAAO,MAAM,QACb,CAAC,UAAU,WAAW,OAAO,MAAM,QAAQ,cAAc,KAAK,GAC9D,KAAK,iBAAiB,IAAI,CAAC,UACzB,WAAW,OAAO,MAAM,QAAQ,cAAc,KAAK,CACrD,GACA,KAAK,0BAA0B,IAAI,CAAC,UAClC,WAAW,OAAO,MAAM,QAAQ,cAAc,KAAK,CACrD,CACF;AAAA,MACA,MAAM,MAAM,SAAQ,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,MACtD,MAAM,WAAU,cAAc,IAAI;AAAA,MAClC,YAAY,KAAK,GAAG,KAAK,QAAQ,GAAG,gBAAgB,YAAY;AAAA,IAClE;AAAA,IAEA,OAAO;AAAA,MACL,MAAM,OAAO;AAAA,MACb,QAAQ,OAAO,MAAM;AAAA,MACrB,aAAa,CAAC,GAAG,IAAI,IAAI,WAAW,CAAC;AAAA,IACvC;AAAA;AAEJ;AAEA,eAAe,SAAS,CACtB,QACA,OACA,YACA,iBAA2B,CAAC,GACC;AAAA,EAC7B,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,MAAM,SAAS,MAAM,eACnB;AAAA,MACE,aAAa,CAAC,KAAK;AAAA,MACnB,QAAQ,OAAO,MAAM;AAAA,MACrB,QAAQ;AAAA,MACR,QAAQ;AAAA,MAER,QAAQ,QAAQ,IAAI,oBAAoB;AAAA,MACxC,QAAQ,EAAE,OAAO,uBAAuB,OAAO,sBAAsB;AAAA,MACrE,OAAO;AAAA,IACT,GACA,UACF;AAAA,IACA,eAAe,KAAK,GAAG,OAAO,UAAU;AAAA,IACxC,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,IAChB,OAAO,OAAgB;AAAA,IACvB,OAAO,kBAAkB,OAAO,CAAC,aAAa,KAAK,CAAC,CAAC;AAAA;AAAA,EAEvD,MAAM,SAAS,OAAO,QAAQ,IAAI,CAAC,WAAW,SAAQ,OAAO,IAAI,CAAC;AAAA,EAClE,MAAM,mBAAmB,OAAO,QAC7B,OAAO,uBAAuB,EAC9B,IAAI,CAAC,WAAW,SAAQ,OAAO,IAAI,CAAC;AAAA,EACvC,MAAM,mBAAmB,OAAO,QAC7B,OAAO,kBAAkB,EACzB,IAAI,CAAC,WAAW,SAAQ,OAAO,IAAI,CAAC;AAAA,EAEvC,IAAI,CAAC,OAAO,WAAW,OAAO,WAAW,KAAK,iBAAiB,WAAW,GAAG;AAAA,IAC3E,OAAO,kBACL,OACA,OAAO,KAAK,IAAI,CAAC,QAAQ,IAAI,OAAO,GACpC;AAAA,MACE,SAAS,OAAO;AAAA,MAChB,WAAW,OAAO,SAAS;AAAA,MAC3B,eAAe,iBAAiB,SAAS;AAAA,IAC3C,CACF;AAAA,EACF;AAAA,EAEA,MAAM,4BAA4B,MAAM,oBACtC,QACA,OAAO,MAAM,MACf;AAAA,EACA,OAAO;AAAA,IACL;AAAA,IACA,QAAQ,CAAC,GAAG,QAAQ,GAAG,yBAAyB;AAAA,IAChD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAGF,SAAS,iBAAiB,CACxB,OACA,MACA,OACQ;AAAA,EACR,MAAM,UAAU;AAAA,IACd,SAAS,CAAC,MAAM,UAAU,+BAA+B;AAAA,IACzD,SAAS,CAAC,MAAM,YAAY,gCAAgC;AAAA,IAC5D,SAAS,CAAC,MAAM,gBAAgB,qCAAqC;AAAA,IACrE,GAAG;AAAA,EACL,EAAE,OAAO,CAAC,WAAW,WAAW,EAAE;AAAA,EAElC,OAAO,GAAG,UAAU,QAAQ,KAAK;AAAA,CAAI;AAAA;AAGvC,SAAS,YAAY,CAAC,UAA2B;AAAA,EAC/C,IAAI,SAAS,WAAW,GAAG;AAAA,IACzB,OAAO,IAAI,MAAM,yCAAyC,SAAS,IAAI;AAAA,EACzE;AAAA,EACA,OAAO,IAAI,MACT;AAAA,EAA0C,SACvC,IAAI,CAAC,YAAY,KAAK,SAAS,EAC/B,KAAK;AAAA,CAAI,GACd;AAAA;AAGF,SAAS,QAAQ,CAAC,QAAwB,OAAuB;AAAA,EAC/D,IAAI,UAAU,KAAK;AAAA,IACjB,OAAO,gBAAgB,OAAO,MAAM,QAAQ,YAAY;AAAA,EAC1D;AAAA,EACA,MAAM,gBAAgB,MAAM,QAAQ,QAAQ,EAAE;AAAA,EAC9C,IAAI,OAAO,MAAM,gBAAgB;AAAA,IAC/B,OAAO,gBAAgB,OAAO,MAAM,QAAQ,GAAG,0BAA0B;AAAA,EAC3E;AAAA,EACA,OAAO,gBAAgB,OAAO,MAAM,QAAQ,GAAG,oBAAoB;AAAA;AAGrE,SAAS,UAAU,CACjB,QACA,cACA,OACQ;AAAA,EACR,MAAM,aAAa,SAAS,QAAQ,KAAK,EAAE,MAAM,GAAG,EAAE,KAAK,GAAG;AAAA,EAC9D,IACE,eAAe,MACf,eAAe,QACf,WAAW,WAAW,KAAK,KAC3B,WAAW,UAAU,GACrB;AAAA,IACA,MAAM,IAAI,MACR,oDAAoD,OACtD;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,SAAQ,YAAY;AAAA,EACxC,MAAM,YAAY,SAAS,aAAa,KAAK,EAAE,MAAM,GAAG,EAAE,KAAK,GAAG;AAAA,EAClE,OAAO,KAAK;AAAA;AAGd,SAAS,YAAY,CAAC,OAAwB;AAAA,EAC5C,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA;;;AKrO9D,SAAS,WAAW,CAAC,WAA2B;AAAA,EAC9C,OAAO,UAAU,OAAO,CAAC,EAAE,YAAY,IAAI,UAAU,MAAM,CAAC;AAAA;AAG9D,IAAM,yBAAyB;AAAA,EAC7B,KAAK;AAAA,EACL,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AACZ;AAEO,IAAM,oBAA+B;AAAA,EAC1C,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,aAAa;AAAA,EACb,UAAU;AAAA,EACV,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,WAAW,CAAC,UAAU,OAAO;AAAA,EAC7B,YAAY,CAAC,UAAU,QAAQ;AAAA,EAC/B,mBAAmB;AAAA,EACnB,oBAAoB,CAAC,IAAI,iBAAiB;AAAA,IACxC,OAAO,GAAG;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,IACb,SAAS,KAAK,uBAAuB;AAAA,EACvC;AAAA,EACA,gBAAgB,CAAC,WAAW;AAAA,IAC1B,wBAAwB;AAAA,IACxB,8BAA8B;AAAA,IAC9B,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,EACvB;AAAA,EACA,eAAe,OAAO;AAAA,IACpB,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,iBAAiB;AAAA,EACnB;AAAA,EACA,SAAS;AAAA,EACT,eAAe,CAAC,qBAAqB;AAAA,IACnC,WAAW;AAAA,IACX,eAAe;AAAA,IACf;AAAA,EACF;AACF;AAEO,IAAM,oBAA+B;AAAA,EAC1C,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,aAAa;AAAA,EACb,UAAU;AAAA,EACV,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,WAAW,CAAC,UAAU,KAAK,YAAY,KAAK;AAAA,EAC5C,YAAY,CAAC,UAAU,QAAQ,YAAY,KAAK;AAAA,EAChD,mBAAmB;AAAA,EACnB,oBAAoB,OAAO;AAAA,IACzB,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,aAAa;AAAA,EACf;AAAA,EACA,gBAAgB,CAAC,WAAW;AAAA,IAC1B,cAAc;AAAA,IACd,eAAe;AAAA,EACjB;AAAA,EACA,eAAe,OAAO,CAAC;AAAA,EACvB,SAAS;AAAA,EACT,eAAe,CAAC,qBAAqB;AAAA,IACnC,WAAW;AAAA,IACX;AAAA,EACF;AACF;AAEO,IAAM,uBAAkC;AAAA,EAC7C,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,aAAa;AAAA,EACb,UAAU;AAAA,EACV,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,WAAW,CAAC,UAAU,OAAO;AAAA,EAC7B,YAAY,CAAC,UAAU,QAAQ;AAAA,EAC/B,mBAAmB;AAAA,EACnB,oBAAoB,CAAC,IAAI,iBAAiB;AAAA,IACxC,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,aAAa;AAAA,IACb,OAAO,GAAG;AAAA,IACV,SAAS,KAAK,uBAAuB;AAAA,EACvC;AAAA,EACA,gBAAgB,CAAC,WAAW;AAAA,IAC1B,wBAAwB;AAAA,IACxB,8BAA8B;AAAA,IAC9B,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,EACvB;AAAA,EACA,eAAe,OAAO,CAAC;AAAA,EACvB,SAAS;AAAA,EACT,eAAe,CAAC,qBAAqB;AAAA,IACnC,WAAW;AAAA,IACX;AAAA,EACF;AACF;AAEO,IAAM,yBAAoC;AAAA,EAC/C,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,aAAa;AAAA,EACb,UAAU;AAAA,EACV,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,WAAW,CAAC,UAAU,OAAO;AAAA,EAC7B,YAAY,CAAC,UAAU,QAAQ;AAAA,EAC/B,mBAAmB;AAAA,EACnB,oBAAoB,CAAC,IAAI,iBAAiB;AAAA,IACxC,OAAO,GAAG;AAAA,IACV,aAAa;AAAA,IACb,aAAa;AAAA,EACf;AAAA,EACA,gBAAgB,CAAC,WAAW;AAAA,IAC1B,wBAAwB;AAAA,IACxB,8BAA8B;AAAA,IAC9B,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,EACvB;AAAA,EACA,eAAe,OAAO,CAAC;AAAA,EACvB,SAAS;AAAA,EACT,eAAe,CAAC,qBAAqB;AAAA,IACnC,WAAW;AAAA,IACX,eAAe;AAAA,IACf;AAAA,EACF;AACF;;;ACnKO,MAAM,SAAgC;AAAA,EACP;AAAA,EAA7B,WAAW,CAAkB,SAAoB;AAAA,IAApB;AAAA;AAAA,MAEzB,IAAI,GAAe;AAAA,IAC5B,OAAO,KAAK,QAAQ;AAAA;AAAA,MAGX,KAAK,GAAW;AAAA,IACzB,OAAO,KAAK,QAAQ;AAAA;AAAA,OAGT,MAAK,CAChB,QACA,UACsB;AAAA,IACtB,IAAI,CAAC,OAAO,IAAI;AAAA,MACd,MAAM,IAAI,MACR,kHACE,qCACJ;AAAA,IACF;AAAA,IAEA,QAAQ,qBAAqB,MAAa;AAAA,IAC1C,OAAO,iBAAiB,QAAQ,KAAK,OAAO;AAAA;AAEhD;AAEO,IAAM,iBAAiB,IAAI,SAAS,iBAAiB;AACrD,IAAM,iBAAiB,IAAI,SAAS,iBAAiB;AACrD,IAAM,oBAAoB,IAAI,SAAS,oBAAoB;AAC3D,IAAM,sBAAsB,IAAI,SAAS,sBAAsB;;;ACnDtE,sBAAa,qBAAO;AACpB,uBAAS;AACT,oBAAS,qBAAS;;;ACFlB;AAEO,SAAS,WAAW,CAAC,UAAkB,SAAwB;AAAA,EACpE,OAAO,IAAI,MAAM,kBAAkB,SAAS,QAAQ,MAAM,SAAS;AAAA;;;ACHrE,uBAAS,6BAAY;;;ACArB;AACA;AA0BA,IAAM,aAAa,IAAI,IAAI,CAAC,QAAQ,QAAQ,KAAK,CAAC;AAClD,IAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,QAAQ,KAAK,IAAI,CAAC;AAChD,IAAM,SAAS,IAAI,IAAI;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,SAAS,IAAI,CAAC,MAAe,SAAwB;AAAA,EACnD,MAAM,SAAS,KAAK,cAAc;AAAA,EAClC,MAAM,QAAQ,OAAO,8BAA8B,KAAK,SAAS,CAAC;AAAA,EAClE,MAAM,YACJ,GAAG,OAAO,YACV,GAAG,MAAM,OAAO,KAAK,MAAM,YAAY,KAAK,SAC9C;AAAA;AAEF,SAAS,MAAM,CAAC,MAAoC;AAAA,EAClD,OACE,GAAG,0BAA0B,IAAI,KACjC,GAAG,eAAe,IAAI,KACtB,GAAG,oBAAoB,IAAI,KAC3B,GAAG,sBAAsB,IAAI;AAAA,IAE7B,OAAO,KAAK;AAAA,EACd,OAAO;AAAA;AAET,SAAS,IAAI,CAAC,MAA+B;AAAA,EAC3C,OAAO,GAAG,aAAa,IAAI,KACzB,GAAG,oBAAoB,IAAI,KAC3B,GAAG,iBAAiB,IAAI,IACtB,KAAK,OACL,KAAK,MAAM,kDAAU;AAAA;AAE3B,SAAS,QAAQ,CACf,MACA,KAC2B;AAAA,EAC3B,MAAM,OAAO,KAAK,WAAW,KAC3B,CAAC,MAAM,CAAC,GAAG,mBAAmB,CAAC,KAAK,KAAK,EAAE,IAAI,MAAM,GACvD;AAAA,EACA,IAAI,CAAC;AAAA,IAAM;AAAA,EACX,IAAI,GAAG,qBAAqB,IAAI;AAAA,IAAG,OAAO,KAAK;AAAA,EAC/C,IAAI,GAAG,8BAA8B,IAAI;AAAA,IAAG,OAAO,KAAK;AAAA,EACxD,OAAO,KAAK,MAAM,wDAAW;AAAA;AAE/B,SAAS,MAAM,CACb,MACA,OAC4B;AAAA,EAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,0BAA0B,OAAO,IAAI,CAAC,GAAG;AAAA,IACxD,IAAI;AAAA,MAAM,KAAK,MAAM,GAAG,kDAAe;AAAA,IACvC,MAAM,IAAI,MAAM,+BAAqB,OAAO;AAAA,EAC9C;AAAA,EACA,OAAO,OAAO,IAAI;AAAA;AAEpB,SAAS,WAAW,CAAC,QAAoC;AAAA,EACvD,MAAM,cAAc,OAAO;AAAA,EAC3B,IACE,CAAC,GAAG,oBAAoB,WAAW,KACnC,CAAC,YAAY,QACb,YAAY,WAAW,WAAW,KAClC,YAAY,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,WAAW,YAAY,KACxE,YAAY,KAAK,WAAW,WAAW,KACvC,CAAC,GAAG,kBAAkB,YAAY,KAAK,WAAW,EAAE,KACpD,CAAC,YAAY,KAAK,WAAW,GAAG;AAAA,IAEhC,KACE,aACA,GAAG,YAAY,MAAM,QAAQ,wEAC/B;AAAA,EACF,OAAO,YAAY,KAAK,WAAW,GAAG;AAAA;AAIxC,SAAS,iBAAiB,CAAC,MAAkC;AAAA,EAC3D,SAAS,KAAK,CAAC,MAAoC;AAAA,IACjD,IAAI,QAAQ;AAAA,IACZ,OACE,MAAM,WACL,GAAG,0BAA0B,MAAM,MAAM,KACxC,GAAG,eAAe,MAAM,MAAM,KAC9B,GAAG,oBAAoB,MAAM,MAAM,KACnC,GAAG,sBAAsB,MAAM,MAAM;AAAA,MAEvC,QAAQ,MAAM;AAAA,IAChB,OAAO;AAAA;AAAA,EAET,IAAI,aAAa,MAAM,IAAI;AAAA,EAC3B,MAAM,SAAS,WAAW;AAAA,EAC1B,IACE,GAAG,2BAA2B,MAAM,KACpC,OAAO,KAAK,SAAS,WACrB,GAAG,iBAAiB,OAAO,MAAM,KACjC,OAAO,OAAO,eAAe,UAC7B,CAAC,OAAO,OAAO,UAAU;AAAA,IAEzB,aAAa,MAAM,OAAO,MAAM;AAAA,EAClC,MAAM,SAAS,WAAW;AAAA,EAC1B,IAAI,GAAG,sBAAsB,MAAM,KAAK,GAAG,mBAAmB,MAAM;AAAA,IAClE,OAAO,GAAG,aAAa,OAAO,MAAM;AAAA,EACtC,IACE,GAAG,sBAAsB,MAAM,KAC/B,OAAO,gBAAgB,cACvB,GAAG,aAAa,OAAO,IAAI,KAC3B,GAAG,0BAA0B,OAAO,MAAM,GAC1C;AAAA,IACA,MAAM,YAAY,OAAO,OAAO;AAAA,IAChC,OACE,GAAG,oBAAoB,SAAS,KAAK,GAAG,aAAa,UAAU,MAAM;AAAA,EAEzE;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,sBAAsB,CAAC,YAAiC;AAAA,EAC/D,MAAM,OAAO,OAAO,UAAU;AAAA,EAC9B,IACE,GAAG,oBAAoB,IAAI,KAC3B,GAAG,iBAAiB,IAAI,KACxB,KAAK,SAAS,GAAG,WAAW,eAC5B,KAAK,SAAS,GAAG,WAAW,gBAC5B,KAAK,SAAS,GAAG,WAAW;AAAA,IAE5B;AAAA,EACF,IAAI,GAAG,0BAA0B,IAAI,GAAG;AAAA,IACtC,MAAM,OAAO,IAAI;AAAA,IACjB,WAAW,QAAQ,KAAK,YAAY;AAAA,MAClC,IAAI,CAAC,GAAG,qBAAqB,IAAI;AAAA,QAC/B,KAAK,MAAM,6GAA6B;AAAA,MAC1C,MAAM,MAAM,KAAK,KAAK,IAAI;AAAA,MAC1B,IAAI,KAAK,IAAI,GAAG;AAAA,QACd,KAAK,MAAM,uFAA2B,KAAK;AAAA,MAC7C,KAAK,IAAI,GAAG;AAAA,MACZ,uBAAuB,KAAK,WAAW;AAAA,IACzC;AAAA,IACA;AAAA,EACF;AAAA,EACA,IAAI,GAAG,yBAAyB,IAAI,GAAG;AAAA,IACrC,WAAW,SAAS,KAAK;AAAA,MAAU,uBAAuB,KAAK;AAAA,IAC/D;AAAA,EACF;AAAA,EACA,KAAK,MAAM,mHAA8B;AAAA;AAIpC,SAAS,mBAAmB,CACjC,OACA,QACA,eAC0B;AAAA,EAC1B,MAAM,QAAQ,qBAAqB;AAAA,IACjC,MAAM,OAAO;AAAA,IACb,aAAa,CAAC,KAAK;AAAA,IACnB,UAAU,OAAO;AAAA,OACd,OAAO;AAAA,EACZ,CAAC;AAAA,EACD,gBAAgB,MAAM,QAAQ,IAAI,CAAC,YAAW,QAAO,QAAQ,CAAC;AAAA,EAC9D,MAAM,SAAS,MAAM,QAAQ,KAC3B,CAAC,MAAM,aAAa,EAAE,QAAQ,MAAM,aAAa,KAAK,CACxD;AAAA,EACA,IAAI,CAAC;AAAA,IAAQ,MAAM,YAAY,OAAO,sCAAQ;AAAA,EAC9C,MAAM,WAAW,IAAI,eAAe,KAAK;AAAA,EACzC,MAAM,QAA+D,CAAC;AAAA,EACtE,MAAM,eAAoC,CAAC;AAAA,EAC3C,SAAS,WAAW,CAAC,MAAqB;AAAA,IACxC,IAAI,GAAG,iBAAiB,IAAI,KAAK,SAAS,cAAc,MAAM,WAAW;AAAA,MACvE,aAAa,KAAK,IAAI;AAAA,IAGxB,GAAG,aAAa,MAAM,WAAW;AAAA;AAAA,EAEnC,YAAY,MAAM;AAAA,EAElB,SAAS,UAAU,CACjB,YACA,OAAO,IAAI,KACF;AAAA,IACT,MAAM,QAAQ,OAAO,UAAU;AAAA,IAC/B,IAAI,KAAK,IAAI,KAAK;AAAA,MAAG,OAAO;AAAA,IAC5B,KAAK,IAAI,KAAK;AAAA,IACd,IAAI,GAAG,iBAAiB,KAAK;AAAA,MAC3B,OAAO,SAAS,cAAc,OAAO,WAAW;AAAA,IAClD,MAAM,cAAc,MAAM,SAAS,KAAK,GAAG;AAAA,IAC3C,OACE,CAAC,CAAC,eACF,GAAG,sBAAsB,WAAW,KACpC,CAAC,CAAC,YAAY,eACd,WAAW,YAAY,aAAa,IAAI;AAAA;AAAA,EAG5C,SAAS,sBAAsB,CAAC,MAAqB;AAAA,IAGnD,IAAI,GAAG,eAAe,IAAI,KAAK,GAAG,YAAY,IAAI;AAAA,MAAG;AAAA,IACrD,IAAI,GAAG,iBAAiB,IAAI,GAAG;AAAA,MAC7B,MAAM,SAAS,OAAO,KAAK,UAAU;AAAA,MACrC,MAAM,WAAW,GAAG,2BAA2B,MAAM,IACjD,OAAO,aACP,GAAG,0BAA0B,MAAM,IACjC,OAAO,aACP;AAAA,MACN,MAAM,SAAS,GAAG,2BAA2B,MAAM,IAC/C,OAAO,KAAK,OACZ,GAAG,0BAA0B,MAAM,KACjC,GAAG,oBAAoB,OAAO,kBAAkB,IAChD,OAAO,mBAAmB,OAC1B;AAAA,MACN,IACE,WAAW,SACX,aACC,WAAW,QAAQ,KAAK,SAAS,cAAc,MAAM,KAAK;AAAA,QAE3D,KAAK,MAAM,yFAA6B;AAAA,IAC5C;AAAA,IACA,GAAG,aAAa,MAAM,sBAAsB;AAAA;AAAA,EAE9C,uBAAuB,MAAM;AAAA,EAE7B,WAAW,QAAQ,cAAc;AAAA,IAC/B,IAAI,CAAC,kBAAkB,IAAI;AAAA,MACzB,KACE,MACA,2LACF;AAAA,IACF,IAAI,KAAK,UAAU,WAAW;AAAA,MAC5B,KAAK,MAAM,wFAAiC;AAAA,IAC9C,MAAM,UAAU,OAAO,KAAK,UAAU,IAAI,mBAAmB;AAAA,IAC7D,MAAM,OAAO,IAAI;AAAA,IACjB,WAAW,UAAU,QAAQ,YAAY;AAAA,MACvC,IAAI,GAAG,mBAAmB,MAAM;AAAA,QAC9B,KAAK,QAAQ,2EAA8B;AAAA,MAC7C,IACE,CAAC,GAAG,qBAAqB,MAAM,KAC/B,CAAC,GAAG,8BAA8B,MAAM;AAAA,QAExC,KAAK,QAAQ,2EAA8B;AAAA,MAC7C,MAAM,MAAM,KAAK,OAAO,IAAI;AAAA,MAC5B,IAAI,KAAK,IAAI,GAAG;AAAA,QACd,KAAK,QAAQ,uEAA+B,KAAK;AAAA,MACnD,KAAK,IAAI,GAAG;AAAA,MACZ,IAAI,CAAC,CAAC,QAAQ,aAAa,YAAY,aAAa,EAAE,SAAS,GAAG;AAAA,QAChE,KAAK,QAAQ,qDAA4B,KAAK;AAAA,MAGhD,IAAI,QAAQ,cAAc,QAAQ;AAAA,QAChC,uBACE,GAAG,qBAAqB,MAAM,IAAI,OAAO,cAAc,OAAO,IAChE;AAAA,IACJ;AAAA,IACA,MAAM,OAAO,SAAS,SAAS,MAAM;AAAA,IACrC,IAAI,CAAC;AAAA,MAAM,KAAK,MAAM,6BAAmB;AAAA,IACzC,MAAM,KAAK,EAAE,WAAW,MAAM,OAAO,SAAS,SAAS,WAAW,EAAE,CAAC;AAAA,EACvE;AAAA,EACA,IAAI,MAAM,SAAS;AAAA,IACjB,KAAK,MAAM,GAAG,WAAW,qFAAyB;AAAA,EACpD,IAAI,YAAY,MAAM,MAAM,MAAM,QAAQ,MAAM,GAAG,WAAW,MAAM;AAAA,EACpE,IAAI,MAAM,WAAW,CAAC,aAAa,CAAC,MAAM,YAAY,SAAS;AAAA,IAC7D,KAAK,MAAM,GAAG,WAAW,qFAAoB;AAAA,EAC/C,IAAI,CAAC,WAAW;AAAA,IACd,MAAM,QAAQ,MAAM,QAAQ,OAC1B,CAAC,MAAM,EAAE,WAAW,UAAU,MAAM,YAAY,CAAC,CACnD;AAAA,IACA,MAAM,UAAU,MAAM,OACpB,CAAC,MAAM,MAAM,SAAS,CAAC,EAAE,UAAU,WAAW,CAChD;AAAA,IACA,MAAM,aAAa,QAAQ,SAAS,UAAU;AAAA,IAC9C,IAAI,WAAW,SAAS;AAAA,MACtB,KAAK,WAAW,GAAG,aAAa,4EAA+B;AAAA,IACjE,YAAY,WAAW;AAAA,EACzB;AAAA,EACA,OAAO,YAAY,SAAS,OAAO,WAAW,MAAM,IAAI,KAAK,IAAI;AAAA;AAAA;AAGnE,MAAM,eAAe;AAAA,EAIC;AAAA,EAHZ,eAAe;AAAA,EACf,QAA+B,CAAC;AAAA,EAChC,QAAkB,CAAC;AAAA,EAC3B,WAAW,CAAS,OAAuB;AAAA,IAAvB;AAAA;AAAA,EACpB,aAAa,CAAC,MAAyB,UAA2B;AAAA,IAChE,MAAM,SAAS,KAAK,MAAM,SAAS,KAAK,UAAU;AAAA,IAClD,OACE,QAAQ,SAAS,YACjB,CAAC,CAAC,OAAO,cAAc,KAAK,CAAC,MAC3B,mCAAmC,KACjC,EAAE,cAAc,EAAE,SAAS,QAAQ,OAAO,GAAG,CAC/C,CACF;AAAA;AAAA,EAGJ,MAAM,CAAC,WAA2B,OAAqC;AAAA,IACrE,MAAM,WAAW,IAAI;AAAA,IACrB,IAAI;AAAA,MACF,WAAW,KAAK,OAAO,OAAO,WAAW,EAAE,YAAY;AAAA,QACrD,IAAI,CAAC,GAAG,qBAAqB,CAAC;AAAA,UAAG,KAAK,GAAG,sDAAmB;AAAA,QAC5D,SAAS,IAAI,KAAK,EAAE,IAAI,GAAG;AAAA,UACzB,MAAM;AAAA,UACN,OAAO,KAAK,QAAQ,EAAE,WAAW;AAAA,QACnC,CAAC;AAAA,MACH;AAAA,IACF,MAAM,OAAO,KAAK,SAAS,WAAW,QAAQ;AAAA,IAC9C,IAAI,KAAK,SAAS;AAAA,MAChB,KAAK,UAAU,aAAa,8DAAY;AAAA,IAC1C,OAAO,EAAE,MAAM,UAAU,WAAW,OAAO,KAAK,OAAO,KAAK;AAAA;AAAA,EAEtD,MAAM,CACZ,WACA,KACyB;AAAA,IACzB,OAAO,KAAK,MACT,QAAQ,SAAS,EACjB,KACC,CAAC,MACC,EAAE,YAAY,QACd,KAAK,EAAE,YAAY,IAAI,MAAM,OAC7B,EACE,GAAG,iBAAiB,EAAE,WAAW,KACjC,GACG,aAAa,EAAE,WAAW,GACzB,KACA,CAAC,aAAa,SAAS,SAAS,GAAG,WAAW,aAChD,EAER;AAAA;AAAA,EAEI,MAAM,CAAC,QAAqB,KAA0B;AAAA,IAC5D,MAAM,SAAS,KAAK,MAAM,SAAS,OAAO,KAAK,EAAE;AAAA,IACjD,MAAM,SAAS,UAAU,KAAK,OAAO,QAAQ,GAAG;AAAA,IAChD,IAAI,CAAC;AAAA,MAAQ,KAAK,OAAO,aAAa,kCAAc,KAAK;AAAA,IACzD,OAAO;AAAA;AAAA,EAED,OAAO,CACb,YACA,OAAO,IAAI,KACO;AAAA,IAClB,MAAM,OAAO,OAAO,UAAU;AAAA,IAC9B,IAAI,GAAG,oBAAoB,IAAI;AAAA,MAAG,OAAO,KAAK;AAAA,IAC9C,IAAI,GAAG,iBAAiB,IAAI;AAAA,MAAG,OAAO,OAAO,KAAK,IAAI;AAAA,IACtD,IAAI,KAAK,SAAS,GAAG,WAAW;AAAA,MAAa,OAAO;AAAA,IACpD,IAAI,KAAK,SAAS,GAAG,WAAW;AAAA,MAAc,OAAO;AAAA,IACrD,IACE,GAAG,wBAAwB,IAAI,MAC9B,KAAK,aAAa,GAAG,WAAW,cAC/B,KAAK,aAAa,GAAG,WAAW,YAClC;AAAA,MACA,MAAM,QAAQ,KAAK,QAAQ,KAAK,SAAS,IAAI;AAAA,MAC7C,IAAI,OAAO,UAAU;AAAA,QACnB,OAAO,KAAK,aAAa,GAAG,WAAW,aAAa,CAAC,QAAQ;AAAA,IACjE;AAAA,IACA,IAAI,GAAG,aAAa,IAAI,KAAK,GAAG,2BAA2B,IAAI,GAAG;AAAA,MAChE,MAAM,cAAc,KAAK,MAAM,SAAS,IAAI,GAAG;AAAA,MAC/C,IACE,eACA,GAAG,sBAAsB,WAAW,KACpC,YAAY,eACZ,GAAG,0BAA0B,YAAY,MAAM,KAC/C,YAAY,OAAO,QAAQ,GAAG,UAAU,OACxC;AAAA,QACA,IAAI,KAAK,IAAI,WAAW;AAAA,UAAG,KAAK,MAAM,sCAAQ;AAAA,QAC9C,OAAO,KAAK,QACV,YAAY,aACZ,IAAI,IAAI,CAAC,GAAG,MAAM,WAAW,CAAC,CAChC;AAAA,MACF;AAAA,IACF;AAAA,IACA,OAAO,KAAK,MAAM,2DAAc,KAAK,QAAQ,GAAG;AAAA;AAAA,EAE1C,YAAY,CAClB,QACA,SAAS,IAAI,KACkB;AAAA,IAC/B,IAAI,OAAO,IAAI,OAAO,WAAW;AAAA,MAC/B,KAAK,OAAO,aAAa,wBAAc;AAAA,IACzC,OAAO,IAAI,OAAO,WAAW;AAAA,IAC7B,MAAM,QAAQ,OAAO,YAAY,MAAM,GAAG,aAAa;AAAA,IACvD,MAAM,SAAS,IAAI;AAAA,IACnB,WAAW,KAAK,MAAM,YAAY;AAAA,MAChC,IAAI,GAAG,mBAAmB,CAAC,GAAG;AAAA,QAC5B,MAAM,OAAO,OAAO,EAAE,UAAU;AAAA,QAChC,IACE,CAAC,GAAG,iBAAiB,IAAI,KACzB,CAAC,GAAG,2BAA2B,KAAK,UAAU,KAC9C,KAAK,WAAW,WAAW,SAAS,GAAG,WAAW,gBAClD,KAAK,WAAW,KAAK,SAAS,eAC9B,KAAK,UAAU;AAAA,UAEf,KAAK,GAAG,wDAA+B;AAAA,QACzC,YAAY,KAAK,WAAU,KAAK,aAC9B,KAAK,OAAO,QAAQ,WAAW,GAC/B,MACF;AAAA,UACE,OAAO,IAAI,KAAK,MAAK;AAAA,MACzB,EAAO,SAAI,GAAG,qBAAqB,CAAC;AAAA,QAClC,OAAO,IAAI,KAAK,EAAE,IAAI,GAAG,KAAK,QAAQ,EAAE,WAAW,CAAC;AAAA,MACjD;AAAA,aAAK,GAAG,wDAAgB;AAAA,IAC/B;AAAA,IACA,OAAO,OAAO,OAAO,WAAW;AAAA,IAChC,OAAO;AAAA;AAAA,EAED,QAAQ,CACd,SACA,OACY;AAAA,IACZ,MAAM,YAAY,KAAK,MAAM,OAAO,OAAO;AAAA,IAC3C,IAAI,KAAK,MAAM,SAAS,UAAU,EAAE;AAAA,MAClC,KAAK,UAAU,aAAa,qDAAa,UAAU,WAAW;AAAA,IAChE,KAAK,MAAM,KAAK,UAAU,EAAE;AAAA,IAC5B,KAAK,iBAAiB,SAAS;AAAA,IAC/B,MAAM,WAAqB;AAAA,MACzB;AAAA,MACA,QAAQ,IAAI,KAAK;AAAA,MACjB,OAAO,IAAI;AAAA,MACX;AAAA,IACF;AAAA,IACA,MAAM,OAAO,KAAK,OAAO,WAAW,WAAW;AAAA,IAC/C,IAAI;AAAA,MACF,YAAY,KAAK,UAAU,KAAK,aAAa,IAAI,GAAG;AAAA,QAClD,MAAM,SAAS,GAAG,SAAS,UAAU,SAAS,MAAM,QAAQ,IAAI,QAAQ,kBAAkB,GAAG;AAAA,QAC7F,SAAS,MAAM,IAAI,KAAK,MAAM;AAAA,QAC9B,KAAK,MAAM,KAAK,EAAE,KAAK,QAAQ,MAAM,CAAC;AAAA,MACxC;AAAA,IACF,MAAM,SAAS,KAAK,OAAO,WAAW,YAAY;AAAA,IAClD,IAAI;AAAA,MAAQ,KAAK,eAAe,MAAM;AAAA,IACtC,MAAM,SAAS,KAAK,OAAO,WAAW,QAAQ;AAAA,IAC9C,IAAI,CAAC;AAAA,MAAQ,KAAK,UAAU,aAAa,uBAAa;AAAA,IACtD,MAAM,OAAO,KAAK,KAAK,YAAY,MAAM,GAAG,UAAU,MAAM;AAAA,IAC5D,KAAK,MAAM,IAAI;AAAA,IACf,OAAO;AAAA;AAAA,EAED,gBAAgB,CAAC,WAAiC;AAAA,IAGxD,WAAW,SAAS,KAAK,MAAM,UAAU,SAAS;AAAA,MAChD,WAAW,UAAU,MAAM,YAAY,SAAS;AAAA,QAC9C,IAAI,GAAG,yBAAyB,MAAM;AAAA,UACpC,KAAK,QAAQ,0EAAwB;AAAA,QACvC,IACE,GAAG,sBAAsB,MAAM,KAC/B,OAAO,eACP,CAAC,OAAO,WAAW,KACjB,CAAC,aAAa,SAAS,SAAS,GAAG,WAAW,aAChD;AAAA,UAEA,KAAK,QAAQ,wHAA8B;AAAA,MAC/C;AAAA,IAIF,WAAW,OAAO;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,GAAG;AAAA,MACD,MAAM,SAAS,KAAK,OAAO,WAAW,GAAG;AAAA,MACzC,IACE,WACC,CAAC,GAAG,oBAAoB,OAAO,WAAW,KACzC,OAAO,YAAY,MAAM,WAAW;AAAA,QAEtC,KACE,OAAO,aACP,sEAAe,6BACjB;AAAA,IACJ;AAAA;AAAA,EAEM,cAAc,CAAC,QAA2B;AAAA,IAChD,MAAM,cAAc,OAAO;AAAA,IAC3B,IAAI,CAAC,GAAG,oBAAoB,WAAW,KAAK,CAAC,YAAY;AAAA,MACvD,KAAK,aAAa,gFAAyB;AAAA,IAC7C,WAAW,aAAa,YAAY,KAAK,YAAY;AAAA,MACnD,IACE,GAAG,sBAAsB,SAAS,KAClC,GAAG,iBAAiB,UAAU,UAAU,KACxC,GAAG,2BAA2B,UAAU,WAAW,UAAU,KAC7D,UAAU,WAAW,WAAW,WAAW,SACzC,GAAG,WAAW,gBAChB,UAAU,WAAW,WAAW,KAAK,SAAS,gBAC9C,CAAC,UAAU,WAAW,UAAU;AAAA,QAEhC,KAAK,eAAe,KAAK,OAAO,QAAQ,YAAY,CAAC;AAAA,MAErD;AAAA,aACE,WACA,yJACF;AAAA,IACJ;AAAA;AAAA,EAEM,OAAO,CAAC,YAA2B,UAA6B;AAAA,IACtE,MAAM,OAAO,OAAO,UAAU;AAAA,IAC9B,IACE,GAAG,2BAA2B,IAAI,KAClC,GAAG,2BAA2B,KAAK,UAAU,KAC7C,KAAK,WAAW,WAAW,SAAS,GAAG,WAAW,aAClD;AAAA,MACA,MAAM,QAAQ,KAAK,WAAW,KAAK;AAAA,MACnC,MAAM,MAAM,KAAK,KAAK;AAAA,MACtB,IAAI,UAAU,SAAS;AAAA,QACrB,MAAM,SAAS,SAAS,MAAM,IAAI,GAAG;AAAA,QACrC,IAAI,CAAC;AAAA,UAAQ,KAAK,MAAM,kCAAc,KAAK;AAAA,QAC3C,OAAO,EAAE,MAAM,SAAS,KAAK,OAAO;AAAA,MACtC;AAAA,MACA,IAAI,UAAU,SAAS;AAAA,QACrB,MAAM,UAAU,SAAS,MAAM,IAAI,GAAG;AAAA,QACtC,IAAI,CAAC;AAAA,UAAS,KAAK,MAAM,kCAAc,KAAK;AAAA,QAC5C,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,OAAO,EAAE,MAAM,WAAW,OAAO,KAAK,QAAQ,IAAI,EAAE;AAAA;AAAA,EAE9C,IAAI,CACV,YACA,UACkB;AAAA,IAClB,MAAM,QAAQ,KAAK,QAAQ,YAAY,QAAQ;AAAA,IAC/C,IAAI,MAAM,SAAS;AAAA,MAAS,OAAO,CAAC,KAAK;AAAA,IACzC,IAAI,OAAO,MAAM,UAAU;AAAA,MACzB,OAAO,CAAC,EAAE,MAAM,WAAW,OAAO,OAAO,MAAM,KAAK,EAAE,CAAC;AAAA,IACzD,MAAM,SAA2B,CAAC;AAAA,IAClC,MAAM,UAAU;AAAA,IAChB,IAAI,SAAS;AAAA,IACb,IAAI;AAAA,IACJ,OAAQ,QAAQ,QAAQ,KAAK,MAAM,KAAK,GAAI;AAAA,MAC1C,IAAI,MAAM,QAAQ;AAAA,QAChB,OAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,OAAO,MAAM,MAAM,MAAM,QAAQ,MAAM,KAAK;AAAA,QAC9C,CAAC;AAAA,MACH,MAAM,MAAM,MAAM,GAAG,KAAK;AAAA,MAC1B,MAAM,SAAS,SAAS,MAAM,IAAI,GAAG;AAAA,MACrC,MAAM,OAAO,SAAS,MAAM,IAAI,GAAG;AAAA,MACnC,IAAI;AAAA,QAAQ,OAAO,KAAK,EAAE,MAAM,SAAS,KAAK,OAAO,CAAC;AAAA,MACjD,SAAI;AAAA,QACP,OAAO,KACL,KAAK,SAAS,UACV,OACA,EAAE,MAAM,WAAW,OAAO,OAAO,KAAK,KAAK,EAAE,CACnD;AAAA,MACG;AAAA,aAAK,YAAY,iFAAoC,KAAK;AAAA,MAC/D,SAAS,QAAQ;AAAA,IACnB;AAAA,IACA,IAAI,SAAS,MAAM,MAAM,UAAU,CAAC,OAAO;AAAA,MACzC,OAAO,KAAK,EAAE,MAAM,WAAW,OAAO,MAAM,MAAM,MAAM,MAAM,EAAE,CAAC;AAAA,IACnE,OAAO;AAAA;AAAA,EAED,KAAK,CACX,MACA,UACsB;AAAA,IACtB,MAAM,SAAS,IAAI;AAAA,IACnB,IAAI,CAAC;AAAA,MAAM,OAAO;AAAA,IAClB,WAAW,KAAK,OAAO,MAAM,oBAAU,EAAE,YAAY;AAAA,MACnD,IAAI,CAAC,GAAG,qBAAqB,CAAC;AAAA,QAAG,KAAK,GAAG,+DAAkB;AAAA,MAC3D,OAAO,IAAI,KAAK,EAAE,IAAI,GAAG,KAAK,QAAQ,EAAE,aAAa,QAAQ,CAAC;AAAA,IAChE;AAAA,IACA,OAAO;AAAA;AAAA,EAED,KAAK,CAAC,OAA2D;AAAA,IACvE,IAAI,CAAC;AAAA,MAAO;AAAA,IACZ,MAAM,IAAI,OAAO,OAAO,aAAa;AAAA,IACrC,WAAW,SAAS,EAAE;AAAA,MACpB,IAAI,GAAG,mBAAmB,KAAK,KAAK,KAAK,MAAM,IAAI,MAAM;AAAA,QACvD,KAAK,OAAO,mDAA0B;AAAA,IAC1C,MAAM,QAAQ,SAAS,GAAG,OAAO;AAAA,IACjC,IAAI,CAAC;AAAA,MAAO;AAAA,IACZ,MAAM,MAAuC,CAAC;AAAA,IAC9C,WAAW,QAAQ,OAAO,OAAO,OAAO,EAAE,YAAY;AAAA,MACpD,IAAI,CAAC,GAAG,qBAAqB,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,KAAK,IAAI,CAAC;AAAA,QAC/D,KAAK,MAAM,8DAAY;AAAA,MACzB,MAAM,MAAM,KAAK,KAAK,IAAI,GACxB,QAAQ,KAAK,QAAQ,KAAK,WAAW;AAAA,MACvC,IACE,CAAC,SAAS,mBAAmB,cAAc,WAAW,EAAE,SAAS,GAAG,MACnE,OAAO,UAAU,YAAY,OAAO,UAAU;AAAA,QAE/C,IAAI,OAAO;AAAA,MACR,SAAI,OAAO,UAAU;AAAA,QAAU,IAAI,OAAO;AAAA,MAC1C,SAAI,OAAO,UAAU,YAAY,kBAAkB,KAAK,KAAK;AAAA,QAChE,IAAI,OAAO,WAAW,KAAK;AAAA,MACxB;AAAA,aAAK,MAAM,gBAAM,6CAAe;AAAA,IACvC;AAAA,IACA,OAAO;AAAA;AAAA,EAED,IAAI,CACV,YACA,UACA,OACY;AAAA,IACZ,MAAM,OAAO,OAAO,UAAU;AAAA,IAC9B,IAAI,KACF,OACA,UACA;AAAA,IACF,IACE,GAAG,iBAAiB,IAAI,KACxB,KAAK,cAAc,MAAM,iBAAiB,GAC1C;AAAA,MACA,MAAM,QAAQ,KAAK,UAAU;AAAA,MAC7B,IAAI,CAAC;AAAA,QAAO,KAAK,MAAM,sDAAwB;AAAA,MAC/C,IAAI,GAAG,0BAA0B,OAAO,KAAK,CAAC,GAAG;AAAA,QAC/C,IAAI,KAAK,UAAU,WAAW;AAAA,UAC5B,KAAK,MAAM,0EAAuC;AAAA,QACpD,OAAO,KAAK,cACV,OAAO,KAAK,GACZ,QACF;AAAA,MACF;AAAA,MACA,IAAI,KAAK,UAAU,SAAS;AAAA,QAC1B,KAAK,MAAM,0FAA8B;AAAA,MAC3C,MAAM,YAAY,KAAK,MAAM,QAAQ,OAAO,MAAM,cAAc,CAAC;AAAA,MACjE,IAAI,CAAC,aAAa,CAAC,KAAK,MAAM,YAAY,SAAS;AAAA,QACjD,KAAK,MAAM,kEAA0B;AAAA,MACvC,OAAO,KAAK,SAAS,WAAW,KAAK,MAAM,KAAK,UAAU,IAAI,QAAQ,CAAC;AAAA,IACzE,EAAO,SAAI,GAAG,iBAAiB,IAAI,KAAK,KAAK,cAAc,MAAM,GAAG,GAAG;AAAA,MACrE,IAAI,KAAK,UAAU,SAAS;AAAA,QAAG,KAAK,MAAM,oDAAiB;AAAA,MAC3D,CAAC,KAAK,OAAO,UAAU,SAAS,IAAI,KAAK;AAAA,IAC3C,EAAO,SAAI,GAAG,0BAA0B,IAAI,GAAG;AAAA,MAC7C,IAAI,SAAS,MAAM,WAAW;AAAA,QAC5B,OAAO,KAAK,cAAc,MAAM,QAAQ;AAAA,MAC1C,WAAW,KAAK,KAAK;AAAA,QACnB,IACE,GAAG,mBAAmB,CAAC,KACvB,CAAC,CAAC,OAAO,SAAS,YAAY,WAAW,EAAE,SAAS,KAAK,EAAE,IAAI,CAAC;AAAA,UAEhE,KAAK,GAAG,+DAAuB;AAAA,MACnC,MAAM,SAAS,MAAM,KAAK;AAAA,MAC1B,QAAQ,SAAS,MAAM,OAAO;AAAA,MAC9B,WAAW,SAAS,MAAM,UAAU;AAAA,MACpC,YAAY,SAAS,MAAM,WAAW;AAAA,IACxC,EAAO,SACL,GAAG,iBAAiB,IAAI,KACxB,GAAG,2BAA2B,KAAK,UAAU,KAC7C,KAAK,WAAW,WAAW,SAAS,GAAG,WAAW,gBAClD,KAAK,WAAW,KAAK,SAAS,YAC9B,CAAC,KAAK,UAAU,QAChB;AAAA,MACA,MAAM,SAAS,KAAK,OAAO,OAAO,QAAQ;AAAA,MAC1C,OAAO,KAAK,KAAK,YAAY,MAAM,GAAG,UAAU,MAAM;AAAA,IACxD,EAAO;AAAA,aAAO,KAAK,MAAM,2EAAmC;AAAA,IAC5D,IAAI,CAAC;AAAA,MAAK,KAAK,MAAM,wBAAc;AAAA,IACnC,MAAM,UAAU,KAAK,QAAQ,GAAG;AAAA,IAChC,IAAI,OAAO,YAAY;AAAA,MAAU,KAAK,KAAK,gDAAkB;AAAA,IAC7D,MAAM,QAAQ,KAAK,MAAM,KAAK;AAAA,IAC9B,IAAI,SAAmC,CAAC;AAAA,IACxC,IAAI,UAAU;AAAA,MACZ,MAAM,QAAQ,OAAO,QAAQ;AAAA,MAC7B,IAAI,CAAC,GAAG,yBAAyB,KAAK;AAAA,QACpC,KAAK,UAAU,qDAAkB;AAAA,MACnC,SAAS,MAAM;AAAA,IACjB;AAAA,IACA,IAAI,WAAW,IAAI,OAAO,GAAG;AAAA,MAC3B,IAAI;AAAA,QAAW,KAAK,WAAW,sDAAmB;AAAA,MAClD,OAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU,OAAO,IAAI,CAAC,UAAU,KAAK,KAAK,OAAO,UAAU,KAAK,CAAC;AAAA,WAC7D,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,YAAY;AAAA,MACpC,KAAK,KAAK,qDAAa,SAAS;AAAA,IAClC,MAAM,QAAQ,OAAO,QAAQ,CAAC,UAAU,KAAK,KAAK,OAAO,QAAQ,CAAC;AAAA,IAClE,IAAI,YAAY;AAAA,MACd,OAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA,QAAQ,KAAK,MAAM,WAAW,QAAQ;AAAA,WAClC,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,MAC3B;AAAA,IACF,IAAI;AAAA,MAAW,KAAK,WAAW,sDAAmB;AAAA,IAClD,OAAO,EAAE,MAAM,QAAQ,UAAW,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAG;AAAA;AAAA,EAEpD,aAAa,CACnB,SACA,UACY;AAAA,IACZ,WAAW,KAAK,QAAQ;AAAA,MACtB,IACE,GAAG,mBAAmB,CAAC,KACvB,CAAC,CAAC,aAAa,OAAO,EAAE,SAAS,KAAK,EAAE,IAAI,CAAC;AAAA,QAE7C,KAAK,GAAG,2FAAoC;AAAA,IAChD,MAAM,YAAY,SAAS,SAAS,WAAW;AAAA,IAC/C,MAAM,YACJ,aAAa,KAAK,MAAM,QAAQ,WAAW,UAAU,cAAc,CAAC;AAAA,IACtE,IAAI,CAAC,aAAa,CAAC,KAAK,MAAM,YAAY,SAAS;AAAA,MACjD,KAAK,SAAS,kEAA0B;AAAA,IAC1C,OAAO,KAAK,SACV,WACA,KAAK,MAAM,SAAS,SAAS,OAAO,GAAG,QAAQ,CACjD;AAAA;AAAA,EAEM,KAAK,CACX,WACA,UACc;AAAA,IACd,MAAM,UAAU,OAAO,WAAW,wBAAwB;AAAA,IAC1D,WAAW,KAAK,QAAQ;AAAA,MACtB,IAAI,GAAG,mBAAmB,CAAC,KAAK,KAAK,EAAE,IAAI,MAAM;AAAA,QAC/C,KAAK,GAAG,oCAAqB;AAAA,IACjC,MAAM,UAAU,SAAS,SAAS,OAAO;AAAA,IACzC,IAAI,CAAC,WAAW,CAAC,GAAG,gBAAgB,OAAO,KAAK,QAAQ,WAAW;AAAA,MACjE,KAAK,SAAS,8CAA+B;AAAA,IAC/C,MAAM,OAAO,QAAQ;AAAA,IACrB,MAAM,OACJ,GAAG,QAAQ,IAAI,KACf,KAAK,WAAW,WAAW,KAC3B,GAAG,sBAAsB,KAAK,WAAW,EAAE,IACvC,KAAK,WAAW,GAAG,aACnB;AAAA,IACN,IACE,CAAC,GAAG,iBAAiB,IAAI,KACzB,CAAC,GAAG,2BAA2B,KAAK,UAAU,KAC9C,KAAK,WAAW,WAAW,SAAS,GAAG,WAAW,eAClD,KAAK,UAAU;AAAA,MAEf,KAAK,SAAS,oDAA2B;AAAA,IAC3C,MAAM,SAAS,KAAK,OAAO,SAAS,WAAW,KAAK,WAAW,KAAK,IAAI;AAAA,IACxE,IAAI,CAAC;AAAA,MAAQ,KAAK,MAAM,sCAAa;AAAA,IACrC,OAAO,KAAK,OAAO,QAAQ,UAAU,IAAI,GAAK;AAAA;AAAA,EAExC,MAAM,CACZ,QACA,UACA,QACc;AAAA,IACd,IAAI,OAAO,IAAI,OAAO,WAAW;AAAA,MAC/B,KAAK,OAAO,aAAa,kDAAU;AAAA,IACrC,MAAM,cAAc,OAAO;AAAA,IAC3B,IACE,CAAC,GAAG,oBAAoB,WAAW,KACnC,CAAC,YAAY,QACb,YAAY,WAAW,UACvB,YAAY,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,WAAW,YAAY;AAAA,MAExE,KAAK,aAAa,sFAAgB;AAAA,IACpC,MAAM,OAAO,IAAI,IAAI,CAAC,GAAG,QAAQ,WAAW,CAAC;AAAA,IAC7C,MAAM,UAA0B,CAAC;AAAA,IACjC,WAAW,aAAa,YAAY,KAAK,YAAY;AAAA,MACnD,IAAI,CAAC,GAAG,sBAAsB,SAAS;AAAA,QACrC,KAAK,WAAW,wDAAW;AAAA,MAC7B,MAAM,aAAa,OAAO,UAAU,UAAU;AAAA,MAC9C,IACE,GAAG,iBAAiB,UAAU,KAC9B,GAAG,2BAA2B,WAAW,UAAU,KACnD,CAAC,WAAW,UAAU,QACtB;AAAA,QACA,MAAM,SAAS,WAAW;AAAA,QAC1B,IAAI;AAAA,QACJ,IAAI,OAAO,WAAW,SAAS,GAAG,WAAW;AAAA,UAC3C,SAAS,KAAK,OAAO,QAAQ,OAAO,KAAK,IAAI;AAAA,QAC1C,SAAI,OAAO,WAAW,SAAS,GAAG,WAAW;AAAA,UAChD,SAAS,KAAK,OAAO,SAAS,WAAW,OAAO,KAAK,IAAI;AAAA,QAC3D,IAAI,CAAC;AAAA,UAAQ,KAAK,YAAY,wDAAW;AAAA,QACzC,QAAQ,KAAK,KAAK,OAAO,QAAQ,UAAU,IAAI,CAAC;AAAA,QAChD;AAAA,MACF;AAAA,MACA,IACE,GAAG,mBAAmB,UAAU,KAChC,GAAG,2BAA2B,WAAW,IAAI,KAC7C,GAAG,2BAA2B,WAAW,KAAK,UAAU,KACxD,WAAW,KAAK,WAAW,WAAW,SACpC,GAAG,WAAW,eAChB,WAAW,KAAK,WAAW,KAAK,SAAS,SACzC;AAAA,QACA,MAAM,MAAM,SAAS,MAAM,IAAI,WAAW,KAAK,KAAK,IAAI;AAAA,QACxD,IAAI,CAAC;AAAA,UAAK,KAAK,WAAW,MAAM,kDAAe;AAAA,QAC/C,MAAM,QAAQ,KAAK,QAAQ,WAAW,KAAK;AAAA,QAC3C,MAAM,WAAW,WAAW,cAAc;AAAA,QAC1C,MAAM,UAAU,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG,EAAG;AAAA,QACvD,KACG,aAAa,GAAG,WAAW,mBAC1B,aAAa,GAAG,WAAW,qBAC7B,OAAO,UAAU,YACjB,OAAO,YAAY;AAAA,UAEnB,QAAQ,KAAK;AAAA,YACX,MAAM;AAAA,YACN;AAAA,YACA,IAAI,aAAa,GAAG,WAAW,mBAAmB,CAAC,QAAQ;AAAA,UAC7D,CAAC;AAAA,QACE,SACH,aAAa,GAAG,WAAW,eAC3B,OAAO,UAAU,OAAO;AAAA,UAExB,QAAQ,KAAK,EAAE,MAAM,eAAe,KAAK,MAAM,CAAC;AAAA,QAC7C;AAAA,eAAK,YAAY,wGAAmB;AAAA,QACzC;AAAA,MACF;AAAA,MACA,KAAK,YAAY,wDAAW;AAAA,IAC9B;AAAA,IACA,IAAI,CAAC,QAAQ;AAAA,MAAQ,KAAK,aAAa,kDAAU;AAAA,IACjD,OAAO,QAAQ,WAAW,IAAI,QAAQ,KAAK,EAAE,MAAM,YAAY,QAAQ;AAAA;AAE3E;;;ADrzBA,IAAM,cAAa,IAAI,IAAI,CAAC,QAAQ,QAAQ,KAAK,CAAC;AAClD,IAAM,QAAO,IAAI,IAAI,CAAC,QAAQ,QAAQ,KAAK,IAAI,CAAC;AAChD,IAAM,aAAa,IAAI,IAAI,CAAC,SAAS,mBAAmB,YAAY,cAAc,WAAW,UAAU,SAAS,UAAU,gBAAgB,WAAW,CAAC;AAEtJ,eAAsB,mBAAmB,CACvC,OACA,QACA,eACuB;AAAA,EACvB,IAAI,CAAC,YAAW,KAAK;AAAA,IAAG,MAAM,YAAY,OAAO,sCAAQ;AAAA,EACzD,IAAI,QAAQ;AAAA,IACV,MAAM,SAAS,oBAAoB,OAAO,QAAQ,aAAa;AAAA,IAC/D,IAAI;AAAA,MAAQ,OAAO;AAAA,EACrB;AAAA,EACA,MAAM,MAAK,MAAM,eAAe;AAAA,EAChC,MAAM,SAAS,IAAG,iBAChB,OACA,cAAa,OAAO,MAAM,GAC1B,IAAG,aAAa,QAChB,IACF;AAAA,EACA,MAAM,YAAY,OAAO,WAAW,KAAK,CAAC,MACxC,IAAG,mBAAmB,CAAC,CACzB;AAAA,EACA,IAAI,CAAC;AAAA,IAAW,MAAM,YAAY,OAAO,qCAAiB;AAAA,EAC1D,MAAM,QAAQ,UAAU,KAAI,WAAW,KAAK;AAAA,EAC5C,MAAM,UAAU,IAAI;AAAA,EACpB,WAAW,UAAU,UAAU;AAAA,IAC7B,IAAI,IAAG,oBAAoB,MAAM,KAAK,IAAG,aAAa,OAAO,IAAI,GAAG;AAAA,MAClE,MAAM,SAAS,WAAW,KAAI,QAAQ,KAAK;AAAA,MAC3C,IAAI;AAAA,QAAQ,QAAQ,IAAI,OAAO,KAAK,MAAM,MAAM;AAAA,IAClD;AAAA,EACF,MAAM,SAAS,UAAU,QAAQ,KAC/B,CAAC,MACC,IAAG,oBAAoB,CAAC,KAAK,EAAE,KAAK,QAAQ,MAAM,MAAM,QAC5D;AAAA,EACA,MAAM,QAAQ,QAAQ,MAAM,WAAW,KAAK,IAAG,iBAAiB,GAAG;AAAA,EACnE,IAAI,CAAC,SAAS,CAAC,IAAG,0BAA0B,KAAK;AAAA,IAC/C,MAAM,YAAY,OAAO,kEAA0B;AAAA,EACrD,MAAM,OAAO,SACX,KACA,OACA,OACA,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,KAAK,GAAG,CAAC,GACrC,OACF;AAAA,EACA,IAAI,KAAK,SAAS;AAAA,IAChB,MAAM,YAAY,OAAO,8DAAY;AAAA,EACvC,OAAO,EAAE,MAAM,UAAU,MAAM,QAAQ,OAAO,OAAO,KAAK;AAAA;AAG5D,SAAS,SAAS,CAAC,KAAoB,WAAqC,MAAkC;AAAA,EAC5G,MAAM,SAAS,UAAU,QAAQ,KAAK,CAAC,MAAsC,IAAG,oBAAoB,CAAC,KAAK,EAAE,KAAK,QAAQ,MAAM,WAAW;AAAA,EAC1I,MAAM,QAAQ,QAAQ,MAAM,WAAW,KAAK,IAAG,iBAAiB,GAAG;AAAA,EACnE,IAAI,CAAC;AAAA,IAAO,OAAO,CAAC;AAAA,EACpB,IAAI,CAAC,IAAG,0BAA0B,KAAK;AAAA,IAAG,MAAM,YAAY,MAAM,oEAAuB;AAAA,EACzF,OAAO,MAAM,WAAW,IAAI,CAAC,SAAS;AAAA,IACpC,IAAI,CAAC,IAAG,qBAAqB,IAAI,KAAK,CAAC,IAAG,aAAa,KAAK,IAAI;AAAA,MAAG,MAAM,YAAY,MAAM,8DAAiB;AAAA,IAC5G,MAAM,UAAU,aAAa,KAAI,KAAK,WAAW;AAAA,IACjD,IAAI,YAAY;AAAA,MAAW,MAAM,YAAY,MAAM,SAAS,KAAK,KAAK,2CAAa;AAAA,IACnF,OAAO,EAAE,KAAK,KAAK,KAAK,MAAM,OAAO,QAAQ;AAAA,GAC9C;AAAA;AAGH,SAAS,UAAU,CAAC,KAAoB,QAAmC,MAAwC;AAAA,EACjH,MAAM,aAAa,OAAO,MAAM,WAAW;AAAA,EAC3C,IAAI,CAAC,cAAc,CAAC,IAAG,sBAAsB,UAAU,KAAK,CAAC,IAAG,mBAAmB,WAAW,UAAU;AAAA,IAAG;AAAA,EAC3G,MAAM,SAAS,WAAW;AAAA,EAC1B,IAAI,CAAC,IAAG,2BAA2B,OAAO,IAAI,KAAK,CAAC,IAAG,2BAA2B,OAAO,KAAK,UAAU,KAAK,OAAO,KAAK,WAAW,WAAW,SAAS,IAAG,WAAW,eAAe,OAAO,KAAK,WAAW,KAAK,SAAS;AAAA,IAAS;AAAA,EACnO,MAAM,QAAQ,aAAa,KAAI,OAAO,KAAK;AAAA,EAAG,MAAM,MAAM,OAAO,KAAK,KAAK;AAAA,EAC3E,KAAK,OAAO,cAAc,SAAS,IAAG,WAAW,mBAAmB,OAAO,cAAc,SAAS,IAAG,WAAW,qBAAqB,OAAO,UAAU;AAAA,IAAU,OAAO,EAAE,MAAM,aAAa,KAAK,IAAI,OAAO,cAAc,SAAS,IAAG,WAAW,mBAAmB,CAAC,QAAQ,MAAM;AAAA,EACnR,IAAI,OAAO,cAAc,SAAS,IAAG,WAAW,eAAe,UAAU;AAAA,IAAW,OAAO,EAAE,MAAM,eAAe,KAAK,MAAM;AAAA,EAC7H,MAAM,YAAY,MAAM,gBAAM,OAAO,KAAK,QAAQ,8CAAW;AAAA;AAG/D,SAAS,QAAQ,CAAC,KAAoB,MAAuC,MAAc,OAAoB,SAAgD;AAAA,EAC7J,MAAM,MAAM,YAAY,KAAI,IAAI,KAAI,MAAM,KAAK,GAAG,MAAM,WAAW;AAAA,EACnE,MAAM,QAAQ,UAAU,KAAI,IAAI,KAAI,MAAM,OAAO,GAAG,IAAI;AAAA,EACxD,MAAM,WAAW,IAAI,KAAI,MAAM,UAAU;AAAA,EACzC,MAAM,aAAa,YAAY,IAAG,yBAAyB,QAAQ,IAAI,CAAC,GAAG,SAAS,QAAQ,EAAE,OAAO,IAAG,YAAY,IAAI,CAAC;AAAA,EACzH,IAAI,YAAW,IAAI,GAAG;AAAA,IAAG,OAAO,EAAE,MAAM,aAAa,UAAU,WAAW,IAAI,CAAC,UAAU;AAAA,MACvF,IAAI,CAAC,IAAG,0BAA0B,KAAK;AAAA,QAAG,MAAM,YAAY,MAAM,4DAAyB;AAAA,MAC3F,OAAO,SAAS,KAAI,OAAO,MAAM,OAAO,OAAO;AAAA,KAChD,MAAO,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAG;AAAA,EAChC,MAAM,QAAQ,WAAW,QAAQ,CAAC,UAAU,SAAS,KAAI,OAAO,MAAM,KAAK,CAAC;AAAA,EAC5E,IAAI,MAAK,IAAI,GAAG;AAAA,IAAG,OAAO,EAAE,MAAM,QAAQ,UAAW,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAG;AAAA,EAC7E,IAAI,QAAQ;AAAA,IAAU,OAAO,EAAE,MAAM,UAAU,OAAO,QAAQ,UAAU,KAAI,IAAI,KAAI,MAAM,WAAW,GAAG,MAAM,OAAO,MAAO,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAG;AAAA,EACpJ,MAAM,YAAY,MAAM,qDAAa,KAAK;AAAA;AAG5C,SAAS,QAAQ,CAAC,KAAoB,YAAgC,MAAc,OAAsC;AAAA,EACxH,MAAM,QAAQ,aAAa,KAAI,UAAU;AAAA,EAAG,IAAI,OAAO,UAAU;AAAA,IAAU,MAAM,YAAY,MAAM,8EAAuB;AAAA,EAC1H,MAAM,SAA2B,CAAC;AAAA,EAAG,MAAM,UAAU;AAAA,EAAgB,IAAI,SAAS;AAAA,EAAG,IAAI;AAAA,EACzF,OAAQ,QAAQ,QAAQ,KAAK,KAAK,GAAI;AAAA,IAAE,IAAI,MAAM,QAAQ;AAAA,MAAQ,OAAO,KAAK,EAAE,MAAM,WAAW,OAAO,MAAM,MAAM,QAAQ,MAAM,KAAK,EAAE,CAAC;AAAA,IAAG,MAAM,MAAM,MAAM;AAAA,IAAI,IAAI,CAAC,qBAAqB,KAAK,GAAG,KAAK,CAAC,MAAM,IAAI,GAAG;AAAA,MAAG,MAAM,YAAY,MAAM,wEAA2B;AAAA,IAAG,OAAO,KAAK,EAAE,MAAM,SAAS,IAAI,CAAC;AAAA,IAAG,SAAS,QAAQ;AAAA,EAAW;AAAA,EAClV,IAAI,SAAS,MAAM,UAAU,OAAO,WAAW;AAAA,IAAG,OAAO,KAAK,EAAE,MAAM,WAAW,OAAO,MAAM,MAAM,MAAM,EAAE,CAAC;AAAA,EAAG,OAAO;AAAA;AAGzH,SAAS,SAAS,CAAC,KAAoB,WAA2C,MAAc,SAAkD;AAAA,EAChJ,IAAI,CAAC,aAAa,CAAC,IAAG,0BAA0B,SAAS;AAAA,IAAG,MAAM,YAAY,MAAM,iDAA6B;AAAA,EACjH,MAAM,UAAU,IAAI,KAAI,WAAW,OAAO;AAAA,EAC1C,MAAM,OAAO,WAAW,IAAG,gBAAgB,OAAO,IAAI,QAAQ,OAAO;AAAA,EACrE,MAAM,aAAa,QAAQ,IAAG,iBAAiB,IAAI,IAAI,OAAO,QAAQ,IAAG,QAAQ,IAAI,KAAK,IAAG,sBAAsB,KAAK,WAAW,EAAE,IAAI,KAAK,WAAW,GAAG,aAAa;AAAA,EACzK,IAAI,CAAC,cAAc,CAAC,IAAG,iBAAiB,UAAU,KAAK,CAAC,IAAG,2BAA2B,WAAW,UAAU,KAAK,WAAW,WAAW,WAAW,SAAS,IAAG,WAAW;AAAA,IAAa,MAAM,YAAY,MAAM,oDAA2B;AAAA,EACxO,MAAM,SAAS,QAAQ,IAAI,WAAW,WAAW,KAAK,IAAI;AAAA,EAAG,IAAI,CAAC;AAAA,IAAQ,MAAM,YAAY,MAAM,sBAAY,WAAW,WAAW,KAAK,iDAAc;AAAA,EAAG,OAAO;AAAA;AAGnK,SAAS,SAAS,CAAC,KAAoB,OAAuC,MAAuC;AAAA,EACnH,IAAI,CAAC,SAAS,CAAC,IAAG,0BAA0B,KAAK;AAAA,IAAG;AAAA,EAAkB,MAAM,QAAQ,IAAI,KAAI,OAAO,OAAO;AAAA,EAAG,IAAI,CAAC,SAAS,CAAC,IAAG,0BAA0B,KAAK;AAAA,IAAG;AAAA,EACjK,MAAM,MAAuC,CAAC;AAAA,EAAG,WAAW,QAAQ,MAAM,YAAY;AAAA,IAAE,IAAI,CAAC,IAAG,qBAAqB,IAAI,KAAK,CAAC,IAAG,aAAa,KAAK,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,KAAK,IAAI;AAAA,MAAG,MAAM,YAAY,MAAM,8DAAY;AAAA,IAAG,MAAM,QAAQ,aAAa,KAAI,KAAK,WAAW;AAAA,IAAG,MAAM,UAAU,KAAK,KAAK,SAAS,WAAW,KAAK,KAAK,SAAS,qBAAqB,KAAK,KAAK,SAAS,gBAAgB,KAAK,KAAK,SAAS;AAAA,IAAa,IAAI,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;AAAA,MAAE,IAAI,KAAK,KAAK,QAAQ;AAAA,MAAO;AAAA,IAAU;AAAA,IAAE,IAAI,OAAO,UAAU,YAAY,EAAE,OAAO,UAAU,YAAY,kBAAkB,KAAK,KAAK;AAAA,MAAI,MAAM,YAAY,MAAM,gBAAM,KAAK,KAAK,8CAAgB;AAAA,IAAG,IAAI,KAAK,KAAK,QAAQ,OAAO,UAAU,WAAW,OAAO,WAAW,KAAK,IAAI;AAAA,EAAO;AAAA,EAAE,OAAO;AAAA;AAG9xB,SAAS,GAAG,CAAC,KAAoB,MAAuC,OAA8C;AAAA,EAAE,MAAM,OAAO,KAAK,WAAW,KAAK,CAAC,MAAM,IAAG,qBAAqB,CAAC,KAAK,EAAE,KAAK,QAAQ,EAAE,QAAQ,SAAS,EAAE,MAAM,KAAI;AAAA,EAAG,OAAO,QAAQ,IAAG,qBAAqB,IAAI,IAAI,KAAK,cAAc;AAAA;AAClT,SAAS,WAAW,CAAC,KAAoB,YAA4C,MAAc,OAAuB;AAAA,EAAE,MAAM,QAAQ,cAAc,aAAa,KAAI,UAAU;AAAA,EAAG,IAAI,OAAO,UAAU;AAAA,IAAU,MAAM,YAAY,MAAM,GAAG,4CAAc;AAAA,EAAG,OAAO;AAAA;AACxQ,SAAS,YAAY,CAAC,KAAoB,OAAkE;AAAA,EAAE,IAAI,IAAG,gBAAgB,KAAK,KAAK,IAAG,gCAAgC,KAAK;AAAA,IAAG,OAAO,MAAM;AAAA,EAAM,IAAI,IAAG,iBAAiB,KAAK;AAAA,IAAG,OAAO,OAAO,MAAM,IAAI;AAAA,EAAG,IAAI,MAAM,SAAS,IAAG,WAAW;AAAA,IAAa,OAAO;AAAA,EAAM,IAAI,MAAM,SAAS,IAAG,WAAW;AAAA,IAAc,OAAO;AAAA,EAAO;AAAA;;;AF5GhY,eAAsB,cAAc,CAClC,QACA,SACsB;AAAA,EACtB,IAAI,CAAC,OAAO;AAAA,IAAK,MAAM,IAAI,MAAM,sCAAsC;AAAA,EACvE,MAAM,UAAU,OAAO,OAAO,OAAO,IAAI,KAAK;AAAA,EAC9C,IAAI,QAAQ,WAAW;AAAA,IACrB,MAAM,YAAY,OAAO,OAAO,yEAAkB;AAAA,EACpD,MAAM,cAAwB,CAAC;AAAA,EAC/B,MAAM,SAAS,MAAM,oBAAoB,QAAQ,IAAI,QAAQ,CAAC,UAC5D,YAAY,KAAK,GAAG,KAAK,CAC3B;AAAA,EACA,OAAO,gBACL;AAAA,IACE,MAAM,OAAO;AAAA,IACb,QAAQ,OAAO,IAAI;AAAA,IACnB,gBAAgB,gBAAgB,QAAQ,SAAS;AAAA,MAC/C,OAAO,IAAI;AAAA,MACX,GAAG;AAAA,IACL,CAAC;AAAA,EACH,GACA,CAAC,WAAW,kBAAkB,QAAQ,SAAS,QAAQ,MAAM,CAC/D;AAAA;AAGF,eAAe,iBAAiB,CAC9B,QACA,SACA,QACA,QACsB;AAAA,EACtB,MAAM,MAAM,OAAO;AAAA,EACnB,MAAM,QAAQ,QAAQ,gBAAgB,QAAQ,GAAG;AAAA,EACjD,IAAI,IAAI,SAAS,WAAW;AAAA,IAC1B,MAAM,GAAG,QAAQ,4CACf,GAAG,KAAK,UAAU,EAAE,MAAM,IAAI,KAAK,GAAG,MAAM,CAAC;AAAA;AAAA,EACjD;AAAA,EACA,MAAM,cAAwB,CAAC;AAAA,EAC/B,YAAY,WAAU,YAAY,OAAO,QAAQ,KAAK,EAAE,KAAK,EAAE,KAAK,OAClE,EAAE,cAAc,CAAC,CACnB,GAAG;AAAA,IACD,MAAM,SAAS,gBAAgB,QAAQ,SAAQ;AAAA,IAC/C,MAAM,OAAM,SAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,IAChD,MAAM,WAAU,QAAQ,SAAS,MAAM;AAAA,IACvC,YAAY,KAAK,MAAM;AAAA,EACzB;AAAA,EACA,IAAI,YAAW,IAAI,SAAS;AAAA,IAC1B,MAAM,GACJ,IAAI,WACJ,gBAAgB,QAAQ,QAAQ,iBAAiB,GACjD,EAAE,WAAW,KAAK,CACpB;AAAA,EACF,OAAO,EAAE,MAAM,OAAO,MAAM,QAAQ,SAAQ,MAAM,GAAG,YAAY;AAAA;;;AI5D5D,MAAM,UAAiC;AAAA,EACR;AAAA,EAA7B,WAAW,CAAkB,SAAwB;AAAA,IAAxB;AAAA;AAAA,MACzB,IAAI,GAAe;AAAA,IAAE,OAAO,KAAK,QAAQ;AAAA;AAAA,MACzC,KAAK,GAAW;AAAA,IAAE,OAAO,KAAK,QAAQ;AAAA;AAAA,EAC1C,KAAK,CAAC,QAAwB,UAA8C;AAAA,IAAE,OAAO,eAAe,QAAQ,KAAK,OAAO;AAAA;AACjI;;;ACRA,SAAS,IAAI,CAAC,OAAyB,UAA8C;AAAA,EACnF,IAAI,aAAa,SAAS;AAAA,IACxB,MAAM,QAAQ,MAAM,IAAI,CAAC,SAAS,KAAK,SAAS,YAAY,KAAK,QAAQ,MAAM,KAAK,MAAM,EAAE,KAAK,EAAE;AAAA,IACnG,OAAO,IAAI,MAAM,QAAQ,MAAM,MAAK;AAAA,EACtC;AAAA,EACA,IAAI,aAAa,UAAU;AAAA,IACzB,OAAO,KAAK,UAAU,MAAM,IAAI,CAAC,SAAS,KAAK,SAAS,YAAY,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,KAAK,EAAE,CAAC;AAAA,EAC3G;AAAA,EACA,OAAO,MAAM,IAAI,CAAC,SAAS,KAAK,SAAS,YAAY,KAAK,UAAU,KAAK,KAAK,IAAI,QAAQ,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK;AAAA;AAEvH,SAAS,MAAM,CAAC,MAA+C,UAA8C;AAAA,EAC3G,OAAO,aAAa,KAAK,QAAQ,QAAQ;AAAA;AAE3C,SAAS,YAAY,CAAC,SAAsB,UAA8C;AAAA,EACxF,IAAI,QAAO,SAAS;AAAA,IAAY,OAAO,QAAO,QAAQ,IAAI,UAAQ,aAAa,MAAM,QAAQ,CAAC,EAAE,KAAK,IAAI;AAAA,EACzG,MAAM,SAAS,aAAa,QAAQ,QAAQ,QAAO,QAAQ,QAAO;AAAA,EAClE,OAAO,QAAO,SAAS,cAAc,GAAG,UAAU,QAAO,MAAM,IAAI,OAAO,QAAQ,KAAK,IAAI,QAAO,EAAE,MAAM,GAAG,YAAY,OAAO,QAAO,UAAU,WAAW,KAAK,UAAU,QAAO,KAAK,IAAI,QAAO;AAAA;AAEpM,SAAS,SAAS,CAAC,MAAkB,SAAS,QAAgB;AAAA,EAC5D,IAAI,KAAK,SAAS;AAAA,IAAa,OAAO,GAAG;AAAA,EAAmB,KAAK,SAAS,IAAI,CAAC,UAAU,UAAU,OAAO,GAAG,UAAU,CAAC,EAAE,KAAK;AAAA,CAAI;AAAA,EAAM;AAAA,EACzI,IAAI,KAAK,SAAS;AAAA,IAAQ,OAAO,GAAG,cAAc,KAAK,KAAK,OAAO,OAAO;AAAA,EAC1E,OAAO,GAAG,gBAAgB,KAAK,KAAK,OAAO,OAAO,QAAQ,OAAO,MAAM,OAAO;AAAA;AAEhF,SAAS,UAAU,CAAC,MAAkB,SAAS,QAAgB;AAAA,EAC7D,IAAI,KAAK,SAAS;AAAA,IAAa,OAAO,GAAG;AAAA,EAAmB,KAAK,SAAS,IAAI,CAAC,UAAU,WAAW,OAAO,GAAG,UAAU,CAAC,EAAE,KAAK;AAAA,CAAI;AAAA,EAAM;AAAA,EAC1I,IAAI,KAAK,SAAS;AAAA,IAAQ,OAAO,GAAG,cAAc,KAAK,KAAK,OAAO,QAAQ;AAAA,EAC3E,OAAO,GAAG,4BAA4B,OAAO,MAAM,QAAQ,eAAe,KAAK,KAAK,OAAO,QAAQ;AAAA;AAErG,SAAS,OAAO,CAAC,MAAkB,SAAS,QAAgB;AAAA,EAC1D,IAAI,KAAK,SAAS;AAAA,IAAa,OAAO,GAAG;AAAA,EAAqB,KAAK,SAAS,IAAI,CAAC,UAAU,QAAQ,OAAO,GAAG,UAAU,CAAC,EAAE,KAAK;AAAA,CAAI;AAAA,EAAM;AAAA,EACzI,IAAI,KAAK,SAAS;AAAA,IAAQ,OAAO,GAAG,cAAc,KAAK,KAAK,OAAO,KAAK;AAAA,EACxE,OAAO,GAAG,gBAAgB,KAAK,KAAK,OAAO,KAAK,sBAAsB,OAAO,MAAM,KAAK;AAAA;AAE1F,SAAS,UAAU,CAAC,QAA8B;AAAA,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC,SAAS,wBAAwB,KAAK,QAAQ,OAAO,KAAK,UAAU,WAAW,QAAQ,OAAO,KAAK,UAAU,YAAY,SAAS,cAAc,KAAK,UAAU,KAAK,KAAK,GAAG,EAAE,KAAK;AAAA,CAAI;AAAA;AACpQ,SAAS,WAAW,CAAC,QAA8B;AAAA,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC,SAAS,WAAW,KAAK,oCAAoC,KAAK,UAAU,KAAK,KAAK,MAAM,EAAE,KAAK;AAAA,CAAI;AAAA;AACrL,SAAS,QAAQ,CAAC,QAA8B;AAAA,EAAE,OAAO,OAAO,MAAM,IAAI,CAAC,SAAS,YAAY,KAAK,QAAQ,OAAO,KAAK,UAAU,WAAW,WAAW,OAAO,KAAK,UAAU,YAAY,YAAY,cAAc,KAAK,UAAU,KAAK,KAAK,GAAG,EAAE,KAAK;AAAA,CAAI;AAAA;AAErP,IAAM,cAA6B;AAAA,EACxC,IAAI;AAAA,EAAW,OAAO;AAAA,EAAuB,mBAAmB;AAAA,EAChE,eAAe,CAAC,QAAQ,QAAQ;AAAA,IAC9B,OAAO;AAAA,MACL,iCAAiC;AAAA;AAAA;AAAA;AAAA,MACjC,iCAAiC;AAAA;AAAA;AAAA,EAAiD,WAAW,MAAM;AAAA;AAAA,EAA+B,UAAU,OAAO,IAAI;AAAA;AAAA;AAAA;AAAA,MACvJ,yCAAyC,aAAa,MAAM;AAAA,MAC5D,6CAA6C;AAAA;AAAA,IAC/C;AAAA;AAEJ;AAEA,SAAS,YAAY,CAAC,QAAmF;AAAA,EACvG,MAAM,cAAc,OAAO,QAAQ,QAAQ,MAAM,MAAK;AAAA,EACtD,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uPA+C8O,OAAO,mDAAmD,OAAO,6BAA6B;AAAA,yPAC5F,OAAO,mDAAmD,OAAO,6BAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAahV,IAAM,kBAAiC;AAAA,EAC5C,IAAI;AAAA,EAAe,OAAO;AAAA,EAAmC,mBAAmB;AAAA,EAChF,eAAe,CAAC,QAAQ,QAAQ;AAAA,IAC9B,MAAM,MAAM,OAAO,SAAS,QAAQ,mBAAmB,GAAG;AAAA,IAAG,MAAM,OAAO,IAAI,QAAQ,OAAO,GAAG;AAAA,IAChG,OAAO;AAAA,MACL,uBAAuB,uBAAuB,OAAO;AAAA;AAAA;AAAA,MACrD,oBAAoB;AAAA;AAAA,MACpB,wBAAwB;AAAA;AAAA,MACxB,oCAAoC,sBAAsB,+FAA+F,OAAO;AAAA;AAAA,OAC/J,qBAAqB,yBAAyB,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAA4X,YAAY,MAAM;AAAA,EAAM,WAAW,OAAO,IAAI;AAAA;AAAA;AAAA,IACte;AAAA;AAEJ;AAEO,IAAM,kBAAiC;AAAA,EAC5C,IAAI;AAAA,EAAe,OAAO;AAAA,EAA2B,mBAAmB;AAAA,EACxE,eAAe,CAAC,QAAQ,QAAQ;AAAA,IAC9B,OAAO;AAAA,MACL,sBAAsB,6BAA6B,OAAO;AAAA;AAAA,MAC1D,+CAA+C,gDAAgD,OAAO;AAAA;AAAA,MACtG,+BAA+B;AAAA;AAAA,MAC/B,oDAAoD;AAAA;AAAA;AAAA,MACpD,sCAAsC;AAAA;AAAA;AAAA,EAAuC,SAAS,MAAM;AAAA;AAAA,EAAmB,QAAQ,OAAO,IAAI;AAAA;AAAA;AAAA;AAAA,IACpI;AAAA;AAEJ;;;AC1HO,MAAM,eAAe;AAAA,EACT,UAAU,IAAI;AAAA,EAExB,WAAW,GAAG;AAAA,IACnB,KAAK,SAAS,IAAI,SAAW;AAAA,IAC7B,KAAK,SAAS,cAAc;AAAA,IAC5B,KAAK,SAAS,cAAc;AAAA,IAC5B,KAAK,SAAS,iBAAiB;AAAA,IAC/B,KAAK,SAAS,mBAAmB;AAAA,IACjC,KAAK,SAAS,IAAI,UAAU,WAAW,CAAC;AAAA,IACxC,KAAK,SAAS,IAAI,UAAU,eAAe,CAAC;AAAA,IAC5C,KAAK,SAAS,IAAI,UAAU,eAAe,CAAC;AAAA;AAAA,EAGvC,QAAQ,CAAC,QAA2B;AAAA,IACzC,KAAK,QAAQ,IAAI,OAAO,MAAM,MAAM;AAAA;AAAA,EAG/B,OAAO,CAAC,MAA+B;AAAA,IAC5C,MAAM,SAAS,KAAK,QAAQ,IAAI,IAAI;AAAA,IACpC,IAAI,CAAC,QAAQ;AAAA,MACX,MAAM,IAAI,MAAM,yBAAyB,MAAM;AAAA,IACjD;AAAA,IACA,OAAO;AAAA;AAAA,EAGF,mBAAmB,GAAkB;AAAA,IAC1C,OAAO,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC;AAAA;AAEpC;AAEO,IAAM,iBAAiB,IAAI;;;AChDlC;AACA,oBAAS,wBAAS,yBAAY,sBAAU,iBAAS;AAejD,eAAsB,KAAK,CAAC,UAAwB,CAAC,GAAyB;AAAA,EAC5E,OAAO,gBAAgB,MAAM,cAAc,OAAO,GAAG,OAAO;AAAA;AAI9D,eAAsB,eAAe,CACnC,QACA,UAAwB,CAAC,GACH;AAAA,EAEtB,IAAI,QAAQ,SAAS;AAAA,IACnB,OAAO,aAAa,MAAM;AAAA,EAC5B;AAAA,EAEA,MAAM,SAAS,eAAe,QAAQ,OAAO,MAAM;AAAA,EACnD,OAAO,OAAO,MAAM,QAAQ,OAAO;AAAA;AAGrC,eAAe,YAAY,CACzB,QACsB;AAAA,EACtB,MAAM,UAAU,OAAO;AAAA,EACvB,IAAI,CAAC,SAAS;AAAA,IACZ,MAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AAAA,EAEA,MAAM,eAAe,QAAQ,MACzB,MAAM,QAAQ,IAAI,QAAQ,UAAU,IAAI,sBAAsB,CAAC,IAC/D,CAAC;AAAA,EACL,MAAM,iBAAiB,gBACrB,QACA,CAAC,QAAQ,KAAK,GACd,CAAC,GAAG,QAAQ,WAAW,GAAG,aAAa,QAAQ,CAAC,YAAY,QAAQ,MAAM,CAAC,CAC7E;AAAA,EACA,OAAO,gBACL;AAAA,IACE,MAAM,OAAO;AAAA,IACb,QAAQ,QAAQ;AAAA,IAChB;AAAA,EACF,GACA,OAAO,WAAW;AAAA,IAChB,MAAM,oBAAoB,aAAa,QAAQ,CAAC,YAC9C,iBAAiB,SAAS,QAAQ,QAAQ,MAAM,CAClD;AAAA,IACA,MAAM,SAAS,QAAQ,UAAU,QAAQ,IAAI,oBAAoB;AAAA,IACjE,MAAM,SAAS,yBAAyB;AAAA,IACxC,MAAM,SAAS,MAAM,IAAI,MAAM;AAAA,MAC7B,aAAa,CAAC,QAAQ,KAAK;AAAA,MAC3B,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS,CAAC,OAAO,MAAM;AAAA,MACvB,MAAM,SAAQ,QAAQ,KAAK;AAAA,MAC3B,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,WAAW,QAAQ,YAAY,WAAW;AAAA,MAC1C,WAAW,QAAQ;AAAA,MACnB;AAAA,MACA,UAAU,QAAQ;AAAA,MAClB,OAAO;AAAA,IACT,CAAC;AAAA,IAED,IAAI,CAAC,OAAO,WAAW,OAAO,QAAQ,WAAW,GAAG;AAAA,MAClD,MAAM,IAAI,MACR;AAAA,EAAsC,OAAO,KAC1C,IAAI,CAAC,QAAQ,IAAI,OAAO,EACxB,KAAK;AAAA,CAAI,GACd;AAAA,IACF;AAAA,IAEA,eAAe,KAAK,GAAG,OAAO,MAAM,MAAM,CAAC;AAAA,IAC3C,MAAM,cAAc;AAAA,MAClB,GAAG;AAAA,MACH,GAAG,OAAO,QAAQ,IAAI,CAAC,WAAW,SAAQ,OAAO,IAAI,CAAC;AAAA,IACxD;AAAA,IACA,OAAO;AAAA,MACL,MAAM,OAAO;AAAA,MACb;AAAA,MACA,aAAa,CAAC,GAAG,IAAI,IAAI,WAAW,CAAC;AAAA,IACvC;AAAA,GAEJ;AAAA;AAWF,eAAe,sBAAsB,CACnC,YAC6B;AAAA,EAC7B,MAAM,MAAK,MAAM,eAAe;AAAA,EAChC,MAAM,SAAS,IAAI;AAAA,EACnB,MAAM,cAAuC,CAAC;AAAA,EAC9C,MAAM,SAAS,IAAG,iCAChB,YACA,CAAC,GACD;AAAA,OACK,IAAG;AAAA,IACN,UAAU,CAAC,SAAS;AAAA,MAClB,OAAO,IAAI,SAAQ,IAAI,CAAC;AAAA,MACxB,OAAO,IAAG,IAAI,SAAS,IAAI;AAAA;AAAA,IAE7B,qCAAqC,CAAC,eAAe;AAAA,MACnD,YAAY,KAAK,UAAU;AAAA;AAAA,EAE/B,CACF;AAAA,EACA,IAAI,CAAC;AAAA,IAAQ,MAAM,iBAAiB,KAAI,YAAY,WAAW;AAAA,EAC/D,MAAM,UAAU,IAAG,cAAc;AAAA,IAC/B,WAAW,OAAO;AAAA,IAClB,SAAS,OAAO;AAAA,IAChB,mBAAmB,OAAO;AAAA,EAC5B,CAAC;AAAA,EACD,WAAW,UAAU,QAAQ,eAAe;AAAA,IAC1C,OAAO,IAAI,SAAQ,OAAO,QAAQ,CAAC;AAAA,EACrC,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa,CAAC,GAAG,aAAa,GAAG,OAAO,MAAM;AAAA,IAC9C,QAAQ,CAAC,GAAG,MAAM;AAAA,IAClB;AAAA,EACF;AAAA;AAGF,SAAS,gBAAgB,CACvB,SACA,aACA,SACU;AAAA,EACV,QAAQ,SAAI,SAAS,eAAe;AAAA,EACpC,MAAM,cAAc;AAAA,IAClB,GAAG,QAAQ;AAAA,IACX,GAAG,IAAG,sBAAsB,OAAO;AAAA,EACrC;AAAA,EACA,IACE,YAAY,KACV,CAAC,eAAe,WAAW,aAAa,IAAG,mBAAmB,KAChE,GACA;AAAA,IACA,MAAM,iBAAiB,KAAI,YAAY,WAAW;AAAA,EACpD;AAAA,EACA,MAAM,SAAmB,CAAC;AAAA,EAI1B,MAAM,UAAU,QAAQ,KAAK,WAAW,CAAC,MAAM,SAAS,kBAAkB;AAAA,IACxE,MAAM,OAAO,UAAS,aAAa,SAAQ,IAAI,CAAC;AAAA,IAChD,IACE,SAAS,MACT,SAAS,QACT,KAAK,WAAW,KAAK,MAAK,KAC1B,YAAW,IAAI,GACf;AAAA,MACA,MAAM,IAAI,MACR,gFAAgF,SAAS,aAC3F;AAAA,IACF;AAAA,IACA,MAAM,SAAS,SAAQ,SAAS,IAAI;AAAA,IACpC,UAAU,SAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,IAC9C,cAAc,QAAQ,GAAG,gBAAgB,WAAW,KAAK,SAAS;AAAA,IAClE,OAAO,KAAK,MAAM;AAAA,GACnB;AAAA,EACD,IACE,QAAQ,eACR,QAAQ,YAAY,KAClB,CAAC,eAAe,WAAW,aAAa,IAAG,mBAAmB,KAChE,GACA;AAAA,IACA,MAAM,iBAAiB,KAAI,YAAY,QAAQ,WAAW;AAAA,EAC5D;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,gBAAgB,CACvB,KACA,YACA,aACO;AAAA,EACP,OAAO,IAAI,MACT,qCAAqC;AAAA,EAAgB,IAAG,kBACtD,aACA;AAAA,IACE,sBAAsB,CAAC,SAAS;AAAA,IAChC,qBAAqB,MAAM,SAAQ,UAAU;AAAA,IAC7C,YAAY,MAAM;AAAA;AAAA,EACpB,CACF,GACF;AAAA;;;AC/MF,qBAAS,kBAAU;AAwDnB,eAAsB,gBAAgB,CACpC,UAAgC,CAAC,GACE;AAAA,EACnC,OAAO,2BAA2B,MAAM,cAAc,OAAO,CAAC;AAAA;AAIzD,SAAS,0BAA0B,CACxC,QAC0B;AAAA,EAC1B,MAAM,SAAS,sBAAsB,OAAO,QAAQ,EAAE;AAAA,EACtD,MAAM,QACJ,WAAW,gBACN,OAAO,IAAI,SAAS,OAAO,QAC5B,WAAW,QACR,OAAO,KAAK,SAAS,OAAO,QAC7B,OAAO;AAAA,EACf,MAAM,UAAU,CAAC,GAAG,IAAI,IAAI,OAAO,OAAO,KAAK,CAAC,CAAC;AAAA,EAGjD,MAAM,WACJ,WAAW,QAAQ,QAAQ,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO;AAAA,EAC/D,MAAM,OAAO,cAAc,OAAO,IAAI;AAAA,EACtC,MAAM,aAAa,CAAC,SAClB,UAAS,MAAM,cAAc,IAAI,CAAC,EAAE,MAAM,IAAG,EAAE,KAAK,GAAG;AAAA,EACzD,MAAM,WAAW,CAAC,cAAuD;AAAA,IACvE,MAAM,QAAQ,UAAU,OAAO,8BAC7B,UAAU,YAAY,SAAS,UAAU,MAAM,CACjD;AAAA,IACA,OAAO;AAAA,MACL,QAAQ,WAAW,UAAU,QAAQ;AAAA,MACrC,WAAW,UAAU;AAAA,MACrB,MAAM,MAAM,OAAO;AAAA,MACnB,QAAQ,MAAM,YAAY;AAAA,IAC5B;AAAA;AAAA,EAEF,MAAM,aAA4C,CAAC;AAAA,EACnD,WAAW,WAAW,UAAU;AAAA,IAC9B,MAAM,QAAQ,qBAAqB;AAAA,MACjC,MAAM,OAAO;AAAA,MACb,aAAa;AAAA,MACb,UAAU,OAAO;AAAA,MACjB,SAAS,OAAO,YAAY;AAAA,MAC5B,SAAS,OAAO,YAAY;AAAA,IAC9B,CAAC;AAAA,IACD,MAAM,cAAc,QAAQ,IAAI,UAAU,EAAE,KAAK;AAAA,IACjD,WAAW,aAAa,MAAM,SAAS;AAAA,MACrC,IAAI,CAAC,MAAM,YAAY,SAAS,KAAK,MAAM,SAAS,SAAS,EAAE;AAAA,QAC7D;AAAA,MACF,MAAM,WAAW,MAAM,SAAS,SAAS;AAAA,MAEzC,IAAI,SAAS,WAAW;AAAA,QAAY;AAAA,MACpC,WAAW,KAAK;AAAA,QACd;AAAA,QACA,WAAW,SAAS,SAAS;AAAA,QAC7B,gBAAgB,SAAS,iBACrB,SAAS,SAAS,cAAc,IAChC;AAAA,QACJ,QAAQ,SAAS;AAAA,QACjB,YAAY,SAAS,WAClB,IAAI,CAAC,eAAe;AAAA,aAChB,SAAS,SAAS;AAAA,UACrB,WAAW,CAAC,GAAG,MAAM,SAAS,SAAS,EAAE,SAAS,EAAE,KAAK;AAAA,QAC3D,EAAE,EACD,KAAK,gBAAgB;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EACA,WAAW,KACT,CAAC,MAAM,UACL,YAAY,KAAK,YAAY,KAAK,MAAI,GAAG,MAAM,YAAY,KAAK,MAAI,CAAC,KACrE,iBAAiB,KAAK,WAAW,MAAM,SAAS,CACpD;AAAA,EACA,OAAO;AAAA,IACL,UAAU,OAAO;AAAA,IACjB,OAAO;AAAA,IACP;AAAA,EACF;AAAA;AAGF,SAAS,WAAW,CAAC,MAAc,OAAuB;AAAA,EACxD,OAAO,OAAO,QAAQ,KAAK,OAAO,QAAQ,IAAI;AAAA;AAGhD,SAAS,gBAAgB,CACvB,MACA,OACQ;AAAA,EACR,OACE,YAAY,KAAK,QAAQ,MAAM,MAAM,KACrC,KAAK,OAAO,MAAM,QAClB,KAAK,SAAS,MAAM,UACpB,YAAY,KAAK,WAAW,MAAM,SAAS;AAAA;AAKxC,SAAS,8BAA8B,CAC5C,QACQ;AAAA,EACR,MAAM,WAAW,CAAC,UAChB,GAAG,MAAM,cAAc,MAAM,UAAU,MAAM,QAAQ,MAAM;AAAA,EAC7D,OAAO;AAAA,IACL,iCAAiC,OAAO;AAAA,IACxC;AAAA,IACA,GAAI,OAAO,WAAW,SAClB,OAAO,WAAW,QAAQ,CAAC,QAAQ;AAAA,MACjC,GAAG,SAAS,IAAI,SAAS,QAAQ,IAAI,iBAAiB,SAAS,IAAI,cAAc,IAAI,gBAAgB,IAAI;AAAA,MACzG,kBAAkB,IAAI,YAAY,KAAK,IAAI;AAAA,MAC3C,GAAI,IAAI,WAAW,SACf;AAAA,QACE,iBAAiB,IAAI,WAAW,IAAI,CAAC,cAAc,GAAG,SAAS,SAAS,MAAM,UAAU,UAAU,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI;AAAA,MAC5H,IACA,CAAC;AAAA,IACP,CAAC,IACD,CAAC,oCAAoC;AAAA,EAC3C,EAAE,KAAK;AAAA,CAAI;AAAA;;;AC5Kb,uBAAS,0BAAY,6BAAW;AAChC,qBAAS,sBAAU;;;ACWnB,IAAM,YAAwB;AAAA,EAC5B;AAAA,IACE,WAAW;AAAA,IACX,WAAW;AAAA,IACX,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,WAAW;AAAA,IACX,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,WAAW;AAAA,IACX,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,WAAW;AAAA,IACX,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,WAAW;AAAA,IACX,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,WAAW;AAAA,IACX,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,WAAW;AAAA,IACX,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,WAAW;AAAA,IACX,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,WAAW;AAAA,IACX,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AACF;AAEA,SAAS,UAAU,CAAC,OAAe,aAAa,WAAmB;AAAA,EACjE,OAAO;AAAA;AAAA,0EAEiE;AAAA;AAAA;AAAA,qBAGrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAQd,SAAS,aAAa,CAC3B,OACA,kBACA,YACgB;AAAA,EAChB,OAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,SACE,KAAK,UACH;AAAA,QACE;AAAA,QACA,SAAS;AAAA,QACT,MAAM;AAAA,QACN,SAAS;AAAA,UACP,KAAK;AAAA,UACL,cAAc;AAAA,UACd,UAAU;AAAA,UACV,OAAO;AAAA,UACP,aAAa;AAAA,UACb,gBAAgB;AAAA,UAChB,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,gBAAgB;AAAA,UAChB,mBACE;AAAA,UACF,qBACE;AAAA,UACF,aAAa;AAAA,UACb,iBAAiB;AAAA,UACjB,iBAAiB;AAAA,UACjB,WAAW;AAAA,QACb;AAAA,QACA,cAAc,EAAE,UAAU,IAAI,mBAAmB;AAAA,QACjD,iBAAiB;AAAA,UACf,gBAAgB,IAAI;AAAA,UACpB,YAAY;AAAA,QACd;AAAA,MACF,GACA,MACA,CACF,IAAI;AAAA;AAAA,IACR;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE,KAAK,UACH;AAAA,QACE,iBAAiB;AAAA,UACf,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,kBAAkB;AAAA,UAClB,KAAK,CAAC,UAAU,OAAO,cAAc;AAAA,UACrC,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,sBAAsB;AAAA,QACxB;AAAA,QACA,SAAS,CAAC,YAAY,oBAAoB;AAAA,MAC5C,GACA,MACA,CACF,IAAI;AAAA;AAAA,IACR;AAAA,IACA,EAAE,MAAM,cAAc,SAAS;AAAA;AAAA,EAAyB;AAAA,IACxD;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAkBX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWb,WAAW,aAAa;AAAA;AAAA;AAAA,IAGtB;AAAA,IACA,GAAG,UAAU,IAAI,CAAC,UAAU;AAAA,MAC1B,MAAM,uBAAuB,KAAK;AAAA,MAClC,SAAS,YAAY,KAAK;AAAA;AAAA;AAAA,GAG7B,KAAK;AAAA,eACO,KAAK;AAAA,EAClB,WAAW,KAAK,OAAO,KAAK,UAAU;AAAA;AAAA;AAAA,IAGpC,EAAE;AAAA,EACJ;AAAA;;;AD3MK,IAAM,6BAA6B;AAEnC,IAAM,uBAAuB;AAI7B,SAAS,aAAa,CAC3B,UAAgC,CAAC,GACZ;AAAA,EACrB,MAAM,OAAO,QAAQ,QAAQ,QAAQ,IAAI;AAAA,EACzC,MAAM,QAAO,QAAQ,QAAQ,UAAS,IAAI;AAAA,EAC1C,MAAM,QAAQ,cACZ,OACA,4BACA,oBACF;AAAA,EAEA,MAAM,WAAW,MAAM,OAAO,CAAC,SAAS,YAAW,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC;AAAA,EACzE,IAAI,SAAS,SAAS,GAAG;AAAA,IACvB,MAAM,IAAI,MACR,0DAA0D,SACvD,IAAI,CAAC,SAAS,KAAK,IAAI,EACvB,KAAK,IAAI,GACd;AAAA,EACF;AAAA,EAEA,WAAU,KAAK,MAAM,KAAK,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EAChD,MAAM,UAAoB,CAAC;AAAA,EAC3B,WAAW,QAAQ,OAAO;AAAA,IACxB,WAAU,SAAQ,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,IAC7D,eAAc,KAAK,MAAM,KAAK,IAAI,GAAG,KAAK,SAAS;AAAA,MACjD,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AAAA,IACD,QAAQ,KAAK,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,OAAO,EAAE,MAAM,OAAO,QAAQ;AAAA;;;AEtDhC,uBAAS;AACT,uBAAS,6BAAY;AACrB,eAAS;AACT;AAAA,cACE;AAAA,aACA;AAAA;AAAA,gBAEA;AAAA,cACA;AAAA,aACA;AAAA,SACA;AAAA;;;ACRF,IAAM,qBAAqB,IAAI,IAAI;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AASM,SAAS,kBAAkB,CAChC,OACqD;AAAA,EACrD,MAAM,QAAQ,OAAO,QAAQ,SAAS,CAAC,CAAC,EACrC,IAAI,EAAE,QAAQ,aAAa,YAAY,QAAQ,OAAO,CAAC,EACvD,KAAK,CAAC,OAAO,WAAW,OAAO,OAAO,SAAS,MAAM,OAAO,MAAM;AAAA,EAErE,OAAO,OAAO,YAAY;AAAA,IACxB,MAAM,YAAY,IAAI,IAAI,QAAQ,GAAG;AAAA,IACrC,MAAM,OAAO,MAAM,KAAK,GAAG,aACzB,UAAU,SAAS,WAAW,MAAM,CACtC;AAAA,IAEA,IAAI,CAAC,MAAM;AAAA,MACT;AAAA,IACF;AAAA,IAEA,MAAM,SAAS,gBAAgB,MAAM,SAAS;AAAA,IAC9C,MAAM,UAAU,qBAAqB,SAAS,WAAW,MAAM,MAAM;AAAA,IACrE,MAAM,OACJ,QAAQ,WAAW,SAAS,QAAQ,WAAW,SAC3C,YACA,QAAQ;AAAA,IAEd,IAAI;AAAA,MACF,MAAM,WAAW,MAAM,MAAM,QAAQ;AAAA,QACnC,QAAQ,QAAQ;AAAA,QAChB;AAAA,QACA;AAAA,QACA,QAAQ,QAAQ;AAAA,QAChB,UAAU;AAAA,MACZ,CAAC;AAAA,MAED,OAAO,IAAI,SAAS,SAAS,MAAM;AAAA,QACjC,QAAQ,SAAS;AAAA,QACjB,YAAY,SAAS;AAAA,QACrB,SAAS,cAAc,SAAS,OAAO;AAAA,MACzC,CAAC;AAAA,MACD,MAAM;AAAA,MACN,OAAO,IAAI,SAAS,eAAe,EAAE,QAAQ,IAAI,CAAC;AAAA;AAAA;AAAA;AAKxD,SAAS,WAAW,CAAC,QAAgB,OAAyC;AAAA,EAC5E,MAAM,UAAU,OAAO,UAAU,WAAW,EAAE,QAAQ,MAAM,IAAI;AAAA,EAEhE,OAAO;AAAA,IACL;AAAA,IACA,QAAQ,IAAI,IAAI,QAAQ,MAAM;AAAA,IAC9B,cAAc,QAAQ,gBAAgB;AAAA,OAClC,QAAQ,YAAY,YAAY,CAAC,IAAI,EAAE,SAAS,QAAQ,QAAQ;AAAA,EACtE;AAAA;AAGF,SAAS,eAAe,CAAC,MAAiB,WAAqB;AAAA,EAC7D,MAAM,SAAS,IAAI,IAAI,KAAK,MAAM;AAAA,EAClC,MAAM,WAAW,KAAK,UAAU,UAAU,QAAQ,KAAK,UAAU;AAAA,EAEjE,OAAO,WAAW,cAAc,OAAO,UAAU,QAAQ;AAAA,EACzD,OAAO,SAAS,UAAU;AAAA,EAC1B,OAAO;AAAA;AAGT,SAAS,aAAa,CAAC,cAAsB,UAA0B;AAAA,EACrE,MAAM,OAAO,iBAAiB,MAAM,KAAK,aAAa,QAAQ,QAAQ,EAAE;AAAA,EACxE,MAAM,OAAO,SAAS,WAAW,GAAG,IAAI,WAAW,IAAI;AAAA,EAEvD,OAAO,GAAG,OAAO,UAAU;AAAA;AAG7B,SAAS,oBAAoB,CAC3B,SACA,WACA,MACA,QACS;AAAA,EACT,MAAM,UAAU,cAAc,QAAQ,OAAO;AAAA,EAC7C,MAAM,eAAe,QAAQ,QAAQ,IAAI,MAAM,KAAK,UAAU;AAAA,EAE9D,QAAQ,IAAI,QAAQ,KAAK,eAAe,OAAO,OAAO,YAAY;AAAA,EAClE,OAAO;AAAA;AAGT,SAAS,aAAa,CAAC,QAA0B;AAAA,EAC/C,MAAM,UAAU,IAAI,QAAQ,MAAM;AAAA,EAClC,MAAM,aAAa,QAAQ,IAAI,YAAY;AAAA,EAE3C,IAAI,YAAY;AAAA,IACd,WAAW,MAAM,GAAG,EAAE,QAAQ,CAAC,WAAW;AAAA,MACxC,MAAM,QAAO,OAAO,KAAK;AAAA,MACzB,IAAI,OAAM;AAAA,QACR,QAAQ,OAAO,KAAI;AAAA,MACrB;AAAA,KACD;AAAA,EACH;AAAA,EAEA,mBAAmB,QAAQ,CAAC,WAAW,QAAQ,OAAO,MAAM,CAAC;AAAA,EAC7D,OAAO;AAAA;;;ACtHT;AACA;AACA,uBAAS,qBAAY,mBAAM;AAE3B,IAAM,oCAAoC;AAC1C,IAAM,sBAAsB;AAC5B,IAAM,2BAA2B;AAc1B,SAAS,iBAAiB,CAAC,SAA0C;AAAA,EAC1E,MAAM,aAAa,QAAQ,cAAc;AAAA,EACzC,IAAI;AAAA,EACJ,MAAM,YAA+B,CAAC;AAAA,EAEtC,MAAM,iBAAiB,CAAC,iBAA+B;AAAA,IACrD,IAAI,OAAO;AAAA,MACT,aAAa,KAAK;AAAA,IACpB;AAAA,IACA,QAAQ,WAAW,MAAM;AAAA,MACvB,QAAQ;AAAA,MACR,QAAQ,SAAS,YAAY;AAAA,OAC5B,UAAU;AAAA;AAAA,EAGf,UAAU,KAAK,MAAM;AAAA,IACnB,IAAI,OAAO;AAAA,MACT,aAAa,KAAK;AAAA,IACpB;AAAA,GACD;AAAA,EAED,MAAM,gBAAgB,uBACpB,QAAQ,MACR,QAAQ,YACR,cACF;AAAA,EACA,IAAI,eAAe;AAAA,IACjB,UAAU,KAAK,aAAa;AAAA,EAC9B,EAAO;AAAA,IACL,UAAU,KACR,qBACE,QAAQ,MACR,QAAQ,YACR,QAAQ,kBAAkB,0BAC1B,cACF,CACF;AAAA;AAAA,EAGF,OAAO;AAAA,IACL,SAAS,MAAM;AAAA,MACb,UAAU,OAAO,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,YAAY,QAAQ,CAAC;AAAA;AAAA,EAEhE;AAAA;AAGF,SAAS,sBAAsB,CAC7B,MACA,YACA,kBAC0B;AAAA,EAC1B,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,UAAU,MAAM,MAAM,EAAE,WAAW,KAAK,GAAG,CAAC,QAAQ,aAAa;AAAA,MAC/D,IAAI,OAAO,aAAa,UAAU;AAAA,QAChC;AAAA,MACF;AAAA,MACA,MAAM,eAAe,eAAe,MAAM,QAAQ;AAAA,MAClD,IAAI,iBAAiB,aAAa,CAAC,WAAW,YAAY,GAAG;AAAA,QAC3D;AAAA,MACF;AAAA,MACA,iBAAiB,YAAY;AAAA,KAC9B;AAAA,IACD,OAAO,OAAgB;AAAA,IACvB,IAAI,4BAA4B,KAAK,GAAG;AAAA,MACtC;AAAA,IACF;AAAA,IACA,MAAM;AAAA;AAAA,EAGR,OAAO,MAAM,QAAQ,MAAM;AAAA;AAG7B,SAAS,oBAAoB,CAC3B,MACA,YACA,YACA,kBACY;AAAA,EACZ,IAAI,UAAU;AAAA,EACd,IAAI,WAAW,IAAI;AAAA,EACnB,IAAI;AAAA,EAEJ,MAAM,OAAO,YAA2B;AAAA,IACtC,IAAI,CAAC,SAAS;AAAA,MACZ;AAAA,IACF;AAAA,IACA,MAAM,OAAO,IAAI;AAAA,IACjB,IAAI;AAAA,MACF,MAAM,qBAAqB,MAAM,YAAY,IAAI;AAAA,MACjD,MAAM;AAAA,MACN;AAAA;AAAA,IAGF,IAAI;AAAA,IACJ,YAAY,cAAc,kBAAkB,MAAM;AAAA,MAChD,MAAM,WAAW,SAAS,IAAI,YAAY;AAAA,MAC1C,IACE,CAAC,YACD,SAAS,YAAY,cAAc,WACnC,SAAS,SAAS,cAAc,MAChC;AAAA,QACA,cAAc;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAAA,IACA,IAAI,gBAAgB,WAAW;AAAA,MAC7B,WAAW,gBAAgB,SAAS,KAAK,GAAG;AAAA,QAC1C,IAAI,CAAC,KAAK,IAAI,YAAY,GAAG;AAAA,UAC3B,cAAc;AAAA,UACd;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,WAAW;AAAA,IACX,IAAI,gBAAgB,WAAW;AAAA,MAC7B,iBAAiB,WAAW;AAAA,IAC9B;AAAA;AAAA,EAGG,KAAK;AAAA,EACV,QAAQ,YAAY,MAAM;AAAA,IACnB,KAAK;AAAA,KACT,UAAU;AAAA,EACb,IAAI,OAAO,MAAM,UAAU,YAAY;AAAA,IACrC,MAAM,MAAM;AAAA,EACd;AAAA,EAEA,OAAO,MAAM;AAAA,IACX,UAAU;AAAA,IACV,IAAI,OAAO;AAAA,MACT,cAAc,KAAK;AAAA,IACrB;AAAA;AAAA;AASJ,eAAe,oBAAoB,CACjC,MACA,YACA,QACe;AAAA,EACf,MAAM,qBAAqB,CAAC,EAAE;AAAA,EAC9B,OAAO,mBAAmB,SAAS,GAAG;AAAA,IACpC,MAAM,oBAAoB,mBAAmB,IAAI;AAAA,IACjD,IAAI,sBAAsB,WAAW;AAAA,MACnC;AAAA,IACF;AAAA,IACA,MAAM,oBAAoB,MAAK,MAAM,iBAAiB;AAAA,IACtD,IAAI;AAAA,IACJ,IAAI;AAAA,MACF,UAAU,MAAM,QAAQ,mBAAmB,EAAE,eAAe,KAAK,CAAC;AAAA,MAClE,MAAM;AAAA,MACN;AAAA;AAAA,IAGF,WAAW,SAAS,SAAS;AAAA,MAC3B,MAAM,eACJ,sBAAsB,KAAK,MAAM,OAAO,GAAG,qBAAqB,MAAM;AAAA,MACxE,IAAI,MAAM,YAAY,GAAG;AAAA,QACvB,mBAAmB,KAAK,YAAY;AAAA,QACpC;AAAA,MACF;AAAA,MACA,IAAI,CAAC,MAAM,OAAO,KAAK,CAAC,WAAW,YAAY,GAAG;AAAA,QAChD;AAAA,MACF;AAAA,MACA,IAAI;AAAA,QACF,MAAM,OAAO,MAAM,KAAK,MAAK,MAAM,YAAY,CAAC;AAAA,QAChD,OAAO,IAAI,cAAc,EAAE,SAAS,KAAK,SAAS,MAAM,KAAK,KAAK,CAAC;AAAA,QACnE,MAAM;AAAA,IAGV;AAAA,EACF;AAAA;AAGF,SAAS,cAAc,CAAC,MAAc,UAAsC;AAAA,EAC1E,MAAM,eAAe,YAAW,QAAQ,IACpC,UAAS,MAAM,QAAQ,IACvB,SAAS,MAAM,IAAI,EAAE,KAAK,GAAG;AAAA,EACjC,IAAI,iBAAiB,MAAM,iBAAiB,QAAQ,aAAa,WAAW,KAAK,GAAG;AAAA,IAClF;AAAA,EACF;AAAA,EACA,OAAO,aAAa,MAAM,IAAI,EAAE,KAAK,GAAG;AAAA;AAG1C,SAAS,2BAA2B,CAAC,OAAyB;AAAA,EAC5D,OACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,MAAM,SAAS;AAAA;;;AF9LnB,IAAM,yBAAyB;AAC/B,IAAM,wCACJ;AACF,IAAM,mBAAmB;AACzB,IAAM,kCAAkC;AACxC,IAAM,qBAAqB,IAAI,IAAI;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,yBAAyB,IAAI,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,4BAA4B;AAAA,EAChC;AAAA,EACA;AAAA,EACA,KAAK,UAAU,gBAAgB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,EAAE;AAQT,eAAsB,cAAc,CAClC,UAAiC,CAAC,GACd;AAAA,EACpB,IAAI,QAAQ,OAAO;AAAA,IACjB,OAAO,uBAAuB,OAAO;AAAA,EACvC;AAAA,EACA,MAAM,WAAW,MAAM,qBAAqB,SAAS,KAAK;AAAA,EAC1D,OAAO,mBACL,MAAM,UACN,MAAG;AAAA,IAAG;AAAA,GACR;AAAA;AAGF,eAAe,sBAAsB,CACnC,SACoB;AAAA,EACpB,IAAI,WAAW,MAAM,qBAAqB,SAAS,IAAI;AAAA,EACvD,IAAI,UAAU,qBAAqB,UAAU,QAAQ;AAAA,EAErD,eAAe,QAAQ,CAAC,aAAoC;AAAA,IAC1D,MAAM,aAAa,SAAS,OAAO;AAAA,IACnC,MAAM,qBACJ,eAAe,YACX,YACA,gBAAe,SAAS,OAAO,MAAM,UAAU;AAAA,IACrD,IAAI,uBAAuB,aAAa;AAAA,MACtC,MAAM,QAAQ;AAAA,MACd;AAAA,IACF;AAAA,IACA,MAAM,iBAAiB;AAAA;AAAA,EAGzB,eAAe,gBAAgB,GAAkB;AAAA,IAC/C,MAAM,UAAU,CAAC,GAAG,IAAI,IAAI,OAAO,OAAO,SAAS,OAAO,KAAK,CAAC,CAAC;AAAA,IACjE,SAAS,UAAU,OAAO;AAAA,IAC1B,WAAW,SAAS,SAAS;AAAA,MAC3B,MAAM,SAAS,MAAM,SAAS,UAAU,KAAK;AAAA,MAC7C,IAAI,kBAAkB,UAAU;AAAA,QAC9B,QAAQ,MACN,yDACF;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,SAAS,YAAY,UAAU;AAAA;AAAA,EAGjC,eAAe,OAAO,GAAkB;AAAA,IACtC,QAAQ,QAAQ;AAAA,IAChB,MAAM,SAAS,OAAO,KAAK,IAAI;AAAA,IAC/B,MAAM,SAAS,QAAQ;AAAA,IACvB,WAAW,MAAM,qBAAqB,SAAS,IAAI;AAAA,IACnD,UAAU,qBAAqB,UAAU,QAAQ;AAAA,IACjD,QAAQ,IACN,2CAA2C,SAAS,OAAO,YAAY,SAAS,OAAO,MACzF;AAAA;AAAA,EAGF,OAAO,mBACL,MAAM,UACN,MAAM,QAAQ,QAAQ,CACxB;AAAA;AAGF,SAAS,oBAAoB,CAC3B,UACA,UACa;AAAA,EACb,MAAM,OAAO,cAAa,SAAS,OAAO,IAAI;AAAA,EAC9C,MAAM,WAA0B,CAAC;AAAA,EACjC,IAAI;AAAA,IACF,SAAS,KACP,kBAAkB;AAAA,MAChB;AAAA,MACA,YAAY,CAAC,iBAAiB,cAAc,UAAU,YAAY;AAAA,MAClE,UAAU,CAAC,gBAAgB;AAAA,QACpB,SAAS,WAAW;AAAA;AAAA,IAE7B,CAAC,CACH;AAAA,IACA,WAAW,SAAS,4BAA4B,SAAS,QAAQ,IAAI,GAAG;AAAA,MACtE,MAAM,YAAY,SAAS,OAAO,YAAY,WAAW,CAAC,GAAG,IAC3D,CAAC,YAAY,IAAI,IAAI,KAAK,QAAQ,MAAM,IAAG,EAAE,KAAK,GAAG,CAAC,CACxD;AAAA,MACA,SAAS,KACP,kBAAkB;AAAA,QAChB,MAAM,MAAM;AAAA,QACZ,YAAY,CAAC,iBAAiB;AAAA,UAC5B,MAAM,OAAO,SAAQ,MAAM,MAAM,YAAY;AAAA,UAC7C,IACE,gBAAgB,MAAM,IAAI,KAC1B,CAAC,CAAC,OAAO,MAAM,EAAE,SAAS,QAAQ,IAAI,EAAE,YAAY,CAAC,KACrD,KAAK,SAAS,OAAO;AAAA,YAErB,OAAO;AAAA,UACT,IACE,KACG,MAAM,IAAG,EACT,KAAK,CAAC,YAAY,uBAAuB,IAAI,OAAO,CAAC;AAAA,YAExD,OAAO;AAAA,UACT,MAAM,WAAW,KAAK,MAAM,IAAG,EAAE,KAAK,GAAG;AAAA,UACzC,MAAM,UAAU,gBAAe,MAAM,IAAI;AAAA,UACzC,OACE,MAAM,SAAS,KAAK,CAAC,YAAY,QAAQ,MAAM,QAAQ,CAAC,KACxD,CAAC,SAAS,KACR,CAAC,YAAY,QAAQ,MAAM,OAAO,KAAK,QAAQ,MAAM,QAAQ,CAC/D;AAAA;AAAA,QAGJ,UAAU,CAAC,gBAAgB;AAAA,UACpB,SACH,gBAAe,MAAM,SAAQ,MAAM,MAAM,WAAW,CAAC,CACvD;AAAA;AAAA,MAEJ,CAAC,CACH;AAAA,IACF;AAAA,IACA,OAAO,OAAO;AAAA,IACd,SAAS,QAAQ,CAAC,YAAY,QAAQ,QAAQ,CAAC;AAAA,IAC/C,MAAM;AAAA;AAAA,EAER,OAAO;AAAA,IACL,SAAS,MAAM;AAAA,MACb,SACG,OAAO,CAAC,EACR,QAAQ,EACR,QAAQ,CAAC,YAAY,QAAQ,QAAQ,CAAC;AAAA;AAAA,EAE7C;AAAA;AAIF,SAAS,2BAA2B,CAClC,QACA,SAC0C;AAAA,EAC1C,MAAM,SAAmD,CAAC;AAAA,EAC1D,WAAW,WAAW,OAAO,YAAY,WAAW,CAAC,GAAG;AAAA,IACtD,MAAM,WAAW,SAAQ,OAAO,MAAM,OAAO;AAAA,IAC7C,MAAM,WAAW,SAAS,OAAO,YAAY;AAAA,IAC7C,MAAM,SAAS,WAAW,IAAI,WAAW,SAAS,MAAM,GAAG,QAAQ;AAAA,IACnE,MAAM,mBACJ,WAAW,MACT,YAAW,QAAQ,KAAK,SAAS,QAAQ,EAAE,YAAY,KACvD,CAAC,QAAQ,QAAQ;AAAA,IACrB,IAAI,YACF,WAAW,IACP,mBACE,WACA,SAAQ,QAAQ,IAClB,OAAO,SAAS,IAAG,IACjB,SACA,SAAQ,MAAM;AAAA,IACtB,OAAO,CAAC,YAAW,SAAS,GAAG;AAAA,MAC7B,MAAM,UAAS,SAAQ,SAAS;AAAA,MAChC,IAAI,YAAW;AAAA,QAAW;AAAA,MAC1B,YAAY;AAAA,IACd;AAAA,IACA,IAAI,CAAC,YAAW,SAAS,KAAK,CAAC,SAAS,SAAS,EAAE,YAAY;AAAA,MAAG;AAAA,IAClE,MAAM,YAAY,cAAa,SAAS;AAAA,IACxC,IAAI,gBAAgB,SAAS,SAAS;AAAA,MAAG;AAAA,IACzC,MAAM,cAAc,mBAChB,SAAQ,UAAU,MAAM,GAAG,IAC3B;AAAA,IACJ,MAAM,UAAU,IAAI,IAAI,KACtB,SAAQ,WAAW,UAAS,WAAW,WAAW,CAAC,EAAE,MAAM,IAAG,EAAE,KAAK,GAAG,CAC1E;AAAA,IACA,MAAM,SAAS,OAAO,KAAK,CAAC,UAC1B,gBAAgB,MAAM,MAAM,SAAS,CACvC;AAAA,IACA,IAAI,QAAQ;AAAA,MACV,OAAO,SAAS,KAAK,OAAO;AAAA,MAC5B;AAAA,IACF;AAAA,IACA,MAAM,SAAS,OAAO,OAAO,CAAC,UAC5B,gBAAgB,WAAW,MAAM,IAAI,CACvC;AAAA,IACA,WAAW,SAAS;AAAA,MAAQ,OAAO,OAAO,OAAO,QAAQ,KAAK,GAAG,CAAC;AAAA,IAClE,OAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,UAAU,CAAC,SAAS,GAAG,OAAO,QAAQ,CAAC,UAAU,MAAM,QAAQ,CAAC;AAAA,IAClE,CAAC;AAAA,EACH;AAAA,EACA,OAAO;AAAA;AAeT,eAAe,oBAAoB,CACjC,SACA,QAC4B;AAAA,EAC5B,MAAM,SAAS,MAAM,cAAc,OAAO;AAAA,EAC1C,IAAI,OAAO,WAAW,OAAO;AAAA,IAC3B,MAAM,IAAI,MACR,uEACF;AAAA,EACF;AAAA,EAGA,QAAQ,sBAAsB,MAAa;AAAA,EAC3C,YAAY,OAAO,UAAU,OAAO,QAAQ,OAAO,KAAK,GAAG;AAAA,IACzD,MAAM,kBAAkB,QAAQ,CAAC,GAAG,OAAO,KAAK;AAAA,EAClD;AAAA,EACA,MAAM,oBAAoB,SAAQ,OAAO,MAAM,QAAQ,OAAO,IAAI;AAAA,EAClE,MAAM,uBACJ,OAAO,MACP,mBACA,qCACF;AAAA,EACA,MAAM,QAAQ,mBAAmB,OAAO,OAAO,KAAK;AAAA,EACpD,MAAM,YAAY,mBAAmB;AAAA,EACrC,MAAM,gBAAgB,SAAQ,mBAAmB,SAAS;AAAA,EAC1D,MAAM,YAAY,IAAI;AAAA,EACtB,MAAM,eAAe,yBACnB,WACA,eACA,WACA,MACF;AAAA,EACA,MAAM,aAAa,SAAQ,oBAAoB,IAAI;AAAA,EACnD,MAAM,UAAU,IAAI;AAAA,EACpB,MAAM,eAAe,IAAI;AAAA,EAEzB,MAAM,YAAY,OAChB,OACA,UAAU,UACgC;AAAA,IAC1C,MAAM,SAAS,QAAQ,IAAI,KAAK;AAAA,IAChC,IAAI,UAAS,WAAW,aAAa,CAAC,aAAa,IAAI,KAAK,GAAG;AAAA,MAC7D,IAAI;AAAA,QAAS,OAAO,kBAAkB;AAAA,MACtC,OAAO;AAAA,IACT;AAAA,IACA,MAAM,SAAS,MAAM,aAAa,MAAM,KAAK;AAAA,IAC7C,IAAI,kBAAkB,UAAU;AAAA,MAC9B,IAAI,QAAO;AAAA,QACT,aAAa,IAAI,KAAK;AAAA,MACxB;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IACA,IAAI,QAAO;AAAA,MACT,QAAQ,IAAI,OAAO,MAAM;AAAA,MACzB,aAAa,OAAO,KAAK;AAAA,IAC3B;AAAA,IACA,IAAI;AAAA,MAAS,OAAO,kBAAkB;AAAA,IACtC,OAAO;AAAA;AAAA,EAGT,MAAM,SAAS,IAAI,MAAM;AAAA,IACvB,UAAU,OAAO,OAAO;AAAA,IACxB,MAAM,OAAO,OAAO;AAAA,IACpB,OAAO,OAAO,YAAY;AAAA,MACxB,MAAM,iBAAiB,YAAY,cAAc,OAAO;AAAA,MACxD,IAAI,gBAAgB;AAAA,QAClB,OAAO;AAAA,MACT;AAAA,MACA,OACG,MAAM,MAAM,OAAO,KACpB,oBACE,SACA,QACA,OAAO,OACP,WACA,WACA,UACF;AAAA;AAAA,EAGN,CAAC;AAAA,EAED,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,CAAC,YAAY;AAAA,MACtB,QAAQ,QAAQ,CAAC,UAAU,aAAa,IAAI,KAAK,CAAC;AAAA;AAAA,IAEpD,SAAS,aAAa;AAAA,IACtB;AAAA,EACF;AAAA;AAGF,SAAS,kBAAkB,CACzB,aACA,gBACW;AAAA,EACX,OAAO,IAAI,MAAM,CAAC,GAAgB;AAAA,IAChC,GAAG,CAAC,SAAS,WAAU;AAAA,MACrB,IAAI,cAAa,QAAQ;AAAA,QACvB,OAAO,OAAO,2BAAqC;AAAA,UACjD,eAAe;AAAA,UACf,MAAM,WAAW,YAAY;AAAA,UAC7B,MAAM,SAAS,OAAO,KAAK,sBAAsB;AAAA,UACjD,MAAM,SAAS,QAAQ;AAAA;AAAA,MAE3B;AAAA,MACA,MAAM,SAAS,YAAY,EAAE;AAAA,MAI7B,MAAM,QAAQ,OAAO;AAAA,MACrB,OAAO,OAAO,UAAU,aACnB,MAA0C,KAAK,MAAM,IACtD;AAAA;AAAA,EAER,CAAC;AAAA;AAGH,eAAe,mBAAmB,CAChC,SACA,QACA,OACA,WAIA,WACA,YACmB;AAAA,EACnB,MAAM,WAAW,IAAI,IAAI,QAAQ,GAAG,EAAE;AAAA,EACtC,MAAM,QAAQ,qBAAqB,OAAO,QAAQ;AAAA,EAElD,IAAI,UAAU,WAAW;AAAA,IACvB,MAAM,QAAQ,MAAM;AAAA,IACpB,MAAM,SAAS,MAAM,UAAU,OAAO,IAAI;AAAA,IAC1C,IAAI,kBAAkB,UAAU;AAAA,MAC9B,OAAO;AAAA,IACT;AAAA,IAEA,IAAI;AAAA,MACF,QAAQ,sBAAsB,MAAa;AAAA,MAC3C,MAAM,WAAW,MAAM,kBACrB,QACA;AAAA,QACE,MAAM,OAAO,YAAY,IAAI,GAAG,UAAU,YAAY;AAAA,UACpD,KAAK;AAAA,UACL,YAAY,EAAE,KAAK,cAAc,KAAK;AAAA,QACxC,EAAE;AAAA,QACF,SAAS,CAAC,EAAE,MAAM,UAAU,KAAK,OAAO,MAAM,SAAS,CAAC;AAAA,MAC1D,GACA,OACA,OACA,OAAO,UACT;AAAA,MACA,MAAM,OAAO,MAAM,8BAA8B,UAAU,MAAM;AAAA,MACjE,yBAAyB,QAAQ,SAAS;AAAA,MAC1C,OAAO,IAAI,SAAS,aAAa,uBAAuB,IAAI,IAAI,MAAM;AAAA,QACpE,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,MACD,OAAO,OAAgB;AAAA,MACvB,QAAQ,MAAM,KAAK;AAAA,MACnB,OAAO,qBAAqB;AAAA,cAC5B;AAAA,MACA,yBAAyB,MAAM;AAAA;AAAA,EAEnC;AAAA,EAEA,IAAI,aAAa,cAAc;AAAA,IAC7B,MAAM,SAAS,MAAM,UAAU,OAAO,OAAO,IAAI;AAAA,IACjD,IAAI,kBAAkB,UAAU;AAAA,MAC9B,OAAO;AAAA,IACT;AAAA,IAEA,IAAI;AAAA,MACF,yBAAyB,QAAQ,SAAS;AAAA,MAC1C,OAAO,IAAI,SAAS,MAAM;AAAA,QACxB,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,UAAU,OAAO,MAAM;AAAA,UACvB,iBAAiB;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,MACD,OAAO,OAAgB;AAAA,MACvB,QAAQ,MAAM,KAAK;AAAA,MACnB,OAAO,qBAAqB;AAAA,cAC5B;AAAA,MACA,yBAAyB,MAAM;AAAA;AAAA,EAEnC;AAAA,EAEA,MAAM,WAAW,UAAU,IAAI,QAAQ;AAAA,EACvC,IAAI,UAAU;AAAA,IACZ,OAAO,IAAI,SAAS,IAAI,KAAK,SAAS,QAAQ,GAAG;AAAA,MAC/C,SAAS;AAAA,QACP,gBAAgB,SAAS;AAAA,QACzB,iBAAiB;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAKA,IACE,aAAa,OACb,CAAC,SAAS,WAAW,OAAO,KAC5B,CAAC,kBAAkB,KAAK,QAAQ,GAChC;AAAA,IACA,MAAM,SAAS,MAAM,UAAU,OAAO,OAAO,IAAI;AAAA,IACjD,IAAI,EAAE,kBAAkB,WAAW;AAAA,MACjC,IAAI;AAAA,QACF,QAAQ,sBAAsB,MAAa;AAAA,QAC3C,MAAM,WAAW,MAAM,kBACrB,QACA;AAAA,UACE,MAAM,OAAO,YAAY,IAAI,GAAG,UAAU,YAAY;AAAA,YACpD,KAAK;AAAA,YACL,YAAY,EAAE,KAAK,cAAc,KAAK;AAAA,UACxC,EAAE;AAAA,UACF,SAAS,CAAC,EAAE,MAAM,UAAU,KAAK,OAAO,MAAM,SAAS,CAAC;AAAA,QAC1D,GACA,OAAO,OACP,KACA,OAAO,UACT;AAAA,QACA,MAAM,OAAO,MAAM,8BAA8B,UAAU,MAAM;AAAA,QACjE,yBAAyB,QAAQ,SAAS;AAAA,QAC1C,OAAO,IAAI,SAAS,aAAa,uBAAuB,IAAI,IAAI,MAAM;AAAA,UACpE,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,iBAAiB;AAAA,UACnB;AAAA,QACF,CAAC;AAAA,QACD,OAAO,OAAgB;AAAA,QACvB,QAAQ,MAAM,KAAK;AAAA,QACnB,OAAO,qBAAqB;AAAA,gBAC5B;AAAA,QACA,yBAAyB,MAAM;AAAA;AAAA,IAEnC;AAAA,EACF;AAAA,EAEA,OAAO,IAAI,SAAS,aAAa;AAAA,IAC/B,QAAQ;AAAA,IACR,SAAS,EAAE,iBAAiB,WAAW;AAAA,EACzC,CAAC;AAAA;AAGH,SAAS,oBAAoB,CAC3B,OACA,UACoB;AAAA,EACpB,IAAI,MAAM,cAAc,WAAW;AAAA,IACjC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,aAAa,eAAe;AAAA,IAC9B,OAAO;AAAA,EACT;AAAA,EACA,MAAM,YACJ,SAAS,SAAS,KAAK,SAAS,SAAS,GAAG,IACxC,SAAS,QAAQ,QAAQ,EAAE,IAC3B;AAAA,EACN,IAAI,MAAM,eAAe,WAAW;AAAA,IAClC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,UAAU,SAAS,aAAa,GAAG;AAAA,IACrC,MAAM,OAAO,UAAU,MAAM,GAAG,UAAU,SAAS,cAAc,MAAM;AAAA,IACvE,IAAI,SAAS,IAAI;AAAA,MACf,OAAO;AAAA,IACT;AAAA,IACA,IAAI,MAAM,UAAU,WAAW;AAAA,MAC7B,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA;AAAA;AAGF,SAAS,sBAAsB,CAAC,MAAsB;AAAA,EACpD,IAAI,KAAK,SAAS,gBAAgB,GAAG;AAAA,IACnC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,KAAK,SAAS,SAAS,GAAG;AAAA,IAC5B,OAAO,KAAK,QAAQ,WAAW,GAAG,kCAAkC;AAAA,EACtE;AAAA,EACA,OAAO,OAAO;AAAA;AAQhB,IAAM,gBAAgB,IAAI;AAE1B,SAAS,mBAAmB,GAAkB;AAAA,EAC5C,MAAM,cAAc,IAAI;AAAA,EAExB,SAAS,aAAa,CAAC,SAAwC;AAAA,IAC7D,IAAI,IAAI,IAAI,QAAQ,GAAG,EAAE,aAAa,kBAAkB;AAAA,MACtD;AAAA,IACF;AAAA,IAEA,IAAI;AAAA,IAEJ,MAAM,SAAS,IAAI,eAA2B;AAAA,MAC5C,OAAO,CAAC,eAAe;AAAA,QACrB,mBAAmB;AAAA,QACnB,YAAY,IAAI,UAAU;AAAA,QAC1B,IAAI;AAAA,UACF,WAAW,QAAQ,cAAc,OAAO;AAAA;AAAA,CAAiB,CAAC;AAAA,UAC1D,MAAM;AAAA,UACN,YAAY,OAAO,UAAU;AAAA;AAAA;AAAA,MAGjC,QAAQ,MAAM;AAAA,QACZ,IAAI,kBAAkB;AAAA,UACpB,YAAY,OAAO,gBAAgB;AAAA,QACrC;AAAA;AAAA,IAEJ,CAAC;AAAA,IAED,OAAO,IAAI,SAAS,QAAQ;AAAA,MAC1B,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,MACnB;AAAA,IACF,CAAC;AAAA;AAAA,EAGH,SAAS,SAAS,GAAS;AAAA,IACzB,MAAM,UAAU,cAAc,OAAO;AAAA;AAAA;AAAA,CAA6B;AAAA,IAClE,WAAW,cAAc,CAAC,GAAG,WAAW,GAAG;AAAA,MACzC,IAAI;AAAA,QACF,WAAW,QAAQ,OAAO;AAAA,QAC1B,MAAM;AAAA,QACN,YAAY,OAAO,UAAU;AAAA;AAAA,IAEjC;AAAA;AAAA,EAGF,OAAO,EAAE,eAAe,UAAU;AAAA;AAGpC,SAAS,aAAa,CACpB,UACA,cACS;AAAA,EACT,IAAI,iBAAiB,MAAM,aAAa,WAAW,IAAI,GAAG;AAAA,IACxD,OAAO;AAAA,EACT;AAAA,EACA,MAAM,WAAW,aAAa,MAAM,GAAG;AAAA,EACvC,IAAI,SAAS,KAAK,CAAC,YAAY,uBAAuB,IAAI,OAAO,CAAC,GAAG;AAAA,IACnE,OAAO;AAAA,EACT;AAAA,EACA,MAAM,eAAe,SAAQ,SAAS,OAAO,MAAM,YAAY;AAAA,EAC/D,IAAI,gBAAgB,SAAS,OAAO,MAAM,QAAQ,YAAY,GAAG;AAAA,IAC/D,OAAO;AAAA,EACT;AAAA,EACA,MAAM,OAAO,UAAS,YAAY;AAAA,EAClC,IAAI,KAAK,WAAW,GAAG,KAAK,iBAAiB,SAAS,OAAO,YAAY;AAAA,IACvE,OAAO;AAAA,EACT;AAAA,EACA,OAAO,mBAAmB,IAAI,QAAQ,IAAI,EAAE,YAAY,CAAC;AAAA;AAG3D,SAAS,eAAc,CAAC,MAAc,cAA8B;AAAA,EAClE,OAAO,UAAS,MAAM,YAAY,EAAE,MAAM,IAAG,EAAE,KAAK,GAAG;AAAA;AAGzD,SAAS,eAAe,CAAC,QAAgB,WAA4B;AAAA,EACnE,MAAM,iBAAiB,UAAS,QAAQ,SAAS;AAAA,EACjD,OACE,mBAAmB,MAClB,mBAAmB,QAClB,CAAC,eAAe,WAAW,KAAK,MAAK,KACrC,CAAC,YAAW,cAAc;AAAA;AAsBhC,eAAe,6BAA6B,CAC1C,UACA,QACiB;AAAA,EACjB,MAAM,gBAAgB,OAAO;AAAA,EAC7B,MAAM,SAAS,MAAM,mBACnB,UACA,OAAO,QACP,CAAC,SAAS,GAAG,iBAAiB,UAAS,IAAI,KAC3C,OAAO,YAAY,IAAI,CAAC,eAAe,WAAW,QAAQ,GAC1D,OAAO,qBAAqB,IAAI,CAAC,eAAe,WAAW,QAAQ,CACrE;AAAA,EACA,WAAW,QAAQ,OAAO,QAAQ;AAAA,IAChC,MAAM,WAAW,GAAG,iBAAiB,UAAS,IAAI;AAAA,IAClD,OAAO,UAAU,IAAI,UAAU;AAAA,MAC7B,UAAU;AAAA,MACV;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EACA,OAAO,OAAO;AAAA;AAGhB,SAAS,wBAAwB,CAC/B,WACA,eACA,WACA,QAIA;AAAA,EACA,IAAI,QAAQ,QAAQ,QAAQ;AAAA,EAC5B,IAAI,WAAW;AAAA,EACf,IAAI;AAAA,EACJ,MAAM,gBAAgB,IAAI;AAAA,EAC1B,MAAM,mBAAmB,IAAI;AAAA,EAE7B,SAAS,MAAM,CAAC,QAAiC;AAAA,IAC/C,OAAO,SAAS,MAAM;AAAA,MACpB,MAAM,gBAAgB,iBAAiB,IAAI,OAAO,MAAM;AAAA,MACxD,IAAI;AAAA,QAAe,aAAa,aAAa;AAAA,MAC7C,iBAAiB,OAAO,OAAO,MAAM;AAAA,MACrC,IAAI,YAAY,OAAO,iBAAiB;AAAA,QAAG;AAAA,MAG3C,MAAM,QAAQ,WAAW,MAAM;AAAA,QAC7B,iBAAiB,OAAO,OAAO,MAAM;AAAA,QAChC,wBAAwB,QAAQ,SAAS,EAAE,MAC9C,CAAC,UAAmB,QAAQ,MAAM,KAAK,CACzC;AAAA,SACC,+BAA+B;AAAA,MAClC,MAAM,MAAM;AAAA,MACZ,iBAAiB,IAAI,OAAO,QAAQ,KAAK;AAAA;AAAA,IAE3C,OAAO,OAAO;AAAA;AAAA,EAGhB,SAAS,MAAK,CAAC,OAAsD;AAAA,IACnE,MAAM,SAAS,MAAM,KAAK,YAAY;AAAA,MACpC,IAAI;AAAA,QAAU,OAAO,qBAAqB;AAAA,MAC1C,MAAM,SAAS,MAAM,mBACnB,OACA,WACA,eACA,MACF;AAAA,MACA,IAAI,EAAE,kBAAkB,WAAW;AAAA,QACjC,MAAM,WAAW,cAAc,IAAI,KAAK;AAAA,QACxC,cAAc,IAAI,OAAO,MAAM;AAAA,QAC/B,IAAI;AAAA,UAAU,OAAO,QAAQ;AAAA,MAC/B;AAAA,MACA,OAAO;AAAA,KACR;AAAA,IACD,QAAQ,OAAO,KACb,MAAG;AAAA,MAAG;AAAA,OACN,MAAG;AAAA,MAAG;AAAA,KACR;AAAA,IACA,OAAO;AAAA;AAAA,EAGT,SAAS,OAAO,GAAkB;AAAA,IAChC,IAAI;AAAA,MAAU,OAAO;AAAA,IACrB,WAAW;AAAA,IACX,iBAAiB,QAAQ,CAAC,UAAU,aAAa,KAAK,CAAC;AAAA,IACvD,iBAAiB,MAAM;AAAA,IACvB,WAAW,MAAM,KAAK,YAAY;AAAA,MAChC,MAAM,IAAG,eAAe,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MACxD,cAAc,MAAM;AAAA,MACpB,UAAU,MAAM;AAAA,KACjB;AAAA,IACD,OAAO;AAAA;AAAA,EAGT,OAAO,EAAE,eAAO,QAAQ;AAAA;AAG1B,SAAS,wBAAwB,CAAC,QAAiC;AAAA,EACjE,OAAO,kBAAkB;AAAA,EACzB,OAAO,SAAS;AAAA;AAGlB,eAAe,uBAAuB,CACpC,QACA,WACe;AAAA,EACf,MAAM,IAAG,OAAO,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACxD,WAAW,YAAY,OAAO,UAAU,KAAK,GAAG;AAAA,IAC9C,UAAU,OAAO,QAAQ;AAAA,EAC3B;AAAA;AAGF,eAAe,kBAAkB,CAC/B,OACA,WACA,eACA,QACuC;AAAA,EACvC,MAAM,eAAe,mBAAmB;AAAA,EACxC,MAAM,mBAAmB,SAAQ,eAAe,YAAY;AAAA,EAC5D,MAAM,gBAAgB,GAAG,0BAA0B,aAAa;AAAA,EAChE,MAAM,eAAe;AAAA,IACnB,aAAa,CAAC,KAAK;AAAA,IACnB,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,OAAO;AAAA,IACP,YAAY,GAAG;AAAA,IACf,QAAQ;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,IAAI,UAAU;AAAA,EACd,IAAI;AAAA,IACF,MAAM,aAAa,0BAA0B,QAAQ,KAAK;AAAA,IAC1D,QAAQ,QAAQ,WAAW,MAAM,eAAe,cAAc,UAAU;AAAA,IACxE,MAAM,gBAAgB,OAAO,QAAQ,KAAK,uBAAuB;AAAA,IACjE,IAAI,CAAC,OAAO,WAAW,CAAC,eAAe;AAAA,MACrC,OAAO,KAAK,QAAQ,CAAC,QAAQ,QAAQ,MAAM,GAAG,CAAC;AAAA,MAC/C,IAAI,CAAC,eAAe;AAAA,QAClB,QAAQ,MAAM,sDAAsD;AAAA,MACtE;AAAA,MACA,OAAO,qBAAqB;AAAA,IAC9B;AAAA,IAEA,MAAM,mBAAmB,IAAI;AAAA,IAC7B,MAAM,UAAU,IAAI;AAAA,IAKpB,WAAW,UAAU,OAAO,SAAS;AAAA,MACnC,MAAM,oBAAoB,wBACxB,kBACA,eACA,MACF;AAAA,MACA,IAAI,iBAAiB,IAAI,kBAAkB,QAAQ,GAAG;AAAA,QACpD,MAAM,IAAI,MACR,qCAAqC,kBAAkB,UACzD;AAAA,MACF;AAAA,MACA,iBAAiB,IAAI,kBAAkB,UAAU,iBAAiB;AAAA,MAClE,QAAQ,IAAI,QAAQ,iBAAiB;AAAA,IACvC;AAAA,IAEA,MAAM,cAAc,QAAQ,IAAI,aAAa;AAAA,IAC7C,IAAI,CAAC,aAAa;AAAA,MAChB,MAAM,IAAI,MAAM,0CAA0C;AAAA,IAC5D;AAAA,IAEA,MAAM,wBACJ,MAAM,oBAAoB,QAAQ,gBAAgB,GAClD,IAAI,CAAC,cAAc;AAAA,MACnB;AAAA,MACA,UAAU,GAAG,iBAAiB,UAAS,QAAQ;AAAA,MAC/C,MAAM;AAAA,IACR,EAAE;AAAA,IACF,WAAW,UAAU;AAAA,MACnB,iBAAiB,IAAI,OAAO,UAAU,MAAM;AAAA,IAE9C,UAAU;AAAA,IACV,OAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,MAChB,OAAO;AAAA,MACP;AAAA,MACA,aAAa,OAAO,QACjB,OAAO,kBAAkB,EACzB,IAAI,CAAC,WAAW,QAAQ,IAAI,MAAM,CAAC,EACnC,OAAO,CAAC,WAAwC,WAAW,SAAS;AAAA,MACvE,WAAW;AAAA,IACb;AAAA,IACA,OAAO,OAAgB;AAAA,IACvB,QAAQ,MAAM,KAAK;AAAA,IACnB,OAAO,qBAAqB;AAAA,YAC5B;AAAA,IACA,IAAI,CAAC,SAAS;AAAA,MACZ,MAAM,IAAG,kBAAkB,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IAC7D;AAAA;AAAA;AAIJ,SAAS,wBAAwB,CAC/B,QACA,WACM;AAAA,EACN,YAAY,UAAU,WAAW,OAAO,WAAW;AAAA,IACjD,MAAM,WAAW,UAAU,IAAI,QAAQ;AAAA,IACvC,IAAI,UAAU;AAAA,MACZ,IAAI,SAAS,aAAa,OAAO,UAAU;AAAA,QACzC;AAAA,MACF;AAAA,MACA,MAAM,IAAI,MAAM,qCAAqC,UAAU;AAAA,IACjE;AAAA,IACA,UAAU,IAAI,UAAU,MAAM;AAAA,EAChC;AAAA;AAGF,SAAS,uBAAuB,CAC9B,kBACA,eACA,QACmB;AAAA,EACnB,MAAM,WAAW,SAAQ,OAAO,IAAI;AAAA,EACpC,MAAM,qBAAqB,UAAS,kBAAkB,QAAQ;AAAA,EAC9D,IACE,uBAAuB,MACvB,uBAAuB,QACvB,mBAAmB,WAAW,KAAK,MAAK,KACxC,YAAW,kBAAkB,GAC7B;AAAA,IACA,MAAM,IAAI,MACR,wEAAwE,OAAO,MACjF;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,mBACb,MAAM,IAAG,EACT,IAAI,CAAC,YAAY,mBAAmB,OAAO,CAAC,EAC5C,KAAK,GAAG;AAAA,EAEX,OAAO;AAAA,IACL;AAAA,IACA,UAAU,GAAG,iBAAiB;AAAA,IAC9B,MAAM,OAAO;AAAA,EACf;AAAA;AAGF,SAAS,kBAAkB,GAAW;AAAA,EACpC,OAAO,YAAW,EAAE,QAAQ,MAAM,EAAE;AAAA;AAGtC,SAAS,oBAAoB,GAAa;AAAA,EACxC,OAAO,IAAI,SAAS,kCAAkC;AAAA,IACpD,QAAQ;AAAA,IACR,SAAS,EAAE,iBAAiB,WAAW;AAAA,EACzC,CAAC;AAAA;",
|
|
30
|
+
"debugId": "2077B6EF8001292264756E2164756E21",
|
|
31
|
+
"names": []
|
|
32
|
+
}
|