@kubuild/core 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/binding-resolver.ts","../src/variable-catalog.ts","../src/validator.ts","../src/security.ts","../src/document-utils.ts","../src/commands.ts","../src/command-tree-utils.ts","../src/history.ts","../src/migration.ts","../src/exporter.ts","../src/importer.ts","../src/round-trip-comparator.ts","../src/template-utils.ts"],"sourcesContent":["export type * from './interfaces';\nexport * from './binding-resolver';\nexport * from './variable-catalog';\nexport * from './validator';\nexport * from './document-utils';\nexport * from './commands';\nexport * from './command-tree-utils';\nexport * from './history';\nexport * from './migration';\nexport * from './exporter';\nexport * from './importer';\nexport * from './round-trip-comparator';\nexport * from './template-utils';\nexport * from './security';\n\n\n\n","import type { VariableBinding } from '@kubuild/schema';\nimport type { RuntimeContext } from './interfaces';\n\n/**\n * Segments a VariableBinding key must never traverse into, checked before any\n * property access so it can't be bypassed by proxies/getters on the traversed object.\n */\nconst FORBIDDEN_KEY_SEGMENTS = new Set(['__proto__', 'constructor', 'prototype']);\n\nexport type ResolveOutcome =\n | { status: 'resolved'; value: unknown }\n | { status: 'fallback'; value: unknown }\n | { status: 'empty'; value: '' };\n\n// `key`/`fallback` are never passed to eval/Function/any code-execution path in this\n// module — resolution is pure data traversal, never expression evaluation.\nexport function resolveBinding(\n binding: Pick<VariableBinding, 'key' | 'fallback'>,\n context: RuntimeContext | undefined,\n): ResolveOutcome {\n const segments = binding.key.split('.').filter(Boolean);\n let current: unknown = context?.variables;\n\n for (const segment of segments) {\n if (FORBIDDEN_KEY_SEGMENTS.has(segment)) {\n return applyMissingPolicy(binding);\n }\n if (current === null || typeof current !== 'object') {\n return applyMissingPolicy(binding);\n }\n if (!Object.prototype.hasOwnProperty.call(current, segment)) {\n return applyMissingPolicy(binding);\n }\n current = (current as Record<string, unknown>)[segment];\n }\n\n if (current === undefined || typeof current === 'function') {\n return applyMissingPolicy(binding);\n }\n\n return { status: 'resolved', value: current };\n}\n\nfunction applyMissingPolicy(binding: Pick<VariableBinding, 'fallback'>): ResolveOutcome {\n if (binding.fallback !== undefined) {\n return { status: 'fallback', value: binding.fallback };\n }\n return { status: 'empty', value: '' };\n}\n\n/** Convenience wrapper returning just the resolved/fallback/empty value. */\nexport function resolveBindingValue(\n binding: Pick<VariableBinding, 'key' | 'fallback'>,\n context: RuntimeContext | undefined,\n): unknown {\n return resolveBinding(binding, context).value;\n}\n","import type { VariableCatalog } from './interfaces';\n\n/**\n * Segments never traversed/assigned while expanding a catalog key — mirrors the guard\n * in binding-resolver.ts so a host-declared key can't be used to reach the prototype chain.\n */\nconst FORBIDDEN_KEY_SEGMENTS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/**\n * Expands a host `VariableCatalog`'s dotted `sampleValue` keys (e.g. `'site.name'`,\n * `'products'`) into a nested object shaped the same way `resolveBinding` expects\n * `context.variables` to be shaped. Editor/preview-only: the result should be merged\n * into a `RuntimeContext.variables` for canvas preview, never written to a document.\n */\nexport function buildSampleVariablesFromCatalog(catalog?: VariableCatalog): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n if (!catalog) {\n return result;\n }\n\n for (const entry of catalog) {\n const segments = entry.key.split('.').filter(Boolean);\n if (segments.length === 0 || segments.some((segment) => FORBIDDEN_KEY_SEGMENTS.has(segment))) {\n continue;\n }\n\n let cursor: Record<string, unknown> = result;\n for (let i = 0; i < segments.length - 1; i += 1) {\n const segment = segments[i];\n const existing = cursor[segment];\n if (existing === null || typeof existing !== 'object' || Array.isArray(existing)) {\n cursor[segment] = {};\n }\n cursor = cursor[segment] as Record<string, unknown>;\n }\n cursor[segments[segments.length - 1]] = entry.sampleValue;\n }\n\n return result;\n}\n","import {\n PageDocument,\n PageDocumentSchema,\n SCHEMA_NAME,\n} from '@kubuild/schema';\nimport {\n DocumentSecurityLimits,\n validateDocumentSecurity,\n} from './security';\n\nexport type DocumentValidationErrorCode =\n | 'GLOBAL_SCHEMA_INVALID'\n | 'ROOT_NODE_INVALID'\n | 'NODE_SHAPE_INVALID'\n | 'DUPLICATE_NODE_ID'\n | 'TREE_CYCLE_DETECTED'\n | 'UNKNOWN_COMPONENT_TYPE'\n | 'CHILD_POLICY_VIOLATION'\n | 'INVALID_ASSET_REFERENCE'\n | 'INVALID_VARIABLE_BINDING'\n | 'INVALID_ACTION_BINDING'\n | 'INVALID_METADATA'\n | 'PROTOTYPE_POLLUTION_DETECTED'\n | 'SECURITY_LIMIT_EXCEEDED';\n\nexport interface DocumentValidationError {\n code: DocumentValidationErrorCode;\n message: string;\n path: string;\n nodeId?: string;\n details?: Record<string, unknown>;\n}\n\nexport interface ComponentDefinitionLike {\n type: string;\n category?: string;\n capabilities?: string[];\n acceptsChildren?: boolean;\n allowedChildren?: string[];\n disallowedParents?: string[];\n}\n\nexport interface ComponentRegistryLike {\n get(type: string): ComponentDefinitionLike | undefined;\n has(type: string): boolean;\n}\n\nexport interface ValidationOptions {\n componentRegistry?: ComponentRegistryLike;\n knownComponentTypes?: string[] | Set<string>;\n strictComponentTypes?: boolean;\n checkAssetReferences?: boolean;\n checkVariableBindings?: boolean;\n checkActionBindings?: boolean;\n securityLimits?: DocumentSecurityLimits;\n}\n\nexport interface DocumentValidationResult {\n valid: boolean;\n success: boolean;\n errors: DocumentValidationError[];\n data?: PageDocument;\n}\n\n/**\n * Validate a page document against global schema, node shape, child policy,\n * ID uniqueness, cycles, unknown component types, and structural bindings.\n */\nexport function validateDocument(\n input: unknown,\n options: ValidationOptions = {},\n): DocumentValidationResult {\n const errors: DocumentValidationError[] = [];\n\n // 1. Basic Object check\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n return {\n valid: false,\n success: false,\n errors: [\n {\n code: 'GLOBAL_SCHEMA_INVALID',\n message: 'Document must be a valid non-null object',\n path: '',\n },\n ],\n };\n }\n\n const doc = input as Record<string, unknown>;\n\n // 1.5 Security Limits & Prototype Pollution Check\n const securityCheck = validateDocumentSecurity(doc, options.securityLimits);\n if (!securityCheck.safe) {\n for (const secErr of securityCheck.errors) {\n errors.push({\n code: secErr.code === 'PROTOTYPE_POLLUTION_DETECTED'\n ? 'PROTOTYPE_POLLUTION_DETECTED'\n : 'SECURITY_LIMIT_EXCEEDED',\n message: secErr.message,\n path: secErr.path || '',\n details: secErr.details,\n });\n }\n if (securityCheck.errors.some((e) => e.code === 'PROTOTYPE_POLLUTION_DETECTED')) {\n return {\n valid: false,\n success: false,\n errors,\n };\n }\n }\n\n // 2. Global Schema / Version / Document field checks\n if (doc.schema !== SCHEMA_NAME) {\n errors.push({\n code: 'GLOBAL_SCHEMA_INVALID',\n message: `Invalid schema identifier. Expected \"${SCHEMA_NAME}\", received \"${String(doc.schema)}\"`,\n path: '/schema',\n });\n }\n\n if (typeof doc.version !== 'string' || doc.version.trim().length === 0) {\n errors.push({\n code: 'GLOBAL_SCHEMA_INVALID',\n message: 'Schema version must be a non-empty string',\n path: '/version',\n });\n }\n\n if (!doc.document || typeof doc.document !== 'object' || Array.isArray(doc.document)) {\n errors.push({\n code: 'GLOBAL_SCHEMA_INVALID',\n message: 'Document must contain a root document node object',\n path: '/document',\n });\n return {\n valid: false,\n success: false,\n errors,\n };\n }\n\n const rootNode = doc.document as Record<string, unknown>;\n\n // 3. Root Node Type check (must be 'page')\n if (rootNode.type !== 'page') {\n errors.push({\n code: 'ROOT_NODE_INVALID',\n message: `Root node type must be \"page\", received \"${String(rootNode.type)}\"`,\n path: '/document/type',\n nodeId: typeof rootNode.id === 'string' ? rootNode.id : undefined,\n });\n }\n\n // 4. Metadata check\n if (doc.metadata !== undefined) {\n if (typeof doc.metadata !== 'object' || doc.metadata === null || Array.isArray(doc.metadata)) {\n errors.push({\n code: 'INVALID_METADATA',\n message: 'Document metadata must be an object',\n path: '/metadata',\n });\n } else {\n const meta = doc.metadata as Record<string, unknown>;\n if (meta.title !== undefined && (typeof meta.title !== 'string' || meta.title.trim().length === 0)) {\n errors.push({\n code: 'INVALID_METADATA',\n message: 'Metadata title must be a non-empty string when provided',\n path: '/metadata/title',\n });\n }\n }\n }\n\n // 5. Deep Recursive Node Tree Validation (Cycle, ID Uniqueness, Node Shape, Registry, Bindings)\n const seenIds = new Map<string, string>(); // nodeId -> path\n const visitedObjects = new Set<object>();\n\n validateNodeRecursive(\n rootNode,\n '/document',\n undefined,\n seenIds,\n visitedObjects,\n options,\n errors,\n );\n\n // 6. Schema Zod safe parse fallback to capture any missed structural issues\n if (errors.length === 0) {\n const zodResult = PageDocumentSchema.safeParse(input);\n if (!zodResult.success) {\n for (const issue of zodResult.error.issues) {\n const jsonPath = '/' + issue.path.join('/');\n errors.push({\n code: 'GLOBAL_SCHEMA_INVALID',\n message: issue.message,\n path: jsonPath === '/' ? '' : jsonPath,\n });\n }\n } else {\n return {\n valid: true,\n success: true,\n errors: [],\n data: zodResult.data as unknown as PageDocument,\n };\n }\n }\n\n return {\n valid: errors.length === 0,\n success: errors.length === 0,\n errors,\n };\n}\n\nfunction validateNodeRecursive(\n nodeObj: Record<string, unknown>,\n currentPath: string,\n parentNode: { id: string; type: string } | undefined,\n seenIds: Map<string, string>,\n visitedObjects: Set<object>,\n options: ValidationOptions,\n errors: DocumentValidationError[],\n): void {\n // Cycle Detection\n if (visitedObjects.has(nodeObj)) {\n errors.push({\n code: 'TREE_CYCLE_DETECTED',\n message: `Cyclic reference detected at node path ${currentPath}`,\n path: currentPath,\n nodeId: typeof nodeObj.id === 'string' ? nodeObj.id : undefined,\n });\n return;\n }\n visitedObjects.add(nodeObj);\n\n // Validate Node ID\n const nodeId = nodeObj.id;\n if (typeof nodeId !== 'string' || nodeId.trim().length === 0) {\n errors.push({\n code: 'NODE_SHAPE_INVALID',\n message: 'Node id must be a non-empty string',\n path: `${currentPath}/id`,\n });\n } else {\n if (seenIds.has(nodeId)) {\n errors.push({\n code: 'DUPLICATE_NODE_ID',\n message: `Duplicate node ID \"${nodeId}\" found at ${currentPath} (first seen at ${seenIds.get(nodeId)})`,\n path: `${currentPath}/id`,\n nodeId,\n details: { firstSeenAt: seenIds.get(nodeId) },\n });\n } else {\n seenIds.set(nodeId, currentPath);\n }\n }\n\n // Validate Node Type\n const nodeType = nodeObj.type;\n if (typeof nodeType !== 'string' || nodeType.trim().length === 0) {\n errors.push({\n code: 'NODE_SHAPE_INVALID',\n message: 'Node type must be a non-empty string',\n path: `${currentPath}/type`,\n nodeId: typeof nodeId === 'string' ? nodeId : undefined,\n });\n }\n\n const effectiveNodeId = typeof nodeId === 'string' ? nodeId : undefined;\n const effectiveNodeType = typeof nodeType === 'string' ? nodeType : '';\n\n // Validate against Component Registry or known types\n let componentDef: ComponentDefinitionLike | undefined;\n if (effectiveNodeType) {\n if (options.componentRegistry) {\n componentDef = options.componentRegistry.get(effectiveNodeType);\n if (!componentDef && (options.strictComponentTypes || !options.componentRegistry.has(effectiveNodeType))) {\n errors.push({\n code: 'UNKNOWN_COMPONENT_TYPE',\n message: `Unknown component type: \"${effectiveNodeType}\"`,\n path: `${currentPath}/type`,\n nodeId: effectiveNodeId,\n });\n }\n } else if (options.knownComponentTypes) {\n const isKnown = Array.isArray(options.knownComponentTypes)\n ? options.knownComponentTypes.includes(effectiveNodeType)\n : options.knownComponentTypes.has(effectiveNodeType);\n\n if (!isKnown && options.strictComponentTypes) {\n errors.push({\n code: 'UNKNOWN_COMPONENT_TYPE',\n message: `Unknown component type: \"${effectiveNodeType}\"`,\n path: `${currentPath}/type`,\n nodeId: effectiveNodeId,\n });\n }\n }\n }\n\n // Validate Child Policy\n const children = nodeObj.children;\n if (children !== undefined) {\n if (!Array.isArray(children)) {\n errors.push({\n code: 'NODE_SHAPE_INVALID',\n message: 'Node children must be an array',\n path: `${currentPath}/children`,\n nodeId: effectiveNodeId,\n });\n } else {\n if (componentDef && componentDef.acceptsChildren === false && children.length > 0) {\n errors.push({\n code: 'CHILD_POLICY_VIOLATION',\n message: `Component \"${effectiveNodeType}\" does not accept children, but found ${children.length} child node(s)`,\n path: `${currentPath}/children`,\n nodeId: effectiveNodeId,\n });\n }\n\n if (parentNode && componentDef?.disallowedParents?.includes(parentNode.type)) {\n errors.push({\n code: 'CHILD_POLICY_VIOLATION',\n message: `Component \"${effectiveNodeType}\" cannot be a child of \"${parentNode.type}\"`,\n path: currentPath,\n nodeId: effectiveNodeId,\n });\n }\n\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n const childPath = `${currentPath}/children/${i}`;\n\n if (!child || typeof child !== 'object' || Array.isArray(child)) {\n errors.push({\n code: 'NODE_SHAPE_INVALID',\n message: `Child at index ${i} must be a valid node object`,\n path: childPath,\n nodeId: effectiveNodeId,\n });\n continue;\n }\n\n const childRecord = child as Record<string, unknown>;\n const childType = typeof childRecord.type === 'string' ? childRecord.type : '';\n const childIsKnown = !options.componentRegistry || options.componentRegistry.has(childType);\n const childCategory = options.componentRegistry?.get(childType)?.category;\n\n if (\n componentDef?.allowedChildren &&\n childType &&\n childIsKnown &&\n !componentDef.allowedChildren.includes(childType) &&\n !componentDef.allowedChildren.includes('*') &&\n !(childCategory && componentDef.allowedChildren.includes(childCategory))\n ) {\n errors.push({\n code: 'CHILD_POLICY_VIOLATION',\n message: `Component type \"${childType}\" is not allowed as a child of \"${effectiveNodeType}\". Allowed types: ${componentDef.allowedChildren.join(', ')}`,\n path: `${childPath}/type`,\n nodeId: typeof childRecord.id === 'string' ? childRecord.id : undefined,\n });\n }\n\n validateNodeRecursive(\n childRecord,\n childPath,\n { id: effectiveNodeId || '', type: effectiveNodeType },\n seenIds,\n visitedObjects,\n options,\n errors,\n );\n }\n }\n }\n\n // Validate Props and structural bindings (Assets, Variables, Actions)\n if (nodeObj.props !== undefined) {\n if (typeof nodeObj.props !== 'object' || nodeObj.props === null || Array.isArray(nodeObj.props)) {\n errors.push({\n code: 'NODE_SHAPE_INVALID',\n message: 'Node props must be an object',\n path: `${currentPath}/props`,\n nodeId: effectiveNodeId,\n });\n } else {\n validatePropsBindings(\n nodeObj.props as Record<string, unknown>,\n `${currentPath}/props`,\n effectiveNodeId,\n options,\n errors,\n );\n }\n }\n\n // Validate Styles\n if (nodeObj.styles !== undefined) {\n if (typeof nodeObj.styles !== 'object' || nodeObj.styles === null || Array.isArray(nodeObj.styles)) {\n errors.push({\n code: 'NODE_SHAPE_INVALID',\n message: 'Node styles must be an object',\n path: `${currentPath}/styles`,\n nodeId: effectiveNodeId,\n });\n }\n }\n}\n\n/**\n * Recursively inspect props object for structural bindings (asset, variable, action)\n */\nfunction validatePropsBindings(\n propsObj: Record<string, unknown>,\n propsPath: string,\n nodeId: string | undefined,\n options: ValidationOptions,\n errors: DocumentValidationError[],\n): void {\n for (const [key, value] of Object.entries(propsObj)) {\n const currentPath = `${propsPath}/${key}`;\n\n if (!value || typeof value !== 'object') {\n continue;\n }\n\n if (Array.isArray(value)) {\n value.forEach((item, index) => {\n if (item && typeof item === 'object' && !Array.isArray(item)) {\n validatePropsBindings(\n item as Record<string, unknown>,\n `${currentPath}/${index}`,\n nodeId,\n options,\n errors,\n );\n }\n });\n continue;\n }\n\n const record = value as Record<string, unknown>;\n\n // Check if it's an Asset Reference\n if (record.type === 'asset') {\n if (typeof record.assetId !== 'string' || record.assetId.trim().length === 0) {\n errors.push({\n code: 'INVALID_ASSET_REFERENCE',\n message: 'Asset reference must have a non-empty \"assetId\"',\n path: `${currentPath}/assetId`,\n nodeId,\n });\n }\n if (record.fallbackUrl !== undefined && typeof record.fallbackUrl !== 'string') {\n errors.push({\n code: 'INVALID_ASSET_REFERENCE',\n message: 'Asset fallbackUrl must be a string if provided',\n path: `${currentPath}/fallbackUrl`,\n nodeId,\n });\n }\n }\n // Check if it's a Variable Binding\n else if (record.type === 'variable') {\n if (typeof record.key !== 'string' || record.key.trim().length === 0) {\n errors.push({\n code: 'INVALID_VARIABLE_BINDING',\n message: 'Variable binding must have a non-empty \"key\"',\n path: `${currentPath}/key`,\n nodeId,\n });\n }\n }\n // Check if it's an Action Binding (either key is 'action' or has explicit action shape)\n else if (key === 'action' || (typeof record.type === 'string' && record.payload !== undefined)) {\n if (typeof record.type !== 'string' || record.type.trim().length === 0) {\n errors.push({\n code: 'INVALID_ACTION_BINDING',\n message: 'Action binding must have a non-empty \"type\"',\n path: `${currentPath}/type`,\n nodeId,\n });\n }\n } else {\n // Recurse into nested objects\n validatePropsBindings(record, currentPath, nodeId, options, errors);\n }\n }\n}\n","/**\n * Security Limits and Sanitization Utilities for KUBUILD documents, assets, and actions.\n */\n\nexport interface DocumentSecurityLimits {\n /**\n * Maximum allowed total nodes in the document tree (default: 5000).\n */\n maxNodeCount?: number;\n\n /**\n * Maximum allowed nesting depth of nodes (default: 32).\n */\n maxTreeDepth?: number;\n\n /**\n * Maximum number of direct properties per node (default: 200).\n */\n maxPropsCount?: number;\n\n /**\n * Maximum character length for any individual string property (default: 100,000).\n */\n maxStringLength?: number;\n\n /**\n * Maximum number of direct children per node (default: 1000).\n */\n maxChildrenPerNode?: number;\n\n /**\n * Maximum allowed JSON serialized size in bytes (default: 10MB).\n */\n maxDocumentSizeBytes?: number;\n\n /**\n * Allowed URL schemes for links and media.\n * Default: ['http:', 'https:', 'mailto:', 'tel:', '#', 'relative', 'data:image/']\n */\n allowedUrlSchemes?: string[];\n\n /**\n * Prohibited property keys to defend against Prototype Pollution.\n * Default: ['__proto__', 'constructor', 'prototype', '__defineGetter__', '__defineSetter__', '__lookupGetter__', '__lookupSetter__']\n */\n prohibitedPropertyKeys?: string[];\n\n /**\n * Prohibited asset file extensions to prevent executable uploads.\n * Default: ['.exe', '.dll', '.so', '.sh', '.bat', '.cmd', '.js', '.mjs', '.cjs', '.php', '.py', '.vbs', '.wasm', '.bin', '.com', '.scr', '.pif']\n */\n prohibitedAssetExtensions?: string[];\n\n /**\n * Maximum compression expansion ratio before flagging potential zip bomb (default: 100).\n */\n maxZipExpansionRatio?: number;\n}\n\nexport const DEFAULT_DOCUMENT_SECURITY_LIMITS: Required<DocumentSecurityLimits> = {\n maxNodeCount: 5000,\n maxTreeDepth: 32,\n maxPropsCount: 200,\n maxStringLength: 100_000,\n maxChildrenPerNode: 1000,\n maxDocumentSizeBytes: 10 * 1024 * 1024, // 10 MB\n allowedUrlSchemes: ['http:', 'https:', 'mailto:', 'tel:', '#', 'relative', 'data:image/'],\n prohibitedPropertyKeys: [\n '__proto__',\n 'constructor',\n 'prototype',\n '__defineGetter__',\n '__defineSetter__',\n '__lookupGetter__',\n '__lookupSetter__',\n ],\n prohibitedAssetExtensions: [\n '.exe',\n '.dll',\n '.so',\n '.sh',\n '.bat',\n '.cmd',\n '.js',\n '.mjs',\n '.cjs',\n '.php',\n '.py',\n '.vbs',\n '.wasm',\n '.bin',\n '.com',\n '.scr',\n '.pif',\n '.hta',\n '.jar',\n ],\n maxZipExpansionRatio: 100,\n};\n\nexport interface SecurityViolation {\n code:\n | 'PROTOTYPE_POLLUTION_DETECTED'\n | 'MAX_NODE_COUNT_EXCEEDED'\n | 'MAX_TREE_DEPTH_EXCEEDED'\n | 'MAX_PROPS_COUNT_EXCEEDED'\n | 'MAX_STRING_LENGTH_EXCEEDED'\n | 'MAX_CHILDREN_COUNT_EXCEEDED'\n | 'MAX_DOCUMENT_SIZE_EXCEEDED'\n | 'UNSAFE_URL_DETECTED'\n | 'EXECUTABLE_ASSET_DETECTED'\n | 'ZIP_BOMB_DETECTED';\n message: string;\n path?: string;\n details?: Record<string, unknown>;\n}\n\n/**\n * Checks whether a URL is safe according to the allowed URL schemes.\n * Rejects dangerous schemes such as javascript:, vbscript:, data:text/html, etc.\n */\nexport function isSafeUrl(\n url: unknown,\n options?: {\n allowedSchemes?: string[];\n allowDataImage?: boolean;\n /** Allow `blob:` URLs (runtime-only, e.g. in-memory uploaded media previews). */\n allowBlobMedia?: boolean;\n }\n): boolean {\n if (typeof url !== 'string') return false;\n\n const trimmed = url.trim();\n if (trimmed.length === 0) return true;\n\n // Relative URLs & fragments are safe\n if (\n trimmed.startsWith('/') ||\n trimmed.startsWith('#') ||\n trimmed.startsWith('./') ||\n trimmed.startsWith('../') ||\n trimmed.startsWith('?')\n ) {\n return true;\n }\n\n // Check for control characters or null bytes\n if (/[\\u0000-\\u001F\\u007F-\\u009F]/.test(trimmed)) {\n return false;\n }\n\n // Extract scheme\n const colonIndex = trimmed.indexOf(':');\n if (colonIndex === -1) {\n // Relative path or plain fragment without scheme\n return true;\n }\n\n const scheme = trimmed.substring(0, colonIndex + 1).toLowerCase();\n\n // Explicitly block dangerous protocols\n const dangerousSchemes = ['javascript:', 'vbscript:', 'file:', 'data:'];\n if (scheme !== 'data:' && dangerousSchemes.includes(scheme)) {\n // `blob:` URLs are runtime-only references to in-memory media (e.g. files\n // uploaded in the current editor session). They never originate from\n // imported documents, so they are safe to allow for media previews.\n if (scheme === 'blob:' && options?.allowBlobMedia) {\n return true;\n }\n return false;\n }\n\n // Handle data: scheme\n if (scheme === 'data:') {\n const allowDataImage = options?.allowDataImage ?? true;\n if (!allowDataImage) return false;\n\n // Only allow safe data:image/ mime types\n const dataPrefix = trimmed.substring(0, 30).toLowerCase();\n const safeDataImagePrefixes = [\n 'data:image/png',\n 'data:image/jpeg',\n 'data:image/jpg',\n 'data:image/webp',\n 'data:image/gif',\n 'data:image/avif',\n 'data:image/svg+xml',\n ];\n return safeDataImagePrefixes.some((p) => dataPrefix.startsWith(p));\n }\n\n // Verify against allowed schemes list\n const allowed = options?.allowedSchemes || DEFAULT_DOCUMENT_SECURITY_LIMITS.allowedUrlSchemes;\n return allowed.some((s) => s.toLowerCase() === scheme);\n}\n\n/**\n * Sanitizes a URL, returning a safe URL or a fallback (default empty string or '#').\n */\nexport function sanitizeUrl(\n url: unknown,\n fallback: string = '',\n options?: Parameters<typeof isSafeUrl>[1]\n): string {\n if (typeof url !== 'string') return fallback;\n return isSafeUrl(url, options) ? url : fallback;\n}\n\n/**\n * Checks an object recursively for prohibited prototype pollution keys.\n */\nexport function containsProhibitedKeys(\n obj: unknown,\n prohibitedKeys: string[] = DEFAULT_DOCUMENT_SECURITY_LIMITS.prohibitedPropertyKeys\n): { found: boolean; path: string; key: string } {\n const prohibitedSet = new Set(prohibitedKeys.map((k) => k.toLowerCase()));\n const visited = new WeakSet<object>();\n\n function check(value: unknown, currentPath: string): { found: boolean; path: string; key: string } {\n if (!value || typeof value !== 'object') {\n return { found: false, path: '', key: '' };\n }\n\n if (visited.has(value)) {\n return { found: false, path: '', key: '' };\n }\n visited.add(value);\n\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const res = check(value[i], `${currentPath}[${i}]`);\n if (res.found) return res;\n }\n return { found: false, path: '', key: '' };\n }\n\n const record = value as Record<string, unknown>;\n const keysToCheck = Array.from(new Set([...Object.keys(record), ...Object.getOwnPropertyNames(record)]));\n\n for (const key of keysToCheck) {\n if (prohibitedSet.has(key.toLowerCase())) {\n return { found: true, path: currentPath ? `${currentPath}.${key}` : key, key };\n }\n const res = check(record[key], currentPath ? `${currentPath}.${key}` : key);\n if (res.found) return res;\n }\n\n // Check if __proto__ was injected and altered standard prototype\n if (Object.prototype.hasOwnProperty.call(record, '__proto__')) {\n return { found: true, path: currentPath ? `${currentPath}.__proto__` : '__proto__', key: '__proto__' };\n }\n\n return { found: false, path: '', key: '' };\n }\n\n return check(obj, '');\n}\n\n/**\n * Validates a document against security limits (node count, tree depth, props count, string length, prototype pollution).\n */\nexport function validateDocumentSecurity(\n doc: unknown,\n customLimits?: DocumentSecurityLimits\n): { safe: boolean; errors: SecurityViolation[] } {\n const limits = { ...DEFAULT_DOCUMENT_SECURITY_LIMITS, ...customLimits };\n const errors: SecurityViolation[] = [];\n\n if (!doc || typeof doc !== 'object') {\n return { safe: true, errors: [] };\n }\n\n // 1. Prototype Pollution Check\n const protoCheck = containsProhibitedKeys(doc, limits.prohibitedPropertyKeys);\n if (protoCheck.found) {\n errors.push({\n code: 'PROTOTYPE_POLLUTION_DETECTED',\n message: `Prohibited property key \"${protoCheck.key}\" detected at path \"${protoCheck.path}\" (Prototype Pollution Defense).`,\n path: protoCheck.path,\n details: { key: protoCheck.key },\n });\n }\n\n // 2. Document Serialized Size Check\n try {\n const jsonStr = JSON.stringify(doc);\n if (jsonStr.length > limits.maxDocumentSizeBytes) {\n errors.push({\n code: 'MAX_DOCUMENT_SIZE_EXCEEDED',\n message: `Document size (${jsonStr.length} bytes) exceeds limit of ${limits.maxDocumentSizeBytes} bytes.`,\n details: { size: jsonStr.length, limit: limits.maxDocumentSizeBytes },\n });\n }\n } catch {\n // Ignore JSON stringify errors\n }\n\n // 3. Tree Depth & Node Count Checks\n const docObj = doc as Record<string, unknown>;\n const rootNode = docObj.document;\n\n if (rootNode && typeof rootNode === 'object') {\n let totalNodes = 0;\n\n function traverse(node: unknown, depth: number, currentPath: string): void {\n if (!node || typeof node !== 'object' || Array.isArray(node)) return;\n\n totalNodes++;\n if (totalNodes > limits.maxNodeCount) {\n errors.push({\n code: 'MAX_NODE_COUNT_EXCEEDED',\n message: `Total document nodes (${totalNodes}) exceeded security limit of ${limits.maxNodeCount}.`,\n path: currentPath,\n details: { nodeCount: totalNodes, limit: limits.maxNodeCount },\n });\n return;\n }\n\n if (depth > limits.maxTreeDepth) {\n errors.push({\n code: 'MAX_TREE_DEPTH_EXCEEDED',\n message: `Document nesting depth (${depth}) exceeded security limit of ${limits.maxTreeDepth}.`,\n path: currentPath,\n details: { depth, limit: limits.maxTreeDepth },\n });\n return;\n }\n\n const nodeRecord = node as Record<string, unknown>;\n\n // Check Props Limits\n if (nodeRecord.props && typeof nodeRecord.props === 'object' && !Array.isArray(nodeRecord.props)) {\n const propsRecord = nodeRecord.props as Record<string, unknown>;\n const propKeys = Object.keys(propsRecord);\n\n if (propKeys.length > limits.maxPropsCount) {\n errors.push({\n code: 'MAX_PROPS_COUNT_EXCEEDED',\n message: `Node has ${propKeys.length} props, exceeding limit of ${limits.maxPropsCount}.`,\n path: `${currentPath}/props`,\n details: { count: propKeys.length, limit: limits.maxPropsCount },\n });\n }\n\n for (const [k, val] of Object.entries(propsRecord)) {\n if (typeof val === 'string' && val.length > limits.maxStringLength) {\n errors.push({\n code: 'MAX_STRING_LENGTH_EXCEEDED',\n message: `Prop \"${k}\" string length (${val.length}) exceeds limit of ${limits.maxStringLength}.`,\n path: `${currentPath}/props/${k}`,\n details: { length: val.length, limit: limits.maxStringLength },\n });\n }\n }\n }\n\n // Check Children Limits\n if (nodeRecord.children && Array.isArray(nodeRecord.children)) {\n if (nodeRecord.children.length > limits.maxChildrenPerNode) {\n errors.push({\n code: 'MAX_CHILDREN_COUNT_EXCEEDED',\n message: `Node has ${nodeRecord.children.length} direct children, exceeding limit of ${limits.maxChildrenPerNode}.`,\n path: `${currentPath}/children`,\n details: { count: nodeRecord.children.length, limit: limits.maxChildrenPerNode },\n });\n }\n\n for (let i = 0; i < nodeRecord.children.length; i++) {\n traverse(nodeRecord.children[i], depth + 1, `${currentPath}/children/${i}`);\n }\n }\n }\n\n traverse(rootNode, 1, '/document');\n }\n\n return {\n safe: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Checks if an asset filename has a dangerous or executable extension.\n */\nexport function isDangerousAssetFilename(\n filename: string,\n prohibitedExtensions: string[] = DEFAULT_DOCUMENT_SECURITY_LIMITS.prohibitedAssetExtensions\n): boolean {\n if (!filename || typeof filename !== 'string') return true;\n\n const lower = filename.toLowerCase().trim();\n\n // Check double extensions like \"malicious.exe.png\" or \"script.php.jpg\"\n return prohibitedExtensions.some((ext) => {\n const extLower = ext.toLowerCase();\n return lower.endsWith(extLower) || lower.includes(`${extLower}.`);\n });\n}\n\n/**\n * Checks whether an archive expansion ratio indicates a zip bomb attack.\n */\nexport function checkZipBomb(\n compressedSize: number,\n uncompressedSize: number,\n maxRatio: number = DEFAULT_DOCUMENT_SECURITY_LIMITS.maxZipExpansionRatio\n): boolean {\n if (compressedSize <= 0) return false;\n // Only enforce ratio for archives whose uncompressed payload is non-trivial (>10MB)\n if (uncompressedSize > 10 * 1024 * 1024) {\n const ratio = uncompressedSize / compressedSize;\n return ratio > maxRatio;\n }\n return false;\n}\n\n/**\n * Sanitizes an HTML string by stripping unsafe tags (<script>, <object>, <embed>, <applet>, <base>, <link rel=\"import\">),\n * removing inline event handlers (on* attributes like onclick, onerror, onload, etc.),\n * and disarming javascript:/vbscript:/data:text/html URLs in attributes.\n */\nexport function sanitizeHtml(rawHtml: unknown): string {\n if (typeof rawHtml !== 'string') return '';\n let html = rawHtml;\n\n // 1. Remove script tags and their content\n html = html.replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, '');\n\n // 2. Remove object, embed, applet, base, and link tags\n html = html.replace(/<\\/?(object|embed|applet|base|link)\\b[^>]*>/gi, '');\n\n // 3. Remove on* event handler attributes (e.g. onload=, onclick=, onerror=, onfocus=)\n html = html.replace(/\\s+on[a-z0-9_-]+\\s*=\\s*(?:'[^']*'|\"[^\"]*\"|[^\\s>]+)/gi, '');\n\n // 4. Disarm javascript:, vbscript:, and data:text/html protocol attributes in href/src/data/action\n html = html.replace(\n /\\b(href|src|data|action)\\s*=\\s*(['\"])\\s*(?:javascript:|vbscript:|data:text\\/html)[^'\"]*\\2/gi,\n '$1=\"#\"'\n );\n html = html.replace(\n /\\b(href|src|data|action)\\s*=\\s*(?:javascript:|vbscript:|data:text\\/html)[^\\s>]+/gi,\n '$1=\"#\"'\n );\n\n return html;\n}\n\n","import { PageDocument, Node, SCHEMA_NAME } from '@kubuild/schema';\nimport type { ComponentRegistryLike } from './validator';\n\nexport { validateDocument } from './validator';\nexport type {\n DocumentValidationResult,\n DocumentValidationError,\n DocumentValidationErrorCode,\n ValidationOptions,\n ComponentDefinitionLike,\n ComponentRegistryLike,\n} from './validator';\n\n\nexport function createBlankDocument(title = 'Untitled Page'): PageDocument {\n return {\n schema: SCHEMA_NAME,\n version: '1.0.0',\n metadata: {\n title,\n description: '',\n author: '',\n tags: [],\n category: 'general',\n version: '1.0.0',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n },\n document: {\n id: 'root-page',\n type: 'page',\n props: { title },\n styles: { base: { minHeight: '100vh', backgroundColor: '#ffffff' } },\n children: [] as Node[],\n },\n };\n}\n\nexport function findNodeById(rootNode: Node, targetId: string): Node | null {\n if (rootNode.id === targetId) return rootNode;\n if (!rootNode.children) return null;\n for (const child of rootNode.children) {\n const found = findNodeById(child, targetId);\n if (found) return found;\n }\n return null;\n}\n\nexport interface CollectedAssetReference {\n assetId: string;\n reference: {\n type: 'asset';\n assetId: string;\n filename?: string;\n mimeType?: string;\n fallbackUrl?: string;\n };\n nodeId: string;\n propPath: string;\n}\n\n/**\n * Collect all AssetReference objects throughout a document tree.\n */\nexport function collectAssetReferences(rootNode: Node): CollectedAssetReference[] {\n const results: CollectedAssetReference[] = [];\n\n function traverseProps(propsObj: unknown, currentPath: string, nodeId: string): void {\n if (!propsObj || typeof propsObj !== 'object') return;\n\n if (Array.isArray(propsObj)) {\n propsObj.forEach((item, index) => {\n traverseProps(item, `${currentPath}/${index}`, nodeId);\n });\n return;\n }\n\n const record = propsObj as Record<string, unknown>;\n\n if (record.type === 'asset' && typeof record.assetId === 'string' && record.assetId.trim().length > 0) {\n results.push({\n assetId: record.assetId,\n reference: {\n type: 'asset',\n assetId: record.assetId,\n filename: typeof record.filename === 'string' ? record.filename : undefined,\n mimeType: typeof record.mimeType === 'string' ? record.mimeType : undefined,\n fallbackUrl: typeof record.fallbackUrl === 'string' ? record.fallbackUrl : undefined,\n },\n nodeId,\n propPath: currentPath,\n });\n }\n\n for (const [key, val] of Object.entries(record)) {\n if (val && typeof val === 'object') {\n traverseProps(val, `${currentPath}/${key}`, nodeId);\n }\n }\n }\n\n function traverseNode(node: Node): void {\n if (node.props) {\n traverseProps(node.props, `/document/${node.id}/props`, node.id);\n }\n if (node.children && Array.isArray(node.children)) {\n for (const child of node.children) {\n traverseNode(child);\n }\n }\n }\n\n traverseNode(rootNode);\n return results;\n}\n\nexport interface TreeRequirements {\n requiredComponents: string[];\n requiredCapabilities: string[];\n}\n\n/**\n * Extracts custom component types and capabilities required by a node tree.\n */\nexport function extractRequirementsFromTree(\n rootNode: Node,\n registry?: ComponentRegistryLike,\n): TreeRequirements {\n const requiredComponents = new Set<string>();\n const requiredCapabilities = new Set<string>();\n\n function traverse(node: Node): void {\n if (registry) {\n const def = registry.get(node.type);\n if (def?.category === 'custom') {\n requiredComponents.add(node.type);\n }\n if (def?.capabilities && Array.isArray(def.capabilities)) {\n for (const cap of def.capabilities) {\n requiredCapabilities.add(cap);\n }\n }\n }\n\n if (node.children && Array.isArray(node.children)) {\n for (const child of node.children) {\n traverse(child);\n }\n }\n }\n\n traverse(rootNode);\n\n return {\n requiredComponents: Array.from(requiredComponents).sort(),\n requiredCapabilities: Array.from(requiredCapabilities).sort(),\n };\n}\n\n/**\n * Remap asset references in a node tree based on an ID mapping dictionary.\n * Mutates the node props in place and returns the number of references updated.\n */\nexport function remapAssetReferences(\n rootNode: Node,\n idMap: Record<string, string> | Map<string, string>,\n): number {\n let remappedCount = 0;\n const getMappedId = (id: string): string | undefined => {\n if (idMap instanceof Map) return idMap.get(id);\n return idMap[id];\n };\n\n function traverseProps(propsObj: unknown): void {\n if (!propsObj || typeof propsObj !== 'object') return;\n\n if (Array.isArray(propsObj)) {\n for (const item of propsObj) {\n traverseProps(item);\n }\n return;\n }\n\n const record = propsObj as Record<string, unknown>;\n\n if (record.type === 'asset' && typeof record.assetId === 'string') {\n const newId = getMappedId(record.assetId);\n if (newId !== undefined && newId !== record.assetId) {\n record.assetId = newId;\n remappedCount++;\n }\n }\n\n for (const val of Object.values(record)) {\n if (val && typeof val === 'object') {\n traverseProps(val);\n }\n }\n }\n\n function traverseNode(node: Node): void {\n if (node.props) {\n traverseProps(node.props);\n }\n if (node.children && Array.isArray(node.children)) {\n for (const child of node.children) {\n traverseNode(child);\n }\n }\n }\n\n traverseNode(rootNode);\n return remappedCount;\n}\n\n/**\n * Remaps all asset references throughout a PageDocument.\n */\nexport function remapDocumentAssetReferences(\n doc: PageDocument,\n idMap: Record<string, string> | Map<string, string>,\n): PageDocument {\n if (doc && doc.document) {\n remapAssetReferences(doc.document, idMap);\n }\n return doc;\n}\n\nexport interface MissingComponentNodeInfo {\n nodeId: string;\n componentType: string;\n props: Record<string, unknown>;\n node: Node;\n}\n\n/**\n * Finds all nodes in a node tree that reference component types not registered in the host.\n * This is useful in placeholder mode to inspect missing nodes and their preserved props.\n */\nexport function findMissingComponentNodes(\n rootNode: Node,\n registry?: ComponentRegistryLike,\n knownTypes?: string[] | Set<string>,\n): MissingComponentNodeInfo[] {\n const missing: MissingComponentNodeInfo[] = [];\n const knownSet = new Set<string>();\n\n if (knownTypes) {\n for (const t of knownTypes) knownSet.add(t);\n }\n\n const standardBuiltIns = [\n 'page',\n 'section',\n 'container',\n 'columns',\n 'heading',\n 'text',\n 'image',\n 'button',\n 'collection',\n ];\n for (const b of standardBuiltIns) knownSet.add(b);\n\n function checkNode(node: Node): void {\n let isSupported = knownSet.has(node.type);\n if (!isSupported && registry) {\n isSupported = registry.has(node.type);\n }\n\n if (!isSupported) {\n missing.push({\n nodeId: node.id,\n componentType: node.type,\n props: node.props ? { ...node.props } : {},\n node,\n });\n }\n\n if (node.children && Array.isArray(node.children)) {\n for (const child of node.children) {\n checkNode(child);\n }\n }\n }\n\n checkNode(rootNode);\n return missing;\n}\n\n\n","import {\n PageDocument,\n Node,\n ResponsiveStyles,\n StyleDefinition,\n StyleDefinitionSchema,\n ResponsiveStylesSchema,\n} from '@kubuild/schema';\nimport {\n deepClone,\n findNodeLocation,\n isDescendantOf,\n collectNodeIdSet,\n cloneTreeWithNewIds,\n} from './command-tree-utils';\n\nexport type DocumentChangeType =\n | 'NODE_INSERTED'\n | 'NODE_MOVED'\n | 'PROPS_UPDATED'\n | 'STYLE_UPDATED'\n | 'NODE_REMOVED'\n | 'NODE_DUPLICATED';\n\nexport interface DocumentChangeEvent {\n type: DocumentChangeType;\n timestamp: string;\n nodeId: string;\n parentId?: string;\n previousParentId?: string;\n index?: number;\n previousIndex?: number;\n payload?: Record<string, unknown>;\n}\n\nexport interface CommandResult {\n document: PageDocument;\n event: DocumentChangeEvent;\n}\n\nexport interface InsertNodeParams {\n parentId: string;\n node: Node;\n index?: number;\n}\n\nexport interface MoveNodeParams {\n nodeId: string;\n targetParentId: string;\n index?: number;\n}\n\nexport interface UpdatePropsParams {\n nodeId: string;\n props: Record<string, unknown>;\n /**\n * If true (default), shallow merges new props with existing props.\n * If false, replaces the entire props object.\n */\n merge?: boolean;\n}\n\nexport interface UpdateStyleParams {\n nodeId: string;\n styles: ResponsiveStyles | StyleDefinition;\n /**\n * Target breakpoint to update directly, or if omitted, applies to whole ResponsiveStyles structure.\n */\n breakpoint?: 'base' | 'desktop' | 'tablet' | 'mobile';\n /**\n * Target pseudo-state layer (e.g. ':hover', ':active', ':focus') — STORA-221.\n * When set, `styles` is written to `node.styles.states[state]` instead of a\n * breakpoint layer, leaving default (breakpoint) values untouched.\n */\n state?: string;\n /**\n * If true (default), shallow merges style definitions at target breakpoint.\n * If false, replaces the style definition object.\n */\n merge?: boolean;\n}\n\nexport interface RemoveNodeParams {\n nodeId: string;\n}\n\nexport interface DuplicateNodeParams {\n nodeId: string;\n targetParentId?: string;\n index?: number;\n idGenerator?: (oldId: string) => string;\n}\n\n/**\n * 1. Insert a node into a target parent node.\n * Returns a new PageDocument and a NODE_INSERTED event.\n */\nexport function insertNode(\n document: PageDocument,\n params: InsertNodeParams,\n): CommandResult {\n const { parentId, node, index } = params;\n\n if (!node || typeof node !== 'object' || !node.id || !node.type) {\n throw new Error('Invalid node: Node must be an object with non-empty \"id\" and \"type\"');\n }\n\n const newDoc = deepClone(document);\n const existingIds = collectNodeIdSet(newDoc.document);\n\n // Check duplicate ID\n const incomingIds = collectNodeIdSet(node);\n for (const incId of incomingIds) {\n if (existingIds.has(incId)) {\n throw new Error(`Cannot insert node: Duplicate node ID \"${incId}\" already exists in document.`);\n }\n }\n\n const parentLoc = findNodeLocation(newDoc.document, parentId);\n if (!parentLoc) {\n throw new Error(`Cannot insert node: Target parent node with ID \"${parentId}\" not found.`);\n }\n\n const parentNode = parentLoc.node;\n if (!parentNode.children) {\n parentNode.children = [];\n }\n\n const insertIndex =\n typeof index === 'number' && index >= 0 && index <= parentNode.children.length\n ? index\n : parentNode.children.length;\n\n parentNode.children.splice(insertIndex, 0, deepClone(node));\n\n return {\n document: newDoc,\n event: {\n type: 'NODE_INSERTED',\n timestamp: new Date().toISOString(),\n nodeId: node.id,\n parentId,\n index: insertIndex,\n payload: {\n nodeType: node.type,\n },\n },\n };\n}\n\n/**\n * 2. Move a node from its current location to a new parent location.\n * Prevents moving the root node or moving a node into its own descendant tree.\n * Returns a new PageDocument and a NODE_MOVED event.\n */\nexport function moveNode(\n document: PageDocument,\n params: MoveNodeParams,\n): CommandResult {\n const { nodeId, targetParentId, index } = params;\n\n if (nodeId === document.document.id) {\n throw new Error('Cannot move the root page node.');\n }\n\n const newDoc = deepClone(document);\n\n const sourceLoc = findNodeLocation(newDoc.document, nodeId);\n if (!sourceLoc || !sourceLoc.parent) {\n throw new Error(`Cannot move node: Node with ID \"${nodeId}\" not found in document.`);\n }\n\n const targetLoc = findNodeLocation(newDoc.document, targetParentId);\n if (!targetLoc) {\n throw new Error(`Cannot move node: Target parent with ID \"${targetParentId}\" not found in document.`);\n }\n\n // Descendant cycle check: Cannot move node into itself or any of its descendants\n if (isDescendantOf(sourceLoc.node, targetParentId)) {\n throw new Error(\n `Cannot move node: Target parent \"${targetParentId}\" is the node itself or a descendant of node \"${nodeId}\".`,\n );\n }\n\n const previousParentId = sourceLoc.parent.id;\n const previousIndex = sourceLoc.index;\n\n // Remove node from source parent\n const [removedNode] = sourceLoc.parent.children!.splice(previousIndex, 1);\n\n // Target parent might be the same parent or different parent\n const targetParent = targetLoc.node;\n if (!targetParent.children) {\n targetParent.children = [];\n }\n\n let targetIndex =\n typeof index === 'number' && index >= 0 && index <= targetParent.children.length\n ? index\n : targetParent.children.length;\n\n targetParent.children.splice(targetIndex, 0, removedNode);\n\n return {\n document: newDoc,\n event: {\n type: 'NODE_MOVED',\n timestamp: new Date().toISOString(),\n nodeId,\n parentId: targetParentId,\n previousParentId,\n index: targetIndex,\n previousIndex,\n },\n };\n}\n\n/**\n * 3. Update the props of an existing node.\n * Returns a new PageDocument and a PROPS_UPDATED event.\n */\nexport function updateProps(\n document: PageDocument,\n params: UpdatePropsParams,\n): CommandResult {\n const { nodeId, props, merge = true } = params;\n\n if (!props || typeof props !== 'object' || Array.isArray(props)) {\n throw new Error('Props must be an object.');\n }\n\n const newDoc = deepClone(document);\n const loc = findNodeLocation(newDoc.document, nodeId);\n if (!loc) {\n throw new Error(`Cannot update props: Node with ID \"${nodeId}\" not found in document.`);\n }\n\n const targetNode = loc.node;\n const previousProps = targetNode.props ? deepClone(targetNode.props) : {};\n\n if (merge) {\n targetNode.props = {\n ...previousProps,\n ...deepClone(props),\n };\n } else {\n targetNode.props = deepClone(props);\n }\n\n return {\n document: newDoc,\n event: {\n type: 'PROPS_UPDATED',\n timestamp: new Date().toISOString(),\n nodeId,\n parentId: loc.parent ? loc.parent.id : undefined,\n payload: {\n props: targetNode.props,\n previousProps,\n },\n },\n };\n}\n\n/**\n * 4. Update the responsive styles of an existing node.\n * Supports updating a specific breakpoint ('base', 'desktop', etc.) or the whole ResponsiveStyles object.\n * Returns a new PageDocument and a STYLE_UPDATED event.\n */\nexport function updateStyle(\n document: PageDocument,\n params: UpdateStyleParams,\n): CommandResult {\n const { nodeId, styles, breakpoint, state, merge = true } = params;\n\n if (!styles || typeof styles !== 'object' || Array.isArray(styles)) {\n throw new Error('Styles must be an object.');\n }\n\n const newDoc = deepClone(document);\n const loc = findNodeLocation(newDoc.document, nodeId);\n if (!loc) {\n throw new Error(`Cannot update style: Node with ID \"${nodeId}\" not found in document.`);\n }\n\n const targetNode = loc.node;\n const currentStyles: ResponsiveStyles = targetNode.styles ? deepClone(targetNode.styles) : {};\n const previousStyles = deepClone(currentStyles);\n\n if (state) {\n // Pseudo-state layer update (STORA-221): writes into styles.states[state]\n // without touching default breakpoint values. Parsed through\n // StyleDefinitionSchema so unsafe values are rejected here too.\n const newBreakpointStyles = StyleDefinitionSchema.parse(styles);\n const states = { ...(currentStyles.states ?? {}) };\n const currentStateStyles = states[state] ?? {};\n\n if (merge) {\n states[state] = { ...currentStateStyles, ...deepClone(newBreakpointStyles) };\n } else {\n states[state] = deepClone(newBreakpointStyles);\n }\n\n targetNode.styles = { ...currentStyles, states } as ResponsiveStyles;\n\n return {\n document: newDoc,\n event: {\n type: 'STYLE_UPDATED',\n timestamp: new Date().toISOString(),\n nodeId,\n parentId: loc.parent ? loc.parent.id : undefined,\n payload: {\n styles: targetNode.styles,\n previousStyles,\n state,\n },\n },\n };\n }\n\n if (breakpoint) {\n // Updating a single breakpoint style definition. Parsed through\n // StyleDefinitionSchema so unsafe/non-serializable values (STORA-023)\n // are rejected here too, not just at document-parse time.\n const currentBreakpointStyles = (currentStyles[breakpoint] as StyleDefinition) || {};\n const newBreakpointStyles = StyleDefinitionSchema.parse(styles);\n\n if (merge) {\n currentStyles[breakpoint] = {\n ...currentBreakpointStyles,\n ...deepClone(newBreakpointStyles),\n };\n } else {\n currentStyles[breakpoint] = deepClone(newBreakpointStyles);\n }\n } else {\n // Updating responsive styles container\n const responsiveStylesInput = ResponsiveStylesSchema.parse(styles);\n if (merge) {\n for (const bp of ['base', 'desktop', 'tablet', 'mobile'] as const) {\n if (responsiveStylesInput[bp] !== undefined) {\n const currentBp = (currentStyles[bp] as StyleDefinition) || {};\n const incomingBp = (responsiveStylesInput[bp] as StyleDefinition) || {};\n currentStyles[bp] = {\n ...currentBp,\n ...deepClone(incomingBp),\n };\n }\n }\n } else {\n targetNode.styles = deepClone(responsiveStylesInput);\n return {\n document: newDoc,\n event: {\n type: 'STYLE_UPDATED',\n timestamp: new Date().toISOString(),\n nodeId,\n parentId: loc.parent ? loc.parent.id : undefined,\n payload: {\n styles: targetNode.styles,\n previousStyles,\n },\n },\n };\n }\n }\n\n targetNode.styles = currentStyles;\n\n return {\n document: newDoc,\n event: {\n type: 'STYLE_UPDATED',\n timestamp: new Date().toISOString(),\n nodeId,\n parentId: loc.parent ? loc.parent.id : undefined,\n payload: {\n styles: currentStyles,\n previousStyles,\n breakpoint,\n },\n },\n };\n}\n\n/**\n * 5. Remove a node from the document tree.\n * Prevents removing the root page node.\n * Returns a new PageDocument and a NODE_REMOVED event.\n */\nexport function removeNode(\n document: PageDocument,\n params: RemoveNodeParams,\n): CommandResult {\n const { nodeId } = params;\n\n if (nodeId === document.document.id) {\n throw new Error('Cannot remove the root page node.');\n }\n\n const newDoc = deepClone(document);\n const loc = findNodeLocation(newDoc.document, nodeId);\n if (!loc || !loc.parent) {\n throw new Error(`Cannot remove node: Node with ID \"${nodeId}\" not found in document.`);\n }\n\n const parentId = loc.parent.id;\n const index = loc.index;\n\n const [removedNode] = loc.parent.children!.splice(index, 1);\n\n return {\n document: newDoc,\n event: {\n type: 'NODE_REMOVED',\n timestamp: new Date().toISOString(),\n nodeId,\n parentId,\n index,\n payload: {\n node: removedNode,\n },\n },\n };\n}\n\n/**\n * 6. Duplicate a node and its entire subtree.\n * Generates fresh unique IDs for all cloned nodes in the subtree, preserves props/styles,\n * and inserts the duplicate right after the original node (or at specified targetParentId/index).\n * Returns a new PageDocument and a NODE_DUPLICATED event.\n */\nexport function duplicateNode(\n document: PageDocument,\n params: DuplicateNodeParams,\n): CommandResult {\n const { nodeId, targetParentId, index, idGenerator } = params;\n\n if (nodeId === document.document.id) {\n throw new Error('Cannot duplicate the root page node.');\n }\n\n const newDoc = deepClone(document);\n const loc = findNodeLocation(newDoc.document, nodeId);\n if (!loc || !loc.parent) {\n throw new Error(`Cannot duplicate node: Node with ID \"${nodeId}\" not found in document.`);\n }\n\n const existingIds = collectNodeIdSet(newDoc.document);\n const { clonedNode, idMap } = cloneTreeWithNewIds(loc.node, idGenerator, existingIds);\n\n const destinationParentId = targetParentId || loc.parent.id;\n const destParentLoc = findNodeLocation(newDoc.document, destinationParentId);\n if (!destParentLoc) {\n throw new Error(`Cannot duplicate node: Destination parent \"${destinationParentId}\" not found.`);\n }\n\n const destParent = destParentLoc.node;\n if (!destParent.children) {\n destParent.children = [];\n }\n\n // Default insertion position is right after the source node if in same parent, else appended\n let insertIndex: number;\n if (typeof index === 'number' && index >= 0 && index <= destParent.children.length) {\n insertIndex = index;\n } else if (destinationParentId === loc.parent.id) {\n insertIndex = loc.index + 1;\n } else {\n insertIndex = destParent.children.length;\n }\n\n destParent.children.splice(insertIndex, 0, clonedNode);\n\n return {\n document: newDoc,\n event: {\n type: 'NODE_DUPLICATED',\n timestamp: new Date().toISOString(),\n nodeId: clonedNode.id,\n parentId: destinationParentId,\n index: insertIndex,\n payload: {\n originalNodeId: nodeId,\n idMap: Object.fromEntries(idMap.entries()),\n },\n },\n };\n}\n","import { Node, collectNodeIds } from '@kubuild/schema';\n\n/**\n * Deep clone an object immutably (JSON-safe).\n */\nexport function deepClone<T>(val: T): T {\n return JSON.parse(JSON.stringify(val));\n}\n\nexport interface NodeLocation {\n node: Node;\n parent: Node | null;\n index: number;\n}\n\n/**\n * Find a node, its parent, and index within the parent's children array.\n */\nexport function findNodeLocation(root: Node, targetId: string): NodeLocation | null {\n if (root.id === targetId) {\n return {\n node: root,\n parent: null,\n index: -1,\n };\n }\n\n return searchNodeLocationRecursive(root, targetId);\n}\n\nfunction searchNodeLocationRecursive(currentParent: Node, targetId: string): NodeLocation | null {\n if (!currentParent.children || currentParent.children.length === 0) {\n return null;\n }\n\n for (let i = 0; i < currentParent.children.length; i++) {\n const child = currentParent.children[i];\n if (child.id === targetId) {\n return {\n node: child,\n parent: currentParent,\n index: i,\n };\n }\n\n const foundInSubtree = searchNodeLocationRecursive(child, targetId);\n if (foundInSubtree) {\n return foundInSubtree;\n }\n }\n\n return null;\n}\n\nexport type NavigationDirection = 'parent' | 'child' | 'previous-sibling' | 'next-sibling';\n\n/**\n * Resolve the node id reached by moving from `nodeId` in a tree-navigation direction.\n * Returns null when there is nowhere to go (e.g. root has no parent, a leaf has no child,\n * or the node sits at the start/end of its sibling list).\n */\nexport function getNavigationTarget(\n root: Node,\n nodeId: string,\n direction: NavigationDirection,\n): string | null {\n const location = findNodeLocation(root, nodeId);\n if (!location) return null;\n\n switch (direction) {\n case 'parent':\n return location.parent?.id ?? null;\n case 'child':\n return location.node.children?.[0]?.id ?? null;\n case 'previous-sibling': {\n if (!location.parent) return null;\n return (location.parent.children ?? [])[location.index - 1]?.id ?? null;\n }\n case 'next-sibling': {\n if (!location.parent) return null;\n return (location.parent.children ?? [])[location.index + 1]?.id ?? null;\n }\n }\n}\n\n/**\n * Returns the chain of ancestor node ids from the root down to (but excluding)\n * `targetId`, root first. Returns [] if targetId is the root or is not found.\n */\nexport function getAncestorChain(root: Node, targetId: string): string[] {\n if (root.id === targetId) return [];\n\n function walk(node: Node, acc: string[]): string[] | null {\n if (!node.children) return null;\n for (const child of node.children) {\n if (child.id === targetId) return acc;\n const found = walk(child, [...acc, child.id]);\n if (found) return found;\n }\n return null;\n }\n\n return walk(root, [root.id]) ?? [];\n}\n\n/**\n * STORA-232: Find the direct parent node of `targetId` in a single O(N) traversal.\n * Returns null when the target is the root or is not found in the tree.\n */\nexport function getParentNodeId(root: Node, targetId: string): string | null {\n if (root.id === targetId) return null;\n\n const stack: Node[] = [root];\n while (stack.length > 0) {\n const current = stack.pop()!;\n const children = current.children;\n if (!children) continue;\n for (const child of children) {\n if (child.id === targetId) return current.id;\n stack.push(child);\n }\n }\n return null;\n}\n\n/**\n * STORA-232: Return the full ancestor path of `targetId` as an array of nodes,\n * ordered from the root down to (and including) the target node itself.\n * Single O(N) traversal: the path is tracked during descent, so no re-walks.\n * Returns [] when the target is not found.\n */\nexport function getNodeAncestors(root: Node, targetId: string): Node[] {\n const path: Node[] = [];\n\n function walk(node: Node): boolean {\n path.push(node);\n if (node.id === targetId) return true;\n if (node.children) {\n for (const child of node.children) {\n if (walk(child)) return true;\n }\n }\n path.pop();\n return false;\n }\n\n return walk(root) ? path : [];\n}\n\n/**\n * Check whether `targetId` is a descendant of `ancestorNode` (or equal to ancestorNode.id).\n */\nexport function isDescendantOf(ancestorNode: Node, targetId: string): boolean {\n if (ancestorNode.id === targetId) {\n return true;\n }\n\n if (!ancestorNode.children || ancestorNode.children.length === 0) {\n return false;\n }\n\n for (const child of ancestorNode.children) {\n if (isDescendantOf(child, targetId)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Collect all node IDs present in a node subtree as a Set.\n */\nexport function collectNodeIdSet(root: Node): Set<string> {\n return new Set(collectNodeIds(root));\n}\n\n/**\n * Default unique ID generator function for node duplication.\n */\nexport function defaultIdGenerator(oldId: string, existingIds?: Set<string>): string {\n // Strip existing suffix like _copy or _copy_1 if exists\n const baseName = oldId.replace(/_copy(_\\d+)?$/, '');\n let candidate = `${baseName}_copy`;\n let counter = 1;\n\n if (existingIds) {\n while (existingIds.has(candidate)) {\n candidate = `${baseName}_copy_${counter}`;\n counter++;\n }\n existingIds.add(candidate);\n }\n\n return candidate;\n}\n\nexport interface ClonedSubtreeResult {\n clonedNode: Node;\n idMap: Map<string, string>; // oldId -> newId\n}\n\n/**\n * Recursively clone a node and its entire subtree, generating fresh unique IDs\n * for every node while preserving types, props, and responsive styles.\n */\nexport function cloneTreeWithNewIds(\n root: Node,\n idGenerator?: (oldId: string) => string,\n existingIds?: Set<string>,\n): ClonedSubtreeResult {\n const idMap = new Map<string, string>();\n const idGen = idGenerator || ((oldId: string) => defaultIdGenerator(oldId, existingIds));\n\n function cloneRecursive(node: Node): Node {\n const newId = idGen(node.id);\n idMap.set(node.id, newId);\n\n const clonedProps = node.props ? deepClone(node.props) : undefined;\n const clonedStyles = node.styles ? deepClone(node.styles) : undefined;\n const clonedChildren = node.children\n ? node.children.map((child) => cloneRecursive(child))\n : [];\n\n return {\n id: newId,\n type: node.type,\n ...(clonedProps ? { props: clonedProps } : {}),\n ...(clonedStyles ? { styles: clonedStyles } : {}),\n children: clonedChildren,\n };\n }\n\n const clonedNode = cloneRecursive(root);\n return { clonedNode, idMap };\n}\n","import { PageDocument } from '@kubuild/schema';\nimport { DocumentChangeEvent, CommandResult } from './commands';\nimport { deepClone } from './command-tree-utils';\n\nexport interface HistoryOptions {\n /**\n * Maximum number of historical states stored in the undo stack.\n * Defaults to 50.\n */\n maxHistory?: number;\n}\n\nexport interface HistoryEntry<T> {\n state: T;\n event?: DocumentChangeEvent;\n timestamp: string;\n}\n\nexport interface HistoryState<T> {\n canUndo: boolean;\n canRedo: boolean;\n undoCount: number;\n redoCount: number;\n present: T;\n}\n\nexport const DEFAULT_MAX_HISTORY = 50;\n\n/**\n * Generic History Engine for immutable state transitions.\n * Maintains undo/redo stacks, enforces maximum history limit,\n * clears redo stack on new actions, and supports resetting state.\n */\nexport class HistoryEngine<T = PageDocument> {\n private past: HistoryEntry<T>[] = [];\n private current: HistoryEntry<T>;\n private future: HistoryEntry<T>[] = [];\n private readonly maxHistory: number;\n\n constructor(initialState: T, options: HistoryOptions = {}) {\n if (initialState === undefined || initialState === null) {\n throw new Error('Initial state must be defined.');\n }\n\n const limit = options.maxHistory ?? DEFAULT_MAX_HISTORY;\n if (typeof limit !== 'number' || limit <= 0 || !Number.isFinite(limit)) {\n throw new Error('maxHistory option must be a positive integer.');\n }\n\n this.maxHistory = Math.floor(limit);\n this.current = {\n state: deepClone(initialState),\n timestamp: new Date().toISOString(),\n };\n }\n\n /**\n * Get the current active state (returns an immutable clone).\n */\n get present(): T {\n return deepClone(this.current.state);\n }\n\n /**\n * Check if undo is available.\n */\n canUndo(): boolean {\n return this.past.length > 0;\n }\n\n /**\n * Check if redo is available.\n */\n canRedo(): boolean {\n return this.future.length > 0;\n }\n\n /**\n * Get total number of states in undo stack.\n */\n get undoCount(): number {\n return this.past.length;\n }\n\n /**\n * Get total number of states in redo stack.\n */\n get redoCount(): number {\n return this.future.length;\n }\n\n /**\n * Get max history limit.\n */\n get limit(): number {\n return this.maxHistory;\n }\n\n /**\n * Push a new state.\n * Clears the redo stack and shifts oldest past entries if maxHistory is exceeded.\n */\n push(nextState: T, event?: DocumentChangeEvent): void {\n if (nextState === undefined || nextState === null) {\n throw new Error('Cannot push undefined or null state into history.');\n }\n\n // Save current to past\n this.past.push(this.current);\n\n // Enforce maxHistory limit on undo stack\n while (this.past.length > this.maxHistory) {\n this.past.shift();\n }\n\n // Set new current\n this.current = {\n state: deepClone(nextState),\n event,\n timestamp: new Date().toISOString(),\n };\n\n // Any new action clears redo future stack\n this.future = [];\n }\n\n /**\n * Undo to the previous state.\n * Returns the restored state, or undefined if undo is not possible.\n */\n undo(): T | undefined {\n if (!this.canUndo()) {\n return undefined;\n }\n\n const previousEntry = this.past.pop()!;\n this.future.unshift(this.current);\n this.current = previousEntry;\n\n return this.present;\n }\n\n /**\n * Redo to the next state in future stack.\n * Returns the restored state, or undefined if redo is not possible.\n */\n redo(): T | undefined {\n if (!this.canRedo()) {\n return undefined;\n }\n\n const nextEntry = this.future.shift()!;\n this.past.push(this.current);\n this.current = nextEntry;\n\n return this.present;\n }\n\n /**\n * Reset the history engine with a new initial state.\n * Clears both undo and redo stacks (e.g. when loading a new document).\n */\n reset(newState: T): void {\n if (newState === undefined || newState === null) {\n throw new Error('New state must be defined when resetting history.');\n }\n\n this.past = [];\n this.future = [];\n this.current = {\n state: deepClone(newState),\n timestamp: new Date().toISOString(),\n };\n }\n\n /**\n * Clear both past and future stacks without changing the current state.\n */\n clear(): void {\n this.past = [];\n this.future = [];\n }\n\n /**\n * Get a snapshot of current history status.\n */\n getState(): HistoryState<T> {\n return {\n canUndo: this.canUndo(),\n canRedo: this.canRedo(),\n undoCount: this.undoCount,\n redoCount: this.redoCount,\n present: this.present,\n };\n }\n}\n\n/**\n * Document History Manager for PageDocument.\n * Connects HistoryEngine with core command execution.\n */\nexport class DocumentHistoryManager {\n private history: HistoryEngine<PageDocument>;\n\n constructor(initialDocument: PageDocument, options?: HistoryOptions) {\n this.history = new HistoryEngine<PageDocument>(initialDocument, options);\n }\n\n get document(): PageDocument {\n return this.history.present;\n }\n\n get canUndo(): boolean {\n return this.history.canUndo();\n }\n\n get canRedo(): boolean {\n return this.history.canRedo();\n }\n\n /**\n * Execute a mutation command immutably and record the resulting state and change event in history.\n */\n execute(executor: (currentDoc: PageDocument) => CommandResult): CommandResult {\n const currentDoc = this.history.present;\n const result = executor(currentDoc);\n this.history.push(result.document, result.event);\n return result;\n }\n\n undo(): PageDocument | undefined {\n return this.history.undo();\n }\n\n redo(): PageDocument | undefined {\n return this.history.redo();\n }\n\n reset(newDocument: PageDocument): void {\n this.history.reset(newDocument);\n }\n\n clear(): void {\n this.history.clear();\n }\n\n getState(): HistoryState<PageDocument> {\n return this.history.getState();\n }\n}\n","import {\n PageDocument,\n PageDocumentSchema,\n CURRENT_SCHEMA_VERSION,\n SCHEMA_NAME,\n ResponsiveStyles,\n} from '@kubuild/schema';\nimport { deepClone } from './command-tree-utils';\nimport { validateDocument } from './validator';\n\nexport type MigrationErrorCode =\n | 'NO_MIGRATION_PATH'\n | 'UNSUPPORTED_SCHEMA_VERSION'\n | 'INVALID_SOURCE_DOCUMENT'\n | 'MIGRATION_EXECUTION_FAILED';\n\nexport interface MigrationError {\n code: MigrationErrorCode;\n message: string;\n sourceVersion: string;\n targetVersion: string;\n details?: Record<string, unknown>;\n}\n\nexport interface MigrationDiagnostic {\n success: boolean;\n sourceVersion: string;\n targetVersion: string;\n migrationPath: string[];\n stepsApplied: number;\n dryRun: boolean;\n errors?: MigrationError[];\n}\n\nexport interface MigrationResult {\n success: boolean;\n document?: PageDocument;\n diagnostic: MigrationDiagnostic;\n}\n\nexport interface MigrateOptions {\n /**\n * Target schema version (defaults to CURRENT_SCHEMA_VERSION = \"1.0.0\").\n */\n targetVersion?: string;\n /**\n * If true, validates path and simulates migration without modifying production data.\n */\n dryRun?: boolean;\n /**\n * Custom migration registry (defaults to defaultMigrationRegistry).\n */\n registry?: MigrationRegistry;\n /**\n * Validate document with schema validator after migration (default: true).\n */\n validate?: boolean;\n}\n\nexport type MigrationFunction = (rawDoc: Record<string, unknown>) => Record<string, unknown>;\n\nexport interface MigrationStep {\n fromVersion: string;\n toVersion: string;\n migrate: MigrationFunction;\n description?: string;\n}\n\n/**\n * Migration Registry to manage version transition steps.\n */\nexport class MigrationRegistry {\n private steps: Map<string, MigrationStep> = new Map();\n\n /**\n * Register a migration step from one version to another.\n */\n register(step: MigrationStep): void {\n const key = this.getKey(step.fromVersion, step.toVersion);\n this.steps.set(key, step);\n }\n\n private getKey(fromVersion: string, toVersion: string): string {\n return `${fromVersion}->${toVersion}`;\n }\n\n /**\n * Find shortest path of versions to migrate from source to target using BFS.\n */\n findPath(sourceVersion: string, targetVersion: string): string[] | null {\n if (sourceVersion === targetVersion) {\n return [sourceVersion];\n }\n\n const queue: { version: string; path: string[] }[] = [\n { version: sourceVersion, path: [sourceVersion] },\n ];\n const visited = new Set<string>([sourceVersion]);\n\n while (queue.length > 0) {\n const { version: currentVersion, path } = queue.shift()!;\n\n for (const step of this.steps.values()) {\n if (step.fromVersion === currentVersion) {\n const nextVersion = step.toVersion;\n if (nextVersion === targetVersion) {\n return [...path, nextVersion];\n }\n\n if (!visited.has(nextVersion)) {\n visited.add(nextVersion);\n queue.push({ version: nextVersion, path: [...path, nextVersion] });\n }\n }\n }\n }\n\n return null;\n }\n\n /**\n * Check if a valid migration path exists between source and target versions.\n */\n hasPath(sourceVersion: string, targetVersion: string): boolean {\n return this.findPath(sourceVersion, targetVersion) !== null;\n }\n\n /**\n * Get the migration step handler for a direct version step.\n */\n getStep(fromVersion: string, toVersion: string): MigrationStep | undefined {\n return this.steps.get(this.getKey(fromVersion, toVersion));\n }\n}\n\n/**\n * Helper to recursively migrate legacy flat styles: { color: 'red' } to responsive: { base: { color: 'red' } }\n */\nfunction convertNodeStylesToResponsive(node: Record<string, unknown>): void {\n if (node.styles && typeof node.styles === 'object' && !Array.isArray(node.styles)) {\n const styles = node.styles as Record<string, unknown>;\n const hasBreakpointKeys = 'base' in styles || 'desktop' in styles || 'tablet' in styles || 'mobile' in styles;\n if (!hasBreakpointKeys) {\n node.styles = {\n base: { ...styles },\n } as ResponsiveStyles;\n }\n }\n\n if (Array.isArray(node.children)) {\n for (const child of node.children) {\n if (child && typeof child === 'object') {\n convertNodeStylesToResponsive(child as Record<string, unknown>);\n }\n }\n }\n}\n\n// Built-in Default Registry\nexport const defaultMigrationRegistry = new MigrationRegistry();\n\n// 1. Migration from 0.1.0 -> 1.0.0 (Alpha to v1)\ndefaultMigrationRegistry.register({\n fromVersion: '0.1.0',\n toVersion: '1.0.0',\n description: 'Migrate alpha 0.1.0 schema (root node key, flat styles) to v1.0.0',\n migrate: (rawDoc: Record<string, unknown>) => {\n const migrated = deepClone(rawDoc);\n migrated.schema = SCHEMA_NAME;\n migrated.version = '1.0.0';\n\n // Migrate root node key: legacy used 'root' instead of 'document'\n if (migrated.root && !migrated.document) {\n migrated.document = migrated.root;\n delete migrated.root;\n }\n\n // Default metadata\n if (!migrated.metadata || typeof migrated.metadata !== 'object') {\n migrated.metadata = {\n title: 'Migrated Page',\n description: '',\n author: '',\n tags: [],\n category: 'general',\n version: '1.0.0',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n } else {\n const meta = migrated.metadata as Record<string, unknown>;\n meta.title = meta.title || 'Migrated Page';\n meta.tags = Array.isArray(meta.tags) ? meta.tags : [];\n meta.version = '1.0.0';\n }\n\n // Migrate node tree flat styles\n if (migrated.document && typeof migrated.document === 'object') {\n convertNodeStylesToResponsive(migrated.document as Record<string, unknown>);\n }\n\n return migrated;\n },\n});\n\n// 2. Migration from 0.2.0 -> 1.0.0\ndefaultMigrationRegistry.register({\n fromVersion: '0.2.0',\n toVersion: '1.0.0',\n description: 'Migrate 0.2.0 schema to v1.0.0',\n migrate: (rawDoc: Record<string, unknown>) => {\n const migrated = deepClone(rawDoc);\n migrated.schema = SCHEMA_NAME;\n migrated.version = '1.0.0';\n\n if (migrated.document && typeof migrated.document === 'object') {\n convertNodeStylesToResponsive(migrated.document as Record<string, unknown>);\n }\n\n return migrated;\n },\n});\n\n// 3. Migration from 0.9.0 -> 1.0.0 (Beta to v1)\ndefaultMigrationRegistry.register({\n fromVersion: '0.9.0',\n toVersion: '1.0.0',\n description: 'Migrate 0.9.0 beta schema to v1.0.0',\n migrate: (rawDoc: Record<string, unknown>) => {\n const migrated = deepClone(rawDoc);\n migrated.schema = SCHEMA_NAME;\n migrated.version = '1.0.0';\n\n if (!migrated.metadata || typeof migrated.metadata !== 'object') {\n migrated.metadata = {\n title: 'Migrated Page',\n description: '',\n author: '',\n tags: [],\n category: 'general',\n version: '1.0.0',\n };\n }\n\n return migrated;\n },\n});\n\n// 4. Shorthand \"1.0\" -> \"1.0.0\"\ndefaultMigrationRegistry.register({\n fromVersion: '1.0',\n toVersion: '1.0.0',\n description: 'Normalize 1.0 version string to 1.0.0',\n migrate: (rawDoc: Record<string, unknown>) => {\n const migrated = deepClone(rawDoc);\n migrated.version = '1.0.0';\n return migrated;\n },\n});\n\n/**\n * Check whether a migration path exists between source and target versions.\n */\nexport function canMigrate(\n sourceVersion: string,\n targetVersion: string = CURRENT_SCHEMA_VERSION,\n registry: MigrationRegistry = defaultMigrationRegistry,\n): boolean {\n if (!sourceVersion || !targetVersion) return false;\n if (sourceVersion === targetVersion) return true;\n return registry.hasPath(sourceVersion, targetVersion);\n}\n\n/**\n * Get the sequence of versions forming the migration path.\n */\nexport function getMigrationPath(\n sourceVersion: string,\n targetVersion: string = CURRENT_SCHEMA_VERSION,\n registry: MigrationRegistry = defaultMigrationRegistry,\n): string[] | null {\n if (!sourceVersion || !targetVersion) return null;\n return registry.findPath(sourceVersion, targetVersion);\n}\n\n/**\n * Migrate a page document from an older schema version to current (or specified) schema version.\n * Supports dry-run execution, step diagnostics, and structured error reporting.\n */\nexport function migrateDocument(\n rawDocument: unknown,\n options: MigrateOptions = {},\n): MigrationResult {\n const targetVersion = options.targetVersion ?? CURRENT_SCHEMA_VERSION;\n const dryRun = options.dryRun ?? false;\n const registry = options.registry ?? defaultMigrationRegistry;\n const validate = options.validate ?? true;\n\n // 1. Basic object validation\n if (!rawDocument || typeof rawDocument !== 'object' || Array.isArray(rawDocument)) {\n const error: MigrationError = {\n code: 'INVALID_SOURCE_DOCUMENT',\n message: 'Source document must be a non-null object.',\n sourceVersion: 'unknown',\n targetVersion,\n };\n return {\n success: false,\n diagnostic: {\n success: false,\n sourceVersion: 'unknown',\n targetVersion,\n migrationPath: [],\n stepsApplied: 0,\n dryRun,\n errors: [error],\n },\n };\n }\n\n const doc = rawDocument as Record<string, unknown>;\n const sourceVersion = typeof doc.version === 'string' ? doc.version.trim() : 'unknown';\n\n // 2. If already on target version\n if (sourceVersion === targetVersion) {\n const cloned = deepClone(doc) as unknown as PageDocument;\n if (validate) {\n const validation = validateDocument(cloned);\n if (!validation.valid) {\n return {\n success: false,\n diagnostic: {\n success: false,\n sourceVersion,\n targetVersion,\n migrationPath: [sourceVersion],\n stepsApplied: 0,\n dryRun,\n errors: validation.errors.map((e) => ({\n code: 'INVALID_SOURCE_DOCUMENT',\n message: `Validation error: ${e.message} at ${e.path}`,\n sourceVersion,\n targetVersion,\n })),\n },\n };\n }\n }\n\n return {\n success: true,\n document: cloned,\n diagnostic: {\n success: true,\n sourceVersion,\n targetVersion,\n migrationPath: [sourceVersion],\n stepsApplied: 0,\n dryRun,\n },\n };\n }\n\n // 3. Find migration path\n const path = registry.findPath(sourceVersion, targetVersion);\n if (!path || path.length <= 1) {\n const error: MigrationError = {\n code: 'NO_MIGRATION_PATH',\n message: `No migration path found from schema version \"${sourceVersion}\" to \"${targetVersion}\".`,\n sourceVersion,\n targetVersion,\n };\n return {\n success: false,\n diagnostic: {\n success: false,\n sourceVersion,\n targetVersion,\n migrationPath: [],\n stepsApplied: 0,\n dryRun,\n errors: [error],\n },\n };\n }\n\n // 4. If dry-run mode, return simulation success without modifying\n if (dryRun) {\n return {\n success: true,\n diagnostic: {\n success: true,\n sourceVersion,\n targetVersion,\n migrationPath: path,\n stepsApplied: path.length - 1,\n dryRun: true,\n },\n };\n }\n\n // 5. Execute migration path steps sequentially\n let currentDoc = deepClone(doc);\n let stepsApplied = 0;\n\n for (let i = 0; i < path.length - 1; i++) {\n const fromVer = path[i];\n const toVer = path[i + 1];\n const step = registry.getStep(fromVer, toVer);\n\n if (!step) {\n const error: MigrationError = {\n code: 'MIGRATION_EXECUTION_FAILED',\n message: `Registered migration step for \"${fromVer}\" -> \"${toVer}\" is missing executor.`,\n sourceVersion,\n targetVersion,\n };\n return {\n success: false,\n diagnostic: {\n success: false,\n sourceVersion,\n targetVersion,\n migrationPath: path,\n stepsApplied,\n dryRun,\n errors: [error],\n },\n };\n }\n\n try {\n currentDoc = step.migrate(currentDoc);\n stepsApplied++;\n } catch (err: unknown) {\n const error: MigrationError = {\n code: 'MIGRATION_EXECUTION_FAILED',\n message: `Failed executing migration step from \"${fromVer}\" to \"${toVer}\": ${err instanceof Error ? err.message : String(err)}`,\n sourceVersion,\n targetVersion,\n details: { stepFrom: fromVer, stepTo: toVer },\n };\n return {\n success: false,\n diagnostic: {\n success: false,\n sourceVersion,\n targetVersion,\n migrationPath: path,\n stepsApplied,\n dryRun,\n errors: [error],\n },\n };\n }\n }\n\n // 6. Validate final migrated document\n const finalDoc = currentDoc as unknown as PageDocument;\n if (validate) {\n const validation = validateDocument(finalDoc);\n if (!validation.valid) {\n return {\n success: false,\n diagnostic: {\n success: false,\n sourceVersion,\n targetVersion,\n migrationPath: path,\n stepsApplied,\n dryRun,\n errors: validation.errors.map((e) => ({\n code: 'MIGRATION_EXECUTION_FAILED',\n message: `Post-migration validation error: ${e.message} at ${e.path}`,\n sourceVersion,\n targetVersion,\n })),\n },\n };\n }\n }\n\n return {\n success: true,\n document: finalDoc,\n diagnostic: {\n success: true,\n sourceVersion,\n targetVersion,\n migrationPath: path,\n stepsApplied,\n dryRun: false,\n },\n };\n}\n","import { zipSync, strToU8 } from 'fflate';\nimport {\n PageDocument,\n DocumentMetadata,\n Manifest,\n ManifestAssetItem,\n SCHEMA_NAME,\n CURRENT_SCHEMA_VERSION,\n} from '@kubuild/schema';\nimport {\n validateDocument,\n DocumentValidationError,\n ValidationOptions,\n ComponentRegistryLike,\n} from './validator';\nimport {\n collectAssetReferences,\n extractRequirementsFromTree,\n CollectedAssetReference,\n} from './document-utils';\nimport type { AssetProvider } from './interfaces';\n\nexport interface ExportAssetData {\n data: Uint8Array | ArrayBuffer | Blob | string;\n mimeType?: string;\n filename?: string;\n}\n\nexport type AssetBytesProvider = (\n assetId: string,\n assetRef: CollectedAssetReference,\n) =>\n | Promise<Uint8Array | ArrayBuffer | Blob | string | ExportAssetData | null | undefined>\n | Uint8Array\n | ArrayBuffer\n | Blob\n | string\n | ExportAssetData\n | null\n | undefined;\n\nexport interface ExportPackageOptions {\n /**\n * Component registry to validate document components and extract requirements.\n */\n componentRegistry?: ComponentRegistryLike;\n\n /**\n * Known component types if registry is not passed.\n */\n knownComponentTypes?: string[] | Set<string>;\n\n /**\n * Directly supplied asset binary map (keyed by assetId).\n */\n assets?:\n | Record<string, Uint8Array | ArrayBuffer | Blob | string | ExportAssetData>\n | Map<string, Uint8Array | ArrayBuffer | Blob | string | ExportAssetData>;\n\n /**\n * Host function to retrieve asset binary data dynamically.\n */\n getAssetBytes?: AssetBytesProvider;\n\n /**\n * Host AssetProvider instance to resolve assets if bytes provider is not present.\n */\n assetProvider?: AssetProvider;\n\n /**\n * Package version to write in manifest (defaults to \"1.0.0\").\n */\n packageVersion?: string;\n\n /**\n * Builder compatibility semver range (defaults to \">=0.1.0\").\n */\n builderCompatibility?: string;\n\n /**\n * If true, assets that have a fallbackUrl or are externally hosted will not cause export failure if local bytes are missing.\n * If false and a referenced asset has no bytes available, export fails.\n */\n allowExternalFallback?: boolean;\n\n /**\n * Additional validation options passed to validateDocument.\n */\n validationOptions?: ValidationOptions;\n\n /**\n * Optional metadata overrides (e.g. author, tags).\n */\n metadata?: Partial<DocumentMetadata>;\n}\n\nexport interface ExportPackageSuccess {\n success: true;\n archive: Uint8Array;\n manifest: Manifest;\n page: PageDocument;\n metadata: DocumentMetadata;\n assetCount: number;\n}\n\nexport interface ExportPackageFailure {\n success: false;\n errors: DocumentValidationError[];\n diagnosticMessage: string;\n}\n\nexport type ExportPackageResult = ExportPackageSuccess | ExportPackageFailure;\n\n/**\n * Pure TypeScript SHA-256 implementation (zero native dependencies, deterministic).\n */\nexport function sha256Sync(data: Uint8Array): string {\n const K = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n ];\n\n let h0 = 0x6a09e667;\n let h1 = 0xbb67ae85;\n let h2 = 0x3c6ef372;\n let h3 = 0xa54ff53a;\n let h4 = 0x510e527f;\n let h5 = 0x9b05688c;\n let h6 = 0x1f83d9ab;\n let h7 = 0x5be0cd19;\n\n const length = data.length;\n const bitLength = length * 8;\n const newLength = ((length + 9 + 63) >>> 6) << 6;\n const padded = new Uint8Array(newLength);\n padded.set(data);\n padded[length] = 0x80;\n\n const view = new DataView(padded.buffer);\n view.setUint32(newLength - 4, bitLength >>> 0, false);\n view.setUint32(newLength - 8, Math.floor(bitLength / 0x100000000), false);\n\n const w = new Uint32Array(64);\n\n for (let chunk = 0; chunk < newLength; chunk += 64) {\n for (let i = 0; i < 16; i++) {\n w[i] = view.getUint32(chunk + i * 4, false);\n }\n for (let i = 16; i < 64; i++) {\n const s0 =\n ((w[i - 15] >>> 7) | (w[i - 15] << 25)) ^\n ((w[i - 15] >>> 18) | (w[i - 15] << 14)) ^\n (w[i - 15] >>> 3);\n const s1 =\n ((w[i - 2] >>> 17) | (w[i - 2] << 15)) ^\n ((w[i - 2] >>> 19) | (w[i - 2] << 13)) ^\n (w[i - 2] >>> 10);\n w[i] = (w[i - 16] + s0 + w[i - 7] + s1) >>> 0;\n }\n\n let a = h0;\n let b = h1;\n let c = h2;\n let d = h3;\n let e = h4;\n let f = h5;\n let g = h6;\n let h = h7;\n\n for (let i = 0; i < 64; i++) {\n const S1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7));\n const ch = (e & f) ^ (~e & g);\n const temp1 = (h + S1 + ch + K[i] + w[i]) >>> 0;\n const S0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^ ((a >>> 22) | (a << 10));\n const maj = (a & b) ^ (a & c) ^ (b & c);\n const temp2 = (S0 + maj) >>> 0;\n\n h = g;\n g = f;\n f = e;\n e = (d + temp1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (temp1 + temp2) >>> 0;\n }\n\n h0 = (h0 + a) >>> 0;\n h1 = (h1 + b) >>> 0;\n h2 = (h2 + c) >>> 0;\n h3 = (h3 + d) >>> 0;\n h4 = (h4 + e) >>> 0;\n h5 = (h5 + f) >>> 0;\n h6 = (h6 + g) >>> 0;\n h7 = (h7 + h) >>> 0;\n }\n\n const result = [h0, h1, h2, h3, h4, h5, h6, h7]\n .map((val) => val.toString(16).padStart(8, '0'))\n .join('');\n\n return result;\n}\n\n/**\n * Compute SHA-256 checksum with \"sha256:\" prefix.\n */\nexport async function calculateChecksum(data: Uint8Array): Promise<string> {\n if (typeof globalThis !== 'undefined' && globalThis.crypto?.subtle?.digest) {\n try {\n const buffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\n const hashBuffer = await globalThis.crypto.subtle.digest('SHA-256', buffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n return `sha256:${hashHex}`;\n } catch {\n // fallback to sync implementation\n }\n }\n return `sha256:${sha256Sync(data)}`;\n}\n\n\n/**\n * Sanitize asset file names to prevent zip-slip or directory traversal vulnerabilities.\n */\nexport function sanitizeFilename(filename: string | undefined, assetId: string, mimeType?: string): string {\n let name = (filename || '').trim();\n\n // Strip path traversal characters and directory separators\n name = name.replace(/^[./\\\\]+/, '').replace(/[/\\\\]+/g, '_').replace(/\\0/g, '');\n name = name.replace(/[^a-zA-Z0-9._-]/g, '_');\n\n if (!name || name === '.' || name === '..') {\n const ext = getExtensionFromMime(mimeType) || 'bin';\n const cleanId = assetId.replace(/[^a-zA-Z0-9_-]/g, '_');\n name = `${cleanId}.${ext}`;\n }\n\n return name;\n}\n\nfunction getExtensionFromMime(mimeType?: string): string | null {\n if (!mimeType) return null;\n const m = mimeType.toLowerCase();\n if (m.includes('png')) return 'png';\n if (m.includes('jpeg') || m.includes('jpg')) return 'jpg';\n if (m.includes('webp')) return 'webp';\n if (m.includes('svg')) return 'svg';\n if (m.includes('gif')) return 'gif';\n if (m.includes('json')) return 'json';\n if (m.includes('pdf')) return 'pdf';\n if (m.includes('mp4')) return 'mp4';\n if (m.includes('mp3')) return 'mp3';\n return null;\n}\n\nasync function convertToUint8Array(input: unknown): Promise<Uint8Array | null> {\n if (!input) return null;\n\n if (input instanceof Uint8Array) {\n return input;\n }\n\n if (input instanceof ArrayBuffer) {\n return new Uint8Array(input);\n }\n\n if (typeof Blob !== 'undefined' && input instanceof Blob) {\n const arrayBuffer = await input.arrayBuffer();\n return new Uint8Array(arrayBuffer);\n }\n\n if (typeof input === 'string') {\n // Check if data URL\n if (input.startsWith('data:')) {\n const commaIdx = input.indexOf(',');\n if (commaIdx !== -1) {\n const meta = input.substring(0, commaIdx);\n const rawData = input.substring(commaIdx + 1);\n if (meta.includes(';base64')) {\n if (typeof atob === 'function') {\n const binary = atob(rawData);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n }\n }\n }\n }\n return new TextEncoder().encode(input);\n }\n\n return null;\n}\n\n/**\n * Validates document, collects asset references, resolves local asset bytes,\n * writes manifest.json, page.json, metadata.json, and packages everything into a .stora archive.\n */\nexport async function exportPackage(\n document: unknown,\n options: ExportPackageOptions = {},\n): Promise<ExportPackageResult> {\n // 1. Validate the Document\n const validation = validateDocument(document, {\n componentRegistry: options.componentRegistry,\n knownComponentTypes: options.knownComponentTypes,\n ...options.validationOptions,\n });\n\n if (!validation.valid || !validation.data) {\n const diagnosticMessage = `Document validation failed with ${validation.errors.length} error(s):\\n` +\n validation.errors.map((e) => `[${e.code}] ${e.path}: ${e.message}`).join('\\n');\n\n return {\n success: false,\n errors: validation.errors,\n diagnosticMessage,\n };\n }\n\n const pageDoc: PageDocument = JSON.parse(JSON.stringify(validation.data));\n\n // Merge optional metadata overrides safely\n if (options.metadata) {\n pageDoc.metadata = {\n ...(pageDoc.metadata || {\n title: 'Untitled Page',\n description: '',\n author: '',\n tags: [],\n category: 'general',\n version: '1.0.0',\n }),\n ...options.metadata,\n updatedAt: new Date().toISOString(),\n };\n }\n\n // 2. Collect Asset References from the document tree\n const collectedAssets = collectAssetReferences(pageDoc.document);\n const assetRefsById = new Map<string, CollectedAssetReference>();\n for (const item of collectedAssets) {\n if (!assetRefsById.has(item.assetId)) {\n assetRefsById.set(item.assetId, item);\n }\n }\n\n // 3. Extract Component and Capability Requirements\n const requirements = extractRequirementsFromTree(pageDoc.document, options.componentRegistry);\n\n // 4. Resolve Asset Bytes and build Manifest Assets\n const manifestAssets: ManifestAssetItem[] = [];\n const archiveFiles: Record<string, Uint8Array> = {};\n const assetCollectionErrors: DocumentValidationError[] = [];\n const usedArchivePaths = new Set<string>();\n\n for (const [assetId, assetRef] of assetRefsById.entries()) {\n let rawAsset: Uint8Array | ArrayBuffer | Blob | string | ExportAssetData | null | undefined;\n let customMime: string | undefined = assetRef.reference.mimeType;\n let customFilename: string | undefined = assetRef.reference.filename;\n\n // Check options.assets map/record\n if (options.assets) {\n if (options.assets instanceof Map) {\n rawAsset = options.assets.get(assetId);\n } else if (typeof options.assets === 'object' && assetId in options.assets) {\n rawAsset = options.assets[assetId];\n }\n }\n\n // Check options.getAssetBytes\n if (!rawAsset && options.getAssetBytes) {\n try {\n rawAsset = await options.getAssetBytes(assetId, assetRef);\n } catch (err) {\n assetCollectionErrors.push({\n code: 'INVALID_ASSET_REFERENCE',\n message: `Failed to retrieve asset bytes for \"${assetId}\": ${err instanceof Error ? err.message : String(err)}`,\n path: assetRef.propPath,\n nodeId: assetRef.nodeId,\n });\n continue;\n }\n }\n\n // Check options.assetProvider\n if (!rawAsset && options.assetProvider?.resolve) {\n try {\n const resolved = await options.assetProvider.resolve(assetId);\n if (resolved) {\n rawAsset = resolved;\n }\n } catch {\n // Continue to fallback check\n }\n }\n\n // Unpack ExportAssetData if provided\n let dataToConvert: unknown = rawAsset;\n if (rawAsset && typeof rawAsset === 'object' && 'data' in rawAsset) {\n const assetObj = rawAsset as ExportAssetData;\n dataToConvert = assetObj.data;\n if (assetObj.mimeType) customMime = assetObj.mimeType;\n if (assetObj.filename) customFilename = assetObj.filename;\n }\n\n const assetBytes = await convertToUint8Array(dataToConvert);\n\n if (assetBytes) {\n // Local asset found and collected\n const sanitizedName = sanitizeFilename(customFilename, assetId, customMime);\n let archivePath = `assets/${sanitizedName}`;\n\n // Avoid collision inside archive\n let counter = 1;\n while (usedArchivePaths.has(archivePath)) {\n const extDot = sanitizedName.lastIndexOf('.');\n if (extDot !== -1) {\n archivePath = `assets/${sanitizedName.substring(0, extDot)}_${counter}${sanitizedName.substring(extDot)}`;\n } else {\n archivePath = `assets/${sanitizedName}_${counter}`;\n }\n counter++;\n }\n usedArchivePaths.add(archivePath);\n\n const mimeType = customMime || 'application/octet-stream';\n const checksum = await calculateChecksum(assetBytes);\n\n manifestAssets.push({\n id: assetId,\n path: archivePath,\n mimeType,\n size: assetBytes.byteLength,\n checksum,\n });\n\n archiveFiles[archivePath] = assetBytes;\n } else {\n // Asset bytes not collected\n const isExternal = Boolean(assetRef.reference.fallbackUrl || options.allowExternalFallback);\n\n if (!isExternal) {\n assetCollectionErrors.push({\n code: 'INVALID_ASSET_REFERENCE',\n message: `Required asset \"${assetId}\" could not be collected for export and has no external fallback`,\n path: assetRef.propPath,\n nodeId: assetRef.nodeId,\n });\n }\n }\n }\n\n // If any required asset could not be collected, abort export\n if (assetCollectionErrors.length > 0) {\n const diagnosticMessage = `Asset collection failed with ${assetCollectionErrors.length} error(s):\\n` +\n assetCollectionErrors.map((e) => `[${e.code}] ${e.path}: ${e.message}`).join('\\n');\n\n return {\n success: false,\n errors: assetCollectionErrors,\n diagnosticMessage,\n };\n }\n\n // 5. Construct Manifest and Metadata\n const metadata: DocumentMetadata = pageDoc.metadata || {\n title: 'Untitled Page',\n description: '',\n author: '',\n tags: [],\n category: 'general',\n version: '1.0.0',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n const manifest: Manifest = {\n schema: SCHEMA_NAME,\n schemaVersion: pageDoc.version || CURRENT_SCHEMA_VERSION,\n packageVersion: options.packageVersion || '1.0.0',\n builderCompatibility: options.builderCompatibility || '>=0.1.0',\n requiredComponents: requirements.requiredComponents,\n requiredCapabilities: requirements.requiredCapabilities,\n assets: manifestAssets,\n createdAt: new Date().toISOString(),\n };\n\n // 6. Write Archive Files\n archiveFiles['manifest.json'] = strToU8(JSON.stringify(manifest, null, 2));\n archiveFiles['page.json'] = strToU8(JSON.stringify(pageDoc, null, 2));\n archiveFiles['metadata.json'] = strToU8(JSON.stringify(metadata, null, 2));\n\n // 7. Compress into .stora ZIP Archive\n const archive = zipSync(archiveFiles, { level: 6 });\n\n return {\n success: true,\n archive,\n manifest,\n page: pageDoc,\n metadata,\n assetCount: manifestAssets.length,\n };\n}\n\n/**\n * Alias for exportPackage.\n */\nexport const exportStoraPackage = exportPackage;\n","import { unzipSync, strFromU8 } from 'fflate';\nimport {\n PageDocument,\n DocumentMetadata,\n Manifest,\n ManifestAssetItem,\n ManifestSchema,\n CURRENT_SCHEMA_VERSION,\n SCHEMA_NAME,\n} from '@kubuild/schema';\nimport {\n validateDocument,\n ComponentRegistryLike,\n} from './validator';\nimport {\n canMigrate,\n getMigrationPath,\n migrateDocument,\n MigrationRegistry,\n defaultMigrationRegistry,\n} from './migration';\nimport { calculateChecksum } from './exporter';\nimport { remapDocumentAssetReferences } from './document-utils';\nimport {\n isDangerousAssetFilename,\n checkZipBomb,\n containsProhibitedKeys,\n} from './security';\nimport type { AssetProvider, AssetInfo } from './interfaces';\n\nexport interface SecurityLimits {\n /**\n * Maximum allowed size for the compressed archive in bytes (default: 50MB).\n */\n maxArchiveSize?: number;\n\n /**\n * Maximum total uncompressed size across all files in bytes (default: 100MB).\n */\n maxUncompressedSize?: number;\n\n /**\n * Maximum number of files in the archive (default: 1000).\n */\n maxFileCount?: number;\n\n /**\n * Maximum size for any individual asset in bytes (default: 25MB).\n */\n maxAssetSize?: number;\n}\n\nexport const DEFAULT_SECURITY_LIMITS: Required<SecurityLimits> = {\n maxArchiveSize: 50 * 1024 * 1024, // 50 MB\n maxUncompressedSize: 100 * 1024 * 1024, // 100 MB\n maxFileCount: 1000,\n maxAssetSize: 25 * 1024 * 1024, // 25 MB\n};\n\nexport type MissingDependencyPolicy =\n | 'cancel'\n | 'import-with-placeholder'\n | 'install-or-register-before-import';\n\nexport type AssetCollisionStrategy =\n | 'reject'\n | 'rename'\n | 'overwrite'\n | 'reuse-existing';\n\nexport interface AssetConflict {\n assetId: string;\n path: string;\n mimeType: string;\n size: number;\n existingAsset?: AssetInfo | Record<string, unknown>;\n}\n\nexport interface AssetConflictResolution {\n action: AssetCollisionStrategy;\n newAssetId?: string;\n}\n\nexport type PreflightDiagnosticCode =\n | 'ARCHIVE_EMPTY'\n | 'ARCHIVE_CORRUPT'\n | 'SIZE_LIMIT_EXCEEDED'\n | 'FILE_COUNT_EXCEEDED'\n | 'ZIP_SLIP_DETECTED'\n | 'EXECUTABLE_ASSET_DETECTED'\n | 'PROTOTYPE_POLLUTION_DETECTED'\n | 'MISSING_MANIFEST'\n | 'INVALID_MANIFEST'\n | 'MISSING_PAGE_DOCUMENT'\n | 'INVALID_PAGE_DOCUMENT'\n | 'UNSUPPORTED_SCHEMA_VERSION'\n | 'NO_MIGRATION_PATH'\n | 'MIGRATION_FAILED'\n | 'ASSET_FILE_MISSING'\n | 'ASSET_SIZE_MISMATCH'\n | 'ASSET_CHECKSUM_MISMATCH'\n | 'ASSET_LIMIT_EXCEEDED'\n | 'ASSET_CONFLICT'\n | 'MISSING_COMPONENTS'\n | 'MISSING_CAPABILITIES'\n | 'HOST_ADAPTER_ERROR';\n\nexport interface PreflightDiagnostic {\n code: PreflightDiagnosticCode;\n severity: 'error' | 'warning' | 'info';\n message: string;\n path?: string;\n details?: Record<string, unknown>;\n}\n\nexport interface PreflightOptions {\n /**\n * Component registry to check required custom components.\n */\n componentRegistry?: ComponentRegistryLike;\n\n /**\n * Allowlist of known component type names (used if componentRegistry is not provided or in combination).\n */\n knownComponentTypes?: string[] | Set<string>;\n\n /**\n * Allowlist of capabilities supported by host.\n */\n supportedCapabilities?: string[] | Set<string>;\n\n /**\n * Security limits for archive and files.\n */\n securityLimits?: SecurityLimits;\n\n /**\n * Custom migration registry.\n */\n migrationRegistry?: MigrationRegistry;\n\n /**\n * Target schema version (defaults to CURRENT_SCHEMA_VERSION = \"1.0.0\").\n */\n targetSchemaVersion?: string;\n\n /**\n * Policy for handling missing custom components and capabilities.\n * - 'cancel' (default): Abort import with blocking errors when components/capabilities are missing.\n * - 'import-with-placeholder': Allow import, keeping missing component nodes and props intact for placeholder rendering.\n * - 'install-or-register-before-import': Call onMissingDependency to register/install before finalizing import.\n */\n dependencyPolicy?: MissingDependencyPolicy;\n\n /**\n * Hook called when dependencyPolicy is 'install-or-register-before-import'.\n */\n onMissingDependency?: (\n missing: { components: string[]; capabilities: string[] },\n preflight: PreflightReport,\n ) => Promise<boolean | void> | boolean | void;\n\n /**\n * If true, missing components are treated as warnings rather than blocking errors.\n * (Equivalent to setting dependencyPolicy: 'import-with-placeholder')\n */\n allowMissingComponents?: boolean;\n\n /**\n * If true, missing capabilities are treated as warnings rather than blocking errors.\n * (Equivalent to setting dependencyPolicy: 'import-with-placeholder')\n */\n allowMissingCapabilities?: boolean;\n\n /**\n * Strategy for resolving asset collisions with existing host assets.\n * - 'reject' (default): Refuse import if asset collision is detected without an explicit resolution strategy.\n * - 'rename': Rename the incoming asset to avoid overwriting host assets, and automatically remap document asset references.\n * - 'overwrite': Explicitly overwrite host assets with incoming archive assets.\n * - 'reuse-existing': Reuse existing host assets and skip writing archive asset binaries.\n */\n assetCollisionStrategy?: AssetCollisionStrategy;\n\n /**\n * Existing host asset IDs or checker function to detect collisions.\n */\n existingAssetIds?: string[] | Set<string> | ((assetId: string) => boolean | Promise<boolean>);\n\n /**\n * Custom naming function when renaming colliding assets.\n */\n renameAssetStrategy?: (incoming: ManifestAssetItem, existingIds: Set<string>) => string;\n\n /**\n * Host AssetProvider to resolve existing assets or upload extracted local assets.\n */\n assetProvider?: AssetProvider;\n\n /**\n * Fine-grained callback for resolving individual asset conflicts.\n */\n onAssetConflict?: (\n conflict: AssetConflict,\n ) => Promise<AssetConflictResolution | AssetCollisionStrategy> | AssetConflictResolution | AssetCollisionStrategy;\n}\n\nexport interface PreflightReport {\n /**\n * True if archive is completely safe and syntactically valid.\n */\n valid: boolean;\n\n /**\n * True if archive can be safely imported given the host's supported components/capabilities and asset policies.\n */\n canImport: boolean;\n\n /**\n * Parsed manifest if available.\n */\n manifest?: Manifest;\n\n /**\n * Parsed metadata if available.\n */\n rawMetadata?: DocumentMetadata;\n\n /**\n * Schema version reported in the document/manifest.\n */\n sourceVersion?: string;\n\n /**\n * Target schema version.\n */\n targetVersion: string;\n\n /**\n * True if the document version differs from target version and requires migration.\n */\n requiresMigration: boolean;\n\n /**\n * Migration path version sequence if migration is needed.\n */\n migrationPath?: string[];\n\n /**\n * List of custom component types required by package that are missing in host.\n */\n missingComponents: string[];\n\n /**\n * List of capabilities required by package that are missing in host.\n */\n missingCapabilities: string[];\n\n /**\n * Active policy for missing dependencies.\n */\n dependencyPolicy: MissingDependencyPolicy;\n\n /**\n * Number of valid local assets declared in manifest.\n */\n assetCount: number;\n\n /**\n * List of detected asset collisions with existing host assets.\n */\n assetConflicts: AssetConflict[];\n\n /**\n * Active strategy for handling asset collisions.\n */\n assetCollisionStrategy: AssetCollisionStrategy;\n\n /**\n * Total uncompressed size of all files in archive.\n */\n totalUncompressedBytes: number;\n\n /**\n * Diagnostics collected during inspection.\n */\n diagnostics: PreflightDiagnostic[];\n}\n\nexport interface ImportPackageOptions extends PreflightOptions {\n /**\n * Custom asset importer hook called for each extracted asset.\n */\n onAssetImport?: (\n assetId: string,\n assetBytes: Uint8Array,\n assetMeta: ManifestAssetItem,\n ) => Promise<AssetInfo | string | void> | AssetInfo | string | void;\n}\n\nexport interface ExtractedAsset {\n bytes: Uint8Array;\n meta: ManifestAssetItem;\n hostInfo?: AssetInfo | string;\n}\n\nexport interface ImportPackageSuccess {\n success: true;\n document: PageDocument;\n manifest: Manifest;\n metadata: DocumentMetadata;\n extractedAssets: Map<string, ExtractedAsset>;\n renamedAssets?: Record<string, string>;\n preflight: PreflightReport;\n}\n\nexport interface ImportPackageFailure {\n success: false;\n errors: PreflightDiagnostic[];\n diagnosticMessage: string;\n preflight?: PreflightReport;\n}\n\nexport type ImportPackageResult = ImportPackageSuccess | ImportPackageFailure;\n\n/**\n * Checks if a zip entry path contains zip-slip or directory traversal attempts.\n */\nexport function isDangerousPath(filepath: string): boolean {\n if (!filepath || typeof filepath !== 'string') return true;\n\n // Check for null bytes\n if (filepath.includes('\\0')) return true;\n\n // Check for absolute paths (Unix or Windows drive)\n if (filepath.startsWith('/') || filepath.startsWith('\\\\') || /^[a-zA-Z]:/.test(filepath)) {\n return true;\n }\n\n // Normalize slashes\n const normalized = filepath.replace(/\\\\/g, '/');\n\n // Check path segments\n const segments = normalized.split('/');\n for (const seg of segments) {\n if (seg === '..' || seg.trim() === '..') {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Inspects a .stora archive and runs non-destructive preflight validation.\n * Verifies security limits, path safety, manifest, checksums, component/capability requirements, and migration status.\n */\nexport async function preflightPackage(\n archiveData: Uint8Array | ArrayBuffer,\n options: PreflightOptions = {},\n): Promise<PreflightReport> {\n const limits: Required<SecurityLimits> = {\n ...DEFAULT_SECURITY_LIMITS,\n ...options.securityLimits,\n };\n\n const targetVersion = options.targetSchemaVersion || CURRENT_SCHEMA_VERSION;\n const migrationRegistry = options.migrationRegistry || defaultMigrationRegistry;\n const diagnostics: PreflightDiagnostic[] = [];\n\n let dependencyPolicy: MissingDependencyPolicy = options.dependencyPolicy || 'cancel';\n if (!options.dependencyPolicy) {\n if (options.allowMissingComponents && options.allowMissingCapabilities) {\n dependencyPolicy = 'import-with-placeholder';\n }\n }\n\n const assetCollisionStrategy: AssetCollisionStrategy = options.assetCollisionStrategy || 'reject';\n\n const archiveBytes = archiveData instanceof Uint8Array ? archiveData : new Uint8Array(archiveData);\n\n // 1. Check archive size limit\n if (!archiveBytes || archiveBytes.byteLength === 0) {\n diagnostics.push({\n code: 'ARCHIVE_EMPTY',\n severity: 'error',\n message: 'Archive is empty or 0 bytes.',\n });\n return buildReport(false, false, { targetVersion, dependencyPolicy, assetCollisionStrategy, diagnostics });\n }\n\n if (archiveBytes.byteLength > limits.maxArchiveSize) {\n diagnostics.push({\n code: 'SIZE_LIMIT_EXCEEDED',\n severity: 'error',\n message: `Archive size (${archiveBytes.byteLength} bytes) exceeds maximum limit of ${limits.maxArchiveSize} bytes.`,\n details: { actualBytes: archiveBytes.byteLength, limitBytes: limits.maxArchiveSize },\n });\n return buildReport(false, false, { targetVersion, dependencyPolicy, assetCollisionStrategy, diagnostics });\n }\n\n // 2. Safe Unzip\n let unzipped: Record<string, Uint8Array>;\n try {\n unzipped = unzipSync(archiveBytes);\n } catch (err) {\n diagnostics.push({\n code: 'ARCHIVE_CORRUPT',\n severity: 'error',\n message: `Failed to unzip archive: ${err instanceof Error ? err.message : String(err)}`,\n });\n return buildReport(false, false, { targetVersion, dependencyPolicy, assetCollisionStrategy, diagnostics });\n }\n\n const entries = Object.keys(unzipped);\n\n // Check file count limit\n if (entries.length > limits.maxFileCount) {\n diagnostics.push({\n code: 'FILE_COUNT_EXCEEDED',\n severity: 'error',\n message: `Archive file count (${entries.length}) exceeds maximum limit of ${limits.maxFileCount}.`,\n details: { fileCount: entries.length, limit: limits.maxFileCount },\n });\n }\n\n // 3. Security checks: Zip-Slip and Total Uncompressed Size\n let totalUncompressedBytes = 0;\n for (const entryPath of entries) {\n // Check path safety\n if (isDangerousPath(entryPath)) {\n diagnostics.push({\n code: 'ZIP_SLIP_DETECTED',\n severity: 'error',\n message: `Security violation: Path traversal or Zip-Slip attempt detected in archive entry \"${entryPath}\".`,\n path: entryPath,\n });\n }\n\n // Check dangerous/executable asset file extensions\n if (entryPath.startsWith('assets/') && isDangerousAssetFilename(entryPath)) {\n diagnostics.push({\n code: 'EXECUTABLE_ASSET_DETECTED',\n severity: 'error',\n message: `Security violation: Executable or dangerous asset file extension detected in archive entry \"${entryPath}\".`,\n path: entryPath,\n });\n }\n\n const fileBytes = unzipped[entryPath];\n if (fileBytes) {\n totalUncompressedBytes += fileBytes.byteLength;\n\n // Check single asset size limit if in assets/\n if (entryPath.startsWith('assets/') && fileBytes.byteLength > limits.maxAssetSize) {\n diagnostics.push({\n code: 'ASSET_LIMIT_EXCEEDED',\n severity: 'error',\n message: `Asset \"${entryPath}\" size (${fileBytes.byteLength} bytes) exceeds maximum limit of ${limits.maxAssetSize} bytes.`,\n path: entryPath,\n details: { actualBytes: fileBytes.byteLength, limitBytes: limits.maxAssetSize },\n });\n }\n }\n }\n\n if (totalUncompressedBytes > limits.maxUncompressedSize) {\n diagnostics.push({\n code: 'SIZE_LIMIT_EXCEEDED',\n severity: 'error',\n message: `Total uncompressed archive size (${totalUncompressedBytes} bytes) exceeds maximum limit of ${limits.maxUncompressedSize} bytes.`,\n details: { actualBytes: totalUncompressedBytes, limitBytes: limits.maxUncompressedSize },\n });\n }\n\n // Check Zip Bomb expansion ratio\n if (checkZipBomb(archiveBytes.byteLength, totalUncompressedBytes)) {\n diagnostics.push({\n code: 'SIZE_LIMIT_EXCEEDED',\n severity: 'error',\n message: `Security violation: Potential Zip Bomb attack detected (excessive compression ratio).`,\n details: { compressedBytes: archiveBytes.byteLength, uncompressedBytes: totalUncompressedBytes },\n });\n }\n\n // 4. Check Mandatory Files: manifest.json & page.json\n const manifestEntry = unzipped['manifest.json'];\n if (!manifestEntry) {\n diagnostics.push({\n code: 'MISSING_MANIFEST',\n severity: 'error',\n message: 'Archive is missing mandatory \"manifest.json\" file.',\n });\n }\n\n const pageEntry = unzipped['page.json'];\n if (!pageEntry) {\n diagnostics.push({\n code: 'MISSING_PAGE_DOCUMENT',\n severity: 'error',\n message: 'Archive is missing mandatory \"page.json\" file.',\n });\n }\n\n // If mandatory files missing or security violated, stop preflight early\n if (!manifestEntry || !pageEntry || diagnostics.some((d) => d.code === 'ZIP_SLIP_DETECTED')) {\n return buildReport(false, false, {\n targetVersion,\n dependencyPolicy,\n assetCollisionStrategy,\n totalUncompressedBytes,\n diagnostics,\n });\n }\n\n // 5. Parse & Validate Manifest\n let parsedManifest: Manifest | undefined;\n try {\n const manifestJson = JSON.parse(strFromU8(manifestEntry));\n const manifestProtoCheck = containsProhibitedKeys(manifestJson);\n if (manifestProtoCheck.found) {\n diagnostics.push({\n code: 'PROTOTYPE_POLLUTION_DETECTED',\n severity: 'error',\n message: `Security violation: Prohibited key \"${manifestProtoCheck.key}\" in manifest.json.`,\n path: manifestProtoCheck.path,\n });\n }\n\n const parseResult = ManifestSchema.safeParse(manifestJson);\n if (!parseResult.success) {\n const issues = parseResult.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join(', ');\n diagnostics.push({\n code: 'INVALID_MANIFEST',\n severity: 'error',\n message: `Manifest validation failed: ${issues}`,\n details: { issues: parseResult.error.issues },\n });\n } else {\n parsedManifest = parseResult.data;\n }\n } catch (err) {\n diagnostics.push({\n code: 'INVALID_MANIFEST',\n severity: 'error',\n message: `Failed to parse \"manifest.json\" as valid JSON: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n\n // 6. Parse Metadata (Optional metadata.json)\n let rawMetadata: DocumentMetadata | undefined;\n const metadataEntry = unzipped['metadata.json'];\n if (metadataEntry) {\n try {\n rawMetadata = JSON.parse(strFromU8(metadataEntry)) as DocumentMetadata;\n } catch {\n // Non-critical, fallback will use page.json metadata\n }\n }\n\n // 7. Parse & Inspect page.json\n let rawPageDoc: Record<string, unknown> | undefined;\n try {\n rawPageDoc = JSON.parse(strFromU8(pageEntry)) as Record<string, unknown>;\n const pageProtoCheck = containsProhibitedKeys(rawPageDoc);\n if (pageProtoCheck.found) {\n diagnostics.push({\n code: 'PROTOTYPE_POLLUTION_DETECTED',\n severity: 'error',\n message: `Security violation: Prohibited key \"${pageProtoCheck.key}\" in page.json.`,\n path: pageProtoCheck.path,\n });\n }\n } catch (err) {\n diagnostics.push({\n code: 'INVALID_PAGE_DOCUMENT',\n severity: 'error',\n message: `Failed to parse \"page.json\" as valid JSON: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n\n const docVersion = typeof rawPageDoc?.version === 'string'\n ? rawPageDoc.version\n : parsedManifest?.schemaVersion || 'unknown';\n\n let requiresMigration = false;\n let migrationPath: string[] | undefined;\n\n if (rawPageDoc) {\n if (docVersion !== targetVersion) {\n if (canMigrate(docVersion, targetVersion, migrationRegistry)) {\n requiresMigration = true;\n migrationPath = getMigrationPath(docVersion, targetVersion, migrationRegistry) || undefined;\n diagnostics.push({\n code: 'UNSUPPORTED_SCHEMA_VERSION',\n severity: 'info',\n message: `Document schema version \"${docVersion}\" requires migration to current version \"${targetVersion}\".`,\n details: { sourceVersion: docVersion, targetVersion, migrationPath },\n });\n } else {\n diagnostics.push({\n code: 'NO_MIGRATION_PATH',\n severity: 'error',\n message: `Document schema version \"${docVersion}\" is not compatible and no migration path exists to \"${targetVersion}\".`,\n details: { sourceVersion: docVersion, targetVersion },\n });\n }\n } else {\n // Validate current schema structure\n const docValidation = validateDocument(rawPageDoc, {\n componentRegistry: options.componentRegistry,\n knownComponentTypes: options.knownComponentTypes,\n });\n const criticalDocErrors = docValidation.errors.filter((e) => {\n if (e.code === 'UNKNOWN_COMPONENT_TYPE' && dependencyPolicy !== 'cancel') {\n return false;\n }\n return true;\n });\n if (criticalDocErrors.length > 0) {\n diagnostics.push({\n code: 'INVALID_PAGE_DOCUMENT',\n severity: 'error',\n message: `Document validation failed with ${criticalDocErrors.length} error(s):\\n` +\n criticalDocErrors.map((e) => `[${e.code}] ${e.path}: ${e.message}`).join('\\n'),\n });\n }\n }\n }\n\n // 8. Verify Asset Inventory & Checksums\n const missingComponents: string[] = [];\n const missingCapabilities: string[] = [];\n const assetConflicts: AssetConflict[] = [];\n\n // Build existing host assets set\n const existingAssetIdsSet = new Set<string>();\n if (options.existingAssetIds) {\n if (Array.isArray(options.existingAssetIds)) {\n for (const id of options.existingAssetIds) existingAssetIdsSet.add(id);\n } else if (options.existingAssetIds instanceof Set) {\n for (const id of options.existingAssetIds) existingAssetIdsSet.add(id);\n }\n }\n\n // Check host assetProvider list if available and existingAssetIds not given\n if (options.assetProvider?.list && !options.existingAssetIds) {\n try {\n const list = await options.assetProvider.list();\n if (Array.isArray(list)) {\n for (const item of list) {\n if (item?.id) existingAssetIdsSet.add(item.id);\n }\n }\n } catch {\n // Non-fatal\n }\n }\n\n if (parsedManifest) {\n for (const assetItem of parsedManifest.assets) {\n // Validate asset path in archive\n const assetFile = unzipped[assetItem.path];\n if (!assetFile) {\n diagnostics.push({\n code: 'ASSET_FILE_MISSING',\n severity: 'error',\n message: `Declared asset \"${assetItem.id}\" is missing in archive at path \"${assetItem.path}\".`,\n path: assetItem.path,\n details: { assetId: assetItem.id },\n });\n continue;\n }\n\n // Validate size\n if (assetFile.byteLength !== assetItem.size) {\n diagnostics.push({\n code: 'ASSET_SIZE_MISMATCH',\n severity: 'error',\n message: `Asset \"${assetItem.id}\" size mismatch: expected ${assetItem.size} bytes, found ${assetFile.byteLength} bytes.`,\n path: assetItem.path,\n details: { assetId: assetItem.id, expected: assetItem.size, actual: assetFile.byteLength },\n });\n }\n\n // Validate checksum if provided\n if (assetItem.checksum) {\n const actualChecksum = await calculateChecksum(assetFile);\n if (actualChecksum !== assetItem.checksum) {\n diagnostics.push({\n code: 'ASSET_CHECKSUM_MISMATCH',\n severity: 'error',\n message: `Asset \"${assetItem.id}\" checksum mismatch: expected ${assetItem.checksum}, calculated ${actualChecksum}.`,\n path: assetItem.path,\n details: { assetId: assetItem.id, expected: assetItem.checksum, actual: actualChecksum },\n });\n }\n }\n\n // Check collision with host assets\n let isConflict = false;\n if (typeof options.existingAssetIds === 'function') {\n const fnRes = await options.existingAssetIds(assetItem.id);\n if (fnRes) isConflict = true;\n } else if (existingAssetIdsSet.has(assetItem.id)) {\n isConflict = true;\n }\n\n if (isConflict) {\n assetConflicts.push({\n assetId: assetItem.id,\n path: assetItem.path,\n mimeType: assetItem.mimeType,\n size: assetItem.size,\n });\n }\n }\n\n // Report Asset Collision diagnostics\n if (assetConflicts.length > 0) {\n const conflictIds = assetConflicts.map((c) => c.assetId).join(', ');\n if (assetCollisionStrategy === 'reject' && !options.onAssetConflict) {\n diagnostics.push({\n code: 'ASSET_CONFLICT',\n severity: 'error',\n message: `Asset collision detected for asset(s): ${conflictIds}. Host assets will not be overwritten without an explicit assetCollisionStrategy.`,\n details: { assetConflicts, strategy: assetCollisionStrategy },\n });\n } else {\n diagnostics.push({\n code: 'ASSET_CONFLICT',\n severity: 'info',\n message: `Asset collision detected for asset(s): ${conflictIds}. Strategy \"${assetCollisionStrategy}\" will be applied on import.`,\n details: { assetConflicts, strategy: assetCollisionStrategy },\n });\n }\n }\n\n // 9. Component Requirements Check\n const knownSet = new Set<string>();\n if (options.knownComponentTypes) {\n for (const t of options.knownComponentTypes) knownSet.add(t);\n }\n // Add standard built-ins\n const builtIns = ['page', 'section', 'container', 'columns', 'heading', 'text', 'image', 'button', 'collection'];\n for (const b of builtIns) knownSet.add(b);\n\n for (const compType of parsedManifest.requiredComponents) {\n let isSupported = knownSet.has(compType);\n if (!isSupported && options.componentRegistry) {\n isSupported = options.componentRegistry.has(compType);\n }\n if (!isSupported) {\n missingComponents.push(compType);\n }\n }\n\n if (missingComponents.length > 0) {\n if (dependencyPolicy === 'cancel' && !options.allowMissingComponents) {\n diagnostics.push({\n code: 'MISSING_COMPONENTS',\n severity: 'error',\n message: `Package requires custom component(s) not registered in host: ${missingComponents.join(', ')}.`,\n details: { missingComponents, policy: dependencyPolicy },\n });\n } else if (dependencyPolicy === 'import-with-placeholder' || options.allowMissingComponents) {\n diagnostics.push({\n code: 'MISSING_COMPONENTS',\n severity: 'warning',\n message: `Package requires custom component(s) [${missingComponents.join(', ')}] not registered in host. Nodes and props are preserved intact for placeholder rendering.`,\n details: { missingComponents, policy: dependencyPolicy },\n });\n } else if (dependencyPolicy === 'install-or-register-before-import') {\n diagnostics.push({\n code: 'MISSING_COMPONENTS',\n severity: 'info',\n message: `Package requires custom component(s) [${missingComponents.join(', ')}]. Installation/registration required before import.`,\n details: { missingComponents, policy: dependencyPolicy },\n });\n }\n }\n\n // 10. Capability Requirements Check\n const supportedCaps = new Set<string>();\n if (options.supportedCapabilities) {\n for (const c of options.supportedCapabilities) supportedCaps.add(c);\n }\n\n for (const cap of parsedManifest.requiredCapabilities) {\n if (!supportedCaps.has(cap)) {\n missingCapabilities.push(cap);\n }\n }\n\n if (missingCapabilities.length > 0) {\n if (dependencyPolicy === 'cancel' && !options.allowMissingCapabilities) {\n diagnostics.push({\n code: 'MISSING_CAPABILITIES',\n severity: 'error',\n message: `Package requires capability/capabilities not supported by host: ${missingCapabilities.join(', ')}.`,\n details: { missingCapabilities, policy: dependencyPolicy },\n });\n } else if (dependencyPolicy === 'import-with-placeholder' || options.allowMissingCapabilities) {\n diagnostics.push({\n code: 'MISSING_CAPABILITIES',\n severity: 'warning',\n message: `Package requires capability/capabilities [${missingCapabilities.join(', ')}] not supported by host. Placeholder rendering enabled.`,\n details: { missingCapabilities, policy: dependencyPolicy },\n });\n } else if (dependencyPolicy === 'install-or-register-before-import') {\n diagnostics.push({\n code: 'MISSING_CAPABILITIES',\n severity: 'info',\n message: `Package requires capability/capabilities [${missingCapabilities.join(', ')}]. Registration required before import.`,\n details: { missingCapabilities, policy: dependencyPolicy },\n });\n }\n }\n }\n\n const hasErrors = diagnostics.some((d) => d.severity === 'error');\n const valid = !hasErrors;\n const canImport = valid;\n\n return buildReport(valid, canImport, {\n manifest: parsedManifest,\n rawMetadata,\n sourceVersion: docVersion,\n targetVersion,\n requiresMigration,\n migrationPath,\n missingComponents,\n missingCapabilities,\n dependencyPolicy,\n assetCount: parsedManifest?.assets.length || 0,\n assetConflicts,\n assetCollisionStrategy,\n totalUncompressedBytes,\n diagnostics,\n });\n}\n\nfunction buildReport(\n valid: boolean,\n canImport: boolean,\n fields: Partial<PreflightReport>,\n): PreflightReport {\n return {\n valid,\n canImport,\n targetVersion: fields.targetVersion || CURRENT_SCHEMA_VERSION,\n requiresMigration: fields.requiresMigration || false,\n missingComponents: fields.missingComponents || [],\n missingCapabilities: fields.missingCapabilities || [],\n dependencyPolicy: fields.dependencyPolicy || 'cancel',\n assetCount: fields.assetCount || 0,\n assetConflicts: fields.assetConflicts || [],\n assetCollisionStrategy: fields.assetCollisionStrategy || 'reject',\n totalUncompressedBytes: fields.totalUncompressedBytes || 0,\n diagnostics: fields.diagnostics || [],\n ...fields,\n };\n}\n\n/**\n * Preview a .stora package without mutating host state.\n * Returns missing dependencies, asset conflicts, schema migration status, and diagnostics.\n */\nexport const previewImportPackage = preflightPackage;\n\n/**\n * Alias for preflightPackage.\n */\nexport const inspectPackage = preflightPackage;\n\n/**\n * Default generator for renaming colliding asset IDs.\n */\nexport function defaultRenameAssetStrategy(\n incoming: ManifestAssetItem,\n existingIds: Set<string>,\n): string {\n let candidate = `${incoming.id}_imported`;\n let counter = 1;\n while (existingIds.has(candidate)) {\n candidate = `${incoming.id}_imported_${counter}`;\n counter++;\n }\n return candidate;\n}\n\n/**\n * Imports a .stora package with preflight safety checks, schema migration, missing dependency policy,\n * and host-controlled asset collision handling.\n */\nexport async function importPackage(\n archiveData: Uint8Array | ArrayBuffer,\n options: ImportPackageOptions = {},\n): Promise<ImportPackageResult> {\n // 1. Run Preflight Inspection first\n let preflight = await preflightPackage(archiveData, options);\n\n // 2. Handle 'install-or-register-before-import' policy hook\n const dependencyPolicy = options.dependencyPolicy || preflight.dependencyPolicy;\n if (\n dependencyPolicy === 'install-or-register-before-import' &&\n (preflight.missingComponents.length > 0 || preflight.missingCapabilities.length > 0) &&\n options.onMissingDependency\n ) {\n try {\n await options.onMissingDependency(\n {\n components: [...preflight.missingComponents],\n capabilities: [...preflight.missingCapabilities],\n },\n preflight,\n );\n\n // Re-run preflight after hook execution\n preflight = await preflightPackage(archiveData, {\n ...options,\n dependencyPolicy: 'cancel', // Strict check after install attempt\n });\n } catch (err) {\n const diag: PreflightDiagnostic = {\n code: 'HOST_ADAPTER_ERROR',\n severity: 'error',\n message: `Dynamic dependency registration failed: ${err instanceof Error ? err.message : String(err)}`,\n };\n return {\n success: false,\n errors: [diag],\n diagnosticMessage: diag.message,\n preflight,\n };\n }\n }\n\n if (!preflight.canImport || !preflight.manifest) {\n const errorDiagnostics = preflight.diagnostics.filter((d) => d.severity === 'error');\n const diagnosticMessage = `Package import rejected with ${errorDiagnostics.length} error(s):\\n` +\n errorDiagnostics.map((d) => `[${d.code}] ${d.path ? d.path + ': ' : ''}${d.message}`).join('\\n');\n\n return {\n success: false,\n errors: errorDiagnostics,\n diagnosticMessage,\n preflight,\n };\n }\n\n const archiveBytes = archiveData instanceof Uint8Array ? archiveData : new Uint8Array(archiveData);\n const unzipped = unzipSync(archiveBytes);\n\n // 3. Read and Migrate Page Document\n const pageRaw = JSON.parse(strFromU8(unzipped['page.json']));\n let finalDocument: PageDocument;\n\n if (preflight.requiresMigration) {\n const migrationRegistry = options.migrationRegistry || defaultMigrationRegistry;\n const migrationRes = migrateDocument(pageRaw, {\n targetVersion: options.targetSchemaVersion || CURRENT_SCHEMA_VERSION,\n registry: migrationRegistry,\n validate: true,\n });\n\n if (!migrationRes.success || !migrationRes.document) {\n const err: PreflightDiagnostic = {\n code: 'MIGRATION_FAILED',\n severity: 'error',\n message: `Failed to migrate document from \"${preflight.sourceVersion}\" to \"${preflight.targetVersion}\".`,\n details: { diagnostic: migrationRes.diagnostic },\n };\n return {\n success: false,\n errors: [err],\n diagnosticMessage: err.message,\n preflight,\n };\n }\n\n finalDocument = migrationRes.document;\n } else {\n finalDocument = pageRaw as PageDocument;\n }\n\n // 4. Extract and Merge Metadata\n let metadata: DocumentMetadata = finalDocument.metadata || {\n title: 'Imported Page',\n description: '',\n author: '',\n tags: [],\n category: 'general',\n version: finalDocument.version || CURRENT_SCHEMA_VERSION,\n };\n\n if (unzipped['metadata.json']) {\n try {\n const metaFromFile = JSON.parse(strFromU8(unzipped['metadata.json'])) as DocumentMetadata;\n metadata = {\n ...metadata,\n ...metaFromFile,\n };\n } catch {\n // Use document metadata\n }\n }\n\n finalDocument.metadata = metadata;\n\n // 5. Build existing host assets set\n const existingAssetIdsSet = new Set<string>();\n if (options.existingAssetIds) {\n if (Array.isArray(options.existingAssetIds)) {\n for (const id of options.existingAssetIds) existingAssetIdsSet.add(id);\n } else if (options.existingAssetIds instanceof Set) {\n for (const id of options.existingAssetIds) existingAssetIdsSet.add(id);\n }\n }\n\n if (options.assetProvider?.list && !options.existingAssetIds) {\n try {\n const list = await options.assetProvider.list();\n if (Array.isArray(list)) {\n for (const item of list) {\n if (item?.id) existingAssetIdsSet.add(item.id);\n }\n }\n } catch {\n // Non-fatal\n }\n }\n\n const renameAssetFn = options.renameAssetStrategy || defaultRenameAssetStrategy;\n const renameMap: Record<string, string> = {};\n const extractedAssets = new Map<string, ExtractedAsset>();\n\n // 6. Extract Assets with Host-Controlled Collision Resolution\n for (const assetItem of preflight.manifest.assets) {\n const assetBytes = unzipped[assetItem.path];\n if (assetBytes) {\n let targetAssetId = assetItem.id;\n let effectiveStrategy: AssetCollisionStrategy = options.assetCollisionStrategy || 'reject';\n\n const conflictInfo = preflight.assetConflicts.find((c) => c.assetId === assetItem.id);\n\n if (conflictInfo) {\n if (options.onAssetConflict) {\n try {\n const conflictRes = await options.onAssetConflict(conflictInfo);\n if (typeof conflictRes === 'string') {\n effectiveStrategy = conflictRes;\n } else {\n effectiveStrategy = conflictRes.action;\n if (conflictRes.newAssetId) {\n targetAssetId = conflictRes.newAssetId;\n }\n }\n } catch (err) {\n const diag: PreflightDiagnostic = {\n code: 'HOST_ADAPTER_ERROR',\n severity: 'error',\n message: `Asset conflict resolution handler failed for \"${assetItem.id}\": ${err instanceof Error ? err.message : String(err)}`,\n path: assetItem.path,\n };\n return {\n success: false,\n errors: [diag],\n diagnosticMessage: diag.message,\n preflight,\n };\n }\n }\n\n if (effectiveStrategy === 'reject') {\n const diag: PreflightDiagnostic = {\n code: 'ASSET_CONFLICT',\n severity: 'error',\n message: `Import aborted: Asset \"${assetItem.id}\" collides with host asset. No overwrite strategy specified.`,\n path: assetItem.path,\n };\n return {\n success: false,\n errors: [diag],\n diagnosticMessage: diag.message,\n preflight,\n };\n }\n\n if (effectiveStrategy === 'rename') {\n if (targetAssetId === assetItem.id) {\n targetAssetId = renameAssetFn(assetItem, existingAssetIdsSet);\n }\n renameMap[assetItem.id] = targetAssetId;\n existingAssetIdsSet.add(targetAssetId);\n }\n }\n\n let hostInfo: AssetInfo | string | undefined;\n\n if (effectiveStrategy === 'reuse-existing' && conflictInfo) {\n // Reuse existing asset: skip binary upload and resolve from host provider\n if (options.assetProvider?.resolve) {\n hostInfo = await options.assetProvider.resolve(targetAssetId);\n }\n } else {\n // Upload or pass to onAssetImport hook\n const effectiveMeta: ManifestAssetItem = {\n ...assetItem,\n id: targetAssetId,\n };\n\n if (options.onAssetImport) {\n try {\n const result = await options.onAssetImport(targetAssetId, assetBytes, effectiveMeta);\n if (result) hostInfo = result;\n } catch (err) {\n const diag: PreflightDiagnostic = {\n code: 'HOST_ADAPTER_ERROR',\n severity: 'error',\n message: `Host asset import hook failed for \"${targetAssetId}\": ${err instanceof Error ? err.message : String(err)}`,\n path: assetItem.path,\n };\n return {\n success: false,\n errors: [diag],\n diagnosticMessage: diag.message,\n preflight,\n };\n }\n } else if (options.assetProvider?.upload) {\n try {\n const blob = new Blob([assetBytes], { type: assetItem.mimeType });\n const filename = assetItem.path.replace(/^assets\\//, '');\n const file = new File([blob], filename, { type: assetItem.mimeType });\n const info = await options.assetProvider.upload(file, {\n assetId: targetAssetId,\n originalAssetId: assetItem.id,\n });\n if (info) hostInfo = info;\n } catch {\n // Non-fatal if upload not strictly required\n }\n }\n }\n\n extractedAssets.set(targetAssetId, {\n bytes: assetBytes,\n meta: {\n ...assetItem,\n id: targetAssetId,\n },\n hostInfo,\n });\n }\n }\n\n // 7. Remap Asset References in Document if Any Assets Were Renamed\n if (Object.keys(renameMap).length > 0) {\n remapDocumentAssetReferences(finalDocument, renameMap);\n }\n\n return {\n success: true,\n document: finalDocument,\n manifest: preflight.manifest,\n metadata,\n extractedAssets,\n renamedAssets: Object.keys(renameMap).length > 0 ? renameMap : undefined,\n preflight,\n };\n}\n\n/**\n * Alias for importPackage.\n */\nexport const importStoraPackage = importPackage;\n","import {\n PageDocument,\n Node,\n ResponsiveStyles,\n StyleDefinition,\n Manifest,\n VariableBinding,\n ActionBinding,\n AssetReference,\n} from '@kubuild/schema';\n\nexport type SemanticDifferenceKind =\n | 'METADATA_MISMATCH'\n | 'NODE_MISSING'\n | 'NODE_EXTRA'\n | 'NODE_ORDER'\n | 'NODE_TYPE'\n | 'PROP_MISMATCH'\n | 'STYLE_MISMATCH'\n | 'BINDING_MISMATCH'\n | 'ACTION_MISMATCH'\n | 'ASSET_MISMATCH'\n | 'DEPENDENCY_MISMATCH';\n\nexport interface SemanticDifference {\n path: string;\n kind: SemanticDifferenceKind;\n message: string;\n expected?: unknown;\n actual?: unknown;\n}\n\nexport interface SemanticCompareOptions {\n /**\n * Optional map of original asset IDs to host-remapped asset IDs.\n * Used when host renamed colliding assets during import.\n */\n assetIdMap?: Record<string, string> | Map<string, string>;\n\n /**\n * Whether to ignore transient timestamp fields (e.g. createdAt/updatedAt).\n * Default: true.\n */\n ignoreTimestamps?: boolean;\n}\n\nexport interface SemanticComparisonResult {\n equivalent: boolean;\n differences: SemanticDifference[];\n}\n\nfunction isAssetReferenceLike(val: unknown): val is AssetReference {\n if (!val || typeof val !== 'object') return false;\n const obj = val as Record<string, unknown>;\n return obj.type === 'asset' && typeof obj.assetId === 'string' && obj.assetId.trim().length > 0;\n}\n\nfunction isVariableBindingLike(val: unknown): val is VariableBinding {\n if (!val || typeof val !== 'object') return false;\n const obj = val as Record<string, unknown>;\n return obj.type === 'variable' && typeof obj.key === 'string' && obj.key.trim().length > 0;\n}\n\nfunction isActionBindingLike(val: unknown): val is ActionBinding {\n if (!val || typeof val !== 'object') return false;\n const obj = val as Record<string, unknown>;\n return obj.type !== undefined && typeof obj.type === 'string' && obj.type.trim().length > 0 && ('payload' in obj || Object.keys(obj).length <= 2);\n}\n\nfunction normalizeAssetId(\n id: string,\n assetIdMap?: Record<string, string> | Map<string, string>,\n): string {\n if (!assetIdMap) return id;\n if (assetIdMap instanceof Map) {\n return assetIdMap.get(id) ?? id;\n }\n return assetIdMap[id] ?? id;\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null || typeof a !== 'object' || typeof b !== 'object') {\n return false;\n }\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) return false;\n }\n return true;\n }\n\n const objA = a as Record<string, unknown>;\n const objB = b as Record<string, unknown>;\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) return false;\n for (const k of keysA) {\n if (!Object.prototype.hasOwnProperty.call(objB, k)) return false;\n if (!deepEqual(objA[k], objB[k])) return false;\n }\n return true;\n}\n\n/**\n * Recursively compares two props values, checking for variable bindings, action bindings,\n * and asset references (with asset ID mapping support).\n */\nfunction comparePropValues(\n path: string,\n expected: unknown,\n actual: unknown,\n differences: SemanticDifference[],\n options?: SemanticCompareOptions,\n): void {\n // 1. Variable Binding check\n if (isVariableBindingLike(expected)) {\n if (!isVariableBindingLike(actual)) {\n differences.push({\n path,\n kind: 'BINDING_MISMATCH',\n message: `Expected variable binding at \"${path}\", but got non-binding value.`,\n expected,\n actual,\n });\n return;\n }\n const expBinding = expected as VariableBinding;\n const actBinding = actual as VariableBinding;\n if (expBinding.key !== actBinding.key) {\n differences.push({\n path: `${path}.key`,\n kind: 'BINDING_MISMATCH',\n message: `Variable binding key mismatch at \"${path}\": expected \"${expBinding.key}\", got \"${actBinding.key}\".`,\n expected: expBinding.key,\n actual: actBinding.key,\n });\n }\n if (!deepEqual(expBinding.fallback, actBinding.fallback)) {\n differences.push({\n path: `${path}.fallback`,\n kind: 'BINDING_MISMATCH',\n message: `Variable binding fallback mismatch at \"${path}\".`,\n expected: expBinding.fallback,\n actual: actBinding.fallback,\n });\n }\n return;\n }\n\n // 2. Action Binding check\n if (isActionBindingLike(expected) && !isAssetReferenceLike(expected) && !isVariableBindingLike(expected)) {\n if (!isActionBindingLike(actual)) {\n differences.push({\n path,\n kind: 'ACTION_MISMATCH',\n message: `Expected action binding at \"${path}\", but got non-action value.`,\n expected,\n actual,\n });\n return;\n }\n const expAction = expected as ActionBinding;\n const actAction = actual as ActionBinding;\n if (expAction.type !== actAction.type) {\n differences.push({\n path: `${path}.type`,\n kind: 'ACTION_MISMATCH',\n message: `Action binding type mismatch at \"${path}\": expected \"${expAction.type}\", got \"${actAction.type}\".`,\n expected: expAction.type,\n actual: actAction.type,\n });\n }\n if (!deepEqual(expAction.payload ?? {}, actAction.payload ?? {})) {\n differences.push({\n path: `${path}.payload`,\n kind: 'ACTION_MISMATCH',\n message: `Action binding payload mismatch at \"${path}\".`,\n expected: expAction.payload,\n actual: actAction.payload,\n });\n }\n return;\n }\n\n // 3. Asset Reference check\n if (isAssetReferenceLike(expected)) {\n if (!isAssetReferenceLike(actual)) {\n differences.push({\n path,\n kind: 'ASSET_MISMATCH',\n message: `Expected asset reference at \"${path}\", but got non-asset value.`,\n expected,\n actual,\n });\n return;\n }\n const expAsset = expected as AssetReference;\n const actAsset = actual as AssetReference;\n const expectedMappedId = normalizeAssetId(expAsset.assetId, options?.assetIdMap);\n\n if (actAsset.assetId !== expectedMappedId) {\n differences.push({\n path: `${path}.assetId`,\n kind: 'ASSET_MISMATCH',\n message: `Asset reference ID mismatch at \"${path}\": expected \"${expectedMappedId}\" (original: \"${expAsset.assetId}\"), got \"${actAsset.assetId}\".`,\n expected: expectedMappedId,\n actual: actAsset.assetId,\n });\n }\n if (expAsset.filename !== actAsset.filename) {\n differences.push({\n path: `${path}.filename`,\n kind: 'ASSET_MISMATCH',\n message: `Asset reference filename mismatch at \"${path}\": expected \"${expAsset.filename}\", got \"${actAsset.filename}\".`,\n expected: expAsset.filename,\n actual: actAsset.filename,\n });\n }\n if (expAsset.mimeType !== actAsset.mimeType) {\n differences.push({\n path: `${path}.mimeType`,\n kind: 'ASSET_MISMATCH',\n message: `Asset reference mimeType mismatch at \"${path}\": expected \"${expAsset.mimeType}\", got \"${actAsset.mimeType}\".`,\n expected: expAsset.mimeType,\n actual: actAsset.mimeType,\n });\n }\n return;\n }\n\n // 4. Object recursion\n if (\n expected !== null &&\n actual !== null &&\n typeof expected === 'object' &&\n typeof actual === 'object'\n ) {\n if (Array.isArray(expected) !== Array.isArray(actual)) {\n differences.push({\n path,\n kind: 'PROP_MISMATCH',\n message: `Type mismatch at \"${path}\": one is array, other is object.`,\n expected,\n actual,\n });\n return;\n }\n\n if (Array.isArray(expected) && Array.isArray(actual)) {\n if (expected.length !== actual.length) {\n differences.push({\n path,\n kind: 'PROP_MISMATCH',\n message: `Array length mismatch at \"${path}\": expected length ${expected.length}, got ${actual.length}.`,\n expected,\n actual,\n });\n return;\n }\n for (let i = 0; i < expected.length; i++) {\n comparePropValues(`${path}[${i}]`, expected[i], actual[i], differences, options);\n }\n return;\n }\n\n const expObj = expected as Record<string, unknown>;\n const actObj = actual as Record<string, unknown>;\n const allKeys = new Set([...Object.keys(expObj), ...Object.keys(actObj)]);\n\n for (const key of allKeys) {\n if (!(key in expObj)) {\n differences.push({\n path: `${path}.${key}`,\n kind: 'PROP_MISMATCH',\n message: `Unexpected extra prop key \"${key}\" at \"${path}\".`,\n actual: actObj[key],\n });\n } else if (!(key in actObj)) {\n differences.push({\n path: `${path}.${key}`,\n kind: 'PROP_MISMATCH',\n message: `Missing expected prop key \"${key}\" at \"${path}\".`,\n expected: expObj[key],\n });\n } else {\n comparePropValues(`${path}.${key}`, expObj[key], actObj[key], differences, options);\n }\n }\n return;\n }\n\n // 5. Primitive equality check\n if (expected !== actual) {\n differences.push({\n path,\n kind: 'PROP_MISMATCH',\n message: `Value mismatch at \"${path}\": expected \"${String(expected)}\", got \"${String(actual)}\".`,\n expected,\n actual,\n });\n }\n}\n\n/**\n * Compares responsive styles across all breakpoints (base, desktop, tablet, mobile).\n */\nfunction compareStyles(\n nodePath: string,\n expected?: ResponsiveStyles,\n actual?: ResponsiveStyles,\n differences: SemanticDifference[] = [],\n): void {\n const breakpoints = ['base', 'desktop', 'tablet', 'mobile'] as const;\n const expStyles = expected || {};\n const actStyles = actual || {};\n\n for (const bp of breakpoints) {\n const expBp = (expStyles[bp] as StyleDefinition | undefined) || {};\n const actBp = (actStyles[bp] as StyleDefinition | undefined) || {};\n\n const allKeys = new Set([...Object.keys(expBp), ...Object.keys(actBp)]);\n for (const key of allKeys) {\n const expVal = expBp[key];\n const actVal = actBp[key];\n\n // Treat undefined and empty string as equivalent empty style values\n const expNorm = expVal === undefined || expVal === '' ? undefined : expVal;\n const actNorm = actVal === undefined || actVal === '' ? undefined : actVal;\n\n if (expNorm !== actNorm) {\n differences.push({\n path: `${nodePath}.styles.${bp}.${key}`,\n kind: 'STYLE_MISMATCH',\n message: `Style mismatch at \"${nodePath}.styles.${bp}.${key}\": expected \"${String(expVal)}\", got \"${String(actVal)}\".`,\n expected: expVal,\n actual: actVal,\n });\n }\n }\n }\n}\n\n/**\n * Recursively compares two component trees, strictly verifying node identity, order,\n * props, styles, and children.\n */\nfunction compareNodes(\n expected: Node,\n actual: Node,\n nodePath: string,\n differences: SemanticDifference[],\n options?: SemanticCompareOptions,\n): void {\n // 1. Check ID\n if (expected.id !== actual.id) {\n differences.push({\n path: `${nodePath}.id`,\n kind: 'NODE_MISSING',\n message: `Node ID mismatch at \"${nodePath}\": expected \"${expected.id}\", got \"${actual.id}\".`,\n expected: expected.id,\n actual: actual.id,\n });\n }\n\n // 2. Check Type\n if (expected.type !== actual.type) {\n differences.push({\n path: `${nodePath}.type`,\n kind: 'NODE_TYPE',\n message: `Node type mismatch for \"${expected.id}\": expected \"${expected.type}\", got \"${actual.type}\".`,\n expected: expected.type,\n actual: actual.type,\n });\n }\n\n // 3. Compare Props\n comparePropValues(`${nodePath}.props`, expected.props || {}, actual.props || {}, differences, options);\n\n // 4. Compare Styles\n compareStyles(nodePath, expected.styles, actual.styles, differences);\n\n // 5. Compare Children (Order and Content)\n const expChildren = expected.children || [];\n const actChildren = actual.children || [];\n\n if (expChildren.length !== actChildren.length) {\n differences.push({\n path: `${nodePath}.children`,\n kind: 'NODE_ORDER',\n message: `Children count mismatch for node \"${expected.id}\": expected ${expChildren.length}, got ${actChildren.length}.`,\n expected: expChildren.map((c) => c.id),\n actual: actChildren.map((c) => c.id),\n });\n }\n\n const maxLen = Math.max(expChildren.length, actChildren.length);\n for (let i = 0; i < maxLen; i++) {\n const expChild = expChildren[i];\n const actChild = actChildren[i];\n\n if (!expChild && actChild) {\n differences.push({\n path: `${nodePath}.children[${i}]`,\n kind: 'NODE_EXTRA',\n message: `Unexpected extra child node \"${actChild.id}\" at index ${i}.`,\n actual: actChild.id,\n });\n } else if (expChild && !actChild) {\n differences.push({\n path: `${nodePath}.children[${i}]`,\n kind: 'NODE_MISSING',\n message: `Missing child node \"${expChild.id}\" at index ${i}.`,\n expected: expChild.id,\n });\n } else if (expChild && actChild) {\n if (expChild.id !== actChild.id) {\n differences.push({\n path: `${nodePath}.children[${i}]`,\n kind: 'NODE_ORDER',\n message: `Node order mismatch at index ${i}: expected node \"${expChild.id}\", got \"${actChild.id}\".`,\n expected: expChild.id,\n actual: actChild.id,\n });\n }\n compareNodes(expChild, actChild, `${nodePath}.children[${i}](${expChild.id})`, differences, options);\n }\n }\n}\n\n/**\n * Semantically compares two PageDocuments, checking metadata, tree structure,\n * node order, props, responsive styles, bindings, action references, and asset mappings.\n *\n * Only documented transient fields (e.g. transient timestamps, host-generated asset IDs)\n * are ignored or normalized per options.\n */\nexport function compareDocumentsSemantically(\n expected: PageDocument,\n actual: PageDocument,\n options: SemanticCompareOptions = {},\n): SemanticComparisonResult {\n const differences: SemanticDifference[] = [];\n const { ignoreTimestamps = true } = options;\n\n // 1. Schema & Version check\n if (expected.schema !== actual.schema) {\n differences.push({\n path: 'schema',\n kind: 'METADATA_MISMATCH',\n message: `Schema mismatch: expected \"${expected.schema}\", got \"${actual.schema}\".`,\n expected: expected.schema,\n actual: actual.schema,\n });\n }\n if (expected.version !== actual.version) {\n differences.push({\n path: 'version',\n kind: 'METADATA_MISMATCH',\n message: `Schema version mismatch: expected \"${expected.version}\", got \"${actual.version}\".`,\n expected: expected.version,\n actual: actual.version,\n });\n }\n\n // 2. Metadata check\n const expMeta = expected.metadata || ({} as Record<string, unknown>);\n const actMeta = actual.metadata || ({} as Record<string, unknown>);\n const metaKeys = new Set([...Object.keys(expMeta), ...Object.keys(actMeta)]);\n\n for (const k of metaKeys) {\n if (ignoreTimestamps && (k === 'updatedAt' || k === 'createdAt')) {\n continue;\n }\n const expVal = (expMeta as Record<string, unknown>)[k];\n const actVal = (actMeta as Record<string, unknown>)[k];\n if (!deepEqual(expVal, actVal)) {\n differences.push({\n path: `metadata.${k}`,\n kind: 'METADATA_MISMATCH',\n message: `Metadata mismatch at \"metadata.${k}\": expected \"${String(expVal)}\", got \"${String(actVal)}\".`,\n expected: expVal,\n actual: actVal,\n });\n }\n }\n\n // 3. Tree comparison\n compareNodes(\n expected.document,\n actual.document,\n `root(${expected.document.id})`,\n differences,\n options,\n );\n\n return {\n equivalent: differences.length === 0,\n differences,\n };\n}\n\n/**\n * Semantically compares exported and imported package manifests.\n */\nexport function compareManifestsSemantically(\n expected: Manifest,\n actual: Manifest,\n options: SemanticCompareOptions = {},\n): SemanticComparisonResult {\n const differences: SemanticDifference[] = [];\n const { ignoreTimestamps = true } = options;\n\n if (expected.schema !== actual.schema) {\n differences.push({\n path: 'manifest.schema',\n kind: 'METADATA_MISMATCH',\n message: `Manifest schema mismatch: expected \"${expected.schema}\", got \"${actual.schema}\".`,\n expected: expected.schema,\n actual: actual.schema,\n });\n }\n\n if (expected.schemaVersion !== actual.schemaVersion) {\n differences.push({\n path: 'manifest.schemaVersion',\n kind: 'METADATA_MISMATCH',\n message: `Manifest schemaVersion mismatch: expected \"${expected.schemaVersion}\", got \"${actual.schemaVersion}\".`,\n expected: expected.schemaVersion,\n actual: actual.schemaVersion,\n });\n }\n\n // Compare requiredComponents\n const expComponents = new Set(expected.requiredComponents || []);\n const actComponents = new Set(actual.requiredComponents || []);\n for (const c of expComponents) {\n if (!actComponents.has(c)) {\n differences.push({\n path: 'manifest.requiredComponents',\n kind: 'DEPENDENCY_MISMATCH',\n message: `Missing required component in manifest: \"${c}\".`,\n expected: c,\n });\n }\n }\n for (const c of actComponents) {\n if (!expComponents.has(c)) {\n differences.push({\n path: 'manifest.requiredComponents',\n kind: 'DEPENDENCY_MISMATCH',\n message: `Unexpected extra required component in manifest: \"${c}\".`,\n actual: c,\n });\n }\n }\n\n // Compare requiredCapabilities\n const expCaps = new Set(expected.requiredCapabilities || []);\n const actCaps = new Set(actual.requiredCapabilities || []);\n for (const c of expCaps) {\n if (!actCaps.has(c)) {\n differences.push({\n path: 'manifest.requiredCapabilities',\n kind: 'DEPENDENCY_MISMATCH',\n message: `Missing required capability in manifest: \"${c}\".`,\n expected: c,\n });\n }\n }\n for (const c of actCaps) {\n if (!expCaps.has(c)) {\n differences.push({\n path: 'manifest.requiredCapabilities',\n kind: 'DEPENDENCY_MISMATCH',\n message: `Unexpected extra required capability in manifest: \"${c}\".`,\n actual: c,\n });\n }\n }\n\n // Compare assets\n if (expected.assets.length !== actual.assets.length) {\n differences.push({\n path: 'manifest.assets',\n kind: 'ASSET_MISMATCH',\n message: `Manifest asset count mismatch: expected ${expected.assets.length}, got ${actual.assets.length}.`,\n expected: expected.assets.length,\n actual: actual.assets.length,\n });\n }\n\n return {\n equivalent: differences.length === 0,\n differences,\n };\n}\n","import {\n TemplateRecordSchema,\n collectNodeIds,\n isTemplateRecord,\n type TemplateRecord,\n type TemplateRequirements,\n type PageDocument,\n type Node,\n} from '@kubuild/schema';\nimport { deepClone } from './command-tree-utils';\nimport { validateDocument } from './validator';\n\n/**\n * Standard core built-in component types\n */\nexport const CORE_BUILTIN_COMPONENTS = new Set([\n 'page',\n 'section',\n 'container',\n 'columns',\n 'column',\n 'heading',\n 'text',\n 'image',\n 'button',\n 'collection',\n]);\n\n/**\n * Structured validation error entry\n */\nexport interface TemplateValidationError {\n code: string;\n message: string;\n path: string;\n}\n\n/**\n * Result of template record validation\n */\nexport interface TemplateValidationResult {\n valid: boolean;\n data?: TemplateRecord;\n errors?: TemplateValidationError[];\n}\n\n/**\n * Validates a template record value against TemplateRecordSchema and returns structured errors.\n */\nexport function validateTemplate(value: unknown): TemplateValidationResult {\n const parseResult = TemplateRecordSchema.safeParse(value);\n\n if (parseResult.success) {\n return {\n valid: true,\n data: parseResult.data,\n };\n }\n\n const errors: TemplateValidationError[] = parseResult.error.issues.map((issue) => ({\n code: issue.code,\n message: issue.message,\n path: `/${issue.path.join('/')}`,\n }));\n\n return {\n valid: false,\n errors,\n };\n}\n\n/**\n * Helper to recursively collect all component types used in a node tree.\n */\nfunction collectComponentTypes(node: Node, types: Set<string>): void {\n if (node.type) {\n types.add(node.type);\n }\n if (node.children && Array.isArray(node.children)) {\n for (const child of node.children) {\n collectComponentTypes(child, types);\n }\n }\n}\n\n/**\n * Extracts required components and capabilities from a PageDocument.\n * Detects any custom/non-core component types used in the document tree.\n */\nexport function extractTemplateRequirements(\n doc: PageDocument,\n builtinComponents: Set<string> = CORE_BUILTIN_COMPONENTS\n): TemplateRequirements {\n const componentTypes = new Set<string>();\n if (doc?.document) {\n collectComponentTypes(doc.document, componentTypes);\n }\n\n const customComponents: string[] = [];\n for (const type of componentTypes) {\n if (!builtinComponents.has(type)) {\n customComponents.push(type);\n }\n }\n\n return {\n requiredComponents: customComponents.sort(),\n requiredCapabilities: [],\n };\n}\n\n/**\n * Parameters for creating a TemplateRecord\n */\nexport interface CreateTemplateParams {\n id: string;\n name: string;\n description?: string;\n category?: string;\n tags?: string[];\n thumbnail?: TemplateRecord['thumbnail'];\n author?: string;\n version?: string;\n document?: PageDocument;\n packageReference?: TemplateRecord['packageReference'];\n requirements?: TemplateRequirements;\n createdAt?: string;\n updatedAt?: string;\n custom?: Record<string, unknown>;\n}\n\n/**\n * Creates and validates a TemplateRecord.\n * Automatically extracts requirements from the embedded document if requirements are not explicitly supplied.\n */\nexport function createTemplateRecord(params: CreateTemplateParams): TemplateRecord {\n const now = new Date().toISOString();\n\n let requirements = params.requirements;\n if (!requirements && params.document) {\n requirements = extractTemplateRequirements(params.document);\n }\n\n const candidate: TemplateRecord = {\n id: params.id,\n name: params.name,\n description: params.description ?? '',\n category: params.category ?? 'general',\n tags: params.tags ?? [],\n thumbnail: params.thumbnail,\n author: params.author ?? '',\n version: params.version ?? '1.0.0',\n document: params.document,\n packageReference: params.packageReference,\n requirements: requirements ?? { requiredComponents: [], requiredCapabilities: [] },\n createdAt: params.createdAt ?? now,\n updatedAt: params.updatedAt ?? now,\n custom: params.custom,\n };\n\n const validation = validateTemplate(candidate);\n if (!validation.valid || !validation.data) {\n const errorDetails = validation.errors?.map((e) => `${e.path}: ${e.message}`).join(', ');\n throw new Error(`Invalid template record: ${errorDetails}`);\n }\n\n return validation.data;\n}\n\n/**\n * Required metadata parameters for saving a draft as a template.\n * id and name are strictly required and non-empty.\n */\nexport interface SaveTemplateMetadata {\n id: string;\n name: string;\n description?: string;\n category?: string;\n tags?: string[];\n thumbnail?: TemplateRecord['thumbnail'];\n author?: string;\n version?: string;\n custom?: Record<string, unknown>;\n}\n\nexport interface SaveDraftAsTemplateOptions {\n validateDraft?: boolean;\n requirements?: TemplateRequirements;\n}\n\n/**\n * Exports a draft document snapshot as an immutable reusable TemplateRecord.\n * - Requires mandatory metadata (id, name).\n * - Validates draft document structure.\n * - Extracts component/capability requirements.\n * - Creates a deep-cloned immutable snapshot completely decoupled from the active draft.\n */\nexport function saveDraftAsTemplate(\n draft: PageDocument,\n metadata: SaveTemplateMetadata,\n options: SaveDraftAsTemplateOptions = {}\n): TemplateRecord {\n if (!metadata || typeof metadata !== 'object') {\n throw new Error('Save as template requires metadata with id and name.');\n }\n\n const cleanId = metadata.id?.trim();\n if (!cleanId) {\n throw new Error('Template ID is required and cannot be empty.');\n }\n\n const cleanName = metadata.name?.trim();\n if (!cleanName) {\n throw new Error('Template name is required and cannot be empty.');\n }\n\n if (!draft || !draft.document) {\n throw new Error('Invalid draft document: document tree is missing.');\n }\n\n if (options.validateDraft !== false) {\n const validation = validateDocument(draft);\n if (!validation.valid) {\n const errorMsg = validation.errors.map((e) => `${e.path}: ${e.message}`).join('; ');\n throw new Error(`Cannot save invalid draft as template: ${errorMsg}`);\n }\n }\n\n // Deep clone to guarantee the template snapshot is isolated from future draft edits\n const draftSnapshot: PageDocument = deepClone(draft);\n\n return createTemplateRecord({\n id: cleanId,\n name: cleanName,\n description: metadata.description?.trim() ?? '',\n category: metadata.category?.trim() ?? 'general',\n tags: metadata.tags ? [...metadata.tags] : [],\n thumbnail: metadata.thumbnail,\n author: metadata.author?.trim() ?? '',\n version: metadata.version?.trim() ?? '1.0.0',\n document: draftSnapshot,\n requirements: options.requirements,\n custom: metadata.custom ? deepClone(metadata.custom) : undefined,\n });\n}\n\n/**\n * Options for cloning/instantiating a template into a new page document.\n */\nexport interface CloneTemplateOptions {\n /**\n * Title for the newly created page document. Defaults to template name or document title.\n */\n title?: string;\n /**\n * Author for the newly created page document.\n */\n author?: string;\n /**\n * Optional custom ID generator function for node duplication.\n */\n idGenerator?: (oldId: string, node: Node) => string;\n /**\n * Custom ID prefix for freshly generated node IDs. Defaults to random string / timestamp.\n */\n idPrefix?: string;\n /**\n * Whether to record origin template metadata in metadata.custom.originTemplate (defaults to true).\n */\n recordOrigin?: boolean;\n /**\n * Additional custom metadata for the new document.\n */\n customMetadata?: Record<string, unknown>;\n}\n\n/**\n * Recursively clone a node tree, regenerating 100% fresh unique node IDs for every node\n * including root page node and all descendants, while strictly preserving props and styles.\n */\nfunction cloneTreeWithFreshIds(\n root: Node,\n idGen: (oldId: string, node: Node) => string\n): Node {\n function cloneRec(node: Node): Node {\n const newId = idGen(node.id, node);\n const clonedProps = node.props ? deepClone(node.props) : undefined;\n const clonedStyles = node.styles ? deepClone(node.styles) : undefined;\n const clonedChildren = node.children\n ? node.children.map((child) => cloneRec(child))\n : [];\n\n return {\n id: newId,\n type: node.type,\n ...(clonedProps ? { props: clonedProps } : {}),\n ...(clonedStyles ? { styles: clonedStyles } : {}),\n children: clonedChildren,\n };\n }\n\n return cloneRec(root);\n}\n\n/**\n * Clones a template (or existing document) into a brand new PageDocument.\n * - Generates ALL NEW node IDs across the entire tree (root page node and all children).\n * - Ensures 100% ID difference from the source template.\n * - Sets fresh creation/update timestamps.\n * - Preserves origin template version/id in custom metadata.\n * - Guarantees full memory and reference isolation from the template source.\n */\nexport function cloneTemplateAsPage(\n templateOrDoc: TemplateRecord | PageDocument,\n options: CloneTemplateOptions = {}\n): PageDocument {\n let sourceDoc: PageDocument;\n let templateOrigin: { id: string; name: string; version: string } | null = null;\n\n if (isTemplateRecord(templateOrDoc)) {\n if (!templateOrDoc.document) {\n throw new Error(\n `Template \"${templateOrDoc.name}\" (${templateOrDoc.id}) does not contain an inline document snapshot to clone from.`\n );\n }\n sourceDoc = templateOrDoc.document;\n templateOrigin = {\n id: templateOrDoc.id,\n name: templateOrDoc.name,\n version: templateOrDoc.version ?? '1.0.0',\n };\n } else if ('schema' in templateOrDoc && 'document' in templateOrDoc) {\n sourceDoc = templateOrDoc;\n } else {\n throw new Error('Invalid input: expected a TemplateRecord or PageDocument.');\n }\n\n const existingIdsInSource = new Set(collectNodeIds(sourceDoc.document));\n const assignedNewIds = new Set<string>();\n\n // Determine unique seed prefix for this clone instance\n const prefix = options.idPrefix || `page_${Date.now().toString(36)}_${Math.random().toString(36).substring(2, 6)}`;\n let counter = 1;\n\n const defaultIdGen = (oldId: string, node: Node): string => {\n // Generate an ID that is guaranteed never to match oldId or any existing ID in source\n let candidate = `${node.type}_${prefix}_${counter}`;\n while (existingIdsInSource.has(candidate) || assignedNewIds.has(candidate)) {\n counter++;\n candidate = `${node.type}_${prefix}_${counter}`;\n }\n counter++;\n assignedNewIds.add(candidate);\n return candidate;\n };\n\n const idGen = options.idGenerator || defaultIdGen;\n\n const clonedRootNode = cloneTreeWithFreshIds(sourceDoc.document, idGen);\n\n // Guarantee root node type is 'page'\n const rootPageNode: Node & { type: 'page' } = {\n ...clonedRootNode,\n type: 'page',\n };\n\n const now = new Date().toISOString();\n const pageTitle =\n options.title ??\n (templateOrigin ? `${templateOrigin.name}` : sourceDoc.metadata?.title ?? 'Untitled Page');\n\n const customMetadata: Record<string, unknown> = {\n ...(sourceDoc.metadata?.custom ? deepClone(sourceDoc.metadata.custom) : {}),\n ...(options.customMetadata ? deepClone(options.customMetadata) : {}),\n };\n\n if (options.recordOrigin !== false && templateOrigin) {\n customMetadata.originTemplate = templateOrigin;\n }\n\n const newDoc: PageDocument = {\n schema: sourceDoc.schema,\n version: sourceDoc.version,\n metadata: {\n title: pageTitle,\n description: sourceDoc.metadata?.description ?? '',\n author: options.author ?? sourceDoc.metadata?.author ?? '',\n tags: sourceDoc.metadata?.tags ? [...sourceDoc.metadata.tags] : [],\n category: sourceDoc.metadata?.category ?? 'general',\n version: '1.0.0',\n createdAt: now,\n updatedAt: now,\n custom: customMetadata,\n },\n document: rootPageNode,\n };\n\n return newDoc;\n}\n\n/**\n * Helper to verify that two PageDocuments share ZERO overlapping node IDs.\n */\nexport function areNodeIdsCompletelyDistinct(docA: PageDocument, docB: PageDocument): boolean {\n if (!docA?.document || !docB?.document) return true;\n const idsA = new Set(collectNodeIds(docA.document));\n const idsB = collectNodeIds(docB.document);\n\n for (const id of idsB) {\n if (idsA.has(id)) {\n return false;\n }\n }\n return true;\n}\n"],"mappings":"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","names":["FORBIDDEN_KEY_SEGMENTS","traverse","import_schema","import_schema","import_schema","import_schema","import_schema","import_fflate","import_schema","import_schema"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/binding-resolver.ts","../src/variable-catalog.ts","../src/validator.ts","../src/security.ts","../src/document-utils.ts","../src/commands.ts","../src/command-tree-utils.ts","../src/history.ts","../src/migration.ts","../src/exporter.ts","../src/importer.ts","../src/round-trip-comparator.ts","../src/template-utils.ts"],"sourcesContent":["export type * from './interfaces';\nexport * from './binding-resolver';\nexport * from './variable-catalog';\nexport * from './validator';\nexport * from './document-utils';\nexport * from './commands';\nexport * from './command-tree-utils';\nexport * from './history';\nexport * from './migration';\nexport * from './exporter';\nexport * from './importer';\nexport * from './round-trip-comparator';\nexport * from './template-utils';\nexport * from './security';\n\n\n\n","import type { VariableBinding } from '@kubuild/schema';\nimport type { RuntimeContext } from './interfaces';\n\n/**\n * Segments a VariableBinding key must never traverse into, checked before any\n * property access so it can't be bypassed by proxies/getters on the traversed object.\n */\nconst FORBIDDEN_KEY_SEGMENTS = new Set(['__proto__', 'constructor', 'prototype']);\n\nexport type ResolveOutcome =\n | { status: 'resolved'; value: unknown }\n | { status: 'fallback'; value: unknown }\n | { status: 'empty'; value: '' };\n\n// `key`/`fallback` are never passed to eval/Function/any code-execution path in this\n// module — resolution is pure data traversal, never expression evaluation.\nexport function resolveBinding(\n binding: Pick<VariableBinding, 'key' | 'fallback'>,\n context: RuntimeContext | undefined,\n): ResolveOutcome {\n const segments = binding.key.split('.').filter(Boolean);\n let current: unknown = context?.variables;\n\n for (const segment of segments) {\n if (FORBIDDEN_KEY_SEGMENTS.has(segment)) {\n return applyMissingPolicy(binding);\n }\n if (current === null || typeof current !== 'object') {\n return applyMissingPolicy(binding);\n }\n if (!Object.prototype.hasOwnProperty.call(current, segment)) {\n return applyMissingPolicy(binding);\n }\n current = (current as Record<string, unknown>)[segment];\n }\n\n if (current === undefined || typeof current === 'function') {\n return applyMissingPolicy(binding);\n }\n\n return { status: 'resolved', value: current };\n}\n\nfunction applyMissingPolicy(binding: Pick<VariableBinding, 'fallback'>): ResolveOutcome {\n if (binding.fallback !== undefined) {\n return { status: 'fallback', value: binding.fallback };\n }\n return { status: 'empty', value: '' };\n}\n\n/** Convenience wrapper returning just the resolved/fallback/empty value. */\nexport function resolveBindingValue(\n binding: Pick<VariableBinding, 'key' | 'fallback'>,\n context: RuntimeContext | undefined,\n): unknown {\n return resolveBinding(binding, context).value;\n}\n","import type { VariableCatalog } from './interfaces';\n\n/**\n * Segments never traversed/assigned while expanding a catalog key — mirrors the guard\n * in binding-resolver.ts so a host-declared key can't be used to reach the prototype chain.\n */\nconst FORBIDDEN_KEY_SEGMENTS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/**\n * Expands a host `VariableCatalog`'s dotted `sampleValue` keys (e.g. `'site.name'`,\n * `'products'`) into a nested object shaped the same way `resolveBinding` expects\n * `context.variables` to be shaped. Editor/preview-only: the result should be merged\n * into a `RuntimeContext.variables` for canvas preview, never written to a document.\n */\nexport function buildSampleVariablesFromCatalog(catalog?: VariableCatalog): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n if (!catalog) {\n return result;\n }\n\n for (const entry of catalog) {\n const segments = entry.key.split('.').filter(Boolean);\n if (segments.length === 0 || segments.some((segment) => FORBIDDEN_KEY_SEGMENTS.has(segment))) {\n continue;\n }\n\n let cursor: Record<string, unknown> = result;\n for (let i = 0; i < segments.length - 1; i += 1) {\n const segment = segments[i];\n const existing = cursor[segment];\n if (existing === null || typeof existing !== 'object' || Array.isArray(existing)) {\n cursor[segment] = {};\n }\n cursor = cursor[segment] as Record<string, unknown>;\n }\n cursor[segments[segments.length - 1]] = entry.sampleValue;\n }\n\n return result;\n}\n","import {\n PageDocument,\n PageDocumentSchema,\n SCHEMA_NAME,\n} from '@kubuild/schema';\nimport {\n DocumentSecurityLimits,\n validateDocumentSecurity,\n} from './security';\n\nexport type DocumentValidationErrorCode =\n | 'GLOBAL_SCHEMA_INVALID'\n | 'ROOT_NODE_INVALID'\n | 'NODE_SHAPE_INVALID'\n | 'DUPLICATE_NODE_ID'\n | 'TREE_CYCLE_DETECTED'\n | 'UNKNOWN_COMPONENT_TYPE'\n | 'CHILD_POLICY_VIOLATION'\n | 'INVALID_ASSET_REFERENCE'\n | 'INVALID_VARIABLE_BINDING'\n | 'INVALID_ACTION_BINDING'\n | 'INVALID_METADATA'\n | 'PROTOTYPE_POLLUTION_DETECTED'\n | 'SECURITY_LIMIT_EXCEEDED';\n\nexport interface DocumentValidationError {\n code: DocumentValidationErrorCode;\n message: string;\n path: string;\n nodeId?: string;\n details?: Record<string, unknown>;\n}\n\nexport interface ComponentDefinitionLike {\n type: string;\n category?: string;\n capabilities?: string[];\n acceptsChildren?: boolean;\n allowedChildren?: string[];\n disallowedParents?: string[];\n}\n\nexport interface ComponentRegistryLike {\n get(type: string): ComponentDefinitionLike | undefined;\n has(type: string): boolean;\n}\n\nexport interface ValidationOptions {\n componentRegistry?: ComponentRegistryLike;\n knownComponentTypes?: string[] | Set<string>;\n strictComponentTypes?: boolean;\n checkAssetReferences?: boolean;\n checkVariableBindings?: boolean;\n checkActionBindings?: boolean;\n securityLimits?: DocumentSecurityLimits;\n}\n\nexport interface DocumentValidationResult {\n valid: boolean;\n success: boolean;\n errors: DocumentValidationError[];\n data?: PageDocument;\n}\n\n/**\n * Validate a page document against global schema, node shape, child policy,\n * ID uniqueness, cycles, unknown component types, and structural bindings.\n */\nexport function validateDocument(\n input: unknown,\n options: ValidationOptions = {},\n): DocumentValidationResult {\n const errors: DocumentValidationError[] = [];\n\n // 1. Basic Object check\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n return {\n valid: false,\n success: false,\n errors: [\n {\n code: 'GLOBAL_SCHEMA_INVALID',\n message: 'Document must be a valid non-null object',\n path: '',\n },\n ],\n };\n }\n\n const doc = input as Record<string, unknown>;\n\n // 1.5 Security Limits & Prototype Pollution Check\n const securityCheck = validateDocumentSecurity(doc, options.securityLimits);\n if (!securityCheck.safe) {\n for (const secErr of securityCheck.errors) {\n errors.push({\n code: secErr.code === 'PROTOTYPE_POLLUTION_DETECTED'\n ? 'PROTOTYPE_POLLUTION_DETECTED'\n : 'SECURITY_LIMIT_EXCEEDED',\n message: secErr.message,\n path: secErr.path || '',\n details: secErr.details,\n });\n }\n if (securityCheck.errors.some((e) => e.code === 'PROTOTYPE_POLLUTION_DETECTED')) {\n return {\n valid: false,\n success: false,\n errors,\n };\n }\n }\n\n // 2. Global Schema / Version / Document field checks\n if (doc.schema !== SCHEMA_NAME) {\n errors.push({\n code: 'GLOBAL_SCHEMA_INVALID',\n message: `Invalid schema identifier. Expected \"${SCHEMA_NAME}\", received \"${String(doc.schema)}\"`,\n path: '/schema',\n });\n }\n\n if (typeof doc.version !== 'string' || doc.version.trim().length === 0) {\n errors.push({\n code: 'GLOBAL_SCHEMA_INVALID',\n message: 'Schema version must be a non-empty string',\n path: '/version',\n });\n }\n\n if (!doc.document || typeof doc.document !== 'object' || Array.isArray(doc.document)) {\n errors.push({\n code: 'GLOBAL_SCHEMA_INVALID',\n message: 'Document must contain a root document node object',\n path: '/document',\n });\n return {\n valid: false,\n success: false,\n errors,\n };\n }\n\n const rootNode = doc.document as Record<string, unknown>;\n\n // 3. Root Node Type check (must be 'page')\n if (rootNode.type !== 'page') {\n errors.push({\n code: 'ROOT_NODE_INVALID',\n message: `Root node type must be \"page\", received \"${String(rootNode.type)}\"`,\n path: '/document/type',\n nodeId: typeof rootNode.id === 'string' ? rootNode.id : undefined,\n });\n }\n\n // 4. Metadata check\n if (doc.metadata !== undefined) {\n if (typeof doc.metadata !== 'object' || doc.metadata === null || Array.isArray(doc.metadata)) {\n errors.push({\n code: 'INVALID_METADATA',\n message: 'Document metadata must be an object',\n path: '/metadata',\n });\n } else {\n const meta = doc.metadata as Record<string, unknown>;\n if (meta.title !== undefined && (typeof meta.title !== 'string' || meta.title.trim().length === 0)) {\n errors.push({\n code: 'INVALID_METADATA',\n message: 'Metadata title must be a non-empty string when provided',\n path: '/metadata/title',\n });\n }\n }\n }\n\n // 5. Deep Recursive Node Tree Validation (Cycle, ID Uniqueness, Node Shape, Registry, Bindings)\n const seenIds = new Map<string, string>(); // nodeId -> path\n const visitedObjects = new Set<object>();\n\n validateNodeRecursive(\n rootNode,\n '/document',\n undefined,\n seenIds,\n visitedObjects,\n options,\n errors,\n );\n\n // 6. Schema Zod safe parse fallback to capture any missed structural issues\n if (errors.length === 0) {\n const zodResult = PageDocumentSchema.safeParse(input);\n if (!zodResult.success) {\n for (const issue of zodResult.error.issues) {\n const jsonPath = '/' + issue.path.join('/');\n errors.push({\n code: 'GLOBAL_SCHEMA_INVALID',\n message: issue.message,\n path: jsonPath === '/' ? '' : jsonPath,\n });\n }\n } else {\n return {\n valid: true,\n success: true,\n errors: [],\n data: zodResult.data as unknown as PageDocument,\n };\n }\n }\n\n return {\n valid: errors.length === 0,\n success: errors.length === 0,\n errors,\n };\n}\n\nfunction validateNodeRecursive(\n nodeObj: Record<string, unknown>,\n currentPath: string,\n parentNode: { id: string; type: string } | undefined,\n seenIds: Map<string, string>,\n visitedObjects: Set<object>,\n options: ValidationOptions,\n errors: DocumentValidationError[],\n): void {\n // Cycle Detection\n if (visitedObjects.has(nodeObj)) {\n errors.push({\n code: 'TREE_CYCLE_DETECTED',\n message: `Cyclic reference detected at node path ${currentPath}`,\n path: currentPath,\n nodeId: typeof nodeObj.id === 'string' ? nodeObj.id : undefined,\n });\n return;\n }\n visitedObjects.add(nodeObj);\n\n // Validate Node ID\n const nodeId = nodeObj.id;\n if (typeof nodeId !== 'string' || nodeId.trim().length === 0) {\n errors.push({\n code: 'NODE_SHAPE_INVALID',\n message: 'Node id must be a non-empty string',\n path: `${currentPath}/id`,\n });\n } else {\n if (seenIds.has(nodeId)) {\n errors.push({\n code: 'DUPLICATE_NODE_ID',\n message: `Duplicate node ID \"${nodeId}\" found at ${currentPath} (first seen at ${seenIds.get(nodeId)})`,\n path: `${currentPath}/id`,\n nodeId,\n details: { firstSeenAt: seenIds.get(nodeId) },\n });\n } else {\n seenIds.set(nodeId, currentPath);\n }\n }\n\n // Validate Node Type\n const nodeType = nodeObj.type;\n if (typeof nodeType !== 'string' || nodeType.trim().length === 0) {\n errors.push({\n code: 'NODE_SHAPE_INVALID',\n message: 'Node type must be a non-empty string',\n path: `${currentPath}/type`,\n nodeId: typeof nodeId === 'string' ? nodeId : undefined,\n });\n }\n\n const effectiveNodeId = typeof nodeId === 'string' ? nodeId : undefined;\n const effectiveNodeType = typeof nodeType === 'string' ? nodeType : '';\n\n // Validate against Component Registry or known types\n let componentDef: ComponentDefinitionLike | undefined;\n if (effectiveNodeType) {\n if (options.componentRegistry) {\n componentDef = options.componentRegistry.get(effectiveNodeType);\n if (!componentDef && (options.strictComponentTypes || !options.componentRegistry.has(effectiveNodeType))) {\n errors.push({\n code: 'UNKNOWN_COMPONENT_TYPE',\n message: `Unknown component type: \"${effectiveNodeType}\"`,\n path: `${currentPath}/type`,\n nodeId: effectiveNodeId,\n });\n }\n } else if (options.knownComponentTypes) {\n const isKnown = Array.isArray(options.knownComponentTypes)\n ? options.knownComponentTypes.includes(effectiveNodeType)\n : options.knownComponentTypes.has(effectiveNodeType);\n\n if (!isKnown && options.strictComponentTypes) {\n errors.push({\n code: 'UNKNOWN_COMPONENT_TYPE',\n message: `Unknown component type: \"${effectiveNodeType}\"`,\n path: `${currentPath}/type`,\n nodeId: effectiveNodeId,\n });\n }\n }\n }\n\n // Validate Child Policy\n const children = nodeObj.children;\n if (children !== undefined) {\n if (!Array.isArray(children)) {\n errors.push({\n code: 'NODE_SHAPE_INVALID',\n message: 'Node children must be an array',\n path: `${currentPath}/children`,\n nodeId: effectiveNodeId,\n });\n } else {\n if (componentDef && componentDef.acceptsChildren === false && children.length > 0) {\n errors.push({\n code: 'CHILD_POLICY_VIOLATION',\n message: `Component \"${effectiveNodeType}\" does not accept children, but found ${children.length} child node(s)`,\n path: `${currentPath}/children`,\n nodeId: effectiveNodeId,\n });\n }\n\n if (parentNode && componentDef?.disallowedParents?.includes(parentNode.type)) {\n errors.push({\n code: 'CHILD_POLICY_VIOLATION',\n message: `Component \"${effectiveNodeType}\" cannot be a child of \"${parentNode.type}\"`,\n path: currentPath,\n nodeId: effectiveNodeId,\n });\n }\n\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n const childPath = `${currentPath}/children/${i}`;\n\n if (!child || typeof child !== 'object' || Array.isArray(child)) {\n errors.push({\n code: 'NODE_SHAPE_INVALID',\n message: `Child at index ${i} must be a valid node object`,\n path: childPath,\n nodeId: effectiveNodeId,\n });\n continue;\n }\n\n const childRecord = child as Record<string, unknown>;\n const childType = typeof childRecord.type === 'string' ? childRecord.type : '';\n const childIsKnown = !options.componentRegistry || options.componentRegistry.has(childType);\n const childCategory = options.componentRegistry?.get(childType)?.category;\n\n if (\n componentDef?.allowedChildren &&\n childType &&\n childIsKnown &&\n !componentDef.allowedChildren.includes(childType) &&\n !componentDef.allowedChildren.includes('*') &&\n !(childCategory && componentDef.allowedChildren.includes(childCategory))\n ) {\n errors.push({\n code: 'CHILD_POLICY_VIOLATION',\n message: `Component type \"${childType}\" is not allowed as a child of \"${effectiveNodeType}\". Allowed types: ${componentDef.allowedChildren.join(', ')}`,\n path: `${childPath}/type`,\n nodeId: typeof childRecord.id === 'string' ? childRecord.id : undefined,\n });\n }\n\n validateNodeRecursive(\n childRecord,\n childPath,\n { id: effectiveNodeId || '', type: effectiveNodeType },\n seenIds,\n visitedObjects,\n options,\n errors,\n );\n }\n }\n }\n\n // Validate Props and structural bindings (Assets, Variables, Actions)\n if (nodeObj.props !== undefined) {\n if (typeof nodeObj.props !== 'object' || nodeObj.props === null || Array.isArray(nodeObj.props)) {\n errors.push({\n code: 'NODE_SHAPE_INVALID',\n message: 'Node props must be an object',\n path: `${currentPath}/props`,\n nodeId: effectiveNodeId,\n });\n } else {\n validatePropsBindings(\n nodeObj.props as Record<string, unknown>,\n `${currentPath}/props`,\n effectiveNodeId,\n options,\n errors,\n );\n }\n }\n\n // Validate Styles\n if (nodeObj.styles !== undefined) {\n if (typeof nodeObj.styles !== 'object' || nodeObj.styles === null || Array.isArray(nodeObj.styles)) {\n errors.push({\n code: 'NODE_SHAPE_INVALID',\n message: 'Node styles must be an object',\n path: `${currentPath}/styles`,\n nodeId: effectiveNodeId,\n });\n }\n }\n}\n\n/**\n * Recursively inspect props object for structural bindings (asset, variable, action)\n */\nfunction validatePropsBindings(\n propsObj: Record<string, unknown>,\n propsPath: string,\n nodeId: string | undefined,\n options: ValidationOptions,\n errors: DocumentValidationError[],\n): void {\n for (const [key, value] of Object.entries(propsObj)) {\n const currentPath = `${propsPath}/${key}`;\n\n if (!value || typeof value !== 'object') {\n continue;\n }\n\n if (Array.isArray(value)) {\n value.forEach((item, index) => {\n if (item && typeof item === 'object' && !Array.isArray(item)) {\n validatePropsBindings(\n item as Record<string, unknown>,\n `${currentPath}/${index}`,\n nodeId,\n options,\n errors,\n );\n }\n });\n continue;\n }\n\n const record = value as Record<string, unknown>;\n\n // Check if it's an Asset Reference\n if (record.type === 'asset') {\n if (typeof record.assetId !== 'string' || record.assetId.trim().length === 0) {\n errors.push({\n code: 'INVALID_ASSET_REFERENCE',\n message: 'Asset reference must have a non-empty \"assetId\"',\n path: `${currentPath}/assetId`,\n nodeId,\n });\n }\n if (record.fallbackUrl !== undefined && typeof record.fallbackUrl !== 'string') {\n errors.push({\n code: 'INVALID_ASSET_REFERENCE',\n message: 'Asset fallbackUrl must be a string if provided',\n path: `${currentPath}/fallbackUrl`,\n nodeId,\n });\n }\n }\n // Check if it's a Variable Binding\n else if (record.type === 'variable') {\n if (typeof record.key !== 'string' || record.key.trim().length === 0) {\n errors.push({\n code: 'INVALID_VARIABLE_BINDING',\n message: 'Variable binding must have a non-empty \"key\"',\n path: `${currentPath}/key`,\n nodeId,\n });\n }\n }\n // Check if it's an Action Binding (either key is 'action' or has explicit action shape)\n else if (key === 'action' || (typeof record.type === 'string' && record.payload !== undefined)) {\n if (typeof record.type !== 'string' || record.type.trim().length === 0) {\n errors.push({\n code: 'INVALID_ACTION_BINDING',\n message: 'Action binding must have a non-empty \"type\"',\n path: `${currentPath}/type`,\n nodeId,\n });\n }\n } else {\n // Recurse into nested objects\n validatePropsBindings(record, currentPath, nodeId, options, errors);\n }\n }\n}\n","/**\n * Security Limits and Sanitization Utilities for KUBUILD documents, assets, and actions.\n */\n\nexport interface DocumentSecurityLimits {\n /**\n * Maximum allowed total nodes in the document tree (default: 5000).\n */\n maxNodeCount?: number;\n\n /**\n * Maximum allowed nesting depth of nodes (default: 32).\n */\n maxTreeDepth?: number;\n\n /**\n * Maximum number of direct properties per node (default: 200).\n */\n maxPropsCount?: number;\n\n /**\n * Maximum character length for any individual string property (default: 100,000).\n */\n maxStringLength?: number;\n\n /**\n * Maximum number of direct children per node (default: 1000).\n */\n maxChildrenPerNode?: number;\n\n /**\n * Maximum allowed JSON serialized size in bytes (default: 10MB).\n */\n maxDocumentSizeBytes?: number;\n\n /**\n * Allowed URL schemes for links and media.\n * Default: ['http:', 'https:', 'mailto:', 'tel:', '#', 'relative', 'data:image/']\n */\n allowedUrlSchemes?: string[];\n\n /**\n * Prohibited property keys to defend against Prototype Pollution.\n * Default: ['__proto__', 'constructor', 'prototype', '__defineGetter__', '__defineSetter__', '__lookupGetter__', '__lookupSetter__']\n */\n prohibitedPropertyKeys?: string[];\n\n /**\n * Prohibited asset file extensions to prevent executable uploads.\n * Default: ['.exe', '.dll', '.so', '.sh', '.bat', '.cmd', '.js', '.mjs', '.cjs', '.php', '.py', '.vbs', '.wasm', '.bin', '.com', '.scr', '.pif']\n */\n prohibitedAssetExtensions?: string[];\n\n /**\n * Maximum compression expansion ratio before flagging potential zip bomb (default: 100).\n */\n maxZipExpansionRatio?: number;\n}\n\nexport const DEFAULT_DOCUMENT_SECURITY_LIMITS: Required<DocumentSecurityLimits> = {\n maxNodeCount: 5000,\n maxTreeDepth: 32,\n maxPropsCount: 200,\n maxStringLength: 100_000,\n maxChildrenPerNode: 1000,\n maxDocumentSizeBytes: 10 * 1024 * 1024, // 10 MB\n allowedUrlSchemes: ['http:', 'https:', 'mailto:', 'tel:', '#', 'relative', 'data:image/'],\n prohibitedPropertyKeys: [\n '__proto__',\n 'constructor',\n 'prototype',\n '__defineGetter__',\n '__defineSetter__',\n '__lookupGetter__',\n '__lookupSetter__',\n ],\n prohibitedAssetExtensions: [\n '.exe',\n '.dll',\n '.so',\n '.sh',\n '.bat',\n '.cmd',\n '.js',\n '.mjs',\n '.cjs',\n '.php',\n '.py',\n '.vbs',\n '.wasm',\n '.bin',\n '.com',\n '.scr',\n '.pif',\n '.hta',\n '.jar',\n ],\n maxZipExpansionRatio: 100,\n};\n\nexport interface SecurityViolation {\n code:\n | 'PROTOTYPE_POLLUTION_DETECTED'\n | 'MAX_NODE_COUNT_EXCEEDED'\n | 'MAX_TREE_DEPTH_EXCEEDED'\n | 'MAX_PROPS_COUNT_EXCEEDED'\n | 'MAX_STRING_LENGTH_EXCEEDED'\n | 'MAX_CHILDREN_COUNT_EXCEEDED'\n | 'MAX_DOCUMENT_SIZE_EXCEEDED'\n | 'UNSAFE_URL_DETECTED'\n | 'EXECUTABLE_ASSET_DETECTED'\n | 'ZIP_BOMB_DETECTED';\n message: string;\n path?: string;\n details?: Record<string, unknown>;\n}\n\n/**\n * Checks whether a URL is safe according to the allowed URL schemes.\n * Rejects dangerous schemes such as javascript:, vbscript:, data:text/html, etc.\n */\nexport function isSafeUrl(\n url: unknown,\n options?: {\n allowedSchemes?: string[];\n allowDataImage?: boolean;\n /** Allow `blob:` URLs (runtime-only, e.g. in-memory uploaded media previews). */\n allowBlobMedia?: boolean;\n }\n): boolean {\n if (typeof url !== 'string') return false;\n\n const trimmed = url.trim();\n if (trimmed.length === 0) return true;\n\n // Relative URLs & fragments are safe\n if (\n trimmed.startsWith('/') ||\n trimmed.startsWith('#') ||\n trimmed.startsWith('./') ||\n trimmed.startsWith('../') ||\n trimmed.startsWith('?')\n ) {\n return true;\n }\n\n // Check for control characters or null bytes\n if (/[\\u0000-\\u001F\\u007F-\\u009F]/.test(trimmed)) {\n return false;\n }\n\n // Extract scheme\n const colonIndex = trimmed.indexOf(':');\n if (colonIndex === -1) {\n // Relative path or plain fragment without scheme\n return true;\n }\n\n const scheme = trimmed.substring(0, colonIndex + 1).toLowerCase();\n\n // Explicitly block dangerous protocols\n const dangerousSchemes = ['javascript:', 'vbscript:', 'file:', 'data:'];\n if (scheme !== 'data:' && dangerousSchemes.includes(scheme)) {\n // `blob:` URLs are runtime-only references to in-memory media (e.g. files\n // uploaded in the current editor session). They never originate from\n // imported documents, so they are safe to allow for media previews.\n if (scheme === 'blob:' && options?.allowBlobMedia) {\n return true;\n }\n return false;\n }\n\n // Handle data: scheme\n if (scheme === 'data:') {\n const allowDataImage = options?.allowDataImage ?? true;\n if (!allowDataImage) return false;\n\n // Only allow safe data:image/ mime types\n const dataPrefix = trimmed.substring(0, 30).toLowerCase();\n const safeDataImagePrefixes = [\n 'data:image/png',\n 'data:image/jpeg',\n 'data:image/jpg',\n 'data:image/webp',\n 'data:image/gif',\n 'data:image/avif',\n 'data:image/svg+xml',\n ];\n return safeDataImagePrefixes.some((p) => dataPrefix.startsWith(p));\n }\n\n // Verify against allowed schemes list\n const allowed = options?.allowedSchemes || DEFAULT_DOCUMENT_SECURITY_LIMITS.allowedUrlSchemes;\n return allowed.some((s) => s.toLowerCase() === scheme);\n}\n\n/**\n * Sanitizes a URL, returning a safe URL or a fallback (default empty string or '#').\n */\nexport function sanitizeUrl(\n url: unknown,\n fallback: string = '',\n options?: Parameters<typeof isSafeUrl>[1]\n): string {\n if (typeof url !== 'string') return fallback;\n return isSafeUrl(url, options) ? url : fallback;\n}\n\n/**\n * Checks an object recursively for prohibited prototype pollution keys.\n */\nexport function containsProhibitedKeys(\n obj: unknown,\n prohibitedKeys: string[] = DEFAULT_DOCUMENT_SECURITY_LIMITS.prohibitedPropertyKeys\n): { found: boolean; path: string; key: string } {\n const prohibitedSet = new Set(prohibitedKeys.map((k) => k.toLowerCase()));\n const visited = new WeakSet<object>();\n\n function check(value: unknown, currentPath: string): { found: boolean; path: string; key: string } {\n if (!value || typeof value !== 'object') {\n return { found: false, path: '', key: '' };\n }\n\n if (visited.has(value)) {\n return { found: false, path: '', key: '' };\n }\n visited.add(value);\n\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const res = check(value[i], `${currentPath}[${i}]`);\n if (res.found) return res;\n }\n return { found: false, path: '', key: '' };\n }\n\n const record = value as Record<string, unknown>;\n const keysToCheck = Array.from(new Set([...Object.keys(record), ...Object.getOwnPropertyNames(record)]));\n\n for (const key of keysToCheck) {\n if (prohibitedSet.has(key.toLowerCase())) {\n return { found: true, path: currentPath ? `${currentPath}.${key}` : key, key };\n }\n const res = check(record[key], currentPath ? `${currentPath}.${key}` : key);\n if (res.found) return res;\n }\n\n // Check if __proto__ was injected and altered standard prototype\n if (Object.prototype.hasOwnProperty.call(record, '__proto__')) {\n return { found: true, path: currentPath ? `${currentPath}.__proto__` : '__proto__', key: '__proto__' };\n }\n\n return { found: false, path: '', key: '' };\n }\n\n return check(obj, '');\n}\n\n/**\n * Validates a document against security limits (node count, tree depth, props count, string length, prototype pollution).\n */\nexport function validateDocumentSecurity(\n doc: unknown,\n customLimits?: DocumentSecurityLimits\n): { safe: boolean; errors: SecurityViolation[] } {\n const limits = { ...DEFAULT_DOCUMENT_SECURITY_LIMITS, ...customLimits };\n const errors: SecurityViolation[] = [];\n\n if (!doc || typeof doc !== 'object') {\n return { safe: true, errors: [] };\n }\n\n // 1. Prototype Pollution Check\n const protoCheck = containsProhibitedKeys(doc, limits.prohibitedPropertyKeys);\n if (protoCheck.found) {\n errors.push({\n code: 'PROTOTYPE_POLLUTION_DETECTED',\n message: `Prohibited property key \"${protoCheck.key}\" detected at path \"${protoCheck.path}\" (Prototype Pollution Defense).`,\n path: protoCheck.path,\n details: { key: protoCheck.key },\n });\n }\n\n // 2. Document Serialized Size Check\n try {\n const jsonStr = JSON.stringify(doc);\n if (jsonStr.length > limits.maxDocumentSizeBytes) {\n errors.push({\n code: 'MAX_DOCUMENT_SIZE_EXCEEDED',\n message: `Document size (${jsonStr.length} bytes) exceeds limit of ${limits.maxDocumentSizeBytes} bytes.`,\n details: { size: jsonStr.length, limit: limits.maxDocumentSizeBytes },\n });\n }\n } catch {\n // Ignore JSON stringify errors\n }\n\n // 3. Tree Depth & Node Count Checks\n const docObj = doc as Record<string, unknown>;\n const rootNode = docObj.document;\n\n if (rootNode && typeof rootNode === 'object') {\n let totalNodes = 0;\n\n function traverse(node: unknown, depth: number, currentPath: string): void {\n if (!node || typeof node !== 'object' || Array.isArray(node)) return;\n\n totalNodes++;\n if (totalNodes > limits.maxNodeCount) {\n errors.push({\n code: 'MAX_NODE_COUNT_EXCEEDED',\n message: `Total document nodes (${totalNodes}) exceeded security limit of ${limits.maxNodeCount}.`,\n path: currentPath,\n details: { nodeCount: totalNodes, limit: limits.maxNodeCount },\n });\n return;\n }\n\n if (depth > limits.maxTreeDepth) {\n errors.push({\n code: 'MAX_TREE_DEPTH_EXCEEDED',\n message: `Document nesting depth (${depth}) exceeded security limit of ${limits.maxTreeDepth}.`,\n path: currentPath,\n details: { depth, limit: limits.maxTreeDepth },\n });\n return;\n }\n\n const nodeRecord = node as Record<string, unknown>;\n\n // Check Props Limits\n if (nodeRecord.props && typeof nodeRecord.props === 'object' && !Array.isArray(nodeRecord.props)) {\n const propsRecord = nodeRecord.props as Record<string, unknown>;\n const propKeys = Object.keys(propsRecord);\n\n if (propKeys.length > limits.maxPropsCount) {\n errors.push({\n code: 'MAX_PROPS_COUNT_EXCEEDED',\n message: `Node has ${propKeys.length} props, exceeding limit of ${limits.maxPropsCount}.`,\n path: `${currentPath}/props`,\n details: { count: propKeys.length, limit: limits.maxPropsCount },\n });\n }\n\n for (const [k, val] of Object.entries(propsRecord)) {\n if (typeof val === 'string' && val.length > limits.maxStringLength) {\n errors.push({\n code: 'MAX_STRING_LENGTH_EXCEEDED',\n message: `Prop \"${k}\" string length (${val.length}) exceeds limit of ${limits.maxStringLength}.`,\n path: `${currentPath}/props/${k}`,\n details: { length: val.length, limit: limits.maxStringLength },\n });\n }\n }\n }\n\n // Check Children Limits\n if (nodeRecord.children && Array.isArray(nodeRecord.children)) {\n if (nodeRecord.children.length > limits.maxChildrenPerNode) {\n errors.push({\n code: 'MAX_CHILDREN_COUNT_EXCEEDED',\n message: `Node has ${nodeRecord.children.length} direct children, exceeding limit of ${limits.maxChildrenPerNode}.`,\n path: `${currentPath}/children`,\n details: { count: nodeRecord.children.length, limit: limits.maxChildrenPerNode },\n });\n }\n\n for (let i = 0; i < nodeRecord.children.length; i++) {\n traverse(nodeRecord.children[i], depth + 1, `${currentPath}/children/${i}`);\n }\n }\n }\n\n traverse(rootNode, 1, '/document');\n }\n\n return {\n safe: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Checks if an asset filename has a dangerous or executable extension.\n */\nexport function isDangerousAssetFilename(\n filename: string,\n prohibitedExtensions: string[] = DEFAULT_DOCUMENT_SECURITY_LIMITS.prohibitedAssetExtensions\n): boolean {\n if (!filename || typeof filename !== 'string') return true;\n\n const lower = filename.toLowerCase().trim();\n\n // Check double extensions like \"malicious.exe.png\" or \"script.php.jpg\"\n return prohibitedExtensions.some((ext) => {\n const extLower = ext.toLowerCase();\n return lower.endsWith(extLower) || lower.includes(`${extLower}.`);\n });\n}\n\n/**\n * Checks whether an archive expansion ratio indicates a zip bomb attack.\n */\nexport function checkZipBomb(\n compressedSize: number,\n uncompressedSize: number,\n maxRatio: number = DEFAULT_DOCUMENT_SECURITY_LIMITS.maxZipExpansionRatio\n): boolean {\n if (compressedSize <= 0) return false;\n // Only enforce ratio for archives whose uncompressed payload is non-trivial (>10MB)\n if (uncompressedSize > 10 * 1024 * 1024) {\n const ratio = uncompressedSize / compressedSize;\n return ratio > maxRatio;\n }\n return false;\n}\n\n/**\n * Sanitizes an HTML string by stripping unsafe tags (<script>, <object>, <embed>, <applet>, <base>, <link rel=\"import\">),\n * removing inline event handlers (on* attributes like onclick, onerror, onload, etc.),\n * and disarming javascript:/vbscript:/data:text/html URLs in attributes.\n */\nexport function sanitizeHtml(rawHtml: unknown): string {\n if (typeof rawHtml !== 'string') return '';\n let html = rawHtml;\n\n // 1. Remove script tags and their content\n html = html.replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, '');\n\n // 2. Remove object, embed, applet, base, and link tags\n html = html.replace(/<\\/?(object|embed|applet|base|link)\\b[^>]*>/gi, '');\n\n // 3. Remove on* event handler attributes (e.g. onload=, onclick=, onerror=, onfocus=)\n html = html.replace(/\\s+on[a-z0-9_-]+\\s*=\\s*(?:'[^']*'|\"[^\"]*\"|[^\\s>]+)/gi, '');\n\n // 4. Disarm javascript:, vbscript:, and data:text/html protocol attributes in href/src/data/action\n html = html.replace(\n /\\b(href|src|data|action)\\s*=\\s*(['\"])\\s*(?:javascript:|vbscript:|data:text\\/html)[^'\"]*\\2/gi,\n '$1=\"#\"'\n );\n html = html.replace(\n /\\b(href|src|data|action)\\s*=\\s*(?:javascript:|vbscript:|data:text\\/html)[^\\s>]+/gi,\n '$1=\"#\"'\n );\n\n return html;\n}\n\n","import { PageDocument, Node, SCHEMA_NAME } from '@kubuild/schema';\nimport type { ComponentRegistryLike } from './validator';\n\nexport { validateDocument } from './validator';\nexport type {\n DocumentValidationResult,\n DocumentValidationError,\n DocumentValidationErrorCode,\n ValidationOptions,\n ComponentDefinitionLike,\n ComponentRegistryLike,\n} from './validator';\n\n\nexport function createBlankDocument(title = 'Untitled Page'): PageDocument {\n return {\n schema: SCHEMA_NAME,\n version: '1.0.0',\n metadata: {\n title,\n description: '',\n author: '',\n tags: [],\n category: 'general',\n version: '1.0.0',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n },\n document: {\n id: 'root-page',\n type: 'page',\n props: { title },\n styles: { base: { minHeight: '100vh', backgroundColor: '#ffffff' } },\n children: [] as Node[],\n },\n };\n}\n\nexport function findNodeById(rootNode: Node, targetId: string): Node | null {\n if (rootNode.id === targetId) return rootNode;\n if (!rootNode.children) return null;\n for (const child of rootNode.children) {\n const found = findNodeById(child, targetId);\n if (found) return found;\n }\n return null;\n}\n\nexport interface CollectedAssetReference {\n assetId: string;\n reference: {\n type: 'asset';\n assetId: string;\n filename?: string;\n mimeType?: string;\n fallbackUrl?: string;\n };\n nodeId: string;\n propPath: string;\n}\n\n/**\n * Collect all AssetReference objects throughout a document tree.\n */\nexport function collectAssetReferences(rootNode: Node): CollectedAssetReference[] {\n const results: CollectedAssetReference[] = [];\n\n function traverseProps(propsObj: unknown, currentPath: string, nodeId: string): void {\n if (!propsObj || typeof propsObj !== 'object') return;\n\n if (Array.isArray(propsObj)) {\n propsObj.forEach((item, index) => {\n traverseProps(item, `${currentPath}/${index}`, nodeId);\n });\n return;\n }\n\n const record = propsObj as Record<string, unknown>;\n\n if (record.type === 'asset' && typeof record.assetId === 'string' && record.assetId.trim().length > 0) {\n results.push({\n assetId: record.assetId,\n reference: {\n type: 'asset',\n assetId: record.assetId,\n filename: typeof record.filename === 'string' ? record.filename : undefined,\n mimeType: typeof record.mimeType === 'string' ? record.mimeType : undefined,\n fallbackUrl: typeof record.fallbackUrl === 'string' ? record.fallbackUrl : undefined,\n },\n nodeId,\n propPath: currentPath,\n });\n }\n\n for (const [key, val] of Object.entries(record)) {\n if (val && typeof val === 'object') {\n traverseProps(val, `${currentPath}/${key}`, nodeId);\n }\n }\n }\n\n function traverseNode(node: Node): void {\n if (node.props) {\n traverseProps(node.props, `/document/${node.id}/props`, node.id);\n }\n if (node.children && Array.isArray(node.children)) {\n for (const child of node.children) {\n traverseNode(child);\n }\n }\n }\n\n traverseNode(rootNode);\n return results;\n}\n\nexport interface TreeRequirements {\n requiredComponents: string[];\n requiredCapabilities: string[];\n}\n\n/**\n * Extracts custom component types and capabilities required by a node tree.\n */\nexport function extractRequirementsFromTree(\n rootNode: Node,\n registry?: ComponentRegistryLike,\n): TreeRequirements {\n const requiredComponents = new Set<string>();\n const requiredCapabilities = new Set<string>();\n\n function traverse(node: Node): void {\n if (registry) {\n const def = registry.get(node.type);\n if (def?.category === 'custom') {\n requiredComponents.add(node.type);\n }\n if (def?.capabilities && Array.isArray(def.capabilities)) {\n for (const cap of def.capabilities) {\n requiredCapabilities.add(cap);\n }\n }\n }\n\n if (node.children && Array.isArray(node.children)) {\n for (const child of node.children) {\n traverse(child);\n }\n }\n }\n\n traverse(rootNode);\n\n return {\n requiredComponents: Array.from(requiredComponents).sort(),\n requiredCapabilities: Array.from(requiredCapabilities).sort(),\n };\n}\n\n/**\n * Remap asset references in a node tree based on an ID mapping dictionary.\n * Mutates the node props in place and returns the number of references updated.\n */\nexport function remapAssetReferences(\n rootNode: Node,\n idMap: Record<string, string> | Map<string, string>,\n): number {\n let remappedCount = 0;\n const getMappedId = (id: string): string | undefined => {\n if (idMap instanceof Map) return idMap.get(id);\n return idMap[id];\n };\n\n function traverseProps(propsObj: unknown): void {\n if (!propsObj || typeof propsObj !== 'object') return;\n\n if (Array.isArray(propsObj)) {\n for (const item of propsObj) {\n traverseProps(item);\n }\n return;\n }\n\n const record = propsObj as Record<string, unknown>;\n\n if (record.type === 'asset' && typeof record.assetId === 'string') {\n const newId = getMappedId(record.assetId);\n if (newId !== undefined && newId !== record.assetId) {\n record.assetId = newId;\n remappedCount++;\n }\n }\n\n for (const val of Object.values(record)) {\n if (val && typeof val === 'object') {\n traverseProps(val);\n }\n }\n }\n\n function traverseNode(node: Node): void {\n if (node.props) {\n traverseProps(node.props);\n }\n if (node.children && Array.isArray(node.children)) {\n for (const child of node.children) {\n traverseNode(child);\n }\n }\n }\n\n traverseNode(rootNode);\n return remappedCount;\n}\n\n/**\n * Remaps all asset references throughout a PageDocument.\n */\nexport function remapDocumentAssetReferences(\n doc: PageDocument,\n idMap: Record<string, string> | Map<string, string>,\n): PageDocument {\n if (doc && doc.document) {\n remapAssetReferences(doc.document, idMap);\n }\n return doc;\n}\n\nexport interface MissingComponentNodeInfo {\n nodeId: string;\n componentType: string;\n props: Record<string, unknown>;\n node: Node;\n}\n\n/**\n * Finds all nodes in a node tree that reference component types not registered in the host.\n * This is useful in placeholder mode to inspect missing nodes and their preserved props.\n */\nexport function findMissingComponentNodes(\n rootNode: Node,\n registry?: ComponentRegistryLike,\n knownTypes?: string[] | Set<string>,\n): MissingComponentNodeInfo[] {\n const missing: MissingComponentNodeInfo[] = [];\n const knownSet = new Set<string>();\n\n if (knownTypes) {\n for (const t of knownTypes) knownSet.add(t);\n }\n\n const standardBuiltIns = [\n 'page',\n 'section',\n 'container',\n 'columns',\n 'heading',\n 'text',\n 'image',\n 'button',\n 'collection',\n ];\n for (const b of standardBuiltIns) knownSet.add(b);\n\n function checkNode(node: Node): void {\n let isSupported = knownSet.has(node.type);\n if (!isSupported && registry) {\n isSupported = registry.has(node.type);\n }\n\n if (!isSupported) {\n missing.push({\n nodeId: node.id,\n componentType: node.type,\n props: node.props ? { ...node.props } : {},\n node,\n });\n }\n\n if (node.children && Array.isArray(node.children)) {\n for (const child of node.children) {\n checkNode(child);\n }\n }\n }\n\n checkNode(rootNode);\n return missing;\n}\n\n\n","import {\n PageDocument,\n Node,\n ResponsiveStyles,\n StyleDefinition,\n StyleDefinitionSchema,\n ResponsiveStylesSchema,\n AnimationConfig,\n AnimationConfigSchema,\n} from '@kubuild/schema';\nimport {\n deepClone,\n findNodeLocation,\n isDescendantOf,\n collectNodeIdSet,\n cloneTreeWithNewIds,\n} from './command-tree-utils';\n\nexport type DocumentChangeType =\n | 'NODE_INSERTED'\n | 'NODE_MOVED'\n | 'PROPS_UPDATED'\n | 'STYLE_UPDATED'\n | 'ANIMATION_UPDATED'\n | 'NODE_REMOVED'\n | 'NODE_DUPLICATED';\n\nexport interface DocumentChangeEvent {\n type: DocumentChangeType;\n timestamp: string;\n nodeId: string;\n parentId?: string;\n previousParentId?: string;\n index?: number;\n previousIndex?: number;\n payload?: Record<string, unknown>;\n}\n\nexport interface CommandResult {\n document: PageDocument;\n event: DocumentChangeEvent;\n}\n\nexport interface InsertNodeParams {\n parentId: string;\n node: Node;\n index?: number;\n}\n\nexport interface MoveNodeParams {\n nodeId: string;\n targetParentId: string;\n index?: number;\n}\n\nexport interface UpdatePropsParams {\n nodeId: string;\n props: Record<string, unknown>;\n /**\n * If true (default), shallow merges new props with existing props.\n * If false, replaces the entire props object.\n */\n merge?: boolean;\n}\n\nexport interface UpdateStyleParams {\n nodeId: string;\n styles: ResponsiveStyles | StyleDefinition;\n /**\n * Target breakpoint to update directly, or if omitted, applies to whole ResponsiveStyles structure.\n */\n breakpoint?: 'base' | 'desktop' | 'tablet' | 'mobile';\n /**\n * Target pseudo-state layer (e.g. ':hover', ':active', ':focus') — STORA-221.\n * When set, `styles` is written to `node.styles.states[state]` instead of a\n * breakpoint layer, leaving default (breakpoint) values untouched.\n */\n state?: string;\n /**\n * If true (default), shallow merges style definitions at target breakpoint.\n * If false, replaces the style definition object.\n */\n merge?: boolean;\n}\n\nexport interface RemoveNodeParams {\n nodeId: string;\n}\n\nexport interface DuplicateNodeParams {\n nodeId: string;\n targetParentId?: string;\n index?: number;\n idGenerator?: (oldId: string) => string;\n}\n\n/**\n * 1. Insert a node into a target parent node.\n * Returns a new PageDocument and a NODE_INSERTED event.\n */\nexport function insertNode(\n document: PageDocument,\n params: InsertNodeParams,\n): CommandResult {\n const { parentId, node, index } = params;\n\n if (!node || typeof node !== 'object' || !node.id || !node.type) {\n throw new Error('Invalid node: Node must be an object with non-empty \"id\" and \"type\"');\n }\n\n const newDoc = deepClone(document);\n const existingIds = collectNodeIdSet(newDoc.document);\n\n // Check duplicate ID\n const incomingIds = collectNodeIdSet(node);\n for (const incId of incomingIds) {\n if (existingIds.has(incId)) {\n throw new Error(`Cannot insert node: Duplicate node ID \"${incId}\" already exists in document.`);\n }\n }\n\n const parentLoc = findNodeLocation(newDoc.document, parentId);\n if (!parentLoc) {\n throw new Error(`Cannot insert node: Target parent node with ID \"${parentId}\" not found.`);\n }\n\n const parentNode = parentLoc.node;\n if (!parentNode.children) {\n parentNode.children = [];\n }\n\n const insertIndex =\n typeof index === 'number' && index >= 0 && index <= parentNode.children.length\n ? index\n : parentNode.children.length;\n\n parentNode.children.splice(insertIndex, 0, deepClone(node));\n\n return {\n document: newDoc,\n event: {\n type: 'NODE_INSERTED',\n timestamp: new Date().toISOString(),\n nodeId: node.id,\n parentId,\n index: insertIndex,\n payload: {\n nodeType: node.type,\n },\n },\n };\n}\n\n/**\n * 2. Move a node from its current location to a new parent location.\n * Prevents moving the root node or moving a node into its own descendant tree.\n * Returns a new PageDocument and a NODE_MOVED event.\n */\nexport function moveNode(\n document: PageDocument,\n params: MoveNodeParams,\n): CommandResult {\n const { nodeId, targetParentId, index } = params;\n\n if (nodeId === document.document.id) {\n throw new Error('Cannot move the root page node.');\n }\n\n const newDoc = deepClone(document);\n\n const sourceLoc = findNodeLocation(newDoc.document, nodeId);\n if (!sourceLoc || !sourceLoc.parent) {\n throw new Error(`Cannot move node: Node with ID \"${nodeId}\" not found in document.`);\n }\n\n const targetLoc = findNodeLocation(newDoc.document, targetParentId);\n if (!targetLoc) {\n throw new Error(`Cannot move node: Target parent with ID \"${targetParentId}\" not found in document.`);\n }\n\n // Descendant cycle check: Cannot move node into itself or any of its descendants\n if (isDescendantOf(sourceLoc.node, targetParentId)) {\n throw new Error(\n `Cannot move node: Target parent \"${targetParentId}\" is the node itself or a descendant of node \"${nodeId}\".`,\n );\n }\n\n const previousParentId = sourceLoc.parent.id;\n const previousIndex = sourceLoc.index;\n\n // Remove node from source parent\n const [removedNode] = sourceLoc.parent.children!.splice(previousIndex, 1);\n\n // Target parent might be the same parent or different parent\n const targetParent = targetLoc.node;\n if (!targetParent.children) {\n targetParent.children = [];\n }\n\n let targetIndex =\n typeof index === 'number' && index >= 0 && index <= targetParent.children.length\n ? index\n : targetParent.children.length;\n\n targetParent.children.splice(targetIndex, 0, removedNode);\n\n return {\n document: newDoc,\n event: {\n type: 'NODE_MOVED',\n timestamp: new Date().toISOString(),\n nodeId,\n parentId: targetParentId,\n previousParentId,\n index: targetIndex,\n previousIndex,\n },\n };\n}\n\n/**\n * 3. Update the props of an existing node.\n * Returns a new PageDocument and a PROPS_UPDATED event.\n */\nexport function updateProps(\n document: PageDocument,\n params: UpdatePropsParams,\n): CommandResult {\n const { nodeId, props, merge = true } = params;\n\n if (!props || typeof props !== 'object' || Array.isArray(props)) {\n throw new Error('Props must be an object.');\n }\n\n const newDoc = deepClone(document);\n const loc = findNodeLocation(newDoc.document, nodeId);\n if (!loc) {\n throw new Error(`Cannot update props: Node with ID \"${nodeId}\" not found in document.`);\n }\n\n const targetNode = loc.node;\n const previousProps = targetNode.props ? deepClone(targetNode.props) : {};\n\n if (merge) {\n targetNode.props = {\n ...previousProps,\n ...deepClone(props),\n };\n } else {\n targetNode.props = deepClone(props);\n }\n\n return {\n document: newDoc,\n event: {\n type: 'PROPS_UPDATED',\n timestamp: new Date().toISOString(),\n nodeId,\n parentId: loc.parent ? loc.parent.id : undefined,\n payload: {\n props: targetNode.props,\n previousProps,\n },\n },\n };\n}\n\n/**\n * 4. Update the responsive styles of an existing node.\n * Supports updating a specific breakpoint ('base', 'desktop', etc.) or the whole ResponsiveStyles object.\n * Returns a new PageDocument and a STYLE_UPDATED event.\n */\nexport function updateStyle(\n document: PageDocument,\n params: UpdateStyleParams,\n): CommandResult {\n const { nodeId, styles, breakpoint, state, merge = true } = params;\n\n if (!styles || typeof styles !== 'object' || Array.isArray(styles)) {\n throw new Error('Styles must be an object.');\n }\n\n const newDoc = deepClone(document);\n const loc = findNodeLocation(newDoc.document, nodeId);\n if (!loc) {\n throw new Error(`Cannot update style: Node with ID \"${nodeId}\" not found in document.`);\n }\n\n const targetNode = loc.node;\n const currentStyles: ResponsiveStyles = targetNode.styles ? deepClone(targetNode.styles) : {};\n const previousStyles = deepClone(currentStyles);\n\n if (state) {\n // Pseudo-state layer update (STORA-221): writes into styles.states[state]\n // without touching default breakpoint values. Parsed through\n // StyleDefinitionSchema so unsafe values are rejected here too.\n const newBreakpointStyles = StyleDefinitionSchema.parse(styles);\n const states = { ...(currentStyles.states ?? {}) };\n const currentStateStyles = states[state] ?? {};\n\n if (merge) {\n states[state] = { ...currentStateStyles, ...deepClone(newBreakpointStyles) };\n } else {\n states[state] = deepClone(newBreakpointStyles);\n }\n\n targetNode.styles = { ...currentStyles, states } as ResponsiveStyles;\n\n return {\n document: newDoc,\n event: {\n type: 'STYLE_UPDATED',\n timestamp: new Date().toISOString(),\n nodeId,\n parentId: loc.parent ? loc.parent.id : undefined,\n payload: {\n styles: targetNode.styles,\n previousStyles,\n state,\n },\n },\n };\n }\n\n if (breakpoint) {\n // Updating a single breakpoint style definition. Parsed through\n // StyleDefinitionSchema so unsafe/non-serializable values (STORA-023)\n // are rejected here too, not just at document-parse time.\n const currentBreakpointStyles = (currentStyles[breakpoint] as StyleDefinition) || {};\n const newBreakpointStyles = StyleDefinitionSchema.parse(styles);\n\n if (merge) {\n currentStyles[breakpoint] = {\n ...currentBreakpointStyles,\n ...deepClone(newBreakpointStyles),\n };\n } else {\n currentStyles[breakpoint] = deepClone(newBreakpointStyles);\n }\n } else {\n // Updating responsive styles container\n const responsiveStylesInput = ResponsiveStylesSchema.parse(styles);\n if (merge) {\n for (const bp of ['base', 'desktop', 'tablet', 'mobile'] as const) {\n if (responsiveStylesInput[bp] !== undefined) {\n const currentBp = (currentStyles[bp] as StyleDefinition) || {};\n const incomingBp = (responsiveStylesInput[bp] as StyleDefinition) || {};\n currentStyles[bp] = {\n ...currentBp,\n ...deepClone(incomingBp),\n };\n }\n }\n } else {\n targetNode.styles = deepClone(responsiveStylesInput);\n return {\n document: newDoc,\n event: {\n type: 'STYLE_UPDATED',\n timestamp: new Date().toISOString(),\n nodeId,\n parentId: loc.parent ? loc.parent.id : undefined,\n payload: {\n styles: targetNode.styles,\n previousStyles,\n },\n },\n };\n }\n }\n\n targetNode.styles = currentStyles;\n\n return {\n document: newDoc,\n event: {\n type: 'STYLE_UPDATED',\n timestamp: new Date().toISOString(),\n nodeId,\n parentId: loc.parent ? loc.parent.id : undefined,\n payload: {\n styles: currentStyles,\n previousStyles,\n breakpoint,\n },\n },\n };\n}\n\n/**\n * 5. Remove a node from the document tree.\n * Prevents removing the root page node.\n * Returns a new PageDocument and a NODE_REMOVED event.\n */\nexport function removeNode(\n document: PageDocument,\n params: RemoveNodeParams,\n): CommandResult {\n const { nodeId } = params;\n\n if (nodeId === document.document.id) {\n throw new Error('Cannot remove the root page node.');\n }\n\n const newDoc = deepClone(document);\n const loc = findNodeLocation(newDoc.document, nodeId);\n if (!loc || !loc.parent) {\n throw new Error(`Cannot remove node: Node with ID \"${nodeId}\" not found in document.`);\n }\n\n const parentId = loc.parent.id;\n const index = loc.index;\n\n const [removedNode] = loc.parent.children!.splice(index, 1);\n\n return {\n document: newDoc,\n event: {\n type: 'NODE_REMOVED',\n timestamp: new Date().toISOString(),\n nodeId,\n parentId,\n index,\n payload: {\n node: removedNode,\n },\n },\n };\n}\n\n/**\n * 6. Duplicate a node and its entire subtree.\n * Generates fresh unique IDs for all cloned nodes in the subtree, preserves props/styles,\n * and inserts the duplicate right after the original node (or at specified targetParentId/index).\n * Returns a new PageDocument and a NODE_DUPLICATED event.\n */\nexport function duplicateNode(\n document: PageDocument,\n params: DuplicateNodeParams,\n): CommandResult {\n const { nodeId, targetParentId, index, idGenerator } = params;\n\n if (nodeId === document.document.id) {\n throw new Error('Cannot duplicate the root page node.');\n }\n\n const newDoc = deepClone(document);\n const loc = findNodeLocation(newDoc.document, nodeId);\n if (!loc || !loc.parent) {\n throw new Error(`Cannot duplicate node: Node with ID \"${nodeId}\" not found in document.`);\n }\n\n const existingIds = collectNodeIdSet(newDoc.document);\n const { clonedNode, idMap } = cloneTreeWithNewIds(loc.node, idGenerator, existingIds);\n\n const destinationParentId = targetParentId || loc.parent.id;\n const destParentLoc = findNodeLocation(newDoc.document, destinationParentId);\n if (!destParentLoc) {\n throw new Error(`Cannot duplicate node: Destination parent \"${destinationParentId}\" not found.`);\n }\n\n const destParent = destParentLoc.node;\n if (!destParent.children) {\n destParent.children = [];\n }\n\n // Default insertion position is right after the source node if in same parent, else appended\n let insertIndex: number;\n if (typeof index === 'number' && index >= 0 && index <= destParent.children.length) {\n insertIndex = index;\n } else if (destinationParentId === loc.parent.id) {\n insertIndex = loc.index + 1;\n } else {\n insertIndex = destParent.children.length;\n }\n\n destParent.children.splice(insertIndex, 0, clonedNode);\n\n return {\n document: newDoc,\n event: {\n type: 'NODE_DUPLICATED',\n timestamp: new Date().toISOString(),\n nodeId: clonedNode.id,\n parentId: destinationParentId,\n index: insertIndex,\n payload: {\n originalNodeId: nodeId,\n idMap: Object.fromEntries(idMap.entries()),\n },\n },\n };\n}\n\nexport interface UpdateAnimationParams {\n nodeId: string;\n animation: Partial<AnimationConfig> | null;\n /**\n * If true (default), shallow merges new animation properties with existing animation config.\n * If false, replaces the animation config with the provided object.\n * If animation is null, removes the animation configuration from the node.\n */\n merge?: boolean;\n}\n\n/**\n * 7. Update the animation configuration of an existing node.\n * Returns a new PageDocument and an ANIMATION_UPDATED event.\n */\nexport function updateAnimation(\n document: PageDocument,\n params: UpdateAnimationParams,\n): CommandResult {\n const { nodeId, animation, merge = true } = params;\n\n const newDoc = deepClone(document);\n const loc = findNodeLocation(newDoc.document, nodeId);\n if (!loc) {\n throw new Error(`Cannot update animation: Node with ID \"${nodeId}\" not found in document.`);\n }\n\n const targetNode = loc.node;\n const previousAnimation = targetNode.animation ? deepClone(targetNode.animation) : undefined;\n\n if (animation === null) {\n delete targetNode.animation;\n } else {\n const currentAnimation = targetNode.animation ? deepClone(targetNode.animation) : {};\n const candidate = merge\n ? { ...currentAnimation, ...deepClone(animation) }\n : deepClone(animation);\n targetNode.animation = AnimationConfigSchema.parse(candidate);\n }\n\n return {\n document: newDoc,\n event: {\n type: 'ANIMATION_UPDATED',\n timestamp: new Date().toISOString(),\n nodeId,\n parentId: loc.parent ? loc.parent.id : undefined,\n payload: {\n animation: targetNode.animation,\n previousAnimation,\n },\n },\n };\n}\n\n","import { Node, collectNodeIds } from '@kubuild/schema';\n\n/**\n * Deep clone an object immutably (JSON-safe).\n */\nexport function deepClone<T>(val: T): T {\n return JSON.parse(JSON.stringify(val));\n}\n\nexport interface NodeLocation {\n node: Node;\n parent: Node | null;\n index: number;\n}\n\n/**\n * Find a node, its parent, and index within the parent's children array.\n */\nexport function findNodeLocation(root: Node, targetId: string): NodeLocation | null {\n if (root.id === targetId) {\n return {\n node: root,\n parent: null,\n index: -1,\n };\n }\n\n return searchNodeLocationRecursive(root, targetId);\n}\n\nfunction searchNodeLocationRecursive(currentParent: Node, targetId: string): NodeLocation | null {\n if (!currentParent.children || currentParent.children.length === 0) {\n return null;\n }\n\n for (let i = 0; i < currentParent.children.length; i++) {\n const child = currentParent.children[i];\n if (child.id === targetId) {\n return {\n node: child,\n parent: currentParent,\n index: i,\n };\n }\n\n const foundInSubtree = searchNodeLocationRecursive(child, targetId);\n if (foundInSubtree) {\n return foundInSubtree;\n }\n }\n\n return null;\n}\n\nexport type NavigationDirection = 'parent' | 'child' | 'previous-sibling' | 'next-sibling';\n\n/**\n * Resolve the node id reached by moving from `nodeId` in a tree-navigation direction.\n * Returns null when there is nowhere to go (e.g. root has no parent, a leaf has no child,\n * or the node sits at the start/end of its sibling list).\n */\nexport function getNavigationTarget(\n root: Node,\n nodeId: string,\n direction: NavigationDirection,\n): string | null {\n const location = findNodeLocation(root, nodeId);\n if (!location) return null;\n\n switch (direction) {\n case 'parent':\n return location.parent?.id ?? null;\n case 'child':\n return location.node.children?.[0]?.id ?? null;\n case 'previous-sibling': {\n if (!location.parent) return null;\n return (location.parent.children ?? [])[location.index - 1]?.id ?? null;\n }\n case 'next-sibling': {\n if (!location.parent) return null;\n return (location.parent.children ?? [])[location.index + 1]?.id ?? null;\n }\n }\n}\n\n/**\n * Returns the chain of ancestor node ids from the root down to (but excluding)\n * `targetId`, root first. Returns [] if targetId is the root or is not found.\n */\nexport function getAncestorChain(root: Node, targetId: string): string[] {\n if (root.id === targetId) return [];\n\n function walk(node: Node, acc: string[]): string[] | null {\n if (!node.children) return null;\n for (const child of node.children) {\n if (child.id === targetId) return acc;\n const found = walk(child, [...acc, child.id]);\n if (found) return found;\n }\n return null;\n }\n\n return walk(root, [root.id]) ?? [];\n}\n\n/**\n * STORA-232: Find the direct parent node of `targetId` in a single O(N) traversal.\n * Returns null when the target is the root or is not found in the tree.\n */\nexport function getParentNodeId(root: Node, targetId: string): string | null {\n if (root.id === targetId) return null;\n\n const stack: Node[] = [root];\n while (stack.length > 0) {\n const current = stack.pop()!;\n const children = current.children;\n if (!children) continue;\n for (const child of children) {\n if (child.id === targetId) return current.id;\n stack.push(child);\n }\n }\n return null;\n}\n\n/**\n * STORA-232: Return the full ancestor path of `targetId` as an array of nodes,\n * ordered from the root down to (and including) the target node itself.\n * Single O(N) traversal: the path is tracked during descent, so no re-walks.\n * Returns [] when the target is not found.\n */\nexport function getNodeAncestors(root: Node, targetId: string): Node[] {\n const path: Node[] = [];\n\n function walk(node: Node): boolean {\n path.push(node);\n if (node.id === targetId) return true;\n if (node.children) {\n for (const child of node.children) {\n if (walk(child)) return true;\n }\n }\n path.pop();\n return false;\n }\n\n return walk(root) ? path : [];\n}\n\n/**\n * Check whether `targetId` is a descendant of `ancestorNode` (or equal to ancestorNode.id).\n */\nexport function isDescendantOf(ancestorNode: Node, targetId: string): boolean {\n if (ancestorNode.id === targetId) {\n return true;\n }\n\n if (!ancestorNode.children || ancestorNode.children.length === 0) {\n return false;\n }\n\n for (const child of ancestorNode.children) {\n if (isDescendantOf(child, targetId)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Collect all node IDs present in a node subtree as a Set.\n */\nexport function collectNodeIdSet(root: Node): Set<string> {\n return new Set(collectNodeIds(root));\n}\n\n/**\n * Default unique ID generator function for node duplication.\n */\nexport function defaultIdGenerator(oldId: string, existingIds?: Set<string>): string {\n // Strip existing suffix like _copy or _copy_1 if exists\n const baseName = oldId.replace(/_copy(_\\d+)?$/, '');\n let candidate = `${baseName}_copy`;\n let counter = 1;\n\n if (existingIds) {\n while (existingIds.has(candidate)) {\n candidate = `${baseName}_copy_${counter}`;\n counter++;\n }\n existingIds.add(candidate);\n }\n\n return candidate;\n}\n\nexport interface ClonedSubtreeResult {\n clonedNode: Node;\n idMap: Map<string, string>; // oldId -> newId\n}\n\n/**\n * Recursively clone a node and its entire subtree, generating fresh unique IDs\n * for every node while preserving types, props, and responsive styles.\n */\nexport function cloneTreeWithNewIds(\n root: Node,\n idGenerator?: (oldId: string) => string,\n existingIds?: Set<string>,\n): ClonedSubtreeResult {\n const idMap = new Map<string, string>();\n const idGen = idGenerator || ((oldId: string) => defaultIdGenerator(oldId, existingIds));\n\n function cloneRecursive(node: Node): Node {\n const newId = idGen(node.id);\n idMap.set(node.id, newId);\n\n const clonedProps = node.props ? deepClone(node.props) : undefined;\n const clonedStyles = node.styles ? deepClone(node.styles) : undefined;\n const clonedChildren = node.children\n ? node.children.map((child) => cloneRecursive(child))\n : [];\n\n return {\n id: newId,\n type: node.type,\n ...(clonedProps ? { props: clonedProps } : {}),\n ...(clonedStyles ? { styles: clonedStyles } : {}),\n children: clonedChildren,\n };\n }\n\n const clonedNode = cloneRecursive(root);\n return { clonedNode, idMap };\n}\n","import { PageDocument } from '@kubuild/schema';\nimport { DocumentChangeEvent, CommandResult } from './commands';\nimport { deepClone } from './command-tree-utils';\n\nexport interface HistoryOptions {\n /**\n * Maximum number of historical states stored in the undo stack.\n * Defaults to 50.\n */\n maxHistory?: number;\n}\n\nexport interface HistoryEntry<T> {\n state: T;\n event?: DocumentChangeEvent;\n timestamp: string;\n}\n\nexport interface HistoryState<T> {\n canUndo: boolean;\n canRedo: boolean;\n undoCount: number;\n redoCount: number;\n present: T;\n}\n\nexport const DEFAULT_MAX_HISTORY = 50;\n\n/**\n * Generic History Engine for immutable state transitions.\n * Maintains undo/redo stacks, enforces maximum history limit,\n * clears redo stack on new actions, and supports resetting state.\n */\nexport class HistoryEngine<T = PageDocument> {\n private past: HistoryEntry<T>[] = [];\n private current: HistoryEntry<T>;\n private future: HistoryEntry<T>[] = [];\n private readonly maxHistory: number;\n\n constructor(initialState: T, options: HistoryOptions = {}) {\n if (initialState === undefined || initialState === null) {\n throw new Error('Initial state must be defined.');\n }\n\n const limit = options.maxHistory ?? DEFAULT_MAX_HISTORY;\n if (typeof limit !== 'number' || limit <= 0 || !Number.isFinite(limit)) {\n throw new Error('maxHistory option must be a positive integer.');\n }\n\n this.maxHistory = Math.floor(limit);\n this.current = {\n state: deepClone(initialState),\n timestamp: new Date().toISOString(),\n };\n }\n\n /**\n * Get the current active state (returns an immutable clone).\n */\n get present(): T {\n return deepClone(this.current.state);\n }\n\n /**\n * Check if undo is available.\n */\n canUndo(): boolean {\n return this.past.length > 0;\n }\n\n /**\n * Check if redo is available.\n */\n canRedo(): boolean {\n return this.future.length > 0;\n }\n\n /**\n * Get total number of states in undo stack.\n */\n get undoCount(): number {\n return this.past.length;\n }\n\n /**\n * Get total number of states in redo stack.\n */\n get redoCount(): number {\n return this.future.length;\n }\n\n /**\n * Get max history limit.\n */\n get limit(): number {\n return this.maxHistory;\n }\n\n /**\n * Push a new state.\n * Clears the redo stack and shifts oldest past entries if maxHistory is exceeded.\n */\n push(nextState: T, event?: DocumentChangeEvent): void {\n if (nextState === undefined || nextState === null) {\n throw new Error('Cannot push undefined or null state into history.');\n }\n\n // Save current to past\n this.past.push(this.current);\n\n // Enforce maxHistory limit on undo stack\n while (this.past.length > this.maxHistory) {\n this.past.shift();\n }\n\n // Set new current\n this.current = {\n state: deepClone(nextState),\n event,\n timestamp: new Date().toISOString(),\n };\n\n // Any new action clears redo future stack\n this.future = [];\n }\n\n /**\n * Undo to the previous state.\n * Returns the restored state, or undefined if undo is not possible.\n */\n undo(): T | undefined {\n if (!this.canUndo()) {\n return undefined;\n }\n\n const previousEntry = this.past.pop()!;\n this.future.unshift(this.current);\n this.current = previousEntry;\n\n return this.present;\n }\n\n /**\n * Redo to the next state in future stack.\n * Returns the restored state, or undefined if redo is not possible.\n */\n redo(): T | undefined {\n if (!this.canRedo()) {\n return undefined;\n }\n\n const nextEntry = this.future.shift()!;\n this.past.push(this.current);\n this.current = nextEntry;\n\n return this.present;\n }\n\n /**\n * Reset the history engine with a new initial state.\n * Clears both undo and redo stacks (e.g. when loading a new document).\n */\n reset(newState: T): void {\n if (newState === undefined || newState === null) {\n throw new Error('New state must be defined when resetting history.');\n }\n\n this.past = [];\n this.future = [];\n this.current = {\n state: deepClone(newState),\n timestamp: new Date().toISOString(),\n };\n }\n\n /**\n * Clear both past and future stacks without changing the current state.\n */\n clear(): void {\n this.past = [];\n this.future = [];\n }\n\n /**\n * Get a snapshot of current history status.\n */\n getState(): HistoryState<T> {\n return {\n canUndo: this.canUndo(),\n canRedo: this.canRedo(),\n undoCount: this.undoCount,\n redoCount: this.redoCount,\n present: this.present,\n };\n }\n}\n\n/**\n * Document History Manager for PageDocument.\n * Connects HistoryEngine with core command execution.\n */\nexport class DocumentHistoryManager {\n private history: HistoryEngine<PageDocument>;\n\n constructor(initialDocument: PageDocument, options?: HistoryOptions) {\n this.history = new HistoryEngine<PageDocument>(initialDocument, options);\n }\n\n get document(): PageDocument {\n return this.history.present;\n }\n\n get canUndo(): boolean {\n return this.history.canUndo();\n }\n\n get canRedo(): boolean {\n return this.history.canRedo();\n }\n\n /**\n * Execute a mutation command immutably and record the resulting state and change event in history.\n */\n execute(executor: (currentDoc: PageDocument) => CommandResult): CommandResult {\n const currentDoc = this.history.present;\n const result = executor(currentDoc);\n this.history.push(result.document, result.event);\n return result;\n }\n\n undo(): PageDocument | undefined {\n return this.history.undo();\n }\n\n redo(): PageDocument | undefined {\n return this.history.redo();\n }\n\n reset(newDocument: PageDocument): void {\n this.history.reset(newDocument);\n }\n\n clear(): void {\n this.history.clear();\n }\n\n getState(): HistoryState<PageDocument> {\n return this.history.getState();\n }\n}\n","import {\n PageDocument,\n PageDocumentSchema,\n CURRENT_SCHEMA_VERSION,\n SCHEMA_NAME,\n ResponsiveStyles,\n} from '@kubuild/schema';\nimport { deepClone } from './command-tree-utils';\nimport { validateDocument } from './validator';\n\nexport type MigrationErrorCode =\n | 'NO_MIGRATION_PATH'\n | 'UNSUPPORTED_SCHEMA_VERSION'\n | 'INVALID_SOURCE_DOCUMENT'\n | 'MIGRATION_EXECUTION_FAILED';\n\nexport interface MigrationError {\n code: MigrationErrorCode;\n message: string;\n sourceVersion: string;\n targetVersion: string;\n details?: Record<string, unknown>;\n}\n\nexport interface MigrationDiagnostic {\n success: boolean;\n sourceVersion: string;\n targetVersion: string;\n migrationPath: string[];\n stepsApplied: number;\n dryRun: boolean;\n errors?: MigrationError[];\n}\n\nexport interface MigrationResult {\n success: boolean;\n document?: PageDocument;\n diagnostic: MigrationDiagnostic;\n}\n\nexport interface MigrateOptions {\n /**\n * Target schema version (defaults to CURRENT_SCHEMA_VERSION = \"1.0.0\").\n */\n targetVersion?: string;\n /**\n * If true, validates path and simulates migration without modifying production data.\n */\n dryRun?: boolean;\n /**\n * Custom migration registry (defaults to defaultMigrationRegistry).\n */\n registry?: MigrationRegistry;\n /**\n * Validate document with schema validator after migration (default: true).\n */\n validate?: boolean;\n}\n\nexport type MigrationFunction = (rawDoc: Record<string, unknown>) => Record<string, unknown>;\n\nexport interface MigrationStep {\n fromVersion: string;\n toVersion: string;\n migrate: MigrationFunction;\n description?: string;\n}\n\n/**\n * Migration Registry to manage version transition steps.\n */\nexport class MigrationRegistry {\n private steps: Map<string, MigrationStep> = new Map();\n\n /**\n * Register a migration step from one version to another.\n */\n register(step: MigrationStep): void {\n const key = this.getKey(step.fromVersion, step.toVersion);\n this.steps.set(key, step);\n }\n\n private getKey(fromVersion: string, toVersion: string): string {\n return `${fromVersion}->${toVersion}`;\n }\n\n /**\n * Find shortest path of versions to migrate from source to target using BFS.\n */\n findPath(sourceVersion: string, targetVersion: string): string[] | null {\n if (sourceVersion === targetVersion) {\n return [sourceVersion];\n }\n\n const queue: { version: string; path: string[] }[] = [\n { version: sourceVersion, path: [sourceVersion] },\n ];\n const visited = new Set<string>([sourceVersion]);\n\n while (queue.length > 0) {\n const { version: currentVersion, path } = queue.shift()!;\n\n for (const step of this.steps.values()) {\n if (step.fromVersion === currentVersion) {\n const nextVersion = step.toVersion;\n if (nextVersion === targetVersion) {\n return [...path, nextVersion];\n }\n\n if (!visited.has(nextVersion)) {\n visited.add(nextVersion);\n queue.push({ version: nextVersion, path: [...path, nextVersion] });\n }\n }\n }\n }\n\n return null;\n }\n\n /**\n * Check if a valid migration path exists between source and target versions.\n */\n hasPath(sourceVersion: string, targetVersion: string): boolean {\n return this.findPath(sourceVersion, targetVersion) !== null;\n }\n\n /**\n * Get the migration step handler for a direct version step.\n */\n getStep(fromVersion: string, toVersion: string): MigrationStep | undefined {\n return this.steps.get(this.getKey(fromVersion, toVersion));\n }\n}\n\n/**\n * Helper to recursively migrate legacy flat styles: { color: 'red' } to responsive: { base: { color: 'red' } }\n */\nfunction convertNodeStylesToResponsive(node: Record<string, unknown>): void {\n if (node.styles && typeof node.styles === 'object' && !Array.isArray(node.styles)) {\n const styles = node.styles as Record<string, unknown>;\n const hasBreakpointKeys = 'base' in styles || 'desktop' in styles || 'tablet' in styles || 'mobile' in styles;\n if (!hasBreakpointKeys) {\n node.styles = {\n base: { ...styles },\n } as ResponsiveStyles;\n }\n }\n\n if (Array.isArray(node.children)) {\n for (const child of node.children) {\n if (child && typeof child === 'object') {\n convertNodeStylesToResponsive(child as Record<string, unknown>);\n }\n }\n }\n}\n\n// Built-in Default Registry\nexport const defaultMigrationRegistry = new MigrationRegistry();\n\n// 1. Migration from 0.1.0 -> 1.0.0 (Alpha to v1)\ndefaultMigrationRegistry.register({\n fromVersion: '0.1.0',\n toVersion: '1.0.0',\n description: 'Migrate alpha 0.1.0 schema (root node key, flat styles) to v1.0.0',\n migrate: (rawDoc: Record<string, unknown>) => {\n const migrated = deepClone(rawDoc);\n migrated.schema = SCHEMA_NAME;\n migrated.version = '1.0.0';\n\n // Migrate root node key: legacy used 'root' instead of 'document'\n if (migrated.root && !migrated.document) {\n migrated.document = migrated.root;\n delete migrated.root;\n }\n\n // Default metadata\n if (!migrated.metadata || typeof migrated.metadata !== 'object') {\n migrated.metadata = {\n title: 'Migrated Page',\n description: '',\n author: '',\n tags: [],\n category: 'general',\n version: '1.0.0',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n } else {\n const meta = migrated.metadata as Record<string, unknown>;\n meta.title = meta.title || 'Migrated Page';\n meta.tags = Array.isArray(meta.tags) ? meta.tags : [];\n meta.version = '1.0.0';\n }\n\n // Migrate node tree flat styles\n if (migrated.document && typeof migrated.document === 'object') {\n convertNodeStylesToResponsive(migrated.document as Record<string, unknown>);\n }\n\n return migrated;\n },\n});\n\n// 2. Migration from 0.2.0 -> 1.0.0\ndefaultMigrationRegistry.register({\n fromVersion: '0.2.0',\n toVersion: '1.0.0',\n description: 'Migrate 0.2.0 schema to v1.0.0',\n migrate: (rawDoc: Record<string, unknown>) => {\n const migrated = deepClone(rawDoc);\n migrated.schema = SCHEMA_NAME;\n migrated.version = '1.0.0';\n\n if (migrated.document && typeof migrated.document === 'object') {\n convertNodeStylesToResponsive(migrated.document as Record<string, unknown>);\n }\n\n return migrated;\n },\n});\n\n// 3. Migration from 0.9.0 -> 1.0.0 (Beta to v1)\ndefaultMigrationRegistry.register({\n fromVersion: '0.9.0',\n toVersion: '1.0.0',\n description: 'Migrate 0.9.0 beta schema to v1.0.0',\n migrate: (rawDoc: Record<string, unknown>) => {\n const migrated = deepClone(rawDoc);\n migrated.schema = SCHEMA_NAME;\n migrated.version = '1.0.0';\n\n if (!migrated.metadata || typeof migrated.metadata !== 'object') {\n migrated.metadata = {\n title: 'Migrated Page',\n description: '',\n author: '',\n tags: [],\n category: 'general',\n version: '1.0.0',\n };\n }\n\n return migrated;\n },\n});\n\n// 4. Shorthand \"1.0\" -> \"1.0.0\"\ndefaultMigrationRegistry.register({\n fromVersion: '1.0',\n toVersion: '1.0.0',\n description: 'Normalize 1.0 version string to 1.0.0',\n migrate: (rawDoc: Record<string, unknown>) => {\n const migrated = deepClone(rawDoc);\n migrated.version = '1.0.0';\n return migrated;\n },\n});\n\n/**\n * Check whether a migration path exists between source and target versions.\n */\nexport function canMigrate(\n sourceVersion: string,\n targetVersion: string = CURRENT_SCHEMA_VERSION,\n registry: MigrationRegistry = defaultMigrationRegistry,\n): boolean {\n if (!sourceVersion || !targetVersion) return false;\n if (sourceVersion === targetVersion) return true;\n return registry.hasPath(sourceVersion, targetVersion);\n}\n\n/**\n * Get the sequence of versions forming the migration path.\n */\nexport function getMigrationPath(\n sourceVersion: string,\n targetVersion: string = CURRENT_SCHEMA_VERSION,\n registry: MigrationRegistry = defaultMigrationRegistry,\n): string[] | null {\n if (!sourceVersion || !targetVersion) return null;\n return registry.findPath(sourceVersion, targetVersion);\n}\n\n/**\n * Migrate a page document from an older schema version to current (or specified) schema version.\n * Supports dry-run execution, step diagnostics, and structured error reporting.\n */\nexport function migrateDocument(\n rawDocument: unknown,\n options: MigrateOptions = {},\n): MigrationResult {\n const targetVersion = options.targetVersion ?? CURRENT_SCHEMA_VERSION;\n const dryRun = options.dryRun ?? false;\n const registry = options.registry ?? defaultMigrationRegistry;\n const validate = options.validate ?? true;\n\n // 1. Basic object validation\n if (!rawDocument || typeof rawDocument !== 'object' || Array.isArray(rawDocument)) {\n const error: MigrationError = {\n code: 'INVALID_SOURCE_DOCUMENT',\n message: 'Source document must be a non-null object.',\n sourceVersion: 'unknown',\n targetVersion,\n };\n return {\n success: false,\n diagnostic: {\n success: false,\n sourceVersion: 'unknown',\n targetVersion,\n migrationPath: [],\n stepsApplied: 0,\n dryRun,\n errors: [error],\n },\n };\n }\n\n const doc = rawDocument as Record<string, unknown>;\n const sourceVersion = typeof doc.version === 'string' ? doc.version.trim() : 'unknown';\n\n // 2. If already on target version\n if (sourceVersion === targetVersion) {\n const cloned = deepClone(doc) as unknown as PageDocument;\n if (validate) {\n const validation = validateDocument(cloned);\n if (!validation.valid) {\n return {\n success: false,\n diagnostic: {\n success: false,\n sourceVersion,\n targetVersion,\n migrationPath: [sourceVersion],\n stepsApplied: 0,\n dryRun,\n errors: validation.errors.map((e) => ({\n code: 'INVALID_SOURCE_DOCUMENT',\n message: `Validation error: ${e.message} at ${e.path}`,\n sourceVersion,\n targetVersion,\n })),\n },\n };\n }\n }\n\n return {\n success: true,\n document: cloned,\n diagnostic: {\n success: true,\n sourceVersion,\n targetVersion,\n migrationPath: [sourceVersion],\n stepsApplied: 0,\n dryRun,\n },\n };\n }\n\n // 3. Find migration path\n const path = registry.findPath(sourceVersion, targetVersion);\n if (!path || path.length <= 1) {\n const error: MigrationError = {\n code: 'NO_MIGRATION_PATH',\n message: `No migration path found from schema version \"${sourceVersion}\" to \"${targetVersion}\".`,\n sourceVersion,\n targetVersion,\n };\n return {\n success: false,\n diagnostic: {\n success: false,\n sourceVersion,\n targetVersion,\n migrationPath: [],\n stepsApplied: 0,\n dryRun,\n errors: [error],\n },\n };\n }\n\n // 4. If dry-run mode, return simulation success without modifying\n if (dryRun) {\n return {\n success: true,\n diagnostic: {\n success: true,\n sourceVersion,\n targetVersion,\n migrationPath: path,\n stepsApplied: path.length - 1,\n dryRun: true,\n },\n };\n }\n\n // 5. Execute migration path steps sequentially\n let currentDoc = deepClone(doc);\n let stepsApplied = 0;\n\n for (let i = 0; i < path.length - 1; i++) {\n const fromVer = path[i];\n const toVer = path[i + 1];\n const step = registry.getStep(fromVer, toVer);\n\n if (!step) {\n const error: MigrationError = {\n code: 'MIGRATION_EXECUTION_FAILED',\n message: `Registered migration step for \"${fromVer}\" -> \"${toVer}\" is missing executor.`,\n sourceVersion,\n targetVersion,\n };\n return {\n success: false,\n diagnostic: {\n success: false,\n sourceVersion,\n targetVersion,\n migrationPath: path,\n stepsApplied,\n dryRun,\n errors: [error],\n },\n };\n }\n\n try {\n currentDoc = step.migrate(currentDoc);\n stepsApplied++;\n } catch (err: unknown) {\n const error: MigrationError = {\n code: 'MIGRATION_EXECUTION_FAILED',\n message: `Failed executing migration step from \"${fromVer}\" to \"${toVer}\": ${err instanceof Error ? err.message : String(err)}`,\n sourceVersion,\n targetVersion,\n details: { stepFrom: fromVer, stepTo: toVer },\n };\n return {\n success: false,\n diagnostic: {\n success: false,\n sourceVersion,\n targetVersion,\n migrationPath: path,\n stepsApplied,\n dryRun,\n errors: [error],\n },\n };\n }\n }\n\n // 6. Validate final migrated document\n const finalDoc = currentDoc as unknown as PageDocument;\n if (validate) {\n const validation = validateDocument(finalDoc);\n if (!validation.valid) {\n return {\n success: false,\n diagnostic: {\n success: false,\n sourceVersion,\n targetVersion,\n migrationPath: path,\n stepsApplied,\n dryRun,\n errors: validation.errors.map((e) => ({\n code: 'MIGRATION_EXECUTION_FAILED',\n message: `Post-migration validation error: ${e.message} at ${e.path}`,\n sourceVersion,\n targetVersion,\n })),\n },\n };\n }\n }\n\n return {\n success: true,\n document: finalDoc,\n diagnostic: {\n success: true,\n sourceVersion,\n targetVersion,\n migrationPath: path,\n stepsApplied,\n dryRun: false,\n },\n };\n}\n","import { zipSync, strToU8 } from 'fflate';\nimport {\n PageDocument,\n DocumentMetadata,\n Manifest,\n ManifestAssetItem,\n SCHEMA_NAME,\n CURRENT_SCHEMA_VERSION,\n} from '@kubuild/schema';\nimport {\n validateDocument,\n DocumentValidationError,\n ValidationOptions,\n ComponentRegistryLike,\n} from './validator';\nimport {\n collectAssetReferences,\n extractRequirementsFromTree,\n CollectedAssetReference,\n} from './document-utils';\nimport type { AssetProvider } from './interfaces';\n\nexport interface ExportAssetData {\n data: Uint8Array | ArrayBuffer | Blob | string;\n mimeType?: string;\n filename?: string;\n}\n\nexport type AssetBytesProvider = (\n assetId: string,\n assetRef: CollectedAssetReference,\n) =>\n | Promise<Uint8Array | ArrayBuffer | Blob | string | ExportAssetData | null | undefined>\n | Uint8Array\n | ArrayBuffer\n | Blob\n | string\n | ExportAssetData\n | null\n | undefined;\n\nexport interface ExportPackageOptions {\n /**\n * Component registry to validate document components and extract requirements.\n */\n componentRegistry?: ComponentRegistryLike;\n\n /**\n * Known component types if registry is not passed.\n */\n knownComponentTypes?: string[] | Set<string>;\n\n /**\n * Directly supplied asset binary map (keyed by assetId).\n */\n assets?:\n | Record<string, Uint8Array | ArrayBuffer | Blob | string | ExportAssetData>\n | Map<string, Uint8Array | ArrayBuffer | Blob | string | ExportAssetData>;\n\n /**\n * Host function to retrieve asset binary data dynamically.\n */\n getAssetBytes?: AssetBytesProvider;\n\n /**\n * Host AssetProvider instance to resolve assets if bytes provider is not present.\n */\n assetProvider?: AssetProvider;\n\n /**\n * Package version to write in manifest (defaults to \"1.0.0\").\n */\n packageVersion?: string;\n\n /**\n * Builder compatibility semver range (defaults to \">=0.1.0\").\n */\n builderCompatibility?: string;\n\n /**\n * If true, assets that have a fallbackUrl or are externally hosted will not cause export failure if local bytes are missing.\n * If false and a referenced asset has no bytes available, export fails.\n */\n allowExternalFallback?: boolean;\n\n /**\n * Additional validation options passed to validateDocument.\n */\n validationOptions?: ValidationOptions;\n\n /**\n * Optional metadata overrides (e.g. author, tags).\n */\n metadata?: Partial<DocumentMetadata>;\n}\n\nexport interface ExportPackageSuccess {\n success: true;\n archive: Uint8Array;\n manifest: Manifest;\n page: PageDocument;\n metadata: DocumentMetadata;\n assetCount: number;\n}\n\nexport interface ExportPackageFailure {\n success: false;\n errors: DocumentValidationError[];\n diagnosticMessage: string;\n}\n\nexport type ExportPackageResult = ExportPackageSuccess | ExportPackageFailure;\n\n/**\n * Pure TypeScript SHA-256 implementation (zero native dependencies, deterministic).\n */\nexport function sha256Sync(data: Uint8Array): string {\n const K = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n ];\n\n let h0 = 0x6a09e667;\n let h1 = 0xbb67ae85;\n let h2 = 0x3c6ef372;\n let h3 = 0xa54ff53a;\n let h4 = 0x510e527f;\n let h5 = 0x9b05688c;\n let h6 = 0x1f83d9ab;\n let h7 = 0x5be0cd19;\n\n const length = data.length;\n const bitLength = length * 8;\n const newLength = ((length + 9 + 63) >>> 6) << 6;\n const padded = new Uint8Array(newLength);\n padded.set(data);\n padded[length] = 0x80;\n\n const view = new DataView(padded.buffer);\n view.setUint32(newLength - 4, bitLength >>> 0, false);\n view.setUint32(newLength - 8, Math.floor(bitLength / 0x100000000), false);\n\n const w = new Uint32Array(64);\n\n for (let chunk = 0; chunk < newLength; chunk += 64) {\n for (let i = 0; i < 16; i++) {\n w[i] = view.getUint32(chunk + i * 4, false);\n }\n for (let i = 16; i < 64; i++) {\n const s0 =\n ((w[i - 15] >>> 7) | (w[i - 15] << 25)) ^\n ((w[i - 15] >>> 18) | (w[i - 15] << 14)) ^\n (w[i - 15] >>> 3);\n const s1 =\n ((w[i - 2] >>> 17) | (w[i - 2] << 15)) ^\n ((w[i - 2] >>> 19) | (w[i - 2] << 13)) ^\n (w[i - 2] >>> 10);\n w[i] = (w[i - 16] + s0 + w[i - 7] + s1) >>> 0;\n }\n\n let a = h0;\n let b = h1;\n let c = h2;\n let d = h3;\n let e = h4;\n let f = h5;\n let g = h6;\n let h = h7;\n\n for (let i = 0; i < 64; i++) {\n const S1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7));\n const ch = (e & f) ^ (~e & g);\n const temp1 = (h + S1 + ch + K[i] + w[i]) >>> 0;\n const S0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^ ((a >>> 22) | (a << 10));\n const maj = (a & b) ^ (a & c) ^ (b & c);\n const temp2 = (S0 + maj) >>> 0;\n\n h = g;\n g = f;\n f = e;\n e = (d + temp1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (temp1 + temp2) >>> 0;\n }\n\n h0 = (h0 + a) >>> 0;\n h1 = (h1 + b) >>> 0;\n h2 = (h2 + c) >>> 0;\n h3 = (h3 + d) >>> 0;\n h4 = (h4 + e) >>> 0;\n h5 = (h5 + f) >>> 0;\n h6 = (h6 + g) >>> 0;\n h7 = (h7 + h) >>> 0;\n }\n\n const result = [h0, h1, h2, h3, h4, h5, h6, h7]\n .map((val) => val.toString(16).padStart(8, '0'))\n .join('');\n\n return result;\n}\n\n/**\n * Compute SHA-256 checksum with \"sha256:\" prefix.\n */\nexport async function calculateChecksum(data: Uint8Array): Promise<string> {\n if (typeof globalThis !== 'undefined' && globalThis.crypto?.subtle?.digest) {\n try {\n const buffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\n const hashBuffer = await globalThis.crypto.subtle.digest('SHA-256', buffer);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n return `sha256:${hashHex}`;\n } catch {\n // fallback to sync implementation\n }\n }\n return `sha256:${sha256Sync(data)}`;\n}\n\n\n/**\n * Sanitize asset file names to prevent zip-slip or directory traversal vulnerabilities.\n */\nexport function sanitizeFilename(filename: string | undefined, assetId: string, mimeType?: string): string {\n let name = (filename || '').trim();\n\n // Strip path traversal characters and directory separators\n name = name.replace(/^[./\\\\]+/, '').replace(/[/\\\\]+/g, '_').replace(/\\0/g, '');\n name = name.replace(/[^a-zA-Z0-9._-]/g, '_');\n\n if (!name || name === '.' || name === '..') {\n const ext = getExtensionFromMime(mimeType) || 'bin';\n const cleanId = assetId.replace(/[^a-zA-Z0-9_-]/g, '_');\n name = `${cleanId}.${ext}`;\n }\n\n return name;\n}\n\nfunction getExtensionFromMime(mimeType?: string): string | null {\n if (!mimeType) return null;\n const m = mimeType.toLowerCase();\n if (m.includes('png')) return 'png';\n if (m.includes('jpeg') || m.includes('jpg')) return 'jpg';\n if (m.includes('webp')) return 'webp';\n if (m.includes('svg')) return 'svg';\n if (m.includes('gif')) return 'gif';\n if (m.includes('json')) return 'json';\n if (m.includes('pdf')) return 'pdf';\n if (m.includes('mp4')) return 'mp4';\n if (m.includes('mp3')) return 'mp3';\n return null;\n}\n\nasync function convertToUint8Array(input: unknown): Promise<Uint8Array | null> {\n if (!input) return null;\n\n if (input instanceof Uint8Array) {\n return input;\n }\n\n if (input instanceof ArrayBuffer) {\n return new Uint8Array(input);\n }\n\n if (typeof Blob !== 'undefined' && input instanceof Blob) {\n const arrayBuffer = await input.arrayBuffer();\n return new Uint8Array(arrayBuffer);\n }\n\n if (typeof input === 'string') {\n // Check if data URL\n if (input.startsWith('data:')) {\n const commaIdx = input.indexOf(',');\n if (commaIdx !== -1) {\n const meta = input.substring(0, commaIdx);\n const rawData = input.substring(commaIdx + 1);\n if (meta.includes(';base64')) {\n if (typeof atob === 'function') {\n const binary = atob(rawData);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n }\n }\n }\n }\n return new TextEncoder().encode(input);\n }\n\n return null;\n}\n\n/**\n * Validates document, collects asset references, resolves local asset bytes,\n * writes manifest.json, page.json, metadata.json, and packages everything into a .stora archive.\n */\nexport async function exportPackage(\n document: unknown,\n options: ExportPackageOptions = {},\n): Promise<ExportPackageResult> {\n // 1. Validate the Document\n const validation = validateDocument(document, {\n componentRegistry: options.componentRegistry,\n knownComponentTypes: options.knownComponentTypes,\n ...options.validationOptions,\n });\n\n if (!validation.valid || !validation.data) {\n const diagnosticMessage = `Document validation failed with ${validation.errors.length} error(s):\\n` +\n validation.errors.map((e) => `[${e.code}] ${e.path}: ${e.message}`).join('\\n');\n\n return {\n success: false,\n errors: validation.errors,\n diagnosticMessage,\n };\n }\n\n const pageDoc: PageDocument = JSON.parse(JSON.stringify(validation.data));\n\n // Merge optional metadata overrides safely\n if (options.metadata) {\n pageDoc.metadata = {\n ...(pageDoc.metadata || {\n title: 'Untitled Page',\n description: '',\n author: '',\n tags: [],\n category: 'general',\n version: '1.0.0',\n }),\n ...options.metadata,\n updatedAt: new Date().toISOString(),\n };\n }\n\n // 2. Collect Asset References from the document tree\n const collectedAssets = collectAssetReferences(pageDoc.document);\n const assetRefsById = new Map<string, CollectedAssetReference>();\n for (const item of collectedAssets) {\n if (!assetRefsById.has(item.assetId)) {\n assetRefsById.set(item.assetId, item);\n }\n }\n\n // 3. Extract Component and Capability Requirements\n const requirements = extractRequirementsFromTree(pageDoc.document, options.componentRegistry);\n\n // 4. Resolve Asset Bytes and build Manifest Assets\n const manifestAssets: ManifestAssetItem[] = [];\n const archiveFiles: Record<string, Uint8Array> = {};\n const assetCollectionErrors: DocumentValidationError[] = [];\n const usedArchivePaths = new Set<string>();\n\n for (const [assetId, assetRef] of assetRefsById.entries()) {\n let rawAsset: Uint8Array | ArrayBuffer | Blob | string | ExportAssetData | null | undefined;\n let customMime: string | undefined = assetRef.reference.mimeType;\n let customFilename: string | undefined = assetRef.reference.filename;\n\n // Check options.assets map/record\n if (options.assets) {\n if (options.assets instanceof Map) {\n rawAsset = options.assets.get(assetId);\n } else if (typeof options.assets === 'object' && assetId in options.assets) {\n rawAsset = options.assets[assetId];\n }\n }\n\n // Check options.getAssetBytes\n if (!rawAsset && options.getAssetBytes) {\n try {\n rawAsset = await options.getAssetBytes(assetId, assetRef);\n } catch (err) {\n assetCollectionErrors.push({\n code: 'INVALID_ASSET_REFERENCE',\n message: `Failed to retrieve asset bytes for \"${assetId}\": ${err instanceof Error ? err.message : String(err)}`,\n path: assetRef.propPath,\n nodeId: assetRef.nodeId,\n });\n continue;\n }\n }\n\n // Check options.assetProvider\n if (!rawAsset && options.assetProvider?.resolve) {\n try {\n const resolved = await options.assetProvider.resolve(assetId);\n if (resolved) {\n rawAsset = resolved;\n }\n } catch {\n // Continue to fallback check\n }\n }\n\n // Unpack ExportAssetData if provided\n let dataToConvert: unknown = rawAsset;\n if (rawAsset && typeof rawAsset === 'object' && 'data' in rawAsset) {\n const assetObj = rawAsset as ExportAssetData;\n dataToConvert = assetObj.data;\n if (assetObj.mimeType) customMime = assetObj.mimeType;\n if (assetObj.filename) customFilename = assetObj.filename;\n }\n\n const assetBytes = await convertToUint8Array(dataToConvert);\n\n if (assetBytes) {\n // Local asset found and collected\n const sanitizedName = sanitizeFilename(customFilename, assetId, customMime);\n let archivePath = `assets/${sanitizedName}`;\n\n // Avoid collision inside archive\n let counter = 1;\n while (usedArchivePaths.has(archivePath)) {\n const extDot = sanitizedName.lastIndexOf('.');\n if (extDot !== -1) {\n archivePath = `assets/${sanitizedName.substring(0, extDot)}_${counter}${sanitizedName.substring(extDot)}`;\n } else {\n archivePath = `assets/${sanitizedName}_${counter}`;\n }\n counter++;\n }\n usedArchivePaths.add(archivePath);\n\n const mimeType = customMime || 'application/octet-stream';\n const checksum = await calculateChecksum(assetBytes);\n\n manifestAssets.push({\n id: assetId,\n path: archivePath,\n mimeType,\n size: assetBytes.byteLength,\n checksum,\n });\n\n archiveFiles[archivePath] = assetBytes;\n } else {\n // Asset bytes not collected\n const isExternal = Boolean(assetRef.reference.fallbackUrl || options.allowExternalFallback);\n\n if (!isExternal) {\n assetCollectionErrors.push({\n code: 'INVALID_ASSET_REFERENCE',\n message: `Required asset \"${assetId}\" could not be collected for export and has no external fallback`,\n path: assetRef.propPath,\n nodeId: assetRef.nodeId,\n });\n }\n }\n }\n\n // If any required asset could not be collected, abort export\n if (assetCollectionErrors.length > 0) {\n const diagnosticMessage = `Asset collection failed with ${assetCollectionErrors.length} error(s):\\n` +\n assetCollectionErrors.map((e) => `[${e.code}] ${e.path}: ${e.message}`).join('\\n');\n\n return {\n success: false,\n errors: assetCollectionErrors,\n diagnosticMessage,\n };\n }\n\n // 5. Construct Manifest and Metadata\n const metadata: DocumentMetadata = pageDoc.metadata || {\n title: 'Untitled Page',\n description: '',\n author: '',\n tags: [],\n category: 'general',\n version: '1.0.0',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n const manifest: Manifest = {\n schema: SCHEMA_NAME,\n schemaVersion: pageDoc.version || CURRENT_SCHEMA_VERSION,\n packageVersion: options.packageVersion || '1.0.0',\n builderCompatibility: options.builderCompatibility || '>=0.1.0',\n requiredComponents: requirements.requiredComponents,\n requiredCapabilities: requirements.requiredCapabilities,\n assets: manifestAssets,\n createdAt: new Date().toISOString(),\n };\n\n // 6. Write Archive Files\n archiveFiles['manifest.json'] = strToU8(JSON.stringify(manifest, null, 2));\n archiveFiles['page.json'] = strToU8(JSON.stringify(pageDoc, null, 2));\n archiveFiles['metadata.json'] = strToU8(JSON.stringify(metadata, null, 2));\n\n // 7. Compress into .stora ZIP Archive\n const archive = zipSync(archiveFiles, { level: 6 });\n\n return {\n success: true,\n archive,\n manifest,\n page: pageDoc,\n metadata,\n assetCount: manifestAssets.length,\n };\n}\n\n/**\n * Alias for exportPackage.\n */\nexport const exportStoraPackage = exportPackage;\n","import { unzipSync, strFromU8 } from 'fflate';\nimport {\n PageDocument,\n DocumentMetadata,\n Manifest,\n ManifestAssetItem,\n ManifestSchema,\n CURRENT_SCHEMA_VERSION,\n SCHEMA_NAME,\n} from '@kubuild/schema';\nimport {\n validateDocument,\n ComponentRegistryLike,\n} from './validator';\nimport {\n canMigrate,\n getMigrationPath,\n migrateDocument,\n MigrationRegistry,\n defaultMigrationRegistry,\n} from './migration';\nimport { calculateChecksum } from './exporter';\nimport { remapDocumentAssetReferences } from './document-utils';\nimport {\n isDangerousAssetFilename,\n checkZipBomb,\n containsProhibitedKeys,\n} from './security';\nimport type { AssetProvider, AssetInfo } from './interfaces';\n\nexport interface SecurityLimits {\n /**\n * Maximum allowed size for the compressed archive in bytes (default: 50MB).\n */\n maxArchiveSize?: number;\n\n /**\n * Maximum total uncompressed size across all files in bytes (default: 100MB).\n */\n maxUncompressedSize?: number;\n\n /**\n * Maximum number of files in the archive (default: 1000).\n */\n maxFileCount?: number;\n\n /**\n * Maximum size for any individual asset in bytes (default: 25MB).\n */\n maxAssetSize?: number;\n}\n\nexport const DEFAULT_SECURITY_LIMITS: Required<SecurityLimits> = {\n maxArchiveSize: 50 * 1024 * 1024, // 50 MB\n maxUncompressedSize: 100 * 1024 * 1024, // 100 MB\n maxFileCount: 1000,\n maxAssetSize: 25 * 1024 * 1024, // 25 MB\n};\n\nexport type MissingDependencyPolicy =\n | 'cancel'\n | 'import-with-placeholder'\n | 'install-or-register-before-import';\n\nexport type AssetCollisionStrategy =\n | 'reject'\n | 'rename'\n | 'overwrite'\n | 'reuse-existing';\n\nexport interface AssetConflict {\n assetId: string;\n path: string;\n mimeType: string;\n size: number;\n existingAsset?: AssetInfo | Record<string, unknown>;\n}\n\nexport interface AssetConflictResolution {\n action: AssetCollisionStrategy;\n newAssetId?: string;\n}\n\nexport type PreflightDiagnosticCode =\n | 'ARCHIVE_EMPTY'\n | 'ARCHIVE_CORRUPT'\n | 'SIZE_LIMIT_EXCEEDED'\n | 'FILE_COUNT_EXCEEDED'\n | 'ZIP_SLIP_DETECTED'\n | 'EXECUTABLE_ASSET_DETECTED'\n | 'PROTOTYPE_POLLUTION_DETECTED'\n | 'MISSING_MANIFEST'\n | 'INVALID_MANIFEST'\n | 'MISSING_PAGE_DOCUMENT'\n | 'INVALID_PAGE_DOCUMENT'\n | 'UNSUPPORTED_SCHEMA_VERSION'\n | 'NO_MIGRATION_PATH'\n | 'MIGRATION_FAILED'\n | 'ASSET_FILE_MISSING'\n | 'ASSET_SIZE_MISMATCH'\n | 'ASSET_CHECKSUM_MISMATCH'\n | 'ASSET_LIMIT_EXCEEDED'\n | 'ASSET_CONFLICT'\n | 'MISSING_COMPONENTS'\n | 'MISSING_CAPABILITIES'\n | 'HOST_ADAPTER_ERROR';\n\nexport interface PreflightDiagnostic {\n code: PreflightDiagnosticCode;\n severity: 'error' | 'warning' | 'info';\n message: string;\n path?: string;\n details?: Record<string, unknown>;\n}\n\nexport interface PreflightOptions {\n /**\n * Component registry to check required custom components.\n */\n componentRegistry?: ComponentRegistryLike;\n\n /**\n * Allowlist of known component type names (used if componentRegistry is not provided or in combination).\n */\n knownComponentTypes?: string[] | Set<string>;\n\n /**\n * Allowlist of capabilities supported by host.\n */\n supportedCapabilities?: string[] | Set<string>;\n\n /**\n * Security limits for archive and files.\n */\n securityLimits?: SecurityLimits;\n\n /**\n * Custom migration registry.\n */\n migrationRegistry?: MigrationRegistry;\n\n /**\n * Target schema version (defaults to CURRENT_SCHEMA_VERSION = \"1.0.0\").\n */\n targetSchemaVersion?: string;\n\n /**\n * Policy for handling missing custom components and capabilities.\n * - 'cancel' (default): Abort import with blocking errors when components/capabilities are missing.\n * - 'import-with-placeholder': Allow import, keeping missing component nodes and props intact for placeholder rendering.\n * - 'install-or-register-before-import': Call onMissingDependency to register/install before finalizing import.\n */\n dependencyPolicy?: MissingDependencyPolicy;\n\n /**\n * Hook called when dependencyPolicy is 'install-or-register-before-import'.\n */\n onMissingDependency?: (\n missing: { components: string[]; capabilities: string[] },\n preflight: PreflightReport,\n ) => Promise<boolean | void> | boolean | void;\n\n /**\n * If true, missing components are treated as warnings rather than blocking errors.\n * (Equivalent to setting dependencyPolicy: 'import-with-placeholder')\n */\n allowMissingComponents?: boolean;\n\n /**\n * If true, missing capabilities are treated as warnings rather than blocking errors.\n * (Equivalent to setting dependencyPolicy: 'import-with-placeholder')\n */\n allowMissingCapabilities?: boolean;\n\n /**\n * Strategy for resolving asset collisions with existing host assets.\n * - 'reject' (default): Refuse import if asset collision is detected without an explicit resolution strategy.\n * - 'rename': Rename the incoming asset to avoid overwriting host assets, and automatically remap document asset references.\n * - 'overwrite': Explicitly overwrite host assets with incoming archive assets.\n * - 'reuse-existing': Reuse existing host assets and skip writing archive asset binaries.\n */\n assetCollisionStrategy?: AssetCollisionStrategy;\n\n /**\n * Existing host asset IDs or checker function to detect collisions.\n */\n existingAssetIds?: string[] | Set<string> | ((assetId: string) => boolean | Promise<boolean>);\n\n /**\n * Custom naming function when renaming colliding assets.\n */\n renameAssetStrategy?: (incoming: ManifestAssetItem, existingIds: Set<string>) => string;\n\n /**\n * Host AssetProvider to resolve existing assets or upload extracted local assets.\n */\n assetProvider?: AssetProvider;\n\n /**\n * Fine-grained callback for resolving individual asset conflicts.\n */\n onAssetConflict?: (\n conflict: AssetConflict,\n ) => Promise<AssetConflictResolution | AssetCollisionStrategy> | AssetConflictResolution | AssetCollisionStrategy;\n}\n\nexport interface PreflightReport {\n /**\n * True if archive is completely safe and syntactically valid.\n */\n valid: boolean;\n\n /**\n * True if archive can be safely imported given the host's supported components/capabilities and asset policies.\n */\n canImport: boolean;\n\n /**\n * Parsed manifest if available.\n */\n manifest?: Manifest;\n\n /**\n * Parsed metadata if available.\n */\n rawMetadata?: DocumentMetadata;\n\n /**\n * Schema version reported in the document/manifest.\n */\n sourceVersion?: string;\n\n /**\n * Target schema version.\n */\n targetVersion: string;\n\n /**\n * True if the document version differs from target version and requires migration.\n */\n requiresMigration: boolean;\n\n /**\n * Migration path version sequence if migration is needed.\n */\n migrationPath?: string[];\n\n /**\n * List of custom component types required by package that are missing in host.\n */\n missingComponents: string[];\n\n /**\n * List of capabilities required by package that are missing in host.\n */\n missingCapabilities: string[];\n\n /**\n * Active policy for missing dependencies.\n */\n dependencyPolicy: MissingDependencyPolicy;\n\n /**\n * Number of valid local assets declared in manifest.\n */\n assetCount: number;\n\n /**\n * List of detected asset collisions with existing host assets.\n */\n assetConflicts: AssetConflict[];\n\n /**\n * Active strategy for handling asset collisions.\n */\n assetCollisionStrategy: AssetCollisionStrategy;\n\n /**\n * Total uncompressed size of all files in archive.\n */\n totalUncompressedBytes: number;\n\n /**\n * Diagnostics collected during inspection.\n */\n diagnostics: PreflightDiagnostic[];\n}\n\nexport interface ImportPackageOptions extends PreflightOptions {\n /**\n * Custom asset importer hook called for each extracted asset.\n */\n onAssetImport?: (\n assetId: string,\n assetBytes: Uint8Array,\n assetMeta: ManifestAssetItem,\n ) => Promise<AssetInfo | string | void> | AssetInfo | string | void;\n}\n\nexport interface ExtractedAsset {\n bytes: Uint8Array;\n meta: ManifestAssetItem;\n hostInfo?: AssetInfo | string;\n}\n\nexport interface ImportPackageSuccess {\n success: true;\n document: PageDocument;\n manifest: Manifest;\n metadata: DocumentMetadata;\n extractedAssets: Map<string, ExtractedAsset>;\n renamedAssets?: Record<string, string>;\n preflight: PreflightReport;\n}\n\nexport interface ImportPackageFailure {\n success: false;\n errors: PreflightDiagnostic[];\n diagnosticMessage: string;\n preflight?: PreflightReport;\n}\n\nexport type ImportPackageResult = ImportPackageSuccess | ImportPackageFailure;\n\n/**\n * Checks if a zip entry path contains zip-slip or directory traversal attempts.\n */\nexport function isDangerousPath(filepath: string): boolean {\n if (!filepath || typeof filepath !== 'string') return true;\n\n // Check for null bytes\n if (filepath.includes('\\0')) return true;\n\n // Check for absolute paths (Unix or Windows drive)\n if (filepath.startsWith('/') || filepath.startsWith('\\\\') || /^[a-zA-Z]:/.test(filepath)) {\n return true;\n }\n\n // Normalize slashes\n const normalized = filepath.replace(/\\\\/g, '/');\n\n // Check path segments\n const segments = normalized.split('/');\n for (const seg of segments) {\n if (seg === '..' || seg.trim() === '..') {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Inspects a .stora archive and runs non-destructive preflight validation.\n * Verifies security limits, path safety, manifest, checksums, component/capability requirements, and migration status.\n */\nexport async function preflightPackage(\n archiveData: Uint8Array | ArrayBuffer,\n options: PreflightOptions = {},\n): Promise<PreflightReport> {\n const limits: Required<SecurityLimits> = {\n ...DEFAULT_SECURITY_LIMITS,\n ...options.securityLimits,\n };\n\n const targetVersion = options.targetSchemaVersion || CURRENT_SCHEMA_VERSION;\n const migrationRegistry = options.migrationRegistry || defaultMigrationRegistry;\n const diagnostics: PreflightDiagnostic[] = [];\n\n let dependencyPolicy: MissingDependencyPolicy = options.dependencyPolicy || 'cancel';\n if (!options.dependencyPolicy) {\n if (options.allowMissingComponents && options.allowMissingCapabilities) {\n dependencyPolicy = 'import-with-placeholder';\n }\n }\n\n const assetCollisionStrategy: AssetCollisionStrategy = options.assetCollisionStrategy || 'reject';\n\n const archiveBytes = archiveData instanceof Uint8Array ? archiveData : new Uint8Array(archiveData);\n\n // 1. Check archive size limit\n if (!archiveBytes || archiveBytes.byteLength === 0) {\n diagnostics.push({\n code: 'ARCHIVE_EMPTY',\n severity: 'error',\n message: 'Archive is empty or 0 bytes.',\n });\n return buildReport(false, false, { targetVersion, dependencyPolicy, assetCollisionStrategy, diagnostics });\n }\n\n if (archiveBytes.byteLength > limits.maxArchiveSize) {\n diagnostics.push({\n code: 'SIZE_LIMIT_EXCEEDED',\n severity: 'error',\n message: `Archive size (${archiveBytes.byteLength} bytes) exceeds maximum limit of ${limits.maxArchiveSize} bytes.`,\n details: { actualBytes: archiveBytes.byteLength, limitBytes: limits.maxArchiveSize },\n });\n return buildReport(false, false, { targetVersion, dependencyPolicy, assetCollisionStrategy, diagnostics });\n }\n\n // 2. Safe Unzip\n let unzipped: Record<string, Uint8Array>;\n try {\n unzipped = unzipSync(archiveBytes);\n } catch (err) {\n diagnostics.push({\n code: 'ARCHIVE_CORRUPT',\n severity: 'error',\n message: `Failed to unzip archive: ${err instanceof Error ? err.message : String(err)}`,\n });\n return buildReport(false, false, { targetVersion, dependencyPolicy, assetCollisionStrategy, diagnostics });\n }\n\n const entries = Object.keys(unzipped);\n\n // Check file count limit\n if (entries.length > limits.maxFileCount) {\n diagnostics.push({\n code: 'FILE_COUNT_EXCEEDED',\n severity: 'error',\n message: `Archive file count (${entries.length}) exceeds maximum limit of ${limits.maxFileCount}.`,\n details: { fileCount: entries.length, limit: limits.maxFileCount },\n });\n }\n\n // 3. Security checks: Zip-Slip and Total Uncompressed Size\n let totalUncompressedBytes = 0;\n for (const entryPath of entries) {\n // Check path safety\n if (isDangerousPath(entryPath)) {\n diagnostics.push({\n code: 'ZIP_SLIP_DETECTED',\n severity: 'error',\n message: `Security violation: Path traversal or Zip-Slip attempt detected in archive entry \"${entryPath}\".`,\n path: entryPath,\n });\n }\n\n // Check dangerous/executable asset file extensions\n if (entryPath.startsWith('assets/') && isDangerousAssetFilename(entryPath)) {\n diagnostics.push({\n code: 'EXECUTABLE_ASSET_DETECTED',\n severity: 'error',\n message: `Security violation: Executable or dangerous asset file extension detected in archive entry \"${entryPath}\".`,\n path: entryPath,\n });\n }\n\n const fileBytes = unzipped[entryPath];\n if (fileBytes) {\n totalUncompressedBytes += fileBytes.byteLength;\n\n // Check single asset size limit if in assets/\n if (entryPath.startsWith('assets/') && fileBytes.byteLength > limits.maxAssetSize) {\n diagnostics.push({\n code: 'ASSET_LIMIT_EXCEEDED',\n severity: 'error',\n message: `Asset \"${entryPath}\" size (${fileBytes.byteLength} bytes) exceeds maximum limit of ${limits.maxAssetSize} bytes.`,\n path: entryPath,\n details: { actualBytes: fileBytes.byteLength, limitBytes: limits.maxAssetSize },\n });\n }\n }\n }\n\n if (totalUncompressedBytes > limits.maxUncompressedSize) {\n diagnostics.push({\n code: 'SIZE_LIMIT_EXCEEDED',\n severity: 'error',\n message: `Total uncompressed archive size (${totalUncompressedBytes} bytes) exceeds maximum limit of ${limits.maxUncompressedSize} bytes.`,\n details: { actualBytes: totalUncompressedBytes, limitBytes: limits.maxUncompressedSize },\n });\n }\n\n // Check Zip Bomb expansion ratio\n if (checkZipBomb(archiveBytes.byteLength, totalUncompressedBytes)) {\n diagnostics.push({\n code: 'SIZE_LIMIT_EXCEEDED',\n severity: 'error',\n message: `Security violation: Potential Zip Bomb attack detected (excessive compression ratio).`,\n details: { compressedBytes: archiveBytes.byteLength, uncompressedBytes: totalUncompressedBytes },\n });\n }\n\n // 4. Check Mandatory Files: manifest.json & page.json\n const manifestEntry = unzipped['manifest.json'];\n if (!manifestEntry) {\n diagnostics.push({\n code: 'MISSING_MANIFEST',\n severity: 'error',\n message: 'Archive is missing mandatory \"manifest.json\" file.',\n });\n }\n\n const pageEntry = unzipped['page.json'];\n if (!pageEntry) {\n diagnostics.push({\n code: 'MISSING_PAGE_DOCUMENT',\n severity: 'error',\n message: 'Archive is missing mandatory \"page.json\" file.',\n });\n }\n\n // If mandatory files missing or security violated, stop preflight early\n if (!manifestEntry || !pageEntry || diagnostics.some((d) => d.code === 'ZIP_SLIP_DETECTED')) {\n return buildReport(false, false, {\n targetVersion,\n dependencyPolicy,\n assetCollisionStrategy,\n totalUncompressedBytes,\n diagnostics,\n });\n }\n\n // 5. Parse & Validate Manifest\n let parsedManifest: Manifest | undefined;\n try {\n const manifestJson = JSON.parse(strFromU8(manifestEntry));\n const manifestProtoCheck = containsProhibitedKeys(manifestJson);\n if (manifestProtoCheck.found) {\n diagnostics.push({\n code: 'PROTOTYPE_POLLUTION_DETECTED',\n severity: 'error',\n message: `Security violation: Prohibited key \"${manifestProtoCheck.key}\" in manifest.json.`,\n path: manifestProtoCheck.path,\n });\n }\n\n const parseResult = ManifestSchema.safeParse(manifestJson);\n if (!parseResult.success) {\n const issues = parseResult.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join(', ');\n diagnostics.push({\n code: 'INVALID_MANIFEST',\n severity: 'error',\n message: `Manifest validation failed: ${issues}`,\n details: { issues: parseResult.error.issues },\n });\n } else {\n parsedManifest = parseResult.data;\n }\n } catch (err) {\n diagnostics.push({\n code: 'INVALID_MANIFEST',\n severity: 'error',\n message: `Failed to parse \"manifest.json\" as valid JSON: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n\n // 6. Parse Metadata (Optional metadata.json)\n let rawMetadata: DocumentMetadata | undefined;\n const metadataEntry = unzipped['metadata.json'];\n if (metadataEntry) {\n try {\n rawMetadata = JSON.parse(strFromU8(metadataEntry)) as DocumentMetadata;\n } catch {\n // Non-critical, fallback will use page.json metadata\n }\n }\n\n // 7. Parse & Inspect page.json\n let rawPageDoc: Record<string, unknown> | undefined;\n try {\n rawPageDoc = JSON.parse(strFromU8(pageEntry)) as Record<string, unknown>;\n const pageProtoCheck = containsProhibitedKeys(rawPageDoc);\n if (pageProtoCheck.found) {\n diagnostics.push({\n code: 'PROTOTYPE_POLLUTION_DETECTED',\n severity: 'error',\n message: `Security violation: Prohibited key \"${pageProtoCheck.key}\" in page.json.`,\n path: pageProtoCheck.path,\n });\n }\n } catch (err) {\n diagnostics.push({\n code: 'INVALID_PAGE_DOCUMENT',\n severity: 'error',\n message: `Failed to parse \"page.json\" as valid JSON: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n\n const docVersion = typeof rawPageDoc?.version === 'string'\n ? rawPageDoc.version\n : parsedManifest?.schemaVersion || 'unknown';\n\n let requiresMigration = false;\n let migrationPath: string[] | undefined;\n\n if (rawPageDoc) {\n if (docVersion !== targetVersion) {\n if (canMigrate(docVersion, targetVersion, migrationRegistry)) {\n requiresMigration = true;\n migrationPath = getMigrationPath(docVersion, targetVersion, migrationRegistry) || undefined;\n diagnostics.push({\n code: 'UNSUPPORTED_SCHEMA_VERSION',\n severity: 'info',\n message: `Document schema version \"${docVersion}\" requires migration to current version \"${targetVersion}\".`,\n details: { sourceVersion: docVersion, targetVersion, migrationPath },\n });\n } else {\n diagnostics.push({\n code: 'NO_MIGRATION_PATH',\n severity: 'error',\n message: `Document schema version \"${docVersion}\" is not compatible and no migration path exists to \"${targetVersion}\".`,\n details: { sourceVersion: docVersion, targetVersion },\n });\n }\n } else {\n // Validate current schema structure\n const docValidation = validateDocument(rawPageDoc, {\n componentRegistry: options.componentRegistry,\n knownComponentTypes: options.knownComponentTypes,\n });\n const criticalDocErrors = docValidation.errors.filter((e) => {\n if (e.code === 'UNKNOWN_COMPONENT_TYPE' && dependencyPolicy !== 'cancel') {\n return false;\n }\n return true;\n });\n if (criticalDocErrors.length > 0) {\n diagnostics.push({\n code: 'INVALID_PAGE_DOCUMENT',\n severity: 'error',\n message: `Document validation failed with ${criticalDocErrors.length} error(s):\\n` +\n criticalDocErrors.map((e) => `[${e.code}] ${e.path}: ${e.message}`).join('\\n'),\n });\n }\n }\n }\n\n // 8. Verify Asset Inventory & Checksums\n const missingComponents: string[] = [];\n const missingCapabilities: string[] = [];\n const assetConflicts: AssetConflict[] = [];\n\n // Build existing host assets set\n const existingAssetIdsSet = new Set<string>();\n if (options.existingAssetIds) {\n if (Array.isArray(options.existingAssetIds)) {\n for (const id of options.existingAssetIds) existingAssetIdsSet.add(id);\n } else if (options.existingAssetIds instanceof Set) {\n for (const id of options.existingAssetIds) existingAssetIdsSet.add(id);\n }\n }\n\n // Check host assetProvider list if available and existingAssetIds not given\n if (options.assetProvider?.list && !options.existingAssetIds) {\n try {\n const list = await options.assetProvider.list();\n if (Array.isArray(list)) {\n for (const item of list) {\n if (item?.id) existingAssetIdsSet.add(item.id);\n }\n }\n } catch {\n // Non-fatal\n }\n }\n\n if (parsedManifest) {\n for (const assetItem of parsedManifest.assets) {\n // Validate asset path in archive\n const assetFile = unzipped[assetItem.path];\n if (!assetFile) {\n diagnostics.push({\n code: 'ASSET_FILE_MISSING',\n severity: 'error',\n message: `Declared asset \"${assetItem.id}\" is missing in archive at path \"${assetItem.path}\".`,\n path: assetItem.path,\n details: { assetId: assetItem.id },\n });\n continue;\n }\n\n // Validate size\n if (assetFile.byteLength !== assetItem.size) {\n diagnostics.push({\n code: 'ASSET_SIZE_MISMATCH',\n severity: 'error',\n message: `Asset \"${assetItem.id}\" size mismatch: expected ${assetItem.size} bytes, found ${assetFile.byteLength} bytes.`,\n path: assetItem.path,\n details: { assetId: assetItem.id, expected: assetItem.size, actual: assetFile.byteLength },\n });\n }\n\n // Validate checksum if provided\n if (assetItem.checksum) {\n const actualChecksum = await calculateChecksum(assetFile);\n if (actualChecksum !== assetItem.checksum) {\n diagnostics.push({\n code: 'ASSET_CHECKSUM_MISMATCH',\n severity: 'error',\n message: `Asset \"${assetItem.id}\" checksum mismatch: expected ${assetItem.checksum}, calculated ${actualChecksum}.`,\n path: assetItem.path,\n details: { assetId: assetItem.id, expected: assetItem.checksum, actual: actualChecksum },\n });\n }\n }\n\n // Check collision with host assets\n let isConflict = false;\n if (typeof options.existingAssetIds === 'function') {\n const fnRes = await options.existingAssetIds(assetItem.id);\n if (fnRes) isConflict = true;\n } else if (existingAssetIdsSet.has(assetItem.id)) {\n isConflict = true;\n }\n\n if (isConflict) {\n assetConflicts.push({\n assetId: assetItem.id,\n path: assetItem.path,\n mimeType: assetItem.mimeType,\n size: assetItem.size,\n });\n }\n }\n\n // Report Asset Collision diagnostics\n if (assetConflicts.length > 0) {\n const conflictIds = assetConflicts.map((c) => c.assetId).join(', ');\n if (assetCollisionStrategy === 'reject' && !options.onAssetConflict) {\n diagnostics.push({\n code: 'ASSET_CONFLICT',\n severity: 'error',\n message: `Asset collision detected for asset(s): ${conflictIds}. Host assets will not be overwritten without an explicit assetCollisionStrategy.`,\n details: { assetConflicts, strategy: assetCollisionStrategy },\n });\n } else {\n diagnostics.push({\n code: 'ASSET_CONFLICT',\n severity: 'info',\n message: `Asset collision detected for asset(s): ${conflictIds}. Strategy \"${assetCollisionStrategy}\" will be applied on import.`,\n details: { assetConflicts, strategy: assetCollisionStrategy },\n });\n }\n }\n\n // 9. Component Requirements Check\n const knownSet = new Set<string>();\n if (options.knownComponentTypes) {\n for (const t of options.knownComponentTypes) knownSet.add(t);\n }\n // Add standard built-ins\n const builtIns = ['page', 'section', 'container', 'columns', 'heading', 'text', 'image', 'button', 'collection'];\n for (const b of builtIns) knownSet.add(b);\n\n for (const compType of parsedManifest.requiredComponents) {\n let isSupported = knownSet.has(compType);\n if (!isSupported && options.componentRegistry) {\n isSupported = options.componentRegistry.has(compType);\n }\n if (!isSupported) {\n missingComponents.push(compType);\n }\n }\n\n if (missingComponents.length > 0) {\n if (dependencyPolicy === 'cancel' && !options.allowMissingComponents) {\n diagnostics.push({\n code: 'MISSING_COMPONENTS',\n severity: 'error',\n message: `Package requires custom component(s) not registered in host: ${missingComponents.join(', ')}.`,\n details: { missingComponents, policy: dependencyPolicy },\n });\n } else if (dependencyPolicy === 'import-with-placeholder' || options.allowMissingComponents) {\n diagnostics.push({\n code: 'MISSING_COMPONENTS',\n severity: 'warning',\n message: `Package requires custom component(s) [${missingComponents.join(', ')}] not registered in host. Nodes and props are preserved intact for placeholder rendering.`,\n details: { missingComponents, policy: dependencyPolicy },\n });\n } else if (dependencyPolicy === 'install-or-register-before-import') {\n diagnostics.push({\n code: 'MISSING_COMPONENTS',\n severity: 'info',\n message: `Package requires custom component(s) [${missingComponents.join(', ')}]. Installation/registration required before import.`,\n details: { missingComponents, policy: dependencyPolicy },\n });\n }\n }\n\n // 10. Capability Requirements Check\n const supportedCaps = new Set<string>();\n if (options.supportedCapabilities) {\n for (const c of options.supportedCapabilities) supportedCaps.add(c);\n }\n\n for (const cap of parsedManifest.requiredCapabilities) {\n if (!supportedCaps.has(cap)) {\n missingCapabilities.push(cap);\n }\n }\n\n if (missingCapabilities.length > 0) {\n if (dependencyPolicy === 'cancel' && !options.allowMissingCapabilities) {\n diagnostics.push({\n code: 'MISSING_CAPABILITIES',\n severity: 'error',\n message: `Package requires capability/capabilities not supported by host: ${missingCapabilities.join(', ')}.`,\n details: { missingCapabilities, policy: dependencyPolicy },\n });\n } else if (dependencyPolicy === 'import-with-placeholder' || options.allowMissingCapabilities) {\n diagnostics.push({\n code: 'MISSING_CAPABILITIES',\n severity: 'warning',\n message: `Package requires capability/capabilities [${missingCapabilities.join(', ')}] not supported by host. Placeholder rendering enabled.`,\n details: { missingCapabilities, policy: dependencyPolicy },\n });\n } else if (dependencyPolicy === 'install-or-register-before-import') {\n diagnostics.push({\n code: 'MISSING_CAPABILITIES',\n severity: 'info',\n message: `Package requires capability/capabilities [${missingCapabilities.join(', ')}]. Registration required before import.`,\n details: { missingCapabilities, policy: dependencyPolicy },\n });\n }\n }\n }\n\n const hasErrors = diagnostics.some((d) => d.severity === 'error');\n const valid = !hasErrors;\n const canImport = valid;\n\n return buildReport(valid, canImport, {\n manifest: parsedManifest,\n rawMetadata,\n sourceVersion: docVersion,\n targetVersion,\n requiresMigration,\n migrationPath,\n missingComponents,\n missingCapabilities,\n dependencyPolicy,\n assetCount: parsedManifest?.assets.length || 0,\n assetConflicts,\n assetCollisionStrategy,\n totalUncompressedBytes,\n diagnostics,\n });\n}\n\nfunction buildReport(\n valid: boolean,\n canImport: boolean,\n fields: Partial<PreflightReport>,\n): PreflightReport {\n return {\n valid,\n canImport,\n targetVersion: fields.targetVersion || CURRENT_SCHEMA_VERSION,\n requiresMigration: fields.requiresMigration || false,\n missingComponents: fields.missingComponents || [],\n missingCapabilities: fields.missingCapabilities || [],\n dependencyPolicy: fields.dependencyPolicy || 'cancel',\n assetCount: fields.assetCount || 0,\n assetConflicts: fields.assetConflicts || [],\n assetCollisionStrategy: fields.assetCollisionStrategy || 'reject',\n totalUncompressedBytes: fields.totalUncompressedBytes || 0,\n diagnostics: fields.diagnostics || [],\n ...fields,\n };\n}\n\n/**\n * Preview a .stora package without mutating host state.\n * Returns missing dependencies, asset conflicts, schema migration status, and diagnostics.\n */\nexport const previewImportPackage = preflightPackage;\n\n/**\n * Alias for preflightPackage.\n */\nexport const inspectPackage = preflightPackage;\n\n/**\n * Default generator for renaming colliding asset IDs.\n */\nexport function defaultRenameAssetStrategy(\n incoming: ManifestAssetItem,\n existingIds: Set<string>,\n): string {\n let candidate = `${incoming.id}_imported`;\n let counter = 1;\n while (existingIds.has(candidate)) {\n candidate = `${incoming.id}_imported_${counter}`;\n counter++;\n }\n return candidate;\n}\n\n/**\n * Imports a .stora package with preflight safety checks, schema migration, missing dependency policy,\n * and host-controlled asset collision handling.\n */\nexport async function importPackage(\n archiveData: Uint8Array | ArrayBuffer,\n options: ImportPackageOptions = {},\n): Promise<ImportPackageResult> {\n // 1. Run Preflight Inspection first\n let preflight = await preflightPackage(archiveData, options);\n\n // 2. Handle 'install-or-register-before-import' policy hook\n const dependencyPolicy = options.dependencyPolicy || preflight.dependencyPolicy;\n if (\n dependencyPolicy === 'install-or-register-before-import' &&\n (preflight.missingComponents.length > 0 || preflight.missingCapabilities.length > 0) &&\n options.onMissingDependency\n ) {\n try {\n await options.onMissingDependency(\n {\n components: [...preflight.missingComponents],\n capabilities: [...preflight.missingCapabilities],\n },\n preflight,\n );\n\n // Re-run preflight after hook execution\n preflight = await preflightPackage(archiveData, {\n ...options,\n dependencyPolicy: 'cancel', // Strict check after install attempt\n });\n } catch (err) {\n const diag: PreflightDiagnostic = {\n code: 'HOST_ADAPTER_ERROR',\n severity: 'error',\n message: `Dynamic dependency registration failed: ${err instanceof Error ? err.message : String(err)}`,\n };\n return {\n success: false,\n errors: [diag],\n diagnosticMessage: diag.message,\n preflight,\n };\n }\n }\n\n if (!preflight.canImport || !preflight.manifest) {\n const errorDiagnostics = preflight.diagnostics.filter((d) => d.severity === 'error');\n const diagnosticMessage = `Package import rejected with ${errorDiagnostics.length} error(s):\\n` +\n errorDiagnostics.map((d) => `[${d.code}] ${d.path ? d.path + ': ' : ''}${d.message}`).join('\\n');\n\n return {\n success: false,\n errors: errorDiagnostics,\n diagnosticMessage,\n preflight,\n };\n }\n\n const archiveBytes = archiveData instanceof Uint8Array ? archiveData : new Uint8Array(archiveData);\n const unzipped = unzipSync(archiveBytes);\n\n // 3. Read and Migrate Page Document\n const pageRaw = JSON.parse(strFromU8(unzipped['page.json']));\n let finalDocument: PageDocument;\n\n if (preflight.requiresMigration) {\n const migrationRegistry = options.migrationRegistry || defaultMigrationRegistry;\n const migrationRes = migrateDocument(pageRaw, {\n targetVersion: options.targetSchemaVersion || CURRENT_SCHEMA_VERSION,\n registry: migrationRegistry,\n validate: true,\n });\n\n if (!migrationRes.success || !migrationRes.document) {\n const err: PreflightDiagnostic = {\n code: 'MIGRATION_FAILED',\n severity: 'error',\n message: `Failed to migrate document from \"${preflight.sourceVersion}\" to \"${preflight.targetVersion}\".`,\n details: { diagnostic: migrationRes.diagnostic },\n };\n return {\n success: false,\n errors: [err],\n diagnosticMessage: err.message,\n preflight,\n };\n }\n\n finalDocument = migrationRes.document;\n } else {\n finalDocument = pageRaw as PageDocument;\n }\n\n // 4. Extract and Merge Metadata\n let metadata: DocumentMetadata = finalDocument.metadata || {\n title: 'Imported Page',\n description: '',\n author: '',\n tags: [],\n category: 'general',\n version: finalDocument.version || CURRENT_SCHEMA_VERSION,\n };\n\n if (unzipped['metadata.json']) {\n try {\n const metaFromFile = JSON.parse(strFromU8(unzipped['metadata.json'])) as DocumentMetadata;\n metadata = {\n ...metadata,\n ...metaFromFile,\n };\n } catch {\n // Use document metadata\n }\n }\n\n finalDocument.metadata = metadata;\n\n // 5. Build existing host assets set\n const existingAssetIdsSet = new Set<string>();\n if (options.existingAssetIds) {\n if (Array.isArray(options.existingAssetIds)) {\n for (const id of options.existingAssetIds) existingAssetIdsSet.add(id);\n } else if (options.existingAssetIds instanceof Set) {\n for (const id of options.existingAssetIds) existingAssetIdsSet.add(id);\n }\n }\n\n if (options.assetProvider?.list && !options.existingAssetIds) {\n try {\n const list = await options.assetProvider.list();\n if (Array.isArray(list)) {\n for (const item of list) {\n if (item?.id) existingAssetIdsSet.add(item.id);\n }\n }\n } catch {\n // Non-fatal\n }\n }\n\n const renameAssetFn = options.renameAssetStrategy || defaultRenameAssetStrategy;\n const renameMap: Record<string, string> = {};\n const extractedAssets = new Map<string, ExtractedAsset>();\n\n // 6. Extract Assets with Host-Controlled Collision Resolution\n for (const assetItem of preflight.manifest.assets) {\n const assetBytes = unzipped[assetItem.path];\n if (assetBytes) {\n let targetAssetId = assetItem.id;\n let effectiveStrategy: AssetCollisionStrategy = options.assetCollisionStrategy || 'reject';\n\n const conflictInfo = preflight.assetConflicts.find((c) => c.assetId === assetItem.id);\n\n if (conflictInfo) {\n if (options.onAssetConflict) {\n try {\n const conflictRes = await options.onAssetConflict(conflictInfo);\n if (typeof conflictRes === 'string') {\n effectiveStrategy = conflictRes;\n } else {\n effectiveStrategy = conflictRes.action;\n if (conflictRes.newAssetId) {\n targetAssetId = conflictRes.newAssetId;\n }\n }\n } catch (err) {\n const diag: PreflightDiagnostic = {\n code: 'HOST_ADAPTER_ERROR',\n severity: 'error',\n message: `Asset conflict resolution handler failed for \"${assetItem.id}\": ${err instanceof Error ? err.message : String(err)}`,\n path: assetItem.path,\n };\n return {\n success: false,\n errors: [diag],\n diagnosticMessage: diag.message,\n preflight,\n };\n }\n }\n\n if (effectiveStrategy === 'reject') {\n const diag: PreflightDiagnostic = {\n code: 'ASSET_CONFLICT',\n severity: 'error',\n message: `Import aborted: Asset \"${assetItem.id}\" collides with host asset. No overwrite strategy specified.`,\n path: assetItem.path,\n };\n return {\n success: false,\n errors: [diag],\n diagnosticMessage: diag.message,\n preflight,\n };\n }\n\n if (effectiveStrategy === 'rename') {\n if (targetAssetId === assetItem.id) {\n targetAssetId = renameAssetFn(assetItem, existingAssetIdsSet);\n }\n renameMap[assetItem.id] = targetAssetId;\n existingAssetIdsSet.add(targetAssetId);\n }\n }\n\n let hostInfo: AssetInfo | string | undefined;\n\n if (effectiveStrategy === 'reuse-existing' && conflictInfo) {\n // Reuse existing asset: skip binary upload and resolve from host provider\n if (options.assetProvider?.resolve) {\n hostInfo = await options.assetProvider.resolve(targetAssetId);\n }\n } else {\n // Upload or pass to onAssetImport hook\n const effectiveMeta: ManifestAssetItem = {\n ...assetItem,\n id: targetAssetId,\n };\n\n if (options.onAssetImport) {\n try {\n const result = await options.onAssetImport(targetAssetId, assetBytes, effectiveMeta);\n if (result) hostInfo = result;\n } catch (err) {\n const diag: PreflightDiagnostic = {\n code: 'HOST_ADAPTER_ERROR',\n severity: 'error',\n message: `Host asset import hook failed for \"${targetAssetId}\": ${err instanceof Error ? err.message : String(err)}`,\n path: assetItem.path,\n };\n return {\n success: false,\n errors: [diag],\n diagnosticMessage: diag.message,\n preflight,\n };\n }\n } else if (options.assetProvider?.upload) {\n try {\n const blob = new Blob([assetBytes], { type: assetItem.mimeType });\n const filename = assetItem.path.replace(/^assets\\//, '');\n const file = new File([blob], filename, { type: assetItem.mimeType });\n const info = await options.assetProvider.upload(file, {\n assetId: targetAssetId,\n originalAssetId: assetItem.id,\n });\n if (info) hostInfo = info;\n } catch {\n // Non-fatal if upload not strictly required\n }\n }\n }\n\n extractedAssets.set(targetAssetId, {\n bytes: assetBytes,\n meta: {\n ...assetItem,\n id: targetAssetId,\n },\n hostInfo,\n });\n }\n }\n\n // 7. Remap Asset References in Document if Any Assets Were Renamed\n if (Object.keys(renameMap).length > 0) {\n remapDocumentAssetReferences(finalDocument, renameMap);\n }\n\n return {\n success: true,\n document: finalDocument,\n manifest: preflight.manifest,\n metadata,\n extractedAssets,\n renamedAssets: Object.keys(renameMap).length > 0 ? renameMap : undefined,\n preflight,\n };\n}\n\n/**\n * Alias for importPackage.\n */\nexport const importStoraPackage = importPackage;\n","import {\n PageDocument,\n Node,\n ResponsiveStyles,\n StyleDefinition,\n Manifest,\n VariableBinding,\n ActionBinding,\n AssetReference,\n} from '@kubuild/schema';\n\nexport type SemanticDifferenceKind =\n | 'METADATA_MISMATCH'\n | 'NODE_MISSING'\n | 'NODE_EXTRA'\n | 'NODE_ORDER'\n | 'NODE_TYPE'\n | 'PROP_MISMATCH'\n | 'STYLE_MISMATCH'\n | 'BINDING_MISMATCH'\n | 'ACTION_MISMATCH'\n | 'ASSET_MISMATCH'\n | 'DEPENDENCY_MISMATCH';\n\nexport interface SemanticDifference {\n path: string;\n kind: SemanticDifferenceKind;\n message: string;\n expected?: unknown;\n actual?: unknown;\n}\n\nexport interface SemanticCompareOptions {\n /**\n * Optional map of original asset IDs to host-remapped asset IDs.\n * Used when host renamed colliding assets during import.\n */\n assetIdMap?: Record<string, string> | Map<string, string>;\n\n /**\n * Whether to ignore transient timestamp fields (e.g. createdAt/updatedAt).\n * Default: true.\n */\n ignoreTimestamps?: boolean;\n}\n\nexport interface SemanticComparisonResult {\n equivalent: boolean;\n differences: SemanticDifference[];\n}\n\nfunction isAssetReferenceLike(val: unknown): val is AssetReference {\n if (!val || typeof val !== 'object') return false;\n const obj = val as Record<string, unknown>;\n return obj.type === 'asset' && typeof obj.assetId === 'string' && obj.assetId.trim().length > 0;\n}\n\nfunction isVariableBindingLike(val: unknown): val is VariableBinding {\n if (!val || typeof val !== 'object') return false;\n const obj = val as Record<string, unknown>;\n return obj.type === 'variable' && typeof obj.key === 'string' && obj.key.trim().length > 0;\n}\n\nfunction isActionBindingLike(val: unknown): val is ActionBinding {\n if (!val || typeof val !== 'object') return false;\n const obj = val as Record<string, unknown>;\n return obj.type !== undefined && typeof obj.type === 'string' && obj.type.trim().length > 0 && ('payload' in obj || Object.keys(obj).length <= 2);\n}\n\nfunction normalizeAssetId(\n id: string,\n assetIdMap?: Record<string, string> | Map<string, string>,\n): string {\n if (!assetIdMap) return id;\n if (assetIdMap instanceof Map) {\n return assetIdMap.get(id) ?? id;\n }\n return assetIdMap[id] ?? id;\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null || typeof a !== 'object' || typeof b !== 'object') {\n return false;\n }\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) return false;\n }\n return true;\n }\n\n const objA = a as Record<string, unknown>;\n const objB = b as Record<string, unknown>;\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) return false;\n for (const k of keysA) {\n if (!Object.prototype.hasOwnProperty.call(objB, k)) return false;\n if (!deepEqual(objA[k], objB[k])) return false;\n }\n return true;\n}\n\n/**\n * Recursively compares two props values, checking for variable bindings, action bindings,\n * and asset references (with asset ID mapping support).\n */\nfunction comparePropValues(\n path: string,\n expected: unknown,\n actual: unknown,\n differences: SemanticDifference[],\n options?: SemanticCompareOptions,\n): void {\n // 1. Variable Binding check\n if (isVariableBindingLike(expected)) {\n if (!isVariableBindingLike(actual)) {\n differences.push({\n path,\n kind: 'BINDING_MISMATCH',\n message: `Expected variable binding at \"${path}\", but got non-binding value.`,\n expected,\n actual,\n });\n return;\n }\n const expBinding = expected as VariableBinding;\n const actBinding = actual as VariableBinding;\n if (expBinding.key !== actBinding.key) {\n differences.push({\n path: `${path}.key`,\n kind: 'BINDING_MISMATCH',\n message: `Variable binding key mismatch at \"${path}\": expected \"${expBinding.key}\", got \"${actBinding.key}\".`,\n expected: expBinding.key,\n actual: actBinding.key,\n });\n }\n if (!deepEqual(expBinding.fallback, actBinding.fallback)) {\n differences.push({\n path: `${path}.fallback`,\n kind: 'BINDING_MISMATCH',\n message: `Variable binding fallback mismatch at \"${path}\".`,\n expected: expBinding.fallback,\n actual: actBinding.fallback,\n });\n }\n return;\n }\n\n // 2. Action Binding check\n if (isActionBindingLike(expected) && !isAssetReferenceLike(expected) && !isVariableBindingLike(expected)) {\n if (!isActionBindingLike(actual)) {\n differences.push({\n path,\n kind: 'ACTION_MISMATCH',\n message: `Expected action binding at \"${path}\", but got non-action value.`,\n expected,\n actual,\n });\n return;\n }\n const expAction = expected as ActionBinding;\n const actAction = actual as ActionBinding;\n if (expAction.type !== actAction.type) {\n differences.push({\n path: `${path}.type`,\n kind: 'ACTION_MISMATCH',\n message: `Action binding type mismatch at \"${path}\": expected \"${expAction.type}\", got \"${actAction.type}\".`,\n expected: expAction.type,\n actual: actAction.type,\n });\n }\n if (!deepEqual(expAction.payload ?? {}, actAction.payload ?? {})) {\n differences.push({\n path: `${path}.payload`,\n kind: 'ACTION_MISMATCH',\n message: `Action binding payload mismatch at \"${path}\".`,\n expected: expAction.payload,\n actual: actAction.payload,\n });\n }\n return;\n }\n\n // 3. Asset Reference check\n if (isAssetReferenceLike(expected)) {\n if (!isAssetReferenceLike(actual)) {\n differences.push({\n path,\n kind: 'ASSET_MISMATCH',\n message: `Expected asset reference at \"${path}\", but got non-asset value.`,\n expected,\n actual,\n });\n return;\n }\n const expAsset = expected as AssetReference;\n const actAsset = actual as AssetReference;\n const expectedMappedId = normalizeAssetId(expAsset.assetId, options?.assetIdMap);\n\n if (actAsset.assetId !== expectedMappedId) {\n differences.push({\n path: `${path}.assetId`,\n kind: 'ASSET_MISMATCH',\n message: `Asset reference ID mismatch at \"${path}\": expected \"${expectedMappedId}\" (original: \"${expAsset.assetId}\"), got \"${actAsset.assetId}\".`,\n expected: expectedMappedId,\n actual: actAsset.assetId,\n });\n }\n if (expAsset.filename !== actAsset.filename) {\n differences.push({\n path: `${path}.filename`,\n kind: 'ASSET_MISMATCH',\n message: `Asset reference filename mismatch at \"${path}\": expected \"${expAsset.filename}\", got \"${actAsset.filename}\".`,\n expected: expAsset.filename,\n actual: actAsset.filename,\n });\n }\n if (expAsset.mimeType !== actAsset.mimeType) {\n differences.push({\n path: `${path}.mimeType`,\n kind: 'ASSET_MISMATCH',\n message: `Asset reference mimeType mismatch at \"${path}\": expected \"${expAsset.mimeType}\", got \"${actAsset.mimeType}\".`,\n expected: expAsset.mimeType,\n actual: actAsset.mimeType,\n });\n }\n return;\n }\n\n // 4. Object recursion\n if (\n expected !== null &&\n actual !== null &&\n typeof expected === 'object' &&\n typeof actual === 'object'\n ) {\n if (Array.isArray(expected) !== Array.isArray(actual)) {\n differences.push({\n path,\n kind: 'PROP_MISMATCH',\n message: `Type mismatch at \"${path}\": one is array, other is object.`,\n expected,\n actual,\n });\n return;\n }\n\n if (Array.isArray(expected) && Array.isArray(actual)) {\n if (expected.length !== actual.length) {\n differences.push({\n path,\n kind: 'PROP_MISMATCH',\n message: `Array length mismatch at \"${path}\": expected length ${expected.length}, got ${actual.length}.`,\n expected,\n actual,\n });\n return;\n }\n for (let i = 0; i < expected.length; i++) {\n comparePropValues(`${path}[${i}]`, expected[i], actual[i], differences, options);\n }\n return;\n }\n\n const expObj = expected as Record<string, unknown>;\n const actObj = actual as Record<string, unknown>;\n const allKeys = new Set([...Object.keys(expObj), ...Object.keys(actObj)]);\n\n for (const key of allKeys) {\n if (!(key in expObj)) {\n differences.push({\n path: `${path}.${key}`,\n kind: 'PROP_MISMATCH',\n message: `Unexpected extra prop key \"${key}\" at \"${path}\".`,\n actual: actObj[key],\n });\n } else if (!(key in actObj)) {\n differences.push({\n path: `${path}.${key}`,\n kind: 'PROP_MISMATCH',\n message: `Missing expected prop key \"${key}\" at \"${path}\".`,\n expected: expObj[key],\n });\n } else {\n comparePropValues(`${path}.${key}`, expObj[key], actObj[key], differences, options);\n }\n }\n return;\n }\n\n // 5. Primitive equality check\n if (expected !== actual) {\n differences.push({\n path,\n kind: 'PROP_MISMATCH',\n message: `Value mismatch at \"${path}\": expected \"${String(expected)}\", got \"${String(actual)}\".`,\n expected,\n actual,\n });\n }\n}\n\n/**\n * Compares responsive styles across all breakpoints (base, desktop, tablet, mobile).\n */\nfunction compareStyles(\n nodePath: string,\n expected?: ResponsiveStyles,\n actual?: ResponsiveStyles,\n differences: SemanticDifference[] = [],\n): void {\n const breakpoints = ['base', 'desktop', 'tablet', 'mobile'] as const;\n const expStyles = expected || {};\n const actStyles = actual || {};\n\n for (const bp of breakpoints) {\n const expBp = (expStyles[bp] as StyleDefinition | undefined) || {};\n const actBp = (actStyles[bp] as StyleDefinition | undefined) || {};\n\n const allKeys = new Set([...Object.keys(expBp), ...Object.keys(actBp)]);\n for (const key of allKeys) {\n const expVal = expBp[key];\n const actVal = actBp[key];\n\n // Treat undefined and empty string as equivalent empty style values\n const expNorm = expVal === undefined || expVal === '' ? undefined : expVal;\n const actNorm = actVal === undefined || actVal === '' ? undefined : actVal;\n\n if (expNorm !== actNorm) {\n differences.push({\n path: `${nodePath}.styles.${bp}.${key}`,\n kind: 'STYLE_MISMATCH',\n message: `Style mismatch at \"${nodePath}.styles.${bp}.${key}\": expected \"${String(expVal)}\", got \"${String(actVal)}\".`,\n expected: expVal,\n actual: actVal,\n });\n }\n }\n }\n}\n\n/**\n * Recursively compares two component trees, strictly verifying node identity, order,\n * props, styles, and children.\n */\nfunction compareNodes(\n expected: Node,\n actual: Node,\n nodePath: string,\n differences: SemanticDifference[],\n options?: SemanticCompareOptions,\n): void {\n // 1. Check ID\n if (expected.id !== actual.id) {\n differences.push({\n path: `${nodePath}.id`,\n kind: 'NODE_MISSING',\n message: `Node ID mismatch at \"${nodePath}\": expected \"${expected.id}\", got \"${actual.id}\".`,\n expected: expected.id,\n actual: actual.id,\n });\n }\n\n // 2. Check Type\n if (expected.type !== actual.type) {\n differences.push({\n path: `${nodePath}.type`,\n kind: 'NODE_TYPE',\n message: `Node type mismatch for \"${expected.id}\": expected \"${expected.type}\", got \"${actual.type}\".`,\n expected: expected.type,\n actual: actual.type,\n });\n }\n\n // 3. Compare Props\n comparePropValues(`${nodePath}.props`, expected.props || {}, actual.props || {}, differences, options);\n\n // 4. Compare Styles\n compareStyles(nodePath, expected.styles, actual.styles, differences);\n\n // 5. Compare Children (Order and Content)\n const expChildren = expected.children || [];\n const actChildren = actual.children || [];\n\n if (expChildren.length !== actChildren.length) {\n differences.push({\n path: `${nodePath}.children`,\n kind: 'NODE_ORDER',\n message: `Children count mismatch for node \"${expected.id}\": expected ${expChildren.length}, got ${actChildren.length}.`,\n expected: expChildren.map((c) => c.id),\n actual: actChildren.map((c) => c.id),\n });\n }\n\n const maxLen = Math.max(expChildren.length, actChildren.length);\n for (let i = 0; i < maxLen; i++) {\n const expChild = expChildren[i];\n const actChild = actChildren[i];\n\n if (!expChild && actChild) {\n differences.push({\n path: `${nodePath}.children[${i}]`,\n kind: 'NODE_EXTRA',\n message: `Unexpected extra child node \"${actChild.id}\" at index ${i}.`,\n actual: actChild.id,\n });\n } else if (expChild && !actChild) {\n differences.push({\n path: `${nodePath}.children[${i}]`,\n kind: 'NODE_MISSING',\n message: `Missing child node \"${expChild.id}\" at index ${i}.`,\n expected: expChild.id,\n });\n } else if (expChild && actChild) {\n if (expChild.id !== actChild.id) {\n differences.push({\n path: `${nodePath}.children[${i}]`,\n kind: 'NODE_ORDER',\n message: `Node order mismatch at index ${i}: expected node \"${expChild.id}\", got \"${actChild.id}\".`,\n expected: expChild.id,\n actual: actChild.id,\n });\n }\n compareNodes(expChild, actChild, `${nodePath}.children[${i}](${expChild.id})`, differences, options);\n }\n }\n}\n\n/**\n * Semantically compares two PageDocuments, checking metadata, tree structure,\n * node order, props, responsive styles, bindings, action references, and asset mappings.\n *\n * Only documented transient fields (e.g. transient timestamps, host-generated asset IDs)\n * are ignored or normalized per options.\n */\nexport function compareDocumentsSemantically(\n expected: PageDocument,\n actual: PageDocument,\n options: SemanticCompareOptions = {},\n): SemanticComparisonResult {\n const differences: SemanticDifference[] = [];\n const { ignoreTimestamps = true } = options;\n\n // 1. Schema & Version check\n if (expected.schema !== actual.schema) {\n differences.push({\n path: 'schema',\n kind: 'METADATA_MISMATCH',\n message: `Schema mismatch: expected \"${expected.schema}\", got \"${actual.schema}\".`,\n expected: expected.schema,\n actual: actual.schema,\n });\n }\n if (expected.version !== actual.version) {\n differences.push({\n path: 'version',\n kind: 'METADATA_MISMATCH',\n message: `Schema version mismatch: expected \"${expected.version}\", got \"${actual.version}\".`,\n expected: expected.version,\n actual: actual.version,\n });\n }\n\n // 2. Metadata check\n const expMeta = expected.metadata || ({} as Record<string, unknown>);\n const actMeta = actual.metadata || ({} as Record<string, unknown>);\n const metaKeys = new Set([...Object.keys(expMeta), ...Object.keys(actMeta)]);\n\n for (const k of metaKeys) {\n if (ignoreTimestamps && (k === 'updatedAt' || k === 'createdAt')) {\n continue;\n }\n const expVal = (expMeta as Record<string, unknown>)[k];\n const actVal = (actMeta as Record<string, unknown>)[k];\n if (!deepEqual(expVal, actVal)) {\n differences.push({\n path: `metadata.${k}`,\n kind: 'METADATA_MISMATCH',\n message: `Metadata mismatch at \"metadata.${k}\": expected \"${String(expVal)}\", got \"${String(actVal)}\".`,\n expected: expVal,\n actual: actVal,\n });\n }\n }\n\n // 3. Tree comparison\n compareNodes(\n expected.document,\n actual.document,\n `root(${expected.document.id})`,\n differences,\n options,\n );\n\n return {\n equivalent: differences.length === 0,\n differences,\n };\n}\n\n/**\n * Semantically compares exported and imported package manifests.\n */\nexport function compareManifestsSemantically(\n expected: Manifest,\n actual: Manifest,\n options: SemanticCompareOptions = {},\n): SemanticComparisonResult {\n const differences: SemanticDifference[] = [];\n const { ignoreTimestamps = true } = options;\n\n if (expected.schema !== actual.schema) {\n differences.push({\n path: 'manifest.schema',\n kind: 'METADATA_MISMATCH',\n message: `Manifest schema mismatch: expected \"${expected.schema}\", got \"${actual.schema}\".`,\n expected: expected.schema,\n actual: actual.schema,\n });\n }\n\n if (expected.schemaVersion !== actual.schemaVersion) {\n differences.push({\n path: 'manifest.schemaVersion',\n kind: 'METADATA_MISMATCH',\n message: `Manifest schemaVersion mismatch: expected \"${expected.schemaVersion}\", got \"${actual.schemaVersion}\".`,\n expected: expected.schemaVersion,\n actual: actual.schemaVersion,\n });\n }\n\n // Compare requiredComponents\n const expComponents = new Set(expected.requiredComponents || []);\n const actComponents = new Set(actual.requiredComponents || []);\n for (const c of expComponents) {\n if (!actComponents.has(c)) {\n differences.push({\n path: 'manifest.requiredComponents',\n kind: 'DEPENDENCY_MISMATCH',\n message: `Missing required component in manifest: \"${c}\".`,\n expected: c,\n });\n }\n }\n for (const c of actComponents) {\n if (!expComponents.has(c)) {\n differences.push({\n path: 'manifest.requiredComponents',\n kind: 'DEPENDENCY_MISMATCH',\n message: `Unexpected extra required component in manifest: \"${c}\".`,\n actual: c,\n });\n }\n }\n\n // Compare requiredCapabilities\n const expCaps = new Set(expected.requiredCapabilities || []);\n const actCaps = new Set(actual.requiredCapabilities || []);\n for (const c of expCaps) {\n if (!actCaps.has(c)) {\n differences.push({\n path: 'manifest.requiredCapabilities',\n kind: 'DEPENDENCY_MISMATCH',\n message: `Missing required capability in manifest: \"${c}\".`,\n expected: c,\n });\n }\n }\n for (const c of actCaps) {\n if (!expCaps.has(c)) {\n differences.push({\n path: 'manifest.requiredCapabilities',\n kind: 'DEPENDENCY_MISMATCH',\n message: `Unexpected extra required capability in manifest: \"${c}\".`,\n actual: c,\n });\n }\n }\n\n // Compare assets\n if (expected.assets.length !== actual.assets.length) {\n differences.push({\n path: 'manifest.assets',\n kind: 'ASSET_MISMATCH',\n message: `Manifest asset count mismatch: expected ${expected.assets.length}, got ${actual.assets.length}.`,\n expected: expected.assets.length,\n actual: actual.assets.length,\n });\n }\n\n return {\n equivalent: differences.length === 0,\n differences,\n };\n}\n","import {\n TemplateRecordSchema,\n collectNodeIds,\n isTemplateRecord,\n type TemplateRecord,\n type TemplateRequirements,\n type PageDocument,\n type Node,\n} from '@kubuild/schema';\nimport { deepClone } from './command-tree-utils';\nimport { validateDocument } from './validator';\n\n/**\n * Standard core built-in component types\n */\nexport const CORE_BUILTIN_COMPONENTS = new Set([\n 'page',\n 'section',\n 'container',\n 'columns',\n 'column',\n 'heading',\n 'text',\n 'image',\n 'button',\n 'collection',\n]);\n\n/**\n * Structured validation error entry\n */\nexport interface TemplateValidationError {\n code: string;\n message: string;\n path: string;\n}\n\n/**\n * Result of template record validation\n */\nexport interface TemplateValidationResult {\n valid: boolean;\n data?: TemplateRecord;\n errors?: TemplateValidationError[];\n}\n\n/**\n * Validates a template record value against TemplateRecordSchema and returns structured errors.\n */\nexport function validateTemplate(value: unknown): TemplateValidationResult {\n const parseResult = TemplateRecordSchema.safeParse(value);\n\n if (parseResult.success) {\n return {\n valid: true,\n data: parseResult.data,\n };\n }\n\n const errors: TemplateValidationError[] = parseResult.error.issues.map((issue) => ({\n code: issue.code,\n message: issue.message,\n path: `/${issue.path.join('/')}`,\n }));\n\n return {\n valid: false,\n errors,\n };\n}\n\n/**\n * Helper to recursively collect all component types used in a node tree.\n */\nfunction collectComponentTypes(node: Node, types: Set<string>): void {\n if (node.type) {\n types.add(node.type);\n }\n if (node.children && Array.isArray(node.children)) {\n for (const child of node.children) {\n collectComponentTypes(child, types);\n }\n }\n}\n\n/**\n * Extracts required components and capabilities from a PageDocument.\n * Detects any custom/non-core component types used in the document tree.\n */\nexport function extractTemplateRequirements(\n doc: PageDocument,\n builtinComponents: Set<string> = CORE_BUILTIN_COMPONENTS\n): TemplateRequirements {\n const componentTypes = new Set<string>();\n if (doc?.document) {\n collectComponentTypes(doc.document, componentTypes);\n }\n\n const customComponents: string[] = [];\n for (const type of componentTypes) {\n if (!builtinComponents.has(type)) {\n customComponents.push(type);\n }\n }\n\n return {\n requiredComponents: customComponents.sort(),\n requiredCapabilities: [],\n };\n}\n\n/**\n * Parameters for creating a TemplateRecord\n */\nexport interface CreateTemplateParams {\n id: string;\n name: string;\n description?: string;\n category?: string;\n tags?: string[];\n thumbnail?: TemplateRecord['thumbnail'];\n author?: string;\n version?: string;\n document?: PageDocument;\n packageReference?: TemplateRecord['packageReference'];\n requirements?: TemplateRequirements;\n createdAt?: string;\n updatedAt?: string;\n custom?: Record<string, unknown>;\n}\n\n/**\n * Creates and validates a TemplateRecord.\n * Automatically extracts requirements from the embedded document if requirements are not explicitly supplied.\n */\nexport function createTemplateRecord(params: CreateTemplateParams): TemplateRecord {\n const now = new Date().toISOString();\n\n let requirements = params.requirements;\n if (!requirements && params.document) {\n requirements = extractTemplateRequirements(params.document);\n }\n\n const candidate: TemplateRecord = {\n id: params.id,\n name: params.name,\n description: params.description ?? '',\n category: params.category ?? 'general',\n tags: params.tags ?? [],\n thumbnail: params.thumbnail,\n author: params.author ?? '',\n version: params.version ?? '1.0.0',\n document: params.document,\n packageReference: params.packageReference,\n requirements: requirements ?? { requiredComponents: [], requiredCapabilities: [] },\n createdAt: params.createdAt ?? now,\n updatedAt: params.updatedAt ?? now,\n custom: params.custom,\n };\n\n const validation = validateTemplate(candidate);\n if (!validation.valid || !validation.data) {\n const errorDetails = validation.errors?.map((e) => `${e.path}: ${e.message}`).join(', ');\n throw new Error(`Invalid template record: ${errorDetails}`);\n }\n\n return validation.data;\n}\n\n/**\n * Required metadata parameters for saving a draft as a template.\n * id and name are strictly required and non-empty.\n */\nexport interface SaveTemplateMetadata {\n id: string;\n name: string;\n description?: string;\n category?: string;\n tags?: string[];\n thumbnail?: TemplateRecord['thumbnail'];\n author?: string;\n version?: string;\n custom?: Record<string, unknown>;\n}\n\nexport interface SaveDraftAsTemplateOptions {\n validateDraft?: boolean;\n requirements?: TemplateRequirements;\n}\n\n/**\n * Exports a draft document snapshot as an immutable reusable TemplateRecord.\n * - Requires mandatory metadata (id, name).\n * - Validates draft document structure.\n * - Extracts component/capability requirements.\n * - Creates a deep-cloned immutable snapshot completely decoupled from the active draft.\n */\nexport function saveDraftAsTemplate(\n draft: PageDocument,\n metadata: SaveTemplateMetadata,\n options: SaveDraftAsTemplateOptions = {}\n): TemplateRecord {\n if (!metadata || typeof metadata !== 'object') {\n throw new Error('Save as template requires metadata with id and name.');\n }\n\n const cleanId = metadata.id?.trim();\n if (!cleanId) {\n throw new Error('Template ID is required and cannot be empty.');\n }\n\n const cleanName = metadata.name?.trim();\n if (!cleanName) {\n throw new Error('Template name is required and cannot be empty.');\n }\n\n if (!draft || !draft.document) {\n throw new Error('Invalid draft document: document tree is missing.');\n }\n\n if (options.validateDraft !== false) {\n const validation = validateDocument(draft);\n if (!validation.valid) {\n const errorMsg = validation.errors.map((e) => `${e.path}: ${e.message}`).join('; ');\n throw new Error(`Cannot save invalid draft as template: ${errorMsg}`);\n }\n }\n\n // Deep clone to guarantee the template snapshot is isolated from future draft edits\n const draftSnapshot: PageDocument = deepClone(draft);\n\n return createTemplateRecord({\n id: cleanId,\n name: cleanName,\n description: metadata.description?.trim() ?? '',\n category: metadata.category?.trim() ?? 'general',\n tags: metadata.tags ? [...metadata.tags] : [],\n thumbnail: metadata.thumbnail,\n author: metadata.author?.trim() ?? '',\n version: metadata.version?.trim() ?? '1.0.0',\n document: draftSnapshot,\n requirements: options.requirements,\n custom: metadata.custom ? deepClone(metadata.custom) : undefined,\n });\n}\n\n/**\n * Options for cloning/instantiating a template into a new page document.\n */\nexport interface CloneTemplateOptions {\n /**\n * Title for the newly created page document. Defaults to template name or document title.\n */\n title?: string;\n /**\n * Author for the newly created page document.\n */\n author?: string;\n /**\n * Optional custom ID generator function for node duplication.\n */\n idGenerator?: (oldId: string, node: Node) => string;\n /**\n * Custom ID prefix for freshly generated node IDs. Defaults to random string / timestamp.\n */\n idPrefix?: string;\n /**\n * Whether to record origin template metadata in metadata.custom.originTemplate (defaults to true).\n */\n recordOrigin?: boolean;\n /**\n * Additional custom metadata for the new document.\n */\n customMetadata?: Record<string, unknown>;\n}\n\n/**\n * Recursively clone a node tree, regenerating 100% fresh unique node IDs for every node\n * including root page node and all descendants, while strictly preserving props and styles.\n */\nfunction cloneTreeWithFreshIds(\n root: Node,\n idGen: (oldId: string, node: Node) => string\n): Node {\n function cloneRec(node: Node): Node {\n const newId = idGen(node.id, node);\n const clonedProps = node.props ? deepClone(node.props) : undefined;\n const clonedStyles = node.styles ? deepClone(node.styles) : undefined;\n const clonedChildren = node.children\n ? node.children.map((child) => cloneRec(child))\n : [];\n\n return {\n id: newId,\n type: node.type,\n ...(clonedProps ? { props: clonedProps } : {}),\n ...(clonedStyles ? { styles: clonedStyles } : {}),\n children: clonedChildren,\n };\n }\n\n return cloneRec(root);\n}\n\n/**\n * Clones a template (or existing document) into a brand new PageDocument.\n * - Generates ALL NEW node IDs across the entire tree (root page node and all children).\n * - Ensures 100% ID difference from the source template.\n * - Sets fresh creation/update timestamps.\n * - Preserves origin template version/id in custom metadata.\n * - Guarantees full memory and reference isolation from the template source.\n */\nexport function cloneTemplateAsPage(\n templateOrDoc: TemplateRecord | PageDocument,\n options: CloneTemplateOptions = {}\n): PageDocument {\n let sourceDoc: PageDocument;\n let templateOrigin: { id: string; name: string; version: string } | null = null;\n\n if (isTemplateRecord(templateOrDoc)) {\n if (!templateOrDoc.document) {\n throw new Error(\n `Template \"${templateOrDoc.name}\" (${templateOrDoc.id}) does not contain an inline document snapshot to clone from.`\n );\n }\n sourceDoc = templateOrDoc.document;\n templateOrigin = {\n id: templateOrDoc.id,\n name: templateOrDoc.name,\n version: templateOrDoc.version ?? '1.0.0',\n };\n } else if ('schema' in templateOrDoc && 'document' in templateOrDoc) {\n sourceDoc = templateOrDoc;\n } else {\n throw new Error('Invalid input: expected a TemplateRecord or PageDocument.');\n }\n\n const existingIdsInSource = new Set(collectNodeIds(sourceDoc.document));\n const assignedNewIds = new Set<string>();\n\n // Determine unique seed prefix for this clone instance\n const prefix = options.idPrefix || `page_${Date.now().toString(36)}_${Math.random().toString(36).substring(2, 6)}`;\n let counter = 1;\n\n const defaultIdGen = (oldId: string, node: Node): string => {\n // Generate an ID that is guaranteed never to match oldId or any existing ID in source\n let candidate = `${node.type}_${prefix}_${counter}`;\n while (existingIdsInSource.has(candidate) || assignedNewIds.has(candidate)) {\n counter++;\n candidate = `${node.type}_${prefix}_${counter}`;\n }\n counter++;\n assignedNewIds.add(candidate);\n return candidate;\n };\n\n const idGen = options.idGenerator || defaultIdGen;\n\n const clonedRootNode = cloneTreeWithFreshIds(sourceDoc.document, idGen);\n\n // Guarantee root node type is 'page'\n const rootPageNode: Node & { type: 'page' } = {\n ...clonedRootNode,\n type: 'page',\n };\n\n const now = new Date().toISOString();\n const pageTitle =\n options.title ??\n (templateOrigin ? `${templateOrigin.name}` : sourceDoc.metadata?.title ?? 'Untitled Page');\n\n const customMetadata: Record<string, unknown> = {\n ...(sourceDoc.metadata?.custom ? deepClone(sourceDoc.metadata.custom) : {}),\n ...(options.customMetadata ? deepClone(options.customMetadata) : {}),\n };\n\n if (options.recordOrigin !== false && templateOrigin) {\n customMetadata.originTemplate = templateOrigin;\n }\n\n const newDoc: PageDocument = {\n schema: sourceDoc.schema,\n version: sourceDoc.version,\n metadata: {\n title: pageTitle,\n description: sourceDoc.metadata?.description ?? '',\n author: options.author ?? sourceDoc.metadata?.author ?? '',\n tags: sourceDoc.metadata?.tags ? [...sourceDoc.metadata.tags] : [],\n category: sourceDoc.metadata?.category ?? 'general',\n version: '1.0.0',\n createdAt: now,\n updatedAt: now,\n custom: customMetadata,\n },\n document: rootPageNode,\n };\n\n return newDoc;\n}\n\n/**\n * Helper to verify that two PageDocuments share ZERO overlapping node IDs.\n */\nexport function areNodeIdsCompletelyDistinct(docA: PageDocument, docB: PageDocument): boolean {\n if (!docA?.document || !docB?.document) return true;\n const idsA = new Set(collectNodeIds(docA.document));\n const idsB = collectNodeIds(docB.document);\n\n for (const id of idsB) {\n if (idsA.has(id)) {\n return false;\n }\n }\n return true;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACOA,IAAM,yBAAyB,oBAAI,IAAI,CAAC,aAAa,eAAe,WAAW,CAAC;AASzE,SAAS,eACd,SACA,SACgB;AAChB,QAAM,WAAW,QAAQ,IAAI,MAAM,GAAG,EAAE,OAAO,OAAO;AACtD,MAAI,UAAmB,SAAS;AAEhC,aAAW,WAAW,UAAU;AAC9B,QAAI,uBAAuB,IAAI,OAAO,GAAG;AACvC,aAAO,mBAAmB,OAAO;AAAA,IACnC;AACA,QAAI,YAAY,QAAQ,OAAO,YAAY,UAAU;AACnD,aAAO,mBAAmB,OAAO;AAAA,IACnC;AACA,QAAI,CAAC,OAAO,UAAU,eAAe,KAAK,SAAS,OAAO,GAAG;AAC3D,aAAO,mBAAmB,OAAO;AAAA,IACnC;AACA,cAAW,QAAoC,OAAO;AAAA,EACxD;AAEA,MAAI,YAAY,UAAa,OAAO,YAAY,YAAY;AAC1D,WAAO,mBAAmB,OAAO;AAAA,EACnC;AAEA,SAAO,EAAE,QAAQ,YAAY,OAAO,QAAQ;AAC9C;AAEA,SAAS,mBAAmB,SAA4D;AACtF,MAAI,QAAQ,aAAa,QAAW;AAClC,WAAO,EAAE,QAAQ,YAAY,OAAO,QAAQ,SAAS;AAAA,EACvD;AACA,SAAO,EAAE,QAAQ,SAAS,OAAO,GAAG;AACtC;AAGO,SAAS,oBACd,SACA,SACS;AACT,SAAO,eAAe,SAAS,OAAO,EAAE;AAC1C;;;AClDA,IAAMA,0BAAyB,oBAAI,IAAI,CAAC,aAAa,eAAe,WAAW,CAAC;AAQzE,SAAS,gCAAgC,SAAoD;AAClG,QAAM,SAAkC,CAAC;AACzC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,aAAW,SAAS,SAAS;AAC3B,UAAM,WAAW,MAAM,IAAI,MAAM,GAAG,EAAE,OAAO,OAAO;AACpD,QAAI,SAAS,WAAW,KAAK,SAAS,KAAK,CAAC,YAAYA,wBAAuB,IAAI,OAAO,CAAC,GAAG;AAC5F;AAAA,IACF;AAEA,QAAI,SAAkC;AACtC,aAAS,IAAI,GAAG,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG;AAC/C,YAAM,UAAU,SAAS,CAAC;AAC1B,YAAM,WAAW,OAAO,OAAO;AAC/B,UAAI,aAAa,QAAQ,OAAO,aAAa,YAAY,MAAM,QAAQ,QAAQ,GAAG;AAChF,eAAO,OAAO,IAAI,CAAC;AAAA,MACrB;AACA,eAAS,OAAO,OAAO;AAAA,IACzB;AACA,WAAO,SAAS,SAAS,SAAS,CAAC,CAAC,IAAI,MAAM;AAAA,EAChD;AAEA,SAAO;AACT;;;ACvCA,oBAIO;;;ACuDA,IAAM,mCAAqE;AAAA,EAChF,cAAc;AAAA,EACd,cAAc;AAAA,EACd,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,sBAAsB,KAAK,OAAO;AAAA;AAAA,EAClC,mBAAmB,CAAC,SAAS,UAAU,WAAW,QAAQ,KAAK,YAAY,aAAa;AAAA,EACxF,wBAAwB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,2BAA2B;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,sBAAsB;AACxB;AAuBO,SAAS,UACd,KACA,SAMS;AACT,MAAI,OAAO,QAAQ,SAAU,QAAO;AAEpC,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,QAAQ,WAAW,EAAG,QAAO;AAGjC,MACE,QAAQ,WAAW,GAAG,KACtB,QAAQ,WAAW,GAAG,KACtB,QAAQ,WAAW,IAAI,KACvB,QAAQ,WAAW,KAAK,KACxB,QAAQ,WAAW,GAAG,GACtB;AACA,WAAO;AAAA,EACT;AAGA,MAAI,+BAA+B,KAAK,OAAO,GAAG;AAChD,WAAO;AAAA,EACT;AAGA,QAAM,aAAa,QAAQ,QAAQ,GAAG;AACtC,MAAI,eAAe,IAAI;AAErB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,QAAQ,UAAU,GAAG,aAAa,CAAC,EAAE,YAAY;AAGhE,QAAM,mBAAmB,CAAC,eAAe,aAAa,SAAS,OAAO;AACtE,MAAI,WAAW,WAAW,iBAAiB,SAAS,MAAM,GAAG;AAI3D,QAAI,WAAW,WAAW,SAAS,gBAAgB;AACjD,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAGA,MAAI,WAAW,SAAS;AACtB,UAAM,iBAAiB,SAAS,kBAAkB;AAClD,QAAI,CAAC,eAAgB,QAAO;AAG5B,UAAM,aAAa,QAAQ,UAAU,GAAG,EAAE,EAAE,YAAY;AACxD,UAAM,wBAAwB;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO,sBAAsB,KAAK,CAAC,MAAM,WAAW,WAAW,CAAC,CAAC;AAAA,EACnE;AAGA,QAAM,UAAU,SAAS,kBAAkB,iCAAiC;AAC5E,SAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,YAAY,MAAM,MAAM;AACvD;AAKO,SAAS,YACd,KACA,WAAmB,IACnB,SACQ;AACR,MAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,SAAO,UAAU,KAAK,OAAO,IAAI,MAAM;AACzC;AAKO,SAAS,uBACd,KACA,iBAA2B,iCAAiC,wBACb;AAC/C,QAAM,gBAAgB,IAAI,IAAI,eAAe,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AACxE,QAAM,UAAU,oBAAI,QAAgB;AAEpC,WAAS,MAAM,OAAgB,aAAoE;AACjG,QAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,aAAO,EAAE,OAAO,OAAO,MAAM,IAAI,KAAK,GAAG;AAAA,IAC3C;AAEA,QAAI,QAAQ,IAAI,KAAK,GAAG;AACtB,aAAO,EAAE,OAAO,OAAO,MAAM,IAAI,KAAK,GAAG;AAAA,IAC3C;AACA,YAAQ,IAAI,KAAK;AAEjB,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,cAAM,MAAM,MAAM,MAAM,CAAC,GAAG,GAAG,WAAW,IAAI,CAAC,GAAG;AAClD,YAAI,IAAI,MAAO,QAAO;AAAA,MACxB;AACA,aAAO,EAAE,OAAO,OAAO,MAAM,IAAI,KAAK,GAAG;AAAA,IAC3C;AAEA,UAAM,SAAS;AACf,UAAM,cAAc,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,MAAM,GAAG,GAAG,OAAO,oBAAoB,MAAM,CAAC,CAAC,CAAC;AAEvG,eAAW,OAAO,aAAa;AAC7B,UAAI,cAAc,IAAI,IAAI,YAAY,CAAC,GAAG;AACxC,eAAO,EAAE,OAAO,MAAM,MAAM,cAAc,GAAG,WAAW,IAAI,GAAG,KAAK,KAAK,IAAI;AAAA,MAC/E;AACA,YAAM,MAAM,MAAM,OAAO,GAAG,GAAG,cAAc,GAAG,WAAW,IAAI,GAAG,KAAK,GAAG;AAC1E,UAAI,IAAI,MAAO,QAAO;AAAA,IACxB;AAGA,QAAI,OAAO,UAAU,eAAe,KAAK,QAAQ,WAAW,GAAG;AAC7D,aAAO,EAAE,OAAO,MAAM,MAAM,cAAc,GAAG,WAAW,eAAe,aAAa,KAAK,YAAY;AAAA,IACvG;AAEA,WAAO,EAAE,OAAO,OAAO,MAAM,IAAI,KAAK,GAAG;AAAA,EAC3C;AAEA,SAAO,MAAM,KAAK,EAAE;AACtB;AAKO,SAAS,yBACd,KACA,cACgD;AAChD,QAAM,SAAS,EAAE,GAAG,kCAAkC,GAAG,aAAa;AACtE,QAAM,SAA8B,CAAC;AAErC,MAAI,CAAC,OAAO,OAAO,QAAQ,UAAU;AACnC,WAAO,EAAE,MAAM,MAAM,QAAQ,CAAC,EAAE;AAAA,EAClC;AAGA,QAAM,aAAa,uBAAuB,KAAK,OAAO,sBAAsB;AAC5E,MAAI,WAAW,OAAO;AACpB,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS,4BAA4B,WAAW,GAAG,uBAAuB,WAAW,IAAI;AAAA,MACzF,MAAM,WAAW;AAAA,MACjB,SAAS,EAAE,KAAK,WAAW,IAAI;AAAA,IACjC,CAAC;AAAA,EACH;AAGA,MAAI;AACF,UAAM,UAAU,KAAK,UAAU,GAAG;AAClC,QAAI,QAAQ,SAAS,OAAO,sBAAsB;AAChD,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,kBAAkB,QAAQ,MAAM,4BAA4B,OAAO,oBAAoB;AAAA,QAChG,SAAS,EAAE,MAAM,QAAQ,QAAQ,OAAO,OAAO,qBAAqB;AAAA,MACtE,CAAC;AAAA,IACH;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,QAAM,SAAS;AACf,QAAM,WAAW,OAAO;AAExB,MAAI,YAAY,OAAO,aAAa,UAAU;AAG5C,QAASC,YAAT,SAAkB,MAAe,OAAe,aAA2B;AACzE,UAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,EAAG;AAE9D;AACA,UAAI,aAAa,OAAO,cAAc;AACpC,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,yBAAyB,UAAU,gCAAgC,OAAO,YAAY;AAAA,UAC/F,MAAM;AAAA,UACN,SAAS,EAAE,WAAW,YAAY,OAAO,OAAO,aAAa;AAAA,QAC/D,CAAC;AACD;AAAA,MACF;AAEA,UAAI,QAAQ,OAAO,cAAc;AAC/B,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,2BAA2B,KAAK,gCAAgC,OAAO,YAAY;AAAA,UAC5F,MAAM;AAAA,UACN,SAAS,EAAE,OAAO,OAAO,OAAO,aAAa;AAAA,QAC/C,CAAC;AACD;AAAA,MACF;AAEA,YAAM,aAAa;AAGnB,UAAI,WAAW,SAAS,OAAO,WAAW,UAAU,YAAY,CAAC,MAAM,QAAQ,WAAW,KAAK,GAAG;AAChG,cAAM,cAAc,WAAW;AAC/B,cAAM,WAAW,OAAO,KAAK,WAAW;AAExC,YAAI,SAAS,SAAS,OAAO,eAAe;AAC1C,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,SAAS,YAAY,SAAS,MAAM,8BAA8B,OAAO,aAAa;AAAA,YACtF,MAAM,GAAG,WAAW;AAAA,YACpB,SAAS,EAAE,OAAO,SAAS,QAAQ,OAAO,OAAO,cAAc;AAAA,UACjE,CAAC;AAAA,QACH;AAEA,mBAAW,CAAC,GAAG,GAAG,KAAK,OAAO,QAAQ,WAAW,GAAG;AAClD,cAAI,OAAO,QAAQ,YAAY,IAAI,SAAS,OAAO,iBAAiB;AAClE,mBAAO,KAAK;AAAA,cACV,MAAM;AAAA,cACN,SAAS,SAAS,CAAC,oBAAoB,IAAI,MAAM,sBAAsB,OAAO,eAAe;AAAA,cAC7F,MAAM,GAAG,WAAW,UAAU,CAAC;AAAA,cAC/B,SAAS,EAAE,QAAQ,IAAI,QAAQ,OAAO,OAAO,gBAAgB;AAAA,YAC/D,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAGA,UAAI,WAAW,YAAY,MAAM,QAAQ,WAAW,QAAQ,GAAG;AAC7D,YAAI,WAAW,SAAS,SAAS,OAAO,oBAAoB;AAC1D,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,SAAS,YAAY,WAAW,SAAS,MAAM,wCAAwC,OAAO,kBAAkB;AAAA,YAChH,MAAM,GAAG,WAAW;AAAA,YACpB,SAAS,EAAE,OAAO,WAAW,SAAS,QAAQ,OAAO,OAAO,mBAAmB;AAAA,UACjF,CAAC;AAAA,QACH;AAEA,iBAAS,IAAI,GAAG,IAAI,WAAW,SAAS,QAAQ,KAAK;AACnD,UAAAA,UAAS,WAAW,SAAS,CAAC,GAAG,QAAQ,GAAG,GAAG,WAAW,aAAa,CAAC,EAAE;AAAA,QAC5E;AAAA,MACF;AAAA,IACF;AAnES,mBAAAA;AAFT,QAAI,aAAa;AAuEjB,IAAAA,UAAS,UAAU,GAAG,WAAW;AAAA,EACnC;AAEA,SAAO;AAAA,IACL,MAAM,OAAO,WAAW;AAAA,IACxB;AAAA,EACF;AACF;AAKO,SAAS,yBACd,UACA,uBAAiC,iCAAiC,2BACzD;AACT,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AAEtD,QAAM,QAAQ,SAAS,YAAY,EAAE,KAAK;AAG1C,SAAO,qBAAqB,KAAK,CAAC,QAAQ;AACxC,UAAM,WAAW,IAAI,YAAY;AACjC,WAAO,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,GAAG,QAAQ,GAAG;AAAA,EAClE,CAAC;AACH;AAKO,SAAS,aACd,gBACA,kBACA,WAAmB,iCAAiC,sBAC3C;AACT,MAAI,kBAAkB,EAAG,QAAO;AAEhC,MAAI,mBAAmB,KAAK,OAAO,MAAM;AACvC,UAAM,QAAQ,mBAAmB;AACjC,WAAO,QAAQ;AAAA,EACjB;AACA,SAAO;AACT;AAOO,SAAS,aAAa,SAA0B;AACrD,MAAI,OAAO,YAAY,SAAU,QAAO;AACxC,MAAI,OAAO;AAGX,SAAO,KAAK,QAAQ,uDAAuD,EAAE;AAG7E,SAAO,KAAK,QAAQ,iDAAiD,EAAE;AAGvE,SAAO,KAAK,QAAQ,wDAAwD,EAAE;AAG9E,SAAO,KAAK;AAAA,IACV;AAAA,IACA;AAAA,EACF;AACA,SAAO,KAAK;AAAA,IACV;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AACT;;;AD1XO,SAAS,iBACd,OACA,UAA6B,CAAC,GACJ;AAC1B,QAAM,SAAoC,CAAC;AAG3C,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,WAAO;AAAA,MACL,OAAO;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,QACN;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,UACT,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,MAAM;AAGZ,QAAM,gBAAgB,yBAAyB,KAAK,QAAQ,cAAc;AAC1E,MAAI,CAAC,cAAc,MAAM;AACvB,eAAW,UAAU,cAAc,QAAQ;AACzC,aAAO,KAAK;AAAA,QACV,MAAM,OAAO,SAAS,iCAClB,iCACA;AAAA,QACJ,SAAS,OAAO;AAAA,QAChB,MAAM,OAAO,QAAQ;AAAA,QACrB,SAAS,OAAO;AAAA,MAClB,CAAC;AAAA,IACH;AACA,QAAI,cAAc,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,8BAA8B,GAAG;AAC/E,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,IAAI,WAAW,2BAAa;AAC9B,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS,wCAAwC,yBAAW,gBAAgB,OAAO,IAAI,MAAM,CAAC;AAAA,MAC9F,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,IAAI,YAAY,YAAY,IAAI,QAAQ,KAAK,EAAE,WAAW,GAAG;AACtE,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,IAAI,YAAY,OAAO,IAAI,aAAa,YAAY,MAAM,QAAQ,IAAI,QAAQ,GAAG;AACpF,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AACD,WAAO;AAAA,MACL,OAAO;AAAA,MACP,SAAS;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,IAAI;AAGrB,MAAI,SAAS,SAAS,QAAQ;AAC5B,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS,4CAA4C,OAAO,SAAS,IAAI,CAAC;AAAA,MAC1E,MAAM;AAAA,MACN,QAAQ,OAAO,SAAS,OAAO,WAAW,SAAS,KAAK;AAAA,IAC1D,CAAC;AAAA,EACH;AAGA,MAAI,IAAI,aAAa,QAAW;AAC9B,QAAI,OAAO,IAAI,aAAa,YAAY,IAAI,aAAa,QAAQ,MAAM,QAAQ,IAAI,QAAQ,GAAG;AAC5F,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH,OAAO;AACL,YAAM,OAAO,IAAI;AACjB,UAAI,KAAK,UAAU,WAAc,OAAO,KAAK,UAAU,YAAY,KAAK,MAAM,KAAK,EAAE,WAAW,IAAI;AAClG,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS;AAAA,UACT,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,QAAM,UAAU,oBAAI,IAAoB;AACxC,QAAM,iBAAiB,oBAAI,IAAY;AAEvC;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,YAAY,iCAAmB,UAAU,KAAK;AACpD,QAAI,CAAC,UAAU,SAAS;AACtB,iBAAW,SAAS,UAAU,MAAM,QAAQ;AAC1C,cAAM,WAAW,MAAM,MAAM,KAAK,KAAK,GAAG;AAC1C,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,MAAM;AAAA,UACf,MAAM,aAAa,MAAM,KAAK;AAAA,QAChC,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AACL,aAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,QAAQ,CAAC;AAAA,QACT,MAAM,UAAU;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB,SAAS,OAAO,WAAW;AAAA,IAC3B;AAAA,EACF;AACF;AAEA,SAAS,sBACP,SACA,aACA,YACA,SACA,gBACA,SACA,QACM;AAEN,MAAI,eAAe,IAAI,OAAO,GAAG;AAC/B,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS,0CAA0C,WAAW;AAAA,MAC9D,MAAM;AAAA,MACN,QAAQ,OAAO,QAAQ,OAAO,WAAW,QAAQ,KAAK;AAAA,IACxD,CAAC;AACD;AAAA,EACF;AACA,iBAAe,IAAI,OAAO;AAG1B,QAAM,SAAS,QAAQ;AACvB,MAAI,OAAO,WAAW,YAAY,OAAO,KAAK,EAAE,WAAW,GAAG;AAC5D,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM,GAAG,WAAW;AAAA,IACtB,CAAC;AAAA,EACH,OAAO;AACL,QAAI,QAAQ,IAAI,MAAM,GAAG;AACvB,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,sBAAsB,MAAM,cAAc,WAAW,mBAAmB,QAAQ,IAAI,MAAM,CAAC;AAAA,QACpG,MAAM,GAAG,WAAW;AAAA,QACpB;AAAA,QACA,SAAS,EAAE,aAAa,QAAQ,IAAI,MAAM,EAAE;AAAA,MAC9C,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,IAAI,QAAQ,WAAW;AAAA,IACjC;AAAA,EACF;AAGA,QAAM,WAAW,QAAQ;AACzB,MAAI,OAAO,aAAa,YAAY,SAAS,KAAK,EAAE,WAAW,GAAG;AAChE,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM,GAAG,WAAW;AAAA,MACpB,QAAQ,OAAO,WAAW,WAAW,SAAS;AAAA,IAChD,CAAC;AAAA,EACH;AAEA,QAAM,kBAAkB,OAAO,WAAW,WAAW,SAAS;AAC9D,QAAM,oBAAoB,OAAO,aAAa,WAAW,WAAW;AAGpE,MAAI;AACJ,MAAI,mBAAmB;AACrB,QAAI,QAAQ,mBAAmB;AAC7B,qBAAe,QAAQ,kBAAkB,IAAI,iBAAiB;AAC9D,UAAI,CAAC,iBAAiB,QAAQ,wBAAwB,CAAC,QAAQ,kBAAkB,IAAI,iBAAiB,IAAI;AACxG,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,4BAA4B,iBAAiB;AAAA,UACtD,MAAM,GAAG,WAAW;AAAA,UACpB,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF,WAAW,QAAQ,qBAAqB;AACtC,YAAM,UAAU,MAAM,QAAQ,QAAQ,mBAAmB,IACrD,QAAQ,oBAAoB,SAAS,iBAAiB,IACtD,QAAQ,oBAAoB,IAAI,iBAAiB;AAErD,UAAI,CAAC,WAAW,QAAQ,sBAAsB;AAC5C,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,4BAA4B,iBAAiB;AAAA,UACtD,MAAM,GAAG,WAAW;AAAA,UACpB,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,QAAM,WAAW,QAAQ;AACzB,MAAI,aAAa,QAAW;AAC1B,QAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG;AAC5B,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM,GAAG,WAAW;AAAA,QACpB,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,OAAO;AACL,UAAI,gBAAgB,aAAa,oBAAoB,SAAS,SAAS,SAAS,GAAG;AACjF,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,cAAc,iBAAiB,yCAAyC,SAAS,MAAM;AAAA,UAChG,MAAM,GAAG,WAAW;AAAA,UACpB,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAEA,UAAI,cAAc,cAAc,mBAAmB,SAAS,WAAW,IAAI,GAAG;AAC5E,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,cAAc,iBAAiB,2BAA2B,WAAW,IAAI;AAAA,UAClF,MAAM;AAAA,UACN,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAEA,eAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,cAAM,QAAQ,SAAS,CAAC;AACxB,cAAM,YAAY,GAAG,WAAW,aAAa,CAAC;AAE9C,YAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,SAAS,kBAAkB,CAAC;AAAA,YAC5B,MAAM;AAAA,YACN,QAAQ;AAAA,UACV,CAAC;AACD;AAAA,QACF;AAEA,cAAM,cAAc;AACpB,cAAM,YAAY,OAAO,YAAY,SAAS,WAAW,YAAY,OAAO;AAC5E,cAAM,eAAe,CAAC,QAAQ,qBAAqB,QAAQ,kBAAkB,IAAI,SAAS;AAC1F,cAAM,gBAAgB,QAAQ,mBAAmB,IAAI,SAAS,GAAG;AAEjE,YACE,cAAc,mBACd,aACA,gBACA,CAAC,aAAa,gBAAgB,SAAS,SAAS,KAChD,CAAC,aAAa,gBAAgB,SAAS,GAAG,KAC1C,EAAE,iBAAiB,aAAa,gBAAgB,SAAS,aAAa,IACtE;AACA,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,SAAS,mBAAmB,SAAS,mCAAmC,iBAAiB,qBAAqB,aAAa,gBAAgB,KAAK,IAAI,CAAC;AAAA,YACrJ,MAAM,GAAG,SAAS;AAAA,YAClB,QAAQ,OAAO,YAAY,OAAO,WAAW,YAAY,KAAK;AAAA,UAChE,CAAC;AAAA,QACH;AAEA;AAAA,UACE;AAAA,UACA;AAAA,UACA,EAAE,IAAI,mBAAmB,IAAI,MAAM,kBAAkB;AAAA,UACrD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ,UAAU,QAAW;AAC/B,QAAI,OAAO,QAAQ,UAAU,YAAY,QAAQ,UAAU,QAAQ,MAAM,QAAQ,QAAQ,KAAK,GAAG;AAC/F,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM,GAAG,WAAW;AAAA,QACpB,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,OAAO;AACL;AAAA,QACE,QAAQ;AAAA,QACR,GAAG,WAAW;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ,WAAW,QAAW;AAChC,QAAI,OAAO,QAAQ,WAAW,YAAY,QAAQ,WAAW,QAAQ,MAAM,QAAQ,QAAQ,MAAM,GAAG;AAClG,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM,GAAG,WAAW;AAAA,QACpB,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAKA,SAAS,sBACP,UACA,WACA,QACA,SACA,QACM;AACN,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,UAAM,cAAc,GAAG,SAAS,IAAI,GAAG;AAEvC,QAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,YAAI,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,GAAG;AAC5D;AAAA,YACE;AAAA,YACA,GAAG,WAAW,IAAI,KAAK;AAAA,YACvB;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,UAAM,SAAS;AAGf,QAAI,OAAO,SAAS,SAAS;AAC3B,UAAI,OAAO,OAAO,YAAY,YAAY,OAAO,QAAQ,KAAK,EAAE,WAAW,GAAG;AAC5E,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS;AAAA,UACT,MAAM,GAAG,WAAW;AAAA,UACpB;AAAA,QACF,CAAC;AAAA,MACH;AACA,UAAI,OAAO,gBAAgB,UAAa,OAAO,OAAO,gBAAgB,UAAU;AAC9E,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS;AAAA,UACT,MAAM,GAAG,WAAW;AAAA,UACpB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,WAES,OAAO,SAAS,YAAY;AACnC,UAAI,OAAO,OAAO,QAAQ,YAAY,OAAO,IAAI,KAAK,EAAE,WAAW,GAAG;AACpE,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS;AAAA,UACT,MAAM,GAAG,WAAW;AAAA,UACpB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,WAES,QAAQ,YAAa,OAAO,OAAO,SAAS,YAAY,OAAO,YAAY,QAAY;AAC9F,UAAI,OAAO,OAAO,SAAS,YAAY,OAAO,KAAK,KAAK,EAAE,WAAW,GAAG;AACtE,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS;AAAA,UACT,MAAM,GAAG,WAAW;AAAA,UACpB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AAEL,4BAAsB,QAAQ,aAAa,QAAQ,SAAS,MAAM;AAAA,IACpE;AAAA,EACF;AACF;;;AE7eA,IAAAC,iBAAgD;AAczC,SAAS,oBAAoB,QAAQ,iBAA+B;AACzE,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,UAAU;AAAA,MACR;AAAA,MACA,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,MAAM,CAAC;AAAA,MACP,UAAU;AAAA,MACV,SAAS;AAAA,MACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAAA,IACA,UAAU;AAAA,MACR,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,OAAO,EAAE,MAAM;AAAA,MACf,QAAQ,EAAE,MAAM,EAAE,WAAW,SAAS,iBAAiB,UAAU,EAAE;AAAA,MACnE,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AACF;AAEO,SAAS,aAAa,UAAgB,UAA+B;AAC1E,MAAI,SAAS,OAAO,SAAU,QAAO;AACrC,MAAI,CAAC,SAAS,SAAU,QAAO;AAC/B,aAAW,SAAS,SAAS,UAAU;AACrC,UAAM,QAAQ,aAAa,OAAO,QAAQ;AAC1C,QAAI,MAAO,QAAO;AAAA,EACpB;AACA,SAAO;AACT;AAkBO,SAAS,uBAAuB,UAA2C;AAChF,QAAM,UAAqC,CAAC;AAE5C,WAAS,cAAc,UAAmB,aAAqB,QAAsB;AACnF,QAAI,CAAC,YAAY,OAAO,aAAa,SAAU;AAE/C,QAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,eAAS,QAAQ,CAAC,MAAM,UAAU;AAChC,sBAAc,MAAM,GAAG,WAAW,IAAI,KAAK,IAAI,MAAM;AAAA,MACvD,CAAC;AACD;AAAA,IACF;AAEA,UAAM,SAAS;AAEf,QAAI,OAAO,SAAS,WAAW,OAAO,OAAO,YAAY,YAAY,OAAO,QAAQ,KAAK,EAAE,SAAS,GAAG;AACrG,cAAQ,KAAK;AAAA,QACX,SAAS,OAAO;AAAA,QAChB,WAAW;AAAA,UACT,MAAM;AAAA,UACN,SAAS,OAAO;AAAA,UAChB,UAAU,OAAO,OAAO,aAAa,WAAW,OAAO,WAAW;AAAA,UAClE,UAAU,OAAO,OAAO,aAAa,WAAW,OAAO,WAAW;AAAA,UAClE,aAAa,OAAO,OAAO,gBAAgB,WAAW,OAAO,cAAc;AAAA,QAC7E;AAAA,QACA;AAAA,QACA,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC/C,UAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,sBAAc,KAAK,GAAG,WAAW,IAAI,GAAG,IAAI,MAAM;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AAEA,WAAS,aAAa,MAAkB;AACtC,QAAI,KAAK,OAAO;AACd,oBAAc,KAAK,OAAO,aAAa,KAAK,EAAE,UAAU,KAAK,EAAE;AAAA,IACjE;AACA,QAAI,KAAK,YAAY,MAAM,QAAQ,KAAK,QAAQ,GAAG;AACjD,iBAAW,SAAS,KAAK,UAAU;AACjC,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEA,eAAa,QAAQ;AACrB,SAAO;AACT;AAUO,SAAS,4BACd,UACA,UACkB;AAClB,QAAM,qBAAqB,oBAAI,IAAY;AAC3C,QAAM,uBAAuB,oBAAI,IAAY;AAE7C,WAAS,SAAS,MAAkB;AAClC,QAAI,UAAU;AACZ,YAAM,MAAM,SAAS,IAAI,KAAK,IAAI;AAClC,UAAI,KAAK,aAAa,UAAU;AAC9B,2BAAmB,IAAI,KAAK,IAAI;AAAA,MAClC;AACA,UAAI,KAAK,gBAAgB,MAAM,QAAQ,IAAI,YAAY,GAAG;AACxD,mBAAW,OAAO,IAAI,cAAc;AAClC,+BAAqB,IAAI,GAAG;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,KAAK,YAAY,MAAM,QAAQ,KAAK,QAAQ,GAAG;AACjD,iBAAW,SAAS,KAAK,UAAU;AACjC,iBAAS,KAAK;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,WAAS,QAAQ;AAEjB,SAAO;AAAA,IACL,oBAAoB,MAAM,KAAK,kBAAkB,EAAE,KAAK;AAAA,IACxD,sBAAsB,MAAM,KAAK,oBAAoB,EAAE,KAAK;AAAA,EAC9D;AACF;AAMO,SAAS,qBACd,UACA,OACQ;AACR,MAAI,gBAAgB;AACpB,QAAM,cAAc,CAAC,OAAmC;AACtD,QAAI,iBAAiB,IAAK,QAAO,MAAM,IAAI,EAAE;AAC7C,WAAO,MAAM,EAAE;AAAA,EACjB;AAEA,WAAS,cAAc,UAAyB;AAC9C,QAAI,CAAC,YAAY,OAAO,aAAa,SAAU;AAE/C,QAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,iBAAW,QAAQ,UAAU;AAC3B,sBAAc,IAAI;AAAA,MACpB;AACA;AAAA,IACF;AAEA,UAAM,SAAS;AAEf,QAAI,OAAO,SAAS,WAAW,OAAO,OAAO,YAAY,UAAU;AACjE,YAAM,QAAQ,YAAY,OAAO,OAAO;AACxC,UAAI,UAAU,UAAa,UAAU,OAAO,SAAS;AACnD,eAAO,UAAU;AACjB;AAAA,MACF;AAAA,IACF;AAEA,eAAW,OAAO,OAAO,OAAO,MAAM,GAAG;AACvC,UAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,sBAAc,GAAG;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,WAAS,aAAa,MAAkB;AACtC,QAAI,KAAK,OAAO;AACd,oBAAc,KAAK,KAAK;AAAA,IAC1B;AACA,QAAI,KAAK,YAAY,MAAM,QAAQ,KAAK,QAAQ,GAAG;AACjD,iBAAW,SAAS,KAAK,UAAU;AACjC,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEA,eAAa,QAAQ;AACrB,SAAO;AACT;AAKO,SAAS,6BACd,KACA,OACc;AACd,MAAI,OAAO,IAAI,UAAU;AACvB,yBAAqB,IAAI,UAAU,KAAK;AAAA,EAC1C;AACA,SAAO;AACT;AAaO,SAAS,0BACd,UACA,UACA,YAC4B;AAC5B,QAAM,UAAsC,CAAC;AAC7C,QAAM,WAAW,oBAAI,IAAY;AAEjC,MAAI,YAAY;AACd,eAAW,KAAK,WAAY,UAAS,IAAI,CAAC;AAAA,EAC5C;AAEA,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,aAAW,KAAK,iBAAkB,UAAS,IAAI,CAAC;AAEhD,WAAS,UAAU,MAAkB;AACnC,QAAI,cAAc,SAAS,IAAI,KAAK,IAAI;AACxC,QAAI,CAAC,eAAe,UAAU;AAC5B,oBAAc,SAAS,IAAI,KAAK,IAAI;AAAA,IACtC;AAEA,QAAI,CAAC,aAAa;AAChB,cAAQ,KAAK;AAAA,QACX,QAAQ,KAAK;AAAA,QACb,eAAe,KAAK;AAAA,QACpB,OAAO,KAAK,QAAQ,EAAE,GAAG,KAAK,MAAM,IAAI,CAAC;AAAA,QACzC;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,KAAK,YAAY,MAAM,QAAQ,KAAK,QAAQ,GAAG;AACjD,iBAAW,SAAS,KAAK,UAAU;AACjC,kBAAU,KAAK;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,YAAU,QAAQ;AAClB,SAAO;AACT;;;AChSA,IAAAC,iBASO;;;ACTP,IAAAC,iBAAqC;AAK9B,SAAS,UAAa,KAAW;AACtC,SAAO,KAAK,MAAM,KAAK,UAAU,GAAG,CAAC;AACvC;AAWO,SAAS,iBAAiB,MAAY,UAAuC;AAClF,MAAI,KAAK,OAAO,UAAU;AACxB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,4BAA4B,MAAM,QAAQ;AACnD;AAEA,SAAS,4BAA4B,eAAqB,UAAuC;AAC/F,MAAI,CAAC,cAAc,YAAY,cAAc,SAAS,WAAW,GAAG;AAClE,WAAO;AAAA,EACT;AAEA,WAAS,IAAI,GAAG,IAAI,cAAc,SAAS,QAAQ,KAAK;AACtD,UAAM,QAAQ,cAAc,SAAS,CAAC;AACtC,QAAI,MAAM,OAAO,UAAU;AACzB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,iBAAiB,4BAA4B,OAAO,QAAQ;AAClE,QAAI,gBAAgB;AAClB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AASO,SAAS,oBACd,MACA,QACA,WACe;AACf,QAAM,WAAW,iBAAiB,MAAM,MAAM;AAC9C,MAAI,CAAC,SAAU,QAAO;AAEtB,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,aAAO,SAAS,QAAQ,MAAM;AAAA,IAChC,KAAK;AACH,aAAO,SAAS,KAAK,WAAW,CAAC,GAAG,MAAM;AAAA,IAC5C,KAAK,oBAAoB;AACvB,UAAI,CAAC,SAAS,OAAQ,QAAO;AAC7B,cAAQ,SAAS,OAAO,YAAY,CAAC,GAAG,SAAS,QAAQ,CAAC,GAAG,MAAM;AAAA,IACrE;AAAA,IACA,KAAK,gBAAgB;AACnB,UAAI,CAAC,SAAS,OAAQ,QAAO;AAC7B,cAAQ,SAAS,OAAO,YAAY,CAAC,GAAG,SAAS,QAAQ,CAAC,GAAG,MAAM;AAAA,IACrE;AAAA,EACF;AACF;AAMO,SAAS,iBAAiB,MAAY,UAA4B;AACvE,MAAI,KAAK,OAAO,SAAU,QAAO,CAAC;AAElC,WAAS,KAAK,MAAY,KAAgC;AACxD,QAAI,CAAC,KAAK,SAAU,QAAO;AAC3B,eAAW,SAAS,KAAK,UAAU;AACjC,UAAI,MAAM,OAAO,SAAU,QAAO;AAClC,YAAM,QAAQ,KAAK,OAAO,CAAC,GAAG,KAAK,MAAM,EAAE,CAAC;AAC5C,UAAI,MAAO,QAAO;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC;AACnC;AAMO,SAAS,gBAAgB,MAAY,UAAiC;AAC3E,MAAI,KAAK,OAAO,SAAU,QAAO;AAEjC,QAAM,QAAgB,CAAC,IAAI;AAC3B,SAAO,MAAM,SAAS,GAAG;AACvB,UAAM,UAAU,MAAM,IAAI;AAC1B,UAAM,WAAW,QAAQ;AACzB,QAAI,CAAC,SAAU;AACf,eAAW,SAAS,UAAU;AAC5B,UAAI,MAAM,OAAO,SAAU,QAAO,QAAQ;AAC1C,YAAM,KAAK,KAAK;AAAA,IAClB;AAAA,EACF;AACA,SAAO;AACT;AAQO,SAAS,iBAAiB,MAAY,UAA0B;AACrE,QAAM,OAAe,CAAC;AAEtB,WAAS,KAAK,MAAqB;AACjC,SAAK,KAAK,IAAI;AACd,QAAI,KAAK,OAAO,SAAU,QAAO;AACjC,QAAI,KAAK,UAAU;AACjB,iBAAW,SAAS,KAAK,UAAU;AACjC,YAAI,KAAK,KAAK,EAAG,QAAO;AAAA,MAC1B;AAAA,IACF;AACA,SAAK,IAAI;AACT,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,IAAI,IAAI,OAAO,CAAC;AAC9B;AAKO,SAAS,eAAe,cAAoB,UAA2B;AAC5E,MAAI,aAAa,OAAO,UAAU;AAChC,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,aAAa,YAAY,aAAa,SAAS,WAAW,GAAG;AAChE,WAAO;AAAA,EACT;AAEA,aAAW,SAAS,aAAa,UAAU;AACzC,QAAI,eAAe,OAAO,QAAQ,GAAG;AACnC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,iBAAiB,MAAyB;AACxD,SAAO,IAAI,QAAI,+BAAe,IAAI,CAAC;AACrC;AAKO,SAAS,mBAAmB,OAAe,aAAmC;AAEnF,QAAM,WAAW,MAAM,QAAQ,iBAAiB,EAAE;AAClD,MAAI,YAAY,GAAG,QAAQ;AAC3B,MAAI,UAAU;AAEd,MAAI,aAAa;AACf,WAAO,YAAY,IAAI,SAAS,GAAG;AACjC,kBAAY,GAAG,QAAQ,SAAS,OAAO;AACvC;AAAA,IACF;AACA,gBAAY,IAAI,SAAS;AAAA,EAC3B;AAEA,SAAO;AACT;AAWO,SAAS,oBACd,MACA,aACA,aACqB;AACrB,QAAM,QAAQ,oBAAI,IAAoB;AACtC,QAAM,QAAQ,gBAAgB,CAAC,UAAkB,mBAAmB,OAAO,WAAW;AAEtF,WAAS,eAAe,MAAkB;AACxC,UAAM,QAAQ,MAAM,KAAK,EAAE;AAC3B,UAAM,IAAI,KAAK,IAAI,KAAK;AAExB,UAAM,cAAc,KAAK,QAAQ,UAAU,KAAK,KAAK,IAAI;AACzD,UAAM,eAAe,KAAK,SAAS,UAAU,KAAK,MAAM,IAAI;AAC5D,UAAM,iBAAiB,KAAK,WACxB,KAAK,SAAS,IAAI,CAAC,UAAU,eAAe,KAAK,CAAC,IAClD,CAAC;AAEL,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,KAAK;AAAA,MACX,GAAI,cAAc,EAAE,OAAO,YAAY,IAAI,CAAC;AAAA,MAC5C,GAAI,eAAe,EAAE,QAAQ,aAAa,IAAI,CAAC;AAAA,MAC/C,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,aAAa,eAAe,IAAI;AACtC,SAAO,EAAE,YAAY,MAAM;AAC7B;;;ADvIO,SAAS,WACd,UACA,QACe;AACf,QAAM,EAAE,UAAU,MAAM,MAAM,IAAI;AAElC,MAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,CAAC,KAAK,MAAM,CAAC,KAAK,MAAM;AAC/D,UAAM,IAAI,MAAM,qEAAqE;AAAA,EACvF;AAEA,QAAM,SAAS,UAAU,QAAQ;AACjC,QAAM,cAAc,iBAAiB,OAAO,QAAQ;AAGpD,QAAM,cAAc,iBAAiB,IAAI;AACzC,aAAW,SAAS,aAAa;AAC/B,QAAI,YAAY,IAAI,KAAK,GAAG;AAC1B,YAAM,IAAI,MAAM,0CAA0C,KAAK,+BAA+B;AAAA,IAChG;AAAA,EACF;AAEA,QAAM,YAAY,iBAAiB,OAAO,UAAU,QAAQ;AAC5D,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,mDAAmD,QAAQ,cAAc;AAAA,EAC3F;AAEA,QAAM,aAAa,UAAU;AAC7B,MAAI,CAAC,WAAW,UAAU;AACxB,eAAW,WAAW,CAAC;AAAA,EACzB;AAEA,QAAM,cACJ,OAAO,UAAU,YAAY,SAAS,KAAK,SAAS,WAAW,SAAS,SACpE,QACA,WAAW,SAAS;AAE1B,aAAW,SAAS,OAAO,aAAa,GAAG,UAAU,IAAI,CAAC;AAE1D,SAAO;AAAA,IACL,UAAU;AAAA,IACV,OAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,QAAQ,KAAK;AAAA,MACb;AAAA,MACA,OAAO;AAAA,MACP,SAAS;AAAA,QACP,UAAU,KAAK;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACF;AAOO,SAAS,SACd,UACA,QACe;AACf,QAAM,EAAE,QAAQ,gBAAgB,MAAM,IAAI;AAE1C,MAAI,WAAW,SAAS,SAAS,IAAI;AACnC,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AAEA,QAAM,SAAS,UAAU,QAAQ;AAEjC,QAAM,YAAY,iBAAiB,OAAO,UAAU,MAAM;AAC1D,MAAI,CAAC,aAAa,CAAC,UAAU,QAAQ;AACnC,UAAM,IAAI,MAAM,mCAAmC,MAAM,0BAA0B;AAAA,EACrF;AAEA,QAAM,YAAY,iBAAiB,OAAO,UAAU,cAAc;AAClE,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,4CAA4C,cAAc,0BAA0B;AAAA,EACtG;AAGA,MAAI,eAAe,UAAU,MAAM,cAAc,GAAG;AAClD,UAAM,IAAI;AAAA,MACR,oCAAoC,cAAc,iDAAiD,MAAM;AAAA,IAC3G;AAAA,EACF;AAEA,QAAM,mBAAmB,UAAU,OAAO;AAC1C,QAAM,gBAAgB,UAAU;AAGhC,QAAM,CAAC,WAAW,IAAI,UAAU,OAAO,SAAU,OAAO,eAAe,CAAC;AAGxE,QAAM,eAAe,UAAU;AAC/B,MAAI,CAAC,aAAa,UAAU;AAC1B,iBAAa,WAAW,CAAC;AAAA,EAC3B;AAEA,MAAI,cACF,OAAO,UAAU,YAAY,SAAS,KAAK,SAAS,aAAa,SAAS,SACtE,QACA,aAAa,SAAS;AAE5B,eAAa,SAAS,OAAO,aAAa,GAAG,WAAW;AAExD,SAAO;AAAA,IACL,UAAU;AAAA,IACV,OAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,YACd,UACA,QACe;AACf,QAAM,EAAE,QAAQ,OAAO,QAAQ,KAAK,IAAI;AAExC,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,UAAM,IAAI,MAAM,0BAA0B;AAAA,EAC5C;AAEA,QAAM,SAAS,UAAU,QAAQ;AACjC,QAAM,MAAM,iBAAiB,OAAO,UAAU,MAAM;AACpD,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,sCAAsC,MAAM,0BAA0B;AAAA,EACxF;AAEA,QAAM,aAAa,IAAI;AACvB,QAAM,gBAAgB,WAAW,QAAQ,UAAU,WAAW,KAAK,IAAI,CAAC;AAExE,MAAI,OAAO;AACT,eAAW,QAAQ;AAAA,MACjB,GAAG;AAAA,MACH,GAAG,UAAU,KAAK;AAAA,IACpB;AAAA,EACF,OAAO;AACL,eAAW,QAAQ,UAAU,KAAK;AAAA,EACpC;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,OAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC;AAAA,MACA,UAAU,IAAI,SAAS,IAAI,OAAO,KAAK;AAAA,MACvC,SAAS;AAAA,QACP,OAAO,WAAW;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAOO,SAAS,YACd,UACA,QACe;AACf,QAAM,EAAE,QAAQ,QAAQ,YAAY,OAAO,QAAQ,KAAK,IAAI;AAE5D,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AAEA,QAAM,SAAS,UAAU,QAAQ;AACjC,QAAM,MAAM,iBAAiB,OAAO,UAAU,MAAM;AACpD,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,sCAAsC,MAAM,0BAA0B;AAAA,EACxF;AAEA,QAAM,aAAa,IAAI;AACvB,QAAM,gBAAkC,WAAW,SAAS,UAAU,WAAW,MAAM,IAAI,CAAC;AAC5F,QAAM,iBAAiB,UAAU,aAAa;AAE9C,MAAI,OAAO;AAIT,UAAM,sBAAsB,qCAAsB,MAAM,MAAM;AAC9D,UAAM,SAAS,EAAE,GAAI,cAAc,UAAU,CAAC,EAAG;AACjD,UAAM,qBAAqB,OAAO,KAAK,KAAK,CAAC;AAE7C,QAAI,OAAO;AACT,aAAO,KAAK,IAAI,EAAE,GAAG,oBAAoB,GAAG,UAAU,mBAAmB,EAAE;AAAA,IAC7E,OAAO;AACL,aAAO,KAAK,IAAI,UAAU,mBAAmB;AAAA,IAC/C;AAEA,eAAW,SAAS,EAAE,GAAG,eAAe,OAAO;AAE/C,WAAO;AAAA,MACL,UAAU;AAAA,MACV,OAAO;AAAA,QACL,MAAM;AAAA,QACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC;AAAA,QACA,UAAU,IAAI,SAAS,IAAI,OAAO,KAAK;AAAA,QACvC,SAAS;AAAA,UACP,QAAQ,WAAW;AAAA,UACnB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,YAAY;AAId,UAAM,0BAA2B,cAAc,UAAU,KAAyB,CAAC;AACnF,UAAM,sBAAsB,qCAAsB,MAAM,MAAM;AAE9D,QAAI,OAAO;AACT,oBAAc,UAAU,IAAI;AAAA,QAC1B,GAAG;AAAA,QACH,GAAG,UAAU,mBAAmB;AAAA,MAClC;AAAA,IACF,OAAO;AACL,oBAAc,UAAU,IAAI,UAAU,mBAAmB;AAAA,IAC3D;AAAA,EACF,OAAO;AAEL,UAAM,wBAAwB,sCAAuB,MAAM,MAAM;AACjE,QAAI,OAAO;AACT,iBAAW,MAAM,CAAC,QAAQ,WAAW,UAAU,QAAQ,GAAY;AACjE,YAAI,sBAAsB,EAAE,MAAM,QAAW;AAC3C,gBAAM,YAAa,cAAc,EAAE,KAAyB,CAAC;AAC7D,gBAAM,aAAc,sBAAsB,EAAE,KAAyB,CAAC;AACtE,wBAAc,EAAE,IAAI;AAAA,YAClB,GAAG;AAAA,YACH,GAAG,UAAU,UAAU;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,iBAAW,SAAS,UAAU,qBAAqB;AACnD,aAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,UACL,MAAM;AAAA,UACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UAClC;AAAA,UACA,UAAU,IAAI,SAAS,IAAI,OAAO,KAAK;AAAA,UACvC,SAAS;AAAA,YACP,QAAQ,WAAW;AAAA,YACnB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,aAAW,SAAS;AAEpB,SAAO;AAAA,IACL,UAAU;AAAA,IACV,OAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC;AAAA,MACA,UAAU,IAAI,SAAS,IAAI,OAAO,KAAK;AAAA,MACvC,SAAS;AAAA,QACP,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAOO,SAAS,WACd,UACA,QACe;AACf,QAAM,EAAE,OAAO,IAAI;AAEnB,MAAI,WAAW,SAAS,SAAS,IAAI;AACnC,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AAEA,QAAM,SAAS,UAAU,QAAQ;AACjC,QAAM,MAAM,iBAAiB,OAAO,UAAU,MAAM;AACpD,MAAI,CAAC,OAAO,CAAC,IAAI,QAAQ;AACvB,UAAM,IAAI,MAAM,qCAAqC,MAAM,0BAA0B;AAAA,EACvF;AAEA,QAAM,WAAW,IAAI,OAAO;AAC5B,QAAM,QAAQ,IAAI;AAElB,QAAM,CAAC,WAAW,IAAI,IAAI,OAAO,SAAU,OAAO,OAAO,CAAC;AAE1D,SAAO;AAAA,IACL,UAAU;AAAA,IACV,OAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAQO,SAAS,cACd,UACA,QACe;AACf,QAAM,EAAE,QAAQ,gBAAgB,OAAO,YAAY,IAAI;AAEvD,MAAI,WAAW,SAAS,SAAS,IAAI;AACnC,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AAEA,QAAM,SAAS,UAAU,QAAQ;AACjC,QAAM,MAAM,iBAAiB,OAAO,UAAU,MAAM;AACpD,MAAI,CAAC,OAAO,CAAC,IAAI,QAAQ;AACvB,UAAM,IAAI,MAAM,wCAAwC,MAAM,0BAA0B;AAAA,EAC1F;AAEA,QAAM,cAAc,iBAAiB,OAAO,QAAQ;AACpD,QAAM,EAAE,YAAY,MAAM,IAAI,oBAAoB,IAAI,MAAM,aAAa,WAAW;AAEpF,QAAM,sBAAsB,kBAAkB,IAAI,OAAO;AACzD,QAAM,gBAAgB,iBAAiB,OAAO,UAAU,mBAAmB;AAC3E,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,MAAM,8CAA8C,mBAAmB,cAAc;AAAA,EACjG;AAEA,QAAM,aAAa,cAAc;AACjC,MAAI,CAAC,WAAW,UAAU;AACxB,eAAW,WAAW,CAAC;AAAA,EACzB;AAGA,MAAI;AACJ,MAAI,OAAO,UAAU,YAAY,SAAS,KAAK,SAAS,WAAW,SAAS,QAAQ;AAClF,kBAAc;AAAA,EAChB,WAAW,wBAAwB,IAAI,OAAO,IAAI;AAChD,kBAAc,IAAI,QAAQ;AAAA,EAC5B,OAAO;AACL,kBAAc,WAAW,SAAS;AAAA,EACpC;AAEA,aAAW,SAAS,OAAO,aAAa,GAAG,UAAU;AAErD,SAAO;AAAA,IACL,UAAU;AAAA,IACV,OAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,QAAQ,WAAW;AAAA,MACnB,UAAU;AAAA,MACV,OAAO;AAAA,MACP,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,OAAO,OAAO,YAAY,MAAM,QAAQ,CAAC;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AACF;AAiBO,SAAS,gBACd,UACA,QACe;AACf,QAAM,EAAE,QAAQ,WAAW,QAAQ,KAAK,IAAI;AAE5C,QAAM,SAAS,UAAU,QAAQ;AACjC,QAAM,MAAM,iBAAiB,OAAO,UAAU,MAAM;AACpD,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,0CAA0C,MAAM,0BAA0B;AAAA,EAC5F;AAEA,QAAM,aAAa,IAAI;AACvB,QAAM,oBAAoB,WAAW,YAAY,UAAU,WAAW,SAAS,IAAI;AAEnF,MAAI,cAAc,MAAM;AACtB,WAAO,WAAW;AAAA,EACpB,OAAO;AACL,UAAM,mBAAmB,WAAW,YAAY,UAAU,WAAW,SAAS,IAAI,CAAC;AACnF,UAAM,YAAY,QACd,EAAE,GAAG,kBAAkB,GAAG,UAAU,SAAS,EAAE,IAC/C,UAAU,SAAS;AACvB,eAAW,YAAY,qCAAsB,MAAM,SAAS;AAAA,EAC9D;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,OAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC;AAAA,MACA,UAAU,IAAI,SAAS,IAAI,OAAO,KAAK;AAAA,MACvC,SAAS;AAAA,QACP,WAAW,WAAW;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AEzgBO,IAAM,sBAAsB;AAO5B,IAAM,gBAAN,MAAsC;AAAA,EACnC,OAA0B,CAAC;AAAA,EAC3B;AAAA,EACA,SAA4B,CAAC;AAAA,EACpB;AAAA,EAEjB,YAAY,cAAiB,UAA0B,CAAC,GAAG;AACzD,QAAI,iBAAiB,UAAa,iBAAiB,MAAM;AACvD,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,UAAM,QAAQ,QAAQ,cAAc;AACpC,QAAI,OAAO,UAAU,YAAY,SAAS,KAAK,CAAC,OAAO,SAAS,KAAK,GAAG;AACtE,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AAEA,SAAK,aAAa,KAAK,MAAM,KAAK;AAClC,SAAK,UAAU;AAAA,MACb,OAAO,UAAU,YAAY;AAAA,MAC7B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAa;AACf,WAAO,UAAU,KAAK,QAAQ,KAAK;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAmB;AACjB,WAAO,KAAK,KAAK,SAAS;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAmB;AACjB,WAAO,KAAK,OAAO,SAAS;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAoB;AACtB,WAAO,KAAK,KAAK;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAoB;AACtB,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAgB;AAClB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,WAAc,OAAmC;AACpD,QAAI,cAAc,UAAa,cAAc,MAAM;AACjD,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AAGA,SAAK,KAAK,KAAK,KAAK,OAAO;AAG3B,WAAO,KAAK,KAAK,SAAS,KAAK,YAAY;AACzC,WAAK,KAAK,MAAM;AAAA,IAClB;AAGA,SAAK,UAAU;AAAA,MACb,OAAO,UAAU,SAAS;AAAA,MAC1B;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAGA,SAAK,SAAS,CAAC;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAsB;AACpB,QAAI,CAAC,KAAK,QAAQ,GAAG;AACnB,aAAO;AAAA,IACT;AAEA,UAAM,gBAAgB,KAAK,KAAK,IAAI;AACpC,SAAK,OAAO,QAAQ,KAAK,OAAO;AAChC,SAAK,UAAU;AAEf,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAsB;AACpB,QAAI,CAAC,KAAK,QAAQ,GAAG;AACnB,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,KAAK,OAAO,MAAM;AACpC,SAAK,KAAK,KAAK,KAAK,OAAO;AAC3B,SAAK,UAAU;AAEf,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAmB;AACvB,QAAI,aAAa,UAAa,aAAa,MAAM;AAC/C,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AAEA,SAAK,OAAO,CAAC;AACb,SAAK,SAAS,CAAC;AACf,SAAK,UAAU;AAAA,MACb,OAAO,UAAU,QAAQ;AAAA,MACzB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,OAAO,CAAC;AACb,SAAK,SAAS,CAAC;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,WAA4B;AAC1B,WAAO;AAAA,MACL,SAAS,KAAK,QAAQ;AAAA,MACtB,SAAS,KAAK,QAAQ;AAAA,MACtB,WAAW,KAAK;AAAA,MAChB,WAAW,KAAK;AAAA,MAChB,SAAS,KAAK;AAAA,IAChB;AAAA,EACF;AACF;AAMO,IAAM,yBAAN,MAA6B;AAAA,EAC1B;AAAA,EAER,YAAY,iBAA+B,SAA0B;AACnE,SAAK,UAAU,IAAI,cAA4B,iBAAiB,OAAO;AAAA,EACzE;AAAA,EAEA,IAAI,WAAyB;AAC3B,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,IAAI,UAAmB;AACrB,WAAO,KAAK,QAAQ,QAAQ;AAAA,EAC9B;AAAA,EAEA,IAAI,UAAmB;AACrB,WAAO,KAAK,QAAQ,QAAQ;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,UAAsE;AAC5E,UAAM,aAAa,KAAK,QAAQ;AAChC,UAAM,SAAS,SAAS,UAAU;AAClC,SAAK,QAAQ,KAAK,OAAO,UAAU,OAAO,KAAK;AAC/C,WAAO;AAAA,EACT;AAAA,EAEA,OAAiC;AAC/B,WAAO,KAAK,QAAQ,KAAK;AAAA,EAC3B;AAAA,EAEA,OAAiC;AAC/B,WAAO,KAAK,QAAQ,KAAK;AAAA,EAC3B;AAAA,EAEA,MAAM,aAAiC;AACrC,SAAK,QAAQ,MAAM,WAAW;AAAA,EAChC;AAAA,EAEA,QAAc;AACZ,SAAK,QAAQ,MAAM;AAAA,EACrB;AAAA,EAEA,WAAuC;AACrC,WAAO,KAAK,QAAQ,SAAS;AAAA,EAC/B;AACF;;;ACzPA,IAAAC,iBAMO;AAiEA,IAAM,oBAAN,MAAwB;AAAA,EACrB,QAAoC,oBAAI,IAAI;AAAA;AAAA;AAAA;AAAA,EAKpD,SAAS,MAA2B;AAClC,UAAM,MAAM,KAAK,OAAO,KAAK,aAAa,KAAK,SAAS;AACxD,SAAK,MAAM,IAAI,KAAK,IAAI;AAAA,EAC1B;AAAA,EAEQ,OAAO,aAAqB,WAA2B;AAC7D,WAAO,GAAG,WAAW,KAAK,SAAS;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,eAAuB,eAAwC;AACtE,QAAI,kBAAkB,eAAe;AACnC,aAAO,CAAC,aAAa;AAAA,IACvB;AAEA,UAAM,QAA+C;AAAA,MACnD,EAAE,SAAS,eAAe,MAAM,CAAC,aAAa,EAAE;AAAA,IAClD;AACA,UAAM,UAAU,oBAAI,IAAY,CAAC,aAAa,CAAC;AAE/C,WAAO,MAAM,SAAS,GAAG;AACvB,YAAM,EAAE,SAAS,gBAAgB,KAAK,IAAI,MAAM,MAAM;AAEtD,iBAAW,QAAQ,KAAK,MAAM,OAAO,GAAG;AACtC,YAAI,KAAK,gBAAgB,gBAAgB;AACvC,gBAAM,cAAc,KAAK;AACzB,cAAI,gBAAgB,eAAe;AACjC,mBAAO,CAAC,GAAG,MAAM,WAAW;AAAA,UAC9B;AAEA,cAAI,CAAC,QAAQ,IAAI,WAAW,GAAG;AAC7B,oBAAQ,IAAI,WAAW;AACvB,kBAAM,KAAK,EAAE,SAAS,aAAa,MAAM,CAAC,GAAG,MAAM,WAAW,EAAE,CAAC;AAAA,UACnE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,eAAuB,eAAgC;AAC7D,WAAO,KAAK,SAAS,eAAe,aAAa,MAAM;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,aAAqB,WAA8C;AACzE,WAAO,KAAK,MAAM,IAAI,KAAK,OAAO,aAAa,SAAS,CAAC;AAAA,EAC3D;AACF;AAKA,SAAS,8BAA8B,MAAqC;AAC1E,MAAI,KAAK,UAAU,OAAO,KAAK,WAAW,YAAY,CAAC,MAAM,QAAQ,KAAK,MAAM,GAAG;AACjF,UAAM,SAAS,KAAK;AACpB,UAAM,oBAAoB,UAAU,UAAU,aAAa,UAAU,YAAY,UAAU,YAAY;AACvG,QAAI,CAAC,mBAAmB;AACtB,WAAK,SAAS;AAAA,QACZ,MAAM,EAAE,GAAG,OAAO;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAChC,eAAW,SAAS,KAAK,UAAU;AACjC,UAAI,SAAS,OAAO,UAAU,UAAU;AACtC,sCAA8B,KAAgC;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AACF;AAGO,IAAM,2BAA2B,IAAI,kBAAkB;AAG9D,yBAAyB,SAAS;AAAA,EAChC,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb,SAAS,CAAC,WAAoC;AAC5C,UAAM,WAAW,UAAU,MAAM;AACjC,aAAS,SAAS;AAClB,aAAS,UAAU;AAGnB,QAAI,SAAS,QAAQ,CAAC,SAAS,UAAU;AACvC,eAAS,WAAW,SAAS;AAC7B,aAAO,SAAS;AAAA,IAClB;AAGA,QAAI,CAAC,SAAS,YAAY,OAAO,SAAS,aAAa,UAAU;AAC/D,eAAS,WAAW;AAAA,QAClB,OAAO;AAAA,QACP,aAAa;AAAA,QACb,QAAQ;AAAA,QACR,MAAM,CAAC;AAAA,QACP,UAAU;AAAA,QACV,SAAS;AAAA,QACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC;AAAA,IACF,OAAO;AACL,YAAM,OAAO,SAAS;AACtB,WAAK,QAAQ,KAAK,SAAS;AAC3B,WAAK,OAAO,MAAM,QAAQ,KAAK,IAAI,IAAI,KAAK,OAAO,CAAC;AACpD,WAAK,UAAU;AAAA,IACjB;AAGA,QAAI,SAAS,YAAY,OAAO,SAAS,aAAa,UAAU;AAC9D,oCAA8B,SAAS,QAAmC;AAAA,IAC5E;AAEA,WAAO;AAAA,EACT;AACF,CAAC;AAGD,yBAAyB,SAAS;AAAA,EAChC,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb,SAAS,CAAC,WAAoC;AAC5C,UAAM,WAAW,UAAU,MAAM;AACjC,aAAS,SAAS;AAClB,aAAS,UAAU;AAEnB,QAAI,SAAS,YAAY,OAAO,SAAS,aAAa,UAAU;AAC9D,oCAA8B,SAAS,QAAmC;AAAA,IAC5E;AAEA,WAAO;AAAA,EACT;AACF,CAAC;AAGD,yBAAyB,SAAS;AAAA,EAChC,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb,SAAS,CAAC,WAAoC;AAC5C,UAAM,WAAW,UAAU,MAAM;AACjC,aAAS,SAAS;AAClB,aAAS,UAAU;AAEnB,QAAI,CAAC,SAAS,YAAY,OAAO,SAAS,aAAa,UAAU;AAC/D,eAAS,WAAW;AAAA,QAClB,OAAO;AAAA,QACP,aAAa;AAAA,QACb,QAAQ;AAAA,QACR,MAAM,CAAC;AAAA,QACP,UAAU;AAAA,QACV,SAAS;AAAA,MACX;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF,CAAC;AAGD,yBAAyB,SAAS;AAAA,EAChC,aAAa;AAAA,EACb,WAAW;AAAA,EACX,aAAa;AAAA,EACb,SAAS,CAAC,WAAoC;AAC5C,UAAM,WAAW,UAAU,MAAM;AACjC,aAAS,UAAU;AACnB,WAAO;AAAA,EACT;AACF,CAAC;AAKM,SAAS,WACd,eACA,gBAAwB,uCACxB,WAA8B,0BACrB;AACT,MAAI,CAAC,iBAAiB,CAAC,cAAe,QAAO;AAC7C,MAAI,kBAAkB,cAAe,QAAO;AAC5C,SAAO,SAAS,QAAQ,eAAe,aAAa;AACtD;AAKO,SAAS,iBACd,eACA,gBAAwB,uCACxB,WAA8B,0BACb;AACjB,MAAI,CAAC,iBAAiB,CAAC,cAAe,QAAO;AAC7C,SAAO,SAAS,SAAS,eAAe,aAAa;AACvD;AAMO,SAAS,gBACd,aACA,UAA0B,CAAC,GACV;AACjB,QAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,WAAW,QAAQ,YAAY;AAGrC,MAAI,CAAC,eAAe,OAAO,gBAAgB,YAAY,MAAM,QAAQ,WAAW,GAAG;AACjF,UAAM,QAAwB;AAAA,MAC5B,MAAM;AAAA,MACN,SAAS;AAAA,MACT,eAAe;AAAA,MACf;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,QACV,SAAS;AAAA,QACT,eAAe;AAAA,QACf;AAAA,QACA,eAAe,CAAC;AAAA,QAChB,cAAc;AAAA,QACd;AAAA,QACA,QAAQ,CAAC,KAAK;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,MAAM;AACZ,QAAM,gBAAgB,OAAO,IAAI,YAAY,WAAW,IAAI,QAAQ,KAAK,IAAI;AAG7E,MAAI,kBAAkB,eAAe;AACnC,UAAM,SAAS,UAAU,GAAG;AAC5B,QAAI,UAAU;AACZ,YAAM,aAAa,iBAAiB,MAAM;AAC1C,UAAI,CAAC,WAAW,OAAO;AACrB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,YACV,SAAS;AAAA,YACT;AAAA,YACA;AAAA,YACA,eAAe,CAAC,aAAa;AAAA,YAC7B,cAAc;AAAA,YACd;AAAA,YACA,QAAQ,WAAW,OAAO,IAAI,CAAC,OAAO;AAAA,cACpC,MAAM;AAAA,cACN,SAAS,qBAAqB,EAAE,OAAO,OAAO,EAAE,IAAI;AAAA,cACpD;AAAA,cACA;AAAA,YACF,EAAE;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,QACV,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,eAAe,CAAC,aAAa;AAAA,QAC7B,cAAc;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,OAAO,SAAS,SAAS,eAAe,aAAa;AAC3D,MAAI,CAAC,QAAQ,KAAK,UAAU,GAAG;AAC7B,UAAM,QAAwB;AAAA,MAC5B,MAAM;AAAA,MACN,SAAS,gDAAgD,aAAa,SAAS,aAAa;AAAA,MAC5F;AAAA,MACA;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,QACV,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,eAAe,CAAC;AAAA,QAChB,cAAc;AAAA,QACd;AAAA,QACA,QAAQ,CAAC,KAAK;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,QACV,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,eAAe;AAAA,QACf,cAAc,KAAK,SAAS;AAAA,QAC5B,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAGA,MAAI,aAAa,UAAU,GAAG;AAC9B,MAAI,eAAe;AAEnB,WAAS,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,KAAK;AACxC,UAAM,UAAU,KAAK,CAAC;AACtB,UAAM,QAAQ,KAAK,IAAI,CAAC;AACxB,UAAM,OAAO,SAAS,QAAQ,SAAS,KAAK;AAE5C,QAAI,CAAC,MAAM;AACT,YAAM,QAAwB;AAAA,QAC5B,MAAM;AAAA,QACN,SAAS,kCAAkC,OAAO,SAAS,KAAK;AAAA,QAChE;AAAA,QACA;AAAA,MACF;AACA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,UACV,SAAS;AAAA,UACT;AAAA,UACA;AAAA,UACA,eAAe;AAAA,UACf;AAAA,UACA;AAAA,UACA,QAAQ,CAAC,KAAK;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,mBAAa,KAAK,QAAQ,UAAU;AACpC;AAAA,IACF,SAAS,KAAc;AACrB,YAAM,QAAwB;AAAA,QAC5B,MAAM;AAAA,QACN,SAAS,yCAAyC,OAAO,SAAS,KAAK,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QAC7H;AAAA,QACA;AAAA,QACA,SAAS,EAAE,UAAU,SAAS,QAAQ,MAAM;AAAA,MAC9C;AACA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,UACV,SAAS;AAAA,UACT;AAAA,UACA;AAAA,UACA,eAAe;AAAA,UACf;AAAA,UACA;AAAA,UACA,QAAQ,CAAC,KAAK;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,WAAW;AACjB,MAAI,UAAU;AACZ,UAAM,aAAa,iBAAiB,QAAQ;AAC5C,QAAI,CAAC,WAAW,OAAO;AACrB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,UACV,SAAS;AAAA,UACT;AAAA,UACA;AAAA,UACA,eAAe;AAAA,UACf;AAAA,UACA;AAAA,UACA,QAAQ,WAAW,OAAO,IAAI,CAAC,OAAO;AAAA,YACpC,MAAM;AAAA,YACN,SAAS,oCAAoC,EAAE,OAAO,OAAO,EAAE,IAAI;AAAA,YACnE;AAAA,YACA;AAAA,UACF,EAAE;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,MACV,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA,eAAe;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF;AACF;;;AC9eA,oBAAiC;AACjC,IAAAC,iBAOO;AA4GA,SAAS,WAAW,MAA0B;AACnD,QAAM,IAAI;AAAA,IACR;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IACpF;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IACpF;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IACpF;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IACpF;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IACpF;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IACpF;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IACpF;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,IAAY;AAAA,EACtF;AAEA,MAAI,KAAK;AACT,MAAI,KAAK;AACT,MAAI,KAAK;AACT,MAAI,KAAK;AACT,MAAI,KAAK;AACT,MAAI,KAAK;AACT,MAAI,KAAK;AACT,MAAI,KAAK;AAET,QAAM,SAAS,KAAK;AACpB,QAAM,YAAY,SAAS;AAC3B,QAAM,YAAc,SAAS,IAAI,OAAQ,KAAM;AAC/C,QAAM,SAAS,IAAI,WAAW,SAAS;AACvC,SAAO,IAAI,IAAI;AACf,SAAO,MAAM,IAAI;AAEjB,QAAM,OAAO,IAAI,SAAS,OAAO,MAAM;AACvC,OAAK,UAAU,YAAY,GAAG,cAAc,GAAG,KAAK;AACpD,OAAK,UAAU,YAAY,GAAG,KAAK,MAAM,YAAY,UAAW,GAAG,KAAK;AAExE,QAAM,IAAI,IAAI,YAAY,EAAE;AAE5B,WAAS,QAAQ,GAAG,QAAQ,WAAW,SAAS,IAAI;AAClD,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,QAAE,CAAC,IAAI,KAAK,UAAU,QAAQ,IAAI,GAAG,KAAK;AAAA,IAC5C;AACA,aAAS,IAAI,IAAI,IAAI,IAAI,KAAK;AAC5B,YAAM,MACF,EAAE,IAAI,EAAE,MAAM,IAAM,EAAE,IAAI,EAAE,KAAK,OACjC,EAAE,IAAI,EAAE,MAAM,KAAO,EAAE,IAAI,EAAE,KAAK,MACnC,EAAE,IAAI,EAAE,MAAM;AACjB,YAAM,MACF,EAAE,IAAI,CAAC,MAAM,KAAO,EAAE,IAAI,CAAC,KAAK,OAChC,EAAE,IAAI,CAAC,MAAM,KAAO,EAAE,IAAI,CAAC,KAAK,MACjC,EAAE,IAAI,CAAC,MAAM;AAChB,QAAE,CAAC,IAAK,EAAE,IAAI,EAAE,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,OAAQ;AAAA,IAC9C;AAEA,QAAI,IAAI;AACR,QAAI,IAAI;AACR,QAAI,IAAI;AACR,QAAI,IAAI;AACR,QAAI,IAAI;AACR,QAAI,IAAI;AACR,QAAI,IAAI;AACR,QAAI,IAAI;AAER,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,YAAM,MAAO,MAAM,IAAM,KAAK,OAAS,MAAM,KAAO,KAAK,OAAS,MAAM,KAAO,KAAK;AACpF,YAAM,KAAM,IAAI,IAAM,CAAC,IAAI;AAC3B,YAAM,QAAS,IAAI,KAAK,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,MAAO;AAC9C,YAAM,MAAO,MAAM,IAAM,KAAK,OAAS,MAAM,KAAO,KAAK,OAAS,MAAM,KAAO,KAAK;AACpF,YAAM,MAAO,IAAI,IAAM,IAAI,IAAM,IAAI;AACrC,YAAM,QAAS,KAAK,QAAS;AAE7B,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAK,IAAI,UAAW;AACpB,UAAI;AACJ,UAAI;AACJ,UAAI;AACJ,UAAK,QAAQ,UAAW;AAAA,IAC1B;AAEA,SAAM,KAAK,MAAO;AAClB,SAAM,KAAK,MAAO;AAClB,SAAM,KAAK,MAAO;AAClB,SAAM,KAAK,MAAO;AAClB,SAAM,KAAK,MAAO;AAClB,SAAM,KAAK,MAAO;AAClB,SAAM,KAAK,MAAO;AAClB,SAAM,KAAK,MAAO;AAAA,EACpB;AAEA,QAAM,SAAS,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,EAC3C,IAAI,CAAC,QAAQ,IAAI,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAC9C,KAAK,EAAE;AAEV,SAAO;AACT;AAKA,eAAsB,kBAAkB,MAAmC;AACzE,MAAI,OAAO,eAAe,eAAe,WAAW,QAAQ,QAAQ,QAAQ;AAC1E,QAAI;AACF,YAAM,SAAS,KAAK,OAAO,MAAM,KAAK,YAAY,KAAK,aAAa,KAAK,UAAU;AACnF,YAAM,aAAa,MAAM,WAAW,OAAO,OAAO,OAAO,WAAW,MAAM;AAC1E,YAAM,YAAY,MAAM,KAAK,IAAI,WAAW,UAAU,CAAC;AACvD,YAAM,UAAU,UAAU,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAC7E,aAAO,UAAU,OAAO;AAAA,IAC1B,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO,UAAU,WAAW,IAAI,CAAC;AACnC;AAMO,SAAS,iBAAiB,UAA8B,SAAiB,UAA2B;AACzG,MAAI,QAAQ,YAAY,IAAI,KAAK;AAGjC,SAAO,KAAK,QAAQ,YAAY,EAAE,EAAE,QAAQ,WAAW,GAAG,EAAE,QAAQ,OAAO,EAAE;AAC7E,SAAO,KAAK,QAAQ,oBAAoB,GAAG;AAE3C,MAAI,CAAC,QAAQ,SAAS,OAAO,SAAS,MAAM;AAC1C,UAAM,MAAM,qBAAqB,QAAQ,KAAK;AAC9C,UAAM,UAAU,QAAQ,QAAQ,mBAAmB,GAAG;AACtD,WAAO,GAAG,OAAO,IAAI,GAAG;AAAA,EAC1B;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,UAAkC;AAC9D,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,IAAI,SAAS,YAAY;AAC/B,MAAI,EAAE,SAAS,KAAK,EAAG,QAAO;AAC9B,MAAI,EAAE,SAAS,MAAM,KAAK,EAAE,SAAS,KAAK,EAAG,QAAO;AACpD,MAAI,EAAE,SAAS,MAAM,EAAG,QAAO;AAC/B,MAAI,EAAE,SAAS,KAAK,EAAG,QAAO;AAC9B,MAAI,EAAE,SAAS,KAAK,EAAG,QAAO;AAC9B,MAAI,EAAE,SAAS,MAAM,EAAG,QAAO;AAC/B,MAAI,EAAE,SAAS,KAAK,EAAG,QAAO;AAC9B,MAAI,EAAE,SAAS,KAAK,EAAG,QAAO;AAC9B,MAAI,EAAE,SAAS,KAAK,EAAG,QAAO;AAC9B,SAAO;AACT;AAEA,eAAe,oBAAoB,OAA4C;AAC7E,MAAI,CAAC,MAAO,QAAO;AAEnB,MAAI,iBAAiB,YAAY;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,aAAa;AAChC,WAAO,IAAI,WAAW,KAAK;AAAA,EAC7B;AAEA,MAAI,OAAO,SAAS,eAAe,iBAAiB,MAAM;AACxD,UAAM,cAAc,MAAM,MAAM,YAAY;AAC5C,WAAO,IAAI,WAAW,WAAW;AAAA,EACnC;AAEA,MAAI,OAAO,UAAU,UAAU;AAE7B,QAAI,MAAM,WAAW,OAAO,GAAG;AAC7B,YAAM,WAAW,MAAM,QAAQ,GAAG;AAClC,UAAI,aAAa,IAAI;AACnB,cAAM,OAAO,MAAM,UAAU,GAAG,QAAQ;AACxC,cAAM,UAAU,MAAM,UAAU,WAAW,CAAC;AAC5C,YAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,cAAI,OAAO,SAAS,YAAY;AAC9B,kBAAM,SAAS,KAAK,OAAO;AAC3B,kBAAM,QAAQ,IAAI,WAAW,OAAO,MAAM;AAC1C,qBAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,oBAAM,CAAC,IAAI,OAAO,WAAW,CAAC;AAAA,YAChC;AACA,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO,IAAI,YAAY,EAAE,OAAO,KAAK;AAAA,EACvC;AAEA,SAAO;AACT;AAMA,eAAsB,cACpB,UACA,UAAgC,CAAC,GACH;AAE9B,QAAM,aAAa,iBAAiB,UAAU;AAAA,IAC5C,mBAAmB,QAAQ;AAAA,IAC3B,qBAAqB,QAAQ;AAAA,IAC7B,GAAG,QAAQ;AAAA,EACb,CAAC;AAED,MAAI,CAAC,WAAW,SAAS,CAAC,WAAW,MAAM;AACzC,UAAM,oBAAoB,mCAAmC,WAAW,OAAO,MAAM;AAAA,IACnF,WAAW,OAAO,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,KAAK,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI;AAE/E,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ,WAAW;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAwB,KAAK,MAAM,KAAK,UAAU,WAAW,IAAI,CAAC;AAGxE,MAAI,QAAQ,UAAU;AACpB,YAAQ,WAAW;AAAA,MACjB,GAAI,QAAQ,YAAY;AAAA,QACtB,OAAO;AAAA,QACP,aAAa;AAAA,QACb,QAAQ;AAAA,QACR,MAAM,CAAC;AAAA,QACP,UAAU;AAAA,QACV,SAAS;AAAA,MACX;AAAA,MACA,GAAG,QAAQ;AAAA,MACX,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAAA,EACF;AAGA,QAAM,kBAAkB,uBAAuB,QAAQ,QAAQ;AAC/D,QAAM,gBAAgB,oBAAI,IAAqC;AAC/D,aAAW,QAAQ,iBAAiB;AAClC,QAAI,CAAC,cAAc,IAAI,KAAK,OAAO,GAAG;AACpC,oBAAc,IAAI,KAAK,SAAS,IAAI;AAAA,IACtC;AAAA,EACF;AAGA,QAAM,eAAe,4BAA4B,QAAQ,UAAU,QAAQ,iBAAiB;AAG5F,QAAM,iBAAsC,CAAC;AAC7C,QAAM,eAA2C,CAAC;AAClD,QAAM,wBAAmD,CAAC;AAC1D,QAAM,mBAAmB,oBAAI,IAAY;AAEzC,aAAW,CAAC,SAAS,QAAQ,KAAK,cAAc,QAAQ,GAAG;AACzD,QAAI;AACJ,QAAI,aAAiC,SAAS,UAAU;AACxD,QAAI,iBAAqC,SAAS,UAAU;AAG5D,QAAI,QAAQ,QAAQ;AAClB,UAAI,QAAQ,kBAAkB,KAAK;AACjC,mBAAW,QAAQ,OAAO,IAAI,OAAO;AAAA,MACvC,WAAW,OAAO,QAAQ,WAAW,YAAY,WAAW,QAAQ,QAAQ;AAC1E,mBAAW,QAAQ,OAAO,OAAO;AAAA,MACnC;AAAA,IACF;AAGA,QAAI,CAAC,YAAY,QAAQ,eAAe;AACtC,UAAI;AACF,mBAAW,MAAM,QAAQ,cAAc,SAAS,QAAQ;AAAA,MAC1D,SAAS,KAAK;AACZ,8BAAsB,KAAK;AAAA,UACzB,MAAM;AAAA,UACN,SAAS,uCAAuC,OAAO,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,UAC7G,MAAM,SAAS;AAAA,UACf,QAAQ,SAAS;AAAA,QACnB,CAAC;AACD;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,YAAY,QAAQ,eAAe,SAAS;AAC/C,UAAI;AACF,cAAM,WAAW,MAAM,QAAQ,cAAc,QAAQ,OAAO;AAC5D,YAAI,UAAU;AACZ,qBAAW;AAAA,QACb;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAGA,QAAI,gBAAyB;AAC7B,QAAI,YAAY,OAAO,aAAa,YAAY,UAAU,UAAU;AAClE,YAAM,WAAW;AACjB,sBAAgB,SAAS;AACzB,UAAI,SAAS,SAAU,cAAa,SAAS;AAC7C,UAAI,SAAS,SAAU,kBAAiB,SAAS;AAAA,IACnD;AAEA,UAAM,aAAa,MAAM,oBAAoB,aAAa;AAE1D,QAAI,YAAY;AAEd,YAAM,gBAAgB,iBAAiB,gBAAgB,SAAS,UAAU;AAC1E,UAAI,cAAc,UAAU,aAAa;AAGzC,UAAI,UAAU;AACd,aAAO,iBAAiB,IAAI,WAAW,GAAG;AACxC,cAAM,SAAS,cAAc,YAAY,GAAG;AAC5C,YAAI,WAAW,IAAI;AACjB,wBAAc,UAAU,cAAc,UAAU,GAAG,MAAM,CAAC,IAAI,OAAO,GAAG,cAAc,UAAU,MAAM,CAAC;AAAA,QACzG,OAAO;AACL,wBAAc,UAAU,aAAa,IAAI,OAAO;AAAA,QAClD;AACA;AAAA,MACF;AACA,uBAAiB,IAAI,WAAW;AAEhC,YAAM,WAAW,cAAc;AAC/B,YAAM,WAAW,MAAM,kBAAkB,UAAU;AAEnD,qBAAe,KAAK;AAAA,QAClB,IAAI;AAAA,QACJ,MAAM;AAAA,QACN;AAAA,QACA,MAAM,WAAW;AAAA,QACjB;AAAA,MACF,CAAC;AAED,mBAAa,WAAW,IAAI;AAAA,IAC9B,OAAO;AAEL,YAAM,aAAa,QAAQ,SAAS,UAAU,eAAe,QAAQ,qBAAqB;AAE1F,UAAI,CAAC,YAAY;AACf,8BAAsB,KAAK;AAAA,UACzB,MAAM;AAAA,UACN,SAAS,mBAAmB,OAAO;AAAA,UACnC,MAAM,SAAS;AAAA,UACf,QAAQ,SAAS;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,MAAI,sBAAsB,SAAS,GAAG;AACpC,UAAM,oBAAoB,gCAAgC,sBAAsB,MAAM;AAAA,IACpF,sBAAsB,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,KAAK,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI;AAEnF,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAGA,QAAM,WAA6B,QAAQ,YAAY;AAAA,IACrD,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,MAAM,CAAC;AAAA,IACP,UAAU;AAAA,IACV,SAAS;AAAA,IACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AAEA,QAAM,WAAqB;AAAA,IACzB,QAAQ;AAAA,IACR,eAAe,QAAQ,WAAW;AAAA,IAClC,gBAAgB,QAAQ,kBAAkB;AAAA,IAC1C,sBAAsB,QAAQ,wBAAwB;AAAA,IACtD,oBAAoB,aAAa;AAAA,IACjC,sBAAsB,aAAa;AAAA,IACnC,QAAQ;AAAA,IACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AAGA,eAAa,eAAe,QAAI,uBAAQ,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AACzE,eAAa,WAAW,QAAI,uBAAQ,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AACpE,eAAa,eAAe,QAAI,uBAAQ,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAGzE,QAAM,cAAU,uBAAQ,cAAc,EAAE,OAAO,EAAE,CAAC;AAElD,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,YAAY,eAAe;AAAA,EAC7B;AACF;AAKO,IAAM,qBAAqB;;;ACvgBlC,IAAAC,iBAAqC;AACrC,IAAAC,iBAQO;AA2CA,IAAM,0BAAoD;AAAA,EAC/D,gBAAgB,KAAK,OAAO;AAAA;AAAA,EAC5B,qBAAqB,MAAM,OAAO;AAAA;AAAA,EAClC,cAAc;AAAA,EACd,cAAc,KAAK,OAAO;AAAA;AAC5B;AA8QO,SAAS,gBAAgB,UAA2B;AACzD,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AAGtD,MAAI,SAAS,SAAS,IAAI,EAAG,QAAO;AAGpC,MAAI,SAAS,WAAW,GAAG,KAAK,SAAS,WAAW,IAAI,KAAK,aAAa,KAAK,QAAQ,GAAG;AACxF,WAAO;AAAA,EACT;AAGA,QAAM,aAAa,SAAS,QAAQ,OAAO,GAAG;AAG9C,QAAM,WAAW,WAAW,MAAM,GAAG;AACrC,aAAW,OAAO,UAAU;AAC1B,QAAI,QAAQ,QAAQ,IAAI,KAAK,MAAM,MAAM;AACvC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAMA,eAAsB,iBACpB,aACA,UAA4B,CAAC,GACH;AAC1B,QAAM,SAAmC;AAAA,IACvC,GAAG;AAAA,IACH,GAAG,QAAQ;AAAA,EACb;AAEA,QAAM,gBAAgB,QAAQ,uBAAuB;AACrD,QAAM,oBAAoB,QAAQ,qBAAqB;AACvD,QAAM,cAAqC,CAAC;AAE5C,MAAI,mBAA4C,QAAQ,oBAAoB;AAC5E,MAAI,CAAC,QAAQ,kBAAkB;AAC7B,QAAI,QAAQ,0BAA0B,QAAQ,0BAA0B;AACtE,yBAAmB;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,yBAAiD,QAAQ,0BAA0B;AAEzF,QAAM,eAAe,uBAAuB,aAAa,cAAc,IAAI,WAAW,WAAW;AAGjG,MAAI,CAAC,gBAAgB,aAAa,eAAe,GAAG;AAClD,gBAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,IACX,CAAC;AACD,WAAO,YAAY,OAAO,OAAO,EAAE,eAAe,kBAAkB,wBAAwB,YAAY,CAAC;AAAA,EAC3G;AAEA,MAAI,aAAa,aAAa,OAAO,gBAAgB;AACnD,gBAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS,iBAAiB,aAAa,UAAU,oCAAoC,OAAO,cAAc;AAAA,MAC1G,SAAS,EAAE,aAAa,aAAa,YAAY,YAAY,OAAO,eAAe;AAAA,IACrF,CAAC;AACD,WAAO,YAAY,OAAO,OAAO,EAAE,eAAe,kBAAkB,wBAAwB,YAAY,CAAC;AAAA,EAC3G;AAGA,MAAI;AACJ,MAAI;AACF,mBAAW,0BAAU,YAAY;AAAA,EACnC,SAAS,KAAK;AACZ,gBAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS,4BAA4B,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IACvF,CAAC;AACD,WAAO,YAAY,OAAO,OAAO,EAAE,eAAe,kBAAkB,wBAAwB,YAAY,CAAC;AAAA,EAC3G;AAEA,QAAM,UAAU,OAAO,KAAK,QAAQ;AAGpC,MAAI,QAAQ,SAAS,OAAO,cAAc;AACxC,gBAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS,uBAAuB,QAAQ,MAAM,8BAA8B,OAAO,YAAY;AAAA,MAC/F,SAAS,EAAE,WAAW,QAAQ,QAAQ,OAAO,OAAO,aAAa;AAAA,IACnE,CAAC;AAAA,EACH;AAGA,MAAI,yBAAyB;AAC7B,aAAW,aAAa,SAAS;AAE/B,QAAI,gBAAgB,SAAS,GAAG;AAC9B,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,qFAAqF,SAAS;AAAA,QACvG,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAGA,QAAI,UAAU,WAAW,SAAS,KAAK,yBAAyB,SAAS,GAAG;AAC1E,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,+FAA+F,SAAS;AAAA,QACjH,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,UAAM,YAAY,SAAS,SAAS;AACpC,QAAI,WAAW;AACb,gCAA0B,UAAU;AAGpC,UAAI,UAAU,WAAW,SAAS,KAAK,UAAU,aAAa,OAAO,cAAc;AACjF,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,UAAU,SAAS,WAAW,UAAU,UAAU,oCAAoC,OAAO,YAAY;AAAA,UAClH,MAAM;AAAA,UACN,SAAS,EAAE,aAAa,UAAU,YAAY,YAAY,OAAO,aAAa;AAAA,QAChF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,yBAAyB,OAAO,qBAAqB;AACvD,gBAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS,oCAAoC,sBAAsB,oCAAoC,OAAO,mBAAmB;AAAA,MACjI,SAAS,EAAE,aAAa,wBAAwB,YAAY,OAAO,oBAAoB;AAAA,IACzF,CAAC;AAAA,EACH;AAGA,MAAI,aAAa,aAAa,YAAY,sBAAsB,GAAG;AACjE,gBAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,SAAS,EAAE,iBAAiB,aAAa,YAAY,mBAAmB,uBAAuB;AAAA,IACjG,CAAC;AAAA,EACH;AAGA,QAAM,gBAAgB,SAAS,eAAe;AAC9C,MAAI,CAAC,eAAe;AAClB,gBAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,QAAM,YAAY,SAAS,WAAW;AACtC,MAAI,CAAC,WAAW;AACd,gBAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAGA,MAAI,CAAC,iBAAiB,CAAC,aAAa,YAAY,KAAK,CAAC,MAAM,EAAE,SAAS,mBAAmB,GAAG;AAC3F,WAAO,YAAY,OAAO,OAAO;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAGA,MAAI;AACJ,MAAI;AACF,UAAM,eAAe,KAAK,UAAM,0BAAU,aAAa,CAAC;AACxD,UAAM,qBAAqB,uBAAuB,YAAY;AAC9D,QAAI,mBAAmB,OAAO;AAC5B,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,uCAAuC,mBAAmB,GAAG;AAAA,QACtE,MAAM,mBAAmB;AAAA,MAC3B,CAAC;AAAA,IACH;AAEA,UAAM,cAAc,8BAAe,UAAU,YAAY;AACzD,QAAI,CAAC,YAAY,SAAS;AACxB,YAAM,SAAS,YAAY,MAAM,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI;AACjG,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,+BAA+B,MAAM;AAAA,QAC9C,SAAS,EAAE,QAAQ,YAAY,MAAM,OAAO;AAAA,MAC9C,CAAC;AAAA,IACH,OAAO;AACL,uBAAiB,YAAY;AAAA,IAC/B;AAAA,EACF,SAAS,KAAK;AACZ,gBAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS,kDAAkD,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IAC7G,CAAC;AAAA,EACH;AAGA,MAAI;AACJ,QAAM,gBAAgB,SAAS,eAAe;AAC9C,MAAI,eAAe;AACjB,QAAI;AACF,oBAAc,KAAK,UAAM,0BAAU,aAAa,CAAC;AAAA,IACnD,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,MAAI;AACJ,MAAI;AACF,iBAAa,KAAK,UAAM,0BAAU,SAAS,CAAC;AAC5C,UAAM,iBAAiB,uBAAuB,UAAU;AACxD,QAAI,eAAe,OAAO;AACxB,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,uCAAuC,eAAe,GAAG;AAAA,QAClE,MAAM,eAAe;AAAA,MACvB,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,gBAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS,8CAA8C,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IACzG,CAAC;AAAA,EACH;AAEA,QAAM,aAAa,OAAO,YAAY,YAAY,WAC9C,WAAW,UACX,gBAAgB,iBAAiB;AAErC,MAAI,oBAAoB;AACxB,MAAI;AAEJ,MAAI,YAAY;AACd,QAAI,eAAe,eAAe;AAChC,UAAI,WAAW,YAAY,eAAe,iBAAiB,GAAG;AAC5D,4BAAoB;AACpB,wBAAgB,iBAAiB,YAAY,eAAe,iBAAiB,KAAK;AAClF,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,4BAA4B,UAAU,4CAA4C,aAAa;AAAA,UACxG,SAAS,EAAE,eAAe,YAAY,eAAe,cAAc;AAAA,QACrE,CAAC;AAAA,MACH,OAAO;AACL,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,4BAA4B,UAAU,wDAAwD,aAAa;AAAA,UACpH,SAAS,EAAE,eAAe,YAAY,cAAc;AAAA,QACtD,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AAEL,YAAM,gBAAgB,iBAAiB,YAAY;AAAA,QACjD,mBAAmB,QAAQ;AAAA,QAC3B,qBAAqB,QAAQ;AAAA,MAC/B,CAAC;AACD,YAAM,oBAAoB,cAAc,OAAO,OAAO,CAAC,MAAM;AAC3D,YAAI,EAAE,SAAS,4BAA4B,qBAAqB,UAAU;AACxE,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT,CAAC;AACD,UAAI,kBAAkB,SAAS,GAAG;AAChC,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,mCAAmC,kBAAkB,MAAM;AAAA,IAClE,kBAAkB,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,KAAK,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI;AAAA,QACjF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,QAAM,oBAA8B,CAAC;AACrC,QAAM,sBAAgC,CAAC;AACvC,QAAM,iBAAkC,CAAC;AAGzC,QAAM,sBAAsB,oBAAI,IAAY;AAC5C,MAAI,QAAQ,kBAAkB;AAC5B,QAAI,MAAM,QAAQ,QAAQ,gBAAgB,GAAG;AAC3C,iBAAW,MAAM,QAAQ,iBAAkB,qBAAoB,IAAI,EAAE;AAAA,IACvE,WAAW,QAAQ,4BAA4B,KAAK;AAClD,iBAAW,MAAM,QAAQ,iBAAkB,qBAAoB,IAAI,EAAE;AAAA,IACvE;AAAA,EACF;AAGA,MAAI,QAAQ,eAAe,QAAQ,CAAC,QAAQ,kBAAkB;AAC5D,QAAI;AACF,YAAM,OAAO,MAAM,QAAQ,cAAc,KAAK;AAC9C,UAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,mBAAW,QAAQ,MAAM;AACvB,cAAI,MAAM,GAAI,qBAAoB,IAAI,KAAK,EAAE;AAAA,QAC/C;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI,gBAAgB;AAClB,eAAW,aAAa,eAAe,QAAQ;AAE7C,YAAM,YAAY,SAAS,UAAU,IAAI;AACzC,UAAI,CAAC,WAAW;AACd,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,mBAAmB,UAAU,EAAE,oCAAoC,UAAU,IAAI;AAAA,UAC1F,MAAM,UAAU;AAAA,UAChB,SAAS,EAAE,SAAS,UAAU,GAAG;AAAA,QACnC,CAAC;AACD;AAAA,MACF;AAGA,UAAI,UAAU,eAAe,UAAU,MAAM;AAC3C,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,UAAU,UAAU,EAAE,6BAA6B,UAAU,IAAI,iBAAiB,UAAU,UAAU;AAAA,UAC/G,MAAM,UAAU;AAAA,UAChB,SAAS,EAAE,SAAS,UAAU,IAAI,UAAU,UAAU,MAAM,QAAQ,UAAU,WAAW;AAAA,QAC3F,CAAC;AAAA,MACH;AAGA,UAAI,UAAU,UAAU;AACtB,cAAM,iBAAiB,MAAM,kBAAkB,SAAS;AACxD,YAAI,mBAAmB,UAAU,UAAU;AACzC,sBAAY,KAAK;AAAA,YACf,MAAM;AAAA,YACN,UAAU;AAAA,YACV,SAAS,UAAU,UAAU,EAAE,iCAAiC,UAAU,QAAQ,gBAAgB,cAAc;AAAA,YAChH,MAAM,UAAU;AAAA,YAChB,SAAS,EAAE,SAAS,UAAU,IAAI,UAAU,UAAU,UAAU,QAAQ,eAAe;AAAA,UACzF,CAAC;AAAA,QACH;AAAA,MACF;AAGA,UAAI,aAAa;AACjB,UAAI,OAAO,QAAQ,qBAAqB,YAAY;AAClD,cAAM,QAAQ,MAAM,QAAQ,iBAAiB,UAAU,EAAE;AACzD,YAAI,MAAO,cAAa;AAAA,MAC1B,WAAW,oBAAoB,IAAI,UAAU,EAAE,GAAG;AAChD,qBAAa;AAAA,MACf;AAEA,UAAI,YAAY;AACd,uBAAe,KAAK;AAAA,UAClB,SAAS,UAAU;AAAA,UACnB,MAAM,UAAU;AAAA,UAChB,UAAU,UAAU;AAAA,UACpB,MAAM,UAAU;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI,eAAe,SAAS,GAAG;AAC7B,YAAM,cAAc,eAAe,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI;AAClE,UAAI,2BAA2B,YAAY,CAAC,QAAQ,iBAAiB;AACnE,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,0CAA0C,WAAW;AAAA,UAC9D,SAAS,EAAE,gBAAgB,UAAU,uBAAuB;AAAA,QAC9D,CAAC;AAAA,MACH,OAAO;AACL,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,0CAA0C,WAAW,eAAe,sBAAsB;AAAA,UACnG,SAAS,EAAE,gBAAgB,UAAU,uBAAuB;AAAA,QAC9D,CAAC;AAAA,MACH;AAAA,IACF;AAGA,UAAM,WAAW,oBAAI,IAAY;AACjC,QAAI,QAAQ,qBAAqB;AAC/B,iBAAW,KAAK,QAAQ,oBAAqB,UAAS,IAAI,CAAC;AAAA,IAC7D;AAEA,UAAM,WAAW,CAAC,QAAQ,WAAW,aAAa,WAAW,WAAW,QAAQ,SAAS,UAAU,YAAY;AAC/G,eAAW,KAAK,SAAU,UAAS,IAAI,CAAC;AAExC,eAAW,YAAY,eAAe,oBAAoB;AACxD,UAAI,cAAc,SAAS,IAAI,QAAQ;AACvC,UAAI,CAAC,eAAe,QAAQ,mBAAmB;AAC7C,sBAAc,QAAQ,kBAAkB,IAAI,QAAQ;AAAA,MACtD;AACA,UAAI,CAAC,aAAa;AAChB,0BAAkB,KAAK,QAAQ;AAAA,MACjC;AAAA,IACF;AAEA,QAAI,kBAAkB,SAAS,GAAG;AAChC,UAAI,qBAAqB,YAAY,CAAC,QAAQ,wBAAwB;AACpE,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,gEAAgE,kBAAkB,KAAK,IAAI,CAAC;AAAA,UACrG,SAAS,EAAE,mBAAmB,QAAQ,iBAAiB;AAAA,QACzD,CAAC;AAAA,MACH,WAAW,qBAAqB,6BAA6B,QAAQ,wBAAwB;AAC3F,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,yCAAyC,kBAAkB,KAAK,IAAI,CAAC;AAAA,UAC9E,SAAS,EAAE,mBAAmB,QAAQ,iBAAiB;AAAA,QACzD,CAAC;AAAA,MACH,WAAW,qBAAqB,qCAAqC;AACnE,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,yCAAyC,kBAAkB,KAAK,IAAI,CAAC;AAAA,UAC9E,SAAS,EAAE,mBAAmB,QAAQ,iBAAiB;AAAA,QACzD,CAAC;AAAA,MACH;AAAA,IACF;AAGA,UAAM,gBAAgB,oBAAI,IAAY;AACtC,QAAI,QAAQ,uBAAuB;AACjC,iBAAW,KAAK,QAAQ,sBAAuB,eAAc,IAAI,CAAC;AAAA,IACpE;AAEA,eAAW,OAAO,eAAe,sBAAsB;AACrD,UAAI,CAAC,cAAc,IAAI,GAAG,GAAG;AAC3B,4BAAoB,KAAK,GAAG;AAAA,MAC9B;AAAA,IACF;AAEA,QAAI,oBAAoB,SAAS,GAAG;AAClC,UAAI,qBAAqB,YAAY,CAAC,QAAQ,0BAA0B;AACtE,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,mEAAmE,oBAAoB,KAAK,IAAI,CAAC;AAAA,UAC1G,SAAS,EAAE,qBAAqB,QAAQ,iBAAiB;AAAA,QAC3D,CAAC;AAAA,MACH,WAAW,qBAAqB,6BAA6B,QAAQ,0BAA0B;AAC7F,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,6CAA6C,oBAAoB,KAAK,IAAI,CAAC;AAAA,UACpF,SAAS,EAAE,qBAAqB,QAAQ,iBAAiB;AAAA,QAC3D,CAAC;AAAA,MACH,WAAW,qBAAqB,qCAAqC;AACnE,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,UAAU;AAAA,UACV,SAAS,6CAA6C,oBAAoB,KAAK,IAAI,CAAC;AAAA,UACpF,SAAS,EAAE,qBAAqB,QAAQ,iBAAiB;AAAA,QAC3D,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,YAAY,KAAK,CAAC,MAAM,EAAE,aAAa,OAAO;AAChE,QAAM,QAAQ,CAAC;AACf,QAAM,YAAY;AAElB,SAAO,YAAY,OAAO,WAAW;AAAA,IACnC,UAAU;AAAA,IACV;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,gBAAgB,OAAO,UAAU;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,YACP,OACA,WACA,QACiB;AACjB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,eAAe,OAAO,iBAAiB;AAAA,IACvC,mBAAmB,OAAO,qBAAqB;AAAA,IAC/C,mBAAmB,OAAO,qBAAqB,CAAC;AAAA,IAChD,qBAAqB,OAAO,uBAAuB,CAAC;AAAA,IACpD,kBAAkB,OAAO,oBAAoB;AAAA,IAC7C,YAAY,OAAO,cAAc;AAAA,IACjC,gBAAgB,OAAO,kBAAkB,CAAC;AAAA,IAC1C,wBAAwB,OAAO,0BAA0B;AAAA,IACzD,wBAAwB,OAAO,0BAA0B;AAAA,IACzD,aAAa,OAAO,eAAe,CAAC;AAAA,IACpC,GAAG;AAAA,EACL;AACF;AAMO,IAAM,uBAAuB;AAK7B,IAAM,iBAAiB;AAKvB,SAAS,2BACd,UACA,aACQ;AACR,MAAI,YAAY,GAAG,SAAS,EAAE;AAC9B,MAAI,UAAU;AACd,SAAO,YAAY,IAAI,SAAS,GAAG;AACjC,gBAAY,GAAG,SAAS,EAAE,aAAa,OAAO;AAC9C;AAAA,EACF;AACA,SAAO;AACT;AAMA,eAAsB,cACpB,aACA,UAAgC,CAAC,GACH;AAE9B,MAAI,YAAY,MAAM,iBAAiB,aAAa,OAAO;AAG3D,QAAM,mBAAmB,QAAQ,oBAAoB,UAAU;AAC/D,MACE,qBAAqB,wCACpB,UAAU,kBAAkB,SAAS,KAAK,UAAU,oBAAoB,SAAS,MAClF,QAAQ,qBACR;AACA,QAAI;AACF,YAAM,QAAQ;AAAA,QACZ;AAAA,UACE,YAAY,CAAC,GAAG,UAAU,iBAAiB;AAAA,UAC3C,cAAc,CAAC,GAAG,UAAU,mBAAmB;AAAA,QACjD;AAAA,QACA;AAAA,MACF;AAGA,kBAAY,MAAM,iBAAiB,aAAa;AAAA,QAC9C,GAAG;AAAA,QACH,kBAAkB;AAAA;AAAA,MACpB,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,YAAM,OAA4B;AAAA,QAChC,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,2CAA2C,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MACtG;AACA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,CAAC,IAAI;AAAA,QACb,mBAAmB,KAAK;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,UAAU,aAAa,CAAC,UAAU,UAAU;AAC/C,UAAM,mBAAmB,UAAU,YAAY,OAAO,CAAC,MAAM,EAAE,aAAa,OAAO;AACnF,UAAM,oBAAoB,gCAAgC,iBAAiB,MAAM;AAAA,IAC/E,iBAAiB,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE,OAAO,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI;AAEjG,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,uBAAuB,aAAa,cAAc,IAAI,WAAW,WAAW;AACjG,QAAM,eAAW,0BAAU,YAAY;AAGvC,QAAM,UAAU,KAAK,UAAM,0BAAU,SAAS,WAAW,CAAC,CAAC;AAC3D,MAAI;AAEJ,MAAI,UAAU,mBAAmB;AAC/B,UAAM,oBAAoB,QAAQ,qBAAqB;AACvD,UAAM,eAAe,gBAAgB,SAAS;AAAA,MAC5C,eAAe,QAAQ,uBAAuB;AAAA,MAC9C,UAAU;AAAA,MACV,UAAU;AAAA,IACZ,CAAC;AAED,QAAI,CAAC,aAAa,WAAW,CAAC,aAAa,UAAU;AACnD,YAAM,MAA2B;AAAA,QAC/B,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,oCAAoC,UAAU,aAAa,SAAS,UAAU,aAAa;AAAA,QACpG,SAAS,EAAE,YAAY,aAAa,WAAW;AAAA,MACjD;AACA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,CAAC,GAAG;AAAA,QACZ,mBAAmB,IAAI;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAEA,oBAAgB,aAAa;AAAA,EAC/B,OAAO;AACL,oBAAgB;AAAA,EAClB;AAGA,MAAI,WAA6B,cAAc,YAAY;AAAA,IACzD,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,MAAM,CAAC;AAAA,IACP,UAAU;AAAA,IACV,SAAS,cAAc,WAAW;AAAA,EACpC;AAEA,MAAI,SAAS,eAAe,GAAG;AAC7B,QAAI;AACF,YAAM,eAAe,KAAK,UAAM,0BAAU,SAAS,eAAe,CAAC,CAAC;AACpE,iBAAW;AAAA,QACT,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,gBAAc,WAAW;AAGzB,QAAM,sBAAsB,oBAAI,IAAY;AAC5C,MAAI,QAAQ,kBAAkB;AAC5B,QAAI,MAAM,QAAQ,QAAQ,gBAAgB,GAAG;AAC3C,iBAAW,MAAM,QAAQ,iBAAkB,qBAAoB,IAAI,EAAE;AAAA,IACvE,WAAW,QAAQ,4BAA4B,KAAK;AAClD,iBAAW,MAAM,QAAQ,iBAAkB,qBAAoB,IAAI,EAAE;AAAA,IACvE;AAAA,EACF;AAEA,MAAI,QAAQ,eAAe,QAAQ,CAAC,QAAQ,kBAAkB;AAC5D,QAAI;AACF,YAAM,OAAO,MAAM,QAAQ,cAAc,KAAK;AAC9C,UAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,mBAAW,QAAQ,MAAM;AACvB,cAAI,MAAM,GAAI,qBAAoB,IAAI,KAAK,EAAE;AAAA,QAC/C;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,gBAAgB,QAAQ,uBAAuB;AACrD,QAAM,YAAoC,CAAC;AAC3C,QAAM,kBAAkB,oBAAI,IAA4B;AAGxD,aAAW,aAAa,UAAU,SAAS,QAAQ;AACjD,UAAM,aAAa,SAAS,UAAU,IAAI;AAC1C,QAAI,YAAY;AACd,UAAI,gBAAgB,UAAU;AAC9B,UAAI,oBAA4C,QAAQ,0BAA0B;AAElF,YAAM,eAAe,UAAU,eAAe,KAAK,CAAC,MAAM,EAAE,YAAY,UAAU,EAAE;AAEpF,UAAI,cAAc;AAChB,YAAI,QAAQ,iBAAiB;AAC3B,cAAI;AACF,kBAAM,cAAc,MAAM,QAAQ,gBAAgB,YAAY;AAC9D,gBAAI,OAAO,gBAAgB,UAAU;AACnC,kCAAoB;AAAA,YACtB,OAAO;AACL,kCAAoB,YAAY;AAChC,kBAAI,YAAY,YAAY;AAC1B,gCAAgB,YAAY;AAAA,cAC9B;AAAA,YACF;AAAA,UACF,SAAS,KAAK;AACZ,kBAAM,OAA4B;AAAA,cAChC,MAAM;AAAA,cACN,UAAU;AAAA,cACV,SAAS,iDAAiD,UAAU,EAAE,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,cAC5H,MAAM,UAAU;AAAA,YAClB;AACA,mBAAO;AAAA,cACL,SAAS;AAAA,cACT,QAAQ,CAAC,IAAI;AAAA,cACb,mBAAmB,KAAK;AAAA,cACxB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,YAAI,sBAAsB,UAAU;AAClC,gBAAM,OAA4B;AAAA,YAChC,MAAM;AAAA,YACN,UAAU;AAAA,YACV,SAAS,0BAA0B,UAAU,EAAE;AAAA,YAC/C,MAAM,UAAU;AAAA,UAClB;AACA,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,QAAQ,CAAC,IAAI;AAAA,YACb,mBAAmB,KAAK;AAAA,YACxB;AAAA,UACF;AAAA,QACF;AAEA,YAAI,sBAAsB,UAAU;AAClC,cAAI,kBAAkB,UAAU,IAAI;AAClC,4BAAgB,cAAc,WAAW,mBAAmB;AAAA,UAC9D;AACA,oBAAU,UAAU,EAAE,IAAI;AAC1B,8BAAoB,IAAI,aAAa;AAAA,QACvC;AAAA,MACF;AAEA,UAAI;AAEJ,UAAI,sBAAsB,oBAAoB,cAAc;AAE1D,YAAI,QAAQ,eAAe,SAAS;AAClC,qBAAW,MAAM,QAAQ,cAAc,QAAQ,aAAa;AAAA,QAC9D;AAAA,MACF,OAAO;AAEL,cAAM,gBAAmC;AAAA,UACvC,GAAG;AAAA,UACH,IAAI;AAAA,QACN;AAEA,YAAI,QAAQ,eAAe;AACzB,cAAI;AACF,kBAAM,SAAS,MAAM,QAAQ,cAAc,eAAe,YAAY,aAAa;AACnF,gBAAI,OAAQ,YAAW;AAAA,UACzB,SAAS,KAAK;AACZ,kBAAM,OAA4B;AAAA,cAChC,MAAM;AAAA,cACN,UAAU;AAAA,cACV,SAAS,sCAAsC,aAAa,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,cAClH,MAAM,UAAU;AAAA,YAClB;AACA,mBAAO;AAAA,cACL,SAAS;AAAA,cACT,QAAQ,CAAC,IAAI;AAAA,cACb,mBAAmB,KAAK;AAAA,cACxB;AAAA,YACF;AAAA,UACF;AAAA,QACF,WAAW,QAAQ,eAAe,QAAQ;AACxC,cAAI;AACF,kBAAM,OAAO,IAAI,KAAK,CAAC,UAAU,GAAG,EAAE,MAAM,UAAU,SAAS,CAAC;AAChE,kBAAM,WAAW,UAAU,KAAK,QAAQ,aAAa,EAAE;AACvD,kBAAM,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,UAAU,EAAE,MAAM,UAAU,SAAS,CAAC;AACpE,kBAAM,OAAO,MAAM,QAAQ,cAAc,OAAO,MAAM;AAAA,cACpD,SAAS;AAAA,cACT,iBAAiB,UAAU;AAAA,YAC7B,CAAC;AACD,gBAAI,KAAM,YAAW;AAAA,UACvB,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAEA,sBAAgB,IAAI,eAAe;AAAA,QACjC,OAAO;AAAA,QACP,MAAM;AAAA,UACJ,GAAG;AAAA,UACH,IAAI;AAAA,QACN;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,OAAO,KAAK,SAAS,EAAE,SAAS,GAAG;AACrC,iCAA6B,eAAe,SAAS;AAAA,EACvD;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU,UAAU;AAAA,IACpB;AAAA,IACA;AAAA,IACA,eAAe,OAAO,KAAK,SAAS,EAAE,SAAS,IAAI,YAAY;AAAA,IAC/D;AAAA,EACF;AACF;AAKO,IAAM,qBAAqB;;;ACpmClC,SAAS,qBAAqB,KAAqC;AACjE,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,QAAM,MAAM;AACZ,SAAO,IAAI,SAAS,WAAW,OAAO,IAAI,YAAY,YAAY,IAAI,QAAQ,KAAK,EAAE,SAAS;AAChG;AAEA,SAAS,sBAAsB,KAAsC;AACnE,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,QAAM,MAAM;AACZ,SAAO,IAAI,SAAS,cAAc,OAAO,IAAI,QAAQ,YAAY,IAAI,IAAI,KAAK,EAAE,SAAS;AAC3F;AAEA,SAAS,oBAAoB,KAAoC;AAC/D,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,QAAM,MAAM;AACZ,SAAO,IAAI,SAAS,UAAa,OAAO,IAAI,SAAS,YAAY,IAAI,KAAK,KAAK,EAAE,SAAS,MAAM,aAAa,OAAO,OAAO,KAAK,GAAG,EAAE,UAAU;AACjJ;AAEA,SAAS,iBACP,IACA,YACQ;AACR,MAAI,CAAC,WAAY,QAAO;AACxB,MAAI,sBAAsB,KAAK;AAC7B,WAAO,WAAW,IAAI,EAAE,KAAK;AAAA,EAC/B;AACA,SAAO,WAAW,EAAE,KAAK;AAC3B;AAEA,SAAS,UAAU,GAAY,GAAqB;AAClD,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,QAAQ,MAAM,QAAQ,OAAO,MAAM,YAAY,OAAO,MAAM,UAAU;AAC9E,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,EAAG,QAAO;AAElD,MAAI,MAAM,QAAQ,CAAC,KAAK,MAAM,QAAQ,CAAC,GAAG;AACxC,QAAI,EAAE,WAAW,EAAE,OAAQ,QAAO;AAClC,aAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,UAAI,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAG,QAAO;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,OAAO;AACb,QAAM,OAAO;AACb,QAAM,QAAQ,OAAO,KAAK,IAAI;AAC9B,QAAM,QAAQ,OAAO,KAAK,IAAI;AAE9B,MAAI,MAAM,WAAW,MAAM,OAAQ,QAAO;AAC1C,aAAW,KAAK,OAAO;AACrB,QAAI,CAAC,OAAO,UAAU,eAAe,KAAK,MAAM,CAAC,EAAG,QAAO;AAC3D,QAAI,CAAC,UAAU,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,EAAG,QAAO;AAAA,EAC3C;AACA,SAAO;AACT;AAMA,SAAS,kBACP,MACA,UACA,QACA,aACA,SACM;AAEN,MAAI,sBAAsB,QAAQ,GAAG;AACnC,QAAI,CAAC,sBAAsB,MAAM,GAAG;AAClC,kBAAY,KAAK;AAAA,QACf;AAAA,QACA,MAAM;AAAA,QACN,SAAS,iCAAiC,IAAI;AAAA,QAC9C;AAAA,QACA;AAAA,MACF,CAAC;AACD;AAAA,IACF;AACA,UAAM,aAAa;AACnB,UAAM,aAAa;AACnB,QAAI,WAAW,QAAQ,WAAW,KAAK;AACrC,kBAAY,KAAK;AAAA,QACf,MAAM,GAAG,IAAI;AAAA,QACb,MAAM;AAAA,QACN,SAAS,qCAAqC,IAAI,gBAAgB,WAAW,GAAG,WAAW,WAAW,GAAG;AAAA,QACzG,UAAU,WAAW;AAAA,QACrB,QAAQ,WAAW;AAAA,MACrB,CAAC;AAAA,IACH;AACA,QAAI,CAAC,UAAU,WAAW,UAAU,WAAW,QAAQ,GAAG;AACxD,kBAAY,KAAK;AAAA,QACf,MAAM,GAAG,IAAI;AAAA,QACb,MAAM;AAAA,QACN,SAAS,0CAA0C,IAAI;AAAA,QACvD,UAAU,WAAW;AAAA,QACrB,QAAQ,WAAW;AAAA,MACrB,CAAC;AAAA,IACH;AACA;AAAA,EACF;AAGA,MAAI,oBAAoB,QAAQ,KAAK,CAAC,qBAAqB,QAAQ,KAAK,CAAC,sBAAsB,QAAQ,GAAG;AACxG,QAAI,CAAC,oBAAoB,MAAM,GAAG;AAChC,kBAAY,KAAK;AAAA,QACf;AAAA,QACA,MAAM;AAAA,QACN,SAAS,+BAA+B,IAAI;AAAA,QAC5C;AAAA,QACA;AAAA,MACF,CAAC;AACD;AAAA,IACF;AACA,UAAM,YAAY;AAClB,UAAM,YAAY;AAClB,QAAI,UAAU,SAAS,UAAU,MAAM;AACrC,kBAAY,KAAK;AAAA,QACf,MAAM,GAAG,IAAI;AAAA,QACb,MAAM;AAAA,QACN,SAAS,oCAAoC,IAAI,gBAAgB,UAAU,IAAI,WAAW,UAAU,IAAI;AAAA,QACxG,UAAU,UAAU;AAAA,QACpB,QAAQ,UAAU;AAAA,MACpB,CAAC;AAAA,IACH;AACA,QAAI,CAAC,UAAU,UAAU,WAAW,CAAC,GAAG,UAAU,WAAW,CAAC,CAAC,GAAG;AAChE,kBAAY,KAAK;AAAA,QACf,MAAM,GAAG,IAAI;AAAA,QACb,MAAM;AAAA,QACN,SAAS,uCAAuC,IAAI;AAAA,QACpD,UAAU,UAAU;AAAA,QACpB,QAAQ,UAAU;AAAA,MACpB,CAAC;AAAA,IACH;AACA;AAAA,EACF;AAGA,MAAI,qBAAqB,QAAQ,GAAG;AAClC,QAAI,CAAC,qBAAqB,MAAM,GAAG;AACjC,kBAAY,KAAK;AAAA,QACf;AAAA,QACA,MAAM;AAAA,QACN,SAAS,gCAAgC,IAAI;AAAA,QAC7C;AAAA,QACA;AAAA,MACF,CAAC;AACD;AAAA,IACF;AACA,UAAM,WAAW;AACjB,UAAM,WAAW;AACjB,UAAM,mBAAmB,iBAAiB,SAAS,SAAS,SAAS,UAAU;AAE/E,QAAI,SAAS,YAAY,kBAAkB;AACzC,kBAAY,KAAK;AAAA,QACf,MAAM,GAAG,IAAI;AAAA,QACb,MAAM;AAAA,QACN,SAAS,mCAAmC,IAAI,gBAAgB,gBAAgB,iBAAiB,SAAS,OAAO,YAAY,SAAS,OAAO;AAAA,QAC7I,UAAU;AAAA,QACV,QAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH;AACA,QAAI,SAAS,aAAa,SAAS,UAAU;AAC3C,kBAAY,KAAK;AAAA,QACf,MAAM,GAAG,IAAI;AAAA,QACb,MAAM;AAAA,QACN,SAAS,yCAAyC,IAAI,gBAAgB,SAAS,QAAQ,WAAW,SAAS,QAAQ;AAAA,QACnH,UAAU,SAAS;AAAA,QACnB,QAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH;AACA,QAAI,SAAS,aAAa,SAAS,UAAU;AAC3C,kBAAY,KAAK;AAAA,QACf,MAAM,GAAG,IAAI;AAAA,QACb,MAAM;AAAA,QACN,SAAS,yCAAyC,IAAI,gBAAgB,SAAS,QAAQ,WAAW,SAAS,QAAQ;AAAA,QACnH,UAAU,SAAS;AAAA,QACnB,QAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH;AACA;AAAA,EACF;AAGA,MACE,aAAa,QACb,WAAW,QACX,OAAO,aAAa,YACpB,OAAO,WAAW,UAClB;AACA,QAAI,MAAM,QAAQ,QAAQ,MAAM,MAAM,QAAQ,MAAM,GAAG;AACrD,kBAAY,KAAK;AAAA,QACf;AAAA,QACA,MAAM;AAAA,QACN,SAAS,qBAAqB,IAAI;AAAA,QAClC;AAAA,QACA;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ,QAAQ,KAAK,MAAM,QAAQ,MAAM,GAAG;AACpD,UAAI,SAAS,WAAW,OAAO,QAAQ;AACrC,oBAAY,KAAK;AAAA,UACf;AAAA,UACA,MAAM;AAAA,UACN,SAAS,6BAA6B,IAAI,sBAAsB,SAAS,MAAM,SAAS,OAAO,MAAM;AAAA,UACrG;AAAA,UACA;AAAA,QACF,CAAC;AACD;AAAA,MACF;AACA,eAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,0BAAkB,GAAG,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC,GAAG,OAAO,CAAC,GAAG,aAAa,OAAO;AAAA,MACjF;AACA;AAAA,IACF;AAEA,UAAM,SAAS;AACf,UAAM,SAAS;AACf,UAAM,UAAU,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,MAAM,GAAG,GAAG,OAAO,KAAK,MAAM,CAAC,CAAC;AAExE,eAAW,OAAO,SAAS;AACzB,UAAI,EAAE,OAAO,SAAS;AACpB,oBAAY,KAAK;AAAA,UACf,MAAM,GAAG,IAAI,IAAI,GAAG;AAAA,UACpB,MAAM;AAAA,UACN,SAAS,8BAA8B,GAAG,SAAS,IAAI;AAAA,UACvD,QAAQ,OAAO,GAAG;AAAA,QACpB,CAAC;AAAA,MACH,WAAW,EAAE,OAAO,SAAS;AAC3B,oBAAY,KAAK;AAAA,UACf,MAAM,GAAG,IAAI,IAAI,GAAG;AAAA,UACpB,MAAM;AAAA,UACN,SAAS,8BAA8B,GAAG,SAAS,IAAI;AAAA,UACvD,UAAU,OAAO,GAAG;AAAA,QACtB,CAAC;AAAA,MACH,OAAO;AACL,0BAAkB,GAAG,IAAI,IAAI,GAAG,IAAI,OAAO,GAAG,GAAG,OAAO,GAAG,GAAG,aAAa,OAAO;AAAA,MACpF;AAAA,IACF;AACA;AAAA,EACF;AAGA,MAAI,aAAa,QAAQ;AACvB,gBAAY,KAAK;AAAA,MACf;AAAA,MACA,MAAM;AAAA,MACN,SAAS,sBAAsB,IAAI,gBAAgB,OAAO,QAAQ,CAAC,WAAW,OAAO,MAAM,CAAC;AAAA,MAC5F;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAKA,SAAS,cACP,UACA,UACA,QACA,cAAoC,CAAC,GAC/B;AACN,QAAM,cAAc,CAAC,QAAQ,WAAW,UAAU,QAAQ;AAC1D,QAAM,YAAY,YAAY,CAAC;AAC/B,QAAM,YAAY,UAAU,CAAC;AAE7B,aAAW,MAAM,aAAa;AAC5B,UAAM,QAAS,UAAU,EAAE,KAAqC,CAAC;AACjE,UAAM,QAAS,UAAU,EAAE,KAAqC,CAAC;AAEjE,UAAM,UAAU,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,KAAK,GAAG,GAAG,OAAO,KAAK,KAAK,CAAC,CAAC;AACtE,eAAW,OAAO,SAAS;AACzB,YAAM,SAAS,MAAM,GAAG;AACxB,YAAM,SAAS,MAAM,GAAG;AAGxB,YAAM,UAAU,WAAW,UAAa,WAAW,KAAK,SAAY;AACpE,YAAM,UAAU,WAAW,UAAa,WAAW,KAAK,SAAY;AAEpE,UAAI,YAAY,SAAS;AACvB,oBAAY,KAAK;AAAA,UACf,MAAM,GAAG,QAAQ,WAAW,EAAE,IAAI,GAAG;AAAA,UACrC,MAAM;AAAA,UACN,SAAS,sBAAsB,QAAQ,WAAW,EAAE,IAAI,GAAG,gBAAgB,OAAO,MAAM,CAAC,WAAW,OAAO,MAAM,CAAC;AAAA,UAClH,UAAU;AAAA,UACV,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAMA,SAAS,aACP,UACA,QACA,UACA,aACA,SACM;AAEN,MAAI,SAAS,OAAO,OAAO,IAAI;AAC7B,gBAAY,KAAK;AAAA,MACf,MAAM,GAAG,QAAQ;AAAA,MACjB,MAAM;AAAA,MACN,SAAS,wBAAwB,QAAQ,gBAAgB,SAAS,EAAE,WAAW,OAAO,EAAE;AAAA,MACxF,UAAU,SAAS;AAAA,MACnB,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AAGA,MAAI,SAAS,SAAS,OAAO,MAAM;AACjC,gBAAY,KAAK;AAAA,MACf,MAAM,GAAG,QAAQ;AAAA,MACjB,MAAM;AAAA,MACN,SAAS,2BAA2B,SAAS,EAAE,gBAAgB,SAAS,IAAI,WAAW,OAAO,IAAI;AAAA,MAClG,UAAU,SAAS;AAAA,MACnB,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AAGA,oBAAkB,GAAG,QAAQ,UAAU,SAAS,SAAS,CAAC,GAAG,OAAO,SAAS,CAAC,GAAG,aAAa,OAAO;AAGrG,gBAAc,UAAU,SAAS,QAAQ,OAAO,QAAQ,WAAW;AAGnE,QAAM,cAAc,SAAS,YAAY,CAAC;AAC1C,QAAM,cAAc,OAAO,YAAY,CAAC;AAExC,MAAI,YAAY,WAAW,YAAY,QAAQ;AAC7C,gBAAY,KAAK;AAAA,MACf,MAAM,GAAG,QAAQ;AAAA,MACjB,MAAM;AAAA,MACN,SAAS,qCAAqC,SAAS,EAAE,eAAe,YAAY,MAAM,SAAS,YAAY,MAAM;AAAA,MACrH,UAAU,YAAY,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,MACrC,QAAQ,YAAY,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IACrC,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,KAAK,IAAI,YAAY,QAAQ,YAAY,MAAM;AAC9D,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,UAAM,WAAW,YAAY,CAAC;AAC9B,UAAM,WAAW,YAAY,CAAC;AAE9B,QAAI,CAAC,YAAY,UAAU;AACzB,kBAAY,KAAK;AAAA,QACf,MAAM,GAAG,QAAQ,aAAa,CAAC;AAAA,QAC/B,MAAM;AAAA,QACN,SAAS,gCAAgC,SAAS,EAAE,cAAc,CAAC;AAAA,QACnE,QAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH,WAAW,YAAY,CAAC,UAAU;AAChC,kBAAY,KAAK;AAAA,QACf,MAAM,GAAG,QAAQ,aAAa,CAAC;AAAA,QAC/B,MAAM;AAAA,QACN,SAAS,uBAAuB,SAAS,EAAE,cAAc,CAAC;AAAA,QAC1D,UAAU,SAAS;AAAA,MACrB,CAAC;AAAA,IACH,WAAW,YAAY,UAAU;AAC/B,UAAI,SAAS,OAAO,SAAS,IAAI;AAC/B,oBAAY,KAAK;AAAA,UACf,MAAM,GAAG,QAAQ,aAAa,CAAC;AAAA,UAC/B,MAAM;AAAA,UACN,SAAS,gCAAgC,CAAC,oBAAoB,SAAS,EAAE,WAAW,SAAS,EAAE;AAAA,UAC/F,UAAU,SAAS;AAAA,UACnB,QAAQ,SAAS;AAAA,QACnB,CAAC;AAAA,MACH;AACA,mBAAa,UAAU,UAAU,GAAG,QAAQ,aAAa,CAAC,KAAK,SAAS,EAAE,KAAK,aAAa,OAAO;AAAA,IACrG;AAAA,EACF;AACF;AASO,SAAS,6BACd,UACA,QACA,UAAkC,CAAC,GACT;AAC1B,QAAM,cAAoC,CAAC;AAC3C,QAAM,EAAE,mBAAmB,KAAK,IAAI;AAGpC,MAAI,SAAS,WAAW,OAAO,QAAQ;AACrC,gBAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,8BAA8B,SAAS,MAAM,WAAW,OAAO,MAAM;AAAA,MAC9E,UAAU,SAAS;AAAA,MACnB,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AACA,MAAI,SAAS,YAAY,OAAO,SAAS;AACvC,gBAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,sCAAsC,SAAS,OAAO,WAAW,OAAO,OAAO;AAAA,MACxF,UAAU,SAAS;AAAA,MACnB,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AAGA,QAAM,UAAU,SAAS,YAAa,CAAC;AACvC,QAAM,UAAU,OAAO,YAAa,CAAC;AACrC,QAAM,WAAW,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,OAAO,GAAG,GAAG,OAAO,KAAK,OAAO,CAAC,CAAC;AAE3E,aAAW,KAAK,UAAU;AACxB,QAAI,qBAAqB,MAAM,eAAe,MAAM,cAAc;AAChE;AAAA,IACF;AACA,UAAM,SAAU,QAAoC,CAAC;AACrD,UAAM,SAAU,QAAoC,CAAC;AACrD,QAAI,CAAC,UAAU,QAAQ,MAAM,GAAG;AAC9B,kBAAY,KAAK;AAAA,QACf,MAAM,YAAY,CAAC;AAAA,QACnB,MAAM;AAAA,QACN,SAAS,kCAAkC,CAAC,gBAAgB,OAAO,MAAM,CAAC,WAAW,OAAO,MAAM,CAAC;AAAA,QACnG,UAAU;AAAA,QACV,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAGA;AAAA,IACE,SAAS;AAAA,IACT,OAAO;AAAA,IACP,QAAQ,SAAS,SAAS,EAAE;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL,YAAY,YAAY,WAAW;AAAA,IACnC;AAAA,EACF;AACF;AAKO,SAAS,6BACd,UACA,QACA,UAAkC,CAAC,GACT;AAC1B,QAAM,cAAoC,CAAC;AAC3C,QAAM,EAAE,mBAAmB,KAAK,IAAI;AAEpC,MAAI,SAAS,WAAW,OAAO,QAAQ;AACrC,gBAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,uCAAuC,SAAS,MAAM,WAAW,OAAO,MAAM;AAAA,MACvF,UAAU,SAAS;AAAA,MACnB,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,MAAI,SAAS,kBAAkB,OAAO,eAAe;AACnD,gBAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,8CAA8C,SAAS,aAAa,WAAW,OAAO,aAAa;AAAA,MAC5G,UAAU,SAAS;AAAA,MACnB,QAAQ,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AAGA,QAAM,gBAAgB,IAAI,IAAI,SAAS,sBAAsB,CAAC,CAAC;AAC/D,QAAM,gBAAgB,IAAI,IAAI,OAAO,sBAAsB,CAAC,CAAC;AAC7D,aAAW,KAAK,eAAe;AAC7B,QAAI,CAAC,cAAc,IAAI,CAAC,GAAG;AACzB,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,4CAA4C,CAAC;AAAA,QACtD,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AACA,aAAW,KAAK,eAAe;AAC7B,QAAI,CAAC,cAAc,IAAI,CAAC,GAAG;AACzB,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,qDAAqD,CAAC;AAAA,QAC/D,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,UAAU,IAAI,IAAI,SAAS,wBAAwB,CAAC,CAAC;AAC3D,QAAM,UAAU,IAAI,IAAI,OAAO,wBAAwB,CAAC,CAAC;AACzD,aAAW,KAAK,SAAS;AACvB,QAAI,CAAC,QAAQ,IAAI,CAAC,GAAG;AACnB,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,6CAA6C,CAAC;AAAA,QACvD,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AACA,aAAW,KAAK,SAAS;AACvB,QAAI,CAAC,QAAQ,IAAI,CAAC,GAAG;AACnB,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,sDAAsD,CAAC;AAAA,QAChE,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,SAAS,OAAO,WAAW,OAAO,OAAO,QAAQ;AACnD,gBAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,2CAA2C,SAAS,OAAO,MAAM,SAAS,OAAO,OAAO,MAAM;AAAA,MACvG,UAAU,SAAS,OAAO;AAAA,MAC1B,QAAQ,OAAO,OAAO;AAAA,IACxB,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,YAAY,YAAY,WAAW;AAAA,IACnC;AAAA,EACF;AACF;;;ACxlBA,IAAAC,iBAQO;AAOA,IAAM,0BAA0B,oBAAI,IAAI;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAuBM,SAAS,iBAAiB,OAA0C;AACzE,QAAM,cAAc,oCAAqB,UAAU,KAAK;AAExD,MAAI,YAAY,SAAS;AACvB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,MAAM,YAAY;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,SAAoC,YAAY,MAAM,OAAO,IAAI,CAAC,WAAW;AAAA,IACjF,MAAM,MAAM;AAAA,IACZ,SAAS,MAAM;AAAA,IACf,MAAM,IAAI,MAAM,KAAK,KAAK,GAAG,CAAC;AAAA,EAChC,EAAE;AAEF,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,EACF;AACF;AAKA,SAAS,sBAAsB,MAAY,OAA0B;AACnE,MAAI,KAAK,MAAM;AACb,UAAM,IAAI,KAAK,IAAI;AAAA,EACrB;AACA,MAAI,KAAK,YAAY,MAAM,QAAQ,KAAK,QAAQ,GAAG;AACjD,eAAW,SAAS,KAAK,UAAU;AACjC,4BAAsB,OAAO,KAAK;AAAA,IACpC;AAAA,EACF;AACF;AAMO,SAAS,4BACd,KACA,oBAAiC,yBACX;AACtB,QAAM,iBAAiB,oBAAI,IAAY;AACvC,MAAI,KAAK,UAAU;AACjB,0BAAsB,IAAI,UAAU,cAAc;AAAA,EACpD;AAEA,QAAM,mBAA6B,CAAC;AACpC,aAAW,QAAQ,gBAAgB;AACjC,QAAI,CAAC,kBAAkB,IAAI,IAAI,GAAG;AAChC,uBAAiB,KAAK,IAAI;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO;AAAA,IACL,oBAAoB,iBAAiB,KAAK;AAAA,IAC1C,sBAAsB,CAAC;AAAA,EACzB;AACF;AA0BO,SAAS,qBAAqB,QAA8C;AACjF,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAEnC,MAAI,eAAe,OAAO;AAC1B,MAAI,CAAC,gBAAgB,OAAO,UAAU;AACpC,mBAAe,4BAA4B,OAAO,QAAQ;AAAA,EAC5D;AAEA,QAAM,YAA4B;AAAA,IAChC,IAAI,OAAO;AAAA,IACX,MAAM,OAAO;AAAA,IACb,aAAa,OAAO,eAAe;AAAA,IACnC,UAAU,OAAO,YAAY;AAAA,IAC7B,MAAM,OAAO,QAAQ,CAAC;AAAA,IACtB,WAAW,OAAO;AAAA,IAClB,QAAQ,OAAO,UAAU;AAAA,IACzB,SAAS,OAAO,WAAW;AAAA,IAC3B,UAAU,OAAO;AAAA,IACjB,kBAAkB,OAAO;AAAA,IACzB,cAAc,gBAAgB,EAAE,oBAAoB,CAAC,GAAG,sBAAsB,CAAC,EAAE;AAAA,IACjF,WAAW,OAAO,aAAa;AAAA,IAC/B,WAAW,OAAO,aAAa;AAAA,IAC/B,QAAQ,OAAO;AAAA,EACjB;AAEA,QAAM,aAAa,iBAAiB,SAAS;AAC7C,MAAI,CAAC,WAAW,SAAS,CAAC,WAAW,MAAM;AACzC,UAAM,eAAe,WAAW,QAAQ,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI;AACvF,UAAM,IAAI,MAAM,4BAA4B,YAAY,EAAE;AAAA,EAC5D;AAEA,SAAO,WAAW;AACpB;AA8BO,SAAS,oBACd,OACA,UACA,UAAsC,CAAC,GACvB;AAChB,MAAI,CAAC,YAAY,OAAO,aAAa,UAAU;AAC7C,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AAEA,QAAM,UAAU,SAAS,IAAI,KAAK;AAClC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,QAAM,YAAY,SAAS,MAAM,KAAK;AACtC,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AAEA,MAAI,CAAC,SAAS,CAAC,MAAM,UAAU;AAC7B,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AAEA,MAAI,QAAQ,kBAAkB,OAAO;AACnC,UAAM,aAAa,iBAAiB,KAAK;AACzC,QAAI,CAAC,WAAW,OAAO;AACrB,YAAM,WAAW,WAAW,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI;AAClF,YAAM,IAAI,MAAM,0CAA0C,QAAQ,EAAE;AAAA,IACtE;AAAA,EACF;AAGA,QAAM,gBAA8B,UAAU,KAAK;AAEnD,SAAO,qBAAqB;AAAA,IAC1B,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa,SAAS,aAAa,KAAK,KAAK;AAAA,IAC7C,UAAU,SAAS,UAAU,KAAK,KAAK;AAAA,IACvC,MAAM,SAAS,OAAO,CAAC,GAAG,SAAS,IAAI,IAAI,CAAC;AAAA,IAC5C,WAAW,SAAS;AAAA,IACpB,QAAQ,SAAS,QAAQ,KAAK,KAAK;AAAA,IACnC,SAAS,SAAS,SAAS,KAAK,KAAK;AAAA,IACrC,UAAU;AAAA,IACV,cAAc,QAAQ;AAAA,IACtB,QAAQ,SAAS,SAAS,UAAU,SAAS,MAAM,IAAI;AAAA,EACzD,CAAC;AACH;AAoCA,SAAS,sBACP,MACA,OACM;AACN,WAAS,SAAS,MAAkB;AAClC,UAAM,QAAQ,MAAM,KAAK,IAAI,IAAI;AACjC,UAAM,cAAc,KAAK,QAAQ,UAAU,KAAK,KAAK,IAAI;AACzD,UAAM,eAAe,KAAK,SAAS,UAAU,KAAK,MAAM,IAAI;AAC5D,UAAM,iBAAiB,KAAK,WACxB,KAAK,SAAS,IAAI,CAAC,UAAU,SAAS,KAAK,CAAC,IAC5C,CAAC;AAEL,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM,KAAK;AAAA,MACX,GAAI,cAAc,EAAE,OAAO,YAAY,IAAI,CAAC;AAAA,MAC5C,GAAI,eAAe,EAAE,QAAQ,aAAa,IAAI,CAAC;AAAA,MAC/C,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO,SAAS,IAAI;AACtB;AAUO,SAAS,oBACd,eACA,UAAgC,CAAC,GACnB;AACd,MAAI;AACJ,MAAI,iBAAuE;AAE3E,UAAI,iCAAiB,aAAa,GAAG;AACnC,QAAI,CAAC,cAAc,UAAU;AAC3B,YAAM,IAAI;AAAA,QACR,aAAa,cAAc,IAAI,MAAM,cAAc,EAAE;AAAA,MACvD;AAAA,IACF;AACA,gBAAY,cAAc;AAC1B,qBAAiB;AAAA,MACf,IAAI,cAAc;AAAA,MAClB,MAAM,cAAc;AAAA,MACpB,SAAS,cAAc,WAAW;AAAA,IACpC;AAAA,EACF,WAAW,YAAY,iBAAiB,cAAc,eAAe;AACnE,gBAAY;AAAA,EACd,OAAO;AACL,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC7E;AAEA,QAAM,sBAAsB,IAAI,QAAI,+BAAe,UAAU,QAAQ,CAAC;AACtE,QAAM,iBAAiB,oBAAI,IAAY;AAGvC,QAAM,SAAS,QAAQ,YAAY,QAAQ,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AAChH,MAAI,UAAU;AAEd,QAAM,eAAe,CAAC,OAAe,SAAuB;AAE1D,QAAI,YAAY,GAAG,KAAK,IAAI,IAAI,MAAM,IAAI,OAAO;AACjD,WAAO,oBAAoB,IAAI,SAAS,KAAK,eAAe,IAAI,SAAS,GAAG;AAC1E;AACA,kBAAY,GAAG,KAAK,IAAI,IAAI,MAAM,IAAI,OAAO;AAAA,IAC/C;AACA;AACA,mBAAe,IAAI,SAAS;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,QAAQ,eAAe;AAErC,QAAM,iBAAiB,sBAAsB,UAAU,UAAU,KAAK;AAGtE,QAAM,eAAwC;AAAA,IAC5C,GAAG;AAAA,IACH,MAAM;AAAA,EACR;AAEA,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,YACJ,QAAQ,UACP,iBAAiB,GAAG,eAAe,IAAI,KAAK,UAAU,UAAU,SAAS;AAE5E,QAAM,iBAA0C;AAAA,IAC9C,GAAI,UAAU,UAAU,SAAS,UAAU,UAAU,SAAS,MAAM,IAAI,CAAC;AAAA,IACzE,GAAI,QAAQ,iBAAiB,UAAU,QAAQ,cAAc,IAAI,CAAC;AAAA,EACpE;AAEA,MAAI,QAAQ,iBAAiB,SAAS,gBAAgB;AACpD,mBAAe,iBAAiB;AAAA,EAClC;AAEA,QAAM,SAAuB;AAAA,IAC3B,QAAQ,UAAU;AAAA,IAClB,SAAS,UAAU;AAAA,IACnB,UAAU;AAAA,MACR,OAAO;AAAA,MACP,aAAa,UAAU,UAAU,eAAe;AAAA,MAChD,QAAQ,QAAQ,UAAU,UAAU,UAAU,UAAU;AAAA,MACxD,MAAM,UAAU,UAAU,OAAO,CAAC,GAAG,UAAU,SAAS,IAAI,IAAI,CAAC;AAAA,MACjE,UAAU,UAAU,UAAU,YAAY;AAAA,MAC1C,SAAS;AAAA,MACT,WAAW;AAAA,MACX,WAAW;AAAA,MACX,QAAQ;AAAA,IACV;AAAA,IACA,UAAU;AAAA,EACZ;AAEA,SAAO;AACT;AAKO,SAAS,6BAA6B,MAAoB,MAA6B;AAC5F,MAAI,CAAC,MAAM,YAAY,CAAC,MAAM,SAAU,QAAO;AAC/C,QAAM,OAAO,IAAI,QAAI,+BAAe,KAAK,QAAQ,CAAC;AAClD,QAAM,WAAO,+BAAe,KAAK,QAAQ;AAEzC,aAAW,MAAM,MAAM;AACrB,QAAI,KAAK,IAAI,EAAE,GAAG;AAChB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;","names":["FORBIDDEN_KEY_SEGMENTS","traverse","import_schema","import_schema","import_schema","import_schema","import_schema","import_fflate","import_schema","import_schema"]}