@kosdev-code/kos-ui-plugin 2.1.6 → 2.1.8

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 +0,0 @@
1
- {"version":3,"file":"documentation-generator-BVDETA08.js","sources":["../../../../node_modules/@nx/react/mf/dynamic-federation.js","../../../../node_modules/@nx/react/mf/index.js","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/extension-points/extension-point-schema.ts","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/extension-points/extension-point-validation.ts","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/plugin-system/plugin-extension-registry.ts","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/extension-points/extension-point-registry.ts","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/extension-points/extension-point-transforms.ts","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/extension-points/define-extension-point.ts","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/extension-points/json-extension-parser.ts","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/processors/contribution-reducer.ts","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/plugin-system/plugin-extension-manager.ts","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/processors/initialize-plugins.ts","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/plugin-system/resolve-best-extension.ts","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/extension-points/extension-point-schemas.ts","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/discovery/plugin-discovery-service.ts","../../../../packages/sdk/kos-ui-plugin/src/lib/utils/discovery/documentation-generator.ts"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.loadRemoteModule = exports.setRemoteDefinitions = exports.setRemoteUrlResolver = void 0;\nlet remoteUrlDefinitions;\nlet resolveRemoteUrl;\nconst remoteModuleMap = new Map();\nconst remoteContainerMap = new Map();\nlet initialSharingScopeCreated = false;\nfunction setRemoteUrlResolver(_resolveRemoteUrl) {\n resolveRemoteUrl = _resolveRemoteUrl;\n}\nexports.setRemoteUrlResolver = setRemoteUrlResolver;\nfunction setRemoteDefinitions(definitions) {\n remoteUrlDefinitions = definitions;\n}\nexports.setRemoteDefinitions = setRemoteDefinitions;\nasync function loadRemoteModule(remoteName, moduleName) {\n const remoteModuleKey = `${remoteName}:${moduleName}`;\n if (remoteModuleMap.has(remoteModuleKey)) {\n return remoteModuleMap.get(remoteModuleKey);\n }\n const container = remoteContainerMap.has(remoteName)\n ? remoteContainerMap.get(remoteName)\n : await loadRemoteContainer(remoteName);\n const factory = await container.get(moduleName);\n const Module = factory();\n remoteModuleMap.set(remoteModuleKey, Module);\n return Module;\n}\nexports.loadRemoteModule = loadRemoteModule;\nconst fetchRemoteModule = (url, remoteName) => {\n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = url;\n script.type = 'text/javascript';\n script.async = true;\n script.onload = () => {\n const proxy = {\n get: (request) => window[remoteName].get(request),\n init: (arg) => {\n try {\n window[remoteName].init(arg);\n }\n catch (e) {\n console.error(`Failed to initialize remote ${remoteName}`, e);\n reject(e);\n }\n },\n };\n resolve(proxy);\n };\n script.onerror = () => reject(new Error(`Remote ${remoteName} not found`));\n document.head.appendChild(script);\n });\n};\nasync function loadRemoteContainer(remoteName) {\n if (!resolveRemoteUrl && !remoteUrlDefinitions) {\n throw new Error('Call setRemoteDefinitions or setRemoteUrlResolver to allow Dynamic Federation to find the remote apps correctly.');\n }\n if (!initialSharingScopeCreated) {\n initialSharingScopeCreated = true;\n await __webpack_init_sharing__('default');\n }\n const remoteUrl = remoteUrlDefinitions\n ? remoteUrlDefinitions[remoteName]\n : await resolveRemoteUrl(remoteName);\n let containerUrl = remoteUrl;\n if (!remoteUrl.endsWith('.mjs') && !remoteUrl.endsWith('.js')) {\n containerUrl = `${remoteUrl}${remoteUrl.endsWith('/') ? '' : '/'}remoteEntry.js`;\n }\n const container = await fetchRemoteModule(containerUrl, remoteName);\n await container.init(__webpack_share_scopes__.default);\n remoteContainerMap.set(remoteName, container);\n return container;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.setRemoteUrlResolver = exports.setRemoteDefinitions = exports.loadRemoteModule = void 0;\nvar dynamic_federation_1 = require(\"./dynamic-federation\");\nObject.defineProperty(exports, \"loadRemoteModule\", { enumerable: true, get: function () { return dynamic_federation_1.loadRemoteModule; } });\nObject.defineProperty(exports, \"setRemoteDefinitions\", { enumerable: true, get: function () { return dynamic_federation_1.setRemoteDefinitions; } });\nObject.defineProperty(exports, \"setRemoteUrlResolver\", { enumerable: true, get: function () { return dynamic_federation_1.setRemoteUrlResolver; } });\n","/**\n * Schema utilities for extension points\n */\n\nimport type { z } from \"zod\";\nimport type { SchemaFieldInfo } from \"./extension-point-types\";\n\n/**\n * Extract field information from a Zod schema for documentation purposes\n * Returns field information that is safe to display in Plugin Explorer\n */\nexport function extractSchemaFieldInfo(schema: z.ZodSchema): SchemaFieldInfo[] {\n try {\n // Check if schema is a ZodObject by checking for shape property\n if (\"shape\" in schema) {\n const objectSchema = schema as z.ZodObject<any>;\n const fields: SchemaFieldInfo[] = [];\n\n for (const [fieldName, fieldSchema] of Object.entries(\n objectSchema.shape\n )) {\n const zodField = fieldSchema as z.ZodTypeAny;\n const fieldInfo: SchemaFieldInfo = {\n name: fieldName,\n required: !zodField.isOptional(),\n };\n\n // Extract description if available\n if (zodField._def && zodField._def.description) {\n fieldInfo.description = zodField._def.description;\n }\n\n // Extract type information\n if (zodField._def) {\n // Get the base type name (handles optional types)\n let typeName = zodField._def.typeName || \"unknown\";\n if (typeName === \"ZodOptional\" && zodField._def.innerType) {\n typeName = zodField._def.innerType._def?.typeName || \"unknown\";\n }\n // Simplify type names for display\n fieldInfo.type = typeName.replace(\"Zod\", \"\").toLowerCase();\n }\n\n fields.push(fieldInfo);\n }\n\n return fields;\n }\n\n // For other schema types, we can't safely extract fields\n return [];\n } catch (error) {\n console.warn(\"Failed to extract schema field info:\", error);\n return [];\n }\n}\n","/**\n * Validation utilities for extension points\n */\n\nimport type { ValidationContext } from \"./extension-point-types\";\n\n/**\n * Implementation of ValidationContext for collecting validation issues\n */\nexport class ValidationContextImpl implements ValidationContext {\n private issues: { type: \"error\" | \"warning\" | \"info\"; message: string }[] =\n [];\n\n addError(message: string): void {\n this.issues.push({ type: \"error\", message });\n }\n\n addWarning(message: string): void {\n this.issues.push({ type: \"warning\", message });\n }\n\n addInfo(message: string): void {\n this.issues.push({ type: \"info\", message });\n }\n\n hasErrors(): boolean {\n return this.issues.some((issue) => issue.type === \"error\");\n }\n\n hasIssues(): boolean {\n return this.issues.length > 0;\n }\n\n getIssues(): { type: \"error\" | \"warning\" | \"info\"; message: string }[] {\n return [...this.issues];\n }\n}\n\n/**\n * Validation results cache\n * Stores validation results by plugin ID to avoid re-running validation\n */\nexport class ValidationResultsCache {\n private cache: Map<\n string,\n { type: \"error\" | \"warning\" | \"info\"; message: string }[]\n > = new Map();\n\n set(\n pluginId: string,\n results: { type: \"error\" | \"warning\" | \"info\"; message: string }[]\n ) {\n this.cache.set(pluginId, results);\n }\n\n get(\n pluginId: string\n ): { type: \"error\" | \"warning\" | \"info\"; message: string }[] {\n return this.cache.get(pluginId) || [];\n }\n\n clear() {\n this.cache.clear();\n }\n}\n\n// Create singleton validation cache\nexport const validationCache = new ValidationResultsCache();\n\n/**\n * Get validation results for a plugin from the cache\n * Returns validation results that were stored during plugin processing\n */\nexport function getValidationResults(\n pluginId: string\n): { type: \"error\" | \"warning\" | \"info\"; message: string }[] {\n return validationCache.get(pluginId);\n}\n","// plugin-extension-registry.ts\n\nimport type {\n PluginExtensionsType,\n ProcessedContributions,\n} from \"../../../types/plugins\";\n\nexport type ExtensionReducer = (\n extensions: PluginExtensionsType,\n contributions: ProcessedContributions,\n experiences: any\n) => PluginExtensionsType;\n\nconst extensionPointRegistry: ExtensionReducer[] = [];\n\nexport function registerExtensionReducer(reducer: ExtensionReducer) {\n extensionPointRegistry.push(reducer);\n}\n\nexport function applyExtensionReducers(\n base: PluginExtensionsType,\n contributions: ProcessedContributions,\n experiences: any\n): PluginExtensionsType {\n return extensionPointRegistry.reduce(\n (acc, reducer) => reducer(acc, contributions, experiences),\n base\n );\n}\n","/**\n * Registry management for extension points\n */\n\nimport type {\n BasePluginExtension,\n PluginExtensionsType,\n ProcessedContributions,\n} from \"../../../types/plugins\";\nimport { extractSchemaFieldInfo } from \"./extension-point-schema\";\nimport type {\n ExtensionPointConfig,\n ExtensionPointDefinition,\n TransformContext,\n} from \"./extension-point-types\";\nimport {\n ValidationContextImpl,\n validationCache,\n} from \"./extension-point-validation\";\nimport { registerExtensionReducer } from \"../plugin-system/plugin-extension-registry\";\n\n/**\n * Registry for simplified extension points\n * Keeps track of all extension points defined via this API\n */\nexport class SimplifiedExtensionPointRegistry {\n private extensionPoints: Map<string, ExtensionPointDefinition> = new Map();\n\n define<TData = any, TProcessed = TData, TProps = any>(\n config: ExtensionPointConfig<TData, TProcessed, TProps>\n ): ExtensionPointDefinition<TData, TProcessed, TProps> {\n // Check if already defined\n if (this.extensionPoints.has(config.id)) {\n console.warn(`Extension point ${config.id} is already defined`);\n return this.extensionPoints.get(config.id) as ExtensionPointDefinition<\n TData,\n TProcessed,\n TProps\n >;\n }\n\n // Create the definition\n const definition: ExtensionPointDefinition<TData, TProcessed, TProps> = {\n config,\n id: config.id,\n isRegistered: false,\n getExtensions: (extensions: PluginExtensionsType) =>\n (extensions[config.id] || {}) as Record<\n string,\n BasePluginExtension & { data: TProcessed }\n >,\n register: () => {\n if (definition.isRegistered) {\n console.warn(`Extension point ${config.id} is already registered`);\n return;\n }\n\n // Create and register the reducer\n const reducer = this.createReducer(config);\n registerExtensionReducer(reducer);\n\n definition.isRegistered = true;\n },\n };\n\n // Add schema field extraction if schema is provided\n if (config.schema) {\n definition.getSchemaFieldInfo = () =>\n extractSchemaFieldInfo(config.schema!);\n }\n\n // Component creation is handled at runtime via useExtensionComponent hook or createExtensionComponent factory\n\n // Store the definition\n this.extensionPoints.set(config.id, definition);\n\n return definition;\n }\n\n private createReducer<TData = any, TProcessed = TData>(\n config: ExtensionPointConfig<TData, TProcessed>\n ) {\n return (\n extensions: PluginExtensionsType,\n contributions: ProcessedContributions,\n experiences: any\n ): PluginExtensionsType => {\n // Check if contributions exist for this extension point\n const contributionData = (contributions as any)[config.contributionKey];\n if (!contributionData || typeof contributionData !== \"object\") {\n return extensions;\n }\n\n // Process each contribution\n Object.entries(contributionData).forEach(\n ([key, rawData]: [string, any]) => {\n // Skip if no data\n if (!rawData) return;\n\n // Create transform context\n const context: TransformContext = {\n remote: rawData.remote || \"\",\n sectionId: rawData.sectionId || key,\n experiences,\n contributions,\n };\n\n // Validate if validator provided\n if (config.validate) {\n const validationContext = new ValidationContextImpl();\n const validationResult = config.validate(\n rawData,\n validationContext\n );\n\n // Handle skip result\n if (validationResult === \"skip\") {\n validationCache.set(key, [\n {\n type: \"warning\",\n message: \"Plugin marked to skip processing\",\n },\n ]);\n return; // Skip processing this contribution\n }\n\n // Store validation issues in cache\n if (validationContext.hasIssues()) {\n const issues = validationContext.getIssues().map((issue) => {\n return {\n ...issue,\n message: `Extension point validation: ${issue.message}`,\n };\n });\n\n validationCache.set(key, issues);\n\n if (validationContext.hasErrors()) {\n console.error(\n `Validation failed for ${config.id} contribution \"${key}\":`,\n issues\n .filter((i) => i.type === \"error\")\n .map((i) => i.message)\n .join(\", \")\n );\n return; // Skip processing on errors\n }\n } else {\n // Clear any previous validation errors for successful validation\n validationCache.set(key, []);\n }\n }\n\n // Transform data if transformer provided\n const processedData = config.transform\n ? config.transform(rawData, context)\n : rawData;\n\n // Initialize extension point if needed\n if (!extensions[config.id]) {\n extensions[config.id] = {};\n }\n\n // Create the base extension\n const extension: BasePluginExtension = {\n id: key,\n type: config.contributionKey,\n data: processedData,\n remote: context.remote,\n sectionId: context.sectionId,\n };\n\n // Add rank if rankable\n if (config.isRankable && typeof rawData.rank === \"number\") {\n extension.rank = rawData.rank;\n }\n\n // Copy component-related properties to root level for useDynamicComponent compatibility\n if (processedData && typeof processedData === \"object\") {\n // Copy component properties from processed data to extension root\n if (\"component\" in processedData) {\n (extension as any).component = processedData.component;\n }\n if (\"view\" in processedData) {\n (extension as any).view = processedData.view;\n }\n if (\"location\" in processedData) {\n (extension as any).location = processedData.location;\n }\n }\n\n // Store the extension\n extensions[config.id][key] = extension;\n\n // Handle view-based extensions if configured\n if (config.hasView && config.relatedPoints?.view) {\n const experienceId = rawData.experienceId;\n const view = experiences?.[experienceId];\n\n if (view) {\n // Initialize view extension point if needed\n if (!extensions[config.relatedPoints.view]) {\n extensions[config.relatedPoints.view] = {};\n }\n\n // Create view extension\n extensions[config.relatedPoints.view][key] = {\n id: key,\n type: `${config.contributionKey}.view`,\n data: view,\n remote: context.remote,\n sectionId: context.sectionId,\n };\n }\n }\n\n // Handle definition extension point if configured\n if (config.relatedPoints?.definition) {\n // Initialize definition extension point if needed\n if (!extensions[config.relatedPoints.definition]) {\n extensions[config.relatedPoints.definition] = {};\n }\n\n // Create definition extension\n extensions[config.relatedPoints.definition][key] = {\n id: key,\n type: `${config.contributionKey}.definition`,\n data: processedData,\n remote: context.remote,\n sectionId: context.sectionId,\n };\n }\n }\n );\n\n return extensions;\n };\n }\n\n /**\n * Get all registered extension points (for discovery/documentation)\n */\n getAllExtensionPoints(): ExtensionPointDefinition[] {\n return Array.from(this.extensionPoints.values()).filter(\n (definition) => definition.isRegistered\n );\n }\n\n /**\n * Get all defined extension points (registered and unregistered)\n */\n getAllDefinedExtensionPoints(): ExtensionPointDefinition[] {\n return Array.from(this.extensionPoints.values());\n }\n\n /**\n * Get a specific extension point definition\n */\n getExtensionPoint(id: string): ExtensionPointDefinition | undefined {\n return this.extensionPoints.get(id);\n }\n\n /**\n * Check if an extension point is registered\n */\n hasExtensionPoint(id: string): boolean {\n return this.extensionPoints.has(id);\n }\n}\n\n// Create singleton registry instance\nexport const registry = new SimplifiedExtensionPointRegistry();\n\n/**\n * Get the simplified extension point registry\n * Useful for discovery tools and documentation generation\n */\nexport function getExtensionPointRegistry(): SimplifiedExtensionPointRegistry {\n return registry;\n}\n","/**\n * Transform utilities for extension points\n */\n\nimport type { TransformContext } from \"./extension-point-types\";\n\n/**\n * Generic transform helper for extension points that use the experience/view pattern\n * Handles mapping experience IDs to experience data and flattening component properties\n */\nexport function createViewAwareTransform<TData extends Record<string, any>>(\n options: {\n /**\n * Property name that contains the experience ID (default: \"experienceId\")\n */\n experienceIdProperty?: keyof TData;\n /**\n * Whether to flatten component properties to root level for useDynamicComponent compatibility (default: true)\n */\n flattenComponentProperties?: boolean;\n /**\n * Additional transform logic to apply after view mapping\n */\n customTransform?: (\n data: TData,\n view: any,\n context: TransformContext\n ) => any;\n } = {}\n) {\n const {\n experienceIdProperty = \"experienceId\",\n flattenComponentProperties = true,\n customTransform,\n } = options;\n\n return (data: TData, context: TransformContext) => {\n // Map experience ID to experience data\n const experienceId = data[experienceIdProperty] as string;\n const view = experienceId ? context.experiences?.[experienceId] || {} : {};\n\n // Start with base data - use any to allow dynamic property addition\n let result: any = {\n ...data,\n view: view,\n };\n\n // Flatten component properties for useDynamicComponent compatibility\n if (flattenComponentProperties && view) {\n if (view.component) {\n result.component = view.component;\n }\n if (view.location) {\n result.location = view.location;\n }\n }\n\n // Apply custom transform if provided\n if (customTransform) {\n result = customTransform(data, view, context) || result;\n }\n\n return result;\n };\n}\n","/**\n * Simplified Extension Point Definition API\n *\n * This utility provides a streamlined way to define new extension points\n * without modifying multiple files. It maintains full backward compatibility\n * with existing extension points which continue to use the legacy reducer system.\n */\n\nimport type {\n ExtensionPointConfig,\n ExtensionPointDefinition,\n ViewExtensionPointDefinition,\n} from \"./extension-point-types\";\nimport { registry } from \"./extension-point-registry\";\n\n// Re-export types and interfaces\nexport type {\n ValidationContext,\n TransformContext,\n SchemaFieldInfo,\n ExtensionPointConfig,\n ExtensionComponentProps,\n ExtensionPointDefinition,\n ViewExtensionPointDefinition,\n} from \"./extension-point-types\";\n\n// Re-export utilities\nexport { extensionPointId } from \"./extension-point-types\";\nexport { createViewAwareTransform } from \"./extension-point-transforms\";\nexport {\n getExtensionPointRegistry,\n registry,\n} from \"./extension-point-registry\";\nexport { getValidationResults } from \"./extension-point-validation\";\n\n/**\n * Define a new extension point with simplified API\n *\n * Returns an extension point definition that must be explicitly registered\n * by calling the register() method. This prevents automatic registration\n * and circular dependency issues.\n *\n * @example\n * ```typescript\n * // Simple extension point\n * export const MyFeatureExtension = defineExtensionPoint({\n * id: 'ddk.myFeature',\n * contributionKey: 'myFeature',\n * displayName: 'My Feature',\n * description: 'Extension point for custom features'\n * });\n *\n * // Register it explicitly in your app initialization\n * MyFeatureExtension.register();\n *\n * // Extension point with view support\n * export const MyViewExtension = defineExtensionPoint({\n * id: 'ddk.myView.config',\n * contributionKey: 'myView',\n * hasView: true,\n * relatedPoints: {\n * view: 'ddk.myView.view',\n * definition: 'ddk.myView'\n * },\n * transform: (data, context) => ({\n * ...data,\n * processedAt: Date.now()\n * })\n * });\n *\n * // Register it explicitly in your app initialization\n * MyViewExtension.register();\n *\n * // Use the pre-configured component (for view-based extensions)\n * <MyViewExtension.Component\n * module=\"specific-module-id\"\n * fallback={<div>Loading...</div>}\n * customProp=\"value\"\n * />\n * ```\n */\n\n// Overload for hasView: true - guarantees Component property exists\nexport function defineExtensionPoint<\n TData = any,\n TProcessed = TData,\n TProps = any\n>(\n config: ExtensionPointConfig<TData, TProcessed, TProps> & { hasView: true }\n): ViewExtensionPointDefinition<TData, TProcessed, TProps>;\n\n// Overload for hasView: false/undefined - Component might not exist\nexport function defineExtensionPoint<\n TData = any,\n TProcessed = TData,\n TProps = any\n>(\n config: ExtensionPointConfig<TData, TProcessed, TProps>\n): ExtensionPointDefinition<TData, TProcessed, TProps>;\n\n// Implementation\nexport function defineExtensionPoint<\n TData = any,\n TProcessed = TData,\n TProps = any\n>(\n config: ExtensionPointConfig<TData, TProcessed, TProps>\n): ExtensionPointDefinition<TData, TProcessed, TProps> {\n return registry.define(config);\n}\n","/**\n * JSON Extension Point Parser\n *\n * Parses extension point definitions from JSON and converts them to\n * ExtensionPointConfig objects that can be registered with the system.\n */\n\nimport type {\n ExtensionPointConfig,\n TransformContext,\n ValidationContext,\n} from \"./extension-point-types\";\nimport { createViewAwareTransform } from \"./extension-point-transforms\";\n\n/**\n * JSON representation of an extension point definition\n */\nexport interface JsonExtensionPointDefinition {\n id: string;\n displayName?: string;\n description?: string;\n contributionKey: string;\n hasView?: boolean;\n isRankable?: boolean;\n relatedPoints?: Record<string, string>;\n schema?: JsonContributionSchema;\n validation?: JsonValidationRules;\n transform?: JsonTransformOperations;\n metadata?: JsonExtensionPointMetadata;\n}\n\ninterface JsonContributionSchema {\n type?: string;\n properties?: Record<string, unknown>;\n required?: string[];\n additionalProperties?: boolean;\n}\n\ninterface JsonValidationRules {\n rules?: JsonValidationRule[];\n module?: string;\n}\n\ninterface JsonValidationRule {\n type: \"required\" | \"range\" | \"pattern\" | \"custom\" | \"dependency\";\n field?: string;\n min?: number;\n max?: number;\n pattern?: string;\n message?: string;\n dependsOn?: string;\n expression?: string;\n}\n\ninterface JsonTransformOperations {\n addFields?: Record<string, unknown>;\n removeFields?: string[];\n renameFields?: Record<string, string>;\n normalizeFields?: Array<{\n field: string;\n operation: \"trim\" | \"lowercase\" | \"uppercase\" | \"camelCase\" | \"kebabCase\";\n }>;\n module?: string;\n}\n\ninterface JsonExtensionPointMetadata {\n category?: string;\n tags?: string[];\n owner?: string;\n since?: string;\n deprecated?: boolean;\n deprecatedSince?: string;\n replacedBy?: string;\n exportName?: string;\n}\n\n/**\n * Special variables that can be used in transform operations\n */\nconst SPECIAL_VARIABLES: Record<string, () => unknown> = {\n $timestamp: () => Date.now(),\n $date: () => new Date().toISOString(),\n $packageVersion: () => process.env.npm_package_version || \"0.0.0\",\n $env: () => process.env.NODE_ENV || \"development\",\n};\n\n/**\n * Parse a JSON extension point definition into an ExtensionPointConfig\n */\nexport function parseJsonExtensionPoint<TData = any, TProcessed = TData>(\n jsonDef: JsonExtensionPointDefinition\n): ExtensionPointConfig<TData, TProcessed> {\n const config: ExtensionPointConfig<TData, TProcessed> = {\n id: jsonDef.id,\n displayName: jsonDef.displayName,\n description: jsonDef.description,\n contributionKey: jsonDef.contributionKey,\n hasView: jsonDef.hasView,\n isRankable: jsonDef.isRankable,\n relatedPoints: jsonDef.relatedPoints,\n metadata: jsonDef.metadata\n ? {\n ...jsonDef.metadata,\n exportName:\n jsonDef.metadata.exportName || generateExportName(jsonDef.id),\n }\n : undefined,\n };\n\n // Convert JSON schema to Zod schema if provided\n if (jsonDef.schema) {\n config.schema = createZodSchemaFromJson(jsonDef.schema, {\n hasView: jsonDef.hasView,\n isRankable: jsonDef.isRankable,\n });\n }\n\n // Create validation function from JSON rules\n if (jsonDef.validation) {\n config.validate = createValidationFunction(jsonDef.validation);\n }\n\n // Create transform function from JSON operations\n if (jsonDef.transform) {\n config.transform = createTransformFunction(jsonDef.transform);\n } else if (jsonDef.hasView) {\n // Auto-apply view-aware transform for view-enabled extension points\n config.transform = createViewAwareTransform() as any;\n }\n\n return config;\n}\n\n/**\n * Generate an export name from an extension point ID\n */\nfunction generateExportName(id: string): string {\n // Convert dot-separated ID to PascalCase\n // e.g., \"app.dashboard.widgets\" -> \"AppDashboardWidgets\"\n return (\n id\n .split(\".\")\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\") + \"Extension\"\n );\n}\n\n/**\n * Create a Zod schema from JSON schema definition\n */\nfunction createZodSchemaFromJson(\n jsonSchema: JsonContributionSchema,\n options?: { hasView?: boolean; isRankable?: boolean }\n): any {\n // This is a simplified implementation - in production, use a library like json-schema-to-zod\n // For now, we'll import zod dynamically to avoid adding it as a required dependency\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { z } = require(\"zod\");\n\n // If jsonSchema has properties, treat it as an object schema even if type is not specified\n if (jsonSchema.properties) {\n const shape: Record<string, any> = {};\n\n // Add base fields automatically\n shape.id = z.string().min(1);\n shape.title = z.string().min(1);\n shape.namespace = z.string().min(1);\n\n // Add view field if hasView is true\n if (options?.hasView) {\n shape.experienceId = z.string().min(1);\n }\n\n // Add rank field if isRankable is true\n if (options?.isRankable) {\n shape.rank = z.number().min(0).max(1000).optional();\n }\n\n // Add user-defined fields from schema\n for (const [key, propSchema] of Object.entries(jsonSchema.properties)) {\n shape[key] = createZodPropertyFromJson(propSchema, z);\n }\n\n let schema = z.object(shape);\n\n if (!jsonSchema.additionalProperties) {\n schema = schema.strict();\n }\n\n return schema;\n }\n\n return z.any();\n } catch (error) {\n console.warn(\"Zod not available for JSON schema conversion:\", error);\n return undefined;\n }\n}\n\n/**\n * Create a Zod property schema from JSON property definition\n */\nfunction createZodPropertyFromJson(propSchema: any, z: any): any {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let schema: any;\n\n switch (propSchema.type) {\n case \"string\":\n schema = z.string();\n if (propSchema.minLength) schema = schema.min(propSchema.minLength);\n if (propSchema.maxLength) schema = schema.max(propSchema.maxLength);\n if (propSchema.pattern)\n schema = schema.regex(new RegExp(propSchema.pattern));\n if (propSchema.enum) schema = z.enum(propSchema.enum);\n break;\n\n case \"number\":\n schema = z.number();\n if (propSchema.minimum !== undefined)\n schema = schema.min(propSchema.minimum);\n if (propSchema.maximum !== undefined)\n schema = schema.max(propSchema.maximum);\n break;\n\n case \"boolean\":\n schema = z.boolean();\n break;\n\n case \"array\":\n schema = z.array(z.any());\n break;\n\n case \"object\":\n schema = z.object({});\n break;\n\n default:\n schema = z.any();\n }\n\n if (propSchema.description) {\n schema = schema.describe(propSchema.description);\n }\n\n if (propSchema.default !== undefined) {\n schema = schema.default(propSchema.default);\n }\n\n return schema;\n}\n\n/**\n * Create a validation function from JSON validation rules\n */\nfunction createValidationFunction(\n validationRules: JsonValidationRules\n): (data: any, context: ValidationContext) => \"skip\" | void {\n // If a module is specified, we'll need to load it dynamically\n if (validationRules.module) {\n return createModuleValidationFunction(validationRules.module);\n }\n\n // Create validation function from rules\n return (data: unknown, context: ValidationContext) => {\n if (!validationRules.rules) return;\n\n const dataRecord = data as Record<string, unknown>;\n for (const rule of validationRules.rules) {\n validateRule(rule, dataRecord, context);\n }\n };\n}\n\n/**\n * Validate a single rule against data\n */\nfunction validateRule(\n rule: JsonValidationRule,\n data: Record<string, unknown>,\n context: ValidationContext\n): void {\n switch (rule.type) {\n case \"required\":\n validateRequiredRule(rule, data, context);\n break;\n case \"range\":\n validateRangeRule(rule, data, context);\n break;\n case \"pattern\":\n validatePatternRule(rule, data, context);\n break;\n case \"dependency\":\n validateDependencyRule(rule, data, context);\n break;\n case \"custom\":\n validateCustomRule(rule, data, context);\n break;\n }\n}\n\nfunction validateRequiredRule(\n rule: JsonValidationRule,\n data: Record<string, unknown>,\n context: ValidationContext\n): void {\n if (rule.field && !data[rule.field]) {\n context.addError(rule.message || `Field '${rule.field}' is required`);\n }\n}\n\nfunction validateRangeRule(\n rule: JsonValidationRule,\n data: Record<string, unknown>,\n context: ValidationContext\n): void {\n if (rule.field && typeof data[rule.field] === \"number\") {\n const value = data[rule.field] as number;\n if (rule.min !== undefined && value < rule.min) {\n context.addError(\n rule.message || `Field '${rule.field}' must be at least ${rule.min}`\n );\n }\n if (rule.max !== undefined && value > rule.max) {\n context.addError(\n rule.message || `Field '${rule.field}' must be at most ${rule.max}`\n );\n }\n }\n}\n\nfunction validatePatternRule(\n rule: JsonValidationRule,\n data: Record<string, unknown>,\n context: ValidationContext\n): void {\n if (rule.field && rule.pattern && typeof data[rule.field] === \"string\") {\n const regex = new RegExp(rule.pattern);\n if (!regex.test(data[rule.field] as string)) {\n context.addError(\n rule.message ||\n `Field '${rule.field}' does not match pattern ${rule.pattern}`\n );\n }\n }\n}\n\nfunction validateDependencyRule(\n rule: JsonValidationRule,\n data: Record<string, unknown>,\n context: ValidationContext\n): void {\n if (rule.field && rule.dependsOn && rule.expression) {\n try {\n const result = evaluateSimpleExpression(rule.expression, data);\n if (!result) {\n context.addError(\n rule.message || `Field '${rule.field}' dependency validation failed`\n );\n }\n } catch (error) {\n context.addWarning(`Failed to evaluate dependency expression: ${error}`);\n }\n }\n}\n\nfunction validateCustomRule(\n rule: JsonValidationRule,\n data: Record<string, unknown>,\n context: ValidationContext\n): void {\n if (rule.expression) {\n try {\n const result = evaluateSimpleExpression(rule.expression, data);\n if (!result) {\n context.addError(rule.message || \"Custom validation failed\");\n }\n } catch (error) {\n context.addWarning(`Failed to evaluate custom expression: ${error}`);\n }\n }\n}\n\n/**\n * Create a validation function that loads an external module\n */\nfunction createModuleValidationFunction(\n modulePath: string\n): (data: unknown, context: ValidationContext) => \"skip\" | void {\n return (_data: unknown, context: ValidationContext) => {\n // In a real implementation, this would use dynamic import or require\n // For now, we'll just log a warning and add it to context\n console.warn(`External validation module not implemented: ${modulePath}`);\n context.addWarning(\n `External validation module not yet supported: ${modulePath}`\n );\n };\n}\n\n/**\n * Create a transform function from JSON transform operations\n */\nfunction createTransformFunction<TData = unknown, TProcessed = TData>(\n transformOps: JsonTransformOperations\n): (data: TData, context: TransformContext) => TProcessed {\n // If a module is specified, we'll need to load it dynamically\n if (transformOps.module) {\n return createModuleTransformFunction(transformOps.module);\n }\n\n return (data: TData, _context: TransformContext): TProcessed => {\n const result: Record<string, unknown> = { ...data } as Record<\n string,\n unknown\n >;\n\n // Add fields\n if (transformOps.addFields) {\n for (const [key, value] of Object.entries(transformOps.addFields)) {\n result[key] = resolveSpecialVariable(value);\n }\n }\n\n // Remove fields\n if (transformOps.removeFields) {\n for (const field of transformOps.removeFields) {\n delete result[field];\n }\n }\n\n // Rename fields\n if (transformOps.renameFields) {\n for (const [oldName, newName] of Object.entries(\n transformOps.renameFields\n )) {\n if (oldName in result) {\n result[newName] = result[oldName];\n delete result[oldName];\n }\n }\n }\n\n // Normalize fields\n if (transformOps.normalizeFields) {\n for (const { field, operation } of transformOps.normalizeFields) {\n if (field in result && typeof result[field] === \"string\") {\n result[field] = applyStringOperation(\n result[field] as string,\n operation\n );\n }\n }\n }\n\n return result as unknown as TProcessed;\n };\n}\n\n/**\n * Create a transform function that loads an external module\n */\nfunction createModuleTransformFunction<TData = any, TProcessed = TData>(\n modulePath: string\n): (data: TData, context: TransformContext) => TProcessed {\n return (data: TData, _context: TransformContext): TProcessed => {\n // In a real implementation, this would use dynamic import or require\n // For now, we'll just return the data unchanged and log a warning\n console.warn(`External transform module not implemented: ${modulePath}`);\n return data as unknown as TProcessed;\n };\n}\n\n/**\n * Resolve special variables in transform operations\n */\nfunction resolveSpecialVariable(value: unknown): unknown {\n if (typeof value === \"string\" && value.startsWith(\"$\")) {\n const resolver = SPECIAL_VARIABLES[value];\n if (resolver) {\n return resolver();\n }\n }\n return value;\n}\n\n/**\n * Apply string normalization operations\n */\nfunction applyStringOperation(value: string, operation: string): string {\n switch (operation) {\n case \"trim\":\n return value.trim();\n case \"lowercase\":\n return value.toLowerCase();\n case \"uppercase\":\n return value.toUpperCase();\n case \"camelCase\":\n return toCamelCase(value);\n case \"kebabCase\":\n return toKebabCase(value);\n default:\n return value;\n }\n}\n\n/**\n * Convert string to camelCase\n */\nfunction toCamelCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, char) => (char ? char.toUpperCase() : \"\"))\n .replace(/^./, (char) => char.toLowerCase());\n}\n\n/**\n * Convert string to kebab-case\n */\nfunction toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .toLowerCase();\n}\n\n/**\n * Simple expression evaluator for validation rules\n * In production, use a proper sandboxed expression evaluator\n */\nfunction evaluateSimpleExpression(\n expression: string,\n data: Record<string, unknown>\n): boolean {\n try {\n // This is a simplified implementation - in production, use a safe expression evaluator\n // For now, we'll just support basic comparisons\n\n // Replace field references with actual values\n let evalExpression = expression;\n for (const [key, value] of Object.entries(data)) {\n const quotedValue =\n typeof value === \"string\" ? `\"${value}\"` : String(value);\n evalExpression = evalExpression.replace(\n new RegExp(`\\\\b${key}\\\\b`, \"g\"),\n quotedValue\n );\n }\n\n // Very basic and LIMITED evaluation - only for demo purposes\n // In production, use a proper expression parser/evaluator\n if (evalExpression.includes(\"!==\")) {\n const [left, right] = evalExpression.split(\"!==\").map((s) => s.trim());\n return left !== right;\n }\n if (evalExpression.includes(\"===\")) {\n const [left, right] = evalExpression.split(\"===\").map((s) => s.trim());\n return left === right;\n }\n if (evalExpression.includes(\"||\")) {\n const parts = evalExpression.split(\"||\").map((s) => s.trim());\n return parts.some((part) => evaluateSimpleExpression(part, data));\n }\n if (evalExpression.includes(\"&&\")) {\n const parts = evalExpression.split(\"&&\").map((s) => s.trim());\n return parts.every((part) => evaluateSimpleExpression(part, data));\n }\n\n return false;\n } catch (error) {\n console.error(\"Expression evaluation failed:\", error);\n return false;\n }\n}\n\n/**\n * Parse all extension points from a .kos.json configuration\n */\nexport function parseExtensionPointsFromConfig(\n kosConfig: Record<string, unknown>\n): Array<ExtensionPointConfig<unknown, unknown>> {\n if (!kosConfig.extensionPoints || !Array.isArray(kosConfig.extensionPoints)) {\n return [];\n }\n\n const configs: Array<ExtensionPointConfig<unknown, unknown>> = [];\n\n for (const jsonDef of kosConfig.extensionPoints) {\n try {\n const config = parseJsonExtensionPoint(jsonDef);\n configs.push(config);\n } catch (error) {\n console.error(`Failed to parse extension point '${jsonDef.id}':`, error);\n }\n }\n\n return configs;\n}\n","import type { DynamicRemotes } from \"../../../types/global\";\nimport type { ProcessedContributions } from \"../../../types/plugins\";\nimport { getExtensionPointRegistry } from \"../extension-points/extension-point-registry\";\n\nexport const contributionReducer =\n (remotes: DynamicRemotes) => (acc: ProcessedContributions, key: string) => {\n const remote = remotes[key].remote;\n const sectionId = key;\n\n const experiences = remotes[key].contributes?.experiences;\n Object.keys(experiences).forEach((key) => {\n const experience = experiences[key];\n acc.experiences[key] = {\n ...experience,\n remote,\n sectionId,\n };\n });\n\n // Process contributions for simplified extension points\n const registry = getExtensionPointRegistry();\n const extensionPoints = registry.getAllExtensionPoints();\n\n extensionPoints.forEach((extensionPoint) => {\n const { contributionKey } = extensionPoint.config;\n\n // Check if this remote has contributions for this extension point\n const contributions = remotes[key].contributes?.[contributionKey];\n if (!contributions) return;\n\n // Initialize the contribution storage if needed\n if (!acc[contributionKey]) {\n acc[contributionKey] = {};\n }\n\n // Process each contribution\n if (Array.isArray(contributions)) {\n // Handle array-based contributions\n contributions.forEach((contribution) => {\n if (contribution && contribution.id) {\n acc[contributionKey][contribution.id] = {\n ...contribution,\n remote,\n sectionId,\n };\n }\n });\n } else if (typeof contributions === \"object\") {\n // Handle object-based contributions\n Object.entries(contributions).forEach(([contribId, contribution]) => {\n acc[contributionKey][contribId] = {\n ...(contribution as Record<string, any>),\n id: contribId,\n remote,\n sectionId,\n };\n });\n }\n });\n\n return acc;\n };\n","// plugin-extension-manager.ts\n\nimport { loadRemoteModule } from \"@nx/react/mf\";\nimport type { DynamicRemotes } from \"../../../types/global\";\nimport type {\n PluginExtension,\n PluginExtensionsType,\n ProcessedContributions,\n} from \"../../../types/plugins\";\n\nimport { defineExtensionPoint } from \"../extension-points/define-extension-point\";\nimport { parseJsonExtensionPoint } from \"../extension-points/json-extension-parser\";\nimport { contributionReducer } from \"../processors/contribution-reducer\";\nimport { applyExtensionReducers } from \"./plugin-extension-registry\";\n\ninterface PluginsType {\n remotes?: DynamicRemotes;\n extensions?: PluginExtensionsType;\n extensionPoints?: Record<string, PluginExtension[]>;\n getExtensions: (extensionPointId: string) => PluginExtension[];\n}\n\nexport async function initPluginManager(\n remotesOverride?: DynamicRemotes\n): Promise<PluginsType> {\n const remotes = remotesOverride ?? window.KosPlugins.__dynamicRemotes;\n\n if (window.KosPlugins.extensions) {\n const extensionPoints = window.KosPlugins.extensions;\n return {\n extensionPoints,\n getExtensions: (extensionPointId: string) =>\n extensionPoints[extensionPointId] || [],\n remotes,\n extensions: window.KosPlugins.__extensions,\n };\n }\n\n const extensions =\n window.KosPlugins.__extensions ?? (await loadExtensions(remotes));\n\n const extensionPoints: Record<string, PluginExtension[]> = {};\n if (extensions) {\n for (const extensionPointId of Object.keys(extensions)) {\n extensionPoints[extensionPointId] = Object.values(\n extensions[extensionPointId] || {}\n );\n }\n }\n\n window.KosPlugins.extensions = extensionPoints;\n\n const getExtensions = (extensionPointId: string) =>\n extensionPoints[extensionPointId] || [];\n\n return { extensionPoints, getExtensions, remotes, extensions };\n}\n\nconst DEFAULT_CONTRIBUTIONS: ProcessedContributions = {\n controlPourDefinitions: {},\n experiences: {},\n};\n\nexport function getContributions(\n remotes?: DynamicRemotes\n): ProcessedContributions {\n if (!remotes) {\n return DEFAULT_CONTRIBUTIONS;\n }\n return Object.keys(remotes).reduce(contributionReducer(remotes), {\n ...DEFAULT_CONTRIBUTIONS,\n });\n}\n\nexport async function loadExtensions(remotes?: DynamicRemotes) {\n if (!remotes) {\n window.KosPlugins = window.KosPlugins || {};\n return {};\n }\n\n // First pass: Parse JSON extension points and load InitPlugin modules\n // This ensures that any extension points (both JSON and TypeScript) are available\n // before we process contributions in the second pass\n for (const remote of Object.values(remotes)) {\n // Parse and register JSON-defined extension points\n try {\n if (remote.extensions && Array.isArray(remote.extensions)) {\n const jsonExtensionPoints = remote.extensions\n .filter((ext) => ext && typeof ext === \"object\" && \"id\" in ext)\n .map((epDef) => parseJsonExtensionPoint(epDef as unknown as any));\n\n if (jsonExtensionPoints.length > 0) {\n console.info(\n `Registering ${jsonExtensionPoints.length} JSON extension point(s) from ${remote.remote}`\n );\n\n for (const config of jsonExtensionPoints) {\n try {\n const extensionPoint = defineExtensionPoint(config);\n extensionPoint.register();\n console.debug(`Registered JSON extension point: ${config.id}`);\n } catch (error) {\n console.error(\n `Failed to register JSON extension point '${config.id}' from ${remote.remote}:`,\n error\n );\n }\n }\n }\n }\n } catch (error) {\n console.warn(\n `Failed to parse JSON extension points from ${remote.remote}:`,\n error\n );\n }\n\n // Then load TypeScript InitPlugin modules\n if (remote.init) {\n try {\n const InitPlugin = await loadRemoteModule(\n remote.remote,\n \"./InitPlugin\"\n );\n if (InitPlugin.default) {\n const initPlugin = new InitPlugin.default();\n initPlugin?.register();\n }\n } catch (error) {\n console.warn(`Failed to load InitPlugin from ${remote.remote}:`, error);\n }\n }\n }\n\n // Second pass: Now process contributions with full knowledge of all extension points\n const contributions = getContributions(remotes);\n const experiences = contributions.experiences;\n\n const baseExtensions: PluginExtensionsType = {};\n const reducedExtensions = applyExtensionReducers(\n baseExtensions,\n contributions,\n experiences\n );\n\n window.KosPlugins = window.KosPlugins || {};\n window.KosPlugins.__extensions = reducedExtensions;\n return reducedExtensions;\n}\n\nexport async function getExtensions(extensionPointId: string) {\n const { getExtensions } = await initPluginManager();\n return getExtensions(extensionPointId);\n}\n","import { setRemoteDefinitions } from \"@nx/react/mf\";\nimport type { Contributions, DynamicRemotes } from \"../../../types/global\";\nimport type {\n PluginExtension,\n PluginExtensionsType,\n} from \"../../../types/plugins\";\nimport \"../plugin-system/plugin-extension-registry-init\";\n\ndeclare interface KosPluginsType {\n __dynamicRemotes: DynamicRemotes;\n __extensions?: PluginExtensionsType;\n extensions?: Record<string, PluginExtension[]>;\n}\ndeclare global {\n interface Window {\n KosPlugins: KosPluginsType;\n }\n}\n\nexport interface Extensions {\n extensionPointId: string;\n id: string;\n component: string;\n}\n\nexport interface Descriptor {\n id: string;\n baseUrl: string;\n descriptor: {\n id: string;\n extensions: Extensions[];\n contributes: Contributions;\n };\n}\n\ninterface KosPluginsProps {\n pluginBaseUrl?: string;\n pluginApiPath?: string;\n pluginContext?: {\n context: string;\n group: string;\n };\n overrides?: Record<string, string>;\n}\n\n/**\n * Parses the query string from the URL or a provided string and returns an object\n * representing the key-value pairs in the query string.\n *\n * @param query - An optional query string to parse. If not provided, the function\n * will use the current window's `location.search` string.\n * The query string should not include the leading \"?\" character.\n *\n * @returns An object where each key is a parameter name from the query string,\n * and each value is the corresponding decoded parameter value.\n *\n * @example\n * // Assuming the URL is: https://example.com/?name=John&age=30\n * getQueryParams();\n * // Returns: { name: \"John\", age: \"30\" }\n *\n * @example\n * getQueryParams(\"foo=bar&baz=qux\");\n * // Returns: { foo: \"bar\", baz: \"qux\" }\n */\nexport const getQueryParams = (query = null) =>\n (query || window.location.search.replace(\"?\", \"\"))\n\n // get array of KeyValue pairs\n .split(\"&\")\n\n // Decode values\n .map((pair) => {\n const [key, val] = pair.split(\"=\");\n\n return [key, decodeURIComponent(val || \"\")];\n })\n\n // array to object\n .reduce((result, [key, val]) => {\n result[key] = val;\n return result;\n }, {});\n\nconst getDefaultHost = () => {\n const defaultHost = window.location.origin;\n const params = getQueryParams();\n const hostUrl = (params as Record<string, string>)?.host;\n const result = hostUrl || defaultHost;\n return result;\n};\n// eslint-disable-next-line no-restricted-globals\n\n/**\n * Initializes KOS plugins by fetching plugin metadata and configuring dynamic remotes.\n *\n * @param props - Optional properties to configure the plugin initialization.\n * @param props.pluginBaseUrl - The base URL for the plugins. Defaults to the result of `getDefaultHost()`.\n * @param props.pluginApiPath - The API path to fetch plugin metadata. Defaults to `\"/api/app/kosdev.ddk/ncui/plugins\"`.\n * @param props.overrides - An object containing overrides for plugin base URLs, keyed by plugin ID.\n * @param props.pluginContext - An optional context object that specifies the plugin context and group.\n * If provided, the function will fetch plugins from the UI plugins endpoint. Otherwise,\n * it will fetch from the DDK pluging endpoint.\n *\n * @returns A promise that resolves to a record of remote definitions, where the keys are remote IDs\n * and the values are the corresponding base paths for the remote entries.\n *\n * @remarks\n * - This function fetches plugin metadata from the specified API endpoint and processes the data\n * to configure dynamic remotes for the KOS plugin system.\n * - If a plugin does not have a descriptor, an error is logged to the console.\n * - The remote definitions are also set using the `setRemoteDefinitions` function.\n *\n * @throws Will throw an error if the fetch request fails or if the response cannot be parsed as JSON.\n */\nexport const initializeKosPlugins = async (props?: KosPluginsProps) => {\n const defaultHost = getDefaultHost();\n const data = props ?? {};\n const {\n pluginBaseUrl = defaultHost,\n pluginApiPath = \"/api/app/kosdev.ddk/ncui/plugins\",\n overrides = {},\n pluginContext,\n } = data;\n\n const useUiPlugins = !!pluginContext;\n\n const url = useUiPlugins\n ? `${pluginBaseUrl}/api/kos/ui/plugins/context/${pluginContext.context}`\n : `${pluginBaseUrl}${pluginApiPath}`;\n\n console.log(\n `initialize-plugins: Using Plugin Framework: ${useUiPlugins}: Fetching plugins from ${url}`\n );\n const plugins = await fetch(url);\n const remotes = await plugins.json();\n\n const pluginData = useUiPlugins\n ? remotes.data?.groups?.[pluginContext.group] ?? []\n : remotes.data ?? [];\n\n const allRemotes = pluginData?.reduce((acc: DynamicRemotes, item: any) => {\n const baseUrl =\n overrides?.[item.id] ?? useUiPlugins\n ? `${pluginBaseUrl}${item.path}`\n : `${pluginBaseUrl}${item.baseUrl}`;\n if (item.descriptor) {\n acc[item.id] = {\n basePath: `${baseUrl}remoteEntry.js`,\n extensions: item.descriptor.extensions || [],\n contributes: item.descriptor.contributes,\n remote: item.descriptor.id,\n init: !!item.descriptor.init,\n };\n } else {\n console.error(\n `initialize-plugins: Plugin ${item.id} does not have a descriptor`\n );\n }\n return acc;\n }, {} as DynamicRemotes);\n window.KosPlugins = window.KosPlugins || {};\n window.KosPlugins.__dynamicRemotes = allRemotes;\n const definitions = Object.keys(allRemotes).reduce((acc, item) => {\n const remote = allRemotes[item].remote;\n acc[remote] = allRemotes[item].basePath;\n return acc;\n }, {} as Record<string, string>);\n setRemoteDefinitions(definitions);\n return definitions;\n};\n","import type { PluginExtension } from \"../../../types/plugins\";\n\n/**\n * Resolves the best plugin extension for a given extension point.\n *\n * @param extensions A map of plugin extensions keyed by module/plugin ID\n * @param module Optional module ID to resolve\n * @param exact If true, only returns a plugin if the given `module` matches exactly. If false (default), falls back to the best-ranked plugin if no match is found.\n * @returns The resolved PluginExtension or null\n */\nexport function resolveBestExtension<T extends PluginExtension>(\n extensions: Record<string, T> | undefined,\n module?: string,\n exact = false\n): T | null {\n if (!extensions || Object.keys(extensions).length === 0) {\n return null;\n }\n\n // Exact mode: must match the module ID\n if (exact) {\n return module && extensions[module] ? extensions[module] : null;\n }\n\n // Prefer exact match if available\n if (module && extensions[module]) {\n return extensions[module];\n }\n\n // Fallback: pick the best-ranked plugin\n const sorted = Object.values(extensions)\n .filter((ext) => typeof ext.id === \"string\")\n .sort((a, b) => {\n const aRank = typeof a.rank === \"number\" ? a.rank : Infinity;\n const bRank = typeof b.rank === \"number\" ? b.rank : Infinity;\n\n if (aRank === bRank) {\n const aId = a.id ?? \"\";\n const bId = b.id ?? \"\";\n return aId.localeCompare(bId);\n }\n\n return aRank - bRank;\n });\n\n return sorted[0] ?? null;\n}\n","/**\n * Common Zod schemas and validation helpers for extension points\n *\n * Provides reusable base schemas and validation functions to reduce\n * duplication across extension point definitions.\n */\n\nimport { z } from \"zod\";\nimport type { ValidationContext } from \"./define-extension-point\";\n\n/**\n * Base schema for view-based DDK extension points\n * Contains common fields that all DDK extension points share\n */\nexport const BaseViewExtensionSchema = z.object({\n id: z\n .string()\n .min(1, \"ID is required\")\n .describe(\"Unique identifier for this extension\"),\n title: z\n .string()\n .min(1, \"Title is required\")\n .describe(\"Display title shown in the interface\"),\n namespace: z\n .string()\n .min(1, \"Namespace is required\")\n .describe(\"Namespace for organizing related extensions\"),\n experienceId: z\n .string()\n .min(1, \"Experience ID is required\")\n .describe(\"Reference to the UI component experience for rendering\"),\n});\n\n/**\n * Base schema with optional ranking support\n */\nexport const RankableViewExtensionSchema = BaseViewExtensionSchema.extend({\n rank: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe(\"Optional ranking for ordering (higher = preferred)\"),\n});\n\n/**\n * Performs standard Zod validation and adds errors to the validation context\n *\n * @param schema The Zod schema to validate against\n * @param data The data to validate\n * @param context The validation context to add errors to\n * @returns true if validation passed, false if errors were added\n */\nexport function validateWithSchema<T>(\n schema: z.ZodSchema<T>,\n data: unknown,\n context: ValidationContext\n): boolean {\n const result = schema.safeParse(data);\n if (!result.success) {\n result.error.errors.forEach((error) => {\n context.addError(`${error.path.join(\".\")}: ${error.message}`);\n });\n return false;\n }\n return true;\n}\n\n/**\n * Common validation for descriptor fields that should use dot notation\n *\n * @param descriptorField The name of the descriptor field (e.g., \"setupDescriptor\", \"cuiDescriptor\")\n * @param descriptorValue The value of the descriptor field\n * @param context The validation context to add warnings to\n */\nexport function validateDescriptorFormat(\n descriptorField: string,\n descriptorValue: string | undefined,\n context: ValidationContext\n): void {\n if (descriptorValue && !descriptorValue.includes(\".\")) {\n context.addWarning(\n `${descriptorField} '${descriptorValue}' should typically include dot notation (e.g., 'category.item')`\n );\n }\n}\n\n/**\n * Common validation for rank values to ensure they're reasonable\n *\n * @param rank The rank value to validate\n * @param context The validation context to add warnings to\n * @param maxReasonableRank The maximum reasonable rank value (default 1000)\n */\nexport function validateRank(\n rank: number | undefined,\n context: ValidationContext,\n maxReasonableRank = 1000\n): void {\n if (rank !== undefined && rank > maxReasonableRank) {\n context.addWarning(\n `Rank ${rank} seems unusually high - consider using lower values for better ordering`\n );\n }\n}\n\n/**\n * Helper to create extension-specific schemas by extending the base\n * and adding custom fields\n *\n * @param additionalFields Additional fields specific to this extension point\n * @param options Options for schema creation\n * @returns Extended schema with base fields and additional fields\n */\nexport function createExtensionSchema<T extends z.ZodRawShape>(\n additionalFields: T,\n options: { rankable?: boolean } = {}\n): z.ZodObject<\n z.objectUtil.extendShape<\n | (typeof BaseViewExtensionSchema)[\"shape\"]\n | (typeof RankableViewExtensionSchema)[\"shape\"],\n T\n >\n> {\n const baseSchema = options.rankable\n ? RankableViewExtensionSchema\n : BaseViewExtensionSchema;\n return baseSchema.extend(additionalFields);\n}\n\n/**\n * Type-safe validation for rankable extensions\n * Only validates rank if the data has a rank property\n */\nexport function validateRankIfPresent(\n data: unknown,\n context: ValidationContext,\n maxReasonableRank = 1000\n): void {\n if (typeof data === \"object\" && data !== null && \"rank\" in data) {\n const typedData = data as { rank?: number };\n validateRank(typedData.rank, context, maxReasonableRank);\n }\n}\n\n/**\n * Type helper for inferring types from extension schemas\n */\nexport type InferExtensionSchema<T extends z.ZodTypeAny> = z.infer<T>;\n","/**\n * Plugin Discovery Service\n *\n * Pure business logic for discovering and analyzing plugins and extension points.\n * No UI dependencies - can be used by CLI tools, tests, or any consumer.\n */\n\nimport type {\n PluginExtension,\n PluginExtensionsType,\n} from \"../../../types/plugins\";\nimport { getExtensionPointRegistry } from \"../extension-points/extension-point-registry\";\n\nexport interface ExtensionPointInfo {\n id: string;\n displayName?: string;\n description?: string;\n source: \"simplified\" | \"legacy\";\n metadata?: {\n category?: string;\n tags?: string[];\n since?: string;\n deprecated?: boolean;\n owner?: string;\n };\n pluginCount: number;\n plugins: PluginExtension[];\n}\n\nexport interface PluginHealthStats {\n totalExtensionPoints: number;\n extensionPointsWithPlugins: number;\n totalPlugins: number;\n simplifiedExtensionPoints: number;\n legacyExtensionPoints: number;\n deprecatedExtensionPoints: number;\n}\n\nexport interface PluginDiscoveryOptions {\n includeLegacyExtensions?: boolean;\n includeEmptyExtensionPoints?: boolean;\n}\n\nexport interface PluginDescriptorValidationResult {\n isValid: boolean;\n errors: string[];\n warnings: string[];\n missingRequired: string[];\n suggestions: string[];\n}\n\nexport interface CompatibilityCheckResult {\n isCompatible: boolean;\n issues: string[];\n missingExtensionPoints: string[];\n incompatibleTypes: string[];\n suggestions: string[];\n}\n\nexport interface PluginDescriptor {\n id: string;\n init?: boolean;\n contributes?: {\n [key: string]: any[];\n };\n}\n\n/**\n * Plugin Discovery Service - Core business logic for plugin analysis\n */\nexport class PluginDiscoveryService {\n /**\n * Get all extension points with their plugin information\n */\n static getExtensionPoints(\n extensions: PluginExtensionsType | undefined,\n options: PluginDiscoveryOptions = {}\n ): ExtensionPointInfo[] {\n const {\n includeLegacyExtensions = true,\n includeEmptyExtensionPoints = true,\n } = options;\n const registry = getExtensionPointRegistry();\n const simplifiedExtensionPoints = registry.getAllExtensionPoints();\n const result: ExtensionPointInfo[] = [];\n\n // Add simplified extension points\n simplifiedExtensionPoints.forEach((point) => {\n const plugins = Object.values(extensions?.[point.id] || {});\n\n if (!includeEmptyExtensionPoints && plugins.length === 0) {\n return;\n }\n\n result.push({\n id: point.id,\n displayName: point.config.displayName,\n description: point.config.description,\n source: \"simplified\",\n metadata: point.config.metadata,\n pluginCount: plugins.length,\n plugins,\n });\n });\n\n // Add legacy extension points (if enabled)\n if (includeLegacyExtensions && extensions) {\n Object.entries(extensions).forEach(([extensionId, extensionPlugins]) => {\n // Skip if already added as simplified extension point\n if (result.some((item) => item.id === extensionId)) {\n return;\n }\n\n const plugins = Object.values(extensionPlugins || {});\n\n if (!includeEmptyExtensionPoints && plugins.length === 0) {\n return;\n }\n\n result.push({\n id: extensionId,\n source: \"legacy\",\n pluginCount: plugins.length,\n plugins,\n });\n });\n }\n\n return result.sort((a, b) => a.id.localeCompare(b.id));\n }\n\n /**\n * Filter extension points based on search criteria\n */\n static filterExtensionPoints(\n extensionPoints: ExtensionPointInfo[],\n searchTerm: string\n ): ExtensionPointInfo[] {\n if (!searchTerm.trim()) {\n return extensionPoints;\n }\n\n const term = searchTerm.toLowerCase();\n return extensionPoints.filter(\n (point) =>\n point.id.toLowerCase().includes(term) ||\n point.displayName?.toLowerCase().includes(term) ||\n point.description?.toLowerCase().includes(term) ||\n point.metadata?.category?.toLowerCase().includes(term) ||\n point.metadata?.tags?.some((tag) => tag.toLowerCase().includes(term))\n );\n }\n\n /**\n * Calculate health statistics for the plugin system\n */\n static calculateHealthStats(\n extensionPoints: ExtensionPointInfo[]\n ): PluginHealthStats {\n const totalExtensionPoints = extensionPoints.length;\n const extensionPointsWithPlugins = extensionPoints.filter(\n (point) => point.pluginCount > 0\n ).length;\n const totalPlugins = extensionPoints.reduce(\n (sum, point) => sum + point.pluginCount,\n 0\n );\n const simplifiedExtensionPoints = extensionPoints.filter(\n (point) => point.source === \"simplified\"\n ).length;\n const legacyExtensionPoints = extensionPoints.filter(\n (point) => point.source === \"legacy\"\n ).length;\n const deprecatedExtensionPoints = extensionPoints.filter(\n (point) => point.metadata?.deprecated\n ).length;\n\n return {\n totalExtensionPoints,\n extensionPointsWithPlugins,\n totalPlugins,\n simplifiedExtensionPoints,\n legacyExtensionPoints,\n deprecatedExtensionPoints,\n };\n }\n\n /**\n * Analyze a specific plugin for health and capabilities\n */\n static analyzePlugin(plugin: PluginExtension): {\n hasComponent: boolean;\n hasRank: boolean;\n healthStatus: \"healthy\" | \"warning\" | \"error\";\n capabilities: string[];\n } {\n const hasComponent = !!(plugin as any).component;\n const hasRank = typeof (plugin as any).rank === \"number\";\n const rank = (plugin as any).rank || 0;\n const capabilities: string[] = [];\n\n // Add meaningful capabilities for developers\n if (hasComponent) {\n capabilities.push(\"UI Component\");\n } else {\n capabilities.push(\"Background Service\");\n }\n\n if (hasRank) capabilities.push(`Rank: ${rank}`);\n\n // Add more meaningful plugin characteristics\n if ((plugin as any).namespace) {\n const namespace = (plugin as any).namespace;\n if (namespace.includes(\"kos\") || namespace.includes(\"ddk\")) {\n capabilities.push(\"First-party\");\n } else {\n capabilities.push(\"Third-party\");\n }\n }\n\n // Check for modal mode (CUI plugins)\n if ((plugin as any).modalMode) {\n capabilities.push(`Modal: ${(plugin as any).modalMode}`);\n }\n\n // Simple health analysis - could be more sophisticated\n let healthStatus: \"healthy\" | \"warning\" | \"error\" = \"healthy\";\n\n if (!plugin.remote) {\n healthStatus = \"warning\";\n }\n\n // Could add more health checks:\n // - Check if module actually loads\n // - Validate plugin descriptor schema\n // - Check for required properties\n\n return {\n hasComponent,\n hasRank,\n healthStatus,\n capabilities,\n };\n }\n\n /**\n * Get extension point by ID with detailed information\n */\n static getExtensionPointById(\n extensionPoints: ExtensionPointInfo[],\n id: string\n ): ExtensionPointInfo | undefined {\n return extensionPoints.find((point) => point.id === id);\n }\n\n /**\n * Validate if an extension point ID follows conventions\n */\n static validateExtensionPointId(id: string): {\n isValid: boolean;\n issues: string[];\n suggestions: string[];\n } {\n const issues: string[] = [];\n const suggestions: string[] = [];\n\n // Check basic format\n if (!id.includes(\".\")) {\n issues.push(\n \"Extension point ID should contain at least one dot (namespace.feature)\"\n );\n suggestions.push('Use format like \"ddk.myFeature\" or \"app.myFeature\"');\n }\n\n // Check namespace conventions\n const parts = id.split(\".\");\n if (parts.length < 2) {\n issues.push(\n \"Extension point ID should have at least 2 parts (namespace.feature)\"\n );\n }\n\n const namespace = parts[0];\n if (\n namespace &&\n ![\"ddk\", \"cui\", \"app\"].includes(namespace) &&\n !namespace.endsWith(\"app\")\n ) {\n suggestions.push(\n \"Consider using standard namespaces: ddk, cui, or [appname]app\"\n );\n }\n\n // Check for camelCase in parts\n const hasCamelCase = parts.some((part) => /[A-Z]/.test(part));\n if (hasCamelCase) {\n issues.push(\"Extension point ID parts should be lowercase\");\n suggestions.push(\n 'Use kebab-case or dot notation: \"my.feature\" not \"my.myFeature\"'\n );\n }\n\n return {\n isValid: issues.length === 0,\n issues,\n suggestions,\n };\n }\n\n /**\n * Validate a plugin descriptor structure and content\n */\n static validatePluginDescriptor(\n descriptor: PluginDescriptor\n ): PluginDescriptorValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n const missingRequired: string[] = [];\n const suggestions: string[] = [];\n\n // Required fields validation\n if (!descriptor.id) {\n missingRequired.push(\"id\");\n errors.push(\"Plugin descriptor must have an 'id' field\");\n } else {\n // Validate ID format (informational only)\n if (!descriptor.id.match(/^[a-z0-9-]+$/)) {\n suggestions.push(\n \"Plugin ID convention: use lowercase letters, numbers, and hyphens (e.g., 'my-awesome-plugin')\"\n );\n }\n }\n\n // Contributions validation\n if (!descriptor.contributes) {\n warnings.push(\n \"Plugin has no contributions - it won't extend any functionality\"\n );\n suggestions.push(\"Add a 'contributes' section with plugin contributions\");\n } else {\n const contributionKeys = Object.keys(descriptor.contributes);\n if (contributionKeys.length === 0) {\n warnings.push(\"Plugin contributes section is empty\");\n }\n\n // Validate each contribution type\n contributionKeys.forEach((key) => {\n const contributions = descriptor.contributes![key];\n if (!Array.isArray(contributions)) {\n errors.push(`Contribution '${key}' must be an array`);\n return;\n }\n\n contributions.forEach((contrib, index) => {\n if (!contrib.id) {\n errors.push(\n `Contribution ${key}[${index}] missing required 'id' field`\n );\n }\n\n // Validate view contributions\n if (key === \"experiences\" && contrib.component && !contrib.location) {\n errors.push(\n `Experience '${contrib.id}' has component but no location`\n );\n suggestions.push(\n \"Add 'location' field pointing to the component file\"\n );\n }\n\n // Validate common required fields based on contribution type\n if ([\"cui\", \"utilities\", \"settings\", \"setup\"].includes(key)) {\n if (!contrib.title) {\n warnings.push(\n `${key} contribution '${contrib.id}' missing 'title' field`\n );\n }\n if (!contrib.namespace) {\n warnings.push(\n `${key} contribution '${contrib.id}' missing 'namespace' field`\n );\n }\n if (!contrib.experienceId) {\n errors.push(\n `${key} contribution '${contrib.id}' missing required 'experienceId' field`\n );\n }\n }\n });\n });\n }\n\n // Init flag validation\n if (descriptor.init !== undefined && typeof descriptor.init !== \"boolean\") {\n errors.push(\"'init' field must be a boolean value\");\n }\n\n return {\n isValid: errors.length === 0 && missingRequired.length === 0,\n errors,\n warnings,\n missingRequired,\n suggestions,\n };\n }\n\n /**\n * Check compatibility between plugin contributions and available extension points\n */\n static checkPluginCompatibility(\n pluginDescriptor: PluginDescriptor,\n availableExtensionPoints: ExtensionPointInfo[]\n ): CompatibilityCheckResult {\n const issues: string[] = [];\n const missingExtensionPoints: string[] = [];\n const incompatibleTypes: string[] = [];\n const suggestions: string[] = [];\n\n if (!pluginDescriptor.contributes) {\n return {\n isCompatible: true,\n issues: [\"Plugin has no contributions to check\"],\n missingExtensionPoints: [],\n incompatibleTypes: [],\n suggestions: [],\n };\n }\n\n const registry = getExtensionPointRegistry();\n const availableIds = new Set(\n availableExtensionPoints.map((point) => point.id)\n );\n\n // Check each contribution type\n Object.entries(pluginDescriptor.contributes).forEach(\n ([contributionKey, contributions]) => {\n // Map contribution keys to expected extension point IDs\n const expectedExtensionPoints =\n this.getExpectedExtensionPoints(contributionKey);\n\n expectedExtensionPoints.forEach((extensionPointId) => {\n if (!availableIds.has(extensionPointId)) {\n missingExtensionPoints.push(extensionPointId);\n issues.push(\n `Extension point '${extensionPointId}' not available for '${contributionKey}' contributions`\n );\n suggestions.push(\n `Ensure the extension point '${extensionPointId}' is registered`\n );\n }\n });\n\n // Check simplified extension point compatibility\n const simplifiedPoints = registry.getAllExtensionPoints();\n const matchingPoint = simplifiedPoints.find(\n (point) => point.config.contributionKey === contributionKey\n );\n\n if (matchingPoint && contributions.length > 0) {\n // Validate contribution structure matches extension point expectations\n contributions.forEach((contrib: any, index) => {\n if (\n matchingPoint.config.isRankable &&\n typeof contrib.rank !== \"number\"\n ) {\n issues.push(\n `${contributionKey}[${index}]: Extension point '${matchingPoint.id}' expects 'rank' property`\n );\n suggestions.push(\n \"Add 'rank' property with numeric value for ordering\"\n );\n }\n\n if (matchingPoint.config.hasView && !contrib.experienceId) {\n issues.push(\n `${contributionKey}[${index}]: Extension point '${matchingPoint.id}' expects 'experienceId' for view-based contributions`\n );\n suggestions.push(\n \"Add 'experienceId' property linking to an experience definition\"\n );\n }\n });\n }\n }\n );\n\n return {\n isCompatible: issues.length === 0,\n issues,\n missingExtensionPoints,\n incompatibleTypes,\n suggestions,\n };\n }\n\n /**\n * Map contribution keys to their expected extension point IDs\n */\n private static getExpectedExtensionPoints(contributionKey: string): string[] {\n // Known mappings from existing system\n const mappings: Record<string, string[]> = {\n cui: [\"ddk.cui\", \"ddk.cui.view\", \"ddk.cui.settings.config\"],\n utilities: [\"ddk.utility\", \"ddk.utility.view\", \"ddk.utilities\"],\n setup: [\"ddk.setup\", \"ddk.setup.view\"],\n settings: [\"ddk.settings\", \"ddk.settings.view\"],\n troubleActions: [\"ddk.troubleAction\", \"ddk.troubleAction.view\"],\n navViews: [\"ddk.nav\", \"ddk.nav.view\"],\n controlPour: [\"ddk.controlPour\", \"ddk.controlPour.view\"],\n experiences: [], // Experiences don't directly map to extension points\n views: [], // Views are mapped by their extension point ID keys\n };\n\n return mappings[contributionKey] || [];\n }\n\n /**\n * Get comprehensive plugin analysis including validation and compatibility\n */\n static analyzePluginDescriptor(\n descriptor: PluginDescriptor,\n availableExtensionPoints: ExtensionPointInfo[]\n ): {\n validation: PluginDescriptorValidationResult;\n compatibility: CompatibilityCheckResult;\n recommendations: string[];\n } {\n const validation = this.validatePluginDescriptor(descriptor);\n const compatibility = this.checkPluginCompatibility(\n descriptor,\n availableExtensionPoints\n );\n const recommendations: string[] = [];\n\n // Generate recommendations based on analysis\n if (validation.warnings.length > 0) {\n recommendations.push(\n \"Address validation warnings to improve plugin quality\"\n );\n }\n\n if (!compatibility.isCompatible) {\n recommendations.push(\n \"Resolve compatibility issues before deploying plugin\"\n );\n }\n\n if (\n descriptor.contributes &&\n Object.keys(descriptor.contributes).length === 1\n ) {\n recommendations.push(\n \"Consider adding more contribution types to increase plugin value\"\n );\n }\n\n return {\n validation,\n compatibility,\n recommendations,\n };\n }\n}\n","/**\n * Documentation Generator Service\n *\n * Auto-generates markdown documentation from registered extension points,\n * including usage examples and TypeScript definitions.\n */\n\nimport type {\n PluginExtension,\n PluginExtensionsType,\n} from \"../../../types/plugins\";\nimport { getExtensionPointRegistry } from \"../extension-points/extension-point-registry\";\nimport type { SchemaFieldInfo } from \"../extension-points/extension-point-types\";\nimport type { ExtensionPointInfo } from \"./plugin-discovery-service\";\nimport { PluginDiscoveryService } from \"./plugin-discovery-service\";\n\nexport interface DocumentationOptions {\n includeUsageExamples?: boolean;\n includeTypeDefinitions?: boolean;\n includeLegacyExtensions?: boolean;\n includePluginHealth?: boolean;\n format?: \"markdown\" | \"html\";\n}\n\nexport interface GeneratedDocumentation {\n content: string;\n metadata: {\n generatedAt: string;\n totalExtensionPoints: number;\n totalPlugins: number;\n simplifiedExtensionPoints: number;\n legacyExtensionPoints: number;\n };\n}\n\n/**\n * Documentation Generator - Creates comprehensive documentation from extension points\n */\nexport class DocumentationGenerator {\n /**\n * Generate complete documentation for all extension points\n */\n static generateFullDocumentation(\n extensions: PluginExtensionsType | undefined,\n options: DocumentationOptions = {}\n ): GeneratedDocumentation {\n const {\n includeUsageExamples = true,\n includeTypeDefinitions = true,\n includeLegacyExtensions = true,\n includePluginHealth = true,\n } = options;\n\n const extensionPoints = PluginDiscoveryService.getExtensionPoints(\n extensions,\n {\n includeLegacyExtensions,\n includeEmptyExtensionPoints: true,\n }\n );\n\n const healthStats =\n PluginDiscoveryService.calculateHealthStats(extensionPoints);\n\n let content = this.generateHeader(healthStats);\n content += this.generateTableOfContents(extensionPoints);\n content += this.generateOverviewSection(extensionPoints, healthStats);\n\n // Generate documentation for each extension point\n extensionPoints.forEach((point) => {\n content += this.generateExtensionPointSection(point, {\n includeUsageExamples,\n includePluginHealth,\n });\n });\n\n if (includeTypeDefinitions) {\n content += this.generateTypeDefinitionsSection(extensionPoints);\n }\n\n content += this.generateContributionGuide();\n content += this.generateTroubleshootingSection();\n\n return {\n content,\n metadata: {\n generatedAt: new Date().toISOString(),\n totalExtensionPoints: healthStats.totalExtensionPoints,\n totalPlugins: healthStats.totalPlugins,\n simplifiedExtensionPoints: healthStats.simplifiedExtensionPoints,\n legacyExtensionPoints: healthStats.legacyExtensionPoints,\n },\n };\n }\n\n /**\n * Generate documentation header with metadata\n */\n private static generateHeader(healthStats: any): string {\n return `# KOS Plugin Extension Points Reference\n\n**Generated**: ${new Date().toLocaleString()}\n\n## System Overview\n\n- **Total Extension Points**: ${healthStats.totalExtensionPoints}\n- **Extension Points with Plugins**: ${healthStats.extensionPointsWithPlugins}\n- **Total Active Plugins**: ${healthStats.totalPlugins}\n- **Simplified Extension Points**: ${healthStats.simplifiedExtensionPoints}\n- **Legacy Extension Points**: ${healthStats.legacyExtensionPoints}\n\n---\n\n`;\n }\n\n /**\n * Generate table of contents\n */\n private static generateTableOfContents(\n extensionPoints: ExtensionPointInfo[]\n ): string {\n let toc = \"## Table of Contents\\n\\n\";\n\n toc += \"- [Overview](#overview)\\n\";\n toc += \"- [Extension Points](#extension-points)\\n\";\n\n extensionPoints.forEach((point) => {\n const anchor = point.id.toLowerCase().replace(/\\./g, \"\");\n\n toc += ` - [${point.id}](#${anchor}) (${point.pluginCount} plugins)\\n`;\n });\n\n toc += \"- [Type Definitions](#type-definitions)\\n\";\n toc += \"- [Contribution Guide](#contribution-guide)\\n\";\n toc += \"- [Troubleshooting](#troubleshooting)\\n\\n\";\n\n return toc;\n }\n\n /**\n * Generate overview section with health statistics\n */\n private static generateOverviewSection(\n _extensionPoints: ExtensionPointInfo[],\n healthStats: any\n ): string {\n let overview = \"## Overview\\n\\n\";\n\n overview +=\n \"This document provides a comprehensive reference for all available extension points in the KOS plugin system. \";\n overview +=\n \"Extension points allow plugins to contribute functionality to the application.\\n\\n\";\n\n overview += \"### Extension Point Types\\n\\n\";\n overview +=\n \"- **✨ Simplified Extension Points**: Use the new simplified API from `defineExtensionPoint`\\n\";\n overview +=\n \"- **📚 Legacy Extension Points**: Use the traditional reducer-based system\\n\\n\";\n\n if (healthStats.deprecatedExtensionPoints > 0) {\n overview += `### ⚠️ Deprecated Extension Points\\n\\n`;\n overview += `${healthStats.deprecatedExtensionPoints} extension points are marked as deprecated. `;\n overview += `Consider migrating to newer alternatives.\\n\\n`;\n }\n\n return overview + \"---\\n\\n\";\n }\n\n /**\n * Generate documentation section for a single extension point\n */\n private static generateExtensionPointSection(\n extensionPoint: ExtensionPointInfo,\n options: { includeUsageExamples?: boolean; includePluginHealth?: boolean }\n ): string {\n const { includeUsageExamples = true, includePluginHealth = true } = options;\n\n let section = `## ${extensionPoint.source === \"simplified\" ? \"✨\" : \"📚\"} ${\n extensionPoint.id\n }\\n\\n`;\n\n // Basic information\n if (extensionPoint.displayName) {\n section += `**Display Name**: ${extensionPoint.displayName}\\n\\n`;\n }\n\n if (extensionPoint.description) {\n section += `**Description**: ${extensionPoint.description}\\n\\n`;\n }\n\n section += `**Source**: ${extensionPoint.source}\\n`;\n section += `**Active Plugins**: ${extensionPoint.pluginCount}\\n\\n`;\n\n // Metadata\n if (extensionPoint.metadata) {\n section += \"### Metadata\\n\\n\";\n const metadata = extensionPoint.metadata;\n\n if (metadata.category)\n section += `- **Category**: ${metadata.category}\\n`;\n if (metadata.owner) section += `- **Owner**: ${metadata.owner}\\n`;\n if (metadata.since) section += `- **Since**: ${metadata.since}\\n`;\n if (metadata.tags?.length)\n section += `- **Tags**: ${metadata.tags.join(\", \")}\\n`;\n if (metadata.deprecated) section += `- **⚠️ Status**: Deprecated\\n`;\n\n section += \"\\n\";\n }\n\n // Usage examples\n if (includeUsageExamples) {\n section += this.generateUsageExamples(extensionPoint);\n }\n\n // Plugin list\n if (extensionPoint.plugins.length > 0) {\n section += this.generatePluginList(\n extensionPoint.plugins,\n includePluginHealth\n );\n } else {\n section +=\n \"### Plugins\\n\\nNo plugins currently registered for this extension point.\\n\\n\";\n }\n\n // Schema fields (if available)\n section += this.generateSchemaFieldsSection(extensionPoint);\n\n // Contribution structure\n section += this.generateContributionStructure(extensionPoint);\n\n return section + \"---\\n\\n\";\n }\n\n /**\n * Generate usage examples for an extension point\n */\n static generateUsageExamples(extensionPoint: ExtensionPointInfo): string {\n let examples = \"### Usage Examples\\n\\n\";\n\n if (extensionPoint.source === \"simplified\") {\n examples += \"#### Using Simplified API\\n\\n\";\n examples += \"```typescript\\n\";\n examples += `// Import the extension point\\n`;\n examples += `import { ${this.getExtensionPointImportName(\n extensionPoint.id\n )} } from './extension-points';\\n\\n`;\n examples += `// Use extension component hook\\n`;\n examples += `import { useExtensionComponent } from '@kosdev-code/kos-ui-plugin';\\n\\n`;\n examples += `const Component = useExtensionComponent(${this.getExtensionPointImportName(\n extensionPoint.id\n )});\\n\\n`;\n examples += `if (Component) {\\n`;\n examples += ` return (\\n`;\n examples += ` <Component \\n`;\n examples += ` customProp=\"value\"\\n`;\n examples += ` onComplete={handleComplete}\\n`;\n examples += ` />\\n`;\n examples += ` );\\n`;\n examples += `}\\n\\n`;\n examples += `// Or use with dynamic component\\n`;\n examples += `const [Component] = useDynamicComponent({\\n`;\n examples += ` extension: ${this.getExtensionPointImportName(\n extensionPoint.id\n )}.id\\n`;\n examples += `});\\n`;\n examples += \"```\\n\\n\";\n\n examples += \"#### Using Typed Hooks\\n\\n\";\n examples += \"```typescript\\n\";\n examples += `// Get all extensions with type safety\\n`;\n examples += `const extensions = useExtensions(${this.getExtensionPointImportName(\n extensionPoint.id\n )});\\n\\n`;\n examples += `// Get best extension\\n`;\n examples += `const bestExtension = useBest(${this.getExtensionPointImportName(\n extensionPoint.id\n )});\\n\\n`;\n examples += `// Check availability\\n`;\n examples += `const hasExtensions = useHasExtensions(${this.getExtensionPointImportName(\n extensionPoint.id\n )});\\n`;\n examples += \"```\\n\\n\";\n }\n\n examples += \"#### Using DynamicComponent\\n\\n\";\n examples += \"```typescript\\n\";\n examples += `import { DynamicComponent } from '@kosdev-code/kos-ui-plugin';\\n`;\n examples += `import { ${this.getExtensionPointImportName(\n extensionPoint.id\n )} } from './extension-points';\\n\\n`;\n examples += `<DynamicComponent\\n`;\n examples += ` extension={${this.getExtensionPointImportName(\n extensionPoint.id\n )}.id}\\n`;\n examples += ` props={{ customData: \"value\" }}\\n`;\n examples += ` fallback={<div>Loading...</div>}\\n`;\n examples += `/>\\n`;\n examples += \"```\\n\\n\";\n\n examples += \"#### Using Context\\n\\n\";\n examples += \"```typescript\\n\";\n examples += `import { useKosPluginsContext } from '@kosdev-code/kos-ui-plugin';\\n`;\n examples += `import { ${this.getExtensionPointImportName(\n extensionPoint.id\n )} } from './extension-points';\\n\\n`;\n examples += `const { getExtensions } = useKosPluginsContext();\\n`;\n examples += `const extensions = getExtensions(${this.getExtensionPointImportName(\n extensionPoint.id\n )}.id);\\n`;\n examples += \"```\\n\\n\";\n\n return examples;\n }\n\n /**\n * Generate plugin list with health information\n */\n private static generatePluginList(\n plugins: PluginExtension[],\n includeHealth: boolean\n ): string {\n let list = \"### Active Plugins\\n\\n\";\n\n plugins.forEach((plugin) => {\n list += `#### ${plugin.id}\\n\\n`;\n\n if (plugin.remote) {\n list += `- **Remote**: ${plugin.remote}\\n`;\n }\n\n if (plugin.sectionId) {\n list += `- **Section**: ${plugin.sectionId}\\n`;\n }\n\n if ((plugin as any).rank !== undefined) {\n list += `- **Rank**: ${(plugin as any).rank}\\n`;\n }\n\n if (includeHealth) {\n const analysis = PluginDiscoveryService.analyzePlugin(plugin);\n list += `- **Health**: ${this.getHealthEmoji(analysis.healthStatus)} ${\n analysis.healthStatus\n }\\n`;\n\n if (analysis.capabilities.length > 0) {\n list += `- **Capabilities**: ${analysis.capabilities.join(\", \")}\\n`;\n }\n }\n\n list += \"\\n\";\n });\n\n return list;\n }\n\n /**\n * Generate schema fields documentation\n */\n private static generateSchemaFieldsSection(\n extensionPoint: ExtensionPointInfo\n ): string {\n // Only generate for simplified extension points with schemas\n if (extensionPoint.source !== \"simplified\") {\n return \"\";\n }\n\n const registry = getExtensionPointRegistry();\n const point = registry.getExtensionPoint(extensionPoint.id);\n\n if (!point?.getSchemaFieldInfo) {\n return \"\";\n }\n\n const fieldInfo = point.getSchemaFieldInfo();\n if (fieldInfo.length === 0) {\n return \"\";\n }\n\n let section = \"### Schema Fields\\n\\n\";\n section +=\n \"The following fields are defined in the schema for this extension point:\\n\\n\";\n section += \"| Field | Type | Required | Description |\\n\";\n section += \"|-------|------|----------|-------------|\\n\";\n\n fieldInfo.forEach((field) => {\n const name = field.name;\n const type = field.type || \"unknown\";\n const required = field.required ? \"✅\" : \"⭕\";\n const description = field.description || \"-\";\n\n section += `| \\`${name}\\` | ${type} | ${required} | ${description} |\\n`;\n });\n\n section += \"\\n\";\n\n return section;\n }\n\n /**\n * Generate contribution structure documentation\n */\n private static generateContributionStructure(\n extensionPoint: ExtensionPointInfo\n ): string {\n let structure = \"### Contribution Structure\\n\\n\";\n\n structure +=\n \"To contribute to this extension point, add the following to your plugin descriptor:\\n\\n\";\n structure += \"```json\\n\";\n structure += `{\\n`;\n structure += ` \"id\": \"your-plugin-id\",\\n`;\n structure += ` \"contributes\": {\\n`;\n\n // Try to infer contribution key from extension point ID or metadata\n const contributionKey = this.inferContributionKey(extensionPoint);\n\n structure += ` \"${contributionKey}\": [\\n`;\n structure += ` {\\n`;\n\n // Get schema fields if available (for simplified extension points)\n const schemaFields = this.getSchemaFieldsForContribution(extensionPoint);\n\n if (schemaFields.length > 0) {\n // Use schema-defined fields for the example\n const fieldExamples: string[] = [];\n\n schemaFields.forEach((field) => {\n let value: string;\n\n // Generate appropriate example values based on field type and name\n if (field.name === \"id\") {\n value = '\"your-contribution-id\"';\n } else if (field.name === \"title\") {\n value = '\"Your Contribution Title\"';\n } else if (field.name === \"namespace\") {\n value = '\"your-namespace\"';\n } else if (field.name === \"experienceId\") {\n value = '\"your-experience-id\"';\n } else if (field.name === \"dashboardKey\") {\n value = '\"your-dashboard-key\"';\n } else if (field.name === \"rank\") {\n value = \"10\";\n } else if (field.type === \"string\") {\n value = `\"your-${field.name}\"`;\n } else if (field.type === \"number\") {\n value = \"0\";\n } else if (field.type === \"boolean\") {\n value = \"false\";\n } else {\n value = `\"your-${field.name}\"`;\n }\n\n // Only include required fields and important optional ones\n if (\n field.required ||\n [\"experienceId\", \"rank\", \"dashboardKey\"].includes(field.name)\n ) {\n fieldExamples.push(` \"${field.name}\": ${value}`);\n }\n });\n\n structure += fieldExamples.join(\",\\n\");\n } else {\n // Fallback to old logic for legacy extension points\n structure += ` \"id\": \"your-contribution-id\",\\n`;\n structure += ` \"title\": \"Your Contribution Title\",\\n`;\n structure += ` \"namespace\": \"your-namespace\"`;\n\n // Add common fields based on patterns\n if (this.isViewBasedExtensionPoint(extensionPoint)) {\n structure += `,\\n \"experienceId\": \"your-experience-id\"`;\n }\n\n if (this.isRankableExtensionPoint(extensionPoint)) {\n structure += `,\\n \"rank\": 10`;\n }\n\n // Add specific fields based on extension point type\n const specificFields = this.getSpecificFields(extensionPoint);\n if (specificFields.length > 0) {\n structure += `,\\n ${specificFields.join(\",\\n \")}`;\n }\n }\n\n structure += `\\n }\\n`;\n structure += ` ]`;\n\n // Only add experiences section if it's a view-based extension point\n const hasExperienceId =\n schemaFields.some((f) => f.name === \"experienceId\") ||\n this.isViewBasedExtensionPoint(extensionPoint);\n\n if (hasExperienceId) {\n structure += `,\\n \"experiences\": {\\n`;\n structure += ` \"your-experience-id\": {\\n`;\n structure += ` \"id\": \"your-experience-id\",\\n`;\n structure += ` \"component\": \"YourComponent\",\\n`;\n structure += ` \"location\": \"./src/components/YourComponent.tsx\"\\n`;\n structure += ` }\\n`;\n structure += ` }`;\n }\n\n structure += `\\n }\\n`;\n structure += `}\\n`;\n structure += \"```\\n\\n\";\n\n return structure;\n }\n\n /**\n * Generate TypeScript definitions section\n */\n private static generateTypeDefinitionsSection(\n extensionPoints: ExtensionPointInfo[]\n ): string {\n let section = \"## Type Definitions\\n\\n\";\n\n section += \"### Extension Point Types\\n\\n\";\n section += \"```typescript\\n\";\n\n extensionPoints.forEach((point) => {\n if (point.source === \"simplified\") {\n section += `// ${point.id}\\n`;\n section += `interface ${this.getExtensionPointTypeName(point.id)} {\\n`;\n section += ` id: \"${point.id}\";\\n`;\n section += ` displayName?: \"${point.displayName || \"\"}\";\\n`;\n section += ` description?: \"${point.description || \"\"}\";\\n`;\n section += `}\\n\\n`;\n }\n });\n\n section += \"```\\n\\n\";\n\n section += \"### Plugin Contribution Types\\n\\n\";\n section += \"```typescript\\n\";\n section += \"interface BaseContribution {\\n\";\n section += \" id: string;\\n\";\n section += \" title: string;\\n\";\n section += \" namespace: string;\\n\";\n section += \"}\\n\\n\";\n section += \"interface ViewBasedContribution extends BaseContribution {\\n\";\n section += \" experienceId: string;\\n\";\n section += \"}\\n\\n\";\n section += \"interface RankableContribution extends BaseContribution {\\n\";\n section += \" rank: number;\\n\";\n section += \"}\\n\";\n section += \"```\\n\\n\";\n\n return section;\n }\n\n /**\n * Generate contribution guide\n */\n private static generateContributionGuide(): string {\n return `## Contribution Guide\n\n### Creating a Plugin\n\n1. **Create Plugin Project**\n \\`\\`\\`bash\n kosui plugin-project --name my-plugin\n \\`\\`\\`\n\n2. **Add Components**\n \\`\\`\\`bash\n kosui component --name MyComponent --pluginType utility --project my-plugin\n \\`\\`\\`\n\n3. **Update Plugin Descriptor**\n Add contributions to your \\`kosdev-plugin.json\\` file following the structure examples above.\n\n4. **Test Integration**\n Use the Plugin Explorer (Ctrl+Shift+P) to validate your plugin registration.\n\n### Best Practices\n\n- **Use descriptive IDs**: Plugin and contribution IDs should be clear and unique\n- **Follow naming conventions**: Use kebab-case for IDs, PascalCase for components\n- **Provide meaningful titles**: Titles are shown to users in the interface\n- **Set appropriate ranks**: Higher numbers = higher priority for rankable contributions\n- **Include proper metadata**: Namespace helps organize plugins by owner\n\n### Validation\n\nUse the Plugin Discovery Service to validate your plugin descriptor:\n\n\\`\\`\\`typescript\nimport { PluginDiscoveryService } from '@kosdev-code/kos-ui-plugin';\n\nconst validation = PluginDiscoveryService.validatePluginDescriptor(yourDescriptor);\nconsole.log(validation.errors); // Check for errors\nconsole.log(validation.warnings); // Check for warnings\n\\`\\`\\`\n\n`;\n }\n\n /**\n * Generate troubleshooting section\n */\n private static generateTroubleshootingSection(): string {\n return `## Troubleshooting\n\n### Common Issues\n\n**Plugin not appearing in extension point**\n- Check plugin descriptor syntax\n- Verify contribution key matches extension point requirements\n- Ensure experienceId references exist in experiences section\n\n**Component fails to load**\n- Verify component path in experience location\n- Check module federation configuration\n- Use Plugin Explorer to see detailed error messages\n\n**Type errors with simplified extension points**\n- Ensure extension point is properly imported\n- Check that component props match expected interface\n- Verify extension point is registered before use\n\n### Debugging Tools\n\n**Plugin Explorer**\n- Press Ctrl+Shift+P in development mode\n- View all extension points and their plugins\n- See plugin health status and capabilities\n- Test component rendering with error boundaries\n\n**Validation Service**\n- Use \\`PluginDiscoveryService.validatePluginDescriptor()\\`\n- Check \\`PluginDiscoveryService.checkPluginCompatibility()\\`\n- Run \\`PluginDiscoveryService.analyzePluginDescriptor()\\` for full analysis\n\n**Browser DevTools**\n- Check \\`window.KosPlugins.extensions\\` for runtime state\n- Look for module federation errors in Network tab\n- Use React DevTools to inspect component loading\n\n---\n\n*Generated by KOS Plugin Documentation Generator*\n`;\n }\n\n // Helper methods\n private static getExtensionPointImportName(id: string): string {\n // Check if there's an explicit export name in metadata\n const registry = getExtensionPointRegistry();\n const point = registry.getExtensionPoint(id);\n\n if (point?.config.metadata?.exportName) {\n return point.config.metadata.exportName;\n }\n\n // Fallback: Convert ID to PascalCase and handle hyphens properly\n const parts = id.split(\".\");\n\n // Skip the namespace part (usually first part like \"ddk\")\n // Focus on the meaningful parts (e.g., \"dashboard.pump-detail\")\n const meaningfulParts = parts.length > 1 ? parts.slice(1) : parts;\n\n return (\n meaningfulParts\n .map((part) =>\n // Handle hyphenated parts (e.g., \"pump-detail\" -> \"PumpDetail\")\n part\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\"\")\n )\n .join(\"\") + \"Extension\"\n );\n }\n\n private static getExtensionPointTypeName(id: string): string {\n return this.getExtensionPointImportName(id) + \"Type\";\n }\n\n private static getHealthEmoji(status: string): string {\n switch (status) {\n case \"healthy\":\n return \"✅\";\n case \"warning\":\n return \"⚠️\";\n case \"error\":\n return \"❌\";\n default:\n return \"❓\";\n }\n }\n\n private static inferContributionKey(\n extensionPoint: ExtensionPointInfo\n ): string {\n // Try to get from simplified extension point registry\n if (extensionPoint.source === \"simplified\") {\n const registry = getExtensionPointRegistry();\n const point = registry.getExtensionPoint(extensionPoint.id);\n if (point?.config.contributionKey) {\n return point.config.contributionKey;\n }\n }\n\n // Fallback to ID-based inference\n const parts = extensionPoint.id.split(\".\");\n const lastPart = parts[parts.length - 1];\n\n // Common mappings\n const mappings: Record<string, string> = {\n cui: \"cui\",\n utility: \"utilities\",\n utilities: \"utilities\",\n setup: \"setupStep\",\n settings: \"settings\",\n nav: \"navViews\",\n troubleAction: \"troubleActions\",\n controlPour: \"controlPour\",\n };\n\n return mappings[lastPart] || lastPart + \"s\";\n }\n\n private static isViewBasedExtensionPoint(\n extensionPoint: ExtensionPointInfo\n ): boolean {\n if (extensionPoint.source === \"simplified\") {\n const registry = getExtensionPointRegistry();\n const point = registry.getExtensionPoint(extensionPoint.id);\n return point?.config.hasView || false;\n }\n\n // Heuristic for legacy extension points\n return extensionPoint.plugins.some(\n (plugin) => (plugin as any).experienceId\n );\n }\n\n private static isRankableExtensionPoint(\n extensionPoint: ExtensionPointInfo\n ): boolean {\n if (extensionPoint.source === \"simplified\") {\n const registry = getExtensionPointRegistry();\n const point = registry.getExtensionPoint(extensionPoint.id);\n return point?.config.isRankable || false;\n }\n\n // Heuristic for legacy extension points\n return extensionPoint.plugins.some(\n (plugin) => typeof (plugin as any).rank === \"number\"\n );\n }\n\n /**\n * Get schema fields for contribution structure generation\n */\n private static getSchemaFieldsForContribution(\n extensionPoint: ExtensionPointInfo\n ): SchemaFieldInfo[] {\n // Only get schema for simplified extension points\n if (extensionPoint.source !== \"simplified\") {\n return [];\n }\n\n const registry = getExtensionPointRegistry();\n const point = registry.getExtensionPoint(extensionPoint.id);\n\n if (!point?.getSchemaFieldInfo) {\n return [];\n }\n\n return point.getSchemaFieldInfo();\n }\n\n private static getSpecificFields(\n extensionPoint: ExtensionPointInfo\n ): string[] {\n const fields: string[] = [];\n const contributionKey = this.inferContributionKey(extensionPoint);\n\n // Add specific fields based on contribution type\n switch (contributionKey) {\n case \"utilities\":\n fields.push('\"utilDescriptor\": \"your-util-descriptor\"');\n break;\n case \"setupStep\":\n fields.push('\"setupDescriptor\": \"your-setup-descriptor\"');\n break;\n case \"settings\":\n fields.push('\"settingsGroup\": \"your-settings-group\"');\n break;\n case \"navViews\":\n fields.push('\"navDescriptor\": \"your-nav-descriptor\"');\n break;\n case \"troubleActions\":\n fields.push('\"troubleType\": \"your-trouble-type\"');\n break;\n case \"cui\":\n fields.push('\"cuiDescriptor\": \"your-cui-descriptor\"');\n break;\n }\n\n return fields;\n }\n}\n"],"names":["dynamicFederation","remoteUrlDefinitions","resolveRemoteUrl","remoteModuleMap","remoteContainerMap","initialSharingScopeCreated","setRemoteUrlResolver","_resolveRemoteUrl","setRemoteDefinitions","definitions","loadRemoteModule","remoteName","moduleName","remoteModuleKey","Module","loadRemoteContainer","fetchRemoteModule","url","resolve","reject","script","request","arg","e","remoteUrl","containerUrl","container","exports","dynamic_federation_1","require$$0","extractSchemaFieldInfo","schema","objectSchema","fields","fieldName","fieldSchema","zodField","fieldInfo","typeName","_a","error","ValidationContextImpl","__publicField","message","issue","ValidationResultsCache","pluginId","results","validationCache","getValidationResults","extensionPointRegistry","registerExtensionReducer","reducer","applyExtensionReducers","base","contributions","experiences","acc","SimplifiedExtensionPointRegistry","config","definition","extensions","contributionData","key","rawData","context","validationContext","issues","i","processedData","extension","experienceId","view","_b","id","registry","getExtensionPointRegistry","createViewAwareTransform","options","experienceIdProperty","flattenComponentProperties","customTransform","data","result","defineExtensionPoint","SPECIAL_VARIABLES","parseJsonExtensionPoint","jsonDef","generateExportName","createZodSchemaFromJson","createValidationFunction","createTransformFunction","part","jsonSchema","z","shape","propSchema","createZodPropertyFromJson","validationRules","createModuleValidationFunction","dataRecord","rule","validateRule","validateRequiredRule","validateRangeRule","validatePatternRule","validateDependencyRule","validateCustomRule","value","evaluateSimpleExpression","modulePath","_data","transformOps","createModuleTransformFunction","_context","resolveSpecialVariable","field","oldName","newName","operation","applyStringOperation","resolver","toCamelCase","toKebabCase","str","_","char","expression","evalExpression","quotedValue","left","right","s","contributionReducer","remotes","remote","sectionId","experience","extensionPoint","contributionKey","contribution","contribId","initPluginManager","remotesOverride","extensionPoints","extensionPointId","loadExtensions","DEFAULT_CONTRIBUTIONS","getContributions","jsonExtensionPoints","ext","epDef","InitPlugin","initPlugin","reducedExtensions","getExtensions","getQueryParams","query","pair","val","getDefaultHost","defaultHost","params","initializeKosPlugins","props","pluginBaseUrl","pluginApiPath","overrides","pluginContext","useUiPlugins","pluginData","allRemotes","item","baseUrl","resolveBestExtension","module","exact","a","b","aRank","bRank","aId","bId","BaseViewExtensionSchema","RankableViewExtensionSchema","validateWithSchema","validateDescriptorFormat","descriptorField","descriptorValue","validateRank","rank","maxReasonableRank","createExtensionSchema","additionalFields","validateRankIfPresent","PluginDiscoveryService","includeLegacyExtensions","includeEmptyExtensionPoints","simplifiedExtensionPoints","point","plugins","extensionId","extensionPlugins","searchTerm","term","_d","_c","_f","_e","tag","totalExtensionPoints","extensionPointsWithPlugins","totalPlugins","sum","legacyExtensionPoints","deprecatedExtensionPoints","plugin","hasComponent","hasRank","capabilities","namespace","healthStatus","suggestions","parts","descriptor","errors","warnings","missingRequired","contributionKeys","contrib","index","pluginDescriptor","availableExtensionPoints","missingExtensionPoints","incompatibleTypes","availableIds","matchingPoint","validation","compatibility","recommendations","DocumentationGenerator","includeUsageExamples","includeTypeDefinitions","includePluginHealth","healthStats","content","toc","anchor","_extensionPoints","overview","section","metadata","examples","includeHealth","list","analysis","name","type","required","description","structure","schemaFields","fieldExamples","specificFields","f","word","status","lastPart"],"mappings":";;;;;;;;;;;;;;;;;;;;;AACA,OAAO,eAAeA,GAAS,cAAc,EAAE,OAAO,GAAI,CAAE;AAC5DA,EAAA,mBAA2BA,EAAA,gDAA8D;AACzF,IAAIC,GACAC;AACJ,MAAMC,IAAkB,oBAAI,IAAG,GACzBC,IAAqB,oBAAI,IAAG;AAClC,IAAIC,IAA6B;AACjC,SAASC,EAAqBC,GAAmB;AAC7C,EAAAL,IAAmBK;AACvB;AACAP,EAAA,uBAA+BM;AAC/B,SAASE,EAAqBC,GAAa;AACvC,EAAAR,IAAuBQ;AAC3B;AACAT,EAAA,uBAA+BQ;AAC/B,eAAeE,EAAiBC,GAAYC,GAAY;AACpD,QAAMC,IAAkB,GAAGF,CAAU,IAAIC,CAAU;AACnD,MAAIT,EAAgB,IAAIU,CAAe;AACnC,WAAOV,EAAgB,IAAIU,CAAe;AAM9C,QAAMC,KADU,OAHEV,EAAmB,IAAIO,CAAU,IAC7CP,EAAmB,IAAIO,CAAU,IACjC,MAAMI,EAAoBJ,CAAU,GACV,IAAIC,CAAU,GACxB;AACtB,SAAAT,EAAgB,IAAIU,GAAiBC,CAAM,GACpCA;AACX;AACAd,EAAA,mBAA2BU;AAC3B,MAAMM,IAAoB,CAACC,GAAKN,MACrB,IAAI,QAAQ,CAACO,GAASC,MAAW;AACpC,QAAMC,IAAS,SAAS,cAAc,QAAQ;AAC9C,EAAAA,EAAO,MAAMH,GACbG,EAAO,OAAO,mBACdA,EAAO,QAAQ,IACfA,EAAO,SAAS,MAAM;AAalB,IAAAF,EAZc;AAAA,MACV,KAAK,CAACG,MAAY,OAAOV,CAAU,EAAE,IAAIU,CAAO;AAAA,MAChD,MAAM,CAACC,MAAQ;AACX,YAAI;AACA,iBAAOX,CAAU,EAAE,KAAKW,CAAG;AAAA,QACnD,SAC2BC,GAAG;AACN,kBAAQ,MAAM,+BAA+BZ,CAAU,IAAIY,CAAC,GAC5DJ,EAAOI,CAAC;AAAA,QAChC;AAAA,MACA;AAAA,IACA,CACyB;AAAA,EACzB,GACQH,EAAO,UAAU,MAAMD,EAAO,IAAI,MAAM,UAAUR,CAAU,YAAY,CAAC,GACzE,SAAS,KAAK,YAAYS,CAAM;AACxC,CAAK;AAEL,eAAeL,EAAoBJ,GAAY;AAC3C,MAAI,CAACT,KAAoB,CAACD;AACtB,UAAM,IAAI,MAAM,kHAAkH;AAEtI,EAAKI,MACDA,IAA6B,IAC7B,MAAM,yBAAyB,SAAS;AAE5C,QAAMmB,IAAYvB,IACZA,EAAqBU,CAAU,IAC/B,MAAMT,EAAiBS,CAAU;AACvC,MAAIc,IAAeD;AACnB,EAAI,CAACA,EAAU,SAAS,MAAM,KAAK,CAACA,EAAU,SAAS,KAAK,MACxDC,IAAe,GAAGD,CAAS,GAAGA,EAAU,SAAS,GAAG,IAAI,KAAK,GAAG;AAEpE,QAAME,IAAY,MAAMV,EAAkBS,GAAcd,CAAU;AAClE,eAAMe,EAAU,KAAK,yBAAyB,OAAO,GACrDtB,EAAmB,IAAIO,GAAYe,CAAS,GACrCA;AACX;AAAA;ACzEA,SAAO,eAAcC,GAAU,cAAc,EAAE,OAAO,IAAM,GAC5DA,EAAA,uBAA+BA,EAAA,uBAA+BA,EAAA,mBAA2B;AACzF,MAAIC,IAAuBC;AAC3B,SAAO,eAAeF,GAAS,oBAAoB,EAAE,YAAY,IAAM,KAAK,WAAY;AAAE,WAAOC,EAAqB;AAAA,EAAiB,EAAE,CAAE,GAC3I,OAAO,eAAeD,GAAS,wBAAwB,EAAE,YAAY,IAAM,KAAK,WAAY;AAAE,WAAOC,EAAqB;AAAA,EAAqB,EAAE,CAAE,GACnJ,OAAO,eAAeD,GAAS,wBAAwB,EAAE,YAAY,IAAM,KAAK,WAAY;AAAE,WAAOC,EAAqB;AAAA,EAAqB,EAAE,CAAE;;;;;ACK5I,SAASE,EAAuBC,GAAwC;;AAC7E,MAAI;AAEF,QAAI,WAAWA,GAAQ;AACrB,YAAMC,IAAeD,GACfE,IAA4B,CAAA;AAElC,iBAAW,CAACC,GAAWC,CAAW,KAAK,OAAO;AAAA,QAC5CH,EAAa;AAAA,MAAA,GACZ;AACD,cAAMI,IAAWD,GACXE,IAA6B;AAAA,UACjC,MAAMH;AAAA,UACN,UAAU,CAACE,EAAS,WAAA;AAAA,QAAW;AASjC,YALIA,EAAS,QAAQA,EAAS,KAAK,gBACjCC,EAAU,cAAcD,EAAS,KAAK,cAIpCA,EAAS,MAAM;AAEjB,cAAIE,IAAWF,EAAS,KAAK,YAAY;AACzC,UAAIE,MAAa,iBAAiBF,EAAS,KAAK,cAC9CE,MAAWC,IAAAH,EAAS,KAAK,UAAU,SAAxB,gBAAAG,EAA8B,aAAY,YAGvDF,EAAU,OAAOC,EAAS,QAAQ,OAAO,EAAE,EAAE,YAAA;AAAA,QAC/C;AAEA,QAAAL,EAAO,KAAKI,CAAS;AAAA,MACvB;AAEA,aAAOJ;AAAA,IACT;AAGA,WAAO,CAAA;AAAA,EACT,SAASO,GAAO;AACd,mBAAQ,KAAK,wCAAwCA,CAAK,GACnD,CAAA;AAAA,EACT;AACF;AC9CO,MAAMC,EAAmD;AAAA,EAAzD;AACG,IAAAC,EAAA,gBACN,CAAA;AAAA;AAAA,EAEF,SAASC,GAAuB;AAC9B,SAAK,OAAO,KAAK,EAAE,MAAM,SAAS,SAAAA,GAAS;AAAA,EAC7C;AAAA,EAEA,WAAWA,GAAuB;AAChC,SAAK,OAAO,KAAK,EAAE,MAAM,WAAW,SAAAA,GAAS;AAAA,EAC/C;AAAA,EAEA,QAAQA,GAAuB;AAC7B,SAAK,OAAO,KAAK,EAAE,MAAM,QAAQ,SAAAA,GAAS;AAAA,EAC5C;AAAA,EAEA,YAAqB;AACnB,WAAO,KAAK,OAAO,KAAK,CAACC,MAAUA,EAAM,SAAS,OAAO;AAAA,EAC3D;AAAA,EAEA,YAAqB;AACnB,WAAO,KAAK,OAAO,SAAS;AAAA,EAC9B;AAAA,EAEA,YAAuE;AACrE,WAAO,CAAC,GAAG,KAAK,MAAM;AAAA,EACxB;AACF;AAMO,MAAMC,EAAuB;AAAA,EAA7B;AACG,IAAAH,EAAA,mCAGA,IAAA;AAAA;AAAA,EAER,IACEI,GACAC,GACA;AACA,SAAK,MAAM,IAAID,GAAUC,CAAO;AAAA,EAClC;AAAA,EAEA,IACED,GAC2D;AAC3D,WAAO,KAAK,MAAM,IAAIA,CAAQ,KAAK,CAAA;AAAA,EACrC;AAAA,EAEA,QAAQ;AACN,SAAK,MAAM,MAAA;AAAA,EACb;AACF;AAGO,MAAME,IAAkB,IAAIH,EAAA;AAM5B,SAASI,GACdH,GAC2D;AAC3D,SAAOE,EAAgB,IAAIF,CAAQ;AACrC;AChEA,MAAMI,IAA6C,CAAA;AAE5C,SAASC,EAAyBC,GAA2B;AAClE,EAAAF,EAAuB,KAAKE,CAAO;AACrC;AAEO,SAASC,EACdC,GACAC,GACAC,GACsB;AACtB,SAAON,EAAuB;AAAA,IAC5B,CAACO,GAAKL,MAAYA,EAAQK,GAAKF,GAAeC,CAAW;AAAA,IACzDF;AAAA,EAAA;AAEJ;ACHO,MAAMI,EAAiC;AAAA,EAAvC;AACG,IAAAhB,EAAA,6CAA6D,IAAA;AAAA;AAAA,EAErE,OACEiB,GACqD;AAErD,QAAI,KAAK,gBAAgB,IAAIA,EAAO,EAAE;AACpC,qBAAQ,KAAK,mBAAmBA,EAAO,EAAE,qBAAqB,GACvD,KAAK,gBAAgB,IAAIA,EAAO,EAAE;AAQ3C,UAAMC,IAAkE;AAAA,MACtE,QAAAD;AAAA,MACA,IAAIA,EAAO;AAAA,MACX,cAAc;AAAA,MACd,eAAe,CAACE,MACbA,EAAWF,EAAO,EAAE,KAAK,CAAA;AAAA,MAI5B,UAAU,MAAM;AACd,YAAIC,EAAW,cAAc;AAC3B,kBAAQ,KAAK,mBAAmBD,EAAO,EAAE,wBAAwB;AACjE;AAAA,QACF;AAGA,cAAMP,IAAU,KAAK,cAAcO,CAAM;AACzC,QAAAR,EAAyBC,CAAO,GAEhCQ,EAAW,eAAe;AAAA,MAC5B;AAAA,IAAA;AAIF,WAAID,EAAO,WACTC,EAAW,qBAAqB,MAC9B9B,EAAuB6B,EAAO,MAAO,IAMzC,KAAK,gBAAgB,IAAIA,EAAO,IAAIC,CAAU,GAEvCA;AAAA,EACT;AAAA,EAEQ,cACND,GACA;AACA,WAAO,CACLE,GACAN,GACAC,MACyB;AAEzB,YAAMM,IAAoBP,EAAsBI,EAAO,eAAe;AACtE,aAAI,CAACG,KAAoB,OAAOA,KAAqB,YAKrD,OAAO,QAAQA,CAAgB,EAAE;AAAA,QAC/B,CAAC,CAACC,GAAKC,CAAO,MAAqB;;AAEjC,cAAI,CAACA;AAAS;AAGd,gBAAMC,IAA4B;AAAA,YAChC,QAAQD,EAAQ,UAAU;AAAA,YAC1B,WAAWA,EAAQ,aAAaD;AAAA,YAChC,aAAAP;AAAA,YACA,eAAAD;AAAA,UAAA;AAIF,cAAII,EAAO,UAAU;AACnB,kBAAMO,IAAoB,IAAIzB,EAAA;AAO9B,gBANyBkB,EAAO;AAAA,cAC9BK;AAAA,cACAE;AAAA,YAAA,MAIuB,QAAQ;AAC/B,cAAAlB,EAAgB,IAAIe,GAAK;AAAA,gBACvB;AAAA,kBACE,MAAM;AAAA,kBACN,SAAS;AAAA,gBAAA;AAAA,cACX,CACD;AACD;AAAA,YACF;AAGA,gBAAIG,EAAkB,aAAa;AACjC,oBAAMC,IAASD,EAAkB,UAAA,EAAY,IAAI,CAACtB,OACzC;AAAA,gBACL,GAAGA;AAAA,gBACH,SAAS,+BAA+BA,EAAM,OAAO;AAAA,cAAA,EAExD;AAID,kBAFAI,EAAgB,IAAIe,GAAKI,CAAM,GAE3BD,EAAkB,aAAa;AACjC,wBAAQ;AAAA,kBACN,yBAAyBP,EAAO,EAAE,kBAAkBI,CAAG;AAAA,kBACvDI,EACG,OAAO,CAACC,MAAMA,EAAE,SAAS,OAAO,EAChC,IAAI,CAACA,MAAMA,EAAE,OAAO,EACpB,KAAK,IAAI;AAAA,gBAAA;AAEd;AAAA,cACF;AAAA,YACF;AAEE,cAAApB,EAAgB,IAAIe,GAAK,EAAE;AAAA,UAE/B;AAGA,gBAAMM,IAAgBV,EAAO,YACzBA,EAAO,UAAUK,GAASC,CAAO,IACjCD;AAGJ,UAAKH,EAAWF,EAAO,EAAE,MACvBE,EAAWF,EAAO,EAAE,IAAI,CAAA;AAI1B,gBAAMW,IAAiC;AAAA,YACrC,IAAIP;AAAA,YACJ,MAAMJ,EAAO;AAAA,YACb,MAAMU;AAAA,YACN,QAAQJ,EAAQ;AAAA,YAChB,WAAWA,EAAQ;AAAA,UAAA;AA0BrB,cAtBIN,EAAO,cAAc,OAAOK,EAAQ,QAAS,aAC/CM,EAAU,OAAON,EAAQ,OAIvBK,KAAiB,OAAOA,KAAkB,aAExC,eAAeA,MAChBC,EAAkB,YAAYD,EAAc,YAE3C,UAAUA,MACXC,EAAkB,OAAOD,EAAc,OAEtC,cAAcA,MACfC,EAAkB,WAAWD,EAAc,YAKhDR,EAAWF,EAAO,EAAE,EAAEI,CAAG,IAAIO,GAGzBX,EAAO,aAAWpB,IAAAoB,EAAO,kBAAP,QAAApB,EAAsB,OAAM;AAChD,kBAAMgC,IAAeP,EAAQ,cACvBQ,IAAOhB,KAAA,gBAAAA,EAAce;AAE3B,YAAIC,MAEGX,EAAWF,EAAO,cAAc,IAAI,MACvCE,EAAWF,EAAO,cAAc,IAAI,IAAI,CAAA,IAI1CE,EAAWF,EAAO,cAAc,IAAI,EAAEI,CAAG,IAAI;AAAA,cAC3C,IAAIA;AAAA,cACJ,MAAM,GAAGJ,EAAO,eAAe;AAAA,cAC/B,MAAMa;AAAA,cACN,QAAQP,EAAQ;AAAA,cAChB,WAAWA,EAAQ;AAAA,YAAA;AAAA,UAGzB;AAGA,WAAIQ,IAAAd,EAAO,kBAAP,QAAAc,EAAsB,eAEnBZ,EAAWF,EAAO,cAAc,UAAU,MAC7CE,EAAWF,EAAO,cAAc,UAAU,IAAI,CAAA,IAIhDE,EAAWF,EAAO,cAAc,UAAU,EAAEI,CAAG,IAAI;AAAA,YACjD,IAAIA;AAAA,YACJ,MAAM,GAAGJ,EAAO,eAAe;AAAA,YAC/B,MAAMU;AAAA,YACN,QAAQJ,EAAQ;AAAA,YAChB,WAAWA,EAAQ;AAAA,UAAA;AAAA,QAGzB;AAAA,MAAA,GAGKJ;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAoD;AAClD,WAAO,MAAM,KAAK,KAAK,gBAAgB,OAAA,CAAQ,EAAE;AAAA,MAC/C,CAACD,MAAeA,EAAW;AAAA,IAAA;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA,EAKA,+BAA2D;AACzD,WAAO,MAAM,KAAK,KAAK,gBAAgB,QAAQ;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkBc,GAAkD;AAClE,WAAO,KAAK,gBAAgB,IAAIA,CAAE;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkBA,GAAqB;AACrC,WAAO,KAAK,gBAAgB,IAAIA,CAAE;AAAA,EACpC;AACF;AAGO,MAAMC,IAAW,IAAIjB,EAAA;AAMrB,SAASkB,IAA8D;AAC5E,SAAOD;AACT;AC7QO,SAASE,EACdC,IAiBI,IACJ;AACA,QAAM;AAAA,IACJ,sBAAAC,IAAuB;AAAA,IACvB,4BAAAC,IAA6B;AAAA,IAC7B,iBAAAC;AAAA,EAAA,IACEH;AAEJ,SAAO,CAACI,GAAajB,MAA8B;;AAEjD,UAAMM,IAAeW,EAAKH,CAAoB,GACxCP,IAAOD,MAAehC,IAAA0B,EAAQ,gBAAR,gBAAA1B,EAAsBgC,OAAiB,CAAA,IAAK,CAAA;AAGxE,QAAIY,IAAc;AAAA,MAChB,GAAGD;AAAA,MACH,MAAAV;AAAA,IAAA;AAIF,WAAIQ,KAA8BR,MAC5BA,EAAK,cACPW,EAAO,YAAYX,EAAK,YAEtBA,EAAK,aACPW,EAAO,WAAWX,EAAK,YAKvBS,MACFE,IAASF,EAAgBC,GAAMV,GAAMP,CAAO,KAAKkB,IAG5CA;AAAA,EACT;AACF;ACqCO,SAASC,EAKdzB,GACqD;AACrD,SAAOgB,EAAS,OAAOhB,CAAM;AAC/B;AC9BA,MAAM0B,IAAmD;AAAA,EACvD,YAAY,MAAM,KAAK,IAAA;AAAA,EACvB,OAAO,OAAM,oBAAI,KAAA,GAAO,YAAA;AAAA,EACxB,iBAAiB,MAAM,QAAQ,IAAI,uBAAuB;AAAA,EAC1D,MAAM,MAAM,QAAQ,IAAI,YAAY;AACtC;AAKO,SAASC,EACdC,GACyC;AACzC,QAAM5B,IAAkD;AAAA,IACtD,IAAI4B,EAAQ;AAAA,IACZ,aAAaA,EAAQ;AAAA,IACrB,aAAaA,EAAQ;AAAA,IACrB,iBAAiBA,EAAQ;AAAA,IACzB,SAASA,EAAQ;AAAA,IACjB,YAAYA,EAAQ;AAAA,IACpB,eAAeA,EAAQ;AAAA,IACvB,UAAUA,EAAQ,WACd;AAAA,MACE,GAAGA,EAAQ;AAAA,MACX,YACEA,EAAQ,SAAS,cAAcC,GAAmBD,EAAQ,EAAE;AAAA,IAAA,IAEhE;AAAA,EAAA;AAIN,SAAIA,EAAQ,WACV5B,EAAO,SAAS8B,GAAwBF,EAAQ,QAAQ;AAAA,IACtD,SAASA,EAAQ;AAAA,IACjB,YAAYA,EAAQ;AAAA,EAAA,CACrB,IAICA,EAAQ,eACV5B,EAAO,WAAW+B,GAAyBH,EAAQ,UAAU,IAI3DA,EAAQ,YACV5B,EAAO,YAAYgC,GAAwBJ,EAAQ,SAAS,IACnDA,EAAQ,YAEjB5B,EAAO,YAAYkB,EAAA,IAGdlB;AACT;AAKA,SAAS6B,GAAmBd,GAAoB;AAG9C,SACEA,EACG,MAAM,GAAG,EACT,IAAI,CAACkB,MAASA,EAAK,OAAO,CAAC,EAAE,YAAA,IAAgBA,EAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,EAAE,IAAI;AAElB;AAKA,SAASH,GACPI,GACAf,GACK;AAGL,MAAI;AAEF,UAAM,EAAE,GAAAgB,EAAA,IAAM,QAAQ,KAAK;AAG3B,QAAID,EAAW,YAAY;AACzB,YAAME,IAA6B,CAAA;AAGnC,MAAAA,EAAM,KAAKD,EAAE,OAAA,EAAS,IAAI,CAAC,GAC3BC,EAAM,QAAQD,EAAE,OAAA,EAAS,IAAI,CAAC,GAC9BC,EAAM,YAAYD,EAAE,OAAA,EAAS,IAAI,CAAC,GAG9BhB,KAAA,QAAAA,EAAS,YACXiB,EAAM,eAAeD,EAAE,OAAA,EAAS,IAAI,CAAC,IAInChB,KAAA,QAAAA,EAAS,eACXiB,EAAM,OAAOD,EAAE,SAAS,IAAI,CAAC,EAAE,IAAI,GAAI,EAAE,SAAA;AAI3C,iBAAW,CAAC/B,GAAKiC,CAAU,KAAK,OAAO,QAAQH,EAAW,UAAU;AAClE,QAAAE,EAAMhC,CAAG,IAAIkC,GAA0BD,GAAYF,CAAC;AAGtD,UAAI/D,IAAS+D,EAAE,OAAOC,CAAK;AAE3B,aAAKF,EAAW,yBACd9D,IAASA,EAAO,OAAA,IAGXA;AAAA,IACT;AAEA,WAAO+D,EAAE,IAAA;AAAA,EACX,SAAStD,GAAO;AACd,YAAQ,KAAK,iDAAiDA,CAAK;AACnE;AAAA,EACF;AACF;AAKA,SAASyD,GAA0BD,GAAiBF,GAAa;AAE/D,MAAI/D;AAEJ,UAAQiE,EAAW,MAAA;AAAA,IACjB,KAAK;AACH,MAAAjE,IAAS+D,EAAE,OAAA,GACPE,EAAW,cAAWjE,IAASA,EAAO,IAAIiE,EAAW,SAAS,IAC9DA,EAAW,cAAWjE,IAASA,EAAO,IAAIiE,EAAW,SAAS,IAC9DA,EAAW,YACbjE,IAASA,EAAO,MAAM,IAAI,OAAOiE,EAAW,OAAO,CAAC,IAClDA,EAAW,SAAMjE,IAAS+D,EAAE,KAAKE,EAAW,IAAI;AACpD;AAAA,IAEF,KAAK;AACH,MAAAjE,IAAS+D,EAAE,OAAA,GACPE,EAAW,YAAY,WACzBjE,IAASA,EAAO,IAAIiE,EAAW,OAAO,IACpCA,EAAW,YAAY,WACzBjE,IAASA,EAAO,IAAIiE,EAAW,OAAO;AACxC;AAAA,IAEF,KAAK;AACH,MAAAjE,IAAS+D,EAAE,QAAA;AACX;AAAA,IAEF,KAAK;AACH,MAAA/D,IAAS+D,EAAE,MAAMA,EAAE,IAAA,CAAK;AACxB;AAAA,IAEF,KAAK;AACH,MAAA/D,IAAS+D,EAAE,OAAO,EAAE;AACpB;AAAA,IAEF;AACE,MAAA/D,IAAS+D,EAAE,IAAA;AAAA,EAAI;AAGnB,SAAIE,EAAW,gBACbjE,IAASA,EAAO,SAASiE,EAAW,WAAW,IAG7CA,EAAW,YAAY,WACzBjE,IAASA,EAAO,QAAQiE,EAAW,OAAO,IAGrCjE;AACT;AAKA,SAAS2D,GACPQ,GAC0D;AAE1D,SAAIA,EAAgB,SACXC,GAA+BD,EAAgB,MAAM,IAIvD,CAAChB,GAAejB,MAA+B;AACpD,QAAI,CAACiC,EAAgB;AAAO;AAE5B,UAAME,IAAalB;AACnB,eAAWmB,KAAQH,EAAgB;AACjC,MAAAI,GAAaD,GAAMD,GAAYnC,CAAO;AAAA,EAE1C;AACF;AAKA,SAASqC,GACPD,GACAnB,GACAjB,GACM;AACN,UAAQoC,EAAK,MAAA;AAAA,IACX,KAAK;AACH,MAAAE,GAAqBF,GAAMnB,GAAMjB,CAAO;AACxC;AAAA,IACF,KAAK;AACH,MAAAuC,GAAkBH,GAAMnB,GAAMjB,CAAO;AACrC;AAAA,IACF,KAAK;AACH,MAAAwC,GAAoBJ,GAAMnB,GAAMjB,CAAO;AACvC;AAAA,IACF,KAAK;AACH,MAAAyC,GAAuBL,GAAMnB,GAAMjB,CAAO;AAC1C;AAAA,IACF,KAAK;AACH,MAAA0C,GAAmBN,GAAMnB,GAAMjB,CAAO;AACtC;AAAA,EAAA;AAEN;AAEA,SAASsC,GACPF,GACAnB,GACAjB,GACM;AACN,EAAIoC,EAAK,SAAS,CAACnB,EAAKmB,EAAK,KAAK,KAChCpC,EAAQ,SAASoC,EAAK,WAAW,UAAUA,EAAK,KAAK,eAAe;AAExE;AAEA,SAASG,GACPH,GACAnB,GACAjB,GACM;AACN,MAAIoC,EAAK,SAAS,OAAOnB,EAAKmB,EAAK,KAAK,KAAM,UAAU;AACtD,UAAMO,IAAQ1B,EAAKmB,EAAK,KAAK;AAC7B,IAAIA,EAAK,QAAQ,UAAaO,IAAQP,EAAK,OACzCpC,EAAQ;AAAA,MACNoC,EAAK,WAAW,UAAUA,EAAK,KAAK,sBAAsBA,EAAK,GAAG;AAAA,IAAA,GAGlEA,EAAK,QAAQ,UAAaO,IAAQP,EAAK,OACzCpC,EAAQ;AAAA,MACNoC,EAAK,WAAW,UAAUA,EAAK,KAAK,qBAAqBA,EAAK,GAAG;AAAA,IAAA;AAAA,EAGvE;AACF;AAEA,SAASI,GACPJ,GACAnB,GACAjB,GACM;AACN,EAAIoC,EAAK,SAASA,EAAK,WAAW,OAAOnB,EAAKmB,EAAK,KAAK,KAAM,aAC9C,IAAI,OAAOA,EAAK,OAAO,EAC1B,KAAKnB,EAAKmB,EAAK,KAAK,CAAW,KACxCpC,EAAQ;AAAA,IACNoC,EAAK,WACH,UAAUA,EAAK,KAAK,4BAA4BA,EAAK,OAAO;AAAA,EAAA;AAItE;AAEA,SAASK,GACPL,GACAnB,GACAjB,GACM;AACN,MAAIoC,EAAK,SAASA,EAAK,aAAaA,EAAK;AACvC,QAAI;AAEF,MADeQ,EAAyBR,EAAK,YAAYnB,CAAI,KAE3DjB,EAAQ;AAAA,QACNoC,EAAK,WAAW,UAAUA,EAAK,KAAK;AAAA,MAAA;AAAA,IAG1C,SAAS7D,GAAO;AACd,MAAAyB,EAAQ,WAAW,6CAA6CzB,CAAK,EAAE;AAAA,IACzE;AAEJ;AAEA,SAASmE,GACPN,GACAnB,GACAjB,GACM;AACN,MAAIoC,EAAK;AACP,QAAI;AAEF,MADeQ,EAAyBR,EAAK,YAAYnB,CAAI,KAE3DjB,EAAQ,SAASoC,EAAK,WAAW,0BAA0B;AAAA,IAE/D,SAAS7D,GAAO;AACd,MAAAyB,EAAQ,WAAW,yCAAyCzB,CAAK,EAAE;AAAA,IACrE;AAEJ;AAKA,SAAS2D,GACPW,GAC8D;AAC9D,SAAO,CAACC,GAAgB9C,MAA+B;AAGrD,YAAQ,KAAK,+CAA+C6C,CAAU,EAAE,GACxE7C,EAAQ;AAAA,MACN,iDAAiD6C,CAAU;AAAA,IAAA;AAAA,EAE/D;AACF;AAKA,SAASnB,GACPqB,GACwD;AAExD,SAAIA,EAAa,SACRC,GAA8BD,EAAa,MAAM,IAGnD,CAAC9B,GAAagC,MAA2C;AAC9D,UAAM/B,IAAkC,EAAE,GAAGD,EAAA;AAM7C,QAAI8B,EAAa;AACf,iBAAW,CAACjD,GAAK6C,CAAK,KAAK,OAAO,QAAQI,EAAa,SAAS;AAC9D,QAAA7B,EAAOpB,CAAG,IAAIoD,GAAuBP,CAAK;AAK9C,QAAII,EAAa;AACf,iBAAWI,KAASJ,EAAa;AAC/B,eAAO7B,EAAOiC,CAAK;AAKvB,QAAIJ,EAAa;AACf,iBAAW,CAACK,GAASC,CAAO,KAAK,OAAO;AAAA,QACtCN,EAAa;AAAA,MAAA;AAEb,QAAIK,KAAWlC,MACbA,EAAOmC,CAAO,IAAInC,EAAOkC,CAAO,GAChC,OAAOlC,EAAOkC,CAAO;AAM3B,QAAIL,EAAa;AACf,iBAAW,EAAE,OAAAI,GAAO,WAAAG,EAAA,KAAeP,EAAa;AAC9C,QAAII,KAASjC,KAAU,OAAOA,EAAOiC,CAAK,KAAM,aAC9CjC,EAAOiC,CAAK,IAAII;AAAA,UACdrC,EAAOiC,CAAK;AAAA,UACZG;AAAA,QAAA;AAMR,WAAOpC;AAAA,EACT;AACF;AAKA,SAAS8B,GACPH,GACwD;AACxD,SAAO,CAAC5B,GAAagC,OAGnB,QAAQ,KAAK,8CAA8CJ,CAAU,EAAE,GAChE5B;AAEX;AAKA,SAASiC,GAAuBP,GAAyB;AACvD,MAAI,OAAOA,KAAU,YAAYA,EAAM,WAAW,GAAG,GAAG;AACtD,UAAMa,IAAWpC,EAAkBuB,CAAK;AACxC,QAAIa;AACF,aAAOA,EAAA;AAAA,EAEX;AACA,SAAOb;AACT;AAKA,SAASY,GAAqBZ,GAAeW,GAA2B;AACtE,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAOX,EAAM,KAAA;AAAA,IACf,KAAK;AACH,aAAOA,EAAM,YAAA;AAAA,IACf,KAAK;AACH,aAAOA,EAAM,YAAA;AAAA,IACf,KAAK;AACH,aAAOc,GAAYd,CAAK;AAAA,IAC1B,KAAK;AACH,aAAOe,GAAYf,CAAK;AAAA,IAC1B;AACE,aAAOA;AAAA,EAAA;AAEb;AAKA,SAASc,GAAYE,GAAqB;AACxC,SAAOA,EACJ,QAAQ,gBAAgB,CAACC,GAAGC,MAAUA,IAAOA,EAAK,YAAA,IAAgB,EAAG,EACrE,QAAQ,MAAM,CAACA,MAASA,EAAK,aAAa;AAC/C;AAKA,SAASH,GAAYC,GAAqB;AACxC,SAAOA,EACJ,QAAQ,mBAAmB,OAAO,EAClC,QAAQ,WAAW,GAAG,EACtB,YAAA;AACL;AAMA,SAASf,EACPkB,GACA7C,GACS;AACT,MAAI;AAKF,QAAI8C,IAAiBD;AACrB,eAAW,CAAChE,GAAK6C,CAAK,KAAK,OAAO,QAAQ1B,CAAI,GAAG;AAC/C,YAAM+C,IACJ,OAAOrB,KAAU,WAAW,IAAIA,CAAK,MAAM,OAAOA,CAAK;AACzD,MAAAoB,IAAiBA,EAAe;AAAA,QAC9B,IAAI,OAAO,MAAMjE,CAAG,OAAO,GAAG;AAAA,QAC9BkE;AAAA,MAAA;AAAA,IAEJ;AAIA,QAAID,EAAe,SAAS,KAAK,GAAG;AAClC,YAAM,CAACE,GAAMC,CAAK,IAAIH,EAAe,MAAM,KAAK,EAAE,IAAI,CAACI,MAAMA,EAAE,MAAM;AACrE,aAAOF,MAASC;AAAA,IAClB;AACA,QAAIH,EAAe,SAAS,KAAK,GAAG;AAClC,YAAM,CAACE,GAAMC,CAAK,IAAIH,EAAe,MAAM,KAAK,EAAE,IAAI,CAACI,MAAMA,EAAE,MAAM;AACrE,aAAOF,MAASC;AAAA,IAClB;AACA,WAAIH,EAAe,SAAS,IAAI,IAChBA,EAAe,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAC/C,KAAK,CAACpC,MAASiB,EAAyBjB,GAAMV,CAAI,CAAC,IAE9D8C,EAAe,SAAS,IAAI,IAChBA,EAAe,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAC/C,MAAM,CAACpC,MAASiB,EAAyBjB,GAAMV,CAAI,CAAC,IAG5D;AAAA,EACT,SAAS1C,GAAO;AACd,mBAAQ,MAAM,iCAAiCA,CAAK,GAC7C;AAAA,EACT;AACF;ACvjBO,MAAM6F,KACX,CAACC,MAA4B,CAAC7E,GAA6BM,MAAgB;;AACzE,QAAMwE,IAASD,EAAQvE,CAAG,EAAE,QACtByE,IAAYzE,GAEZP,KAAcjB,IAAA+F,EAAQvE,CAAG,EAAE,gBAAb,gBAAAxB,EAA0B;AAC9C,gBAAO,KAAKiB,CAAW,EAAE,QAAQ,CAACO,MAAQ;AACxC,UAAM0E,IAAajF,EAAYO,CAAG;AAClC,IAAAN,EAAI,YAAYM,CAAG,IAAI;AAAA,MACrB,GAAG0E;AAAA,MACH,QAAAF;AAAA,MACA,WAAAC;AAAA,IAAA;AAAA,EAEJ,CAAC,GAGgB5D,EAAA,EACgB,sBAAA,EAEjB,QAAQ,CAAC8D,MAAmB;;AAC1C,UAAM,EAAE,iBAAAC,MAAoBD,EAAe,QAGrCnF,KAAgBhB,IAAA+F,EAAQvE,CAAG,EAAE,gBAAb,gBAAAxB,EAA2BoG;AACjD,IAAKpF,MAGAE,EAAIkF,CAAe,MACtBlF,EAAIkF,CAAe,IAAI,CAAA,IAIrB,MAAM,QAAQpF,CAAa,IAE7BA,EAAc,QAAQ,CAACqF,MAAiB;AACtC,MAAIA,KAAgBA,EAAa,OAC/BnF,EAAIkF,CAAe,EAAEC,EAAa,EAAE,IAAI;AAAA,QACtC,GAAGA;AAAA,QACH,QAAAL;AAAA,QACA,WAAAC;AAAA,MAAA;AAAA,IAGN,CAAC,IACQ,OAAOjF,KAAkB,YAElC,OAAO,QAAQA,CAAa,EAAE,QAAQ,CAAC,CAACsF,GAAWD,CAAY,MAAM;AACnE,MAAAnF,EAAIkF,CAAe,EAAEE,CAAS,IAAI;AAAA,QAChC,GAAID;AAAA,QACJ,IAAIC;AAAA,QACJ,QAAAN;AAAA,QACA,WAAAC;AAAA,MAAA;AAAA,IAEJ,CAAC;AAAA,EAEL,CAAC,GAEM/E;AACT;ACvCF,eAAsBqF,GACpBC,GACsB;AACtB,QAAMT,IAAUS,KAAmB,OAAO,WAAW;AAErD,MAAI,OAAO,WAAW,YAAY;AAChC,UAAMC,IAAkB,OAAO,WAAW;AAC1C,WAAO;AAAA,MACL,iBAAAA;AAAAA,MACA,eAAe,CAACC,MACdD,EAAgBC,CAAgB,KAAK,CAAA;AAAA,MACvC,SAAAX;AAAA,MACA,YAAY,OAAO,WAAW;AAAA,IAAA;AAAA,EAElC;AAEA,QAAMzE,IACJ,OAAO,WAAW,gBAAiB,MAAMqF,GAAeZ,CAAO,GAE3DU,IAAqD,CAAA;AAC3D,MAAInF;AACF,eAAWoF,KAAoB,OAAO,KAAKpF,CAAU;AACnD,MAAAmF,EAAgBC,CAAgB,IAAI,OAAO;AAAA,QACzCpF,EAAWoF,CAAgB,KAAK,CAAA;AAAA,MAAC;AAKvC,gBAAO,WAAW,aAAaD,GAKxB,EAAE,iBAAAA,GAAiB,eAHJ,CAACC,MACrBD,EAAgBC,CAAgB,KAAK,CAAA,GAEE,SAAAX,GAAS,YAAAzE,EAAA;AACpD;AAEA,MAAMsF,IAAgD;AAAA,EACpD,wBAAwB,CAAA;AAAA,EACxB,aAAa,CAAA;AACf;AAEO,SAASC,GACdd,GACwB;AACxB,SAAKA,IAGE,OAAO,KAAKA,CAAO,EAAE,OAAOD,GAAoBC,CAAO,GAAG;AAAA,IAC/D,GAAGa;AAAA,EAAA,CACJ,IAJQA;AAKX;AAEA,eAAsBD,GAAeZ,GAA0B;AAC7D,MAAI,CAACA;AACH,kBAAO,aAAa,OAAO,cAAc,CAAA,GAClC,CAAA;AAMT,aAAWC,KAAU,OAAO,OAAOD,CAAO,GAAG;AAE3C,QAAI;AACF,UAAIC,EAAO,cAAc,MAAM,QAAQA,EAAO,UAAU,GAAG;AACzD,cAAMc,IAAsBd,EAAO,WAChC,OAAO,CAACe,MAAQA,KAAO,OAAOA,KAAQ,YAAY,QAAQA,CAAG,EAC7D,IAAI,CAACC,MAAUjE,EAAwBiE,CAAuB,CAAC;AAElE,YAAIF,EAAoB,SAAS,GAAG;AAClC,kBAAQ;AAAA,YACN,eAAeA,EAAoB,MAAM,iCAAiCd,EAAO,MAAM;AAAA,UAAA;AAGzF,qBAAW5E,KAAU0F;AACnB,gBAAI;AAEF,cADuBjE,EAAqBzB,CAAM,EACnC,SAAA,GACf,QAAQ,MAAM,oCAAoCA,EAAO,EAAE,EAAE;AAAA,YAC/D,SAASnB,GAAO;AACd,sBAAQ;AAAA,gBACN,4CAA4CmB,EAAO,EAAE,UAAU4E,EAAO,MAAM;AAAA,gBAC5E/F;AAAA,cAAA;AAAA,YAEJ;AAAA,QAEJ;AAAA,MACF;AAAA,IACF,SAASA,GAAO;AACd,cAAQ;AAAA,QACN,8CAA8C+F,EAAO,MAAM;AAAA,QAC3D/F;AAAA,MAAA;AAAA,IAEJ;AAGA,QAAI+F,EAAO;AACT,UAAI;AACF,cAAMiB,IAAa,MAAM9I,EAAAA;AAAAA,UACvB6H,EAAO;AAAA,UACP;AAAA,QAAA;AAEF,YAAIiB,EAAW,SAAS;AACtB,gBAAMC,IAAa,IAAID,EAAW,QAAA;AAClC,UAAAC,KAAA,QAAAA,EAAY;AAAA,QACd;AAAA,MACF,SAASjH,GAAO;AACd,gBAAQ,KAAK,kCAAkC+F,EAAO,MAAM,KAAK/F,CAAK;AAAA,MACxE;AAAA,EAEJ;AAGA,QAAMe,IAAgB6F,GAAiBd,CAAO,GACxC9E,IAAcD,EAAc,aAG5BmG,IAAoBrG;AAAA,IADmB,CAAA;AAAA,IAG3CE;AAAA,IACAC;AAAA,EAAA;AAGF,gBAAO,aAAa,OAAO,cAAc,CAAA,GACzC,OAAO,WAAW,eAAekG,GAC1BA;AACT;AAEA,eAAsBC,GAAcV,GAA0B;AAC5D,QAAM,EAAE,eAAAU,EAAAA,IAAkB,MAAMb,GAAA;AAChC,SAAOa,EAAcV,CAAgB;AACvC;ACxFO,MAAMW,KAAiB,CAACC,IAAQ,UACpCA,KAAS,OAAO,SAAS,OAAO,QAAQ,KAAK,EAAE,GAG7C,MAAM,GAAG,EAGT,IAAI,CAACC,MAAS;AACb,QAAM,CAAC/F,GAAKgG,CAAG,IAAID,EAAK,MAAM,GAAG;AAEjC,SAAO,CAAC/F,GAAK,mBAAmBgG,KAAO,EAAE,CAAC;AAC5C,CAAC,EAGA,OAAO,CAAC5E,GAAQ,CAACpB,GAAKgG,CAAG,OACxB5E,EAAOpB,CAAG,IAAIgG,GACP5E,IACN,EAAE,GAEH6E,KAAiB,MAAM;AAC3B,QAAMC,IAAc,OAAO,SAAS,QAC9BC,IAASN,GAAA;AAGf,UAFiBM,KAAA,gBAAAA,EAAmC,SAC1BD;AAE5B,GAyBaE,KAAuB,OAAOC,MAA4B;;AACrE,QAAMH,IAAcD,GAAA,GACd9E,IAAOkF,KAAS,CAAA,GAChB;AAAA,IACJ,eAAAC,IAAgBJ;AAAA,IAChB,eAAAK,IAAgB;AAAA,IAChB,WAAAC,IAAY,CAAA;AAAA,IACZ,eAAAC;AAAA,EAAA,IACEtF,GAEEuF,IAAe,CAAC,CAACD,GAEjBvJ,IAAMwJ,IACR,GAAGJ,CAAa,+BAA+BG,EAAc,OAAO,KACpE,GAAGH,CAAa,GAAGC,CAAa;AAEpC,UAAQ;AAAA,IACN,+CAA+CG,CAAY,4BAA4BxJ,CAAG;AAAA,EAAA;AAG5F,QAAMqH,IAAU,OADA,MAAM,MAAMrH,CAAG,GACD,KAAA,GAExByJ,IAAaD,MACfhG,KAAAlC,IAAA+F,EAAQ,SAAR,gBAAA/F,EAAc,WAAd,gBAAAkC,EAAuB+F,EAAc,WAAU,CAAA,IAC/ClC,EAAQ,QAAQ,CAAA,GAEdqC,IAAaD,KAAA,gBAAAA,EAAY,OAAO,CAACjH,GAAqBmH,MAAc;AACxE,UAAMC,KACJN,KAAA,gBAAAA,EAAYK,EAAK,QAAOH,IACpB,GAAGJ,CAAa,GAAGO,EAAK,IAAI,KAC5B,GAAGP,CAAa,GAAGO,EAAK,OAAO;AACrC,WAAIA,EAAK,aACPnH,EAAImH,EAAK,EAAE,IAAI;AAAA,MACb,UAAU,GAAGC,CAAO;AAAA,MACpB,YAAYD,EAAK,WAAW,cAAc,CAAA;AAAA,MAC1C,aAAaA,EAAK,WAAW;AAAA,MAC7B,QAAQA,EAAK,WAAW;AAAA,MACxB,MAAM,CAAC,CAACA,EAAK,WAAW;AAAA,IAAA,IAG1B,QAAQ;AAAA,MACN,8BAA8BA,EAAK,EAAE;AAAA,IAAA,GAGlCnH;AAAA,EACT,GAAG,CAAA;AACH,SAAO,aAAa,OAAO,cAAc,CAAA,GACzC,OAAO,WAAW,mBAAmBkH;AACrC,QAAMlK,IAAc,OAAO,KAAKkK,CAAU,EAAE,OAAO,CAAClH,GAAKmH,MAAS;AAChE,UAAMrC,IAASoC,EAAWC,CAAI,EAAE;AAChC,WAAAnH,EAAI8E,CAAM,IAAIoC,EAAWC,CAAI,EAAE,UACxBnH;AAAA,EACT,GAAG,CAAA,CAA4B;AAC/BjD,SAAAA,EAAAA,qBAAqBC,CAAW,GACzBA;AACT;AChKO,SAASqK,GACdjH,GACAkH,GACAC,IAAQ,IACE;AACV,SAAI,CAACnH,KAAc,OAAO,KAAKA,CAAU,EAAE,WAAW,IAC7C,OAILmH,IACKD,KAAUlH,EAAWkH,CAAM,IAAIlH,EAAWkH,CAAM,IAAI,OAIzDA,KAAUlH,EAAWkH,CAAM,IACtBlH,EAAWkH,CAAM,IAIX,OAAO,OAAOlH,CAAU,EACpC,OAAO,CAACyF,MAAQ,OAAOA,EAAI,MAAO,QAAQ,EAC1C,KAAK,CAAC2B,GAAGC,MAAM;AACd,UAAMC,IAAQ,OAAOF,EAAE,QAAS,WAAWA,EAAE,OAAO,OAC9CG,IAAQ,OAAOF,EAAE,QAAS,WAAWA,EAAE,OAAO;AAEpD,QAAIC,MAAUC,GAAO;AACnB,YAAMC,IAAMJ,EAAE,MAAM,IACdK,IAAMJ,EAAE,MAAM;AACpB,aAAOG,EAAI,cAAcC,CAAG;AAAA,IAC9B;AAEA,WAAOH,IAAQC;AAAA,EACjB,CAAC,EAEW,CAAC,KAAK;AACtB;AChCO,MAAMG,IAA0BzF,EAAE,OAAO;AAAA,EAC9C,IAAIA,EACD,SACA,IAAI,GAAG,gBAAgB,EACvB,SAAS,sCAAsC;AAAA,EAClD,OAAOA,EACJ,SACA,IAAI,GAAG,mBAAmB,EAC1B,SAAS,sCAAsC;AAAA,EAClD,WAAWA,EACR,SACA,IAAI,GAAG,uBAAuB,EAC9B,SAAS,6CAA6C;AAAA,EACzD,cAAcA,EACX,SACA,IAAI,GAAG,2BAA2B,EAClC,SAAS,wDAAwD;AACtE,CAAC,GAKY0F,KAA8BD,EAAwB,OAAO;AAAA,EACxE,MAAMzF,EACH,OAAA,EACA,IAAA,EACA,IAAI,CAAC,EACL,WACA,SAAS,oDAAoD;AAClE,CAAC;AAUM,SAAS2F,GACd1J,GACAmD,GACAjB,GACS;AACT,QAAMkB,IAASpD,EAAO,UAAUmD,CAAI;AACpC,SAAKC,EAAO,UAML,MALLA,EAAO,MAAM,OAAO,QAAQ,CAAC3C,MAAU;AACrC,IAAAyB,EAAQ,SAAS,GAAGzB,EAAM,KAAK,KAAK,GAAG,CAAC,KAAKA,EAAM,OAAO,EAAE;AAAA,EAC9D,CAAC,GACM;AAGX;AASO,SAASkJ,GACdC,GACAC,GACA3H,GACM;AACN,EAAI2H,KAAmB,CAACA,EAAgB,SAAS,GAAG,KAClD3H,EAAQ;AAAA,IACN,GAAG0H,CAAe,KAAKC,CAAe;AAAA,EAAA;AAG5C;AASO,SAASC,GACdC,GACA7H,GACA8H,IAAoB,KACd;AACN,EAAID,MAAS,UAAaA,IAAOC,KAC/B9H,EAAQ;AAAA,IACN,QAAQ6H,CAAI;AAAA,EAAA;AAGlB;AAUO,SAASE,GACdC,GACAnH,IAAkC,IAOlC;AAIA,UAHmBA,EAAQ,WACvB0G,KACAD,GACc,OAAOU,CAAgB;AAC3C;AAMO,SAASC,GACdhH,GACAjB,GACA8H,IAAoB,KACd;AACN,EAAI,OAAO7G,KAAS,YAAYA,MAAS,QAAQ,UAAUA,KAEzD2G,GADkB3G,EACK,MAAMjB,GAAS8H,CAAiB;AAE3D;ACzEO,MAAMI,EAAuB;AAAA;AAAA;AAAA;AAAA,EAIlC,OAAO,mBACLtI,GACAiB,IAAkC,IACZ;AACtB,UAAM;AAAA,MACJ,yBAAAsH,IAA0B;AAAA,MAC1B,6BAAAC,IAA8B;AAAA,IAAA,IAC5BvH,GAEEwH,IADW1H,EAAA,EAC0B,sBAAA,GACrCO,IAA+B,CAAA;AAGrC,WAAAmH,EAA0B,QAAQ,CAACC,MAAU;AAC3C,YAAMC,IAAU,OAAO,QAAO3I,KAAA,gBAAAA,EAAa0I,EAAM,QAAO,EAAE;AAE1D,MAAI,CAACF,KAA+BG,EAAQ,WAAW,KAIvDrH,EAAO,KAAK;AAAA,QACV,IAAIoH,EAAM;AAAA,QACV,aAAaA,EAAM,OAAO;AAAA,QAC1B,aAAaA,EAAM,OAAO;AAAA,QAC1B,QAAQ;AAAA,QACR,UAAUA,EAAM,OAAO;AAAA,QACvB,aAAaC,EAAQ;AAAA,QACrB,SAAAA;AAAA,MAAA,CACD;AAAA,IACH,CAAC,GAGGJ,KAA2BvI,KAC7B,OAAO,QAAQA,CAAU,EAAE,QAAQ,CAAC,CAAC4I,GAAaC,CAAgB,MAAM;AAEtE,UAAIvH,EAAO,KAAK,CAACyF,MAASA,EAAK,OAAO6B,CAAW;AAC/C;AAGF,YAAMD,IAAU,OAAO,OAAOE,KAAoB,CAAA,CAAE;AAEpD,MAAI,CAACL,KAA+BG,EAAQ,WAAW,KAIvDrH,EAAO,KAAK;AAAA,QACV,IAAIsH;AAAA,QACJ,QAAQ;AAAA,QACR,aAAaD,EAAQ;AAAA,QACrB,SAAAA;AAAA,MAAA,CACD;AAAA,IACH,CAAC,GAGIrH,EAAO,KAAK,CAAC8F,GAAGC,MAAMD,EAAE,GAAG,cAAcC,EAAE,EAAE,CAAC;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,sBACLlC,GACA2D,GACsB;AACtB,QAAI,CAACA,EAAW;AACd,aAAO3D;AAGT,UAAM4D,IAAOD,EAAW,YAAA;AACxB,WAAO3D,EAAgB;AAAA,MACrB,CAACuD,MAAA;;AACC,eAAAA,EAAM,GAAG,YAAA,EAAc,SAASK,CAAI,OACpCrK,IAAAgK,EAAM,gBAAN,gBAAAhK,EAAmB,cAAc,SAASqK,SAC1CnI,IAAA8H,EAAM,gBAAN,gBAAA9H,EAAmB,cAAc,SAASmI,SAC1CC,KAAAC,IAAAP,EAAM,aAAN,gBAAAO,EAAgB,aAAhB,gBAAAD,EAA0B,cAAc,SAASD,SACjDG,KAAAC,IAAAT,EAAM,aAAN,gBAAAS,EAAgB,SAAhB,gBAAAD,EAAsB,KAAK,CAACE,MAAQA,EAAI,cAAc,SAASL,CAAI;AAAA;AAAA,IAAC;AAAA,EAE1E;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,qBACL5D,GACmB;AACnB,UAAMkE,IAAuBlE,EAAgB,QACvCmE,IAA6BnE,EAAgB;AAAA,MACjD,CAACuD,MAAUA,EAAM,cAAc;AAAA,IAAA,EAC/B,QACIa,IAAepE,EAAgB;AAAA,MACnC,CAACqE,GAAKd,MAAUc,IAAMd,EAAM;AAAA,MAC5B;AAAA,IAAA,GAEID,IAA4BtD,EAAgB;AAAA,MAChD,CAACuD,MAAUA,EAAM,WAAW;AAAA,IAAA,EAC5B,QACIe,IAAwBtE,EAAgB;AAAA,MAC5C,CAACuD,MAAUA,EAAM,WAAW;AAAA,IAAA,EAC5B,QACIgB,IAA4BvE,EAAgB;AAAA,MAChD,CAACuD,MAAA;;AAAU,gBAAAhK,IAAAgK,EAAM,aAAN,gBAAAhK,EAAgB;AAAA;AAAA,IAAA,EAC3B;AAEF,WAAO;AAAA,MACL,sBAAA2K;AAAA,MACA,4BAAAC;AAAA,MACA,cAAAC;AAAA,MACA,2BAAAd;AAAA,MACA,uBAAAgB;AAAA,MACA,2BAAAC;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,cAAcC,GAKnB;AACA,UAAMC,IAAe,CAAC,CAAED,EAAe,WACjCE,IAAU,OAAQF,EAAe,QAAS,UAC1C1B,IAAQ0B,EAAe,QAAQ,GAC/BG,IAAyB,CAAA;AAY/B,QATIF,IACFE,EAAa,KAAK,cAAc,IAEhCA,EAAa,KAAK,oBAAoB,GAGpCD,KAASC,EAAa,KAAK,SAAS7B,CAAI,EAAE,GAGzC0B,EAAe,WAAW;AAC7B,YAAMI,IAAaJ,EAAe;AAClC,MAAII,EAAU,SAAS,KAAK,KAAKA,EAAU,SAAS,KAAK,IACvDD,EAAa,KAAK,aAAa,IAE/BA,EAAa,KAAK,aAAa;AAAA,IAEnC;AAGA,IAAKH,EAAe,aAClBG,EAAa,KAAK,UAAWH,EAAe,SAAS,EAAE;AAIzD,QAAIK,IAAgD;AAEpD,WAAKL,EAAO,WACVK,IAAe,YAQV;AAAA,MACL,cAAAJ;AAAA,MACA,SAAAC;AAAA,MACA,cAAAG;AAAA,MACA,cAAAF;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,sBACL3E,GACAtE,GACgC;AAChC,WAAOsE,EAAgB,KAAK,CAACuD,MAAUA,EAAM,OAAO7H,CAAE;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,yBAAyBA,GAI9B;AACA,UAAMP,IAAmB,CAAA,GACnB2J,IAAwB,CAAA;AAG9B,IAAKpJ,EAAG,SAAS,GAAG,MAClBP,EAAO;AAAA,MACL;AAAA,IAAA,GAEF2J,EAAY,KAAK,oDAAoD;AAIvE,UAAMC,IAAQrJ,EAAG,MAAM,GAAG;AAC1B,IAAIqJ,EAAM,SAAS,KACjB5J,EAAO;AAAA,MACL;AAAA,IAAA;AAIJ,UAAMyJ,IAAYG,EAAM,CAAC;AACzB,WACEH,KACA,CAAC,CAAC,OAAO,OAAO,KAAK,EAAE,SAASA,CAAS,KACzC,CAACA,EAAU,SAAS,KAAK,KAEzBE,EAAY;AAAA,MACV;AAAA,IAAA,GAKiBC,EAAM,KAAK,CAACnI,MAAS,QAAQ,KAAKA,CAAI,CAAC,MAE1DzB,EAAO,KAAK,8CAA8C,GAC1D2J,EAAY;AAAA,MACV;AAAA,IAAA,IAIG;AAAA,MACL,SAAS3J,EAAO,WAAW;AAAA,MAC3B,QAAAA;AAAA,MACA,aAAA2J;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,yBACLE,GACkC;AAClC,UAAMC,IAAmB,CAAA,GACnBC,IAAqB,CAAA,GACrBC,IAA4B,CAAA,GAC5BL,IAAwB,CAAA;AAgB9B,QAbKE,EAAW,KAKTA,EAAW,GAAG,MAAM,cAAc,KACrCF,EAAY;AAAA,MACV;AAAA,IAAA,KANJK,EAAgB,KAAK,IAAI,GACzBF,EAAO,KAAK,2CAA2C,IAWrD,CAACD,EAAW;AACd,MAAAE,EAAS;AAAA,QACP;AAAA,MAAA,GAEFJ,EAAY,KAAK,uDAAuD;AAAA,SACnE;AACL,YAAMM,IAAmB,OAAO,KAAKJ,EAAW,WAAW;AAC3D,MAAII,EAAiB,WAAW,KAC9BF,EAAS,KAAK,qCAAqC,GAIrDE,EAAiB,QAAQ,CAACrK,MAAQ;AAChC,cAAMR,IAAgByK,EAAW,YAAajK,CAAG;AACjD,YAAI,CAAC,MAAM,QAAQR,CAAa,GAAG;AACjC,UAAA0K,EAAO,KAAK,iBAAiBlK,CAAG,oBAAoB;AACpD;AAAA,QACF;AAEA,QAAAR,EAAc,QAAQ,CAAC8K,GAASC,MAAU;AACxC,UAAKD,EAAQ,MACXJ,EAAO;AAAA,YACL,gBAAgBlK,CAAG,IAAIuK,CAAK;AAAA,UAAA,GAK5BvK,MAAQ,iBAAiBsK,EAAQ,aAAa,CAACA,EAAQ,aACzDJ,EAAO;AAAA,YACL,eAAeI,EAAQ,EAAE;AAAA,UAAA,GAE3BP,EAAY;AAAA,YACV;AAAA,UAAA,IAKA,CAAC,OAAO,aAAa,YAAY,OAAO,EAAE,SAAS/J,CAAG,MACnDsK,EAAQ,SACXH,EAAS;AAAA,YACP,GAAGnK,CAAG,kBAAkBsK,EAAQ,EAAE;AAAA,UAAA,GAGjCA,EAAQ,aACXH,EAAS;AAAA,YACP,GAAGnK,CAAG,kBAAkBsK,EAAQ,EAAE;AAAA,UAAA,GAGjCA,EAAQ,gBACXJ,EAAO;AAAA,YACL,GAAGlK,CAAG,kBAAkBsK,EAAQ,EAAE;AAAA,UAAA;AAAA,QAI1C,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAGA,WAAIL,EAAW,SAAS,UAAa,OAAOA,EAAW,QAAS,aAC9DC,EAAO,KAAK,sCAAsC,GAG7C;AAAA,MACL,SAASA,EAAO,WAAW,KAAKE,EAAgB,WAAW;AAAA,MAC3D,QAAAF;AAAA,MACA,UAAAC;AAAA,MACA,iBAAAC;AAAA,MACA,aAAAL;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,yBACLS,GACAC,GAC0B;AAC1B,UAAMrK,IAAmB,CAAA,GACnBsK,IAAmC,CAAA,GACnCC,IAA8B,CAAA,GAC9BZ,IAAwB,CAAA;AAE9B,QAAI,CAACS,EAAiB;AACpB,aAAO;AAAA,QACL,cAAc;AAAA,QACd,QAAQ,CAAC,sCAAsC;AAAA,QAC/C,wBAAwB,CAAA;AAAA,QACxB,mBAAmB,CAAA;AAAA,QACnB,aAAa,CAAA;AAAA,MAAC;AAIlB,UAAM5J,IAAWC,EAAA,GACX+J,IAAe,IAAI;AAAA,MACvBH,EAAyB,IAAI,CAACjC,MAAUA,EAAM,EAAE;AAAA,IAAA;AAIlD,kBAAO,QAAQgC,EAAiB,WAAW,EAAE;AAAA,MAC3C,CAAC,CAAC5F,GAAiBpF,CAAa,MAAM;AAKpC,QAFE,KAAK,2BAA2BoF,CAAe,EAEzB,QAAQ,CAACM,MAAqB;AACpD,UAAK0F,EAAa,IAAI1F,CAAgB,MACpCwF,EAAuB,KAAKxF,CAAgB,GAC5C9E,EAAO;AAAA,YACL,oBAAoB8E,CAAgB,wBAAwBN,CAAe;AAAA,UAAA,GAE7EmF,EAAY;AAAA,YACV,+BAA+B7E,CAAgB;AAAA,UAAA;AAAA,QAGrD,CAAC;AAID,cAAM2F,IADmBjK,EAAS,sBAAA,EACK;AAAA,UACrC,CAAC4H,MAAUA,EAAM,OAAO,oBAAoB5D;AAAA,QAAA;AAG9C,QAAIiG,KAAiBrL,EAAc,SAAS,KAE1CA,EAAc,QAAQ,CAAC8K,GAAcC,MAAU;AAC7C,UACEM,EAAc,OAAO,cACrB,OAAOP,EAAQ,QAAS,aAExBlK,EAAO;AAAA,YACL,GAAGwE,CAAe,IAAI2F,CAAK,uBAAuBM,EAAc,EAAE;AAAA,UAAA,GAEpEd,EAAY;AAAA,YACV;AAAA,UAAA,IAIAc,EAAc,OAAO,WAAW,CAACP,EAAQ,iBAC3ClK,EAAO;AAAA,YACL,GAAGwE,CAAe,IAAI2F,CAAK,uBAAuBM,EAAc,EAAE;AAAA,UAAA,GAEpEd,EAAY;AAAA,YACV;AAAA,UAAA;AAAA,QAGN,CAAC;AAAA,MAEL;AAAA,IAAA,GAGK;AAAA,MACL,cAAc3J,EAAO,WAAW;AAAA,MAChC,QAAAA;AAAA,MACA,wBAAAsK;AAAA,MACA,mBAAAC;AAAA,MACA,aAAAZ;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,2BAA2BnF,GAAmC;AAc3E,WAZ2C;AAAA,MACzC,KAAK,CAAC,WAAW,gBAAgB,yBAAyB;AAAA,MAC1D,WAAW,CAAC,eAAe,oBAAoB,eAAe;AAAA,MAC9D,OAAO,CAAC,aAAa,gBAAgB;AAAA,MACrC,UAAU,CAAC,gBAAgB,mBAAmB;AAAA,MAC9C,gBAAgB,CAAC,qBAAqB,wBAAwB;AAAA,MAC9D,UAAU,CAAC,WAAW,cAAc;AAAA,MACpC,aAAa,CAAC,mBAAmB,sBAAsB;AAAA,MACvD,aAAa,CAAA;AAAA;AAAA,MACb,OAAO,CAAA;AAAA;AAAA,IAAC,EAGMA,CAAe,KAAK,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,wBACLqF,GACAQ,GAKA;AACA,UAAMK,IAAa,KAAK,yBAAyBb,CAAU,GACrDc,IAAgB,KAAK;AAAA,MACzBd;AAAA,MACAQ;AAAA,IAAA,GAEIO,IAA4B,CAAA;AAGlC,WAAIF,EAAW,SAAS,SAAS,KAC/BE,EAAgB;AAAA,MACd;AAAA,IAAA,GAICD,EAAc,gBACjBC,EAAgB;AAAA,MACd;AAAA,IAAA,GAKFf,EAAW,eACX,OAAO,KAAKA,EAAW,WAAW,EAAE,WAAW,KAE/Ce,EAAgB;AAAA,MACd;AAAA,IAAA,GAIG;AAAA,MACL,YAAAF;AAAA,MACA,eAAAC;AAAA,MACA,iBAAAC;AAAA,IAAA;AAAA,EAEJ;AACF;AC3gBO,MAAMC,GAAuB;AAAA;AAAA;AAAA;AAAA,EAIlC,OAAO,0BACLnL,GACAiB,IAAgC,IACR;AACxB,UAAM;AAAA,MACJ,sBAAAmK,IAAuB;AAAA,MACvB,wBAAAC,IAAyB;AAAA,MACzB,yBAAA9C,IAA0B;AAAA,MAC1B,qBAAA+C,IAAsB;AAAA,IAAA,IACpBrK,GAEEkE,IAAkBmD,EAAuB;AAAA,MAC7CtI;AAAA,MACA;AAAA,QACE,yBAAAuI;AAAA,QACA,6BAA6B;AAAA,MAAA;AAAA,IAC/B,GAGIgD,IACJjD,EAAuB,qBAAqBnD,CAAe;AAE7D,QAAIqG,IAAU,KAAK,eAAeD,CAAW;AAC7C,WAAAC,KAAW,KAAK,wBAAwBrG,CAAe,GACvDqG,KAAW,KAAK,wBAAwBrG,GAAiBoG,CAAW,GAGpEpG,EAAgB,QAAQ,CAACuD,MAAU;AACjC,MAAA8C,KAAW,KAAK,8BAA8B9C,GAAO;AAAA,QACnD,sBAAA0C;AAAA,QACA,qBAAAE;AAAA,MAAA,CACD;AAAA,IACH,CAAC,GAEGD,MACFG,KAAW,KAAK,+BAA+BrG,CAAe,IAGhEqG,KAAW,KAAK,0BAAA,GAChBA,KAAW,KAAK,+BAAA,GAET;AAAA,MACL,SAAAA;AAAA,MACA,UAAU;AAAA,QACR,cAAa,oBAAI,KAAA,GAAO,YAAA;AAAA,QACxB,sBAAsBD,EAAY;AAAA,QAClC,cAAcA,EAAY;AAAA,QAC1B,2BAA2BA,EAAY;AAAA,QACvC,uBAAuBA,EAAY;AAAA,MAAA;AAAA,IACrC;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,eAAeA,GAA0B;AACtD,WAAO;AAAA;AAAA,kBAEM,oBAAI,KAAA,GAAO,eAAA,CAAgB;AAAA;AAAA;AAAA;AAAA,gCAIZA,EAAY,oBAAoB;AAAA,uCACzBA,EAAY,0BAA0B;AAAA,8BAC/CA,EAAY,YAAY;AAAA,qCACjBA,EAAY,yBAAyB;AAAA,iCACzCA,EAAY,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKhE;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,wBACbpG,GACQ;AACR,QAAIsG,IAAM;AAAA;AAAA;AAEV,WAAAA,KAAO;AAAA,GACPA,KAAO;AAAA,GAEPtG,EAAgB,QAAQ,CAACuD,MAAU;AACjC,YAAMgD,IAAShD,EAAM,GAAG,cAAc,QAAQ,OAAO,EAAE;AAEvD,MAAA+C,KAAO,QAAQ/C,EAAM,EAAE,MAAMgD,CAAM,MAAMhD,EAAM,WAAW;AAAA;AAAA,IAC5D,CAAC,GAED+C,KAAO;AAAA,GACPA,KAAO;AAAA,GACPA,KAAO;AAAA;AAAA,GAEAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,wBACbE,GACAJ,GACQ;AACR,QAAIK,IAAW;AAAA;AAAA;AAEf,WAAAA,KACE,kHACFA,KACE;AAAA;AAAA,GAEFA,KAAY;AAAA;AAAA,GACZA,KACE,iGACFA,KACE;AAAA;AAAA,GAEEL,EAAY,4BAA4B,MAC1CK,KAAY;AAAA;AAAA,GACZA,KAAY,GAAGL,EAAY,yBAAyB,gDACpDK,KAAY;AAAA;AAAA,IAGPA,IAAW;AAAA;AAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,8BACb/G,GACA5D,GACQ;;AACR,UAAM,EAAE,sBAAAmK,IAAuB,IAAM,qBAAAE,IAAsB,OAASrK;AAEpE,QAAI4K,IAAU,MAAMhH,EAAe,WAAW,eAAe,MAAM,IAAI,IACrEA,EAAe,EACjB;AAAA;AAAA;AAeA,QAZIA,EAAe,gBACjBgH,KAAW,qBAAqBhH,EAAe,WAAW;AAAA;AAAA,IAGxDA,EAAe,gBACjBgH,KAAW,oBAAoBhH,EAAe,WAAW;AAAA;AAAA,IAG3DgH,KAAW,eAAehH,EAAe,MAAM;AAAA,GAC/CgH,KAAW,uBAAuBhH,EAAe,WAAW;AAAA;AAAA,GAGxDA,EAAe,UAAU;AAC3B,MAAAgH,KAAW;AAAA;AAAA;AACX,YAAMC,IAAWjH,EAAe;AAEhC,MAAIiH,EAAS,aACXD,KAAW,mBAAmBC,EAAS,QAAQ;AAAA,IAC7CA,EAAS,UAAOD,KAAW,gBAAgBC,EAAS,KAAK;AAAA,IACzDA,EAAS,UAAOD,KAAW,gBAAgBC,EAAS,KAAK;AAAA,KACzDpN,IAAAoN,EAAS,SAAT,QAAApN,EAAe,WACjBmN,KAAW,eAAeC,EAAS,KAAK,KAAK,IAAI,CAAC;AAAA,IAChDA,EAAS,eAAYD,KAAW;AAAA,IAEpCA,KAAW;AAAA;AAAA,IACb;AAGA,WAAIT,MACFS,KAAW,KAAK,sBAAsBhH,CAAc,IAIlDA,EAAe,QAAQ,SAAS,IAClCgH,KAAW,KAAK;AAAA,MACdhH,EAAe;AAAA,MACfyG;AAAA,IAAA,IAGFO,KACE;AAAA;AAAA;AAAA;AAAA,GAIJA,KAAW,KAAK,4BAA4BhH,CAAc,GAG1DgH,KAAW,KAAK,8BAA8BhH,CAAc,GAErDgH,IAAU;AAAA;AAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,sBAAsBhH,GAA4C;AACvE,QAAIkH,IAAW;AAAA;AAAA;AAEf,WAAIlH,EAAe,WAAW,iBAC5BkH,KAAY;AAAA;AAAA,GACZA,KAAY,mBACZA,KAAY;AAAA,GACZA,KAAY,YAAY,KAAK;AAAA,MAC3BlH,EAAe;AAAA,IAAA,CAChB;AAAA;AAAA,GACDkH,KAAY;AAAA,GACZA,KAAY;AAAA;AAAA,GACZA,KAAY,2CAA2C,KAAK;AAAA,MAC1DlH,EAAe;AAAA,IAAA,CAChB;AAAA;AAAA,GACDkH,KAAY;AAAA,GACZA,KAAY;AAAA,GACZA,KAAY;AAAA,GACZA,KAAY;AAAA,GACZA,KAAY;AAAA,GACZA,KAAY;AAAA,GACZA,KAAY;AAAA,GACZA,KAAY;AAAA;AAAA,GACZA,KAAY;AAAA,GACZA,KAAY;AAAA,GACZA,KAAY,gBAAgB,KAAK;AAAA,MAC/BlH,EAAe;AAAA,IAAA,CAChB;AAAA,GACDkH,KAAY;AAAA,GACZA,KAAY,WAEZA,KAAY;AAAA;AAAA,GACZA,KAAY,mBACZA,KAAY;AAAA,GACZA,KAAY,oCAAoC,KAAK;AAAA,MACnDlH,EAAe;AAAA,IAAA,CAChB;AAAA;AAAA,GACDkH,KAAY;AAAA,GACZA,KAAY,iCAAiC,KAAK;AAAA,MAChDlH,EAAe;AAAA,IAAA,CAChB;AAAA;AAAA,GACDkH,KAAY;AAAA,GACZA,KAAY,0CAA0C,KAAK;AAAA,MACzDlH,EAAe;AAAA,IAAA,CAChB;AAAA,GACDkH,KAAY,YAGdA,KAAY;AAAA;AAAA,GACZA,KAAY,mBACZA,KAAY;AAAA,GACZA,KAAY,YAAY,KAAK;AAAA,MAC3BlH,EAAe;AAAA,IAAA,CAChB;AAAA;AAAA,GACDkH,KAAY;AAAA,GACZA,KAAY,gBAAgB,KAAK;AAAA,MAC/BlH,EAAe;AAAA,IAAA,CAChB;AAAA,GACDkH,KAAY;AAAA,GACZA,KAAY;AAAA,GACZA,KAAY;AAAA,GACZA,KAAY,WAEZA,KAAY;AAAA;AAAA,GACZA,KAAY,mBACZA,KAAY;AAAA,GACZA,KAAY,YAAY,KAAK;AAAA,MAC3BlH,EAAe;AAAA,IAAA,CAChB;AAAA;AAAA,GACDkH,KAAY;AAAA,GACZA,KAAY,oCAAoC,KAAK;AAAA,MACnDlH,EAAe;AAAA,IAAA,CAChB;AAAA,GACDkH,KAAY,WAELA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,mBACbpD,GACAqD,GACQ;AACR,QAAIC,IAAO;AAAA;AAAA;AAEX,WAAAtD,EAAQ,QAAQ,CAACgB,MAAW;AAe1B,UAdAsC,KAAQ,QAAQtC,EAAO,EAAE;AAAA;AAAA,GAErBA,EAAO,WACTsC,KAAQ,iBAAiBtC,EAAO,MAAM;AAAA,IAGpCA,EAAO,cACTsC,KAAQ,kBAAkBtC,EAAO,SAAS;AAAA,IAGvCA,EAAe,SAAS,WAC3BsC,KAAQ,eAAgBtC,EAAe,IAAI;AAAA,IAGzCqC,GAAe;AACjB,cAAME,IAAW5D,EAAuB,cAAcqB,CAAM;AAC5D,QAAAsC,KAAQ,iBAAiB,KAAK,eAAeC,EAAS,YAAY,CAAC,IACjEA,EAAS,YACX;AAAA,GAEIA,EAAS,aAAa,SAAS,MACjCD,KAAQ,uBAAuBC,EAAS,aAAa,KAAK,IAAI,CAAC;AAAA;AAAA,MAEnE;AAEA,MAAAD,KAAQ;AAAA;AAAA,IACV,CAAC,GAEMA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,4BACbpH,GACQ;AAER,QAAIA,EAAe,WAAW;AAC5B,aAAO;AAIT,UAAM6D,IADW3H,EAAA,EACM,kBAAkB8D,EAAe,EAAE;AAE1D,QAAI,EAAC6D,KAAA,QAAAA,EAAO;AACV,aAAO;AAGT,UAAMlK,IAAYkK,EAAM,mBAAA;AACxB,QAAIlK,EAAU,WAAW;AACvB,aAAO;AAGT,QAAIqN,IAAU;AAAA;AAAA;AACd,WAAAA,KACE;AAAA;AAAA,GACFA,KAAW;AAAA,GACXA,KAAW;AAAA,GAEXrN,EAAU,QAAQ,CAAC+E,MAAU;AAC3B,YAAM4I,IAAO5I,EAAM,MACb6I,IAAO7I,EAAM,QAAQ,WACrB8I,IAAW9I,EAAM,WAAW,MAAM,KAClC+I,IAAc/I,EAAM,eAAe;AAEzC,MAAAsI,KAAW,OAAOM,CAAI,QAAQC,CAAI,MAAMC,CAAQ,MAAMC,CAAW;AAAA;AAAA,IACnE,CAAC,GAEDT,KAAW;AAAA,GAEJA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,8BACbhH,GACQ;AACR,QAAI0H,IAAY;AAAA;AAAA;AAEhB,IAAAA,KACE;AAAA;AAAA,GACFA,KAAa,aACbA,KAAa;AAAA,GACbA,KAAa;AAAA,GACbA,KAAa;AAAA;AAGb,UAAMzH,IAAkB,KAAK,qBAAqBD,CAAc;AAEhE,IAAA0H,KAAa,QAAQzH,CAAe;AAAA,GACpCyH,KAAa;AAAA;AAGb,UAAMC,IAAe,KAAK,+BAA+B3H,CAAc;AAEvE,QAAI2H,EAAa,SAAS,GAAG;AAE3B,YAAMC,IAA0B,CAAA;AAEhC,MAAAD,EAAa,QAAQ,CAACjJ,MAAU;AAC9B,YAAIR;AAGJ,QAAIQ,EAAM,SAAS,OACjBR,IAAQ,2BACCQ,EAAM,SAAS,UACxBR,IAAQ,8BACCQ,EAAM,SAAS,cACxBR,IAAQ,qBACCQ,EAAM,SAAS,iBACxBR,IAAQ,yBACCQ,EAAM,SAAS,iBACxBR,IAAQ,yBACCQ,EAAM,SAAS,SACxBR,IAAQ,OACCQ,EAAM,SAAS,WACxBR,IAAQ,SAASQ,EAAM,IAAI,MAClBA,EAAM,SAAS,WACxBR,IAAQ,MACCQ,EAAM,SAAS,YACxBR,IAAQ,UAERA,IAAQ,SAASQ,EAAM,IAAI,MAK3BA,EAAM,YACN,CAAC,gBAAgB,QAAQ,cAAc,EAAE,SAASA,EAAM,IAAI,MAE5DkJ,EAAc,KAAK,YAAYlJ,EAAM,IAAI,MAAMR,CAAK,EAAE;AAAA,MAE1D,CAAC,GAEDwJ,KAAaE,EAAc,KAAK;AAAA,CAAK;AAAA,IACvC,OAAO;AAEL,MAAAF,KAAa;AAAA,GACbA,KAAa;AAAA,GACbA,KAAa,yCAGT,KAAK,0BAA0B1H,CAAc,MAC/C0H,KAAa;AAAA,gDAGX,KAAK,yBAAyB1H,CAAc,MAC9C0H,KAAa;AAAA;AAIf,YAAMG,IAAiB,KAAK,kBAAkB7H,CAAc;AAC5D,MAAI6H,EAAe,SAAS,MAC1BH,KAAa;AAAA,UAAcG,EAAe,KAAK;AAAA,SAAa,CAAC;AAAA,IAEjE;AAEA,WAAAH,KAAa;AAAA;AAAA,GACbA,KAAa,UAIXC,EAAa,KAAK,CAACG,MAAMA,EAAE,SAAS,cAAc,KAClD,KAAK,0BAA0B9H,CAAc,OAG7C0H,KAAa;AAAA;AAAA,GACbA,KAAa;AAAA,GACbA,KAAa;AAAA,GACbA,KAAa;AAAA,GACbA,KAAa;AAAA,GACbA,KAAa;AAAA,GACbA,KAAa,UAGfA,KAAa;AAAA;AAAA,GACbA,KAAa;AAAA,GACbA,KAAa,WAENA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,+BACbpH,GACQ;AACR,QAAI0G,IAAU;AAAA;AAAA;AAEd,WAAAA,KAAW;AAAA;AAAA,GACXA,KAAW,mBAEX1G,EAAgB,QAAQ,CAACuD,MAAU;AACjC,MAAIA,EAAM,WAAW,iBACnBmD,KAAW,MAAMnD,EAAM,EAAE;AAAA,GACzBmD,KAAW,aAAa,KAAK,0BAA0BnD,EAAM,EAAE,CAAC;AAAA,GAChEmD,KAAW,UAAUnD,EAAM,EAAE;AAAA,GAC7BmD,KAAW,oBAAoBnD,EAAM,eAAe,EAAE;AAAA,GACtDmD,KAAW,oBAAoBnD,EAAM,eAAe,EAAE;AAAA,GACtDmD,KAAW;AAAA;AAAA;AAAA,IAEf,CAAC,GAEDA,KAAW,WAEXA,KAAW;AAAA;AAAA,GACXA,KAAW,mBACXA,KAAW;AAAA,GACXA,KAAW;AAAA,GACXA,KAAW;AAAA,GACXA,KAAW;AAAA,GACXA,KAAW;AAAA;AAAA,GACXA,KAAW;AAAA,GACXA,KAAW;AAAA,GACXA,KAAW;AAAA;AAAA,GACXA,KAAW;AAAA,GACXA,KAAW;AAAA,GACXA,KAAW;AAAA,GACXA,KAAW,WAEJA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,4BAAoC;AACjD,WAAO;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,EAyCT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,iCAAyC;AACtD,WAAO;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,EAyCT;AAAA;AAAA,EAGA,OAAe,4BAA4BhL,GAAoB;;AAG7D,UAAM6H,IADW3H,EAAA,EACM,kBAAkBF,CAAE;AAE3C,SAAInC,IAAAgK,KAAA,gBAAAA,EAAO,OAAO,aAAd,QAAAhK,EAAwB;AAC1B,aAAOgK,EAAM,OAAO,SAAS;AAI/B,UAAMwB,IAAQrJ,EAAG,MAAM,GAAG;AAM1B,YAFwBqJ,EAAM,SAAS,IAAIA,EAAM,MAAM,CAAC,IAAIA,GAIvD;AAAA,MAAI,CAACnI;AAAA;AAAA,QAEJA,EACG,MAAM,GAAG,EACT,IAAI,CAAC6K,MAASA,EAAK,OAAO,CAAC,EAAE,YAAA,IAAgBA,EAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,EAAE;AAAA;AAAA,IAAA,EAEX,KAAK,EAAE,IAAI;AAAA,EAElB;AAAA,EAEA,OAAe,0BAA0B/L,GAAoB;AAC3D,WAAO,KAAK,4BAA4BA,CAAE,IAAI;AAAA,EAChD;AAAA,EAEA,OAAe,eAAegM,GAAwB;AACpD,YAAQA,GAAA;AAAA,MACN,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IAAA;AAAA,EAEb;AAAA,EAEA,OAAe,qBACbhI,GACQ;AAER,QAAIA,EAAe,WAAW,cAAc;AAE1C,YAAM6D,IADW3H,EAAA,EACM,kBAAkB8D,EAAe,EAAE;AAC1D,UAAI6D,KAAA,QAAAA,EAAO,OAAO;AAChB,eAAOA,EAAM,OAAO;AAAA,IAExB;AAGA,UAAMwB,IAAQrF,EAAe,GAAG,MAAM,GAAG,GACnCiI,IAAW5C,EAAMA,EAAM,SAAS,CAAC;AAcvC,WAXyC;AAAA,MACvC,KAAK;AAAA,MACL,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,UAAU;AAAA,MACV,KAAK;AAAA,MACL,eAAe;AAAA,MACf,aAAa;AAAA,IAAA,EAGC4C,CAAQ,KAAKA,IAAW;AAAA,EAC1C;AAAA,EAEA,OAAe,0BACbjI,GACS;AACT,QAAIA,EAAe,WAAW,cAAc;AAE1C,YAAM6D,IADW3H,EAAA,EACM,kBAAkB8D,EAAe,EAAE;AAC1D,cAAO6D,KAAA,gBAAAA,EAAO,OAAO,YAAW;AAAA,IAClC;AAGA,WAAO7D,EAAe,QAAQ;AAAA,MAC5B,CAAC8E,MAAYA,EAAe;AAAA,IAAA;AAAA,EAEhC;AAAA,EAEA,OAAe,yBACb9E,GACS;AACT,QAAIA,EAAe,WAAW,cAAc;AAE1C,YAAM6D,IADW3H,EAAA,EACM,kBAAkB8D,EAAe,EAAE;AAC1D,cAAO6D,KAAA,gBAAAA,EAAO,OAAO,eAAc;AAAA,IACrC;AAGA,WAAO7D,EAAe,QAAQ;AAAA,MAC5B,CAAC8E,MAAW,OAAQA,EAAe,QAAS;AAAA,IAAA;AAAA,EAEhD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,+BACb9E,GACmB;AAEnB,QAAIA,EAAe,WAAW;AAC5B,aAAO,CAAA;AAIT,UAAM6D,IADW3H,EAAA,EACM,kBAAkB8D,EAAe,EAAE;AAE1D,WAAK6D,KAAA,QAAAA,EAAO,qBAILA,EAAM,mBAAA,IAHJ,CAAA;AAAA,EAIX;AAAA,EAEA,OAAe,kBACb7D,GACU;AACV,UAAMzG,IAAmB,CAAA;AAIzB,YAHwB,KAAK,qBAAqByG,CAAc,GAGxD;AAAA,MACN,KAAK;AACH,QAAAzG,EAAO,KAAK,0CAA0C;AACtD;AAAA,MACF,KAAK;AACH,QAAAA,EAAO,KAAK,4CAA4C;AACxD;AAAA,MACF,KAAK;AACH,QAAAA,EAAO,KAAK,wCAAwC;AACpD;AAAA,MACF,KAAK;AACH,QAAAA,EAAO,KAAK,wCAAwC;AACpD;AAAA,MACF,KAAK;AACH,QAAAA,EAAO,KAAK,oCAAoC;AAChD;AAAA,MACF,KAAK;AACH,QAAAA,EAAO,KAAK,wCAAwC;AACpD;AAAA,IAAA;AAGJ,WAAOA;AAAA,EACT;AACF;","x_google_ignoreList":[0,1]}