@zipbul/gildash 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -2,8 +2,8 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/gildash.ts", "../src/parser/parse-source.ts", "../src/errors.ts", "../src/common/lru-cache.ts", "../src/parser/parse-cache.ts", "../src/parser/source-position.ts", "../src/parser/jsdoc-parser.ts", "../src/extractor/symbol-extractor.ts", "../src/extractor/extractor-utils.ts", "../src/parser/ast-utils.ts", "../src/extractor/imports-extractor.ts", "../src/extractor/calls-extractor.ts", "../src/extractor/heritage-extractor.ts", "../src/extractor/relation-extractor.ts", "../src/store/connection.ts", "../src/store/schema.ts", "../src/store/repositories/file.repository.ts", "../src/store/repositories/symbol.repository.ts", "../src/store/repositories/fts-utils.ts", "../src/store/repositories/relation.repository.ts", "../src/watcher/project-watcher.ts", "../src/common/project-discovery.ts", "../src/common/tsconfig-resolver.ts", "../src/common/path-utils.ts", "../src/common/hasher.ts", "../src/indexer/index-coordinator.ts", "../src/indexer/file-indexer.ts", "../src/indexer/symbol-indexer.ts", "../src/indexer/relation-indexer.ts", "../src/watcher/ownership.ts", "../src/search/symbol-search.ts", "../src/search/relation-search.ts", "../src/search/dependency-graph.ts", "../src/search/pattern-search.ts"],
4
4
  "sourcesContent": [
5
- "import { err, isErr, type Result } from '@zipbul/result';\nimport path from 'node:path';\nimport { existsSync } from 'node:fs';\nimport type { ParsedFile } from './parser/types';\nimport { parseSource as defaultParseSource } from './parser/parse-source';\nimport { ParseCache } from './parser/parse-cache';\nimport type { ExtractedSymbol, SymbolKind, CodeRelation } from './extractor/types';\nimport { extractSymbols as defaultExtractSymbols } from './extractor/symbol-extractor';\nimport { extractRelations as defaultExtractRelations } from './extractor/relation-extractor';\nimport { DbConnection } from './store/connection';\nimport { FileRepository } from './store/repositories/file.repository';\nimport type { FileRecord } from './store/repositories/file.repository';\nimport { SymbolRepository } from './store/repositories/symbol.repository';\nimport { RelationRepository } from './store/repositories/relation.repository';\nimport { ProjectWatcher } from './watcher/project-watcher';\nimport { IndexCoordinator } from './indexer/index-coordinator';\nimport type { IndexResult } from './indexer/index-coordinator';\nimport type { IndexCoordinatorOptions } from './indexer/index-coordinator';\nimport type { FileChangeEvent } from './watcher/types';\nimport { acquireWatcherRole, releaseWatcherRole, updateHeartbeat } from './watcher/ownership';\nimport type { WatcherOwnerStore } from './watcher/ownership';\nimport { discoverProjects } from './common/project-discovery';\nimport type { ProjectBoundary } from './common/project-discovery';\nimport { loadTsconfigPaths, clearTsconfigPathsCache } from './common/tsconfig-resolver';\nimport type { TsconfigPaths } from './common/tsconfig-resolver';\nimport { symbolSearch as defaultSymbolSearch } from './search/symbol-search';\nimport type { SymbolSearchQuery, SymbolSearchResult } from './search/symbol-search';\nimport { relationSearch as defaultRelationSearch } from './search/relation-search';\nimport type { RelationSearchQuery } from './search/relation-search';\nimport type { SymbolStats } from './store/repositories/symbol.repository';\nimport { DependencyGraph } from './search/dependency-graph';\nimport { patternSearch as defaultPatternSearch } from './search/pattern-search';\nimport type { PatternMatch } from './search/pattern-search';\nimport { gildashError, type GildashError } from './errors';\n\nconst HEARTBEAT_INTERVAL_MS = 30_000;\nconst HEALTHCHECK_INTERVAL_MS = 60_000;\nconst MAX_HEALTHCHECK_RETRIES = 10;\n\n/**\n * Minimal logger interface accepted by {@link Gildash}.\n *\n * Any object with an `error` method (including `console`) satisfies this interface.\n */\nexport interface Logger {\n /** Log one or more error-level messages. */\n error(...args: unknown[]): void;\n}\n\n/**\n * Result of a {@link Gildash.diffSymbols} call.\n */\nexport interface SymbolDiff {\n /** Symbols present in `after` but not in `before`. */\n added: SymbolSearchResult[];\n /** Symbols present in `before` but not in `after`. */\n removed: SymbolSearchResult[];\n /** Symbols present in both but with a different `fingerprint`. */\n modified: Array<{ before: SymbolSearchResult; after: SymbolSearchResult }>;\n}\n\n/**\n * Public interface of a module — its exported symbols with key metadata.\n * Returned by {@link Gildash.getModuleInterface}.\n */\nexport interface ModuleInterface {\n filePath: string;\n exports: Array<{\n name: string;\n kind: SymbolKind;\n parameters?: string;\n returnType?: string;\n jsDoc?: string;\n }>;\n}\n\n/**\n * A node in the heritage chain tree returned by {@link Gildash.getHeritageChain}.\n */\nexport interface HeritageNode {\n symbolName: string;\n filePath: string;\n /** Relationship kind (`extends` or `implements`). Undefined for the root query node. */\n kind?: 'extends' | 'implements';\n children: HeritageNode[];\n}\n\n/**\n * Full symbol detail including members, documentation, and type information.\n * Returned by {@link Gildash.getFullSymbol}.\n */\nexport interface FullSymbol extends SymbolSearchResult { /** Class/interface members (methods, properties, constructors, accessors). */\n members?: Array<{\n name: string;\n kind: string;\n type?: string;\n visibility?: string;\n isStatic?: boolean;\n isReadonly?: boolean;\n }>;\n /** JSDoc comment attached to the symbol. */\n jsDoc?: string;\n /** Stringified parameter list (functions/methods). */\n parameters?: string;\n /** Stringified return type (functions/methods). */\n returnType?: string;\n /** Superclass/interface names (classes/interfaces with heritage). */\n heritage?: string[];\n /** Decorators applied to the symbol. */\n decorators?: Array<{ name: string; arguments?: string }>;\n /** Stringified type parameters (generic symbols). */\n typeParameters?: string;\n}\n\n/**\n * File-level statistics for an indexed file.\n * Returned by {@link Gildash.getFileStats}.\n */\nexport interface FileStats {\n /** Absolute file path. */\n filePath: string;\n /** Number of lines in the file at the time of last indexing. */\n lineCount: number;\n /** Number of symbols indexed in the file. */\n symbolCount: number;\n /** Number of outgoing relations (imports, calls, etc.) from the file. */\n relationCount: number;\n /** File size in bytes at the time of last indexing. */\n size: number;\n /** Number of exported symbols in the file. */\n exportedSymbolCount: number;\n}\n\n/**\n * Import-graph fan metrics for a single file.\n * Returned by {@link Gildash.getFanMetrics}.\n */\nexport interface FanMetrics {\n /** Absolute file path queried. */\n filePath: string;\n /** Number of files that import this file (fan-in). */\n fanIn: number;\n /** Number of files this file imports (fan-out). */\n fanOut: number;\n}\n\n/**\n * Result of following a re-export chain to the original symbol definition.\n */\nexport interface ResolvedSymbol {\n /** The name of the symbol at the end of the re-export chain (may differ from the queried name due to aliasing). */\n originalName: string;\n /** Absolute path of the file that originally defines the symbol. */\n originalFilePath: string;\n /** Ordered list of re-export hops between the queried file and the original definition. */\n reExportChain: Array<{ filePath: string; exportedAs: string }>;\n}\n\n/**\n * Options for creating a {@link Gildash} instance via {@link Gildash.open}.\n *\n * @example\n * ```ts\n * import { isErr } from '@zipbul/result';\n *\n * const result = await Gildash.open({\n * projectRoot: '/absolute/path/to/project',\n * extensions: ['.ts', '.tsx'],\n * ignorePatterns: ['vendor'],\n * });\n * if (isErr(result)) {\n * console.error(result.data.message);\n * process.exit(1);\n * }\n * const ledger = result;\n * ```\n */\nexport interface GildashOptions {\n /** Absolute path to the project root directory. */\n projectRoot: string;\n /** File extensions to index. Defaults to `['.ts', '.mts', '.cts']`. */\n extensions?: string[];\n /** Glob patterns to ignore during indexing. */\n ignorePatterns?: string[];\n /** Maximum number of parsed ASTs to keep in the LRU cache. Defaults to `500`. */\n parseCacheCapacity?: number;\n /** Logger for error output. Defaults to `console`. */\n logger?: Logger;\n /**\n * When `false`, disables the file watcher and runs in scan-only mode:\n * ownership contention is skipped, heartbeat and signal handlers are not\n * registered, and only the initial `fullIndex()` is performed.\n *\n * Set `cleanup: true` in {@link Gildash.close} to remove the database files\n * after a one-shot scan.\n *\n * @default true\n */\n watchMode?: boolean;\n}\n\ninterface GildashInternalOptions {\n existsSyncFn?: (p: string) => boolean;\n dbConnectionFactory?: () => Pick<DbConnection, 'open' | 'close' | 'transaction'> & WatcherOwnerStore;\n watcherFactory?: () => Pick<ProjectWatcher, 'start' | 'close'>;\n coordinatorFactory?: () => Pick<IndexCoordinator, 'fullIndex' | 'shutdown' | 'onIndexed'> & {\n tsconfigPaths?: Promise<TsconfigPaths | null>;\n handleWatcherEvent?(event: FileChangeEvent): void;\n };\n repositoryFactory?: () => {\n fileRepo: Pick<FileRepository, 'upsertFile' | 'getAllFiles' | 'getFilesMap' | 'deleteFile' | 'getFile'>;\n symbolRepo: SymbolRepository;\n relationRepo: RelationRepository;\n parseCache: Pick<ParseCache, 'set' | 'get' | 'invalidate'>;\n };\n acquireWatcherRoleFn?: typeof acquireWatcherRole;\n releaseWatcherRoleFn?: typeof releaseWatcherRole;\n updateHeartbeatFn?: typeof updateHeartbeat;\n discoverProjectsFn?: typeof discoverProjects;\n parseSourceFn?: typeof defaultParseSource;\n extractSymbolsFn?: typeof defaultExtractSymbols;\n extractRelationsFn?: typeof defaultExtractRelations;\n symbolSearchFn?: typeof defaultSymbolSearch;\n relationSearchFn?: typeof defaultRelationSearch;\n patternSearchFn?: (opts: { pattern: string; filePaths: string[] }) => Promise<PatternMatch[]>;\n loadTsconfigPathsFn?: typeof loadTsconfigPaths;\n readFileFn?: (filePath: string) => Promise<string>;\n unlinkFn?: (filePath: string) => Promise<void>;\n makeExternalCoordinatorFn?: (packageDir: string, project: string) => { fullIndex(): Promise<IndexResult> };\n}\n\n/**\n * Main entry point for gildash.\n *\n * `Gildash` indexes TypeScript source code into a local SQLite database,\n * watches for file changes, and provides search / dependency-graph queries.\n *\n * Every public method returns a `Result<T, GildashError>` — either the\n * success value `T` directly, or an `Err<GildashError>` that can be checked\n * with `isErr()` from `@zipbul/result`.\n *\n * Create an instance with the static {@link Gildash.open} factory.\n * Always call {@link Gildash.close} when done to release resources.\n *\n * @example\n * ```ts\n * import { Gildash } from '@zipbul/gildash';\n * import { isErr } from '@zipbul/result';\n *\n * const result = await Gildash.open({ projectRoot: '/my/project' });\n * if (isErr(result)) {\n * console.error(result.data.message);\n * process.exit(1);\n * }\n * const ledger = result;\n *\n * const symbols = ledger.searchSymbols({ text: 'handle', kind: 'function' });\n * if (!isErr(symbols)) {\n * symbols.forEach(s => console.log(s.name));\n * }\n *\n * await ledger.close();\n * ```\n */\nexport class Gildash {\n /** Absolute path to the indexed project root. */\n readonly projectRoot: string;\n\n private readonly db: Pick<DbConnection, 'open' | 'close' | 'transaction'> & WatcherOwnerStore;\n private readonly symbolRepo: SymbolRepository;\n private readonly relationRepo: RelationRepository;\n private readonly fileRepo: Pick<FileRepository, 'getFile' | 'getAllFiles'>;\n private readonly parseCache: Pick<ParseCache, 'set' | 'get' | 'invalidate'>;\n private coordinator: (Pick<IndexCoordinator, 'fullIndex' | 'shutdown' | 'onIndexed'> & {\n tsconfigPaths?: Promise<TsconfigPaths | null>;\n handleWatcherEvent?(event: FileChangeEvent): void;\n }) | null;\n private watcher: Pick<ProjectWatcher, 'start' | 'close'> | null;\n private readonly releaseWatcherRoleFn: typeof releaseWatcherRole;\n private readonly parseSourceFn: typeof defaultParseSource;\n private readonly extractSymbolsFn: typeof defaultExtractSymbols;\n private readonly extractRelationsFn: typeof defaultExtractRelations;\n private readonly symbolSearchFn: typeof defaultSymbolSearch;\n private readonly relationSearchFn: typeof defaultRelationSearch;\n private readonly patternSearchFn: (opts: { pattern: string; filePaths: string[] }) => Promise<PatternMatch[]>;\n private readonly readFileFn: (filePath: string) => Promise<string>;\n private readonly unlinkFn: (filePath: string) => Promise<void>;\n private readonly existsSyncFn: (p: string) => boolean;\n private readonly makeExternalCoordinatorFn?: (packageDir: string, project: string) => { fullIndex(): Promise<IndexResult> };\n private readonly logger: Logger;\n private readonly defaultProject: string;\n /** Current watcher role: `'owner'` (can reindex) or `'reader'` (read-only). */\n readonly role: 'owner' | 'reader';\n private timer: ReturnType<typeof setInterval> | null = null;\n private signalHandlers: Array<[string, () => void]> = [];\n private closed = false;\n private tsconfigPaths: TsconfigPaths | null = null;\n private boundaries: ProjectBoundary[] = [];\n private readonly onIndexedCallbacks = new Set<(result: IndexResult) => void>();\n /** Cached DependencyGraph — invalidated on each index run. */\n private graphCache: DependencyGraph | null = null;\n /** Project key of the cached graph (`project ?? '__cross__'`). */\n private graphCacheKey: string | null = null;\n\n private constructor(opts: {\n projectRoot: string;\n db: Pick<DbConnection, 'open' | 'close' | 'transaction'> & WatcherOwnerStore;\n symbolRepo: SymbolRepository;\n relationRepo: RelationRepository;\n fileRepo: Pick<FileRepository, 'getFile' | 'getAllFiles'>;\n parseCache: Pick<ParseCache, 'set' | 'get' | 'invalidate'>;\n coordinator: (Pick<IndexCoordinator, 'fullIndex' | 'shutdown' | 'onIndexed'> & {\n tsconfigPaths?: Promise<TsconfigPaths | null>;\n handleWatcherEvent?(event: FileChangeEvent): void;\n }) | null;\n watcher: Pick<ProjectWatcher, 'start' | 'close'> | null;\n releaseWatcherRoleFn: typeof releaseWatcherRole;\n parseSourceFn: typeof defaultParseSource;\n extractSymbolsFn: typeof defaultExtractSymbols;\n extractRelationsFn: typeof defaultExtractRelations;\n symbolSearchFn: typeof defaultSymbolSearch;\n relationSearchFn: typeof defaultRelationSearch;\n patternSearchFn: (opts: { pattern: string; filePaths: string[] }) => Promise<PatternMatch[]>;\n readFileFn: (filePath: string) => Promise<string>;\n unlinkFn: (filePath: string) => Promise<void>;\n existsSyncFn: (p: string) => boolean;\n makeExternalCoordinatorFn?: (packageDir: string, project: string) => { fullIndex(): Promise<IndexResult> };\n logger: Logger;\n defaultProject: string;\n role: 'owner' | 'reader';\n }) {\n this.projectRoot = opts.projectRoot;\n this.db = opts.db;\n this.symbolRepo = opts.symbolRepo;\n this.relationRepo = opts.relationRepo;\n this.fileRepo = opts.fileRepo;\n this.parseCache = opts.parseCache;\n this.coordinator = opts.coordinator;\n this.watcher = opts.watcher;\n this.releaseWatcherRoleFn = opts.releaseWatcherRoleFn;\n this.parseSourceFn = opts.parseSourceFn;\n this.extractSymbolsFn = opts.extractSymbolsFn;\n this.extractRelationsFn = opts.extractRelationsFn;\n this.symbolSearchFn = opts.symbolSearchFn;\n this.relationSearchFn = opts.relationSearchFn;\n this.patternSearchFn = opts.patternSearchFn;\n this.readFileFn = opts.readFileFn;\n this.unlinkFn = opts.unlinkFn;\n this.existsSyncFn = opts.existsSyncFn;\n this.makeExternalCoordinatorFn = opts.makeExternalCoordinatorFn;\n this.logger = opts.logger;\n this.defaultProject = opts.defaultProject;\n this.role = opts.role;\n }\n\n /**\n * Create and initialise a new `Gildash` instance.\n *\n * Opens (or creates) a SQLite database alongside the project root,\n * discovers sub-projects, acquires a watcher role, performs initial indexing,\n * and begins watching for file changes.\n *\n * @param options - Configuration for the instance.\n * @returns A fully-initialised `Gildash` ready for queries, or an `Err<GildashError>` on failure.\n *\n * @example\n * ```ts\n * const result = await Gildash.open({\n * projectRoot: '/home/user/my-app',\n * extensions: ['.ts', '.tsx'],\n * });\n * if (isErr(result)) { console.error(result.data.message); process.exit(1); }\n * const ledger = result;\n * ```\n */\n static async open(options: GildashOptions & GildashInternalOptions): Promise<Result<Gildash, GildashError>> {\n const {\n projectRoot,\n extensions = ['.ts', '.mts', '.cts'],\n ignorePatterns = [],\n parseCacheCapacity = 500,\n logger = console,\n existsSyncFn = existsSync,\n dbConnectionFactory,\n watcherFactory,\n coordinatorFactory,\n repositoryFactory,\n acquireWatcherRoleFn = acquireWatcherRole,\n releaseWatcherRoleFn = releaseWatcherRole,\n updateHeartbeatFn = updateHeartbeat,\n discoverProjectsFn = discoverProjects,\n parseSourceFn = defaultParseSource,\n extractSymbolsFn = defaultExtractSymbols,\n extractRelationsFn = defaultExtractRelations,\n symbolSearchFn = defaultSymbolSearch,\n relationSearchFn = defaultRelationSearch,\n patternSearchFn = defaultPatternSearch,\n loadTsconfigPathsFn = loadTsconfigPaths,\n makeExternalCoordinatorFn,\n readFileFn = async (fp: string) => Bun.file(fp).text(),\n unlinkFn = async (fp: string) => { await Bun.file(fp).unlink(); },\n watchMode,\n } = options;\n\n if (!path.isAbsolute(projectRoot)) {\n return err(gildashError('validation', `Gildash: projectRoot must be an absolute path, got: \"${projectRoot}\"`))\n }\n if (!existsSyncFn(projectRoot)) {\n return err(gildashError('validation', `Gildash: projectRoot does not exist: \"${projectRoot}\"`))\n }\n\n const db = dbConnectionFactory\n ? dbConnectionFactory()\n : new DbConnection({ projectRoot });\n const openResult = db.open();\n if (isErr(openResult)) return openResult;\n try {\n\n const boundaries: ProjectBoundary[] = await discoverProjectsFn(projectRoot);\n const defaultProject = boundaries[0]?.project ?? path.basename(projectRoot);\n\n const repos = repositoryFactory\n ? repositoryFactory()\n : (() => {\n const connection = db as DbConnection;\n return {\n fileRepo: new FileRepository(connection),\n symbolRepo: new SymbolRepository(connection),\n relationRepo: new RelationRepository(connection),\n parseCache: new ParseCache(parseCacheCapacity),\n };\n })();\n\n const isWatchMode = watchMode ?? true;\n let role: 'owner' | 'reader';\n if (isWatchMode) {\n role = await Promise.resolve(\n acquireWatcherRoleFn(db, process.pid, {}),\n );\n } else {\n role = 'owner';\n }\n\n let coordinator: (Pick<IndexCoordinator, 'fullIndex' | 'shutdown' | 'onIndexed'> & {\n tsconfigPaths?: Promise<TsconfigPaths | null>;\n handleWatcherEvent?(event: FileChangeEvent): void;\n }) | null = null;\n let watcher: Pick<ProjectWatcher, 'start' | 'close'> | null = null;\n\n const instance = new Gildash({\n projectRoot,\n db,\n symbolRepo: repos.symbolRepo,\n relationRepo: repos.relationRepo,\n fileRepo: repos.fileRepo,\n parseCache: repos.parseCache,\n coordinator,\n watcher,\n releaseWatcherRoleFn: releaseWatcherRoleFn,\n parseSourceFn: parseSourceFn,\n extractSymbolsFn: extractSymbolsFn,\n extractRelationsFn: extractRelationsFn,\n symbolSearchFn: symbolSearchFn,\n relationSearchFn: relationSearchFn,\n patternSearchFn: patternSearchFn,\n readFileFn: readFileFn,\n unlinkFn: unlinkFn,\n existsSyncFn,\n makeExternalCoordinatorFn,\n logger,\n defaultProject,\n role,\n });\n clearTsconfigPathsCache(projectRoot);\n instance.tsconfigPaths = await loadTsconfigPathsFn(projectRoot);\n instance.boundaries = boundaries;\n if (role === 'owner') {\n const c = coordinatorFactory\n ? coordinatorFactory()\n : new IndexCoordinator({\n projectRoot,\n boundaries,\n extensions,\n ignorePatterns,\n dbConnection: db,\n parseCache: repos.parseCache,\n fileRepo: repos.fileRepo,\n symbolRepo: repos.symbolRepo,\n relationRepo: repos.relationRepo,\n logger,\n });\n\n instance.coordinator = c;\n c.onIndexed(() => instance.invalidateGraphCache());\n\n if (isWatchMode) {\n const w = watcherFactory\n ? watcherFactory()\n : new ProjectWatcher({ projectRoot, ignorePatterns, extensions }, undefined, logger);\n\n instance.watcher = w;\n\n await w.start((event) => c.handleWatcherEvent?.(event)).then((startResult) => {\n if (isErr(startResult)) throw startResult.data;\n });\n\n const timer = setInterval(() => {\n updateHeartbeatFn(db, process.pid);\n }, HEARTBEAT_INTERVAL_MS);\n instance.timer = timer;\n }\n\n await c.fullIndex();\n } else {\n let retryCount = 0;\n const healthcheck = async () => {\n try {\n const newRole = await Promise.resolve(\n acquireWatcherRoleFn(db, process.pid, {}),\n );\n retryCount = 0;\n if (newRole === 'owner') {\n clearInterval(instance.timer!);\n instance.timer = null;\n let promotedWatcher: Pick<ProjectWatcher, 'start' | 'close'> | null = null;\n let promotedCoordinator: (Pick<IndexCoordinator, 'fullIndex' | 'shutdown' | 'onIndexed'> & {\n tsconfigPaths?: Promise<TsconfigPaths | null>;\n handleWatcherEvent?(event: FileChangeEvent): void;\n }) | null = null;\n try {\n promotedWatcher = watcherFactory\n ? watcherFactory()\n : new ProjectWatcher({ projectRoot, ignorePatterns, extensions }, undefined, logger);\n promotedCoordinator = coordinatorFactory\n ? coordinatorFactory()\n : new IndexCoordinator({\n projectRoot,\n boundaries,\n extensions,\n ignorePatterns,\n dbConnection: db,\n parseCache: repos.parseCache,\n fileRepo: repos.fileRepo,\n symbolRepo: repos.symbolRepo,\n relationRepo: repos.relationRepo,\n logger,\n });\n for (const cb of instance.onIndexedCallbacks) {\n promotedCoordinator.onIndexed(cb);\n }\n promotedCoordinator.onIndexed(() => instance.invalidateGraphCache());\n await promotedWatcher.start((event) => promotedCoordinator?.handleWatcherEvent?.(event)).then((startResult) => {\n if (isErr(startResult)) throw startResult.data;\n });\n const hbTimer = setInterval(() => {\n updateHeartbeatFn(db, process.pid);\n }, HEARTBEAT_INTERVAL_MS);\n instance.timer = hbTimer;\n instance.coordinator = promotedCoordinator;\n instance.watcher = promotedWatcher;\n await promotedCoordinator.fullIndex();\n } catch (setupErr) {\n logger.error('[Gildash] owner promotion failed, reverting to reader', setupErr);\n if (promotedWatcher) {\n const closeResult = await promotedWatcher.close();\n if (isErr(closeResult)) logger.error('[Gildash] watcher close error during promotion rollback', closeResult.data);\n instance.watcher = null;\n }\n if (promotedCoordinator) {\n await promotedCoordinator.shutdown().catch((e) =>\n logger.error('[Gildash] coordinator shutdown error during promotion rollback', e),\n );\n instance.coordinator = null;\n }\n if (instance.timer === null) {\n instance.timer = setInterval(healthcheck, HEALTHCHECK_INTERVAL_MS);\n }\n }\n }\n } catch (err) {\n retryCount++;\n logger.error('[Gildash] healthcheck error', err);\n if (retryCount >= MAX_HEALTHCHECK_RETRIES) {\n logger.error('[Gildash] healthcheck failed too many times, shutting down');\n clearInterval(instance.timer!);\n instance.timer = null;\n instance.close().catch((closeErr) =>\n logger.error('[Gildash] close error during healthcheck shutdown', closeErr),\n );\n }\n }\n };\n const timer = setInterval(healthcheck, HEALTHCHECK_INTERVAL_MS);\n instance.timer = timer;\n }\n\n if (isWatchMode) {\n const signals: Array<NodeJS.Signals | 'beforeExit'> = ['SIGTERM', 'SIGINT', 'beforeExit'];\n for (const sig of signals) {\n const handler = () => { instance.close().catch(err => logger.error('[Gildash] close error during signal', sig, err)); };\n if (sig === 'beforeExit') {\n process.on('beforeExit', handler);\n } else {\n process.on(sig, handler);\n }\n instance.signalHandlers.push([sig, handler]);\n }\n }\n\n return instance;\n } catch (error) {\n db.close();\n return err(gildashError('store', 'Gildash: initialization failed', error));\n }\n }\n\n /**\n * Shut down the instance and release all resources.\n *\n * Stops the file watcher, shuts down the index coordinator,\n * releases the watcher ownership role, and closes the database.\n * Calling `close()` more than once is safe (subsequent calls are no-ops).\n *\n * @returns `void` on success, or `Err<GildashError>` with `type='close'` if one or more\n * sub-systems failed during shutdown. The `cause` field contains an array of\n * individual errors from each failed sub-system.\n *\n * @example\n * ```ts\n * const closeResult = await ledger.close();\n * if (isErr(closeResult)) {\n * console.error('Close failed:', closeResult.data.message);\n * // closeResult.data.cause is unknown[] of per-subsystem errors\n * }\n * ```\n */\n async close(opts?: { cleanup?: boolean }): Promise<Result<void, GildashError>> {\n if (this.closed) return;\n this.closed = true;\n\n const closeErrors: unknown[] = [];\n\n for (const [sig, handler] of this.signalHandlers) {\n if (sig === 'beforeExit') {\n process.off('beforeExit', handler);\n } else {\n process.off(sig as NodeJS.Signals, handler);\n }\n }\n this.signalHandlers = [];\n\n if (this.coordinator) {\n try {\n await this.coordinator.shutdown();\n } catch (err) {\n closeErrors.push(err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n if (this.watcher) {\n const closeResult = await this.watcher.close();\n if (isErr(closeResult)) closeErrors.push(closeResult.data);\n }\n\n if (this.timer !== null) {\n clearInterval(this.timer);\n this.timer = null;\n }\n\n try {\n this.releaseWatcherRoleFn(this.db, process.pid);\n } catch (err) {\n closeErrors.push(err instanceof Error ? err : new Error(String(err)));\n }\n\n try {\n this.db.close();\n } catch (err) {\n closeErrors.push(err instanceof Error ? err : new Error(String(err)));\n }\n\n if (opts?.cleanup) {\n for (const ext of ['', '-wal', '-shm']) {\n try {\n await this.unlinkFn(path.join(this.projectRoot, '.zipbul', 'gildash.db' + ext));\n } catch {}\n }\n }\n\n if (closeErrors.length > 0) {\n return err(gildashError('close', 'Gildash: one or more errors occurred during close()', closeErrors));\n }\n }\n\n /**\n * Register a callback that fires after each indexing run completes.\n *\n * @param callback - Receives the {@link IndexResult} for the completed run.\n * @returns An unsubscribe function. Call it to remove the listener.\n *\n * @example\n * ```ts\n * const off = ledger.onIndexed(result => {\n * console.log(`Indexed ${result.filesProcessed} files`);\n * });\n * // later…\n * off();\n * ```\n */\n onIndexed(callback: (result: IndexResult) => void): () => void {\n this.onIndexedCallbacks.add(callback);\n if (!this.coordinator) {\n return () => { this.onIndexedCallbacks.delete(callback); };\n }\n const unsubscribe = this.coordinator.onIndexed(callback);\n return () => {\n this.onIndexedCallbacks.delete(callback);\n unsubscribe();\n };\n }\n\n /**\n * Parse a TypeScript source string into an AST and cache the result.\n *\n * On success the result is automatically stored in the internal LRU parse cache\n * so that subsequent calls to extraction methods can reuse it.\n *\n * @param filePath - File path used as the cache key and for diagnostics.\n * @param sourceText - Raw TypeScript source code.\n * @returns A {@link ParsedFile}, or `Err<GildashError>` with `type='closed'` if the instance\n * is closed, or `type='parse'` if the parser fails.\n *\n * @example\n * ```ts\n * const parsed = ledger.parseSource('/project/src/app.ts', sourceCode);\n * if (isErr(parsed)) {\n * console.error(parsed.data.message); // e.g. \"Failed to parse file: ...\"\n * return;\n * }\n * // parsed is now a ParsedFile\n * const symbols = ledger.extractSymbols(parsed);\n * ```\n */\n parseSource(filePath: string, sourceText: string): Result<ParsedFile, GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n const result = this.parseSourceFn(filePath, sourceText);\n if (isErr(result)) return result;\n this.parseCache.set(filePath, result);\n return result;\n }\n\n /**\n * Extract all symbol declarations from a previously parsed file.\n *\n * Returns function, class, variable, type-alias, interface, and enum declarations\n * found in the AST.\n *\n * @param parsed - A {@link ParsedFile} obtained from {@link parseSource}.\n * @returns An array of {@link ExtractedSymbol} entries, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed.\n *\n * @example\n * ```ts\n * const symbols = ledger.extractSymbols(parsed);\n * if (isErr(symbols)) return;\n * for (const sym of symbols) {\n * console.log(`${sym.kind}: ${sym.name}`);\n * }\n * ```\n */\n extractSymbols(parsed: ParsedFile): Result<ExtractedSymbol[], GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n return this.extractSymbolsFn(parsed);\n }\n\n /**\n * Extract inter-file relationships (imports, calls, extends, implements)\n * from a previously parsed file.\n *\n * If tsconfig path aliases were discovered during {@link Gildash.open},\n * they are automatically applied when resolving import targets.\n *\n * @param parsed - A {@link ParsedFile} obtained from {@link parseSource}.\n * @returns An array of {@link CodeRelation} entries, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed.\n *\n * @example\n * ```ts\n * const relations = ledger.extractRelations(parsed);\n * if (isErr(relations)) return;\n * const imports = relations.filter(r => r.type === 'imports');\n * ```\n */\n extractRelations(parsed: ParsedFile): Result<CodeRelation[], GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n return this.extractRelationsFn(\n parsed.program,\n parsed.filePath,\n this.tsconfigPaths ?? undefined,\n );\n }\n\n /** Invalidate the cached DependencyGraph (called after every index run). */\n private invalidateGraphCache(): void {\n this.graphCache = null;\n this.graphCacheKey = null;\n }\n\n /**\n * Return a cached or freshly-built {@link DependencyGraph} for the given project.\n *\n * Builds once per `project ?? '__cross__'` key; subsequent calls with the same key\n * return the cached instance. Cache is invalidated by {@link invalidateGraphCache}.\n */\n private getOrBuildGraph(project?: string): DependencyGraph {\n const key = project ?? '__cross__';\n if (this.graphCache && this.graphCacheKey === key) {\n return this.graphCache;\n }\n const g = new DependencyGraph({\n relationRepo: this.relationRepo,\n project: project ?? this.defaultProject,\n });\n g.build();\n this.graphCache = g;\n this.graphCacheKey = key;\n return g;\n }\n\n /**\n * Trigger a full re-index of all tracked files.\n *\n * Only available to the instance that holds the *owner* role.\n * Reader instances receive `Err<GildashError>` with `type='closed'`.\n *\n * @returns An {@link IndexResult} summary on success, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed / reader,\n * `type='index'` if the indexing pipeline fails.\n *\n * @example\n * ```ts\n * const result = await ledger.reindex();\n * if (isErr(result)) {\n * console.error(result.data.message);\n * return;\n * }\n * console.log(`Indexed ${result.indexedFiles} files in ${result.durationMs}ms`);\n * ```\n */\n async reindex(): Promise<Result<IndexResult, GildashError>> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n if (!this.coordinator) {\n return err(gildashError('closed', 'Gildash: reindex() is not available for readers'));\n }\n try {\n const result = await this.coordinator.fullIndex();\n this.invalidateGraphCache();\n return result;\n } catch (e) {\n return err(gildashError('index', 'Gildash: reindex failed', e));\n }\n }\n\n /**\n * Discovered project boundaries within the project root.\n *\n * Each entry contains a project name and its root directory.\n */\n get projects(): ProjectBoundary[] {\n return [...this.boundaries];\n }\n\n /**\n * Return aggregate symbol statistics for the given project.\n *\n * @param project - Project name. Defaults to the auto-discovered primary project.\n * @returns A {@link SymbolStats} object with counts grouped by symbol kind,\n * or `Err<GildashError>` with `type='closed'` if the instance is closed,\n * `type='store'` if the database query fails.\n *\n * @example\n * ```ts\n * const stats = ledger.getStats();\n * if (isErr(stats)) return;\n * console.log(`Files: ${stats.fileCount}, Symbols: ${stats.symbolCount}`);\n * ```\n */\n getStats(project?: string): Result<SymbolStats, GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n return this.symbolRepo.getStats(project ?? this.defaultProject);\n } catch (e) {\n return err(gildashError('store', 'Gildash: getStats failed', e));\n }\n }\n\n /**\n * Search indexed symbols by name, kind, file path, or export status.\n *\n * @param query - Search filters (see {@link SymbolSearchQuery}). All fields are optional;\n * omitted fields match everything.\n * @returns An array of {@link SymbolSearchResult} entries, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed,\n * `type='search'` if the query fails.\n *\n * @example\n * ```ts\n * const fns = ledger.searchSymbols({ kind: 'function', isExported: true });\n * if (isErr(fns)) return;\n * fns.forEach(fn => console.log(fn.name, fn.filePath));\n * ```\n */\n searchSymbols(query: SymbolSearchQuery): Result<SymbolSearchResult[], GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n return this.symbolSearchFn({ symbolRepo: this.symbolRepo, project: this.defaultProject, query });\n } catch (e) {\n return err(gildashError('search', 'Gildash: searchSymbols failed', e));\n }\n }\n\n /**\n * Search indexed code relationships (imports, calls, extends, implements).\n *\n * @param query - Search filters (see {@link RelationSearchQuery}). All fields are optional.\n * @returns An array of {@link CodeRelation} entries, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed,\n * `type='search'` if the query fails.\n *\n * @example\n * ```ts\n * const rels = ledger.searchRelations({ srcFilePath: 'src/app.ts', type: 'imports' });\n * if (isErr(rels)) return;\n * rels.forEach(r => console.log(`${r.srcFilePath} -> ${r.dstFilePath}`));\n * ```\n */\n searchRelations(query: RelationSearchQuery): Result<CodeRelation[], GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n return this.relationSearchFn({ relationRepo: this.relationRepo, project: this.defaultProject, query });\n } catch (e) {\n return err(gildashError('search', 'Gildash: searchRelations failed', e));\n }\n }\n\n /**\n * Search symbols across all projects (no project filter).\n *\n * @param query - Search filters (see {@link SymbolSearchQuery}). The `project` field is ignored.\n * @returns An array of {@link SymbolSearchResult} entries, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed,\n * `type='search'` if the query fails.\n */\n searchAllSymbols(query: Omit<SymbolSearchQuery, 'project'> & { project?: string }): Result<SymbolSearchResult[], GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n return this.symbolSearchFn({ symbolRepo: this.symbolRepo, project: undefined, query });\n } catch (e) {\n return err(gildashError('search', 'Gildash: searchAllSymbols failed', e));\n }\n }\n\n /**\n * Search relations across all projects (no project filter).\n *\n * @param query - Search filters (see {@link RelationSearchQuery}). The `project` field is ignored.\n * @returns An array of {@link CodeRelation} entries, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed,\n * `type='search'` if the query fails.\n */\n searchAllRelations(query: RelationSearchQuery): Result<CodeRelation[], GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n return this.relationSearchFn({ relationRepo: this.relationRepo, project: undefined, query });\n } catch (e) {\n return err(gildashError('search', 'Gildash: searchAllRelations failed', e));\n }\n }\n\n /**\n * List all files indexed for a given project.\n *\n * @param project - Project name. Defaults to the primary project.\n * @returns An array of {@link FileRecord} entries, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed,\n * `type='store'` if the repository query fails.\n */\n listIndexedFiles(project?: string): Result<FileRecord[], GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n return this.fileRepo.getAllFiles(project ?? this.defaultProject);\n } catch (e) {\n return err(gildashError('store', 'Gildash: listIndexedFiles failed', e));\n }\n }\n\n /**\n * Get all intra-file relations for a given file (relations where both source and destination\n * are within the same file).\n *\n * @param filePath - Path of the file to query.\n * @param project - Project name. Defaults to the primary project.\n * @returns An array of {@link CodeRelation} entries, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed,\n * `type='search'` if the query fails.\n */\n getInternalRelations(filePath: string, project?: string): Result<CodeRelation[], GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n return this.relationSearchFn({\n relationRepo: this.relationRepo,\n project: project ?? this.defaultProject,\n query: { srcFilePath: filePath, dstFilePath: filePath, limit: 10_000 },\n });\n } catch (e) {\n return err(gildashError('search', 'Gildash: getInternalRelations failed', e));\n }\n }\n\n /**\n * Compare two snapshots of symbol search results and return a structured diff.\n *\n * Symbols are keyed by `name::filePath`. A symbol is:\n * - **added** if it appears only in `after`\n * - **removed** if it appears only in `before`\n * - **modified** if it appears in both but with a different `fingerprint`\n * - **unchanged** otherwise\n *\n * @param before - Snapshot of symbols before the change.\n * @param after - Snapshot of symbols after the change.\n * @returns A {@link SymbolDiff} object.\n */\n diffSymbols(\n before: SymbolSearchResult[],\n after: SymbolSearchResult[],\n ): SymbolDiff {\n const beforeMap = new Map<string, SymbolSearchResult>(before.map(s => [`${s.name}::${s.filePath}`, s]));\n const afterMap = new Map<string, SymbolSearchResult>(after.map(s => [`${s.name}::${s.filePath}`, s]));\n const added: SymbolSearchResult[] = [];\n const removed: SymbolSearchResult[] = [];\n const modified: Array<{ before: SymbolSearchResult; after: SymbolSearchResult }> = [];\n for (const [key, afterSym] of afterMap) {\n const beforeSym = beforeMap.get(key);\n if (!beforeSym) {\n added.push(afterSym);\n } else if (beforeSym.fingerprint !== afterSym.fingerprint) {\n modified.push({ before: beforeSym, after: afterSym });\n }\n }\n for (const [key, beforeSym] of beforeMap) {\n if (!afterMap.has(key)) removed.push(beforeSym);\n }\n return { added, removed, modified };\n }\n\n /**\n * List the files that a given file directly imports.\n *\n * @param filePath - Absolute path of the source file.\n * @param project - Project name. Defaults to the primary project.\n * @param limit - Maximum results. Defaults to `10_000`.\n * @returns An array of absolute paths that `filePath` imports,\n * or `Err<GildashError>` with `type='closed'` / `type='search'`.\n *\n * @example\n * ```ts\n * const deps = ledger.getDependencies('/project/src/app.ts');\n * if (isErr(deps)) return;\n * console.log('Imports:', deps.join(', '));\n * ```\n */\n getDependencies(filePath: string, project?: string, limit = 10_000): Result<string[], GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n return this.relationSearchFn({\n relationRepo: this.relationRepo,\n project: project ?? this.defaultProject,\n query: { srcFilePath: filePath, type: 'imports', project: project ?? this.defaultProject, limit },\n }).map(r => r.dstFilePath);\n } catch (e) {\n return err(gildashError('search', 'Gildash: getDependencies failed', e));\n }\n }\n\n /**\n * List the files that directly import a given file.\n *\n * @param filePath - Absolute path of the target file.\n * @param project - Project name. Defaults to the primary project.\n * @param limit - Maximum results. Defaults to `10_000`.\n * @returns An array of absolute paths of files that import `filePath`,\n * or `Err<GildashError>` with `type='closed'` / `type='search'`.\n *\n * @example\n * ```ts\n * const dependents = ledger.getDependents('/project/src/utils.ts');\n * if (isErr(dependents)) return;\n * console.log('Imported by:', dependents.join(', '));\n * ```\n */\n getDependents(filePath: string, project?: string, limit = 10_000): Result<string[], GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n return this.relationSearchFn({\n relationRepo: this.relationRepo,\n project: project ?? this.defaultProject,\n query: { dstFilePath: filePath, type: 'imports', project: project ?? this.defaultProject, limit },\n }).map(r => r.srcFilePath);\n } catch (e) {\n return err(gildashError('search', 'Gildash: getDependents failed', e));\n }\n }\n\n /**\n * Compute the full set of files transitively affected by changes.\n *\n * Internally builds a full {@link DependencyGraph} and walks all reverse\n * edges from each changed file to find every transitive dependent.\n *\n * @param changedFiles - Absolute paths of files that changed.\n * @param project - Project name. Defaults to the primary project.\n * @returns De-duplicated absolute paths of all transitively-dependent files\n * (excluding the changed files themselves), or `Err<GildashError>` with\n * `type='closed'` / `type='search'`.\n *\n * @example\n * ```ts\n * const affected = await ledger.getAffected(['/project/src/utils.ts']);\n * if (isErr(affected)) return;\n * console.log('Affected files:', affected.length);\n * ```\n */\n async getAffected(changedFiles: string[], project?: string): Promise<Result<string[], GildashError>> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n const g = this.getOrBuildGraph(project);\n return g.getAffectedByChange(changedFiles);\n } catch (e) {\n return err(gildashError('search', 'Gildash: getAffected failed', e));\n }\n }\n\n /**\n * Check whether the import graph contains a circular dependency.\n *\n * Internally builds a full {@link DependencyGraph} and runs iterative DFS\n * cycle detection.\n *\n * @param project - Project name. Defaults to the primary project.\n * @returns `true` if at least one cycle exists, `false` otherwise,\n * or `Err<GildashError>` with `type='closed'` / `type='search'`.\n *\n * @example\n * ```ts\n * const cycleResult = await ledger.hasCycle();\n * if (isErr(cycleResult)) return;\n * if (cycleResult) {\n * console.warn('Circular dependency detected!');\n * }\n * ```\n */\n async hasCycle(project?: string): Promise<Result<boolean, GildashError>> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n const g = this.getOrBuildGraph(project);\n return g.hasCycle();\n } catch (e) {\n return err(gildashError('search', 'Gildash: hasCycle failed', e));\n }\n }\n\n /**\n * Return the full import graph for a project as an adjacency list.\n *\n * Builds a {@link DependencyGraph} and exposes its internal adjacency list.\n * Each file appears as a key; its value lists the files it directly imports.\n * Files that are imported but do not themselves import appear as keys with empty arrays.\n *\n * @param project - Project name. Defaults to the primary project.\n * @returns A `Map<filePath, importedFilePaths[]>`, or `Err<GildashError>` with\n * `type='closed'` / `type='search'`.\n */\n async getImportGraph(project?: string): Promise<Result<Map<string, string[]>, GildashError>> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n const g = this.getOrBuildGraph(project);\n return g.getAdjacencyList();\n } catch (e) {\n return err(gildashError('search', 'Gildash: getImportGraph failed', e));\n }\n }\n\n /**\n * Return all files that `filePath` transitively imports (forward BFS).\n *\n * @param filePath - Absolute path of the starting file.\n * @param project - Project name. Defaults to the primary project.\n * @returns An array of file paths that `filePath` directly or indirectly imports,\n * or `Err<GildashError>` with `type='closed'` / `type='search'`.\n */\n async getTransitiveDependencies(filePath: string, project?: string): Promise<Result<string[], GildashError>> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n const g = this.getOrBuildGraph(project);\n return g.getTransitiveDependencies(filePath);\n } catch (e) {\n return err(gildashError('search', 'Gildash: getTransitiveDependencies failed', e));\n }\n }\n\n /**\n * Return all cycle paths in the import graph.\n *\n * Uses DFS with canonical form deduplication.\n *\n * @param project - Project name. Defaults to the primary project.\n * @returns An array of cycle paths (`string[][]`), each starting at the lexicographically\n * smallest node in the cycle. Returns `[]` if no cycles exist.\n * Returns `Err<GildashError>` with `type='closed'` / `type='search'`.\n */\n async getCyclePaths(project?: string): Promise<Result<string[][], GildashError>> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n const g = this.getOrBuildGraph(project);\n return g.getCyclePaths();\n } catch (e) {\n return err(gildashError('search', 'Gildash: getCyclePaths failed', e));\n }\n }\n\n /**\n * Find exported symbols that are never imported anywhere in the project.\n *\n * A symbol is considered \"dead\" if no `imports` or `re-exports` relation in the\n * project references it by name (matching both `dstFilePath` and `dstSymbolName`).\n * Exports from entry-point files are excluded by default.\n *\n * @param project - Project name. Defaults to the primary project.\n * @param opts.entryPoints - File paths whose exports are excluded from dead-export detection.\n * Defaults to files named `index.ts`, `index.mts`, or `main.ts` anywhere in the project.\n * Pass `[]` to disable all entry-point filtering.\n * @returns An array of `{ symbolName, filePath }` for dead exports,\n * or `Err<GildashError>` with `type='closed'` / `type='store'`.\n */\n getDeadExports(\n project?: string,\n opts?: { entryPoints?: string[] },\n ): Result<Array<{ symbolName: string; filePath: string }>, GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n const effectiveProject = project ?? this.defaultProject;\n\n // 1. Collect all exported symbols\n const exports = this.symbolRepo.searchByQuery({\n project: effectiveProject,\n isExported: true,\n limit: 100_000,\n });\n\n // 2. Collect (dstFilePath::dstSymbolName) from imports + re-exports relations\n const importedSymbols = new Set<string>();\n for (const relType of ['imports', 're-exports'] as const) {\n const relations = this.relationRepo.getByType(effectiveProject, relType);\n for (const rel of relations) {\n if (rel.dstSymbolName != null) {\n importedSymbols.add(`${rel.dstFilePath}::${rel.dstSymbolName}`);\n }\n }\n }\n\n // 3. Determine entry-point file paths to exclude\n const entryPoints = opts?.entryPoints;\n const defaultEntryBasenames = ['index.ts', 'index.mts', 'main.ts'];\n\n // 4. Filter dead exports\n const dead = exports\n .filter((sym) => {\n // Skip if already imported\n if (importedSymbols.has(`${sym.filePath}::${sym.name}`)) return false;\n\n // Skip if from an entry-point file\n if (entryPoints !== undefined) {\n // User-supplied list (may be empty → no exclusions)\n return !entryPoints.includes(sym.filePath);\n }\n // Default: exclude files whose basename matches the default entry names\n const basename = sym.filePath.split('/').pop() ?? sym.filePath;\n return !defaultEntryBasenames.includes(basename);\n })\n .map((sym) => ({ symbolName: sym.name, filePath: sym.filePath }));\n\n return dead;\n } catch (e) {\n return err(gildashError('store', 'Gildash: getDeadExports failed', e));\n }\n }\n\n /**\n * Retrieve full details for a named symbol in a specific file,\n * including members, documentation, and type information.\n *\n * @param symbolName - Exact symbol name to look up.\n * @param filePath - Absolute path of the file containing the symbol.\n * @param project - Project scope override (defaults to `defaultProject`).\n * @returns A {@link FullSymbol} on success, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed,\n * `type='search'` if the symbol is not found or the query fails.\n */\n getFullSymbol(\n symbolName: string,\n filePath: string,\n project?: string,\n ): Result<FullSymbol, GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n const effectiveProject = project ?? this.defaultProject;\n const results = this.symbolSearchFn({\n symbolRepo: this.symbolRepo,\n project: effectiveProject,\n query: { text: symbolName, exact: true, filePath, limit: 1 },\n });\n if (results.length === 0) {\n return err(gildashError('search', `Gildash: symbol '${symbolName}' not found in '${filePath}'`));\n }\n const sym = results[0]!;\n const d = sym.detail;\n const full: FullSymbol = {\n ...sym,\n members: Array.isArray(d.members) ? (d.members as FullSymbol['members']) : undefined,\n jsDoc: typeof d.jsDoc === 'string' ? d.jsDoc : undefined,\n parameters: typeof d.parameters === 'string' ? d.parameters : undefined,\n returnType: typeof d.returnType === 'string' ? d.returnType : undefined,\n heritage: Array.isArray(d.heritage) ? (d.heritage as string[]) : undefined,\n decorators: Array.isArray(d.decorators) ? (d.decorators as FullSymbol['decorators']) : undefined,\n typeParameters: typeof d.typeParameters === 'string' ? d.typeParameters : undefined,\n };\n return full;\n } catch (e) {\n return err(gildashError('search', 'Gildash: getFullSymbol failed', e));\n }\n }\n\n /**\n * Retrieve statistics for an indexed file (line count, symbol count, etc.).\n *\n * @param filePath - Absolute path of the file to query.\n * @param project - Project scope override (defaults to `defaultProject`).\n * @returns A {@link FileStats} on success, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed,\n * `type='search'` if the file is not in the index,\n * `type='store'` if the query throws.\n */\n getFileStats(\n filePath: string,\n project?: string,\n ): Result<FileStats, GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n const effectiveProject = project ?? this.defaultProject;\n const fileRecord = this.fileRepo.getFile(effectiveProject, filePath);\n if (!fileRecord) {\n return err(gildashError('search', `Gildash: file '${filePath}' is not in the index`));\n }\n const symbols = this.symbolRepo.getFileSymbols(effectiveProject, filePath);\n const relations = this.relationRepo.getOutgoing(effectiveProject, filePath);\n return {\n filePath: fileRecord.filePath,\n lineCount: fileRecord.lineCount ?? 0,\n size: fileRecord.size,\n symbolCount: symbols.length,\n exportedSymbolCount: symbols.filter((s) => s.isExported).length,\n relationCount: relations.length,\n };\n } catch (e) {\n return err(gildashError('store', 'Gildash: getFileStats failed', e));\n }\n }\n\n /**\n * Compute import-graph fan metrics (fan-in / fan-out) for a single file.\n *\n * Builds a full {@link DependencyGraph} each call (O(relations)).\n * For repeated calls, consider caching the graph externally.\n *\n * @param filePath - Absolute path of the file to query.\n * @param project - Project scope override (defaults to `defaultProject`).\n * @returns A {@link FanMetrics} on success, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed,\n * `type='search'` if the graph build fails.\n */\n async getFanMetrics(\n filePath: string,\n project?: string,\n ): Promise<Result<FanMetrics, GildashError>> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n const g = this.getOrBuildGraph(project);\n return {\n filePath,\n fanIn: g.getDependents(filePath).length,\n fanOut: g.getDependencies(filePath).length,\n };\n } catch (e) {\n return err(gildashError('search', 'Gildash: getFanMetrics failed', e));\n }\n }\n\n /**\n * Resolve the original definition location of a symbol by following its re-export chain.\n *\n * Traverses `re-exports` relations iteratively until no further hop is found or a\n * circular chain is detected.\n *\n * @param symbolName - The exported name to resolve.\n * @param filePath - The file from which the symbol is exported.\n * @param project - Project scope override (defaults to `defaultProject`).\n * @returns A {@link ResolvedSymbol} on success, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed,\n * `type='search'` if a circular re-export chain is detected.\n */\n resolveSymbol(\n symbolName: string,\n filePath: string,\n project?: string,\n ): Result<ResolvedSymbol, GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n const effectiveProject = project ?? this.defaultProject;\n const visited = new Set<string>();\n const chain: Array<{ filePath: string; exportedAs: string }> = [];\n\n let currentName = symbolName;\n let currentFile = filePath;\n\n for (;;) {\n const key = `${currentFile}::${currentName}`;\n if (visited.has(key)) {\n return err(gildashError('search', 'Gildash: resolveSymbol detected circular re-export chain'));\n }\n visited.add(key);\n\n const rels = this.relationSearchFn({\n relationRepo: this.relationRepo,\n project: effectiveProject,\n query: { type: 're-exports', srcFilePath: currentFile, limit: 500 },\n }) as CodeRelation[];\n\n let nextFile: string | undefined;\n let nextName: string | undefined;\n\n for (const rel of rels) {\n let specifiers: Array<{ local: string; exported: string }> | undefined;\n if (rel.metaJson) {\n try {\n const meta = JSON.parse(rel.metaJson) as Record<string, unknown>;\n if (Array.isArray(meta['specifiers'])) {\n specifiers = meta['specifiers'] as Array<{ local: string; exported: string }>;\n }\n } catch { /* ignore malformed metaJson */ }\n }\n if (!specifiers) continue;\n const match = specifiers.find((s) => s.exported === currentName);\n if (!match) continue;\n nextFile = rel.dstFilePath;\n nextName = match.local;\n break;\n }\n\n if (!nextFile || !nextName) {\n return { originalName: currentName, originalFilePath: currentFile, reExportChain: chain };\n }\n\n chain.push({ filePath: currentFile, exportedAs: currentName });\n currentFile = nextFile;\n currentName = nextName;\n }\n }\n\n /**\n * Search for an AST structural pattern across indexed TypeScript files.\n *\n * Uses ast-grep's `findInFiles` under the hood. Provide `opts.filePaths` to\n * limit search scope; otherwise all files tracked by the project index are searched.\n *\n * @param pattern - ast-grep structural pattern (e.g. `'console.log($$$)'`).\n * @param opts - Optional scope: file paths and/or project override.\n * @returns An array of {@link PatternMatch} on success, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed,\n * `type='search'` if the underlying search fails.\n */\n async findPattern(\n pattern: string,\n opts?: { filePaths?: string[]; project?: string },\n ): Promise<Result<PatternMatch[], GildashError>> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n const effectiveProject = opts?.project ?? this.defaultProject;\n const filePaths: string[] = opts?.filePaths\n ? opts.filePaths\n : this.fileRepo.getAllFiles(effectiveProject).map((f) => f.filePath);\n\n return await this.patternSearchFn({ pattern, filePaths });\n } catch (e) {\n return err(gildashError('search', 'Gildash: findPattern failed', e));\n }\n }\n\n /**\n * Index the TypeScript type declarations (`.d.ts` files) of one or more\n * `node_modules` packages.\n *\n * Each package is indexed under a dedicated `@external/<packageName>` project\n * so it does not pollute the main project index. Subsequent calls re-index\n * (incremental diff) the same package.\n *\n * @param packages - Package names as they appear in `node_modules/`\n * (e.g. `['react', 'typescript']`).\n * @param opts - Optional overrides (unused currently, reserved for future use).\n * @returns An array of {@link IndexResult} — one per package — on success,\n * or `Err<GildashError>` with:\n * - `type='closed'` if the instance is closed or in reader mode,\n * - `type='validation'` if a requested package is not found in `node_modules/`,\n * - `type='store'` if indexing fails at runtime.\n */\n async indexExternalPackages(\n packages: string[],\n opts?: { project?: string },\n ): Promise<Result<IndexResult[], GildashError>> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n if (this.role !== 'owner') {\n return err(gildashError('closed', 'Gildash: indexExternalPackages() is not available for readers'));\n }\n try {\n const results: IndexResult[] = [];\n for (const packageName of packages) {\n const packageDir = path.resolve(this.projectRoot, 'node_modules', packageName);\n if (!this.existsSyncFn(packageDir)) {\n return err(gildashError('validation', `Gildash: package not found in node_modules: ${packageName}`));\n }\n const project = `@external/${packageName}`;\n const coordinator = this.makeExternalCoordinatorFn\n ? this.makeExternalCoordinatorFn(packageDir, project)\n : new IndexCoordinator({\n projectRoot: packageDir,\n boundaries: [{ dir: '.', project }],\n extensions: ['.d.ts'],\n ignorePatterns: [],\n dbConnection: this.db,\n parseCache: this.parseCache,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fileRepo: this.fileRepo as any,\n symbolRepo: this.symbolRepo,\n relationRepo: this.relationRepo,\n logger: this.logger,\n });\n const result = await coordinator.fullIndex();\n results.push(result);\n }\n return results;\n } catch (e) {\n return err(gildashError('store', 'Gildash: indexExternalPackages failed', e));\n }\n }\n\n /**\n * Parse multiple files concurrently and return a map of results.\n *\n * Files that fail to read or parse are silently excluded from the result map.\n * The operation does not fail even if every file fails — it returns an empty `Map`.\n *\n * @param filePaths - Absolute paths of files to parse.\n * @returns A `Map<filePath, ParsedFile>` for every successfully-parsed file,\n * or `Err<GildashError>` with `type='closed'` if the instance is closed.\n */\n async batchParse(filePaths: string[]): Promise<Result<Map<string, ParsedFile>, GildashError>> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n const result = new Map<string, ParsedFile>();\n await Promise.all(\n filePaths.map(async (fp) => {\n try {\n const text = await this.readFileFn(fp);\n const parsed = this.parseSourceFn(fp, text);\n if (!isErr(parsed)) {\n result.set(fp, parsed as ParsedFile);\n }\n } catch {\n // silently exclude failed files\n }\n }),\n );\n return result;\n }\n\n /**\n * Return the public interface of a module: all exported symbols with key metadata.\n *\n * @param filePath - Absolute path of the file.\n * @param project - Project name. Defaults to the primary project.\n * @returns A {@link ModuleInterface} object, or `Err<GildashError>` with\n * `type='closed'` / `type='search'`.\n */\n getModuleInterface(filePath: string, project?: string): Result<ModuleInterface, GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n const symbols = this.symbolSearchFn({\n symbolRepo: this.symbolRepo,\n project: project ?? this.defaultProject,\n query: { filePath, isExported: true },\n }) as SymbolSearchResult[];\n const exports = symbols.map((s) => ({\n name: s.name,\n kind: s.kind,\n parameters: (s.detail.parameters as string | undefined) ?? undefined,\n returnType: (s.detail.returnType as string | undefined) ?? undefined,\n jsDoc: (s.detail.jsDoc as string | undefined) ?? undefined,\n }));\n return { filePath, exports };\n } catch (e) {\n return err(gildashError('search', 'Gildash: getModuleInterface failed', e));\n }\n }\n\n /**\n * Recursively traverse `extends`/`implements` relations to build a heritage tree.\n *\n * The root node represents `symbolName`/`filePath`. Its `children` are the symbols\n * it extends or implements, and so on transitively. A visited set prevents cycles.\n *\n * @param symbolName - Name of the starting symbol.\n * @param filePath - Absolute path of the file containing the symbol.\n * @param project - Project name. Defaults to the primary project.\n * @returns A {@link HeritageNode} tree, or `Err<GildashError>` with\n * `type='closed'` / `type='search'`.\n */\n async getHeritageChain(\n symbolName: string,\n filePath: string,\n project?: string,\n ): Promise<Result<HeritageNode, GildashError>> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n const proj = project ?? this.defaultProject;\n const visited = new Set<string>();\n\n const buildNode = (symName: string, fp: string, kind?: 'extends' | 'implements'): HeritageNode => {\n const key = `${symName}::${fp}`;\n if (visited.has(key)) {\n return { symbolName: symName, filePath: fp, kind, children: [] };\n }\n visited.add(key);\n\n const rels = this.relationSearchFn({\n relationRepo: this.relationRepo,\n project: proj,\n query: { srcFilePath: fp, srcSymbolName: symName, limit: 1000 },\n }) as CodeRelation[];\n\n const heritageRels = rels.filter(\n (r): r is CodeRelation & { type: 'extends' | 'implements' } =>\n r.type === 'extends' || r.type === 'implements',\n );\n\n const children = heritageRels\n .filter((r) => r.dstSymbolName != null)\n .map((r) => buildNode(r.dstSymbolName!, r.dstFilePath, r.type));\n\n return { symbolName: symName, filePath: fp, kind, children };\n };\n\n return buildNode(symbolName, filePath);\n } catch (e) {\n return err(gildashError('search', 'Gildash: getHeritageChain failed', e));\n }\n }\n\n /**\n * Retrieve a previously-parsed AST from the internal LRU cache.\n *\n * Returns `undefined` if the file has not been parsed or was evicted from the cache.\n * The returned object is shared with the internal cache — treat it as **read-only**.\n *\n * @param filePath - Absolute path of the file.\n * @returns The cached {@link ParsedFile}, or `undefined` if not available.\n */\n getParsedAst(filePath: string): ParsedFile | undefined {\n if (this.closed) return undefined;\n return this.parseCache.get(filePath);\n }\n\n /**\n * Retrieve metadata for an indexed file.\n *\n * Returns the stored {@link FileRecord} including content hash, mtime, and size.\n * Returns `null` if the file has not been indexed yet.\n *\n * @param filePath - Relative path from project root (as stored in the index).\n * @param project - Project name. Defaults to the primary project.\n * @returns The {@link FileRecord}, or `null` if not found.\n */\n getFileInfo(filePath: string, project?: string): Result<FileRecord | null, GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n return this.fileRepo.getFile(project ?? this.defaultProject, filePath);\n } catch (e) {\n return err(gildashError('store', 'Gildash: getFileInfo failed', e));\n }\n }\n\n /**\n * List all symbols declared in a specific file.\n *\n * Convenience wrapper around {@link searchSymbols} with a `filePath` filter.\n *\n * @param filePath - File path to query.\n * @param project - Project name. Defaults to the primary project.\n * @returns An array of {@link SymbolSearchResult} entries, or `Err<GildashError>`.\n */\n getSymbolsByFile(filePath: string, project?: string): Result<SymbolSearchResult[], GildashError> {\n return this.searchSymbols({ filePath, project: project ?? undefined, limit: 10_000 });\n }\n}\n",
6
- "import { err, type Result } from '@zipbul/result';\nimport { parseSync as defaultParseSync } from 'oxc-parser';\nimport type { ParsedFile } from './types';\nimport { gildashError, type GildashError } from '../errors';\n\nexport function parseSource(\n filePath: string,\n sourceText: string,\n parseSyncFn: typeof defaultParseSync = defaultParseSync,\n): Result<ParsedFile, GildashError> {\n try {\n const { program, errors, comments } = parseSyncFn(filePath, sourceText);\n return { filePath, program: program as ParsedFile['program'], errors, comments, sourceText };\n } catch (e) {\n return err(gildashError('parse', `Failed to parse file: ${filePath}`, e));\n }\n}\n",
5
+ "import { err, isErr, type Result } from '@zipbul/result';\nimport path from 'node:path';\nimport { existsSync } from 'node:fs';\nimport type { ParsedFile } from './parser/types';\nimport { parseSource as defaultParseSource } from './parser/parse-source';\nimport { ParseCache } from './parser/parse-cache';\nimport type { ExtractedSymbol, SymbolKind, CodeRelation } from './extractor/types';\nimport { extractSymbols as defaultExtractSymbols } from './extractor/symbol-extractor';\nimport { extractRelations as defaultExtractRelations } from './extractor/relation-extractor';\nimport { DbConnection } from './store/connection';\nimport { FileRepository } from './store/repositories/file.repository';\nimport type { FileRecord } from './store/repositories/file.repository';\nimport { SymbolRepository } from './store/repositories/symbol.repository';\nimport { RelationRepository } from './store/repositories/relation.repository';\nimport { ProjectWatcher } from './watcher/project-watcher';\nimport { IndexCoordinator } from './indexer/index-coordinator';\nimport type { IndexResult } from './indexer/index-coordinator';\nimport type { IndexCoordinatorOptions } from './indexer/index-coordinator';\nimport type { FileChangeEvent } from './watcher/types';\nimport { acquireWatcherRole, releaseWatcherRole, updateHeartbeat } from './watcher/ownership';\nimport type { WatcherOwnerStore } from './watcher/ownership';\nimport { discoverProjects } from './common/project-discovery';\nimport type { ProjectBoundary } from './common/project-discovery';\nimport { loadTsconfigPaths, clearTsconfigPathsCache } from './common/tsconfig-resolver';\nimport type { TsconfigPaths } from './common/tsconfig-resolver';\nimport type { ParserOptions } from 'oxc-parser';\nimport { symbolSearch as defaultSymbolSearch } from './search/symbol-search';\nimport type { SymbolSearchQuery, SymbolSearchResult } from './search/symbol-search';\nimport { relationSearch as defaultRelationSearch } from './search/relation-search';\nimport type { RelationSearchQuery } from './search/relation-search';\nimport type { SymbolStats } from './store/repositories/symbol.repository';\nimport { DependencyGraph } from './search/dependency-graph';\nimport { patternSearch as defaultPatternSearch } from './search/pattern-search';\nimport type { PatternMatch } from './search/pattern-search';\nimport { gildashError, type GildashError } from './errors';\n\nconst HEARTBEAT_INTERVAL_MS = 30_000;\nconst HEALTHCHECK_INTERVAL_MS = 60_000;\nconst MAX_HEALTHCHECK_RETRIES = 10;\n\n/**\n * Minimal logger interface accepted by {@link Gildash}.\n *\n * Any object with an `error` method (including `console`) satisfies this interface.\n */\nexport interface Logger {\n /** Log one or more error-level messages. */\n error(...args: unknown[]): void;\n}\n\n/**\n * Result of a {@link Gildash.diffSymbols} call.\n */\nexport interface SymbolDiff {\n /** Symbols present in `after` but not in `before`. */\n added: SymbolSearchResult[];\n /** Symbols present in `before` but not in `after`. */\n removed: SymbolSearchResult[];\n /** Symbols present in both but with a different `fingerprint`. */\n modified: Array<{ before: SymbolSearchResult; after: SymbolSearchResult }>;\n}\n\n/**\n * Public interface of a module — its exported symbols with key metadata.\n * Returned by {@link Gildash.getModuleInterface}.\n */\nexport interface ModuleInterface {\n filePath: string;\n exports: Array<{\n name: string;\n kind: SymbolKind;\n parameters?: string;\n returnType?: string;\n jsDoc?: string;\n }>;\n}\n\n/**\n * A node in the heritage chain tree returned by {@link Gildash.getHeritageChain}.\n */\nexport interface HeritageNode {\n symbolName: string;\n filePath: string;\n /** Relationship kind (`extends` or `implements`). Undefined for the root query node. */\n kind?: 'extends' | 'implements';\n children: HeritageNode[];\n}\n\n/**\n * Full symbol detail including members, documentation, and type information.\n * Returned by {@link Gildash.getFullSymbol}.\n */\nexport interface FullSymbol extends SymbolSearchResult { /** Class/interface members (methods, properties, constructors, accessors). */\n members?: Array<{\n name: string;\n kind: string;\n type?: string;\n visibility?: string;\n isStatic?: boolean;\n isReadonly?: boolean;\n }>;\n /** JSDoc comment attached to the symbol. */\n jsDoc?: string;\n /** Stringified parameter list (functions/methods). */\n parameters?: string;\n /** Stringified return type (functions/methods). */\n returnType?: string;\n /** Superclass/interface names (classes/interfaces with heritage). */\n heritage?: string[];\n /** Decorators applied to the symbol. */\n decorators?: Array<{ name: string; arguments?: string }>;\n /** Stringified type parameters (generic symbols). */\n typeParameters?: string;\n}\n\n/**\n * File-level statistics for an indexed file.\n * Returned by {@link Gildash.getFileStats}.\n */\nexport interface FileStats {\n /** Absolute file path. */\n filePath: string;\n /** Number of lines in the file at the time of last indexing. */\n lineCount: number;\n /** Number of symbols indexed in the file. */\n symbolCount: number;\n /** Number of outgoing relations (imports, calls, etc.) from the file. */\n relationCount: number;\n /** File size in bytes at the time of last indexing. */\n size: number;\n /** Number of exported symbols in the file. */\n exportedSymbolCount: number;\n}\n\n/**\n * Import-graph fan metrics for a single file.\n * Returned by {@link Gildash.getFanMetrics}.\n */\nexport interface FanMetrics {\n /** Absolute file path queried. */\n filePath: string;\n /** Number of files that import this file (fan-in). */\n fanIn: number;\n /** Number of files this file imports (fan-out). */\n fanOut: number;\n}\n\n/**\n * Result of following a re-export chain to the original symbol definition.\n */\nexport interface ResolvedSymbol {\n /** The name of the symbol at the end of the re-export chain (may differ from the queried name due to aliasing). */\n originalName: string;\n /** Absolute path of the file that originally defines the symbol. */\n originalFilePath: string;\n /** Ordered list of re-export hops between the queried file and the original definition. */\n reExportChain: Array<{ filePath: string; exportedAs: string }>;\n}\n\n/**\n * Options for creating a {@link Gildash} instance via {@link Gildash.open}.\n *\n * @example\n * ```ts\n * import { isErr } from '@zipbul/result';\n *\n * const result = await Gildash.open({\n * projectRoot: '/absolute/path/to/project',\n * extensions: ['.ts', '.tsx'],\n * ignorePatterns: ['vendor'],\n * });\n * if (isErr(result)) {\n * console.error(result.data.message);\n * process.exit(1);\n * }\n * const ledger = result;\n * ```\n */\nexport interface GildashOptions {\n /** Absolute path to the project root directory. */\n projectRoot: string;\n /** File extensions to index. Defaults to `['.ts', '.mts', '.cts']`. */\n extensions?: string[];\n /** Glob patterns to ignore during indexing. */\n ignorePatterns?: string[];\n /** Maximum number of parsed ASTs to keep in the LRU cache. Defaults to `500`. */\n parseCacheCapacity?: number;\n /** Logger for error output. Defaults to `console`. */\n logger?: Logger;\n /**\n * When `false`, disables the file watcher and runs in scan-only mode:\n * ownership contention is skipped, heartbeat and signal handlers are not\n * registered, and only the initial `fullIndex()` is performed.\n *\n * Set `cleanup: true` in {@link Gildash.close} to remove the database files\n * after a one-shot scan.\n *\n * @default true\n */\n watchMode?: boolean;\n}\n\ninterface GildashInternalOptions {\n existsSyncFn?: (p: string) => boolean;\n dbConnectionFactory?: () => Pick<DbConnection, 'open' | 'close' | 'transaction'> & WatcherOwnerStore;\n watcherFactory?: () => Pick<ProjectWatcher, 'start' | 'close'>;\n coordinatorFactory?: () => Pick<IndexCoordinator, 'fullIndex' | 'shutdown' | 'onIndexed'> & {\n tsconfigPaths?: Promise<TsconfigPaths | null>;\n handleWatcherEvent?(event: FileChangeEvent): void;\n };\n repositoryFactory?: () => {\n fileRepo: Pick<FileRepository, 'upsertFile' | 'getAllFiles' | 'getFilesMap' | 'deleteFile' | 'getFile'>;\n symbolRepo: SymbolRepository;\n relationRepo: RelationRepository;\n parseCache: Pick<ParseCache, 'set' | 'get' | 'invalidate'>;\n };\n acquireWatcherRoleFn?: typeof acquireWatcherRole;\n releaseWatcherRoleFn?: typeof releaseWatcherRole;\n updateHeartbeatFn?: typeof updateHeartbeat;\n discoverProjectsFn?: typeof discoverProjects;\n parseSourceFn?: typeof defaultParseSource;\n extractSymbolsFn?: typeof defaultExtractSymbols;\n extractRelationsFn?: typeof defaultExtractRelations;\n symbolSearchFn?: typeof defaultSymbolSearch;\n relationSearchFn?: typeof defaultRelationSearch;\n patternSearchFn?: (opts: { pattern: string; filePaths: string[] }) => Promise<PatternMatch[]>;\n loadTsconfigPathsFn?: typeof loadTsconfigPaths;\n readFileFn?: (filePath: string) => Promise<string>;\n unlinkFn?: (filePath: string) => Promise<void>;\n makeExternalCoordinatorFn?: (packageDir: string, project: string) => { fullIndex(): Promise<IndexResult> };\n}\n\n/**\n * Main entry point for gildash.\n *\n * `Gildash` indexes TypeScript source code into a local SQLite database,\n * watches for file changes, and provides search / dependency-graph queries.\n *\n * Every public method returns a `Result<T, GildashError>` — either the\n * success value `T` directly, or an `Err<GildashError>` that can be checked\n * with `isErr()` from `@zipbul/result`.\n *\n * Create an instance with the static {@link Gildash.open} factory.\n * Always call {@link Gildash.close} when done to release resources.\n *\n * @example\n * ```ts\n * import { Gildash } from '@zipbul/gildash';\n * import { isErr } from '@zipbul/result';\n *\n * const result = await Gildash.open({ projectRoot: '/my/project' });\n * if (isErr(result)) {\n * console.error(result.data.message);\n * process.exit(1);\n * }\n * const ledger = result;\n *\n * const symbols = ledger.searchSymbols({ text: 'handle', kind: 'function' });\n * if (!isErr(symbols)) {\n * symbols.forEach(s => console.log(s.name));\n * }\n *\n * await ledger.close();\n * ```\n */\nexport class Gildash {\n /** Absolute path to the indexed project root. */\n readonly projectRoot: string;\n\n private readonly db: Pick<DbConnection, 'open' | 'close' | 'transaction'> & WatcherOwnerStore;\n private readonly symbolRepo: SymbolRepository;\n private readonly relationRepo: RelationRepository;\n private readonly fileRepo: Pick<FileRepository, 'getFile' | 'getAllFiles'>;\n private readonly parseCache: Pick<ParseCache, 'set' | 'get' | 'invalidate'>;\n private coordinator: (Pick<IndexCoordinator, 'fullIndex' | 'shutdown' | 'onIndexed'> & {\n tsconfigPaths?: Promise<TsconfigPaths | null>;\n handleWatcherEvent?(event: FileChangeEvent): void;\n }) | null;\n private watcher: Pick<ProjectWatcher, 'start' | 'close'> | null;\n private readonly releaseWatcherRoleFn: typeof releaseWatcherRole;\n private readonly parseSourceFn: typeof defaultParseSource;\n private readonly extractSymbolsFn: typeof defaultExtractSymbols;\n private readonly extractRelationsFn: typeof defaultExtractRelations;\n private readonly symbolSearchFn: typeof defaultSymbolSearch;\n private readonly relationSearchFn: typeof defaultRelationSearch;\n private readonly patternSearchFn: (opts: { pattern: string; filePaths: string[] }) => Promise<PatternMatch[]>;\n private readonly readFileFn: (filePath: string) => Promise<string>;\n private readonly unlinkFn: (filePath: string) => Promise<void>;\n private readonly existsSyncFn: (p: string) => boolean;\n private readonly makeExternalCoordinatorFn?: (packageDir: string, project: string) => { fullIndex(): Promise<IndexResult> };\n private readonly logger: Logger;\n private readonly defaultProject: string;\n /** Current watcher role: `'owner'` (can reindex) or `'reader'` (read-only). */\n readonly role: 'owner' | 'reader';\n private timer: ReturnType<typeof setInterval> | null = null;\n private signalHandlers: Array<[string, () => void]> = [];\n private closed = false;\n private tsconfigPaths: TsconfigPaths | null = null;\n private boundaries: ProjectBoundary[] = [];\n private readonly onIndexedCallbacks = new Set<(result: IndexResult) => void>();\n /** Cached DependencyGraph — invalidated on each index run. */\n private graphCache: DependencyGraph | null = null;\n /** Project key of the cached graph (`project ?? '__cross__'`). */\n private graphCacheKey: string | null = null;\n\n private constructor(opts: {\n projectRoot: string;\n db: Pick<DbConnection, 'open' | 'close' | 'transaction'> & WatcherOwnerStore;\n symbolRepo: SymbolRepository;\n relationRepo: RelationRepository;\n fileRepo: Pick<FileRepository, 'getFile' | 'getAllFiles'>;\n parseCache: Pick<ParseCache, 'set' | 'get' | 'invalidate'>;\n coordinator: (Pick<IndexCoordinator, 'fullIndex' | 'shutdown' | 'onIndexed'> & {\n tsconfigPaths?: Promise<TsconfigPaths | null>;\n handleWatcherEvent?(event: FileChangeEvent): void;\n }) | null;\n watcher: Pick<ProjectWatcher, 'start' | 'close'> | null;\n releaseWatcherRoleFn: typeof releaseWatcherRole;\n parseSourceFn: typeof defaultParseSource;\n extractSymbolsFn: typeof defaultExtractSymbols;\n extractRelationsFn: typeof defaultExtractRelations;\n symbolSearchFn: typeof defaultSymbolSearch;\n relationSearchFn: typeof defaultRelationSearch;\n patternSearchFn: (opts: { pattern: string; filePaths: string[] }) => Promise<PatternMatch[]>;\n readFileFn: (filePath: string) => Promise<string>;\n unlinkFn: (filePath: string) => Promise<void>;\n existsSyncFn: (p: string) => boolean;\n makeExternalCoordinatorFn?: (packageDir: string, project: string) => { fullIndex(): Promise<IndexResult> };\n logger: Logger;\n defaultProject: string;\n role: 'owner' | 'reader';\n }) {\n this.projectRoot = opts.projectRoot;\n this.db = opts.db;\n this.symbolRepo = opts.symbolRepo;\n this.relationRepo = opts.relationRepo;\n this.fileRepo = opts.fileRepo;\n this.parseCache = opts.parseCache;\n this.coordinator = opts.coordinator;\n this.watcher = opts.watcher;\n this.releaseWatcherRoleFn = opts.releaseWatcherRoleFn;\n this.parseSourceFn = opts.parseSourceFn;\n this.extractSymbolsFn = opts.extractSymbolsFn;\n this.extractRelationsFn = opts.extractRelationsFn;\n this.symbolSearchFn = opts.symbolSearchFn;\n this.relationSearchFn = opts.relationSearchFn;\n this.patternSearchFn = opts.patternSearchFn;\n this.readFileFn = opts.readFileFn;\n this.unlinkFn = opts.unlinkFn;\n this.existsSyncFn = opts.existsSyncFn;\n this.makeExternalCoordinatorFn = opts.makeExternalCoordinatorFn;\n this.logger = opts.logger;\n this.defaultProject = opts.defaultProject;\n this.role = opts.role;\n }\n\n /**\n * Create and initialise a new `Gildash` instance.\n *\n * Opens (or creates) a SQLite database alongside the project root,\n * discovers sub-projects, acquires a watcher role, performs initial indexing,\n * and begins watching for file changes.\n *\n * @param options - Configuration for the instance.\n * @returns A fully-initialised `Gildash` ready for queries, or an `Err<GildashError>` on failure.\n *\n * @example\n * ```ts\n * const result = await Gildash.open({\n * projectRoot: '/home/user/my-app',\n * extensions: ['.ts', '.tsx'],\n * });\n * if (isErr(result)) { console.error(result.data.message); process.exit(1); }\n * const ledger = result;\n * ```\n */\n static async open(options: GildashOptions & GildashInternalOptions): Promise<Result<Gildash, GildashError>> {\n const {\n projectRoot,\n extensions = ['.ts', '.mts', '.cts'],\n ignorePatterns = [],\n parseCacheCapacity = 500,\n logger = console,\n existsSyncFn = existsSync,\n dbConnectionFactory,\n watcherFactory,\n coordinatorFactory,\n repositoryFactory,\n acquireWatcherRoleFn = acquireWatcherRole,\n releaseWatcherRoleFn = releaseWatcherRole,\n updateHeartbeatFn = updateHeartbeat,\n discoverProjectsFn = discoverProjects,\n parseSourceFn = defaultParseSource,\n extractSymbolsFn = defaultExtractSymbols,\n extractRelationsFn = defaultExtractRelations,\n symbolSearchFn = defaultSymbolSearch,\n relationSearchFn = defaultRelationSearch,\n patternSearchFn = defaultPatternSearch,\n loadTsconfigPathsFn = loadTsconfigPaths,\n makeExternalCoordinatorFn,\n readFileFn = async (fp: string) => Bun.file(fp).text(),\n unlinkFn = async (fp: string) => { await Bun.file(fp).unlink(); },\n watchMode,\n } = options;\n\n if (!path.isAbsolute(projectRoot)) {\n return err(gildashError('validation', `Gildash: projectRoot must be an absolute path, got: \"${projectRoot}\"`))\n }\n if (!existsSyncFn(projectRoot)) {\n return err(gildashError('validation', `Gildash: projectRoot does not exist: \"${projectRoot}\"`))\n }\n\n const db = dbConnectionFactory\n ? dbConnectionFactory()\n : new DbConnection({ projectRoot });\n const openResult = db.open();\n if (isErr(openResult)) return openResult;\n try {\n\n const boundaries: ProjectBoundary[] = await discoverProjectsFn(projectRoot);\n const defaultProject = boundaries[0]?.project ?? path.basename(projectRoot);\n\n const repos = repositoryFactory\n ? repositoryFactory()\n : (() => {\n const connection = db as DbConnection;\n return {\n fileRepo: new FileRepository(connection),\n symbolRepo: new SymbolRepository(connection),\n relationRepo: new RelationRepository(connection),\n parseCache: new ParseCache(parseCacheCapacity),\n };\n })();\n\n const isWatchMode = watchMode ?? true;\n let role: 'owner' | 'reader';\n if (isWatchMode) {\n role = await Promise.resolve(\n acquireWatcherRoleFn(db, process.pid, {}),\n );\n } else {\n role = 'owner';\n }\n\n let coordinator: (Pick<IndexCoordinator, 'fullIndex' | 'shutdown' | 'onIndexed'> & {\n tsconfigPaths?: Promise<TsconfigPaths | null>;\n handleWatcherEvent?(event: FileChangeEvent): void;\n }) | null = null;\n let watcher: Pick<ProjectWatcher, 'start' | 'close'> | null = null;\n\n const instance = new Gildash({\n projectRoot,\n db,\n symbolRepo: repos.symbolRepo,\n relationRepo: repos.relationRepo,\n fileRepo: repos.fileRepo,\n parseCache: repos.parseCache,\n coordinator,\n watcher,\n releaseWatcherRoleFn: releaseWatcherRoleFn,\n parseSourceFn: parseSourceFn,\n extractSymbolsFn: extractSymbolsFn,\n extractRelationsFn: extractRelationsFn,\n symbolSearchFn: symbolSearchFn,\n relationSearchFn: relationSearchFn,\n patternSearchFn: patternSearchFn,\n readFileFn: readFileFn,\n unlinkFn: unlinkFn,\n existsSyncFn,\n makeExternalCoordinatorFn,\n logger,\n defaultProject,\n role,\n });\n clearTsconfigPathsCache(projectRoot);\n instance.tsconfigPaths = await loadTsconfigPathsFn(projectRoot);\n instance.boundaries = boundaries;\n if (role === 'owner') {\n const c = coordinatorFactory\n ? coordinatorFactory()\n : new IndexCoordinator({\n projectRoot,\n boundaries,\n extensions,\n ignorePatterns,\n dbConnection: db,\n parseCache: repos.parseCache,\n fileRepo: repos.fileRepo,\n symbolRepo: repos.symbolRepo,\n relationRepo: repos.relationRepo,\n logger,\n });\n\n instance.coordinator = c;\n c.onIndexed(() => instance.invalidateGraphCache());\n\n if (isWatchMode) {\n const w = watcherFactory\n ? watcherFactory()\n : new ProjectWatcher({ projectRoot, ignorePatterns, extensions }, undefined, logger);\n\n instance.watcher = w;\n\n await w.start((event) => c.handleWatcherEvent?.(event)).then((startResult) => {\n if (isErr(startResult)) throw startResult.data;\n });\n\n const timer = setInterval(() => {\n updateHeartbeatFn(db, process.pid);\n }, HEARTBEAT_INTERVAL_MS);\n instance.timer = timer;\n }\n\n await c.fullIndex();\n } else {\n let retryCount = 0;\n const healthcheck = async () => {\n try {\n const newRole = await Promise.resolve(\n acquireWatcherRoleFn(db, process.pid, {}),\n );\n retryCount = 0;\n if (newRole === 'owner') {\n clearInterval(instance.timer!);\n instance.timer = null;\n let promotedWatcher: Pick<ProjectWatcher, 'start' | 'close'> | null = null;\n let promotedCoordinator: (Pick<IndexCoordinator, 'fullIndex' | 'shutdown' | 'onIndexed'> & {\n tsconfigPaths?: Promise<TsconfigPaths | null>;\n handleWatcherEvent?(event: FileChangeEvent): void;\n }) | null = null;\n try {\n promotedWatcher = watcherFactory\n ? watcherFactory()\n : new ProjectWatcher({ projectRoot, ignorePatterns, extensions }, undefined, logger);\n promotedCoordinator = coordinatorFactory\n ? coordinatorFactory()\n : new IndexCoordinator({\n projectRoot,\n boundaries,\n extensions,\n ignorePatterns,\n dbConnection: db,\n parseCache: repos.parseCache,\n fileRepo: repos.fileRepo,\n symbolRepo: repos.symbolRepo,\n relationRepo: repos.relationRepo,\n logger,\n });\n for (const cb of instance.onIndexedCallbacks) {\n promotedCoordinator.onIndexed(cb);\n }\n promotedCoordinator.onIndexed(() => instance.invalidateGraphCache());\n await promotedWatcher.start((event) => promotedCoordinator?.handleWatcherEvent?.(event)).then((startResult) => {\n if (isErr(startResult)) throw startResult.data;\n });\n const hbTimer = setInterval(() => {\n updateHeartbeatFn(db, process.pid);\n }, HEARTBEAT_INTERVAL_MS);\n instance.timer = hbTimer;\n instance.coordinator = promotedCoordinator;\n instance.watcher = promotedWatcher;\n await promotedCoordinator.fullIndex();\n } catch (setupErr) {\n logger.error('[Gildash] owner promotion failed, reverting to reader', setupErr);\n if (promotedWatcher) {\n const closeResult = await promotedWatcher.close();\n if (isErr(closeResult)) logger.error('[Gildash] watcher close error during promotion rollback', closeResult.data);\n instance.watcher = null;\n }\n if (promotedCoordinator) {\n await promotedCoordinator.shutdown().catch((e) =>\n logger.error('[Gildash] coordinator shutdown error during promotion rollback', e),\n );\n instance.coordinator = null;\n }\n if (instance.timer === null) {\n instance.timer = setInterval(healthcheck, HEALTHCHECK_INTERVAL_MS);\n }\n }\n }\n } catch (err) {\n retryCount++;\n logger.error('[Gildash] healthcheck error', err);\n if (retryCount >= MAX_HEALTHCHECK_RETRIES) {\n logger.error('[Gildash] healthcheck failed too many times, shutting down');\n clearInterval(instance.timer!);\n instance.timer = null;\n instance.close().catch((closeErr) =>\n logger.error('[Gildash] close error during healthcheck shutdown', closeErr),\n );\n }\n }\n };\n const timer = setInterval(healthcheck, HEALTHCHECK_INTERVAL_MS);\n instance.timer = timer;\n }\n\n if (isWatchMode) {\n const signals: Array<NodeJS.Signals | 'beforeExit'> = ['SIGTERM', 'SIGINT', 'beforeExit'];\n for (const sig of signals) {\n const handler = () => { instance.close().catch(err => logger.error('[Gildash] close error during signal', sig, err)); };\n if (sig === 'beforeExit') {\n process.on('beforeExit', handler);\n } else {\n process.on(sig, handler);\n }\n instance.signalHandlers.push([sig, handler]);\n }\n }\n\n return instance;\n } catch (error) {\n db.close();\n return err(gildashError('store', 'Gildash: initialization failed', error));\n }\n }\n\n /**\n * Shut down the instance and release all resources.\n *\n * Stops the file watcher, shuts down the index coordinator,\n * releases the watcher ownership role, and closes the database.\n * Calling `close()` more than once is safe (subsequent calls are no-ops).\n *\n * @returns `void` on success, or `Err<GildashError>` with `type='close'` if one or more\n * sub-systems failed during shutdown. The `cause` field contains an array of\n * individual errors from each failed sub-system.\n *\n * @example\n * ```ts\n * const closeResult = await ledger.close();\n * if (isErr(closeResult)) {\n * console.error('Close failed:', closeResult.data.message);\n * // closeResult.data.cause is unknown[] of per-subsystem errors\n * }\n * ```\n */\n async close(opts?: { cleanup?: boolean }): Promise<Result<void, GildashError>> {\n if (this.closed) return;\n this.closed = true;\n\n const closeErrors: unknown[] = [];\n\n for (const [sig, handler] of this.signalHandlers) {\n if (sig === 'beforeExit') {\n process.off('beforeExit', handler);\n } else {\n process.off(sig as NodeJS.Signals, handler);\n }\n }\n this.signalHandlers = [];\n\n if (this.coordinator) {\n try {\n await this.coordinator.shutdown();\n } catch (err) {\n closeErrors.push(err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n if (this.watcher) {\n const closeResult = await this.watcher.close();\n if (isErr(closeResult)) closeErrors.push(closeResult.data);\n }\n\n if (this.timer !== null) {\n clearInterval(this.timer);\n this.timer = null;\n }\n\n try {\n this.releaseWatcherRoleFn(this.db, process.pid);\n } catch (err) {\n closeErrors.push(err instanceof Error ? err : new Error(String(err)));\n }\n\n try {\n this.db.close();\n } catch (err) {\n closeErrors.push(err instanceof Error ? err : new Error(String(err)));\n }\n\n if (opts?.cleanup) {\n for (const ext of ['', '-wal', '-shm']) {\n try {\n await this.unlinkFn(path.join(this.projectRoot, '.zipbul', 'gildash.db' + ext));\n } catch {}\n }\n }\n\n if (closeErrors.length > 0) {\n return err(gildashError('close', 'Gildash: one or more errors occurred during close()', closeErrors));\n }\n }\n\n /**\n * Register a callback that fires after each indexing run completes.\n *\n * @param callback - Receives the {@link IndexResult} for the completed run.\n * @returns An unsubscribe function. Call it to remove the listener.\n *\n * @example\n * ```ts\n * const off = ledger.onIndexed(result => {\n * console.log(`Indexed ${result.filesProcessed} files`);\n * });\n * // later…\n * off();\n * ```\n */\n onIndexed(callback: (result: IndexResult) => void): () => void {\n this.onIndexedCallbacks.add(callback);\n if (!this.coordinator) {\n return () => { this.onIndexedCallbacks.delete(callback); };\n }\n const unsubscribe = this.coordinator.onIndexed(callback);\n return () => {\n this.onIndexedCallbacks.delete(callback);\n unsubscribe();\n };\n }\n\n /**\n * Parse a TypeScript source string into an AST and cache the result.\n *\n * On success the result is automatically stored in the internal LRU parse cache\n * so that subsequent calls to extraction methods can reuse it.\n *\n * @param filePath - File path used as the cache key and for diagnostics.\n * @param sourceText - Raw TypeScript source code.\n * @param options - Optional oxc-parser {@link ParserOptions} (e.g. `sourceType`, `lang`).\n * @returns A {@link ParsedFile}, or `Err<GildashError>` with `type='closed'` if the instance\n * is closed, or `type='parse'` if the parser fails.\n *\n * @example\n * ```ts\n * const parsed = ledger.parseSource('/project/src/app.ts', sourceCode);\n * if (isErr(parsed)) {\n * console.error(parsed.data.message); // e.g. \"Failed to parse file: ...\"\n * return;\n * }\n * // parsed is now a ParsedFile\n * const symbols = ledger.extractSymbols(parsed);\n * ```\n */\n parseSource(filePath: string, sourceText: string, options?: ParserOptions): Result<ParsedFile, GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n const result = this.parseSourceFn(filePath, sourceText, options);\n if (isErr(result)) return result;\n this.parseCache.set(filePath, result);\n return result;\n }\n\n /**\n * Extract all symbol declarations from a previously parsed file.\n *\n * Returns function, class, variable, type-alias, interface, and enum declarations\n * found in the AST.\n *\n * @param parsed - A {@link ParsedFile} obtained from {@link parseSource}.\n * @returns An array of {@link ExtractedSymbol} entries, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed.\n *\n * @example\n * ```ts\n * const symbols = ledger.extractSymbols(parsed);\n * if (isErr(symbols)) return;\n * for (const sym of symbols) {\n * console.log(`${sym.kind}: ${sym.name}`);\n * }\n * ```\n */\n extractSymbols(parsed: ParsedFile): Result<ExtractedSymbol[], GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n return this.extractSymbolsFn(parsed);\n }\n\n /**\n * Extract inter-file relationships (imports, calls, extends, implements)\n * from a previously parsed file.\n *\n * If tsconfig path aliases were discovered during {@link Gildash.open},\n * they are automatically applied when resolving import targets.\n *\n * @param parsed - A {@link ParsedFile} obtained from {@link parseSource}.\n * @returns An array of {@link CodeRelation} entries, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed.\n *\n * @example\n * ```ts\n * const relations = ledger.extractRelations(parsed);\n * if (isErr(relations)) return;\n * const imports = relations.filter(r => r.type === 'imports');\n * ```\n */\n extractRelations(parsed: ParsedFile): Result<CodeRelation[], GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n return this.extractRelationsFn(\n parsed.program,\n parsed.filePath,\n this.tsconfigPaths ?? undefined,\n );\n }\n\n /** Invalidate the cached DependencyGraph (called after every index run). */\n private invalidateGraphCache(): void {\n this.graphCache = null;\n this.graphCacheKey = null;\n }\n\n /**\n * Return a cached or freshly-built {@link DependencyGraph} for the given project.\n *\n * Builds once per `project ?? '__cross__'` key; subsequent calls with the same key\n * return the cached instance. Cache is invalidated by {@link invalidateGraphCache}.\n */\n private getOrBuildGraph(project?: string): DependencyGraph {\n const key = project ?? '__cross__';\n if (this.graphCache && this.graphCacheKey === key) {\n return this.graphCache;\n }\n const g = new DependencyGraph({\n relationRepo: this.relationRepo,\n project: project ?? this.defaultProject,\n });\n g.build();\n this.graphCache = g;\n this.graphCacheKey = key;\n return g;\n }\n\n /**\n * Trigger a full re-index of all tracked files.\n *\n * Only available to the instance that holds the *owner* role.\n * Reader instances receive `Err<GildashError>` with `type='closed'`.\n *\n * @returns An {@link IndexResult} summary on success, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed / reader,\n * `type='index'` if the indexing pipeline fails.\n *\n * @example\n * ```ts\n * const result = await ledger.reindex();\n * if (isErr(result)) {\n * console.error(result.data.message);\n * return;\n * }\n * console.log(`Indexed ${result.indexedFiles} files in ${result.durationMs}ms`);\n * ```\n */\n async reindex(): Promise<Result<IndexResult, GildashError>> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n if (!this.coordinator) {\n return err(gildashError('closed', 'Gildash: reindex() is not available for readers'));\n }\n try {\n const result = await this.coordinator.fullIndex();\n this.invalidateGraphCache();\n return result;\n } catch (e) {\n return err(gildashError('index', 'Gildash: reindex failed', e));\n }\n }\n\n /**\n * Discovered project boundaries within the project root.\n *\n * Each entry contains a project name and its root directory.\n */\n get projects(): ProjectBoundary[] {\n return [...this.boundaries];\n }\n\n /**\n * Return aggregate symbol statistics for the given project.\n *\n * @param project - Project name. Defaults to the auto-discovered primary project.\n * @returns A {@link SymbolStats} object with counts grouped by symbol kind,\n * or `Err<GildashError>` with `type='closed'` if the instance is closed,\n * `type='store'` if the database query fails.\n *\n * @example\n * ```ts\n * const stats = ledger.getStats();\n * if (isErr(stats)) return;\n * console.log(`Files: ${stats.fileCount}, Symbols: ${stats.symbolCount}`);\n * ```\n */\n getStats(project?: string): Result<SymbolStats, GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n return this.symbolRepo.getStats(project ?? this.defaultProject);\n } catch (e) {\n return err(gildashError('store', 'Gildash: getStats failed', e));\n }\n }\n\n /**\n * Search indexed symbols by name, kind, file path, or export status.\n *\n * @param query - Search filters (see {@link SymbolSearchQuery}). All fields are optional;\n * omitted fields match everything.\n * @returns An array of {@link SymbolSearchResult} entries, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed,\n * `type='search'` if the query fails.\n *\n * @example\n * ```ts\n * const fns = ledger.searchSymbols({ kind: 'function', isExported: true });\n * if (isErr(fns)) return;\n * fns.forEach(fn => console.log(fn.name, fn.filePath));\n * ```\n */\n searchSymbols(query: SymbolSearchQuery): Result<SymbolSearchResult[], GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n return this.symbolSearchFn({ symbolRepo: this.symbolRepo, project: this.defaultProject, query });\n } catch (e) {\n return err(gildashError('search', 'Gildash: searchSymbols failed', e));\n }\n }\n\n /**\n * Search indexed code relationships (imports, calls, extends, implements).\n *\n * @param query - Search filters (see {@link RelationSearchQuery}). All fields are optional.\n * @returns An array of {@link CodeRelation} entries, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed,\n * `type='search'` if the query fails.\n *\n * @example\n * ```ts\n * const rels = ledger.searchRelations({ srcFilePath: 'src/app.ts', type: 'imports' });\n * if (isErr(rels)) return;\n * rels.forEach(r => console.log(`${r.srcFilePath} -> ${r.dstFilePath}`));\n * ```\n */\n searchRelations(query: RelationSearchQuery): Result<CodeRelation[], GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n return this.relationSearchFn({ relationRepo: this.relationRepo, project: this.defaultProject, query });\n } catch (e) {\n return err(gildashError('search', 'Gildash: searchRelations failed', e));\n }\n }\n\n /**\n * Search symbols across all projects (no project filter).\n *\n * @param query - Search filters (see {@link SymbolSearchQuery}). The `project` field is ignored.\n * @returns An array of {@link SymbolSearchResult} entries, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed,\n * `type='search'` if the query fails.\n */\n searchAllSymbols(query: Omit<SymbolSearchQuery, 'project'> & { project?: string }): Result<SymbolSearchResult[], GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n return this.symbolSearchFn({ symbolRepo: this.symbolRepo, project: undefined, query });\n } catch (e) {\n return err(gildashError('search', 'Gildash: searchAllSymbols failed', e));\n }\n }\n\n /**\n * Search relations across all projects (no project filter).\n *\n * @param query - Search filters (see {@link RelationSearchQuery}). The `project` field is ignored.\n * @returns An array of {@link CodeRelation} entries, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed,\n * `type='search'` if the query fails.\n */\n searchAllRelations(query: RelationSearchQuery): Result<CodeRelation[], GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n return this.relationSearchFn({ relationRepo: this.relationRepo, project: undefined, query });\n } catch (e) {\n return err(gildashError('search', 'Gildash: searchAllRelations failed', e));\n }\n }\n\n /**\n * List all files indexed for a given project.\n *\n * @param project - Project name. Defaults to the primary project.\n * @returns An array of {@link FileRecord} entries, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed,\n * `type='store'` if the repository query fails.\n */\n listIndexedFiles(project?: string): Result<FileRecord[], GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n return this.fileRepo.getAllFiles(project ?? this.defaultProject);\n } catch (e) {\n return err(gildashError('store', 'Gildash: listIndexedFiles failed', e));\n }\n }\n\n /**\n * Get all intra-file relations for a given file (relations where both source and destination\n * are within the same file).\n *\n * @param filePath - Path of the file to query.\n * @param project - Project name. Defaults to the primary project.\n * @returns An array of {@link CodeRelation} entries, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed,\n * `type='search'` if the query fails.\n */\n getInternalRelations(filePath: string, project?: string): Result<CodeRelation[], GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n return this.relationSearchFn({\n relationRepo: this.relationRepo,\n project: project ?? this.defaultProject,\n query: { srcFilePath: filePath, dstFilePath: filePath, limit: 10_000 },\n });\n } catch (e) {\n return err(gildashError('search', 'Gildash: getInternalRelations failed', e));\n }\n }\n\n /**\n * Compare two snapshots of symbol search results and return a structured diff.\n *\n * Symbols are keyed by `name::filePath`. A symbol is:\n * - **added** if it appears only in `after`\n * - **removed** if it appears only in `before`\n * - **modified** if it appears in both but with a different `fingerprint`\n * - **unchanged** otherwise\n *\n * @param before - Snapshot of symbols before the change.\n * @param after - Snapshot of symbols after the change.\n * @returns A {@link SymbolDiff} object.\n */\n diffSymbols(\n before: SymbolSearchResult[],\n after: SymbolSearchResult[],\n ): SymbolDiff {\n const beforeMap = new Map<string, SymbolSearchResult>(before.map(s => [`${s.name}::${s.filePath}`, s]));\n const afterMap = new Map<string, SymbolSearchResult>(after.map(s => [`${s.name}::${s.filePath}`, s]));\n const added: SymbolSearchResult[] = [];\n const removed: SymbolSearchResult[] = [];\n const modified: Array<{ before: SymbolSearchResult; after: SymbolSearchResult }> = [];\n for (const [key, afterSym] of afterMap) {\n const beforeSym = beforeMap.get(key);\n if (!beforeSym) {\n added.push(afterSym);\n } else if (beforeSym.fingerprint !== afterSym.fingerprint) {\n modified.push({ before: beforeSym, after: afterSym });\n }\n }\n for (const [key, beforeSym] of beforeMap) {\n if (!afterMap.has(key)) removed.push(beforeSym);\n }\n return { added, removed, modified };\n }\n\n /**\n * List the files that a given file directly imports.\n *\n * @param filePath - Absolute path of the source file.\n * @param project - Project name. Defaults to the primary project.\n * @param limit - Maximum results. Defaults to `10_000`.\n * @returns An array of absolute paths that `filePath` imports,\n * or `Err<GildashError>` with `type='closed'` / `type='search'`.\n *\n * @example\n * ```ts\n * const deps = ledger.getDependencies('/project/src/app.ts');\n * if (isErr(deps)) return;\n * console.log('Imports:', deps.join(', '));\n * ```\n */\n getDependencies(filePath: string, project?: string, limit = 10_000): Result<string[], GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n return this.relationSearchFn({\n relationRepo: this.relationRepo,\n project: project ?? this.defaultProject,\n query: { srcFilePath: filePath, type: 'imports', project: project ?? this.defaultProject, limit },\n }).map(r => r.dstFilePath);\n } catch (e) {\n return err(gildashError('search', 'Gildash: getDependencies failed', e));\n }\n }\n\n /**\n * List the files that directly import a given file.\n *\n * @param filePath - Absolute path of the target file.\n * @param project - Project name. Defaults to the primary project.\n * @param limit - Maximum results. Defaults to `10_000`.\n * @returns An array of absolute paths of files that import `filePath`,\n * or `Err<GildashError>` with `type='closed'` / `type='search'`.\n *\n * @example\n * ```ts\n * const dependents = ledger.getDependents('/project/src/utils.ts');\n * if (isErr(dependents)) return;\n * console.log('Imported by:', dependents.join(', '));\n * ```\n */\n getDependents(filePath: string, project?: string, limit = 10_000): Result<string[], GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n return this.relationSearchFn({\n relationRepo: this.relationRepo,\n project: project ?? this.defaultProject,\n query: { dstFilePath: filePath, type: 'imports', project: project ?? this.defaultProject, limit },\n }).map(r => r.srcFilePath);\n } catch (e) {\n return err(gildashError('search', 'Gildash: getDependents failed', e));\n }\n }\n\n /**\n * Compute the full set of files transitively affected by changes.\n *\n * Internally builds a full {@link DependencyGraph} and walks all reverse\n * edges from each changed file to find every transitive dependent.\n *\n * @param changedFiles - Absolute paths of files that changed.\n * @param project - Project name. Defaults to the primary project.\n * @returns De-duplicated absolute paths of all transitively-dependent files\n * (excluding the changed files themselves), or `Err<GildashError>` with\n * `type='closed'` / `type='search'`.\n *\n * @example\n * ```ts\n * const affected = await ledger.getAffected(['/project/src/utils.ts']);\n * if (isErr(affected)) return;\n * console.log('Affected files:', affected.length);\n * ```\n */\n async getAffected(changedFiles: string[], project?: string): Promise<Result<string[], GildashError>> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n const g = this.getOrBuildGraph(project);\n return g.getAffectedByChange(changedFiles);\n } catch (e) {\n return err(gildashError('search', 'Gildash: getAffected failed', e));\n }\n }\n\n /**\n * Check whether the import graph contains a circular dependency.\n *\n * Internally builds a full {@link DependencyGraph} and runs iterative DFS\n * cycle detection.\n *\n * @param project - Project name. Defaults to the primary project.\n * @returns `true` if at least one cycle exists, `false` otherwise,\n * or `Err<GildashError>` with `type='closed'` / `type='search'`.\n *\n * @example\n * ```ts\n * const cycleResult = await ledger.hasCycle();\n * if (isErr(cycleResult)) return;\n * if (cycleResult) {\n * console.warn('Circular dependency detected!');\n * }\n * ```\n */\n async hasCycle(project?: string): Promise<Result<boolean, GildashError>> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n const g = this.getOrBuildGraph(project);\n return g.hasCycle();\n } catch (e) {\n return err(gildashError('search', 'Gildash: hasCycle failed', e));\n }\n }\n\n /**\n * Return the full import graph for a project as an adjacency list.\n *\n * Builds a {@link DependencyGraph} and exposes its internal adjacency list.\n * Each file appears as a key; its value lists the files it directly imports.\n * Files that are imported but do not themselves import appear as keys with empty arrays.\n *\n * @param project - Project name. Defaults to the primary project.\n * @returns A `Map<filePath, importedFilePaths[]>`, or `Err<GildashError>` with\n * `type='closed'` / `type='search'`.\n */\n async getImportGraph(project?: string): Promise<Result<Map<string, string[]>, GildashError>> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n const g = this.getOrBuildGraph(project);\n return g.getAdjacencyList();\n } catch (e) {\n return err(gildashError('search', 'Gildash: getImportGraph failed', e));\n }\n }\n\n /**\n * Return all files that `filePath` transitively imports (forward BFS).\n *\n * @param filePath - Absolute path of the starting file.\n * @param project - Project name. Defaults to the primary project.\n * @returns An array of file paths that `filePath` directly or indirectly imports,\n * or `Err<GildashError>` with `type='closed'` / `type='search'`.\n */\n async getTransitiveDependencies(filePath: string, project?: string): Promise<Result<string[], GildashError>> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n const g = this.getOrBuildGraph(project);\n return g.getTransitiveDependencies(filePath);\n } catch (e) {\n return err(gildashError('search', 'Gildash: getTransitiveDependencies failed', e));\n }\n }\n\n /**\n * Return all cycle paths in the import graph.\n *\n * Tarjan SCC + Johnson's circuits — 모든 elementary circuit 보장.\n * 단순한 사이클 유무(`hasCycle`)와 달리 중복 없는 정규화된 경로 전체를 반환합니다.\n * `maxCycles` 옵션으로 반환 개수를 제한할 수 있습니다.\n *\n * @param project - Project name. Defaults to the primary project.\n * @param options.maxCycles - Maximum number of cycles to return. Defaults to no limit.\n * @returns An array of cycle paths (`string[][]`), each path starting at the\n * lexicographically smallest node (canonical rotation). Returns `[]` if no cycles exist.\n * Returns `Err<GildashError>` with `type='closed'` (instance closed) or `type='search'` (graph error).\n */\n async getCyclePaths(project?: string, options?: { maxCycles?: number }): Promise<Result<string[][], GildashError>> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n const g = this.getOrBuildGraph(project);\n return g.getCyclePaths(options);\n } catch (e) {\n return err(gildashError('search', 'Gildash: getCyclePaths failed', e));\n }\n }\n\n /**\n * Retrieve full details for a named symbol in a specific file,\n * including members, documentation, and type information.\n *\n * @param symbolName - Exact symbol name to look up.\n * @param filePath - Absolute path of the file containing the symbol.\n * @param project - Project scope override (defaults to `defaultProject`).\n * @returns A {@link FullSymbol} on success, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed,\n * `type='search'` if the symbol is not found or the query fails.\n */\n getFullSymbol(\n symbolName: string,\n filePath: string,\n project?: string,\n ): Result<FullSymbol, GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n const effectiveProject = project ?? this.defaultProject;\n const results = this.symbolSearchFn({\n symbolRepo: this.symbolRepo,\n project: effectiveProject,\n query: { text: symbolName, exact: true, filePath, limit: 1 },\n });\n if (results.length === 0) {\n return err(gildashError('search', `Gildash: symbol '${symbolName}' not found in '${filePath}'`));\n }\n const sym = results[0]!;\n const d = sym.detail;\n const full: FullSymbol = {\n ...sym,\n members: Array.isArray(d.members) ? (d.members as FullSymbol['members']) : undefined,\n jsDoc: typeof d.jsDoc === 'string' ? d.jsDoc : undefined,\n parameters: typeof d.parameters === 'string' ? d.parameters : undefined,\n returnType: typeof d.returnType === 'string' ? d.returnType : undefined,\n heritage: Array.isArray(d.heritage) ? (d.heritage as string[]) : undefined,\n decorators: Array.isArray(d.decorators) ? (d.decorators as FullSymbol['decorators']) : undefined,\n typeParameters: typeof d.typeParameters === 'string' ? d.typeParameters : undefined,\n };\n return full;\n } catch (e) {\n return err(gildashError('search', 'Gildash: getFullSymbol failed', e));\n }\n }\n\n /**\n * Retrieve statistics for an indexed file (line count, symbol count, etc.).\n *\n * @param filePath - Absolute path of the file to query.\n * @param project - Project scope override (defaults to `defaultProject`).\n * @returns A {@link FileStats} on success, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed,\n * `type='search'` if the file is not in the index,\n * `type='store'` if the query throws.\n */\n getFileStats(\n filePath: string,\n project?: string,\n ): Result<FileStats, GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n const effectiveProject = project ?? this.defaultProject;\n const fileRecord = this.fileRepo.getFile(effectiveProject, filePath);\n if (!fileRecord) {\n return err(gildashError('search', `Gildash: file '${filePath}' is not in the index`));\n }\n const symbols = this.symbolRepo.getFileSymbols(effectiveProject, filePath);\n const relations = this.relationRepo.getOutgoing(effectiveProject, filePath);\n return {\n filePath: fileRecord.filePath,\n lineCount: fileRecord.lineCount ?? 0,\n size: fileRecord.size,\n symbolCount: symbols.length,\n exportedSymbolCount: symbols.filter((s) => s.isExported).length,\n relationCount: relations.length,\n };\n } catch (e) {\n return err(gildashError('store', 'Gildash: getFileStats failed', e));\n }\n }\n\n /**\n * Compute import-graph fan metrics (fan-in / fan-out) for a single file.\n *\n * Builds a full {@link DependencyGraph} each call (O(relations)).\n * For repeated calls, consider caching the graph externally.\n *\n * @param filePath - Absolute path of the file to query.\n * @param project - Project scope override (defaults to `defaultProject`).\n * @returns A {@link FanMetrics} on success, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed,\n * `type='search'` if the graph build fails.\n */\n async getFanMetrics(\n filePath: string,\n project?: string,\n ): Promise<Result<FanMetrics, GildashError>> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n const g = this.getOrBuildGraph(project);\n return {\n filePath,\n fanIn: g.getDependents(filePath).length,\n fanOut: g.getDependencies(filePath).length,\n };\n } catch (e) {\n return err(gildashError('search', 'Gildash: getFanMetrics failed', e));\n }\n }\n\n /**\n * Resolve the original definition location of a symbol by following its re-export chain.\n *\n * Traverses `re-exports` relations iteratively until no further hop is found or a\n * circular chain is detected.\n *\n * @param symbolName - The exported name to resolve.\n * @param filePath - The file from which the symbol is exported.\n * @param project - Project scope override (defaults to `defaultProject`).\n * @returns A {@link ResolvedSymbol} on success, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed,\n * `type='search'` if a circular re-export chain is detected.\n */\n resolveSymbol(\n symbolName: string,\n filePath: string,\n project?: string,\n ): Result<ResolvedSymbol, GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n const effectiveProject = project ?? this.defaultProject;\n const visited = new Set<string>();\n const chain: Array<{ filePath: string; exportedAs: string }> = [];\n\n let currentName = symbolName;\n let currentFile = filePath;\n\n for (;;) {\n const key = `${currentFile}::${currentName}`;\n if (visited.has(key)) {\n return err(gildashError('search', 'Gildash: resolveSymbol detected circular re-export chain'));\n }\n visited.add(key);\n\n const rels = this.relationSearchFn({\n relationRepo: this.relationRepo,\n project: effectiveProject,\n query: { type: 're-exports', srcFilePath: currentFile, limit: 500 },\n }) as CodeRelation[];\n\n let nextFile: string | undefined;\n let nextName: string | undefined;\n\n for (const rel of rels) {\n let specifiers: Array<{ local: string; exported: string }> | undefined;\n if (rel.metaJson) {\n try {\n const meta = JSON.parse(rel.metaJson) as Record<string, unknown>;\n if (Array.isArray(meta['specifiers'])) {\n specifiers = meta['specifiers'] as Array<{ local: string; exported: string }>;\n }\n } catch { /* ignore malformed metaJson */ }\n }\n if (!specifiers) continue;\n const match = specifiers.find((s) => s.exported === currentName);\n if (!match) continue;\n nextFile = rel.dstFilePath;\n nextName = match.local;\n break;\n }\n\n if (!nextFile || !nextName) {\n return { originalName: currentName, originalFilePath: currentFile, reExportChain: chain };\n }\n\n chain.push({ filePath: currentFile, exportedAs: currentName });\n currentFile = nextFile;\n currentName = nextName;\n }\n }\n\n /**\n * Search for an AST structural pattern across indexed TypeScript files.\n *\n * Uses ast-grep's `findInFiles` under the hood. Provide `opts.filePaths` to\n * limit search scope; otherwise all files tracked by the project index are searched.\n *\n * @param pattern - ast-grep structural pattern (e.g. `'console.log($$$)'`).\n * @param opts - Optional scope: file paths and/or project override.\n * @returns An array of {@link PatternMatch} on success, or `Err<GildashError>` with\n * `type='closed'` if the instance is closed,\n * `type='search'` if the underlying search fails.\n */\n async findPattern(\n pattern: string,\n opts?: { filePaths?: string[]; project?: string },\n ): Promise<Result<PatternMatch[], GildashError>> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n const effectiveProject = opts?.project ?? this.defaultProject;\n const filePaths: string[] = opts?.filePaths\n ? opts.filePaths\n : this.fileRepo.getAllFiles(effectiveProject).map((f) => f.filePath);\n\n return await this.patternSearchFn({ pattern, filePaths });\n } catch (e) {\n return err(gildashError('search', 'Gildash: findPattern failed', e));\n }\n }\n\n /**\n * Index the TypeScript type declarations (`.d.ts` files) of one or more\n * `node_modules` packages.\n *\n * Each package is indexed under a dedicated `@external/<packageName>` project\n * so it does not pollute the main project index. Subsequent calls re-index\n * (incremental diff) the same package.\n *\n * @param packages - Package names as they appear in `node_modules/`\n * (e.g. `['react', 'typescript']`).\n * @param opts - Optional overrides (unused currently, reserved for future use).\n * @returns An array of {@link IndexResult} — one per package — on success,\n * or `Err<GildashError>` with:\n * - `type='closed'` if the instance is closed or in reader mode,\n * - `type='validation'` if a requested package is not found in `node_modules/`,\n * - `type='store'` if indexing fails at runtime.\n */\n async indexExternalPackages(\n packages: string[],\n opts?: { project?: string },\n ): Promise<Result<IndexResult[], GildashError>> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n if (this.role !== 'owner') {\n return err(gildashError('closed', 'Gildash: indexExternalPackages() is not available for readers'));\n }\n try {\n const results: IndexResult[] = [];\n for (const packageName of packages) {\n const packageDir = path.resolve(this.projectRoot, 'node_modules', packageName);\n if (!this.existsSyncFn(packageDir)) {\n return err(gildashError('validation', `Gildash: package not found in node_modules: ${packageName}`));\n }\n const project = `@external/${packageName}`;\n const coordinator = this.makeExternalCoordinatorFn\n ? this.makeExternalCoordinatorFn(packageDir, project)\n : new IndexCoordinator({\n projectRoot: packageDir,\n boundaries: [{ dir: '.', project }],\n extensions: ['.d.ts'],\n ignorePatterns: [],\n dbConnection: this.db,\n parseCache: this.parseCache,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fileRepo: this.fileRepo as any,\n symbolRepo: this.symbolRepo,\n relationRepo: this.relationRepo,\n logger: this.logger,\n });\n const result = await coordinator.fullIndex();\n results.push(result);\n }\n return results;\n } catch (e) {\n return err(gildashError('store', 'Gildash: indexExternalPackages failed', e));\n }\n }\n\n /**\n * Parse multiple files concurrently and return a map of results.\n *\n * Files that fail to read or parse are silently excluded from the result map.\n * The operation does not fail even if every file fails — it returns an empty `Map`.\n *\n * @param filePaths - Absolute paths of files to parse.\n * @param options - Optional oxc-parser {@link ParserOptions} (e.g. `sourceType`, `lang`).\n * @returns A `Map<filePath, ParsedFile>` for every successfully-parsed file,\n * or `Err<GildashError>` with `type='closed'` if the instance is closed.\n */\n async batchParse(filePaths: string[], options?: ParserOptions): Promise<Result<Map<string, ParsedFile>, GildashError>> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n const result = new Map<string, ParsedFile>();\n await Promise.all(\n filePaths.map(async (fp) => {\n try {\n const text = await this.readFileFn(fp);\n const parsed = this.parseSourceFn(fp, text, options);\n if (!isErr(parsed)) {\n result.set(fp, parsed as ParsedFile);\n }\n } catch {\n // silently exclude failed files\n }\n }),\n );\n return result;\n }\n\n /**\n * Return the public interface of a module: all exported symbols with key metadata.\n *\n * @param filePath - Absolute path of the file.\n * @param project - Project name. Defaults to the primary project.\n * @returns A {@link ModuleInterface} object, or `Err<GildashError>` with\n * `type='closed'` / `type='search'`.\n */\n getModuleInterface(filePath: string, project?: string): Result<ModuleInterface, GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n const symbols = this.symbolSearchFn({\n symbolRepo: this.symbolRepo,\n project: project ?? this.defaultProject,\n query: { filePath, isExported: true },\n }) as SymbolSearchResult[];\n const exports = symbols.map((s) => ({\n name: s.name,\n kind: s.kind,\n parameters: (s.detail.parameters as string | undefined) ?? undefined,\n returnType: (s.detail.returnType as string | undefined) ?? undefined,\n jsDoc: (s.detail.jsDoc as string | undefined) ?? undefined,\n }));\n return { filePath, exports };\n } catch (e) {\n return err(gildashError('search', 'Gildash: getModuleInterface failed', e));\n }\n }\n\n /**\n * Recursively traverse `extends`/`implements` relations to build a heritage tree.\n *\n * The root node represents `symbolName`/`filePath`. Its `children` are the symbols\n * it extends or implements, and so on transitively. A visited set prevents cycles.\n *\n * @param symbolName - Name of the starting symbol.\n * @param filePath - Absolute path of the file containing the symbol.\n * @param project - Project name. Defaults to the primary project.\n * @returns A {@link HeritageNode} tree, or `Err<GildashError>` with\n * `type='closed'` / `type='search'`.\n */\n async getHeritageChain(\n symbolName: string,\n filePath: string,\n project?: string,\n ): Promise<Result<HeritageNode, GildashError>> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n const proj = project ?? this.defaultProject;\n const visited = new Set<string>();\n\n const buildNode = (symName: string, fp: string, kind?: 'extends' | 'implements'): HeritageNode => {\n const key = `${symName}::${fp}`;\n if (visited.has(key)) {\n return { symbolName: symName, filePath: fp, kind, children: [] };\n }\n visited.add(key);\n\n const rels = this.relationSearchFn({\n relationRepo: this.relationRepo,\n project: proj,\n query: { srcFilePath: fp, srcSymbolName: symName, limit: 1000 },\n }) as CodeRelation[];\n\n const heritageRels = rels.filter(\n (r): r is CodeRelation & { type: 'extends' | 'implements' } =>\n r.type === 'extends' || r.type === 'implements',\n );\n\n const children = heritageRels\n .filter((r) => r.dstSymbolName != null)\n .map((r) => buildNode(r.dstSymbolName!, r.dstFilePath, r.type));\n\n return { symbolName: symName, filePath: fp, kind, children };\n };\n\n return buildNode(symbolName, filePath);\n } catch (e) {\n return err(gildashError('search', 'Gildash: getHeritageChain failed', e));\n }\n }\n\n /**\n * Retrieve a previously-parsed AST from the internal LRU cache.\n *\n * Returns `undefined` if the file has not been parsed or was evicted from the cache.\n * The returned object is shared with the internal cache — treat it as **read-only**.\n *\n * @param filePath - Absolute path of the file.\n * @returns The cached {@link ParsedFile}, or `undefined` if not available.\n */\n getParsedAst(filePath: string): ParsedFile | undefined {\n if (this.closed) return undefined;\n return this.parseCache.get(filePath);\n }\n\n /**\n * Retrieve metadata for an indexed file.\n *\n * Returns the stored {@link FileRecord} including content hash, mtime, and size.\n * Returns `null` if the file has not been indexed yet.\n *\n * @param filePath - Relative path from project root (as stored in the index).\n * @param project - Project name. Defaults to the primary project.\n * @returns The {@link FileRecord}, or `null` if not found.\n */\n getFileInfo(filePath: string, project?: string): Result<FileRecord | null, GildashError> {\n if (this.closed) return err(gildashError('closed', 'Gildash: instance is closed'));\n try {\n return this.fileRepo.getFile(project ?? this.defaultProject, filePath);\n } catch (e) {\n return err(gildashError('store', 'Gildash: getFileInfo failed', e));\n }\n }\n\n /**\n * List all symbols declared in a specific file.\n *\n * Convenience wrapper around {@link searchSymbols} with a `filePath` filter.\n *\n * @param filePath - File path to query.\n * @param project - Project name. Defaults to the primary project.\n * @returns An array of {@link SymbolSearchResult} entries, or `Err<GildashError>`.\n */\n getSymbolsByFile(filePath: string, project?: string): Result<SymbolSearchResult[], GildashError> {\n return this.searchSymbols({ filePath, project: project ?? undefined, limit: 10_000 });\n }\n}\n",
6
+ "import { err, type Result } from '@zipbul/result';\nimport { parseSync as defaultParseSync } from 'oxc-parser';\nimport type { ParserOptions } from 'oxc-parser';\nimport type { ParsedFile } from './types';\nimport { gildashError, type GildashError } from '../errors';\n\nexport function parseSource(\n filePath: string,\n sourceText: string,\n options?: ParserOptions,\n parseSyncFn: typeof defaultParseSync = defaultParseSync,\n): Result<ParsedFile, GildashError> {\n try {\n const { program, errors, comments } = parseSyncFn(filePath, sourceText, options);\n return { filePath, program: program as ParsedFile['program'], errors, comments, sourceText };\n } catch (e) {\n return err(gildashError('parse', `Failed to parse file: ${filePath}`, e));\n }\n}\n",
7
7
  "/**\n * Discriminated union type representing all possible error categories in Gildash.\n */\nexport type GildashErrorType =\n | 'watcher'\n | 'parse'\n | 'extract'\n | 'index'\n | 'store'\n | 'search'\n | 'closed'\n | 'validation'\n | 'close';\n\n/**\n * Plain-object error value used throughout Gildash's Result-based error handling.\n * Produced by {@link gildashError} and carried as the `data` field of an `Err<GildashError>`.\n */\nexport interface GildashError {\n type: GildashErrorType;\n message: string;\n cause?: unknown;\n}\n\n/**\n * Factory function that creates a {@link GildashError} value.\n *\n * @param type - One of the {@link GildashErrorType} variants.\n * @param message - Human-readable description of the error.\n * @param cause - Optional root cause (any value). When `undefined`, the `cause`\n * property is omitted from the returned object entirely.\n */\nexport function gildashError(type: GildashErrorType, message: string, cause?: unknown): GildashError {\n return cause !== undefined\n ? { type, message, cause }\n : { type, message };\n}\n\n",
8
8
  "export class LruCache<K, V> {\n #capacity: number;\n #map = new Map<K, V>();\n\n constructor(capacity: number) {\n this.#capacity = Math.max(1, capacity);\n }\n\n get size(): number {\n return this.#map.size;\n }\n\n has(key: K): boolean {\n return this.#map.has(key);\n }\n\n get(key: K): V | undefined {\n if (!this.#map.has(key)) {\n return undefined;\n }\n const value = this.#map.get(key)!;\n this.#map.delete(key);\n this.#map.set(key, value);\n return value;\n }\n\n set(key: K, value: V): void {\n if (this.#map.has(key)) {\n this.#map.delete(key);\n }\n\n this.#map.set(key, value);\n\n if (this.#map.size > this.#capacity) {\n const oldestKey = this.#map.keys().next().value as K | undefined;\n if (oldestKey !== undefined) {\n this.#map.delete(oldestKey);\n }\n }\n }\n\n delete(key: K): boolean {\n return this.#map.delete(key);\n }\n\n clear(): void {\n this.#map.clear();\n }\n}\n",
9
9
  "import type { ParsedFile } from './types';\nimport { LruCache } from '../common/lru-cache';\n\nexport class ParseCache {\n private readonly lru: LruCache<string, ParsedFile>;\n\n constructor(capacity: number = 500) {\n this.lru = new LruCache<string, ParsedFile>(capacity);\n }\n\n get(filePath: string): ParsedFile | undefined {\n return this.lru.get(filePath);\n }\n\n set(filePath: string, parsed: ParsedFile): void {\n this.lru.set(filePath, parsed);\n }\n\n invalidate(filePath: string): void {\n this.lru.delete(filePath);\n }\n\n invalidateAll(): void {\n this.lru.clear();\n }\n\n size(): number {\n return this.lru.size;\n }\n}\n",
@@ -16,8 +16,8 @@
16
16
  "import type { Program } from 'oxc-parser';\nimport type { ImportReference, CodeRelation } from './types';\nimport { getQualifiedName } from '../parser/ast-utils';\n\nexport function extractCalls(\n ast: Program,\n filePath: string,\n importMap: Map<string, ImportReference>,\n): CodeRelation[] {\n const relations: CodeRelation[] = [];\n const functionStack: string[] = [];\n const classStack: string[] = [];\n\n function currentCaller(): string | null {\n if (functionStack.length > 0) return functionStack[functionStack.length - 1] ?? null;\n return null;\n }\n\n function resolveCallee(\n qn: { root: string; parts: string[]; full: string } | null,\n ): { dstFilePath: string; dstSymbolName: string; resolution: string } | null {\n if (!qn) return null;\n\n const ref = importMap.get(qn.root);\n\n if (qn.parts.length === 0) {\n if (ref) {\n return { dstFilePath: ref.path, dstSymbolName: ref.importedName, resolution: 'import' };\n }\n return { dstFilePath: filePath, dstSymbolName: qn.root, resolution: 'local' };\n } else {\n if (ref && ref.importedName === '*') {\n const dstSymbolName = qn.parts[qn.parts.length - 1]!;\n return { dstFilePath: ref.path, dstSymbolName, resolution: 'namespace' };\n }\n return { dstFilePath: filePath, dstSymbolName: qn.full, resolution: 'local-member' };\n }\n }\n\n function walk(node: unknown): void {\n if (!node || typeof node !== 'object') return;\n\n if (Array.isArray(node)) {\n for (const item of node) walk(item);\n return;\n }\n\n const record = node as Record<string, unknown>;\n const type: string = typeof record.type === 'string' ? record.type : '';\n\n if (type === 'ClassDeclaration' || type === 'ClassExpression') {\n const classNode = record as { id?: { name?: string }; body?: unknown };\n const className: string = classNode.id?.name ?? 'AnonymousClass';\n classStack.push(className);\n walk(classNode.body);\n classStack.pop();\n return;\n }\n\n if (type === 'FunctionDeclaration') {\n const functionNode = record as { id?: { name?: string }; body?: unknown };\n const name: string = functionNode.id?.name ?? 'anonymous';\n functionStack.push(name);\n walk(functionNode.body);\n functionStack.pop();\n return;\n }\n\n if (type === 'VariableDeclarator' && (record as { init?: { type?: string } }).init && (\n (record as { init?: { type?: string } }).init?.type === 'FunctionExpression' ||\n (record as { init?: { type?: string } }).init?.type === 'ArrowFunctionExpression'\n )) {\n const declarator = record as { id?: { name?: string }; init?: { body?: unknown } };\n const name: string = declarator.id?.name ?? 'anonymous';\n functionStack.push(name);\n walk(declarator.init?.body ?? declarator.init);\n functionStack.pop();\n return;\n }\n\n if (type === 'MethodDefinition' && (record as { value?: unknown }).value) {\n const method = record as { key?: { name?: string }; value?: { body?: unknown } };\n const className = classStack[classStack.length - 1] ?? '';\n const methodName: string = method.key?.name ?? 'anonymous';\n const fullName = className ? `${className}.${methodName}` : methodName;\n functionStack.push(fullName);\n walk(method.value?.body);\n functionStack.pop();\n return;\n }\n\n if (type === 'FunctionExpression' || type === 'ArrowFunctionExpression') {\n const parentCaller = currentCaller();\n const anonymousName = parentCaller ? `${parentCaller}.<anonymous>` : '<anonymous>';\n functionStack.push(anonymousName);\n walk((record as { body?: unknown }).body);\n functionStack.pop();\n return;\n }\n\n if (type === 'CallExpression') {\n const call = record as { callee?: unknown; arguments?: unknown[] };\n const qn = getQualifiedName(call.callee);\n const dst = resolveCallee(qn);\n if (dst) {\n const srcSymbolName = currentCaller();\n const meta: Record<string, unknown> = {};\n if (srcSymbolName === null) meta.scope = 'module';\n\n relations.push({\n type: 'calls',\n srcFilePath: filePath,\n srcSymbolName,\n dstFilePath: dst.dstFilePath,\n dstSymbolName: dst.dstSymbolName,\n ...(Object.keys(meta).length > 0 ? { metaJson: JSON.stringify(meta) } : {}),\n });\n }\n walk(call.callee);\n for (const arg of call.arguments ?? []) walk(arg);\n return;\n }\n\n if (type === 'NewExpression') {\n const ctorCall = record as { callee?: unknown; arguments?: unknown[] };\n const qn = getQualifiedName(ctorCall.callee);\n const dst = resolveCallee(qn);\n if (dst) {\n const srcSymbolName = currentCaller();\n const meta: Record<string, unknown> = { isNew: true };\n if (srcSymbolName === null) meta.scope = 'module';\n\n relations.push({\n type: 'calls',\n srcFilePath: filePath,\n srcSymbolName,\n dstFilePath: dst.dstFilePath,\n dstSymbolName: dst.dstSymbolName,\n metaJson: JSON.stringify(meta),\n });\n }\n for (const arg of ctorCall.arguments ?? []) walk(arg);\n return;\n }\n\n for (const key of Object.keys(record)) {\n if (key === 'loc' || key === 'start' || key === 'end' || key === 'scope') continue;\n const child = record[key];\n if (child && typeof child === 'object') {\n walk(child);\n }\n }\n }\n\n walk(ast);\n return relations;\n}\n",
17
17
  "import type { Program } from 'oxc-parser';\nimport type { ImportReference, CodeRelation } from './types';\nimport { visit, getQualifiedName } from '../parser/ast-utils';\n\nexport function extractHeritage(\n ast: Program,\n filePath: string,\n importMap: Map<string, ImportReference>,\n): CodeRelation[] {\n const relations: CodeRelation[] = [];\n\n visit(ast, (node) => {\n if (node.type === 'TSInterfaceDeclaration') {\n const interfaceName: string = ((node.id as { name?: string } | undefined)?.name) ?? 'AnonymousInterface';\n const interfaces = (node.extends as unknown[] | undefined) ?? [];\n for (const item of interfaces) {\n const expr = (item as { expression?: unknown }).expression ?? item;\n const qn = getQualifiedName(expr);\n if (!qn) continue;\n const rel = resolveHeritageDst(qn, filePath, importMap);\n relations.push({\n type: 'extends',\n srcFilePath: filePath,\n srcSymbolName: interfaceName,\n ...rel,\n });\n }\n return;\n }\n\n if (node.type !== 'ClassDeclaration' && node.type !== 'ClassExpression') return;\n\n const className: string =\n ((node.id as { name?: string } | undefined)?.name) ?? 'AnonymousClass';\n\n if (node.superClass) {\n const qn = getQualifiedName(node.superClass);\n if (qn) {\n const rel = resolveHeritageDst(qn, filePath, importMap);\n relations.push({\n type: 'extends',\n srcFilePath: filePath,\n srcSymbolName: className,\n ...rel,\n });\n }\n }\n\n const impls = (node.implements as unknown[] | undefined) ?? [];\n for (const impl of impls) {\n const expr = (impl as { expression?: unknown }).expression ?? impl;\n const qn = getQualifiedName(expr);\n if (!qn) continue;\n const rel = resolveHeritageDst(qn, filePath, importMap);\n relations.push({\n type: 'implements',\n srcFilePath: filePath,\n srcSymbolName: className,\n ...rel,\n });\n }\n });\n\n return relations;\n}\n\nfunction resolveHeritageDst(\n qn: { root: string; parts: string[]; full: string },\n currentFilePath: string,\n importMap: Map<string, ImportReference>,\n): { dstFilePath: string; dstSymbolName: string; metaJson?: string } {\n const ref = importMap.get(qn.root);\n\n if (ref) {\n if (ref.importedName === '*') {\n const dstSymbolName = qn.parts[qn.parts.length - 1] ?? qn.root;\n return {\n dstFilePath: ref.path,\n dstSymbolName,\n metaJson: JSON.stringify({ isNamespaceImport: true }),\n };\n }\n return {\n dstFilePath: ref.path,\n dstSymbolName: qn.parts.length > 0 ? qn.full : ref.importedName,\n };\n }\n\n return {\n dstFilePath: currentFilePath,\n dstSymbolName: qn.full,\n metaJson: JSON.stringify({ isLocal: true }),\n };\n}\n",
18
18
  "import type { Program } from 'oxc-parser';\nimport type { TsconfigPaths } from '../common/tsconfig-resolver';\nimport type { CodeRelation } from './types';\nimport { buildImportMap } from './extractor-utils';\nimport { extractImports } from './imports-extractor';\nimport { extractCalls } from './calls-extractor';\nimport { extractHeritage } from './heritage-extractor';\n\nexport function extractRelations(\n ast: Program,\n filePath: string,\n tsconfigPaths?: TsconfigPaths,\n): CodeRelation[] {\n const importMap = buildImportMap(ast, filePath, tsconfigPaths);\n\n const imports = extractImports(ast, filePath, tsconfigPaths);\n const calls = extractCalls(ast, filePath, importMap);\n const heritage = extractHeritage(ast, filePath, importMap);\n\n return [...imports, ...calls, ...heritage];\n}\n",
19
- "import { err, isErr, type Result } from '@zipbul/result';\nimport { Database } from 'bun:sqlite';\nimport { mkdirSync, unlinkSync, existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { drizzle, type BunSQLiteDatabase } from 'drizzle-orm/bun-sqlite';\nimport { migrate } from 'drizzle-orm/bun-sqlite/migrator';\nimport { gildashError, type GildashError } from '../errors';\nimport * as schema from './schema';\nimport { FTS_SETUP_SQL } from './schema';\n\nexport interface DbConnectionOptions {\n projectRoot: string;\n}\n\nexport class DbConnection {\n private client: Database | null = null;\n private drizzle: BunSQLiteDatabase<typeof schema> | null = null;\n private readonly dbPath: string;\n private txDepth = 0;\n\n constructor(opts: DbConnectionOptions) {\n this.dbPath = join(opts.projectRoot, '.zipbul', 'gildash.db');\n }\n\n get drizzleDb(): BunSQLiteDatabase<typeof schema> {\n if (!this.drizzle) throw new Error('Database is not open. Call open() first.');\n return this.drizzle;\n }\n\n open(): Result<void, GildashError> {\n try {\n mkdirSync(dirname(this.dbPath), { recursive: true });\n this.client = new Database(this.dbPath);\n\n this.client.run('PRAGMA journal_mode = WAL');\n this.client.run('PRAGMA foreign_keys = ON');\n this.client.run('PRAGMA busy_timeout = 5000');\n\n this.drizzle = drizzle(this.client, { schema });\n\n migrate(this.drizzle, {\n migrationsFolder: join(import.meta.dirname, 'migrations'),\n });\n\n for (const sql of FTS_SETUP_SQL) {\n this.client.run(sql);\n }\n\n // bun:sqlite Database.function() is not available in all Bun versions.\n // Regex filtering falls back to JS-layer post-processing when this is absent.\n const clientAny = this.client as unknown as Record<string, unknown>;\n if (typeof clientAny['function'] === 'function') {\n (clientAny['function'] as Function).call(\n this.client,\n 'regexp',\n (pattern: string, value: string): number => {\n try {\n return new RegExp(pattern).test(value) ? 1 : 0;\n } catch {\n return 0;\n }\n },\n );\n }\n } catch (e) {\n if (this.isCorruptionError(e) && existsSync(this.dbPath)) {\n this.closeClient();\n unlinkSync(this.dbPath);\n for (const ext of ['-wal', '-shm']) {\n const p = this.dbPath + ext;\n if (existsSync(p)) unlinkSync(p);\n }\n const retryResult = this.open();\n if (isErr(retryResult)) {\n return err(gildashError('store', `Failed to recover database at ${this.dbPath}`, retryResult.data));\n }\n return retryResult;\n }\n return err(gildashError('store', `Failed to open database at ${this.dbPath}`, e));\n }\n }\n\n close(): void {\n this.closeClient();\n this.drizzle = null;\n }\n\n transaction<T>(fn: (tx: DbConnection) => T): T {\n const db = this.requireClient();\n\n if (this.txDepth === 0) {\n this.txDepth++;\n try {\n return db.transaction(() => fn(this))();\n } finally {\n this.txDepth--;\n }\n }\n\n const sp = `sp_${this.txDepth++}`;\n db.run(`SAVEPOINT \"${sp}\"`);\n try {\n const result = fn(this);\n db.run(`RELEASE SAVEPOINT \"${sp}\"`);\n return result;\n } catch (err) {\n db.run(`ROLLBACK TO SAVEPOINT \"${sp}\"`);\n db.run(`RELEASE SAVEPOINT \"${sp}\"`);\n throw err;\n } finally {\n this.txDepth--;\n }\n }\n\n immediateTransaction<T>(fn: () => T): T {\n const db = this.requireClient();\n this.txDepth++;\n db.run('BEGIN IMMEDIATE');\n try {\n const result = fn();\n db.run('COMMIT');\n return result;\n } catch (err) {\n db.run('ROLLBACK');\n throw err;\n } finally {\n this.txDepth--;\n }\n }\n\n query(sql: string): unknown {\n const row = this.requireClient().prepare(sql).get() as Record<string, unknown> | null;\n if (!row) return null;\n return Object.values(row)[0];\n }\n\n getTableNames(): string[] {\n const rows = this.requireClient()\n .query(\"SELECT name FROM sqlite_master WHERE type = 'table'\")\n .all() as Array<{ name: string }>;\n return rows.map((r) => r.name);\n }\n\n selectOwner(): { pid: number; heartbeat_at: string } | undefined {\n const row = this.requireClient()\n .prepare('SELECT pid, heartbeat_at FROM watcher_owner WHERE id = 1')\n .get() as { pid: number; heartbeat_at: string } | null;\n return row ?? undefined;\n }\n\n insertOwner(pid: number): void {\n const now = new Date().toISOString();\n this.requireClient()\n .prepare('INSERT INTO watcher_owner (id, pid, started_at, heartbeat_at) VALUES (1, ?, ?, ?)')\n .run(pid, now, now);\n }\n\n replaceOwner(pid: number): void {\n const now = new Date().toISOString();\n this.requireClient()\n .prepare('INSERT OR REPLACE INTO watcher_owner (id, pid, started_at, heartbeat_at) VALUES (1, ?, ?, ?)')\n .run(pid, now, now);\n }\n\n touchOwner(pid: number): void {\n const now = new Date().toISOString();\n this.requireClient()\n .prepare('UPDATE watcher_owner SET heartbeat_at = ? WHERE id = 1 AND pid = ?')\n .run(now, pid);\n }\n\n deleteOwner(pid: number): void {\n this.requireClient()\n .prepare('DELETE FROM watcher_owner WHERE id = 1 AND pid = ?')\n .run(pid);\n }\n\n private requireClient(): Database {\n if (!this.client) throw new Error('Database is not open. Call open() first.');\n return this.client;\n }\n\n private closeClient(): void {\n if (this.client) {\n this.client.close();\n this.client = null;\n }\n }\n\n private isCorruptionError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n const msg = err.message.toLowerCase();\n return (\n msg.includes('malformed') ||\n msg.includes('corrupt') ||\n msg.includes('not a database') ||\n msg.includes('disk i/o error') ||\n msg.includes('sqlite_corrupt')\n );\n }\n}\n",
20
- "import { sql } from 'drizzle-orm';\nimport {\n sqliteTable,\n text,\n integer,\n real,\n index,\n primaryKey,\n foreignKey,\n check,\n} from 'drizzle-orm/sqlite-core';\n\nexport const files = sqliteTable(\n 'files',\n {\n project: text('project').notNull(),\n filePath: text('file_path').notNull(),\n mtimeMs: real('mtime_ms').notNull(),\n size: integer('size').notNull(),\n contentHash: text('content_hash').notNull(),\n updatedAt: text('updated_at').notNull(),\n lineCount: integer('line_count'),\n },\n (table) => [primaryKey({ columns: [table.project, table.filePath] })],\n);\n\nexport const symbols = sqliteTable(\n 'symbols',\n {\n id: integer('id').primaryKey({ autoIncrement: true }),\n project: text('project').notNull(),\n filePath: text('file_path').notNull(),\n kind: text('kind').notNull(),\n name: text('name').notNull(),\n startLine: integer('start_line').notNull(),\n startColumn: integer('start_column').notNull(),\n endLine: integer('end_line').notNull(),\n endColumn: integer('end_column').notNull(),\n isExported: integer('is_exported').notNull().default(0),\n signature: text('signature'),\n fingerprint: text('fingerprint'),\n detailJson: text('detail_json'),\n contentHash: text('content_hash').notNull(),\n indexedAt: text('indexed_at').notNull(),\n },\n (table) => [\n index('idx_symbols_project_file').on(table.project, table.filePath),\n index('idx_symbols_project_kind').on(table.project, table.kind),\n index('idx_symbols_project_name').on(table.project, table.name),\n index('idx_symbols_fingerprint').on(table.project, table.fingerprint),\n foreignKey({\n columns: [table.project, table.filePath],\n foreignColumns: [files.project, files.filePath],\n }).onDelete('cascade'),\n ],\n);\n\nexport const relations = sqliteTable(\n 'relations',\n {\n id: integer('id').primaryKey({ autoIncrement: true }),\n project: text('project').notNull(),\n type: text('type').notNull(),\n srcFilePath: text('src_file_path').notNull(),\n srcSymbolName: text('src_symbol_name'),\n dstFilePath: text('dst_file_path').notNull(),\n dstSymbolName: text('dst_symbol_name'),\n metaJson: text('meta_json'),\n },\n (table) => [\n index('idx_relations_src').on(table.project, table.srcFilePath),\n index('idx_relations_dst').on(table.project, table.dstFilePath),\n index('idx_relations_type').on(table.project, table.type),\n foreignKey({\n columns: [table.project, table.srcFilePath],\n foreignColumns: [files.project, files.filePath],\n }).onDelete('cascade'),\n foreignKey({\n columns: [table.project, table.dstFilePath],\n foreignColumns: [files.project, files.filePath],\n }).onDelete('cascade'),\n ],\n);\n\nexport const watcherOwner = sqliteTable(\n 'watcher_owner',\n {\n id: integer('id').primaryKey(),\n pid: integer('pid').notNull(),\n startedAt: text('started_at').notNull(),\n heartbeatAt: text('heartbeat_at').notNull(),\n },\n (table) => [check('watcher_owner_singleton', sql`${table.id} = 1`)],\n);\n\nexport const FTS_SETUP_SQL: readonly string[] = [\n `CREATE VIRTUAL TABLE IF NOT EXISTS symbols_fts USING fts5(\n name,\n file_path,\n kind,\n content=symbols,\n content_rowid=id\n )`,\n\n `CREATE TRIGGER IF NOT EXISTS symbols_ai\n AFTER INSERT ON symbols BEGIN\n INSERT INTO symbols_fts(rowid, name, file_path, kind)\n VALUES (new.id, new.name, new.file_path, new.kind);\n END`,\n\n `CREATE TRIGGER IF NOT EXISTS symbols_ad\n AFTER DELETE ON symbols BEGIN\n INSERT INTO symbols_fts(symbols_fts, rowid, name, file_path, kind)\n VALUES ('delete', old.id, old.name, old.file_path, old.kind);\n END`,\n\n `CREATE TRIGGER IF NOT EXISTS symbols_au\n AFTER UPDATE ON symbols BEGIN\n INSERT INTO symbols_fts(symbols_fts, rowid, name, file_path, kind)\n VALUES ('delete', old.id, old.name, old.file_path, old.kind);\n INSERT INTO symbols_fts(rowid, name, file_path, kind)\n VALUES (new.id, new.name, new.file_path, new.kind);\n END`,\n];\n",
19
+ "import { err, isErr, type Result } from '@zipbul/result';\nimport { Database } from 'bun:sqlite';\nimport { mkdirSync, unlinkSync, existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { drizzle, type BunSQLiteDatabase } from 'drizzle-orm/bun-sqlite';\nimport { migrate } from 'drizzle-orm/bun-sqlite/migrator';\nimport { gildashError, type GildashError } from '../errors';\nimport * as schema from './schema';\n\n\nexport interface DbConnectionOptions {\n projectRoot: string;\n}\n\nexport class DbConnection {\n private client: Database | null = null;\n private drizzle: BunSQLiteDatabase<typeof schema> | null = null;\n private readonly dbPath: string;\n private txDepth = 0;\n\n constructor(opts: DbConnectionOptions) {\n this.dbPath = join(opts.projectRoot, '.zipbul', 'gildash.db');\n }\n\n get drizzleDb(): BunSQLiteDatabase<typeof schema> {\n if (!this.drizzle) throw new Error('Database is not open. Call open() first.');\n return this.drizzle;\n }\n\n open(): Result<void, GildashError> {\n try {\n mkdirSync(dirname(this.dbPath), { recursive: true });\n this.client = new Database(this.dbPath);\n\n this.client.run('PRAGMA journal_mode = WAL');\n this.client.run('PRAGMA foreign_keys = ON');\n this.client.run('PRAGMA busy_timeout = 5000');\n\n this.drizzle = drizzle(this.client, { schema });\n\n migrate(this.drizzle, {\n migrationsFolder: join(import.meta.dirname, 'migrations'),\n });\n\n // bun:sqlite Database.function() is not available in all Bun versions.\n // Regex filtering falls back to JS-layer post-processing when this is absent.\n const clientAny = this.client as unknown as Record<string, unknown>;\n if (typeof clientAny['function'] === 'function') {\n (clientAny['function'] as Function).call(\n this.client,\n 'regexp',\n (pattern: string, value: string): number => {\n try {\n return new RegExp(pattern).test(value) ? 1 : 0;\n } catch {\n return 0;\n }\n },\n );\n }\n } catch (e) {\n if (this.isCorruptionError(e) && existsSync(this.dbPath)) {\n this.closeClient();\n unlinkSync(this.dbPath);\n for (const ext of ['-wal', '-shm']) {\n const p = this.dbPath + ext;\n if (existsSync(p)) unlinkSync(p);\n }\n const retryResult = this.open();\n if (isErr(retryResult)) {\n return err(gildashError('store', `Failed to recover database at ${this.dbPath}`, retryResult.data));\n }\n return retryResult;\n }\n return err(gildashError('store', `Failed to open database at ${this.dbPath}`, e));\n }\n }\n\n close(): void {\n this.closeClient();\n this.drizzle = null;\n }\n\n transaction<T>(fn: (tx: DbConnection) => T): T {\n const db = this.requireClient();\n\n if (this.txDepth === 0) {\n this.txDepth++;\n try {\n return db.transaction(() => fn(this))();\n } finally {\n this.txDepth--;\n }\n }\n\n const sp = `sp_${this.txDepth++}`;\n db.run(`SAVEPOINT \"${sp}\"`);\n try {\n const result = fn(this);\n db.run(`RELEASE SAVEPOINT \"${sp}\"`);\n return result;\n } catch (err) {\n db.run(`ROLLBACK TO SAVEPOINT \"${sp}\"`);\n db.run(`RELEASE SAVEPOINT \"${sp}\"`);\n throw err;\n } finally {\n this.txDepth--;\n }\n }\n\n immediateTransaction<T>(fn: () => T): T {\n const db = this.requireClient();\n this.txDepth++;\n db.run('BEGIN IMMEDIATE');\n try {\n const result = fn();\n db.run('COMMIT');\n return result;\n } catch (err) {\n db.run('ROLLBACK');\n throw err;\n } finally {\n this.txDepth--;\n }\n }\n\n query(sql: string): unknown {\n const row = this.requireClient().prepare(sql).get() as Record<string, unknown> | null;\n if (!row) return null;\n return Object.values(row)[0];\n }\n\n getTableNames(): string[] {\n const rows = this.requireClient()\n .query(\"SELECT name FROM sqlite_master WHERE type = 'table'\")\n .all() as Array<{ name: string }>;\n return rows.map((r) => r.name);\n }\n\n selectOwner(): { pid: number; heartbeat_at: string } | undefined {\n const row = this.requireClient()\n .prepare('SELECT pid, heartbeat_at FROM watcher_owner WHERE id = 1')\n .get() as { pid: number; heartbeat_at: string } | null;\n return row ?? undefined;\n }\n\n insertOwner(pid: number): void {\n const now = new Date().toISOString();\n this.requireClient()\n .prepare('INSERT INTO watcher_owner (id, pid, started_at, heartbeat_at) VALUES (1, ?, ?, ?)')\n .run(pid, now, now);\n }\n\n replaceOwner(pid: number): void {\n const now = new Date().toISOString();\n this.requireClient()\n .prepare('INSERT OR REPLACE INTO watcher_owner (id, pid, started_at, heartbeat_at) VALUES (1, ?, ?, ?)')\n .run(pid, now, now);\n }\n\n touchOwner(pid: number): void {\n const now = new Date().toISOString();\n this.requireClient()\n .prepare('UPDATE watcher_owner SET heartbeat_at = ? WHERE id = 1 AND pid = ?')\n .run(now, pid);\n }\n\n deleteOwner(pid: number): void {\n this.requireClient()\n .prepare('DELETE FROM watcher_owner WHERE id = 1 AND pid = ?')\n .run(pid);\n }\n\n private requireClient(): Database {\n if (!this.client) throw new Error('Database is not open. Call open() first.');\n return this.client;\n }\n\n private closeClient(): void {\n if (this.client) {\n this.client.close();\n this.client = null;\n }\n }\n\n private isCorruptionError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n const msg = err.message.toLowerCase();\n return (\n msg.includes('malformed') ||\n msg.includes('corrupt') ||\n msg.includes('not a database') ||\n msg.includes('disk i/o error') ||\n msg.includes('sqlite_corrupt')\n );\n }\n}\n",
20
+ "import { sql } from 'drizzle-orm';\nimport {\n sqliteTable,\n text,\n integer,\n real,\n index,\n primaryKey,\n foreignKey,\n check,\n} from 'drizzle-orm/sqlite-core';\n\nexport const files = sqliteTable(\n 'files',\n {\n project: text('project').notNull(),\n filePath: text('file_path').notNull(),\n mtimeMs: real('mtime_ms').notNull(),\n size: integer('size').notNull(),\n contentHash: text('content_hash').notNull(),\n updatedAt: text('updated_at').notNull(),\n lineCount: integer('line_count'),\n },\n (table) => [primaryKey({ columns: [table.project, table.filePath] })],\n);\n\nexport const symbols = sqliteTable(\n 'symbols',\n {\n id: integer('id').primaryKey({ autoIncrement: true }),\n project: text('project').notNull(),\n filePath: text('file_path').notNull(),\n kind: text('kind').notNull(),\n name: text('name').notNull(),\n startLine: integer('start_line').notNull(),\n startColumn: integer('start_column').notNull(),\n endLine: integer('end_line').notNull(),\n endColumn: integer('end_column').notNull(),\n isExported: integer('is_exported').notNull().default(0),\n signature: text('signature'),\n fingerprint: text('fingerprint'),\n detailJson: text('detail_json'),\n contentHash: text('content_hash').notNull(),\n indexedAt: text('indexed_at').notNull(),\n },\n (table) => [\n index('idx_symbols_project_file').on(table.project, table.filePath),\n index('idx_symbols_project_kind').on(table.project, table.kind),\n index('idx_symbols_project_name').on(table.project, table.name),\n index('idx_symbols_fingerprint').on(table.project, table.fingerprint),\n foreignKey({\n columns: [table.project, table.filePath],\n foreignColumns: [files.project, files.filePath],\n }).onDelete('cascade'),\n ],\n);\n\nexport const relations = sqliteTable(\n 'relations',\n {\n id: integer('id').primaryKey({ autoIncrement: true }),\n project: text('project').notNull(),\n type: text('type').notNull(),\n srcFilePath: text('src_file_path').notNull(),\n srcSymbolName: text('src_symbol_name'),\n dstFilePath: text('dst_file_path').notNull(),\n dstSymbolName: text('dst_symbol_name'),\n metaJson: text('meta_json'),\n },\n (table) => [\n index('idx_relations_src').on(table.project, table.srcFilePath),\n index('idx_relations_dst').on(table.project, table.dstFilePath),\n index('idx_relations_type').on(table.project, table.type),\n foreignKey({\n columns: [table.project, table.srcFilePath],\n foreignColumns: [files.project, files.filePath],\n }).onDelete('cascade'),\n foreignKey({\n columns: [table.project, table.dstFilePath],\n foreignColumns: [files.project, files.filePath],\n }).onDelete('cascade'),\n ],\n);\n\nexport const watcherOwner = sqliteTable(\n 'watcher_owner',\n {\n id: integer('id').primaryKey(),\n pid: integer('pid').notNull(),\n startedAt: text('started_at').notNull(),\n heartbeatAt: text('heartbeat_at').notNull(),\n },\n (table) => [check('watcher_owner_singleton', sql`${table.id} = 1`)],\n);\n\n\n",
21
21
  "import { eq, and } from 'drizzle-orm';\nimport { files } from '../schema';\nimport type { DbConnection } from '../connection';\n\n/**\n * Metadata record for an indexed source file.\n *\n * Stored and retrieved by {@link FileRepository}.\n * Exposed via {@link Gildash.getFileInfo}.\n */\nexport interface FileRecord {\n /** Project name this file belongs to. */\n project: string;\n /** File path relative to the project root. */\n filePath: string;\n /** Last-modified timestamp in milliseconds since epoch. */\n mtimeMs: number;\n /** File size in bytes at the time of indexing. */\n size: number;\n /** SHA-256 content hash of the file at the time of indexing. */\n contentHash: string;\n /** ISO 8601 timestamp of the last index update. */\n updatedAt: string;\n /** Number of lines in the file at the time of indexing. */\n lineCount?: number | null;\n}\n\nexport class FileRepository {\n constructor(private readonly db: DbConnection) {}\n\n getFile(project: string, filePath: string): FileRecord | null {\n return this.db.drizzleDb\n .select()\n .from(files)\n .where(and(eq(files.project, project), eq(files.filePath, filePath)))\n .get() ?? null;\n }\n\n upsertFile(record: FileRecord): void {\n this.db.drizzleDb\n .insert(files)\n .values({\n project: record.project,\n filePath: record.filePath,\n mtimeMs: record.mtimeMs,\n size: record.size,\n contentHash: record.contentHash,\n updatedAt: record.updatedAt,\n lineCount: record.lineCount ?? null,\n })\n .onConflictDoUpdate({\n target: [files.project, files.filePath],\n set: {\n mtimeMs: record.mtimeMs,\n size: record.size,\n contentHash: record.contentHash,\n updatedAt: record.updatedAt,\n lineCount: record.lineCount ?? null,\n },\n })\n .run();\n }\n\n getAllFiles(project: string): FileRecord[] {\n return this.db.drizzleDb\n .select()\n .from(files)\n .where(eq(files.project, project))\n .all();\n }\n\n getFilesMap(project: string): Map<string, FileRecord> {\n const rows = this.getAllFiles(project);\n const map = new Map<string, FileRecord>();\n for (const r of rows) map.set(r.filePath, r);\n return map;\n }\n\n deleteFile(project: string, filePath: string): void {\n this.db.drizzleDb\n .delete(files)\n .where(and(eq(files.project, project), eq(files.filePath, filePath)))\n .run();\n }\n}\n",
22
22
  "import { eq, and, sql, count } from 'drizzle-orm';\nimport { symbols } from '../schema';\nimport type { DbConnection } from '../connection';\nimport { toFtsPrefixQuery } from './fts-utils';\n\nexport interface SymbolRecord {\n project: string;\n filePath: string;\n kind: string;\n name: string;\n startLine: number;\n startColumn: number;\n endLine: number;\n endColumn: number;\n isExported: number;\n signature: string | null;\n fingerprint: string | null;\n detailJson: string | null;\n contentHash: string;\n indexedAt: string;\n}\n\nexport interface SearchOptions {\n kind?: string;\n limit?: number;\n}\n\n/**\n * Aggregate symbol statistics for a project.\n *\n * Returned by {@link Gildash.getStats}.\n */\nexport interface SymbolStats {\n /** Total number of indexed symbols. */\n symbolCount: number;\n /** Total number of indexed source files. */\n fileCount: number;\n}\n\nexport class SymbolRepository {\n constructor(private readonly db: DbConnection) {}\n\n replaceFileSymbols(\n project: string,\n filePath: string,\n contentHash: string,\n syms: ReadonlyArray<Partial<SymbolRecord>>,\n ): void {\n this.db.drizzleDb\n .delete(symbols)\n .where(and(eq(symbols.project, project), eq(symbols.filePath, filePath)))\n .run();\n\n if (!syms.length) return;\n\n const now = new Date().toISOString();\n for (const sym of syms) {\n this.db.drizzleDb.insert(symbols).values({\n project,\n filePath,\n kind: sym.kind ?? 'unknown',\n name: sym.name ?? '',\n startLine: sym.startLine ?? 0,\n startColumn: sym.startColumn ?? 0,\n endLine: sym.endLine ?? 0,\n endColumn: sym.endColumn ?? 0,\n isExported: sym.isExported ?? 0,\n signature: sym.signature ?? null,\n fingerprint: sym.fingerprint ?? null,\n detailJson: sym.detailJson ?? null,\n contentHash,\n indexedAt: sym.indexedAt ?? now,\n }).run();\n }\n }\n\n getFileSymbols(project: string, filePath: string): SymbolRecord[] {\n return this.db.drizzleDb\n .select()\n .from(symbols)\n .where(and(eq(symbols.project, project), eq(symbols.filePath, filePath)))\n .all();\n }\n\n searchByName(project: string, query: string, opts: SearchOptions = {}): SymbolRecord[] {\n const limit = opts.limit ?? 50;\n const ftsQuery = toFtsPrefixQuery(query);\n\n if (!ftsQuery) return [];\n\n let builder = this.db.drizzleDb\n .select()\n .from(symbols)\n .where(\n and(\n sql`${symbols.id} IN (SELECT rowid FROM symbols_fts WHERE symbols_fts MATCH ${ftsQuery})`,\n eq(symbols.project, project),\n opts.kind ? eq(symbols.kind, opts.kind) : undefined,\n ),\n )\n .orderBy(symbols.name)\n .limit(limit);\n\n return builder.all();\n }\n\n searchByKind(project: string, kind: string): SymbolRecord[] {\n return this.db.drizzleDb\n .select()\n .from(symbols)\n .where(and(eq(symbols.project, project), eq(symbols.kind, kind)))\n .orderBy(symbols.name)\n .all();\n }\n\n getStats(project: string): SymbolStats {\n const row = this.db.drizzleDb\n .select({\n symbolCount: count(),\n fileCount: sql<number>`COUNT(DISTINCT ${symbols.filePath})`,\n })\n .from(symbols)\n .where(eq(symbols.project, project))\n .get();\n return {\n symbolCount: row?.symbolCount ?? 0,\n fileCount: row?.fileCount ?? 0,\n };\n }\n\n getByFingerprint(project: string, fingerprint: string): SymbolRecord[] {\n return this.db.drizzleDb\n .select()\n .from(symbols)\n .where(and(eq(symbols.project, project), eq(symbols.fingerprint, fingerprint)))\n .all();\n }\n\n deleteFileSymbols(project: string, filePath: string): void {\n this.db.drizzleDb\n .delete(symbols)\n .where(and(eq(symbols.project, project), eq(symbols.filePath, filePath)))\n .run();\n }\n\n searchByQuery(opts: {\n ftsQuery?: string;\n exactName?: string;\n kind?: string;\n filePath?: string;\n isExported?: boolean;\n project?: string;\n limit: number;\n decorator?: string;\n regex?: string;\n }): (SymbolRecord & { id: number })[] {\n const results = this.db.drizzleDb\n .select()\n .from(symbols)\n .where(\n and(\n opts.ftsQuery\n ? sql`${symbols.id} IN (SELECT rowid FROM symbols_fts WHERE symbols_fts MATCH ${opts.ftsQuery})`\n : undefined,\n opts.exactName ? eq(symbols.name, opts.exactName) : undefined,\n opts.project !== undefined ? eq(symbols.project, opts.project) : undefined,\n opts.kind ? eq(symbols.kind, opts.kind) : undefined,\n opts.filePath !== undefined ? eq(symbols.filePath, opts.filePath) : undefined,\n opts.isExported !== undefined\n ? eq(symbols.isExported, opts.isExported ? 1 : 0)\n : undefined,\n opts.decorator\n ? sql`${symbols.id} IN (SELECT s.id FROM symbols s, json_each(s.detail_json, '$.decorators') je WHERE json_extract(je.value, '$.name') = ${opts.decorator})`\n : undefined,\n // NOTE: regex is applied as a JS-layer post-filter below; no SQL condition here.\n ),\n )\n .orderBy(symbols.name)\n // Fetch a larger pool when regex filtering is needed, since JS filtering reduces the result set.\n .limit(opts.regex ? Math.max(opts.limit * 50, 5000) : opts.limit)\n .all() as (SymbolRecord & { id: number })[];\n\n if (!opts.regex) return results;\n\n // JS-layer regex post-filter (SQL REGEXP UDF not available in all Bun versions)\n try {\n const pattern = new RegExp(opts.regex);\n return results.filter(r => pattern.test(r.name)).slice(0, opts.limit) as (SymbolRecord & { id: number })[];\n } catch {\n return [];\n }\n }\n}\n",
23
23
  "export function toFtsPrefixQuery(text: string): string {\n return text\n .trim()\n .split(/\\s+/)\n .map((token) => token.trim())\n .filter((token) => token.length > 0)\n .map((token) => `\"${token.replaceAll('\"', '\"\"')}\"*`)\n .join(' ');\n}\n",
@@ -34,10 +34,10 @@
34
34
  "import type { WatcherRole } from \"./types\";\n\ninterface WatcherOwnerRow {\n pid: number;\n heartbeat_at: string;\n}\n\nexport interface WatcherOwnerStore {\n immediateTransaction<T>(fn: () => T): T;\n selectOwner(): WatcherOwnerRow | undefined;\n insertOwner(pid: number): void;\n replaceOwner(pid: number): void;\n touchOwner(pid: number): void;\n deleteOwner(pid: number): void;\n}\n\ninterface AcquireOptions {\n now?: () => number;\n isAlive?: (pid: number) => boolean;\n staleAfterSeconds?: number;\n}\n\nfunction defaultIsAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n if (typeof error === \"object\" && error && \"code\" in error) {\n return (error as { code?: string }).code !== \"ESRCH\";\n }\n\n return true;\n }\n}\n\nfunction toEpochMs(value: string): number {\n const ms = new Date(value).getTime();\n return Number.isNaN(ms) ? 0 : ms;\n}\n\nexport function acquireWatcherRole(\n db: WatcherOwnerStore,\n pid: number,\n options: AcquireOptions = {},\n): WatcherRole {\n const now = options.now ?? Date.now;\n const isAlive = options.isAlive ?? defaultIsAlive;\n const staleAfterSeconds = options.staleAfterSeconds ?? 90;\n\n return db.immediateTransaction(() => {\n const owner = db.selectOwner();\n if (!owner) {\n db.insertOwner(pid);\n return \"owner\";\n }\n\n const heartbeatAgeSeconds = Math.floor((now() - toEpochMs(owner.heartbeat_at)) / 1000);\n if (isAlive(owner.pid) && heartbeatAgeSeconds < staleAfterSeconds) {\n return \"reader\";\n }\n\n db.replaceOwner(pid);\n return \"owner\";\n });\n}\n\nexport function releaseWatcherRole(db: WatcherOwnerStore, pid: number): void {\n db.deleteOwner(pid);\n}\n\nexport function updateHeartbeat(db: WatcherOwnerStore, pid: number): void {\n db.touchOwner(pid);\n}\n",
35
35
  "import type { SymbolKind } from '../extractor/types';\nimport type { SymbolRecord } from '../store/repositories/symbol.repository';\nimport { toFtsPrefixQuery } from '../store/repositories/fts-utils';\n\n/**\n * Filters for {@link symbolSearch}.\n *\n * All fields are optional. Omitted fields impose no constraint.\n */\nexport interface SymbolSearchQuery {\n /** Full-text search on symbol names (prefix matching). */\n text?: string;\n /** Exact symbol name match. When `true`, `text` is treated as an exact name (not FTS prefix). */\n exact?: boolean;\n /** Restrict to a specific {@link SymbolKind}. */\n kind?: SymbolKind;\n /** Restrict to symbols declared in this file path. */\n filePath?: string;\n /** `true` for exported symbols only, `false` for non-exported only. */\n isExported?: boolean;\n /** Limit results to this project. Defaults to the primary project. */\n project?: string;\n /** Maximum number of results. Defaults to `100`. */\n limit?: number;\n /**\n * Filter by decorator name (LEG-1).\n * Restricts results to symbols annotated with this decorator (matched against `detailJson.decorators[].name`).\n */\n decorator?: string;\n /**\n * Filter by regex pattern applied to the symbol name (FR-19).\n * Requires the `REGEXP` SQL function to be registered in the DB connection.\n */\n regex?: string;\n}\n\n/**\n * A single result returned by {@link symbolSearch}.\n */\nexport interface SymbolSearchResult {\n /** Database row id. */\n id: number;\n /** Absolute file path containing the symbol. */\n filePath: string;\n /** Kind of the symbol (function, class, variable, etc.). */\n kind: SymbolKind;\n /** Symbol name. */\n name: string;\n /** Source location span (start/end line and column). */\n span: { start: { line: number; column: number }; end: { line: number; column: number } };\n /** Whether the symbol is exported from its module. */\n isExported: boolean;\n /** Human-readable signature text, if available. */\n signature: string | null;\n /** Content-hash fingerprint for change detection. */\n fingerprint: string | null;\n /** Arbitrary detail fields stored as JSON. */\n detail: Record<string, unknown>;\n}\n\nexport interface ISymbolRepo {\n searchByQuery(opts: {\n ftsQuery?: string;\n exactName?: string;\n kind?: string;\n filePath?: string;\n isExported?: boolean;\n project?: string;\n limit: number;\n decorator?: string;\n regex?: string;\n }): (SymbolRecord & { id: number })[];\n}\n\n/**\n * Search the symbol index using the given query filters.\n *\n * @param options - Symbol repository, default project, and search query.\n * @returns An array of {@link SymbolSearchResult} entries matching the query.\n */\nexport function symbolSearch(options: {\n symbolRepo: ISymbolRepo;\n project?: string;\n query: SymbolSearchQuery;\n}): SymbolSearchResult[] {\n const { symbolRepo, project, query } = options;\n const effectiveProject = query.project ?? project;\n const limit = query.limit ?? 100;\n\n const opts: Parameters<ISymbolRepo['searchByQuery']>[0] = {\n kind: query.kind,\n filePath: query.filePath,\n isExported: query.isExported,\n project: effectiveProject,\n limit,\n };\n\n if (query.text) {\n if (query.exact) {\n opts.exactName = query.text;\n } else {\n const ftsQuery = toFtsPrefixQuery(query.text);\n if (ftsQuery) opts.ftsQuery = ftsQuery;\n }\n }\n\n if (query.decorator) opts.decorator = query.decorator;\n if (query.regex) opts.regex = query.regex;\n\n const records = symbolRepo.searchByQuery(opts);\n\n return records.map(r => ({\n id: r.id,\n filePath: r.filePath,\n kind: r.kind as SymbolKind,\n name: r.name,\n span: {\n start: { line: r.startLine, column: r.startColumn },\n end: { line: r.endLine, column: r.endColumn },\n },\n isExported: r.isExported === 1,\n signature: r.signature,\n fingerprint: r.fingerprint,\n detail: r.detailJson ? (() => {\n try { return JSON.parse(r.detailJson!) as Record<string, unknown>; }\n catch { return {}; }\n })() : {},\n }));\n}\n",
36
36
  "import type { CodeRelation } from '../extractor/types';\nimport type { RelationRecord } from '../store/repositories/relation.repository';\n\n/**\n * Filters for {@link relationSearch}.\n *\n * All fields are optional. Omitted fields impose no constraint.\n */\nexport interface RelationSearchQuery {\n /** Source file path. */\n srcFilePath?: string;\n /** Source symbol name. */\n srcSymbolName?: string;\n /** Destination file path. */\n dstFilePath?: string;\n /** Destination symbol name. */\n dstSymbolName?: string;\n /** Relationship type: `'imports'`, `'calls'`, `'extends'`, or `'implements'`. */\n type?: CodeRelation['type'];\n /** Limit results to this project. */\n project?: string;\n /** Maximum number of results. Defaults to `500`. */\n limit?: number;\n}\n\nexport interface IRelationRepo {\n searchRelations(opts: {\n srcFilePath?: string;\n srcSymbolName?: string;\n dstFilePath?: string;\n dstSymbolName?: string;\n type?: string;\n project?: string;\n limit: number;\n }): RelationRecord[];\n}\n\n/**\n * Search the relation index using the given query filters.\n *\n * @param options - Relation repository, default project, and search query.\n * @returns An array of {@link CodeRelation} entries matching the query.\n */\nexport function relationSearch(options: {\n relationRepo: IRelationRepo;\n project?: string;\n query: RelationSearchQuery;\n}): CodeRelation[] {\n const { relationRepo, project, query } = options;\n const effectiveProject = query.project ?? project;\n const limit = query.limit ?? 500;\n\n const records = relationRepo.searchRelations({\n srcFilePath: query.srcFilePath,\n srcSymbolName: query.srcSymbolName,\n dstFilePath: query.dstFilePath,\n dstSymbolName: query.dstSymbolName,\n type: query.type,\n project: effectiveProject,\n limit,\n });\n\n return records.map(r => {\n let meta: Record<string, unknown> | undefined;\n if (r.metaJson) {\n try {\n meta = JSON.parse(r.metaJson) as Record<string, unknown>;\n } catch {\n console.error('[relationSearch] malformed metaJson:', r.metaJson);\n }\n }\n return {\n type: r.type as CodeRelation['type'],\n srcFilePath: r.srcFilePath,\n srcSymbolName: r.srcSymbolName,\n dstFilePath: r.dstFilePath,\n dstSymbolName: r.dstSymbolName,\n metaJson: r.metaJson ?? undefined,\n meta,\n };\n });\n}\n",
37
- "import type { RelationRecord } from '../store/repositories/relation.repository';\n\nexport interface IDependencyGraphRepo {\n getByType(project: string, type: string): RelationRecord[];\n}\n\n/**\n * Directed import graph for dependency analysis.\n *\n * Build the graph once with {@link DependencyGraph.build}, then query\n * dependencies, dependents, cycles, and change-impact.\n *\n * @example\n * ```ts\n * const graph = new DependencyGraph({ relationRepo, project: 'my-app' });\n * graph.build();\n * graph.getDependencies('/src/a.ts'); // files that a.ts imports\n * graph.getDependents('/src/a.ts'); // files that import a.ts\n * graph.hasCycle(); // true if a circular import exists\n * ```\n */\nexport class DependencyGraph {\n private adjacencyList = new Map<string, Set<string>>();\n private reverseAdjacencyList = new Map<string, Set<string>>();\n\n constructor(\n private readonly options: {\n relationRepo: IDependencyGraphRepo;\n project: string;\n },\n ) {}\n\n /**\n * Populate the graph by reading all `imports` relations from the store.\n *\n * Must be called before any query method.\n */\n build(): void {\n this.adjacencyList = new Map();\n this.reverseAdjacencyList = new Map();\n\n const relations = [\n ...this.options.relationRepo.getByType(this.options.project, 'imports'),\n ...this.options.relationRepo.getByType(this.options.project, 'type-references'),\n ...this.options.relationRepo.getByType(this.options.project, 're-exports'),\n ];\n\n for (const rel of relations) {\n const { srcFilePath, dstFilePath } = rel;\n\n if (!this.adjacencyList.has(srcFilePath)) {\n this.adjacencyList.set(srcFilePath, new Set());\n }\n this.adjacencyList.get(srcFilePath)!.add(dstFilePath);\n\n // ensure destination node also appears as a key (with no outgoing edges)\n if (!this.adjacencyList.has(dstFilePath)) {\n this.adjacencyList.set(dstFilePath, new Set());\n }\n\n if (!this.reverseAdjacencyList.has(dstFilePath)) {\n this.reverseAdjacencyList.set(dstFilePath, new Set());\n }\n this.reverseAdjacencyList.get(dstFilePath)!.add(srcFilePath);\n }\n }\n\n /**\n * Return the files that `filePath` directly imports.\n *\n * @param filePath - Absolute file path.\n */\n getDependencies(filePath: string): string[] {\n return Array.from(this.adjacencyList.get(filePath) ?? []);\n }\n\n /**\n * Return the files that directly import `filePath`.\n *\n * @param filePath - Absolute file path.\n */\n getDependents(filePath: string): string[] {\n return Array.from(this.reverseAdjacencyList.get(filePath) ?? []);\n }\n\n /**\n * Return all files that transitively depend on `filePath`\n * (breadth-first reverse walk).\n *\n * @param filePath - Absolute file path.\n */\n getTransitiveDependents(filePath: string): string[] {\n const visited = new Set<string>();\n const queue: string[] = [filePath];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n for (const dependent of this.reverseAdjacencyList.get(current) ?? []) {\n if (!visited.has(dependent)) {\n visited.add(dependent);\n queue.push(dependent);\n }\n }\n }\n\n return Array.from(visited);\n }\n\n /**\n * Detect whether the import graph contains at least one cycle.\n *\n * Uses iterative DFS with a path-tracking set.\n *\n * @returns `true` if a circular dependency exists.\n */\n hasCycle(): boolean {\n const visited = new Set<string>();\n const inPath = new Set<string>();\n\n for (const startNode of this.adjacencyList.keys()) {\n if (visited.has(startNode)) continue;\n\n const stack: Array<{ node: string; entered: boolean }> = [{ node: startNode, entered: false }];\n\n while (stack.length > 0) {\n const current = stack.pop()!;\n\n if (current.entered) {\n inPath.delete(current.node);\n continue;\n }\n\n if (inPath.has(current.node)) {\n return true;\n }\n\n if (visited.has(current.node)) {\n continue;\n }\n\n visited.add(current.node);\n inPath.add(current.node);\n stack.push({ node: current.node, entered: true });\n\n for (const neighbor of this.adjacencyList.get(current.node) ?? []) {\n if (inPath.has(neighbor)) {\n return true;\n }\n if (!visited.has(neighbor)) {\n stack.push({ node: neighbor, entered: false });\n }\n }\n }\n }\n\n return false;\n }\n\n /**\n * Compute all files transitively affected by a set of changed files.\n *\n * Combines {@link getTransitiveDependents} for every changed file\n * and de-duplicates the result.\n *\n * @param changedFiles - Absolute paths of files that changed.\n * @returns Paths of all transitively-dependent files.\n */\n getAffectedByChange(changedFiles: string[]): string[] {\n const allAffected = new Set<string>();\n\n for (const file of changedFiles) {\n for (const dep of this.getTransitiveDependents(file)) {\n allAffected.add(dep);\n }\n }\n\n return Array.from(allAffected);\n }\n\n /**\n * Return the full import graph as an adjacency list.\n *\n * Each key is a file path (both source and destination files are included as keys).\n * The associated value lists the files it directly imports.\n *\n * @returns A new `Map<filePath, importedFilePaths[]>`.\n */\n getAdjacencyList(): Map<string, string[]> {\n const result = new Map<string, string[]>();\n for (const [node, edges] of this.adjacencyList) {\n result.set(node, Array.from(edges));\n }\n return result;\n }\n\n /**\n * Return all files that `filePath` transitively imports\n * (breadth-first forward walk).\n *\n * @param filePath - Absolute file path.\n * @returns Paths of all transitively-imported files. Does not include `filePath` itself\n * unless a cycle exists.\n */\n getTransitiveDependencies(filePath: string): string[] {\n const visited = new Set<string>();\n const queue: string[] = [filePath];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n for (const dep of this.adjacencyList.get(current) ?? []) {\n if (!visited.has(dep)) {\n visited.add(dep);\n queue.push(dep);\n }\n }\n }\n\n return Array.from(visited);\n }\n\n /**\n * Return the distinct cycle paths in the import graph.\n *\n * Each cycle is represented as a list of file paths in canonical form\n * (rotated so the lexicographically smallest node comes first).\n * Duplicate cycles are deduplicated.\n *\n * @returns An array of cycles, where each cycle is a `string[]` of file paths.\n */\n getCyclePaths(): string[][] {\n const seenCycles = new Set<string>();\n const cycles: string[][] = [];\n const globalVisited = new Set<string>();\n const inPath = new Map<string, number>();\n const path: string[] = [];\n\n const dfs = (node: string): void => {\n if (globalVisited.has(node)) return;\n if (inPath.has(node)) {\n const cycleStart = inPath.get(node)!;\n const cycle = path.slice(cycleStart);\n const minNode = cycle.reduce((a, b) => (a <= b ? a : b));\n const idx = cycle.indexOf(minNode);\n const canonical = [...cycle.slice(idx), ...cycle.slice(0, idx)];\n const key = canonical.join('\\0');\n if (!seenCycles.has(key)) {\n seenCycles.add(key);\n cycles.push(canonical);\n }\n return;\n }\n inPath.set(node, path.length);\n path.push(node);\n for (const neighbor of this.adjacencyList.get(node) ?? []) {\n dfs(neighbor);\n }\n path.pop();\n inPath.delete(node);\n globalVisited.add(node);\n };\n\n for (const startNode of this.adjacencyList.keys()) {\n dfs(startNode);\n }\n\n return cycles;\n }\n}\n",
37
+ "import type { RelationRecord } from '../store/repositories/relation.repository';\n\nexport interface IDependencyGraphRepo {\n getByType(project: string, type: string): RelationRecord[];\n}\n\n/**\n * Directed import graph for dependency analysis.\n *\n * Build the graph once with {@link DependencyGraph.build}, then query\n * dependencies, dependents, cycles, and change-impact.\n *\n * @example\n * ```ts\n * const graph = new DependencyGraph({ relationRepo, project: 'my-app' });\n * graph.build();\n * graph.getDependencies('/src/a.ts'); // files that a.ts imports\n * graph.getDependents('/src/a.ts'); // files that import a.ts\n * graph.hasCycle(); // true if a circular import exists\n * ```\n */\nexport class DependencyGraph {\n private adjacencyList = new Map<string, Set<string>>();\n private reverseAdjacencyList = new Map<string, Set<string>>();\n\n constructor(\n private readonly options: {\n relationRepo: IDependencyGraphRepo;\n project: string;\n },\n ) {}\n\n /**\n * Populate the graph by reading all `imports` relations from the store.\n *\n * Must be called before any query method.\n */\n build(): void {\n this.adjacencyList = new Map();\n this.reverseAdjacencyList = new Map();\n\n const relations = [\n ...this.options.relationRepo.getByType(this.options.project, 'imports'),\n ...this.options.relationRepo.getByType(this.options.project, 'type-references'),\n ...this.options.relationRepo.getByType(this.options.project, 're-exports'),\n ];\n\n for (const rel of relations) {\n const { srcFilePath, dstFilePath } = rel;\n\n if (!this.adjacencyList.has(srcFilePath)) {\n this.adjacencyList.set(srcFilePath, new Set());\n }\n this.adjacencyList.get(srcFilePath)!.add(dstFilePath);\n\n // ensure destination node also appears as a key (with no outgoing edges)\n if (!this.adjacencyList.has(dstFilePath)) {\n this.adjacencyList.set(dstFilePath, new Set());\n }\n\n if (!this.reverseAdjacencyList.has(dstFilePath)) {\n this.reverseAdjacencyList.set(dstFilePath, new Set());\n }\n this.reverseAdjacencyList.get(dstFilePath)!.add(srcFilePath);\n }\n }\n\n /**\n * Return the files that `filePath` directly imports.\n *\n * @param filePath - Absolute file path.\n */\n getDependencies(filePath: string): string[] {\n return Array.from(this.adjacencyList.get(filePath) ?? []);\n }\n\n /**\n * Return the files that directly import `filePath`.\n *\n * @param filePath - Absolute file path.\n */\n getDependents(filePath: string): string[] {\n return Array.from(this.reverseAdjacencyList.get(filePath) ?? []);\n }\n\n /**\n * Return all files that transitively depend on `filePath`\n * (breadth-first reverse walk).\n *\n * @param filePath - Absolute file path.\n */\n getTransitiveDependents(filePath: string): string[] {\n const visited = new Set<string>();\n const queue: string[] = [filePath];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n for (const dependent of this.reverseAdjacencyList.get(current) ?? []) {\n if (!visited.has(dependent)) {\n visited.add(dependent);\n queue.push(dependent);\n }\n }\n }\n\n return Array.from(visited);\n }\n\n /**\n * Detect whether the import graph contains at least one cycle.\n *\n * Uses iterative DFS with a path-tracking set.\n *\n * @returns `true` if a circular dependency exists.\n */\n hasCycle(): boolean {\n const visited = new Set<string>();\n const inPath = new Set<string>();\n\n for (const startNode of this.adjacencyList.keys()) {\n if (visited.has(startNode)) continue;\n\n const stack: Array<{ node: string; entered: boolean }> = [{ node: startNode, entered: false }];\n\n while (stack.length > 0) {\n const current = stack.pop()!;\n\n if (current.entered) {\n inPath.delete(current.node);\n continue;\n }\n\n if (inPath.has(current.node)) {\n return true;\n }\n\n if (visited.has(current.node)) {\n continue;\n }\n\n visited.add(current.node);\n inPath.add(current.node);\n stack.push({ node: current.node, entered: true });\n\n for (const neighbor of this.adjacencyList.get(current.node) ?? []) {\n if (inPath.has(neighbor)) {\n return true;\n }\n if (!visited.has(neighbor)) {\n stack.push({ node: neighbor, entered: false });\n }\n }\n }\n }\n\n return false;\n }\n\n /**\n * Compute all files transitively affected by a set of changed files.\n *\n * Combines {@link getTransitiveDependents} for every changed file\n * and de-duplicates the result.\n *\n * @param changedFiles - Absolute paths of files that changed.\n * @returns Paths of all transitively-dependent files.\n */\n getAffectedByChange(changedFiles: string[]): string[] {\n const allAffected = new Set<string>();\n\n for (const file of changedFiles) {\n for (const dep of this.getTransitiveDependents(file)) {\n allAffected.add(dep);\n }\n }\n\n return Array.from(allAffected);\n }\n\n /**\n * Return the full import graph as an adjacency list.\n *\n * Each key is a file path (both source and destination files are included as keys).\n * The associated value lists the files it directly imports.\n *\n * @returns A new `Map<filePath, importedFilePaths[]>`.\n */\n getAdjacencyList(): Map<string, string[]> {\n const result = new Map<string, string[]>();\n for (const [node, edges] of this.adjacencyList) {\n result.set(node, Array.from(edges));\n }\n return result;\n }\n\n /**\n * Return all files that `filePath` transitively imports\n * (breadth-first forward walk).\n *\n * @param filePath - Absolute file path.\n * @returns Paths of all transitively-imported files. Does not include `filePath` itself\n * unless a cycle exists.\n */\n getTransitiveDependencies(filePath: string): string[] {\n const visited = new Set<string>();\n const queue: string[] = [filePath];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n for (const dep of this.adjacencyList.get(current) ?? []) {\n if (!visited.has(dep)) {\n visited.add(dep);\n queue.push(dep);\n }\n }\n }\n\n return Array.from(visited);\n }\n\n /**\n * Return the distinct cycle paths in the import graph.\n *\n * Each cycle is represented as a list of file paths in canonical form\n * (rotated so the lexicographically smallest node comes first).\n * Duplicate cycles are deduplicated.\n *\n * Tarjan SCC + Johnson's circuits — 모든 elementary circuit 보장.\n * `maxCycles` 옵션으로 반환 개수를 제한할 수 있습니다.\n *\n * @param options.maxCycles - Maximum number of cycles to return. Defaults to `Infinity`.\n * @returns An array of cycles, where each cycle is a `string[]` of file paths\n * in canonical form (lexicographic rotation, smallest node first).\n * Returns an empty array when no cycles exist.\n */\n getCyclePaths(options?: { maxCycles?: number }): string[][] {\n const maxCycles = options?.maxCycles ?? Infinity;\n\n if (maxCycles <= 0) return [];\n\n // Build a Map<string, string[]> snapshot of the adjacencyList\n const adjacency = new Map<string, ReadonlyArray<string>>();\n for (const [node, edges] of this.adjacencyList) {\n adjacency.set(node, Array.from(edges));\n }\n\n return detectCycles(adjacency, maxCycles);\n }\n}\n\n// ─── Tarjan SCC + Johnson's circuits (module-level helpers) ───\n\nconst compareStrings = (a: string, b: string): number => a.localeCompare(b);\n\n/**\n * Normalize a cycle to canonical form:\n * strip trailing duplicate, rotate so the lexicographically smallest node is first.\n */\nfunction normalizeCycle(cycle: ReadonlyArray<string>): string[] {\n const unique =\n cycle.length > 1 && cycle[0] === cycle[cycle.length - 1]\n ? cycle.slice(0, -1)\n : [...cycle];\n\n if (unique.length === 0) return [];\n\n let best = unique;\n for (let i = 1; i < unique.length; i++) {\n const rotated = unique.slice(i).concat(unique.slice(0, i));\n if (rotated.join('::') < best.join('::')) {\n best = rotated;\n }\n }\n\n return [...best];\n}\n\n/**\n * Record a cycle into the result set, deduplicating by canonical key.\n * Returns true if the cycle was new (added), false if duplicate.\n */\nfunction recordCyclePath(\n cycleKeys: Set<string>,\n cycles: string[][],\n path: ReadonlyArray<string>,\n): boolean {\n const normalized = normalizeCycle(path);\n if (normalized.length === 0) return false;\n\n const key = normalized.join('->');\n if (cycleKeys.has(key)) return false;\n\n cycleKeys.add(key);\n cycles.push(normalized);\n return true;\n}\n\ninterface SccResult {\n readonly components: ReadonlyArray<ReadonlyArray<string>>;\n}\n\n/**\n * Tarjan's SCC algorithm. Returns all strongly connected components.\n */\nfunction tarjanScc(graph: Map<string, ReadonlyArray<string>>): SccResult {\n let index = 0;\n const stack: string[] = [];\n const onStack = new Set<string>();\n const indices = new Map<string, number>();\n const lowlinks = new Map<string, number>();\n const components: string[][] = [];\n\n const strongConnect = (node: string): void => {\n indices.set(node, index);\n lowlinks.set(node, index);\n index += 1;\n\n stack.push(node);\n onStack.add(node);\n\n for (const next of graph.get(node) ?? []) {\n if (!indices.has(next)) {\n strongConnect(next);\n lowlinks.set(node, Math.min(lowlinks.get(node) ?? 0, lowlinks.get(next) ?? 0));\n } else if (onStack.has(next)) {\n lowlinks.set(node, Math.min(lowlinks.get(node) ?? 0, indices.get(next) ?? 0));\n }\n }\n\n if (lowlinks.get(node) === indices.get(node)) {\n const component: string[] = [];\n let current = '';\n do {\n current = stack.pop() ?? '';\n onStack.delete(current);\n component.push(current);\n } while (current !== node && stack.length > 0);\n components.push(component);\n }\n };\n\n for (const node of graph.keys()) {\n if (!indices.has(node)) {\n strongConnect(node);\n }\n }\n\n return { components };\n}\n\n/**\n * Johnson's elementary circuit algorithm.\n * Finds all elementary circuits within a single SCC sub-graph.\n */\nfunction johnsonCircuits(\n scc: ReadonlyArray<string>,\n adjacency: Map<string, ReadonlyArray<string>>,\n maxCircuits: number,\n): string[][] {\n const cycles: string[][] = [];\n const cycleKeys = new Set<string>();\n const nodes = [...scc].sort(compareStrings);\n\n const unblock = (node: string, blocked: Set<string>, blockMap: Map<string, Set<string>>): void => {\n blocked.delete(node);\n const blockedBy = blockMap.get(node);\n if (!blockedBy) return;\n for (const entry of blockedBy) {\n if (blocked.has(entry)) {\n unblock(entry, blocked, blockMap);\n }\n }\n blockedBy.clear();\n };\n\n for (let i = 0; i < nodes.length && cycles.length < maxCircuits; i++) {\n const start = nodes[i] ?? '';\n const allowed = new Set(nodes.slice(i));\n const blocked = new Set<string>();\n const blockMap = new Map<string, Set<string>>();\n const stack: string[] = [];\n\n const neighbors = (v: string): ReadonlyArray<string> =>\n (adjacency.get(v) ?? []).filter(e => allowed.has(e));\n\n const circuit = (node: string): boolean => {\n if (cycles.length >= maxCircuits) return true;\n\n let found = false;\n stack.push(node);\n blocked.add(node);\n\n for (const next of neighbors(node)) {\n if (cycles.length >= maxCircuits) break;\n\n if (next === start) {\n recordCyclePath(cycleKeys, cycles, stack.concat(start));\n found = true;\n } else if (!blocked.has(next)) {\n if (circuit(next)) {\n found = true;\n }\n }\n }\n\n if (found) {\n unblock(node, blocked, blockMap);\n } else {\n for (const next of neighbors(node)) {\n const set = blockMap.get(next) ?? new Set<string>();\n set.add(node);\n blockMap.set(next, set);\n }\n }\n\n stack.pop();\n return found;\n };\n\n circuit(start);\n }\n\n return cycles;\n}\n\n/**\n * Detect all elementary cycles using Tarjan SCC preprocessing + Johnson's circuits.\n */\nfunction detectCycles(\n adjacency: Map<string, ReadonlyArray<string>>,\n maxCycles: number,\n): string[][] {\n const { components } = tarjanScc(adjacency);\n const cycles: string[][] = [];\n const cycleKeys = new Set<string>();\n\n for (const component of components) {\n if (cycles.length >= maxCycles) break;\n\n if (component.length === 0) continue;\n\n if (component.length === 1) {\n const node = component[0] ?? '';\n const neighbors = adjacency.get(node) ?? [];\n if (neighbors.includes(node)) {\n recordCyclePath(cycleKeys, cycles, [node, node]);\n }\n continue;\n }\n\n const remaining = maxCycles - cycles.length;\n const circuits = johnsonCircuits(component, adjacency, remaining);\n\n for (const c of circuits) {\n if (cycles.length >= maxCycles) break;\n recordCyclePath(cycleKeys, cycles, c);\n }\n }\n\n return cycles;\n}\n",
38
38
  "import { findInFiles, Lang } from '@ast-grep/napi';\n\n/**\n * A single structural-pattern match found in a source file.\n */\nexport interface PatternMatch {\n /** Absolute path of the file containing the match. */\n filePath: string;\n /** 1-based start line number of the matched node. */\n startLine: number;\n /** 1-based end line number of the matched node. */\n endLine: number;\n /** Source text of the matched node. */\n matchedText: string;\n}\n\n/**\n * Options for {@link patternSearch}.\n */\nexport interface PatternSearchOptions {\n /** An ast-grep structural pattern string (e.g. `'console.log($$$)'`). */\n pattern: string;\n /** Absolute file paths (or directories) to search within. */\n filePaths: string[];\n}\n\n/**\n * Search for a structural AST pattern across a set of TypeScript/TSX files\n * using ast-grep's `findInFiles` API.\n *\n * @param opts - Pattern and file paths to search.\n * @returns An array of {@link PatternMatch} entries for all matching nodes.\n */\nexport async function patternSearch(opts: PatternSearchOptions): Promise<PatternMatch[]> {\n if (opts.filePaths.length === 0) return [];\n\n const matches: PatternMatch[] = [];\n\n await findInFiles(\n Lang.TypeScript,\n {\n paths: opts.filePaths,\n matcher: { rule: { pattern: opts.pattern } },\n },\n (err, nodes) => {\n if (err) return;\n for (const node of nodes) {\n const r = node.range();\n matches.push({\n filePath: node.getRoot().filename(),\n startLine: r.start.line + 1,\n endLine: r.end.line + 1,\n matchedText: node.text(),\n });\n }\n },\n );\n\n return matches;\n}\n"
39
39
  ],
40
- "mappings": ";iIAAA,cAAS,WAAK,wBACd,qBACA,qBAAS,YCFT,cAAS,wBACT,oBAAS,oBC+BF,SAAS,CAAY,CAAC,EAAwB,EAAiB,EAA+B,CACnG,OAAO,IAAU,OACb,CAAE,OAAM,UAAS,OAAM,EACvB,CAAE,OAAM,SAAQ,ED9Bf,SAAS,EAAW,CACzB,EACA,EACA,EAAuC,GACL,CAClC,GAAI,CACF,IAAQ,UAAS,SAAQ,YAAa,EAAY,EAAU,CAAU,EACtE,MAAO,CAAE,WAAU,QAAS,EAAkC,SAAQ,WAAU,YAAW,EAC3F,MAAO,EAAG,CACV,OAAO,GAAI,EAAa,QAAS,yBAAyB,IAAY,CAAC,CAAC,GEdrE,MAAM,EAAe,CAC1B,GACA,GAAO,IAAI,IAEX,WAAW,CAAC,EAAkB,CAC5B,KAAK,GAAY,KAAK,IAAI,EAAG,CAAQ,KAGnC,KAAI,EAAW,CACjB,OAAO,KAAK,GAAK,KAGnB,GAAG,CAAC,EAAiB,CACnB,OAAO,KAAK,GAAK,IAAI,CAAG,EAG1B,GAAG,CAAC,EAAuB,CACzB,GAAI,CAAC,KAAK,GAAK,IAAI,CAAG,EACpB,OAEF,IAAM,EAAQ,KAAK,GAAK,IAAI,CAAG,EAG/B,OAFA,KAAK,GAAK,OAAO,CAAG,EACpB,KAAK,GAAK,IAAI,EAAK,CAAK,EACjB,EAGT,GAAG,CAAC,EAAQ,EAAgB,CAC1B,GAAI,KAAK,GAAK,IAAI,CAAG,EACnB,KAAK,GAAK,OAAO,CAAG,EAKtB,GAFA,KAAK,GAAK,IAAI,EAAK,CAAK,EAEpB,KAAK,GAAK,KAAO,KAAK,GAAW,CACnC,IAAM,EAAY,KAAK,GAAK,KAAK,EAAE,KAAK,EAAE,MAC1C,GAAI,IAAc,OAChB,KAAK,GAAK,OAAO,CAAS,GAKhC,MAAM,CAAC,EAAiB,CACtB,OAAO,KAAK,GAAK,OAAO,CAAG,EAG7B,KAAK,EAAS,CACZ,KAAK,GAAK,MAAM,EAEpB,CC7CO,MAAM,EAAW,CACL,IAEjB,WAAW,CAAC,EAAmB,IAAK,CAClC,KAAK,IAAM,IAAI,GAA6B,CAAQ,EAGtD,GAAG,CAAC,EAA0C,CAC5C,OAAO,KAAK,IAAI,IAAI,CAAQ,EAG9B,GAAG,CAAC,EAAkB,EAA0B,CAC9C,KAAK,IAAI,IAAI,EAAU,CAAM,EAG/B,UAAU,CAAC,EAAwB,CACjC,KAAK,IAAI,OAAO,CAAQ,EAG1B,aAAa,EAAS,CACpB,KAAK,IAAI,MAAM,EAGjB,IAAI,EAAW,CACb,OAAO,KAAK,IAAI,KAEpB,CC3BO,SAAS,EAAgB,CAAC,EAA8B,CAC7D,IAAM,EAAoB,CAAC,CAAC,EAC5B,QAAS,EAAI,EAAG,EAAI,EAAW,OAAQ,IACrC,GAAI,EAAW,KAAO;AAAA,EACpB,EAAQ,KAAK,EAAI,CAAC,EAGtB,OAAO,EAGF,SAAS,EAAa,CAAC,EAAmB,EAAgC,CAC/E,IAAI,EAAK,EACL,EAAK,EAAQ,OAAS,EAC1B,MAAO,EAAK,EAAI,CACd,IAAM,EAAO,EAAK,EAAK,GAAM,EAC7B,GAAI,EAAQ,IAAS,EACnB,EAAK,EAEL,OAAK,EAAM,EAGf,MAAO,CAAE,KAAM,EAAK,EAAG,OAAQ,EAAS,EAAQ,EAAK,ECvBvD,cAAS,wBACT,gBAAS,wBAIF,SAAS,EAAU,CAAC,EAAuD,CAChF,GAAI,CACF,IAAI,EAAW,EAAY,KAAK,EAChC,GAAI,EAAS,WAAW,KAAK,EAAG,EAAW,EAAS,MAAM,CAAC,EAC3D,GAAI,EAAS,SAAS,IAAI,EAAG,EAAW,EAAS,MAAM,EAAG,EAAE,EAG5D,IAAM,EADS,GAAM,OAAO,MAAa,EACpB,IAAM,CAAE,YAAa,GAAI,KAAM,CAAC,CAAE,EAEvD,MAAO,CACL,aAAc,EAAM,aAAe,IAAI,KAAK,EAC5C,MAAO,EAAM,MAAQ,CAAC,GAAG,IAAI,CAAC,KAAO,CACnC,IAAK,EAAE,KAAO,GACd,KAAM,EAAE,MAAQ,GAChB,KAAM,EAAE,MAAQ,GAChB,YAAa,EAAE,aAAe,GAC9B,SAAU,EAAE,UAAY,MACpB,EAAE,UAAY,OAAY,CAAE,QAAS,EAAE,OAAQ,EAAI,CAAC,CAC1D,EAAE,CACJ,EACA,MAAO,EAAG,CACV,OAAO,GAAI,EAAa,QAAS,gCAAiC,CAAC,CAAC,GCdxE,gBAAS,wBA0EF,SAAS,EAAc,CAAC,EAAuC,CACpE,IAAQ,UAAS,aAAY,YAAa,EACpC,EAAc,GAAiB,CAAU,EAE/C,SAAS,CAAI,CAAC,EAAe,EAAyB,CACpD,MAAO,CACL,MAAO,GAAc,EAAa,CAAK,EACvC,IAAK,GAAc,EAAa,CAAG,CACrC,EAGF,SAAS,CAAgB,CAAC,EAAuC,CAC/D,IAAI,EAA8C,KAClD,QAAW,KAAK,EAAU,CACxB,GAAI,EAAE,OAAS,QAAS,SACxB,GAAI,EAAE,IAAM,EAAW,SACvB,GAAI,CAAC,EAAE,MAAM,WAAW,GAAG,EAAG,SAC9B,GAAI,CAAC,GAAQ,EAAE,IAAM,EAAK,IACxB,EAAO,CAAE,MAAO,KAAK,EAAE,UAAW,IAAK,EAAE,GAAI,EAGjD,GAAI,CAAC,EAAM,OAEX,QAAW,KAAQ,EAAQ,KAAM,CAC/B,IAAM,EAAa,EAA4B,OAAS,EACxD,GAAI,IAAc,EAAW,SAC7B,GAAI,EAAY,EAAK,KAAO,EAAY,EACtC,OAIJ,OAAO,EAAK,MAGd,SAAS,CAAQ,CAAC,EAAmE,CACnF,GAAI,CAAC,EAAgB,OACrB,IAAM,EAAQ,EAAe,gBAAkB,EAC/C,OAAO,EAAW,MAAM,EAAM,MAAO,EAAM,GAAG,EAGhD,SAAS,CAAiB,CAAC,EAAoC,CAC7D,GAAI,CAAC,GAAc,EAAW,SAAW,EAAG,MAAO,CAAC,EACpD,OAAO,EAAW,IAAI,CAAC,IAAM,CAC3B,IAAM,EAAO,EAAE,WACf,GAAI,CAAC,EAAM,MAAO,CAAE,KAAM,SAAU,EACpC,GAAI,EAAK,OAAS,iBAAkB,CAClC,IAAM,EAAO,EAAK,QAAQ,MAAQ,EAAK,QAAQ,UAAU,MAAQ,UAC3D,GAAQ,EAAK,WAAa,CAAC,GAAG,IAAI,CAAC,IAAe,EAAW,MAAM,EAAE,MAAO,EAAE,GAAG,CAAC,EACxF,MAAO,CAAE,OAAM,UAAW,EAAK,OAAS,EAAI,EAAO,MAAU,EAE/D,GAAI,EAAK,OAAS,aAAc,MAAO,CAAE,KAAM,EAAK,MAAQ,SAAU,EACtE,MAAO,CAAE,KAAM,EAAW,MAAM,EAAK,MAAO,EAAK,GAAG,CAAE,EACvD,EAGH,SAAS,CAAY,CAAC,EAAwB,CAC5C,IAAM,EAAQ,EAAE,OAAS,sBAAwB,EAAE,UAAY,EAE/D,GAAI,GAAO,OAAS,cAAe,CAEjC,IAAM,EAAO,MADW,EAAM,UAAU,MAAQ,YAE1C,EAAU,EAAM,eAChB,EAAO,EAAU,EAAS,CAAO,EAAI,OACrC,EAAmB,CAAE,OAAM,WAAY,EAAM,EACnD,GAAI,EAAM,EAAM,KAAO,EACvB,OAAO,EAGT,GAAI,GAAO,OAAS,oBAAqB,CACvC,IAAmB,KAAb,EACc,MAAd,GAAQ,EACR,EAAe,GAAM,MAAQ,UAC7B,EAAU,GAAM,eAChB,EAAO,EAAU,EAAS,CAAO,EAAI,OACrC,EAAuB,EAAW,MAAM,EAAO,MAAO,EAAO,GAAG,EAChE,GAAQ,EAAkB,GAAM,YAAc,CAAC,CAAC,EAChD,EAAmB,CAAE,OAAM,WAAY,GAAM,cAAa,EAChE,GAAI,EAAM,EAAM,KAAO,EACvB,GAAI,GAAM,OAAS,EAAG,EAAM,WAAa,GACzC,OAAO,EAGT,IAAM,EAAe,GAAO,MAAQ,GAAO,SAAS,MAAQ,UACtD,EAAoB,CAAC,CAAE,GAAO,SAC9B,EAAU,GAAO,eACjB,EAAO,EAAU,EAAS,CAAO,EAAI,OACrC,EAAQ,EAAkB,GAAO,YAAc,CAAC,CAAC,EACjD,EAAmB,CAAE,OAAM,WAAY,CAAS,EACtD,GAAI,EAAM,EAAM,KAAO,EACvB,GAAI,EAAM,OAAS,EAAG,EAAM,WAAa,EACzC,OAAO,EAGT,SAAS,CAAgB,CAAC,EAAkB,EAA6B,CACvE,IAAM,EAAmB,CAAC,EAC1B,GAAI,GAAI,MAAO,EAAK,KAAK,OAAO,EAChC,GAAI,EAAK,OAAQ,EAAK,KAAK,QAAQ,EACnC,GAAI,EAAK,SAAU,EAAK,KAAK,UAAU,EACvC,GAAI,EAAK,SAAU,EAAK,KAAK,UAAU,EACvC,GAAI,EAAK,SAAU,EAAK,KAAK,UAAU,EACvC,GAAI,EAAK,QAAS,EAAK,KAAK,SAAS,EACrC,GAAI,EAAK,MAAO,EAAK,KAAK,OAAO,EACjC,IAAM,EAAM,EAAK,cACjB,GAAI,IAAQ,UAAW,EAAK,KAAK,SAAS,EACrC,QAAI,IAAQ,YAAa,EAAK,KAAK,WAAW,EAC9C,QAAI,IAAQ,SAAU,EAAK,KAAK,QAAQ,EAC7C,OAAO,EAGT,SAAS,CAAa,CAAC,EAA2B,CAChD,IAAM,EAAuB,CAAC,EAC9B,GAAI,EAAK,WAAY,CACnB,IAAM,EAAO,EAAW,MAAM,EAAK,WAAW,MAAO,EAAK,WAAW,GAAG,EACxE,EAAS,KAAK,CAAE,KAAM,UAAW,MAAK,CAAC,EAEzC,IAAM,EAAQ,EAAK,YAAc,CAAC,EAClC,QAAW,KAAQ,EAAO,CACxB,IAAM,EAAO,EAAK,YAAc,EAC1B,EAAO,EAAW,MAAM,EAAK,MAAO,EAAK,GAAG,EAClD,EAAS,KAAK,CAAE,KAAM,aAAc,MAAK,CAAC,EAE5C,OAAO,EAGT,SAAS,CAAiB,CAAC,EAA2B,CACpD,IAAM,EAAuB,CAAC,EAC9B,QAAW,KAAQ,EAAK,SAAW,CAAC,EAAI,CACtC,IAAM,EAAO,EAAI,YAAc,EACzB,EAAO,EAAW,MAAM,EAAK,MAAO,EAAK,GAAG,EAClD,EAAS,KAAK,CAAE,KAAM,UAAW,MAAK,CAAC,EAEzC,OAAO,EAGT,SAAS,CAAmB,CAAC,EAA2C,CACtE,IAAM,EAA6B,CAAC,EACpC,QAAW,KAAK,EACd,GAAI,EAAE,OAAS,mBAAoB,CACjC,IAAM,EAAe,EAAE,KAAK,MAAQ,UAC9B,EAAU,EAAE,MACZ,EAAkB,EAAE,MAAQ,SAC5B,EACJ,IAAY,cACR,cACA,IAAY,MACV,SACA,IAAY,MACV,SACA,SACJ,EAAO,EAAiB,EAAG,CAAO,EAClC,GAAU,GAAS,QAAU,CAAC,GAAG,IAAI,CAAY,EACjD,EAAa,EAAS,GAAS,UAAU,EACzC,EAAqB,CACzB,KAAM,SACN,OACA,KAAM,EAAK,EAAE,MAAO,EAAE,GAAG,EACzB,WAAY,GACZ,aACA,UAAW,EACX,WAAY,EAAO,OAAS,EAAI,EAAS,OACzC,YACF,EACA,EAAQ,KAAK,CAAC,EACT,QAAI,EAAE,OAAS,qBAAsB,CAC1C,IAAM,EAAe,EAAE,KAAK,MAAQ,UAC9B,EAAO,EAAiB,CAAC,EACzB,EAAqB,CACzB,KAAM,WACN,OACA,KAAM,EAAK,EAAE,MAAO,EAAE,GAAG,EACzB,WAAY,GACZ,UAAW,CACb,EACA,EAAQ,KAAK,CAAC,EAGlB,OAAO,EAGT,SAAS,CAAuB,CAAC,EAA2C,CAC1E,IAAM,EAA6B,CAAC,EACpC,QAAW,KAAK,EACd,GAAI,EAAE,OAAS,oBAAqB,CAClC,IAAM,EAAe,EAAE,KAAK,MAAQ,UAC9B,GAAU,EAAE,QAAU,CAAC,GAAG,IAAI,CAAY,EAC1C,EAAa,EAAS,EAAE,UAAU,EACxC,EAAQ,KAAK,CACX,KAAM,SACN,OACA,KAAM,EAAK,EAAE,MAAO,EAAE,GAAG,EACzB,WAAY,GACZ,UAAW,CAAC,EACZ,WAAY,SACZ,WAAY,EAAO,OAAS,EAAI,EAAS,OACzC,YACF,CAAC,EACI,QAAI,EAAE,OAAS,sBAAuB,CAC3C,IAAM,EAAe,EAAE,KAAK,MAAQ,UAC9B,EAAU,EAAS,EAAE,cAAc,EACnC,EAAqB,CACzB,KAAM,WACN,OACA,KAAM,EAAK,EAAE,MAAO,EAAE,GAAG,EACzB,WAAY,GACZ,UAAW,EAAE,SAAW,CAAC,UAAU,EAAI,CAAC,EACxC,WAAY,CACd,EACA,EAAQ,KAAK,CAAC,EAGlB,OAAO,EAGT,SAAS,CAAW,CAAC,EAAe,EAAiE,CACnG,IAAM,EAAe,EAAK,MAAQ,GAElC,GAAI,IAAS,sBAAuB,CAClC,IAAM,EAAe,EAAK,IAAI,MAAQ,UAChC,GAAU,EAAK,QAAU,CAAC,GAAG,IAAI,CAAY,EAC7C,EAAa,EAAS,EAAK,UAAU,EACrC,EAAO,EAAiB,EAAM,CAAI,EAClC,EAAQ,EAAkB,EAAK,YAAc,CAAC,CAAC,EAC/C,EACJ,EAAK,gBAAgB,QAAQ,IAAI,CAAC,IAAoC,EAAE,MAAM,IAAc,EAAE,OAAO,OAAO,GAAK,OAC7G,EAAuB,CAC3B,KAAM,WACN,OACA,KAAM,EAAK,EAAK,MAAO,EAAK,GAAG,EAC/B,aACA,UAAW,EACX,WAAY,EAAO,OAAS,EAAI,EAAS,OACzC,aACA,WAAY,EAAM,OAAS,EAAI,EAAQ,MACzC,EACA,GAAI,GAAkB,EAAe,OAAS,EAAG,EAAI,eAAiB,EACtE,OAAO,EAGT,GAAI,IAAS,oBAAsB,IAAS,kBAAmB,CAC7D,IAAM,EAAe,EAAK,IAAI,MAAQ,UAChC,EAAW,EAAc,CAAI,EAC7B,EAAU,EAAoB,EAAK,MAAM,MAAQ,CAAC,CAAC,EACnD,EAAQ,EAAkB,EAAK,YAAc,CAAC,CAAC,EAC/C,EAAO,EAAiB,EAAM,CAAI,EAClC,EACJ,EAAK,gBAAgB,QAAQ,IAAI,CAAC,IAAoC,EAAE,MAAM,IAAc,EAAE,OAAO,OAAO,GAAK,OAC7G,EAAuB,CAC3B,KAAM,QACN,OACA,KAAM,EAAK,EAAK,MAAO,EAAK,GAAG,EAC/B,aACA,UAAW,EACX,SAAU,EAAS,OAAS,EAAI,EAAW,OAC3C,QAAS,EAAQ,OAAS,EAAI,EAAU,OACxC,WAAY,EAAM,OAAS,EAAI,EAAQ,MACzC,EACA,GAAI,GAAkB,EAAe,OAAS,EAAG,EAAI,eAAiB,EACtE,OAAO,EAGT,GAAI,IAAS,sBAAuB,CAClC,IAAM,EAA6B,CAAC,EACpC,QAAW,KAAQ,EAAK,cAAgB,CAAC,EAAG,CAC1C,IAAgB,GAAV,EACY,KAAZ,GAAO,EAEb,GAAI,GAAI,OAAS,gBAAiB,CAChC,QAAW,KAAQ,EAAG,YAAc,CAAC,EAAG,CACtC,IAAM,EAAmB,EAAK,OAAO,MAAQ,EAAK,KAAK,MAAQ,UAC/D,EAAQ,KAAK,CACX,KAAM,WACN,KAAM,EACN,KAAM,EAAK,EAAK,OAAS,EAAK,MAAO,EAAK,KAAO,EAAK,GAAG,EACzD,aACA,UAAW,CAAC,CACd,CAAC,EAEH,SAGF,GAAI,GAAI,OAAS,eAAgB,CAC/B,QAAW,KAAQ,EAAG,UAAY,CAAC,EAAG,CACpC,GAAI,CAAC,GAAQ,EAAK,OAAS,aAAc,SACzC,IAAM,EAAmB,EAAK,MAAQ,UACtC,EAAQ,KAAK,CACX,KAAM,WACN,KAAM,EACN,KAAM,EAAK,EAAK,OAAS,EAAK,MAAO,EAAK,KAAO,EAAK,GAAG,EACzD,aACA,UAAW,CAAC,CACd,CAAC,EAEH,SAGF,IAAM,EAAe,GAAI,MAAQ,UAC7B,EAAmB,WACnB,EACA,EAEJ,GACE,GAAM,OAAS,sBACf,GAAM,OAAS,0BAEf,EAAO,WAEP,GADkB,EAAK,QAAU,CAAC,GACf,IAAI,CAAY,EACnC,EAAa,EAAS,EAAK,UAAU,EAEvC,IAAM,EAAmB,CAAC,EAC1B,EAAQ,KAAK,CACX,OACA,OACA,KAAM,EAAK,EAAK,MAAO,EAAK,GAAG,EAC/B,aACA,UAAW,EACX,WAAY,EACZ,YACF,CAAC,EAEH,GAAI,EAAQ,SAAW,EAAG,OAAO,KACjC,GAAI,EAAQ,SAAW,EAAG,OAAO,EAAQ,GACzC,OAAO,EAGT,GAAI,IAAS,yBAEX,MAAO,CACL,KAAM,OACN,KAHmB,EAAK,IAAI,MAAQ,UAIpC,KAAM,EAAK,EAAK,MAAO,EAAK,GAAG,EAC/B,aACA,UAAW,CAAC,CACd,EAGF,GAAI,IAAS,yBAA0B,CACrC,IAAM,EAAe,EAAK,IAAI,MAAQ,UAChC,EAAW,EAAkB,CAAI,EACjC,EAAU,EAAwB,EAAK,MAAM,MAAQ,CAAC,CAAC,EACvD,EACJ,EAAK,gBAAgB,QAAQ,IAAI,CAAC,IAAoC,EAAE,MAAM,IAAc,EAAE,OAAO,OAAO,GAAK,OAC7G,EAAuB,CAC3B,KAAM,YACN,OACA,KAAM,EAAK,EAAK,MAAO,EAAK,GAAG,EAC/B,aACA,UAAW,CAAC,EACZ,SAAU,EAAS,OAAS,EAAI,EAAW,OAC3C,QAAS,EAAQ,OAAS,EAAI,EAAU,MAC1C,EACA,GAAI,GAAkB,EAAe,OAAS,EAAG,EAAI,eAAiB,EACtE,OAAO,EAGT,GAAI,IAAS,oBAAqB,CAChC,IAAM,EAAe,EAAK,IAAI,MAAQ,UAChC,EAAO,EAAiB,CAAI,EAE5B,GAD0E,EAAK,MAAM,SAAW,CAAC,GACzD,IAAI,CAAC,KAAO,CACxD,KAAM,WACN,KAAM,EAAE,IAAI,MAAQ,EAAE,IAAI,OAAS,UACnC,KAAM,EAAK,EAAE,MAAO,EAAE,GAAG,EACzB,WAAY,GACZ,UAAW,CAAC,CACd,EAAE,EACF,MAAO,CACL,KAAM,OACN,OACA,KAAM,EAAK,EAAK,MAAO,EAAK,GAAG,EAC/B,aACA,UAAW,EACX,QAAS,EAAQ,OAAS,EAAI,EAAU,MAC1C,EAGF,OAAO,KAGT,IAAM,EAA4B,CAAC,EAEnC,QAAW,KAAQ,EAAQ,KAAM,CAC/B,IAAI,EAAkD,KAChD,EAAS,EACT,EAAe,OAAO,EAAO,OAAS,SAAW,EAAO,KAAO,GAErE,GAAI,IAAS,yBAA0B,CACrC,IAAM,EAAI,EAKV,GAAI,EAAE,aAEJ,GADA,EAAM,EAAY,EAAE,YAAwB,EAAI,EAC5C,GAAO,CAAC,MAAM,QAAQ,CAAG,EAC3B,EAAI,KAAO,EAAK,EAAE,MAAO,EAAE,GAAG,EACzB,QAAI,MAAM,QAAQ,CAAG,EAC1B,QAAW,KAAK,EAAK,EAAE,KAAO,EAAK,EAAE,MAAO,EAAE,GAAG,GAGhD,QAAI,IAAS,2BAA4B,CAC9C,IAAM,EAAI,EAKJ,EAAO,EAAE,YACf,GAAI,GAEF,GADA,EAAM,EAAY,EAA4B,EAAI,EAC9C,GAAO,CAAC,MAAM,QAAQ,CAAG,EAC3B,EAAI,KAAO,EAAK,IAAI,MAAQ,UAC5B,EAAI,WAAa,GACjB,EAAI,KAAO,EAAK,EAAE,MAAO,EAAE,GAAG,GAIlC,OAAM,EAAY,EAA4B,EAAK,EAGrD,IAAM,EAA0B,MAAM,QAAQ,CAAG,EAAI,EAAM,EAAM,CAAC,CAAG,EAAI,CAAC,EAC1E,QAAW,KAAK,EAAM,CACpB,IAAM,EAAa,EAA4B,OAAS,EAClD,EAAY,EAAiB,CAAS,EAC5C,GAAI,EAAW,CACb,IAAM,EAAc,GAAW,CAAS,EACxC,GAAI,CAAC,GAAM,CAAW,EAAG,EAAE,MAAQ,EAErC,EAAO,KAAK,CAAC,GAIjB,OAAO,ECrgBT,kBAAS,cAAS,cAAS,cAKpB,SAAS,EAAa,CAC3B,EACA,EACA,EACU,CACV,IAAM,EAA2B,CAAC,IAA+B,CAC/D,IAAM,EAAY,GAAQ,CAAQ,EAClC,GAAI,IAAc,GAChB,MAAO,CACL,EAAW,MACX,EAAW,YACX,EAAW,OACX,EAAW,aACX,EAAW,OACX,EAAW,YACb,EAEF,GAAI,IAAc,MAAO,MAAO,CAAC,EAAS,MAAM,EAAG,EAAE,EAAI,KAAK,EAC9D,GAAI,IAAc,OAAQ,MAAO,CAAC,EAAS,MAAM,EAAG,EAAE,EAAI,MAAM,EAChE,GAAI,IAAc,OAAQ,MAAO,CAAC,EAAS,MAAM,EAAG,EAAE,EAAI,MAAM,EAChE,MAAO,CAAC,CAAQ,GAGlB,GAAI,EAAW,WAAW,GAAG,EAAG,CAC9B,IAAM,EAAW,GAAQ,GAAQ,CAAe,EAAG,CAAU,EAC7D,OAAO,EAAyB,CAAQ,EAG1C,GAAI,EACF,QAAY,EAAS,KAAY,EAAc,MAAO,CACpD,GAAI,EAAQ,SAAW,EAAG,SAE1B,IAAM,EAAU,EAAQ,QAAQ,GAAG,EAEnC,GAAI,IAAY,IACd,GAAI,IAAe,EAAS,CAC1B,IAAM,EAAuB,CAAC,EAC9B,QAAW,KAAK,EACd,EAAW,KAAK,GAAG,EAAyB,GAAQ,EAAc,QAAS,CAAC,CAAC,CAAC,EAEhF,OAAO,GAEJ,KACL,IAAM,EAAS,EAAQ,MAAM,EAAG,CAAO,EACjC,EAAS,EAAQ,MAAM,EAAU,CAAC,EACxC,GACE,EAAW,WAAW,CAAM,IAC3B,IAAW,IAAM,EAAW,SAAS,CAAM,GAC5C,CACA,IAAM,EAAW,EAAW,MAC1B,EAAO,OACP,IAAW,GAAK,OAAY,EAAW,OAAS,EAAO,MACzD,EACM,EAAuB,CAAC,EAC9B,QAAW,KAAK,EACd,EAAW,KAAK,GAAG,EAAyB,GAAQ,EAAc,QAAS,EAAE,QAAQ,IAAK,CAAQ,CAAC,CAAC,CAAC,EAEvG,OAAO,IAMf,MAAO,CAAC,EAGH,SAAS,EAAc,CAC5B,EACA,EACA,EACA,EAIgB,GACc,CAC9B,IAAM,EAAM,IAAI,IACV,EAAQ,EAA6D,MAAQ,CAAC,EAEpF,QAAW,KAAQ,EAAM,CACvB,GAAI,EAAK,OAAS,oBAAqB,SAEvC,IAAM,EAAuB,EAAK,QAA2C,OAAU,GACjF,EAAa,EAAgB,EAAiB,EAAY,CAAa,EAC7E,GAAI,EAAW,SAAW,EAAG,SAC7B,IAAM,EAAW,EAAW,GAEtB,EAAc,EAAK,YAA6D,CAAC,EACvF,QAAW,KAAQ,EACjB,OAAQ,EAAK,UACN,kBACH,EAAI,IAAK,EAAK,MAA2B,KAAM,CAC7C,KAAM,EACN,aAAe,EAAK,SAA8B,IACpD,CAAC,EACD,UACG,yBACH,EAAI,IAAK,EAAK,MAA2B,KAAM,CAC7C,KAAM,EACN,aAAc,SAChB,CAAC,EACD,UACG,2BACH,EAAI,IAAK,EAAK,MAA2B,KAAM,CAC7C,KAAM,EACN,aAAc,GAChB,CAAC,EACD,OAKR,OAAO,ECnHT,IAAM,GAAY,IAAI,IAAI,CAAC,MAAO,QAAS,MAAO,OAAO,CAAC,EAUnD,SAAS,EAAK,CACnB,EACA,EACM,CACN,GAAI,CAAC,GAAQ,OAAO,IAAS,SAAU,OAEvC,GAAI,MAAM,QAAQ,CAAI,EAAG,CACvB,QAAW,KAAQ,EAAM,GAAM,EAAM,CAAQ,EAC7C,OAGF,IAAM,EAAS,EACf,EAAS,CAAM,EAEf,QAAW,KAAO,OAAO,KAAK,CAAM,EAAG,CACrC,GAAI,GAAU,IAAI,CAAG,EAAG,SACxB,IAAM,EAAQ,EAAO,GACrB,GAAI,GAAS,OAAO,IAAU,SAC5B,GAAM,EAAO,CAAQ,GAqEpB,SAAS,EAAqB,CAAC,EAA8B,CAClE,GAAI,CAAC,GAAQ,OAAO,IAAS,UAAY,MAAM,QAAQ,CAAI,EAAG,OAAO,KACrE,IAAM,EAAS,EACf,IACG,EAAO,OAAS,iBAAmB,EAAO,OAAS,YACpD,OAAO,EAAO,QAAU,SAExB,OAAO,EAAO,MAEhB,OAAO,KAGF,SAAS,CAAgB,CAAC,EAAqC,CACpE,GAAI,CAAC,GAAQ,OAAO,IAAS,UAAY,MAAM,QAAQ,CAAI,EAAG,OAAO,KACrE,IAAM,EAAO,EAEb,GAAI,EAAK,OAAS,aAAc,CAC9B,IAAM,EAAO,EAAK,KAClB,MAAO,CAAE,KAAM,EAAM,MAAO,CAAC,EAAG,KAAM,CAAK,EAG7C,GAAI,EAAK,OAAS,iBAChB,MAAO,CAAE,KAAM,OAAQ,MAAO,CAAC,EAAG,KAAM,MAAO,EAGjD,GAAI,EAAK,OAAS,QAChB,MAAO,CAAE,KAAM,QAAS,MAAO,CAAC,EAAG,KAAM,OAAQ,EAGnD,GAAI,EAAK,OAAS,mBAAoB,CACpC,IAAM,EAAkB,CAAC,EACrB,EAAmC,EAEvC,MAAO,EAAQ,OAAS,mBAAoB,CAC1C,IAAM,EAAO,EAAQ,SACrB,GAAI,CAAC,GAAQ,OAAO,EAAK,OAAS,SAAU,OAAO,KACnD,EAAM,QAAQ,EAAK,IAAI,EACvB,EAAU,EAAQ,OAGpB,IAAI,EACJ,GAAI,EAAQ,OAAS,aACnB,EAAO,EAAQ,KACV,QAAI,EAAQ,OAAS,iBAC1B,EAAO,OACF,QAAI,EAAQ,OAAS,QAC1B,EAAO,QAEP,YAAO,KAGT,IAAM,EAAO,CAAC,EAAM,GAAG,CAAK,EAAE,KAAK,GAAG,EACtC,MAAO,CAAE,OAAM,QAAO,MAAK,EAG7B,OAAO,KCpJF,SAAS,EAAc,CAC5B,EACA,EACA,EACA,EAIgB,GACA,CAChB,IAAM,EAA4B,CAAC,EAC7B,EAAQ,EAA6D,MAAQ,CAAC,EAEpF,QAAW,KAAQ,EAAM,CACvB,GAAI,EAAK,OAAS,oBAAqB,CACrC,IAAM,EAAuB,EAAK,QAA2C,OAAU,GACjF,EAAa,EAAgB,EAAU,EAAY,CAAa,EACtE,GAAI,EAAW,SAAW,EAAG,SAC7B,IAAM,EAAW,EAAW,GAEtB,EAAS,EAAK,aAAe,OAC7B,EAAc,EAAK,YAA6D,CAAC,EAEvF,GAAI,EAAW,SAAW,EAAG,CAE3B,IAAM,EAAgC,CAAC,EACvC,GAAI,EAAQ,EAAK,OAAS,GAC1B,EAAU,KAAK,CACb,KAAM,EAAS,kBAAoB,UACnC,YAAa,EACb,cAAe,KACf,YAAa,EACb,cAAe,QACX,OAAO,KAAK,CAAI,EAAE,OAAS,EAAI,CAAE,SAAU,KAAK,UAAU,CAAI,CAAE,EAAI,CAAC,CAC3E,CAAC,EAED,aAAW,KAAQ,EAAY,CAC7B,IAAM,EAAW,EAAK,KAChB,EAAa,GAAW,EAAK,aAA0B,OACvD,EAAgC,CAAC,EACvC,GAAI,EAAY,EAAK,OAAS,GAE9B,IAAI,EACA,EAEJ,GAAI,IAAa,yBACf,EAAgB,UAChB,EAAiB,EAAK,MAA2B,KAC5C,QAAI,IAAa,2BACtB,EAAgB,IAChB,EAAiB,EAAK,MAA2B,KACjD,EAAK,WAAa,YAGlB,OAAiB,EAAK,SAA8B,KACpD,EAAiB,EAAK,MAA2B,KAGnD,EAAU,KAAK,CACb,KAAM,EAAa,kBAAoB,UACvC,YAAa,EACb,gBACA,YAAa,EACb,mBACI,OAAO,KAAK,CAAI,EAAE,OAAS,EAAI,CAAE,SAAU,KAAK,UAAU,CAAI,CAAE,EAAI,CAAC,CAC3E,CAAC,EAGL,SAGF,GAAI,EAAK,OAAS,wBAA0B,EAAK,OAAQ,CACvD,IAAM,EAAuB,EAAK,QAA2C,OAAU,GACjF,EAAa,EAAgB,EAAU,EAAY,CAAa,EACtE,GAAI,EAAW,SAAW,EAAG,SAC7B,IAAM,EAAW,EAAW,GAEtB,EAAS,EAAK,aAAe,OAC7B,EAAgC,CAAE,WAAY,EAAK,EACzD,GAAI,EAAQ,EAAK,OAAS,GAC1B,EAAU,KAAK,CACb,KAAM,EAAS,kBAAoB,aACnC,YAAa,EACb,cAAe,KACf,YAAa,EACb,cAAe,KACf,SAAU,KAAK,UAAU,CAAI,CAC/B,CAAC,EACD,SAGF,GAAI,EAAK,OAAS,0BAA4B,EAAK,OAAQ,CACzD,IAAM,EAAuB,EAAK,QAA2C,OAAU,GACjF,EAAa,EAAgB,EAAU,EAAY,CAAa,EACtE,GAAI,EAAW,SAAW,EAAG,SAC7B,IAAM,EAAW,EAAW,GAEtB,EAAS,EAAK,aAAe,OAO7B,EAAgC,CAAE,WAAY,GAAM,YANlC,EAAK,YAA6D,CAAC,GACzD,IAAI,CAAC,KAAO,CAC5C,MAAQ,EAAE,MAA2B,KACrC,SAAW,EAAE,SAA8B,IAC7C,EAAE,CAEmE,EACrE,GAAI,EAAQ,EAAK,OAAS,GAE1B,EAAU,KAAK,CACb,KAAM,EAAS,kBAAoB,aACnC,YAAa,EACb,cAAe,KACf,YAAa,EACb,cAAe,KACf,SAAU,KAAK,UAAU,CAAI,CAC/B,CAAC,GAsBL,OAlBA,GAAM,EAAK,CAAC,IAAS,CACnB,GAAI,EAAK,OAAS,mBAAoB,OACtC,IAAM,EAAc,GAAsB,EAAK,MAAM,EACrD,GAAI,CAAC,EAAa,OAClB,IAAM,EAAa,EAAgB,EAAU,EAAa,CAAa,EACvE,GAAI,EAAW,SAAW,EAAG,OAC7B,IAAM,EAAW,EAAW,GAE5B,EAAU,KAAK,CACb,KAAM,UACN,YAAa,EACb,cAAe,KACf,YAAa,EACb,cAAe,KACf,SAAU,KAAK,UAAU,CAAE,UAAW,EAAK,CAAC,CAC9C,CAAC,EACF,EAEM,EC1IF,SAAS,EAAY,CAC1B,EACA,EACA,EACgB,CAChB,IAAM,EAA4B,CAAC,EAC7B,EAA0B,CAAC,EAC3B,EAAuB,CAAC,EAE9B,SAAS,CAAa,EAAkB,CACtC,GAAI,EAAc,OAAS,EAAG,OAAO,EAAc,EAAc,OAAS,IAAM,KAChF,OAAO,KAGT,SAAS,CAAa,CACpB,EAC2E,CAC3E,GAAI,CAAC,EAAI,OAAO,KAEhB,IAAM,EAAM,EAAU,IAAI,EAAG,IAAI,EAEjC,GAAI,EAAG,MAAM,SAAW,EAAG,CACzB,GAAI,EACF,MAAO,CAAE,YAAa,EAAI,KAAM,cAAe,EAAI,aAAc,WAAY,QAAS,EAExF,MAAO,CAAE,YAAa,EAAU,cAAe,EAAG,KAAM,WAAY,OAAQ,EACvE,KACL,GAAI,GAAO,EAAI,eAAiB,IAAK,CACnC,IAAM,EAAgB,EAAG,MAAM,EAAG,MAAM,OAAS,GACjD,MAAO,CAAE,YAAa,EAAI,KAAM,gBAAe,WAAY,WAAY,EAEzE,MAAO,CAAE,YAAa,EAAU,cAAe,EAAG,KAAM,WAAY,cAAe,GAIvF,SAAS,CAAI,CAAC,EAAqB,CACjC,GAAI,CAAC,GAAQ,OAAO,IAAS,SAAU,OAEvC,GAAI,MAAM,QAAQ,CAAI,EAAG,CACvB,QAAW,KAAQ,EAAM,EAAK,CAAI,EAClC,OAGF,IAAM,EAAS,EACT,EAAe,OAAO,EAAO,OAAS,SAAW,EAAO,KAAO,GAErE,GAAI,IAAS,oBAAsB,IAAS,kBAAmB,CAC7D,IAAM,EAAY,EACZ,EAAoB,EAAU,IAAI,MAAQ,iBAChD,EAAW,KAAK,CAAS,EACzB,EAAK,EAAU,IAAI,EACnB,EAAW,IAAI,EACf,OAGF,GAAI,IAAS,sBAAuB,CAClC,IAAM,EAAe,EACf,EAAe,EAAa,IAAI,MAAQ,YAC9C,EAAc,KAAK,CAAI,EACvB,EAAK,EAAa,IAAI,EACtB,EAAc,IAAI,EAClB,OAGF,GAAI,IAAS,sBAAyB,EAAwC,OAC3E,EAAwC,MAAM,OAAS,sBACvD,EAAwC,MAAM,OAAS,2BACvD,CACD,IAAM,EAAa,EACb,EAAe,EAAW,IAAI,MAAQ,YAC5C,EAAc,KAAK,CAAI,EACvB,EAAK,EAAW,MAAM,MAAQ,EAAW,IAAI,EAC7C,EAAc,IAAI,EAClB,OAGF,GAAI,IAAS,oBAAuB,EAA+B,MAAO,CACxE,IAAM,EAAS,EACT,EAAY,EAAW,EAAW,OAAS,IAAM,GACjD,EAAqB,EAAO,KAAK,MAAQ,YACzC,EAAW,EAAY,GAAG,KAAa,IAAe,EAC5D,EAAc,KAAK,CAAQ,EAC3B,EAAK,EAAO,OAAO,IAAI,EACvB,EAAc,IAAI,EAClB,OAGF,GAAI,IAAS,sBAAwB,IAAS,0BAA2B,CACvE,IAAM,EAAe,EAAc,EAC7B,EAAgB,EAAe,GAAG,gBAA6B,cACrE,EAAc,KAAK,CAAa,EAChC,EAAM,EAA8B,IAAI,EACxC,EAAc,IAAI,EAClB,OAGF,GAAI,IAAS,iBAAkB,CAC7B,IAAM,EAAO,EACP,EAAK,EAAiB,EAAK,MAAM,EACjC,EAAM,EAAc,CAAE,EAC5B,GAAI,EAAK,CACP,IAAM,EAAgB,EAAc,EAC9B,EAAgC,CAAC,EACvC,GAAI,IAAkB,KAAM,EAAK,MAAQ,SAEzC,EAAU,KAAK,CACb,KAAM,QACN,YAAa,EACb,gBACA,YAAa,EAAI,YACjB,cAAe,EAAI,iBACf,OAAO,KAAK,CAAI,EAAE,OAAS,EAAI,CAAE,SAAU,KAAK,UAAU,CAAI,CAAE,EAAI,CAAC,CAC3E,CAAC,EAEH,EAAK,EAAK,MAAM,EAChB,QAAW,KAAO,EAAK,WAAa,CAAC,EAAG,EAAK,CAAG,EAChD,OAGF,GAAI,IAAS,gBAAiB,CAC5B,IAAM,EAAW,EACX,EAAK,EAAiB,EAAS,MAAM,EACrC,EAAM,EAAc,CAAE,EAC5B,GAAI,EAAK,CACP,IAAM,EAAgB,EAAc,EAC9B,EAAgC,CAAE,MAAO,EAAK,EACpD,GAAI,IAAkB,KAAM,EAAK,MAAQ,SAEzC,EAAU,KAAK,CACb,KAAM,QACN,YAAa,EACb,gBACA,YAAa,EAAI,YACjB,cAAe,EAAI,cACnB,SAAU,KAAK,UAAU,CAAI,CAC/B,CAAC,EAEH,QAAW,KAAO,EAAS,WAAa,CAAC,EAAG,EAAK,CAAG,EACpD,OAGF,QAAW,KAAO,OAAO,KAAK,CAAM,EAAG,CACrC,GAAI,IAAQ,OAAS,IAAQ,SAAW,IAAQ,OAAS,IAAQ,QAAS,SAC1E,IAAM,EAAQ,EAAO,GACrB,GAAI,GAAS,OAAO,IAAU,SAC5B,EAAK,CAAK,GAMhB,OADA,EAAK,CAAG,EACD,ECvJF,SAAS,EAAe,CAC7B,EACA,EACA,EACgB,CAChB,IAAM,EAA4B,CAAC,EAsDnC,OApDA,GAAM,EAAK,CAAC,IAAS,CACnB,GAAI,EAAK,OAAS,yBAA0B,CAC1C,IAAM,EAA0B,EAAK,IAAsC,MAAS,qBAC9E,EAAc,EAAK,SAAqC,CAAC,EAC/D,QAAW,KAAQ,EAAY,CAC7B,IAAM,EAAQ,EAAkC,YAAc,EACxD,EAAK,EAAiB,CAAI,EAChC,GAAI,CAAC,EAAI,SACT,IAAM,EAAM,GAAmB,EAAI,EAAU,CAAS,EACtD,EAAU,KAAK,CACb,KAAM,UACN,YAAa,EACb,cAAe,KACZ,CACL,CAAC,EAEH,OAGF,GAAI,EAAK,OAAS,oBAAsB,EAAK,OAAS,kBAAmB,OAEzE,IAAM,EACF,EAAK,IAAsC,MAAS,iBAExD,GAAI,EAAK,WAAY,CACnB,IAAM,EAAK,EAAiB,EAAK,UAAU,EAC3C,GAAI,EAAI,CACN,IAAM,EAAM,GAAmB,EAAI,EAAU,CAAS,EACtD,EAAU,KAAK,CACb,KAAM,UACN,YAAa,EACb,cAAe,KACZ,CACL,CAAC,GAIL,IAAM,EAAS,EAAK,YAAwC,CAAC,EAC7D,QAAW,KAAQ,EAAO,CACxB,IAAM,EAAQ,EAAkC,YAAc,EACxD,EAAK,EAAiB,CAAI,EAChC,GAAI,CAAC,EAAI,SACT,IAAM,EAAM,GAAmB,EAAI,EAAU,CAAS,EACtD,EAAU,KAAK,CACb,KAAM,aACN,YAAa,EACb,cAAe,KACZ,CACL,CAAC,GAEJ,EAEM,EAGT,SAAS,EAAkB,CACzB,EACA,EACA,EACmE,CACnE,IAAM,EAAM,EAAU,IAAI,EAAG,IAAI,EAEjC,GAAI,EAAK,CACP,GAAI,EAAI,eAAiB,IAAK,CAC5B,IAAM,EAAgB,EAAG,MAAM,EAAG,MAAM,OAAS,IAAM,EAAG,KAC1D,MAAO,CACL,YAAa,EAAI,KACjB,gBACA,SAAU,KAAK,UAAU,CAAE,kBAAmB,EAAK,CAAC,CACtD,EAEF,MAAO,CACL,YAAa,EAAI,KACjB,cAAe,EAAG,MAAM,OAAS,EAAI,EAAG,KAAO,EAAI,YACrD,EAGF,MAAO,CACL,YAAa,EACb,cAAe,EAAG,KAClB,SAAU,KAAK,UAAU,CAAE,QAAS,EAAK,CAAC,CAC5C,ECpFK,SAAS,EAAgB,CAC9B,EACA,EACA,EACgB,CAChB,IAAM,EAAY,GAAe,EAAK,EAAU,CAAa,EAEvD,EAAU,GAAe,EAAK,EAAU,CAAa,EACrD,EAAQ,GAAa,EAAK,EAAU,CAAS,EAC7C,EAAW,GAAgB,EAAK,EAAU,CAAS,EAEzD,MAAO,CAAC,GAAG,EAAS,GAAG,EAAO,GAAG,CAAQ,ECnB3C,cAAS,YAAK,wBACd,mBAAS,oBACT,oBAAS,iBAAW,iBAAY,YAChC,kBAAS,WAAS,cAClB,kBAAS,gCACT,kBAAS,+ICLT,cAAS,qBACT,sBACE,WACA,aACA,UACA,YACA,iBACA,iBACA,YACA,iCAGK,IAAM,EAAQ,GACnB,QACA,CACE,QAAS,EAAK,SAAS,EAAE,QAAQ,EACjC,SAAU,EAAK,WAAW,EAAE,QAAQ,EACpC,QAAS,GAAK,UAAU,EAAE,QAAQ,EAClC,KAAM,EAAQ,MAAM,EAAE,QAAQ,EAC9B,YAAa,EAAK,cAAc,EAAE,QAAQ,EAC1C,UAAW,EAAK,YAAY,EAAE,QAAQ,EACtC,UAAW,EAAQ,YAAY,CACjC,EACA,CAAC,IAAU,CAAC,GAAW,CAAE,QAAS,CAAC,EAAM,QAAS,EAAM,QAAQ,CAAE,CAAC,CAAC,CACtE,EAEa,EAAU,GACrB,UACA,CACE,GAAI,EAAQ,IAAI,EAAE,WAAW,CAAE,cAAe,EAAK,CAAC,EACpD,QAAS,EAAK,SAAS,EAAE,QAAQ,EACjC,SAAU,EAAK,WAAW,EAAE,QAAQ,EACpC,KAAM,EAAK,MAAM,EAAE,QAAQ,EAC3B,KAAM,EAAK,MAAM,EAAE,QAAQ,EAC3B,UAAW,EAAQ,YAAY,EAAE,QAAQ,EACzC,YAAa,EAAQ,cAAc,EAAE,QAAQ,EAC7C,QAAS,EAAQ,UAAU,EAAE,QAAQ,EACrC,UAAW,EAAQ,YAAY,EAAE,QAAQ,EACzC,WAAY,EAAQ,aAAa,EAAE,QAAQ,EAAE,QAAQ,CAAC,EACtD,UAAW,EAAK,WAAW,EAC3B,YAAa,EAAK,aAAa,EAC/B,WAAY,EAAK,aAAa,EAC9B,YAAa,EAAK,cAAc,EAAE,QAAQ,EAC1C,UAAW,EAAK,YAAY,EAAE,QAAQ,CACxC,EACA,CAAC,IAAU,CACT,GAAM,0BAA0B,EAAE,GAAG,EAAM,QAAS,EAAM,QAAQ,EAClE,GAAM,0BAA0B,EAAE,GAAG,EAAM,QAAS,EAAM,IAAI,EAC9D,GAAM,0BAA0B,EAAE,GAAG,EAAM,QAAS,EAAM,IAAI,EAC9D,GAAM,yBAAyB,EAAE,GAAG,EAAM,QAAS,EAAM,WAAW,EACpE,GAAW,CACT,QAAS,CAAC,EAAM,QAAS,EAAM,QAAQ,EACvC,eAAgB,CAAC,EAAM,QAAS,EAAM,QAAQ,CAChD,CAAC,EAAE,SAAS,SAAS,CACvB,CACF,EAEa,EAAY,GACvB,YACA,CACE,GAAI,EAAQ,IAAI,EAAE,WAAW,CAAE,cAAe,EAAK,CAAC,EACpD,QAAS,EAAK,SAAS,EAAE,QAAQ,EACjC,KAAM,EAAK,MAAM,EAAE,QAAQ,EAC3B,YAAa,EAAK,eAAe,EAAE,QAAQ,EAC3C,cAAe,EAAK,iBAAiB,EACrC,YAAa,EAAK,eAAe,EAAE,QAAQ,EAC3C,cAAe,EAAK,iBAAiB,EACrC,SAAU,EAAK,WAAW,CAC5B,EACA,CAAC,IAAU,CACT,GAAM,mBAAmB,EAAE,GAAG,EAAM,QAAS,EAAM,WAAW,EAC9D,GAAM,mBAAmB,EAAE,GAAG,EAAM,QAAS,EAAM,WAAW,EAC9D,GAAM,oBAAoB,EAAE,GAAG,EAAM,QAAS,EAAM,IAAI,EACxD,GAAW,CACT,QAAS,CAAC,EAAM,QAAS,EAAM,WAAW,EAC1C,eAAgB,CAAC,EAAM,QAAS,EAAM,QAAQ,CAChD,CAAC,EAAE,SAAS,SAAS,EACrB,GAAW,CACT,QAAS,CAAC,EAAM,QAAS,EAAM,WAAW,EAC1C,eAAgB,CAAC,EAAM,QAAS,EAAM,QAAQ,CAChD,CAAC,EAAE,SAAS,SAAS,CACvB,CACF,EAEa,GAAe,GAC1B,gBACA,CACE,GAAI,EAAQ,IAAI,EAAE,WAAW,EAC7B,IAAK,EAAQ,KAAK,EAAE,QAAQ,EAC5B,UAAW,EAAK,YAAY,EAAE,QAAQ,EACtC,YAAa,EAAK,cAAc,EAAE,QAAQ,CAC5C,EACA,CAAC,IAAU,CAAC,GAAM,0BAA2B,KAAM,EAAM,QAAQ,CAAC,CACpE,EAEa,GAAmC,CAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA;AAAA;AAAA;AAAA;AAAA,QAMA;AAAA;AAAA;AAAA;AAAA,QAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAOF,ED7GO,MAAM,EAAa,CAChB,OAA0B,KAC1B,QAAmD,KAC1C,OACT,QAAU,EAElB,WAAW,CAAC,EAA2B,CACrC,KAAK,OAAS,GAAK,EAAK,YAAa,UAAW,YAAY,KAG1D,UAAS,EAAqC,CAChD,GAAI,CAAC,KAAK,QAAS,MAAU,MAAM,0CAA0C,EAC7E,OAAO,KAAK,QAGd,IAAI,EAA+B,CACjC,GAAI,CACF,GAAU,GAAQ,KAAK,MAAM,EAAG,CAAE,UAAW,EAAK,CAAC,EACnD,KAAK,OAAS,IAAI,GAAS,KAAK,MAAM,EAEtC,KAAK,OAAO,IAAI,2BAA2B,EAC3C,KAAK,OAAO,IAAI,0BAA0B,EAC1C,KAAK,OAAO,IAAI,4BAA4B,EAE5C,KAAK,QAAU,GAAQ,KAAK,OAAQ,CAAE,SAAO,CAAC,EAE9C,GAAQ,KAAK,QAAS,CACpB,iBAAkB,GAAK,YAAY,QAAS,YAAY,CAC1D,CAAC,EAED,QAAW,KAAO,GAChB,KAAK,OAAO,IAAI,CAAG,EAKrB,IAAM,EAAY,KAAK,OACvB,GAAI,OAAO,EAAU,WAAgB,WAClC,EAAU,SAAyB,KAClC,KAAK,OACL,SACA,CAAC,EAAiB,IAA0B,CAC1C,GAAI,CACF,OAAO,IAAI,OAAO,CAAO,EAAE,KAAK,CAAK,EAAI,EAAI,EAC7C,KAAM,CACN,MAAO,IAGb,EAEF,MAAO,EAAG,CACV,GAAI,KAAK,kBAAkB,CAAC,GAAK,GAAW,KAAK,MAAM,EAAG,CACxD,KAAK,YAAY,EACjB,GAAW,KAAK,MAAM,EACtB,QAAW,IAAO,CAAC,OAAQ,MAAM,EAAG,CAClC,IAAM,EAAI,KAAK,OAAS,EACxB,GAAI,GAAW,CAAC,EAAG,GAAW,CAAC,EAEjC,IAAM,EAAc,KAAK,KAAK,EAC9B,GAAI,GAAM,CAAW,EACnB,OAAO,GAAI,EAAa,QAAS,iCAAiC,KAAK,SAAU,EAAY,IAAI,CAAC,EAEpG,OAAO,EAET,OAAO,GAAI,EAAa,QAAS,8BAA8B,KAAK,SAAU,CAAC,CAAC,GAIpF,KAAK,EAAS,CACZ,KAAK,YAAY,EACjB,KAAK,QAAU,KAGjB,WAAc,CAAC,EAAgC,CAC7C,IAAM,EAAK,KAAK,cAAc,EAE9B,GAAI,KAAK,UAAY,EAAG,CACtB,KAAK,UACL,GAAI,CACF,OAAO,EAAG,YAAY,IAAM,EAAG,IAAI,CAAC,EAAE,SACtC,CACA,KAAK,WAIT,IAAM,EAAK,MAAM,KAAK,YACtB,EAAG,IAAI,cAAc,IAAK,EAC1B,GAAI,CACF,IAAM,EAAS,EAAG,IAAI,EAEtB,OADA,EAAG,IAAI,sBAAsB,IAAK,EAC3B,EACP,MAAO,EAAK,CAGZ,MAFA,EAAG,IAAI,0BAA0B,IAAK,EACtC,EAAG,IAAI,sBAAsB,IAAK,EAC5B,SACN,CACA,KAAK,WAIT,oBAAuB,CAAC,EAAgB,CACtC,IAAM,EAAK,KAAK,cAAc,EAC9B,KAAK,UACL,EAAG,IAAI,iBAAiB,EACxB,GAAI,CACF,IAAM,EAAS,EAAG,EAElB,OADA,EAAG,IAAI,QAAQ,EACR,EACP,MAAO,EAAK,CAEZ,MADA,EAAG,IAAI,UAAU,EACX,SACN,CACA,KAAK,WAIT,KAAK,CAAC,EAAsB,CAC1B,IAAM,EAAM,KAAK,cAAc,EAAE,QAAQ,CAAG,EAAE,IAAI,EAClD,GAAI,CAAC,EAAK,OAAO,KACjB,OAAO,OAAO,OAAO,CAAG,EAAE,GAG5B,aAAa,EAAa,CAIxB,OAHa,KAAK,cAAc,EAC7B,MAAM,qDAAqD,EAC3D,IAAI,EACK,IAAI,CAAC,IAAM,EAAE,IAAI,EAG/B,WAAW,EAAsD,CAI/D,OAHY,KAAK,cAAc,EAC5B,QAAQ,0DAA0D,EAClE,IAAI,GACO,OAGhB,WAAW,CAAC,EAAmB,CAC7B,IAAM,EAAM,IAAI,KAAK,EAAE,YAAY,EACnC,KAAK,cAAc,EAChB,QAAQ,mFAAmF,EAC3F,IAAI,EAAK,EAAK,CAAG,EAGtB,YAAY,CAAC,EAAmB,CAC9B,IAAM,EAAM,IAAI,KAAK,EAAE,YAAY,EACnC,KAAK,cAAc,EAChB,QAAQ,8FAA8F,EACtG,IAAI,EAAK,EAAK,CAAG,EAGtB,UAAU,CAAC,EAAmB,CAC5B,IAAM,EAAM,IAAI,KAAK,EAAE,YAAY,EACnC,KAAK,cAAc,EAChB,QAAQ,oEAAoE,EAC5E,IAAI,EAAK,CAAG,EAGjB,WAAW,CAAC,EAAmB,CAC7B,KAAK,cAAc,EAChB,QAAQ,oDAAoD,EAC5D,IAAI,CAAG,EAGJ,aAAa,EAAa,CAChC,GAAI,CAAC,KAAK,OAAQ,MAAU,MAAM,0CAA0C,EAC5E,OAAO,KAAK,OAGN,WAAW,EAAS,CAC1B,GAAI,KAAK,OACP,KAAK,OAAO,MAAM,EAClB,KAAK,OAAS,KAIV,iBAAiB,CAAC,EAAuB,CAC/C,GAAI,EAAE,aAAe,OAAQ,MAAO,GACpC,IAAM,EAAM,EAAI,QAAQ,YAAY,EACpC,OACE,EAAI,SAAS,WAAW,GACxB,EAAI,SAAS,SAAS,GACtB,EAAI,SAAS,gBAAgB,GAC7B,EAAI,SAAS,gBAAgB,GAC7B,EAAI,SAAS,gBAAgB,EAGnC,CExMA,aAAS,UAAI,qBA2BN,MAAM,EAAe,CACG,GAA7B,WAAW,CAAkB,EAAkB,CAAlB,UAE7B,OAAO,CAAC,EAAiB,EAAqC,CAC5D,OAAO,KAAK,GAAG,UACZ,OAAO,EACP,KAAK,CAAK,EACV,MAAM,GAAI,GAAG,EAAM,QAAS,CAAO,EAAG,GAAG,EAAM,SAAU,CAAQ,CAAC,CAAC,EACnE,IAAI,GAAK,KAGd,UAAU,CAAC,EAA0B,CACnC,KAAK,GAAG,UACL,OAAO,CAAK,EACZ,OAAO,CACN,QAAS,EAAO,QAChB,SAAU,EAAO,SACjB,QAAS,EAAO,QAChB,KAAM,EAAO,KACb,YAAa,EAAO,YACpB,UAAW,EAAO,UAClB,UAAW,EAAO,WAAa,IACjC,CAAC,EACA,mBAAmB,CAClB,OAAQ,CAAC,EAAM,QAAS,EAAM,QAAQ,EACtC,IAAK,CACH,QAAS,EAAO,QAChB,KAAM,EAAO,KACb,YAAa,EAAO,YACpB,UAAW,EAAO,UAClB,UAAW,EAAO,WAAa,IACjC,CACF,CAAC,EACA,IAAI,EAGT,WAAW,CAAC,EAA+B,CACzC,OAAO,KAAK,GAAG,UACZ,OAAO,EACP,KAAK,CAAK,EACV,MAAM,GAAG,EAAM,QAAS,CAAO,CAAC,EAChC,IAAI,EAGT,WAAW,CAAC,EAA0C,CACpD,IAAM,EAAO,KAAK,YAAY,CAAO,EAC/B,EAAM,IAAI,IAChB,QAAW,KAAK,EAAM,EAAI,IAAI,EAAE,SAAU,CAAC,EAC3C,OAAO,EAGT,UAAU,CAAC,EAAiB,EAAwB,CAClD,KAAK,GAAG,UACL,OAAO,CAAK,EACZ,MAAM,GAAI,GAAG,EAAM,QAAS,CAAO,EAAG,GAAG,EAAM,SAAU,CAAQ,CAAC,CAAC,EACnE,IAAI,EAEX,CCpFA,aAAS,SAAI,UAAK,YAAK,qBCAhB,SAAS,EAAgB,CAAC,EAAsB,CACrD,OAAO,EACJ,KAAK,EACL,MAAM,KAAK,EACX,IAAI,CAAC,IAAU,EAAM,KAAK,CAAC,EAC3B,OAAO,CAAC,IAAU,EAAM,OAAS,CAAC,EAClC,IAAI,CAAC,IAAU,IAAI,EAAM,WAAW,IAAK,IAAI,KAAK,EAClD,KAAK,GAAG,EDgCN,MAAM,EAAiB,CACC,GAA7B,WAAW,CAAkB,EAAkB,CAAlB,UAE7B,kBAAkB,CAChB,EACA,EACA,EACA,EACM,CAMN,GALA,KAAK,GAAG,UACL,OAAO,CAAO,EACd,MAAM,GAAI,EAAG,EAAQ,QAAS,CAAO,EAAG,EAAG,EAAQ,SAAU,CAAQ,CAAC,CAAC,EACvE,IAAI,EAEH,CAAC,EAAK,OAAQ,OAElB,IAAM,EAAM,IAAI,KAAK,EAAE,YAAY,EACnC,QAAW,KAAO,EAChB,KAAK,GAAG,UAAU,OAAO,CAAO,EAAE,OAAO,CACvC,UACA,WACA,KAAM,EAAI,MAAQ,UAClB,KAAM,EAAI,MAAQ,GAClB,UAAW,EAAI,WAAa,EAC5B,YAAa,EAAI,aAAe,EAChC,QAAS,EAAI,SAAW,EACxB,UAAW,EAAI,WAAa,EAC5B,WAAY,EAAI,YAAc,EAC9B,UAAW,EAAI,WAAa,KAC5B,YAAa,EAAI,aAAe,KAChC,WAAY,EAAI,YAAc,KAC9B,cACA,UAAW,EAAI,WAAa,CAC9B,CAAC,EAAE,IAAI,EAIX,cAAc,CAAC,EAAiB,EAAkC,CAChE,OAAO,KAAK,GAAG,UACZ,OAAO,EACP,KAAK,CAAO,EACZ,MAAM,GAAI,EAAG,EAAQ,QAAS,CAAO,EAAG,EAAG,EAAQ,SAAU,CAAQ,CAAC,CAAC,EACvE,IAAI,EAGT,YAAY,CAAC,EAAiB,EAAe,EAAsB,CAAC,EAAmB,CACrF,IAAM,EAAQ,EAAK,OAAS,GACtB,EAAW,GAAiB,CAAK,EAEvC,GAAI,CAAC,EAAU,MAAO,CAAC,EAevB,OAbc,KAAK,GAAG,UACnB,OAAO,EACP,KAAK,CAAO,EACZ,MACC,GACE,KAAM,EAAQ,gEAAgE,KAC9E,EAAG,EAAQ,QAAS,CAAO,EAC3B,EAAK,KAAO,EAAG,EAAQ,KAAM,EAAK,IAAI,EAAI,MAC5C,CACF,EACC,QAAQ,EAAQ,IAAI,EACpB,MAAM,CAAK,EAEC,IAAI,EAGrB,YAAY,CAAC,EAAiB,EAA8B,CAC1D,OAAO,KAAK,GAAG,UACZ,OAAO,EACP,KAAK,CAAO,EACZ,MAAM,GAAI,EAAG,EAAQ,QAAS,CAAO,EAAG,EAAG,EAAQ,KAAM,CAAI,CAAC,CAAC,EAC/D,QAAQ,EAAQ,IAAI,EACpB,IAAI,EAGT,QAAQ,CAAC,EAA8B,CACrC,IAAM,EAAM,KAAK,GAAG,UACjB,OAAO,CACN,YAAa,GAAM,EACnB,UAAW,oBAA6B,EAAQ,WAClD,CAAC,EACA,KAAK,CAAO,EACZ,MAAM,EAAG,EAAQ,QAAS,CAAO,CAAC,EAClC,IAAI,EACP,MAAO,CACL,YAAa,GAAK,aAAe,EACjC,UAAW,GAAK,WAAa,CAC/B,EAGF,gBAAgB,CAAC,EAAiB,EAAqC,CACrE,OAAO,KAAK,GAAG,UACZ,OAAO,EACP,KAAK,CAAO,EACZ,MAAM,GAAI,EAAG,EAAQ,QAAS,CAAO,EAAG,EAAG,EAAQ,YAAa,CAAW,CAAC,CAAC,EAC7E,IAAI,EAGT,iBAAiB,CAAC,EAAiB,EAAwB,CACzD,KAAK,GAAG,UACL,OAAO,CAAO,EACd,MAAM,GAAI,EAAG,EAAQ,QAAS,CAAO,EAAG,EAAG,EAAQ,SAAU,CAAQ,CAAC,CAAC,EACvE,IAAI,EAGT,aAAa,CAAC,EAUwB,CACpC,IAAM,EAAU,KAAK,GAAG,UACrB,OAAO,EACP,KAAK,CAAO,EACZ,MACC,GACE,EAAK,SACD,KAAM,EAAQ,gEAAgE,EAAK,YACnF,OACJ,EAAK,UAAY,EAAG,EAAQ,KAAM,EAAK,SAAS,EAAI,OACpD,EAAK,UAAY,OAAY,EAAG,EAAQ,QAAS,EAAK,OAAO,EAAI,OACjE,EAAK,KAAO,EAAG,EAAQ,KAAM,EAAK,IAAI,EAAI,OAC1C,EAAK,WAAa,OAAY,EAAG,EAAQ,SAAU,EAAK,QAAQ,EAAI,OACpE,EAAK,aAAe,OAChB,EAAG,EAAQ,WAAY,EAAK,WAAa,EAAI,CAAC,EAC9C,OACJ,EAAK,UACD,KAAM,EAAQ,2HAA2H,EAAK,aAC9I,MAEN,CACF,EACC,QAAQ,EAAQ,IAAI,EAEpB,MAAM,EAAK,MAAQ,KAAK,IAAI,EAAK,MAAQ,GAAI,IAAI,EAAI,EAAK,KAAK,EAC/D,IAAI,EAEP,GAAI,CAAC,EAAK,MAAO,OAAO,EAGxB,GAAI,CACF,IAAM,EAAU,IAAI,OAAO,EAAK,KAAK,EACrC,OAAO,EAAQ,OAAO,KAAK,EAAQ,KAAK,EAAE,IAAI,CAAC,EAAE,MAAM,EAAG,EAAK,KAAK,EACpE,KAAM,CACN,MAAO,CAAC,GAGd,CEhMA,aAAS,SAAI,YAAK,SAAQ,qBAcnB,MAAM,EAAmB,CACD,GAA7B,WAAW,CAAkB,EAAkB,CAAlB,UAE7B,oBAAoB,CAClB,EACA,EACA,EACM,CAMN,GALA,KAAK,GAAG,UACL,OAAO,CAAc,EACrB,MAAM,EAAI,EAAG,EAAe,QAAS,CAAO,EAAG,EAAG,EAAe,YAAa,CAAW,CAAC,CAAC,EAC3F,IAAI,EAEH,CAAC,EAAK,OAAQ,OAElB,QAAW,KAAO,EAChB,KAAK,GAAG,UAAU,OAAO,CAAc,EAAE,OAAO,CAC9C,UACA,KAAM,EAAI,MAAQ,UAClB,YAAa,EAAI,aAAe,EAChC,cAAe,EAAI,eAAiB,KACpC,YAAa,EAAI,aAAe,GAChC,cAAe,EAAI,eAAiB,KACpC,SAAU,EAAI,UAAY,IAC5B,CAAC,EAAE,IAAI,EAIX,WAAW,CAAC,EAAiB,EAAqB,EAA0C,CAC1F,GAAI,IAAkB,OACpB,OAAO,KAAK,GAAG,UACZ,OAAO,CACN,QAAS,EAAe,QACxB,KAAM,EAAe,KACrB,YAAa,EAAe,YAC5B,cAAe,EAAe,cAC9B,YAAa,EAAe,YAC5B,cAAe,EAAe,cAC9B,SAAU,EAAe,QAC3B,CAAC,EACA,KAAK,CAAc,EACnB,MACC,EACE,EAAG,EAAe,QAAS,CAAO,EAClC,EAAG,EAAe,YAAa,CAAW,EAC1C,GACE,EAAG,EAAe,cAAe,CAAa,EAC9C,GAAO,EAAe,aAAa,CACrC,CACF,CACF,EACC,IAAI,EAGT,OAAO,KAAK,GAAG,UACZ,OAAO,CACN,QAAS,EAAe,QACxB,KAAM,EAAe,KACrB,YAAa,EAAe,YAC5B,cAAe,EAAe,cAC9B,YAAa,EAAe,YAC5B,cAAe,EAAe,cAC9B,SAAU,EAAe,QAC3B,CAAC,EACA,KAAK,CAAc,EACnB,MACC,EACE,EAAG,EAAe,QAAS,CAAO,EAClC,EAAG,EAAe,YAAa,CAAW,CAC5C,CACF,EACC,IAAI,EAGT,WAAW,CAAC,EAAiB,EAAuC,CAClE,OAAO,KAAK,GAAG,UACZ,OAAO,CACN,QAAS,EAAe,QACxB,KAAM,EAAe,KACrB,YAAa,EAAe,YAC5B,cAAe,EAAe,cAC9B,YAAa,EAAe,YAC5B,cAAe,EAAe,cAC9B,SAAU,EAAe,QAC3B,CAAC,EACA,KAAK,CAAc,EACnB,MACC,EACE,EAAG,EAAe,QAAS,CAAO,EAClC,EAAG,EAAe,YAAa,CAAW,CAC5C,CACF,EACC,IAAI,EAGT,SAAS,CAAC,EAAiB,EAAgC,CACzD,OAAO,KAAK,GAAG,UACZ,OAAO,CACN,QAAS,EAAe,QACxB,KAAM,EAAe,KACrB,YAAa,EAAe,YAC5B,cAAe,EAAe,cAC9B,YAAa,EAAe,YAC5B,cAAe,EAAe,cAC9B,SAAU,EAAe,QAC3B,CAAC,EACA,KAAK,CAAc,EACnB,MACC,EACE,EAAG,EAAe,QAAS,CAAO,EAClC,EAAG,EAAe,KAAM,CAAI,CAC9B,CACF,EACC,IAAI,EAGT,mBAAmB,CAAC,EAAiB,EAA2B,CAC9D,KAAK,GAAG,UACL,OAAO,CAAc,EACrB,MAAM,EAAI,EAAG,EAAe,QAAS,CAAO,EAAG,EAAG,EAAe,YAAa,CAAW,CAAC,CAAC,EAC3F,IAAI,EAGT,eAAe,CAAC,EAQK,CACnB,OAAO,KAAK,GAAG,UACZ,OAAO,CACN,QAAS,EAAe,QACxB,KAAM,EAAe,KACrB,YAAa,EAAe,YAC5B,cAAe,EAAe,cAC9B,YAAa,EAAe,YAC5B,cAAe,EAAe,cAC9B,SAAU,EAAe,QAC3B,CAAC,EACA,KAAK,CAAc,EACnB,MACC,EACE,EAAK,UAAY,OAAY,EAAG,EAAe,QAAS,EAAK,OAAO,EAAI,OACxE,EAAK,cAAgB,OACjB,EAAG,EAAe,YAAa,EAAK,WAAW,EAC/C,OACJ,EAAK,gBAAkB,OACnB,EAAG,EAAe,cAAe,EAAK,aAAa,EACnD,OACJ,EAAK,cAAgB,OACjB,EAAG,EAAe,YAAa,EAAK,WAAW,EAC/C,OACJ,EAAK,gBAAkB,OACnB,EAAG,EAAe,cAAe,EAAK,aAAa,EACnD,OACJ,EAAK,OAAS,OAAY,EAAG,EAAe,KAAM,EAAK,IAAI,EAAI,MACjE,CACF,EACC,MAAM,EAAK,KAAK,EAChB,IAAI,EAGT,iBAAiB,CACf,EACA,EACA,EACA,EACA,EACM,CACN,IAAM,EAAY,IAAc,KAC5B,EACE,EAAG,EAAe,QAAS,CAAO,EAClC,EAAG,EAAe,YAAa,CAAO,EACtC,GAAO,EAAe,aAAa,CACrC,EACA,EACE,EAAG,EAAe,QAAS,CAAO,EAClC,EAAG,EAAe,YAAa,CAAO,EACtC,EAAG,EAAe,cAAe,CAAS,CAC5C,EAEJ,KAAK,GAAG,UACL,OAAO,CAAc,EACrB,IAAI,CAAE,YAAa,EAAS,cAAe,CAAU,CAAC,EACtD,MAAM,CAAS,EACf,IAAI,EAEX,CC5MA,cAAS,wBAKT,oBAAS,yBAIT,qBAWA,IAAM,GAA0C,CAC9C,aACA,gBACA,aACA,oBACF,EAEM,GAAoB,IAAI,IAAI,CAAC,eAAgB,eAAe,CAAC,EAEnE,SAAS,EAAa,CAAC,EAAuB,CAC5C,OAAO,EAAM,WAAW,KAAM,GAAG,EAGnC,SAAS,EAAY,CAAC,EAA8C,CAClE,GAAI,IAAS,SACX,MAAO,SAGT,GAAI,IAAS,SACX,MAAO,SAGT,MAAO,SAGF,MAAM,EAAe,CAC1B,GACA,GACA,GACA,GACA,GACA,GAEA,WAAW,CAAC,EAAyB,EAA2B,GAAiB,EAAiB,QAAS,CACzG,KAAK,GAAY,EAAQ,YACzB,KAAK,GAAe,CAAC,GAAG,GAAsB,GAAI,EAAQ,gBAAkB,CAAC,CAAE,EAC/E,KAAK,GAAc,IAAI,KACpB,EAAQ,YAAc,CAAC,MAAO,OAAQ,MAAM,GAAG,IAAI,CAAC,IACnD,EAAI,YAAY,CAClB,CACF,EACA,KAAK,GAAa,EAClB,KAAK,GAAU,OAGX,MAAK,CAAC,EAAiF,CAC3F,GAAI,CACF,KAAK,GAAgB,MAAM,KAAK,GAC9B,KAAK,GACL,CAAC,EAAO,IAAW,CACjB,GAAI,EAAO,CACT,KAAK,GAAQ,MAAM,EAAa,UAAW,iBAAkB,CAAK,CAAC,EACnE,OAGF,GAAI,CACF,QAAW,KAAY,EAAQ,CAC7B,IAAM,EAAe,GAAc,GAAK,SAAS,KAAK,GAAW,EAAS,IAAI,CAAC,EAE/E,GAAI,EAAa,WAAW,IAAI,EAC9B,SAGF,IAAM,EAAW,GAAK,SAAS,CAAY,EACrC,EAAY,GAAK,QAAQ,CAAY,EAAE,YAAY,EAGzD,GAAI,CAFiB,GAAkB,IAAI,CAAQ,GAE9B,CAAC,KAAK,GAAY,IAAI,CAAS,EAClD,SAGF,GAAI,EAAa,SAAS,OAAO,EAC/B,SAGF,EAAS,CACP,UAAW,GAAa,EAAS,IAAI,EACrC,SAAU,CACZ,CAAC,GAEH,MAAO,EAAe,CACtB,KAAK,GAAQ,MAAM,EAAa,UAAW,iBAAkB,CAAa,CAAC,IAG/E,CACE,OAAQ,KAAK,EACf,CACF,EACA,MAAO,EAAO,CACd,OAAO,GAAI,EAAa,UAAW,8BAA+B,CAAK,CAAC,QAItE,MAAK,EAAwC,CACjD,GAAI,CAAC,KAAK,GACR,OAGF,GAAI,CACF,MAAM,KAAK,GAAc,YAAY,EACrC,KAAK,GAAgB,OACrB,MAAO,EAAO,CACd,OAAO,GAAI,EAAa,UAAW,0BAA2B,CAAK,CAAC,GAG1E,CC7HA,qBACA,mBAAS,YAcT,IAAM,GAAoB,CAAC,qBAAsB,aAAc,gBAAiB,YAAY,EAE5F,eAAsB,EAAgB,CAAC,EAAiD,CACtF,IAAM,EAAgC,CAAC,EAEvC,cAAiB,KAAuB,GAAG,KAAK,kBAAmB,CACjE,IAAK,EACL,QAAS,EACX,CAAC,EAAG,CACF,IAAM,EAAa,GAAK,QAAQ,CAAmB,EAAE,WAAW,KAAM,GAAG,EACnE,EAAc,GAAK,KAAK,EAAa,CAAmB,EACxD,EAAU,MAAM,IAAI,KAAK,CAAW,EAAE,KAAK,EAE3C,EACJ,OAAO,GAAS,OAAS,UAAY,EAAQ,KAAK,OAAS,EACvD,EAAQ,KACR,GAAK,SAAS,IAAe,IAAM,EAAc,CAAU,EAEjE,EAAW,KAAK,CACd,IAAK,EACL,QAAS,CACX,CAAC,EAIH,OADA,EAAW,KAAK,CAAC,EAAM,IAAU,EAAM,IAAI,OAAS,EAAK,IAAI,MAAM,EAC5D,EAGF,SAAS,CAAkB,CAChC,EACA,EACA,EAAc,UACN,CACR,IAAM,EAAqB,EAAS,WAAW,KAAM,GAAG,EACxD,QAAW,KAAY,EAAY,CACjC,GAAI,EAAS,MAAQ,IACnB,OAAO,EAAS,QAGlB,GACE,IAAuB,EAAS,KAChC,EAAmB,WAAW,GAAG,EAAS,MAAM,EAEhD,OAAO,EAAS,QAIpB,OAAO,EC9DT,qBAOA,IAAM,EAAQ,IAAI,IAElB,eAAe,EAAU,CAAC,EAA6D,CACrF,IAAM,EAAO,IAAI,KAAK,CAAU,EAChC,GAAI,CAAE,MAAM,EAAK,OAAO,EACtB,OAAO,KAGT,IAAM,EAAS,MAAM,EAAK,KAAK,EAC/B,OAAO,OAAO,IAAW,UAAY,IAAW,KAAQ,EAAqC,KAG/F,eAAsB,EAAiB,CAAC,EAAoD,CAC1F,GAAI,EAAM,IAAI,CAAW,EACvB,OAAO,EAAM,IAAI,CAAW,GAAK,KAGnC,IAAM,EAAe,GAAK,KAAK,EAAa,eAAe,EAErD,EAAS,MAAM,GAAW,CAAY,EAC5C,GAAI,CAAC,EAEH,OADA,EAAM,IAAI,EAAa,IAAI,EACpB,KAGT,IAAM,EACJ,OAAO,EAAO,kBAAoB,UAAY,EAAO,kBAAoB,KACpE,EAAO,gBACR,KAEN,GAAI,CAAC,EAEH,OADA,EAAM,IAAI,EAAa,IAAI,EACpB,KAGT,IAAM,EAAa,OAAO,EAAgB,UAAY,SAAW,EAAgB,QAAU,KACrF,EACJ,OAAO,EAAgB,QAAU,UAAY,EAAgB,QAAU,KAClE,EAAgB,MACjB,KAEN,GAAI,CAAC,GAAc,CAAC,EAElB,OADA,EAAM,IAAI,EAAa,IAAI,EACpB,KAGT,IAAM,EAAkB,EAAa,GAAK,QAAQ,EAAa,CAAU,EAAI,EACvE,EAAQ,IAAI,IAElB,GAAI,EACF,QAAY,EAAS,KAAY,OAAO,QAAQ,CAAQ,EAAG,CACzD,GAAI,CAAC,MAAM,QAAQ,CAAO,EACxB,SAGF,IAAM,EAAoB,EAAQ,OAAO,CAAC,IAA2B,OAAO,IAAU,QAAQ,EAC9F,EAAM,IAAI,EAAS,CAAiB,EAIxC,IAAM,EAAwB,CAC5B,QAAS,EACT,OACF,EAGA,OADA,EAAM,IAAI,EAAa,CAAM,EACtB,EAGF,SAAS,EAAuB,CAAC,EAA4B,CAClE,GAAI,EAAa,CACf,EAAM,OAAO,CAAW,EACxB,OAGF,EAAM,MAAM,EClFd,qBAEO,SAAS,EAAc,CAAC,EAAqB,EAA8B,CAChF,OAAO,GAAK,SAAS,EAAa,CAAY,EAAE,WAAW,KAAM,GAAG,EAG/D,SAAS,EAAc,CAAC,EAAqB,EAA8B,CAChF,OAAO,GAAK,QAAQ,EAAa,CAAY,ECPxC,SAAS,CAAU,CAAC,EAAuB,CAChD,IAAM,EAAM,IAAI,KAAK,SAAS,CAAK,EAEnC,OADiB,OAAO,QAAQ,GAAI,OAAO,CAAG,CAAC,EAC/B,SAAS,EAAE,EAAE,SAAS,GAAI,GAAG,ECI/C,gBAAS,wBCPT,mBAAS,YACT,eAAS,cA2BT,eAAsB,EAAa,CAAC,EAA0D,CAC5F,IAAQ,cAAa,aAAY,iBAAgB,YAAa,EAExD,EAAc,EAAS,YAAY,EACnC,EAAY,IAAI,IAChB,EAA8B,CAAC,EAC/B,EAAgC,CAAC,EAEjC,EAAc,EAAe,IAAI,CAAC,IAAM,IAAI,IAAI,KAAK,CAAC,CAAC,EAE7D,cAAiB,KAAgB,GAAW,KAAK,OAAQ,CAAE,IAAK,CAAY,CAAC,EAAG,CAC9E,GAAI,CAAC,EAAW,KAAK,CAAC,IAAQ,EAAa,SAAS,CAAG,CAAC,EAAG,SAE3D,GAAI,EAAY,KAAK,CAAC,IAAM,EAAE,MAAM,CAAY,CAAC,EAAG,SAEpD,EAAU,IAAI,CAAY,EAE1B,IAAM,EAAU,GAAK,EAAa,CAAY,EACxC,EAAU,IAAI,KAAK,CAAO,GACxB,OAAM,aAAc,GAAY,EAElC,EAAW,EAAY,IAAI,CAAY,EAE7C,GAAI,CAAC,EAAU,CACb,IAAM,EAAO,MAAM,EAAQ,KAAK,EAC1B,EAAc,EAAW,CAAI,EACnC,EAAQ,KAAK,CAAE,SAAU,EAAc,cAAa,UAAS,MAAK,CAAC,EACnE,SAGF,GAAI,EAAS,UAAY,GAAW,EAAS,OAAS,EAAM,CAC1D,EAAU,KAAK,CAAE,SAAU,EAAc,YAAa,EAAS,YAAa,UAAS,MAAK,CAAC,EAC3F,SAGF,IAAM,EAAO,MAAM,EAAQ,KAAK,EAC1B,EAAc,EAAW,CAAI,EACnC,GAAI,IAAgB,EAAS,YAC3B,EAAU,KAAK,CAAE,SAAU,EAAc,cAAa,UAAS,MAAK,CAAC,EAErE,OAAQ,KAAK,CAAE,SAAU,EAAc,cAAa,UAAS,MAAK,CAAC,EAIvE,IAAM,EAAoB,CAAC,EAC3B,QAAW,KAAY,EAAY,KAAK,EACtC,GAAI,CAAC,EAAU,IAAI,CAAQ,EACzB,EAAQ,KAAK,CAAQ,EAIzB,MAAO,CAAE,UAAS,YAAW,SAAQ,ECxCvC,SAAS,EAAc,CAAC,EAAqC,CAC3D,GAAI,EAAI,OAAS,YAAc,EAAI,OAAS,SAAU,CACpD,IAAM,EAAa,EAAI,YAAY,QAAU,EACvC,EAAU,EAAI,UAAU,SAAS,OAAO,EAAI,EAAI,EACtD,MAAO,UAAU,WAAoB,IAEvC,OAAO,KAGT,SAAS,EAAe,CAAC,EAAqC,CAC5D,IAAM,EAAkC,CAAC,EAEzC,GAAI,EAAI,MAAO,EAAO,MAAQ,EAAI,MAElC,GAAI,EAAI,OAAS,YAAc,EAAI,OAAS,SAAU,CACpD,GAAI,EAAI,aAAe,OAAW,EAAO,WAAa,EAAI,WAC1D,GAAI,EAAI,aAAe,OAAW,EAAO,WAAa,EAAI,WAG5D,GAAI,EAAI,UAAU,OAAQ,EAAO,SAAW,EAAI,SAChD,GAAI,EAAI,YAAY,OAAQ,EAAO,WAAa,EAAI,WACpD,GAAI,EAAI,gBAAgB,OAAQ,EAAO,eAAiB,EAAI,eAC5D,GAAI,EAAI,WAAW,OAAQ,EAAO,UAAY,EAAI,UAClD,GAAI,EAAI,SAAS,OACf,EAAO,QAAU,EAAI,QAAQ,IAAI,CAAC,IAAM,CACtC,IAAM,EAAa,EAAE,UAAU,KAC7B,CAAC,IAAgB,IAAQ,WAAa,IAAQ,aAAe,IAAQ,QACvE,EACA,MAAO,CACL,KAAM,EAAE,KACR,KAAM,EAAE,YAAc,EAAE,KACxB,KAAM,EAAE,WACR,aACA,SAAU,EAAE,UAAU,SAAS,QAAQ,GAAK,OAC5C,WAAY,EAAE,UAAU,SAAS,UAAU,GAAK,MAClD,EACD,EAGH,OAAO,OAAO,KAAK,CAAM,EAAE,OAAS,EAAI,KAAK,UAAU,CAAM,EAAI,KAGnE,SAAS,EAAQ,CACf,EACA,EACA,EACA,EACA,EACa,CACb,IAAM,EAAY,GAAe,CAAG,EAC9B,EAAc,EAAW,GAAG,KAAQ,EAAI,QAAQ,GAAa,IAAI,EAEvE,MAAO,CACL,UACA,WACA,KAAM,EAAI,KACV,OACA,UAAW,EAAI,KAAK,MAAM,KAC1B,YAAa,EAAI,KAAK,MAAM,OAC5B,QAAS,EAAI,KAAK,IAAI,KACtB,UAAW,EAAI,KAAK,IAAI,OACxB,WAAY,EAAI,WAAa,EAAI,EACjC,YACA,cACA,WAAY,GAAgB,CAAG,EAC/B,cACA,UAAW,IAAI,KAAK,EAAE,YAAY,CACpC,EAGK,SAAS,EAAgB,CAAC,EAAqC,CACpE,IAAQ,SAAQ,UAAS,WAAU,cAAa,cAAe,EAEzD,EAAY,GAAe,CAAM,EACjC,EAAsB,CAAC,EAE7B,QAAW,KAAO,EAAW,CAC3B,EAAK,KAAK,GAAS,EAAK,EAAI,KAAM,EAAS,EAAU,CAAW,CAAC,EAEjE,QAAW,KAAU,EAAI,SAAW,CAAC,EACnC,EAAK,KAAK,GAAS,EAAQ,GAAG,EAAI,QAAQ,EAAO,OAAQ,EAAS,EAAU,CAAW,CAAC,EAI5F,EAAW,mBAAmB,EAAS,EAAU,EAAa,CAAI,EC3F7D,SAAS,EAAkB,CAAC,EAAyC,CAC1E,IAAQ,MAAK,UAAS,WAAU,eAAc,cAAa,iBAAkB,EAEvE,EAAc,GAAe,EAAa,CAAQ,EAClD,EAAe,GAAiB,EAAK,EAAa,CAAa,EAE/D,EAAwB,CAAC,EAE/B,QAAW,KAAO,EAAc,CAC9B,IAAM,EAAS,GAAe,EAAa,EAAI,WAAW,EAE1D,GAAI,EAAO,WAAW,IAAI,EAAG,SAE7B,IAAM,EAAS,GAAe,EAAa,EAAI,WAAW,EAE1D,EAAK,KAAK,CACR,UACA,KAAM,EAAI,KACV,YAAa,EACb,cAAe,EAAI,eAAiB,KACpC,YAAa,EACb,cAAe,EAAI,eAAiB,KACpC,SAAU,EAAI,UAAY,IAC5B,CAAC,EAIH,OADA,EAAa,qBAAqB,EAAS,EAAU,CAAI,EAClD,EAAK,OHzCP,IAAM,GAAsB,IAoE5B,MAAM,EAAiB,CACX,KACA,OAEA,UAAY,IAAI,IAEzB,aAAe,GAEf,cAAmC,CAAC,EAEpC,cAAsD,KAEtD,gBAA+C,KAE/C,iBAAmB,GAEnB,wBAAsG,CAAC,EAEvG,iBAEA,kBAA0C,KAElD,WAAW,CAAC,EAA+B,CACzC,KAAK,KAAO,EACZ,KAAK,OAAS,EAAK,QAAU,QAC7B,KAAK,iBAAmB,GAAkB,EAAK,WAAW,KAGxD,cAAa,EAAkC,CACjD,OAAO,KAAK,iBAGd,SAAS,EAAyB,CAChC,OAAO,KAAK,WAAW,OAAW,EAAI,EAGxC,gBAAgB,CAAC,EAAkD,CACjE,OAAO,KAAK,WAAW,EAAQ,EAAK,EAGtC,SAAS,CAAC,EAA+C,CAEvD,OADA,KAAK,UAAU,IAAI,CAAE,EACd,IAAM,KAAK,UAAU,OAAO,CAAE,EAGvC,kBAAkB,CAAC,EAA8B,CAC/C,GAAI,EAAM,SAAS,SAAS,eAAe,EAAG,CAC5C,GAAwB,KAAK,KAAK,WAAW,EAC7C,KAAK,iBAAmB,GAAkB,KAAK,KAAK,WAAW,EAC/D,KAAK,UAAU,EAAE,MAAM,CAAC,IAAQ,CAC9B,KAAK,OAAO,MAAM,6DAA8D,CAAG,EACpF,EACD,OAGF,GAAI,EAAM,SAAS,SAAS,cAAc,EAAG,CAC3C,IAAM,EAAW,KAAK,KAAK,oBAAsB,GACjD,KAAK,kBAAoB,EAAS,KAAK,KAAK,WAAW,EAAE,KAAK,CAAC,IAAM,CACnE,KAAK,KAAK,WAAa,EACxB,EAKH,GAFA,KAAK,cAAc,KAAK,CAAK,EAEzB,KAAK,gBAAkB,KACzB,KAAK,cAAgB,WAAW,IAAM,CACpC,KAAK,cAAgB,KACrB,KAAK,aAAa,GACjB,EAAmB,OAIpB,SAAQ,EAAkB,CAC9B,GAAI,KAAK,gBAAkB,KACzB,aAAa,KAAK,aAAa,EAC/B,KAAK,cAAgB,KAEvB,GAAI,KAAK,gBACP,MAAM,KAAK,gBAIP,UAAU,CAAC,EAAuC,EAA+C,CACvG,GAAI,KAAK,aAAc,CACrB,GAAI,EAEF,OADA,KAAK,iBAAmB,GACjB,IAAI,QAAqB,CAAC,EAAS,IAAW,CACnD,KAAK,wBAAwB,KAAK,CAAE,UAAS,QAAO,CAAC,EACtD,EAEH,OAAO,KAAK,gBAEd,KAAK,aAAe,GAEpB,IAAM,EAAO,KAAK,QAAQ,EAAQ,CAAc,EAC7C,KAAK,CAAC,IAAW,CAEhB,OADA,KAAK,cAAc,CAAM,EAClB,EACR,EACA,QAAQ,IAAM,CAGb,GAFA,KAAK,aAAe,GACpB,KAAK,gBAAkB,KACnB,KAAK,iBAAkB,CACzB,KAAK,iBAAmB,GACxB,IAAM,EAAU,KAAK,wBAAwB,OAAO,CAAC,EACrD,KAAK,WAAW,OAAW,EAAI,EAC5B,KAAK,CAAC,IAAW,CAChB,QAAW,KAAU,EAAS,EAAO,QAAQ,CAAM,EACpD,EACA,MAAM,CAAC,IAAU,CAChB,QAAW,KAAU,EAAS,EAAO,OAAO,CAAK,EAClD,EACE,QAAI,KAAK,cAAc,OAAS,EAAG,CACxC,IAAM,EAAU,KAAK,cAAc,OAAO,CAAC,EAC3C,KAAK,WAAW,EAAS,EAAK,EAAE,MAAM,CAAC,IACrC,KAAK,OAAO,MAAM,6CAA8C,CAAG,CACrE,GAEH,EAGH,OADA,KAAK,gBAAkB,EAChB,OAGK,QAAO,CAAC,EAAuC,EAA+C,CAC1G,IAAM,EAAQ,KAAK,IAAI,GACf,WAAU,aAAY,eAAc,gBAAiB,KAAK,KAElE,GAAI,KAAK,kBACP,MAAM,KAAK,kBACX,KAAK,kBAAoB,KAG3B,IAAI,EACA,EAEJ,GAAI,IAAW,OACb,EAAU,EACP,OAAO,CAAC,IAAM,EAAE,YAAc,UAAY,EAAE,YAAc,QAAQ,EAClE,IAAI,CAAC,KAAO,CACX,SAAU,EAAE,SACZ,YAAa,GACb,QAAS,EACT,KAAM,CACR,EAAE,EACJ,EAAU,EAAO,OAAO,CAAC,IAAM,EAAE,YAAc,QAAQ,EAAE,IAAI,CAAC,IAAM,EAAE,QAAQ,EACzE,KACL,IAAM,EAAc,IAAI,IACxB,QAAW,KAAY,KAAK,KAAK,WAC/B,QAAY,EAAK,KAAQ,EAAS,YAAY,EAAS,OAAO,EAC5D,EAAY,IAAI,EAAK,CAAG,EAG5B,IAAM,EAAS,MAAM,GAAc,CACjC,YAAa,KAAK,KAAK,YACvB,WAAY,KAAK,KAAK,WACtB,eAAgB,KAAK,KAAK,eAC1B,SAAU,CAAE,YAAa,IAAM,CAAY,CAC7C,CAAC,EACD,EAAU,EAAO,QACjB,EAAU,EAAO,QAGnB,IAAM,EAAiB,MAAM,KAAK,kBAAqB,OAEjD,EAAiB,IAAI,IAC3B,QAAW,KAAY,EAAS,CAC9B,IAAM,EAAU,EAAmB,EAAU,KAAK,KAAK,UAAU,EAC3D,EAAO,EAAW,eAAe,EAAS,CAAQ,EACxD,EAAe,IAAI,EAAU,CAAI,EAKnC,IAAM,EAAiB,IAAI,IACrB,EAAgB,IAAI,IAE1B,GAAI,EAEF,QAAW,KAAY,KAAK,KAAK,WAC/B,QAAW,KAAK,EAAS,YAAY,EAAS,OAAO,EACnD,QAAW,KAAO,EAAW,eAAe,EAAS,QAAS,EAAE,QAAQ,EACtE,EAAe,IAAI,GAAG,EAAI,aAAa,EAAI,OAAQ,CACjD,KAAM,EAAI,KAAM,SAAU,EAAI,SAAU,KAAM,EAAI,KAAM,YAAa,EAAI,WAC3E,CAAC,EAIF,KAEL,QAAW,KAAQ,EAAS,CAC1B,IAAM,EAAU,EAAmB,EAAK,SAAU,KAAK,KAAK,UAAU,EACtE,QAAW,KAAO,EAAW,eAAe,EAAS,EAAK,QAAQ,EAChE,EAAe,IAAI,GAAG,EAAI,aAAa,EAAI,OAAQ,CACjD,KAAM,EAAI,KAAM,SAAU,EAAI,SAAU,KAAM,EAAI,KAAM,YAAa,EAAI,WAC3E,CAAC,EAIL,SAAc,KAAS,EACrB,QAAW,KAAO,EAChB,EAAe,IAAI,GAAG,EAAI,aAAa,EAAI,OAAQ,CACjD,KAAM,EAAI,KAAM,SAAU,EAAI,SAAU,KAAM,EAAI,KAAM,YAAa,EAAI,WAC3E,CAAC,EAKP,IAAM,EAAiB,IAAM,CAC3B,QAAW,KAAY,EAAS,CAC9B,IAAM,EAAU,EAAmB,EAAU,KAAK,KAAK,UAAU,EACjE,EAAW,kBAAkB,EAAS,CAAQ,EAC9C,EAAa,oBAAoB,EAAS,CAAQ,EAClD,EAAS,WAAW,EAAS,CAAQ,IAInC,EAAiB,SAAoF,CACzG,IAAI,EAAU,EACV,EAAY,EACV,EAAwB,CAAC,EAC/B,QAAW,KAAQ,EACjB,GAAI,CACF,IAAM,EAAI,MAAM,KAAK,YAAY,EAAK,SAAU,EAAK,aAAe,OAAW,CAAa,EAC5F,GAAW,EAAE,YACb,GAAa,EAAE,SACf,MAAO,EAAK,CACZ,KAAK,OAAO,MAAM,sCAAsC,EAAK,YAAa,CAAG,EAC7E,EAAY,KAAK,EAAK,QAAQ,EAGlC,MAAO,CAAE,UAAS,YAAW,aAAY,GAGvC,EAAe,EACf,EAAiB,EACjB,EAA2B,CAAC,EAEhC,GAAI,EAAgB,CAClB,IAAQ,cAAa,cAAe,KAAK,MACjC,cAAe,KAAK,KACtB,EAAiB,MAAM,QAAQ,WACnC,EAAQ,IAAI,MAAO,IAAS,CAC1B,IAAM,EAAU,GAAe,EAAa,EAAK,QAAQ,EACnD,EAAU,IAAI,KAAK,CAAO,EAC1B,EAAO,MAAM,EAAQ,KAAK,EAC1B,EAAc,EAAK,aAAe,EAAW,CAAI,EACvD,MAAO,CAAE,SAAU,EAAK,SAAU,OAAM,cAAa,QAAS,EAAQ,aAAc,KAAM,EAAQ,IAAK,EACxG,CACH,EACM,EAAU,EACb,OAAO,CAAC,IAA2H,EAAE,SAAW,WAAW,EAC3J,IAAI,CAAC,IAAM,EAAE,KAAK,EACrB,QAAW,KAAK,EACd,GAAI,EAAE,SAAW,WACf,KAAK,OAAO,MAAM,8CAA+C,EAAE,MAAM,EAI7E,IAAM,EAAmE,CAAC,EAE1E,EAAa,YAAY,IAAM,CAC7B,QAAW,KAAY,EAAY,CACjC,IAAM,EAAe,EAAS,YAAY,EAAS,OAAO,EAC1D,QAAW,KAAK,EACd,EAAS,WAAW,EAAE,QAAS,EAAE,QAAQ,EAM7C,QAAW,KAAM,EAAS,CACxB,IAAM,EAAU,EAAmB,EAAG,SAAU,CAAU,EAC1D,EAAS,WAAW,CAClB,UACA,SAAU,EAAG,SACb,QAAS,EAAG,QACZ,KAAM,EAAG,KACT,YAAa,EAAG,YAChB,UAAW,IAAI,KAAK,EAAE,YAAY,EAClC,UAAW,EAAG,KAAK,MAAM;AAAA,CAAI,EAAE,MACjC,CAAC,EAIH,IAAM,EAAU,KAAK,KAAK,eAAiB,GAC3C,QAAW,KAAM,EAAS,CACxB,IAAM,EAAU,EAAmB,EAAG,SAAU,CAAU,EACpD,EAAc,EAAQ,GAAe,EAAa,EAAG,QAAQ,EAAG,EAAG,IAAI,EAC7E,GAAI,GAAM,CAAW,EAAG,MAAM,EAAY,KAC1C,IAAM,EAAS,EACf,EAAmB,KAAK,CAAE,SAAU,EAAG,SAAU,QAAO,CAAC,EACzD,GAAiB,CAAE,SAAQ,UAAS,SAAU,EAAG,SAAU,YAAa,EAAG,YAAa,YAAW,CAAC,EACpG,GAAkB,GAAmB,CACnC,IAAK,EAAO,QACZ,UACA,SAAU,EAAG,SACb,eACA,cACA,eACF,CAAC,EACD,GAAgB,EAAW,eAAe,EAAS,EAAG,QAAQ,EAAE,QAEnE,EAED,QAAW,KAAS,EAClB,EAAW,IAAI,EAAM,SAAU,EAAM,MAAM,EAExC,KACL,EAAe,EACf,IAAM,EAAS,MAAM,EAAe,EACpC,EAAe,EAAO,QACtB,EAAiB,EAAO,UACxB,EAAiB,EAAO,YAI1B,QAAW,KAAQ,EAAS,CAC1B,IAAM,EAAU,EAAmB,EAAK,SAAU,KAAK,KAAK,UAAU,EACtE,QAAW,KAAO,EAAW,eAAe,EAAS,EAAK,QAAQ,EAChE,EAAc,IAAI,GAAG,EAAI,aAAa,EAAI,OAAQ,CAChD,KAAM,EAAI,KAAM,SAAU,EAAI,SAAU,KAAM,EAAI,KAAM,YAAa,EAAI,WAC3E,CAAC,EAKL,IAAM,EAAgD,CAAE,MAAO,CAAC,EAAG,SAAU,CAAC,EAAG,QAAS,CAAC,CAAE,EAC7F,QAAY,EAAK,KAAU,EAAe,CACxC,IAAM,EAAS,EAAe,IAAI,CAAG,EACrC,GAAI,CAAC,EACH,EAAe,MAAM,KAAK,CAAE,KAAM,EAAM,KAAM,SAAU,EAAM,SAAU,KAAM,EAAM,IAAK,CAAC,EACrF,QAAI,EAAO,cAAgB,EAAM,YACtC,EAAe,SAAS,KAAK,CAAE,KAAM,EAAM,KAAM,SAAU,EAAM,SAAU,KAAM,EAAM,IAAK,CAAC,EAGjG,QAAY,EAAK,KAAW,EAC1B,GAAI,CAAC,EAAc,IAAI,CAAG,EACxB,EAAe,QAAQ,KAAK,CAAE,KAAM,EAAO,KAAM,SAAU,EAAO,SAAU,KAAM,EAAO,IAAK,CAAC,EAInG,GAAI,CAAC,EACH,QAAY,EAAS,KAAS,EAC5B,QAAW,KAAO,EAAM,CACtB,GAAI,CAAC,EAAI,YAAa,SACtB,IAAM,EAAa,EAAmB,EAAS,KAAK,KAAK,UAAU,EAC7D,EAAU,EAAW,iBAAiB,EAAY,EAAI,WAAW,EACvE,GAAI,EAAQ,SAAW,EAAG,CACxB,IAAM,EAAS,EAAQ,GACvB,EAAa,kBACX,EACA,EACA,EAAI,KACJ,EAAO,SACP,EAAO,IACT,GAMR,MAAO,CACL,aAAc,EAAQ,OACtB,aAAc,EAAQ,OACtB,eACA,iBACA,WAAY,KAAK,IAAI,EAAI,EACzB,aAAc,EAAQ,IAAI,CAAC,IAAM,EAAE,QAAQ,EAC3C,aAAc,CAAC,GAAG,CAAO,EACzB,YAAa,EACb,gBACF,OAGY,YAAW,CACvB,EACA,EACA,EACoD,CACpD,IAAQ,cAAa,cAAe,KAAK,MACjC,WAAU,aAAY,eAAc,cAAe,KAAK,KAE1D,EAAU,GAAe,EAAa,CAAQ,EAC9C,EAAU,IAAI,KAAK,CAAO,EAC1B,EAAO,MAAM,EAAQ,KAAK,EAC1B,EAAc,GAAa,EAAW,CAAI,EAE1C,EAAU,EAAmB,EAAU,CAAU,EAGjD,GADU,KAAK,KAAK,eAAiB,IACf,EAAS,CAAI,EACzC,GAAI,GAAM,CAAW,EAAG,MAAM,EAAY,KAC1C,IAAM,EAAS,EACf,EAAW,IAAI,EAAU,CAAM,EAE/B,EAAS,WAAW,CAClB,UACA,WACA,QAAS,EAAQ,aACjB,KAAM,EAAQ,KACd,cACA,UAAW,IAAI,KAAK,EAAE,YAAY,EAClC,UAAW,EAAK,MAAM;AAAA,CAAI,EAAE,MAC9B,CAAC,EAED,GAAiB,CAAE,SAAQ,UAAS,WAAU,cAAa,YAAW,CAAC,EAEvE,IAAM,EAAW,GAAmB,CAClC,IAAK,EAAO,QACZ,UACA,WACA,eACA,cACA,eACF,CAAC,EAGD,MAAO,CAAE,YADW,EAAW,eAAe,EAAS,CAAQ,EAAE,OAC3C,UAAS,EAGzB,aAAa,CAAC,EAA2B,CAC/C,QAAW,KAAM,KAAK,UACpB,GAAI,CACF,EAAG,CAAM,EACT,MAAO,EAAK,CACZ,KAAK,OAAO,MAAM,+CAAgD,CAAG,GAKnE,YAAY,EAAS,CAC3B,GAAI,KAAK,aACP,OAEF,GAAI,KAAK,cAAc,OAAS,EAAG,CACjC,IAAM,EAAS,KAAK,cAAc,OAAO,CAAC,EAC1C,KAAK,WAAW,EAAQ,EAAK,EAAE,MAAM,CAAC,IACpC,KAAK,OAAO,MAAM,oDAAqD,CAAG,CAC5E,GAGN,CI1fA,SAAS,EAAc,CAAC,EAAsB,CAC5C,GAAI,CAEF,OADA,QAAQ,KAAK,EAAK,CAAC,EACZ,GACP,MAAO,EAAO,CACd,GAAI,OAAO,IAAU,UAAY,GAAS,SAAU,EAClD,OAAQ,EAA4B,OAAS,QAG/C,MAAO,IAIX,SAAS,EAAS,CAAC,EAAuB,CACxC,IAAM,EAAK,IAAI,KAAK,CAAK,EAAE,QAAQ,EACnC,OAAO,OAAO,MAAM,CAAE,EAAI,EAAI,EAGzB,SAAS,EAAkB,CAChC,EACA,EACA,EAA0B,CAAC,EACd,CACb,IAAM,EAAM,EAAQ,KAAO,KAAK,IAC1B,EAAU,EAAQ,SAAW,GAC7B,EAAoB,EAAQ,mBAAqB,GAEvD,OAAO,EAAG,qBAAqB,IAAM,CACnC,IAAM,EAAQ,EAAG,YAAY,EAC7B,GAAI,CAAC,EAEH,OADA,EAAG,YAAY,CAAG,EACX,QAGT,IAAM,EAAsB,KAAK,OAAO,EAAI,EAAI,GAAU,EAAM,YAAY,GAAK,IAAI,EACrF,GAAI,EAAQ,EAAM,GAAG,GAAK,EAAsB,EAC9C,MAAO,SAIT,OADA,EAAG,aAAa,CAAG,EACZ,QACR,EAGI,SAAS,EAAkB,CAAC,EAAuB,EAAmB,CAC3E,EAAG,YAAY,CAAG,EAGb,SAAS,EAAe,CAAC,EAAuB,EAAmB,CACxE,EAAG,WAAW,CAAG,ECSZ,SAAS,EAAY,CAAC,EAIJ,CACvB,IAAQ,aAAY,UAAS,SAAU,EACjC,EAAmB,EAAM,SAAW,EACpC,EAAQ,EAAM,OAAS,IAEvB,EAAoD,CACxD,KAAM,EAAM,KACZ,SAAU,EAAM,SAChB,WAAY,EAAM,WAClB,QAAS,EACT,OACF,EAEA,GAAI,EAAM,KACR,GAAI,EAAM,MACR,EAAK,UAAY,EAAM,KAClB,KACL,IAAM,EAAW,GAAiB,EAAM,IAAI,EAC5C,GAAI,EAAU,EAAK,SAAW,EAIlC,GAAI,EAAM,UAAW,EAAK,UAAY,EAAM,UAC5C,GAAI,EAAM,MAAO,EAAK,MAAQ,EAAM,MAIpC,OAFgB,EAAW,cAAc,CAAI,EAE9B,IAAI,MAAM,CACvB,GAAI,EAAE,GACN,SAAU,EAAE,SACZ,KAAM,EAAE,KACR,KAAM,EAAE,KACR,KAAM,CACJ,MAAO,CAAE,KAAM,EAAE,UAAW,OAAQ,EAAE,WAAY,EAClD,IAAK,CAAE,KAAM,EAAE,QAAS,OAAQ,EAAE,SAAU,CAC9C,EACA,WAAY,EAAE,aAAe,EAC7B,UAAW,EAAE,UACb,YAAa,EAAE,YACf,OAAQ,EAAE,YAAc,IAAM,CAC5B,GAAI,CAAE,OAAO,KAAK,MAAM,EAAE,UAAW,EACrC,KAAM,CAAE,MAAO,CAAC,KACf,EAAI,CAAC,CACV,EAAE,ECpFG,SAAS,EAAc,CAAC,EAIZ,CACjB,IAAQ,eAAc,UAAS,SAAU,EACnC,EAAmB,EAAM,SAAW,EACpC,EAAQ,EAAM,OAAS,IAY7B,OAVgB,EAAa,gBAAgB,CAC3C,YAAa,EAAM,YACnB,cAAe,EAAM,cACrB,YAAa,EAAM,YACnB,cAAe,EAAM,cACrB,KAAM,EAAM,KACZ,QAAS,EACT,OACF,CAAC,EAEc,IAAI,KAAK,CACtB,IAAI,EACJ,GAAI,EAAE,SACJ,GAAI,CACF,EAAO,KAAK,MAAM,EAAE,QAAQ,EAC5B,KAAM,CACN,QAAQ,MAAM,uCAAwC,EAAE,QAAQ,EAGpE,MAAO,CACL,KAAM,EAAE,KACR,YAAa,EAAE,YACf,cAAe,EAAE,cACjB,YAAa,EAAE,YACf,cAAe,EAAE,cACjB,SAAU,EAAE,UAAY,OACxB,MACF,EACD,EC3DI,MAAM,EAAgB,CAKR,QAJX,cAAgB,IAAI,IACpB,qBAAuB,IAAI,IAEnC,WAAW,CACQ,EAIjB,CAJiB,eAWnB,KAAK,EAAS,CACZ,KAAK,cAAgB,IAAI,IACzB,KAAK,qBAAuB,IAAI,IAEhC,IAAM,EAAY,CAChB,GAAG,KAAK,QAAQ,aAAa,UAAU,KAAK,QAAQ,QAAS,SAAS,EACtE,GAAG,KAAK,QAAQ,aAAa,UAAU,KAAK,QAAQ,QAAS,iBAAiB,EAC9E,GAAG,KAAK,QAAQ,aAAa,UAAU,KAAK,QAAQ,QAAS,YAAY,CAC3E,EAEA,QAAW,KAAO,EAAW,CAC3B,IAAQ,cAAa,eAAgB,EAErC,GAAI,CAAC,KAAK,cAAc,IAAI,CAAW,EACrC,KAAK,cAAc,IAAI,EAAa,IAAI,GAAK,EAK/C,GAHA,KAAK,cAAc,IAAI,CAAW,EAAG,IAAI,CAAW,EAGhD,CAAC,KAAK,cAAc,IAAI,CAAW,EACrC,KAAK,cAAc,IAAI,EAAa,IAAI,GAAK,EAG/C,GAAI,CAAC,KAAK,qBAAqB,IAAI,CAAW,EAC5C,KAAK,qBAAqB,IAAI,EAAa,IAAI,GAAK,EAEtD,KAAK,qBAAqB,IAAI,CAAW,EAAG,IAAI,CAAW,GAS/D,eAAe,CAAC,EAA4B,CAC1C,OAAO,MAAM,KAAK,KAAK,cAAc,IAAI,CAAQ,GAAK,CAAC,CAAC,EAQ1D,aAAa,CAAC,EAA4B,CACxC,OAAO,MAAM,KAAK,KAAK,qBAAqB,IAAI,CAAQ,GAAK,CAAC,CAAC,EASjE,uBAAuB,CAAC,EAA4B,CAClD,IAAM,EAAU,IAAI,IACd,EAAkB,CAAC,CAAQ,EAEjC,MAAO,EAAM,OAAS,EAAG,CACvB,IAAM,EAAU,EAAM,MAAM,EAC5B,QAAW,KAAa,KAAK,qBAAqB,IAAI,CAAO,GAAK,CAAC,EACjE,GAAI,CAAC,EAAQ,IAAI,CAAS,EACxB,EAAQ,IAAI,CAAS,EACrB,EAAM,KAAK,CAAS,EAK1B,OAAO,MAAM,KAAK,CAAO,EAU3B,QAAQ,EAAY,CAClB,IAAM,EAAU,IAAI,IACd,EAAS,IAAI,IAEnB,QAAW,KAAa,KAAK,cAAc,KAAK,EAAG,CACjD,GAAI,EAAQ,IAAI,CAAS,EAAG,SAE5B,IAAM,EAAmD,CAAC,CAAE,KAAM,EAAW,QAAS,EAAM,CAAC,EAE7F,MAAO,EAAM,OAAS,EAAG,CACvB,IAAM,EAAU,EAAM,IAAI,EAE1B,GAAI,EAAQ,QAAS,CACnB,EAAO,OAAO,EAAQ,IAAI,EAC1B,SAGF,GAAI,EAAO,IAAI,EAAQ,IAAI,EACzB,MAAO,GAGT,GAAI,EAAQ,IAAI,EAAQ,IAAI,EAC1B,SAGF,EAAQ,IAAI,EAAQ,IAAI,EACxB,EAAO,IAAI,EAAQ,IAAI,EACvB,EAAM,KAAK,CAAE,KAAM,EAAQ,KAAM,QAAS,EAAK,CAAC,EAEhD,QAAW,KAAY,KAAK,cAAc,IAAI,EAAQ,IAAI,GAAK,CAAC,EAAG,CACjE,GAAI,EAAO,IAAI,CAAQ,EACrB,MAAO,GAET,GAAI,CAAC,EAAQ,IAAI,CAAQ,EACvB,EAAM,KAAK,CAAE,KAAM,EAAU,QAAS,EAAM,CAAC,IAMrD,MAAO,GAYT,mBAAmB,CAAC,EAAkC,CACpD,IAAM,EAAc,IAAI,IAExB,QAAW,KAAQ,EACjB,QAAW,KAAO,KAAK,wBAAwB,CAAI,EACjD,EAAY,IAAI,CAAG,EAIvB,OAAO,MAAM,KAAK,CAAW,EAW/B,gBAAgB,EAA0B,CACxC,IAAM,EAAS,IAAI,IACnB,QAAY,EAAM,KAAU,KAAK,cAC/B,EAAO,IAAI,EAAM,MAAM,KAAK,CAAK,CAAC,EAEpC,OAAO,EAWT,yBAAyB,CAAC,EAA4B,CACpD,IAAM,EAAU,IAAI,IACd,EAAkB,CAAC,CAAQ,EAEjC,MAAO,EAAM,OAAS,EAAG,CACvB,IAAM,EAAU,EAAM,MAAM,EAC5B,QAAW,KAAO,KAAK,cAAc,IAAI,CAAO,GAAK,CAAC,EACpD,GAAI,CAAC,EAAQ,IAAI,CAAG,EAClB,EAAQ,IAAI,CAAG,EACf,EAAM,KAAK,CAAG,EAKpB,OAAO,MAAM,KAAK,CAAO,EAY3B,aAAa,EAAe,CAC1B,IAAM,EAAa,IAAI,IACjB,EAAqB,CAAC,EACtB,EAAgB,IAAI,IACpB,EAAS,IAAI,IACb,EAAiB,CAAC,EAElB,EAAM,CAAC,IAAuB,CAClC,GAAI,EAAc,IAAI,CAAI,EAAG,OAC7B,GAAI,EAAO,IAAI,CAAI,EAAG,CACpB,IAAM,EAAa,EAAO,IAAI,CAAI,EAC5B,EAAQ,EAAK,MAAM,CAAU,EAC7B,EAAU,EAAM,OAAO,CAAC,EAAG,IAAO,GAAK,EAAI,EAAI,CAAE,EACjD,EAAM,EAAM,QAAQ,CAAO,EAC3B,EAAY,CAAC,GAAG,EAAM,MAAM,CAAG,EAAG,GAAG,EAAM,MAAM,EAAG,CAAG,CAAC,EACxD,EAAM,EAAU,KAAK,MAAI,EAC/B,GAAI,CAAC,EAAW,IAAI,CAAG,EACrB,EAAW,IAAI,CAAG,EAClB,EAAO,KAAK,CAAS,EAEvB,OAEF,EAAO,IAAI,EAAM,EAAK,MAAM,EAC5B,EAAK,KAAK,CAAI,EACd,QAAW,KAAY,KAAK,cAAc,IAAI,CAAI,GAAK,CAAC,EACtD,EAAI,CAAQ,EAEd,EAAK,IAAI,EACT,EAAO,OAAO,CAAI,EAClB,EAAc,IAAI,CAAI,GAGxB,QAAW,KAAa,KAAK,cAAc,KAAK,EAC9C,EAAI,CAAS,EAGf,OAAO,EAEX,CC3QA,sBAAS,WAAa,wBAiCtB,eAAsB,EAAa,CAAC,EAAqD,CACvF,GAAI,EAAK,UAAU,SAAW,EAAG,MAAO,CAAC,EAEzC,IAAM,EAA0B,CAAC,EAsBjC,OApBA,MAAM,GACJ,GAAK,WACL,CACE,MAAO,EAAK,UACZ,QAAS,CAAE,KAAM,CAAE,QAAS,EAAK,OAAQ,CAAE,CAC7C,EACA,CAAC,EAAK,IAAU,CACd,GAAI,EAAK,OACT,QAAW,KAAQ,EAAO,CACxB,IAAM,EAAI,EAAK,MAAM,EACrB,EAAQ,KAAK,CACX,SAAU,EAAK,QAAQ,EAAE,SAAS,EAClC,UAAW,EAAE,MAAM,KAAO,EAC1B,QAAS,EAAE,IAAI,KAAO,EACtB,YAAa,EAAK,KAAK,CACzB,CAAC,GAGP,EAEO,EjCvBT,IAAM,GAAwB,MACxB,GAA0B,MAC1B,GAA0B,GAmOzB,MAAM,EAAQ,CAEV,YAEQ,GACA,WACA,aACA,SACA,WACT,YAIA,QACS,qBACA,cACA,iBACA,mBACA,eACA,iBACA,gBACA,WACA,SACA,aACA,0BACA,OACA,eAER,KACD,MAA+C,KAC/C,eAA8C,CAAC,EAC/C,OAAS,GACT,cAAsC,KACtC,WAAgC,CAAC,EACxB,mBAAqB,IAAI,IAElC,WAAqC,KAErC,cAA+B,KAE/B,WAAW,CAAC,EA0BjB,CACD,KAAK,YAAc,EAAK,YACxB,KAAK,GAAK,EAAK,GACf,KAAK,WAAa,EAAK,WACvB,KAAK,aAAe,EAAK,aACzB,KAAK,SAAW,EAAK,SACrB,KAAK,WAAa,EAAK,WACvB,KAAK,YAAc,EAAK,YACxB,KAAK,QAAU,EAAK,QACpB,KAAK,qBAAuB,EAAK,qBACjC,KAAK,cAAgB,EAAK,cAC1B,KAAK,iBAAmB,EAAK,iBAC7B,KAAK,mBAAqB,EAAK,mBAC/B,KAAK,eAAiB,EAAK,eAC3B,KAAK,iBAAmB,EAAK,iBAC7B,KAAK,gBAAkB,EAAK,gBAC5B,KAAK,WAAa,EAAK,WACvB,KAAK,SAAW,EAAK,SACrB,KAAK,aAAe,EAAK,aACzB,KAAK,0BAA4B,EAAK,0BACtC,KAAK,OAAS,EAAK,OACnB,KAAK,eAAiB,EAAK,eAC3B,KAAK,KAAO,EAAK,iBAuBN,KAAI,CAAC,EAA0F,CAC1G,IACE,cACA,aAAa,CAAC,MAAO,OAAQ,MAAM,EACnC,iBAAiB,CAAC,EAClB,qBAAqB,IACrB,SAAS,QACT,eAAe,GACf,sBACA,iBACA,qBACA,oBACA,uBAAuB,GACvB,uBAAuB,GACvB,oBAAoB,GACpB,qBAAqB,GACrB,gBAAgB,GAChB,mBAAmB,GACnB,qBAAqB,GACrB,iBAAiB,GACjB,mBAAmB,GACnB,kBAAkB,GAClB,sBAAsB,GACtB,4BACA,aAAa,MAAO,IAAe,IAAI,KAAK,CAAE,EAAE,KAAK,EACrD,WAAW,MAAO,IAAe,CAAE,MAAM,IAAI,KAAK,CAAE,EAAE,OAAO,GAC7D,aACE,EAEJ,GAAI,CAAC,GAAK,WAAW,CAAW,EAC9B,OAAO,EAAI,EAAa,aAAc,wDAAwD,IAAc,CAAC,EAE/G,GAAI,CAAC,EAAa,CAAW,EAC3B,OAAO,EAAI,EAAa,aAAc,yCAAyC,IAAc,CAAC,EAGhG,IAAM,EAAK,EACP,EAAoB,EACpB,IAAI,GAAa,CAAE,aAAY,CAAC,EAC9B,EAAa,EAAG,KAAK,EAC3B,GAAI,GAAM,CAAU,EAAG,OAAO,EAC9B,GAAI,CAEJ,IAAM,EAAgC,MAAM,EAAmB,CAAW,EACpE,EAAiB,EAAW,IAAI,SAAW,GAAK,SAAS,CAAW,EAEpE,EAAQ,EACV,EAAkB,GACjB,IAAM,CACL,IAAM,EAAa,EACnB,MAAO,CACL,SAAU,IAAI,GAAe,CAAU,EACvC,WAAY,IAAI,GAAiB,CAAU,EAC3C,aAAc,IAAI,GAAmB,CAAU,EAC/C,WAAY,IAAI,GAAW,CAAkB,CAC/C,IACC,EAED,GAAc,GAAa,GAC7B,EACJ,GAAI,GACF,EAAO,MAAM,QAAQ,QACnB,EAAqB,EAAI,QAAQ,IAAK,CAAC,CAAC,CAC1C,EAEA,OAAO,QAGT,IAAI,GAGQ,KACR,GAA0D,KAExD,EAAW,IAAI,GAAQ,CAC3B,cACA,KACA,WAAY,EAAM,WAClB,aAAc,EAAM,aACpB,SAAU,EAAM,SAChB,WAAY,EAAM,WAClB,eACA,WACA,qBAAsB,EACtB,cAAe,EACf,iBAAkB,EAClB,mBAAoB,EACpB,eAAgB,EAChB,iBAAkB,EAClB,gBAAiB,EACjB,WAAY,EACZ,SAAU,EACV,eACA,4BACA,SACA,iBACA,MACF,CAAC,EAID,GAHA,GAAwB,CAAW,EACnC,EAAS,cAAgB,MAAM,EAAoB,CAAW,EAC9D,EAAS,WAAa,EAClB,IAAS,QAAS,CACpB,IAAM,EAAI,EACN,EAAmB,EACnB,IAAI,GAAiB,CACnB,cACA,aACA,aACA,iBACA,aAAc,EACd,WAAY,EAAM,WAClB,SAAU,EAAM,SAChB,WAAY,EAAM,WAClB,aAAc,EAAM,aACpB,QACF,CAAC,EAKL,GAHA,EAAS,YAAc,EACvB,EAAE,UAAU,IAAM,EAAS,qBAAqB,CAAC,EAE7C,GAAa,CACf,IAAM,EAAI,EACN,EAAe,EACf,IAAI,GAAe,CAAE,cAAa,iBAAgB,YAAW,EAAG,OAAW,CAAM,EAErF,EAAS,QAAU,EAEnB,MAAM,EAAE,MAAM,CAAC,IAAU,EAAE,qBAAqB,CAAK,CAAC,EAAE,KAAK,CAAC,IAAgB,CAC5E,GAAI,GAAM,CAAW,EAAG,MAAM,EAAY,KAC3C,EAED,IAAM,EAAQ,YAAY,IAAM,CAC9B,EAAkB,EAAI,QAAQ,GAAG,GAChC,EAAqB,EACxB,EAAS,MAAQ,EAGnB,MAAM,EAAE,UAAU,EACb,KACL,IAAI,EAAa,EACX,EAAc,SAAY,CAC9B,GAAI,CACF,IAAM,EAAU,MAAM,QAAQ,QAC5B,EAAqB,EAAI,QAAQ,IAAK,CAAC,CAAC,CAC1C,EAEA,GADA,EAAa,EACT,IAAY,QAAS,CACvB,cAAc,EAAS,KAAM,EAC7B,EAAS,MAAQ,KACjB,IAAI,EAAkE,KAClE,EAGQ,KACZ,GAAI,CACF,EAAkB,EACd,EAAe,EACf,IAAI,GAAe,CAAE,cAAa,iBAAgB,YAAW,EAAG,OAAW,CAAM,EACrF,EAAsB,EAClB,EAAmB,EACnB,IAAI,GAAiB,CACnB,cACA,aACA,aACA,iBACA,aAAc,EACd,WAAY,EAAM,WAClB,SAAU,EAAM,SAChB,WAAY,EAAM,WAClB,aAAc,EAAM,aACpB,QACF,CAAC,EACL,QAAW,KAAM,EAAS,mBACxB,EAAoB,UAAU,CAAE,EAElC,EAAoB,UAAU,IAAM,EAAS,qBAAqB,CAAC,EACnE,MAAM,EAAgB,MAAM,CAAC,IAAU,GAAqB,qBAAqB,CAAK,CAAC,EAAE,KAAK,CAAC,IAAgB,CAC7G,GAAI,GAAM,CAAW,EAAG,MAAM,EAAY,KAC3C,EACD,IAAM,GAAU,YAAY,IAAM,CAChC,EAAkB,EAAI,QAAQ,GAAG,GAChC,EAAqB,EACxB,EAAS,MAAQ,GACjB,EAAS,YAAc,EACvB,EAAS,QAAU,EACnB,MAAM,EAAoB,UAAU,EACpC,MAAO,GAAU,CAEjB,GADA,EAAO,MAAM,wDAAyD,EAAQ,EAC1E,EAAiB,CACnB,IAAM,EAAc,MAAM,EAAgB,MAAM,EAChD,GAAI,GAAM,CAAW,EAAG,EAAO,MAAM,0DAA2D,EAAY,IAAI,EAChH,EAAS,QAAU,KAErB,GAAI,EACF,MAAM,EAAoB,SAAS,EAAE,MAAM,CAAC,IAC1C,EAAO,MAAM,iEAAkE,CAAC,CAClF,EACA,EAAS,YAAc,KAEzB,GAAI,EAAS,QAAU,KACrB,EAAS,MAAQ,YAAY,EAAa,EAAuB,IAIvE,MAAO,EAAK,CAGZ,GAFA,IACA,EAAO,MAAM,8BAA+B,CAAG,EAC3C,GAAc,GAChB,EAAO,MAAM,4DAA4D,EACzE,cAAc,EAAS,KAAM,EAC7B,EAAS,MAAQ,KACjB,EAAS,MAAM,EAAE,MAAM,CAAC,IACtB,EAAO,MAAM,oDAAqD,CAAQ,CAC5E,IAIA,EAAQ,YAAY,EAAa,EAAuB,EAC9D,EAAS,MAAQ,EAGnB,GAAI,GAAa,CACf,IAAM,EAAgD,CAAC,UAAW,SAAU,YAAY,EACxF,QAAW,KAAO,EAAS,CACzB,IAAM,EAAU,IAAM,CAAE,EAAS,MAAM,EAAE,MAAM,KAAO,EAAO,MAAM,sCAAuC,EAAK,CAAG,CAAC,GACnH,GAAI,IAAQ,aACV,QAAQ,GAAG,aAAc,CAAO,EAEhC,aAAQ,GAAG,EAAK,CAAO,EAEzB,EAAS,eAAe,KAAK,CAAC,EAAK,CAAO,CAAC,GAI/C,OAAO,EACL,MAAO,EAAO,CAEd,OADA,EAAG,MAAM,EACF,EAAI,EAAa,QAAS,iCAAkC,CAAK,CAAC,QAwBvE,MAAK,CAAC,EAAmE,CAC7E,GAAI,KAAK,OAAQ,OACjB,KAAK,OAAS,GAEd,IAAM,EAAyB,CAAC,EAEhC,QAAY,EAAK,KAAY,KAAK,eAChC,GAAI,IAAQ,aACV,QAAQ,IAAI,aAAc,CAAO,EAEjC,aAAQ,IAAI,EAAuB,CAAO,EAK9C,GAFA,KAAK,eAAiB,CAAC,EAEnB,KAAK,YACP,GAAI,CACF,MAAM,KAAK,YAAY,SAAS,EAChC,MAAO,EAAK,CACZ,EAAY,KAAK,aAAe,MAAQ,EAAU,MAAM,OAAO,CAAG,CAAC,CAAC,EAIxE,GAAI,KAAK,QAAS,CAChB,IAAM,EAAc,MAAM,KAAK,QAAQ,MAAM,EAC7C,GAAI,GAAM,CAAW,EAAG,EAAY,KAAK,EAAY,IAAI,EAG3D,GAAI,KAAK,QAAU,KACjB,cAAc,KAAK,KAAK,EACxB,KAAK,MAAQ,KAGf,GAAI,CACF,KAAK,qBAAqB,KAAK,GAAI,QAAQ,GAAG,EAC9C,MAAO,EAAK,CACZ,EAAY,KAAK,aAAe,MAAQ,EAAU,MAAM,OAAO,CAAG,CAAC,CAAC,EAGtE,GAAI,CACF,KAAK,GAAG,MAAM,EACd,MAAO,EAAK,CACZ,EAAY,KAAK,aAAe,MAAQ,EAAU,MAAM,OAAO,CAAG,CAAC,CAAC,EAGtE,GAAI,GAAM,QACR,QAAW,IAAO,CAAC,GAAI,OAAQ,MAAM,EACnC,GAAI,CACF,MAAM,KAAK,SAAS,GAAK,KAAK,KAAK,YAAa,UAAW,aAAe,CAAG,CAAC,EAC9E,KAAM,EAIZ,GAAI,EAAY,OAAS,EACvB,OAAO,EAAI,EAAa,QAAS,sDAAuD,CAAW,CAAC,EAmBxG,SAAS,CAAC,EAAqD,CAE7D,GADA,KAAK,mBAAmB,IAAI,CAAQ,EAChC,CAAC,KAAK,YACR,MAAO,IAAM,CAAE,KAAK,mBAAmB,OAAO,CAAQ,GAExD,IAAM,EAAc,KAAK,YAAY,UAAU,CAAQ,EACvD,MAAO,IAAM,CACX,KAAK,mBAAmB,OAAO,CAAQ,EACvC,EAAY,GA0BhB,WAAW,CAAC,EAAkB,EAAsD,CAClF,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,IAAM,EAAS,KAAK,cAAc,EAAU,CAAU,EACtD,GAAI,GAAM,CAAM,EAAG,OAAO,EAE1B,OADA,KAAK,WAAW,IAAI,EAAU,CAAM,EAC7B,EAsBT,cAAc,CAAC,EAA6D,CAC1E,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,OAAO,KAAK,iBAAiB,CAAM,EAqBrC,gBAAgB,CAAC,EAA0D,CACzE,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,OAAO,KAAK,mBACV,EAAO,QACP,EAAO,SACP,KAAK,eAAiB,MACxB,EAIM,oBAAoB,EAAS,CACnC,KAAK,WAAa,KAClB,KAAK,cAAgB,KASf,eAAe,CAAC,EAAmC,CACzD,IAAM,EAAM,GAAW,YACvB,GAAI,KAAK,YAAc,KAAK,gBAAkB,EAC5C,OAAO,KAAK,WAEd,IAAM,EAAI,IAAI,GAAgB,CAC5B,aAAc,KAAK,aACnB,QAAS,GAAW,KAAK,cAC3B,CAAC,EAID,OAHA,EAAE,MAAM,EACR,KAAK,WAAa,EAClB,KAAK,cAAgB,EACd,OAuBH,QAAO,EAA+C,CAC1D,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CAAC,KAAK,YACR,OAAO,EAAI,EAAa,SAAU,iDAAiD,CAAC,EAEtF,GAAI,CACF,IAAM,EAAS,MAAM,KAAK,YAAY,UAAU,EAEhD,OADA,KAAK,qBAAqB,EACnB,EACP,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,QAAS,0BAA2B,CAAC,CAAC,MAS9D,SAAQ,EAAsB,CAChC,MAAO,CAAC,GAAG,KAAK,UAAU,EAkB5B,QAAQ,CAAC,EAAqD,CAC5D,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,OAAO,KAAK,WAAW,SAAS,GAAW,KAAK,cAAc,EAC9D,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,QAAS,2BAA4B,CAAC,CAAC,GAoBnE,aAAa,CAAC,EAAsE,CAClF,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,OAAO,KAAK,eAAe,CAAE,WAAY,KAAK,WAAY,QAAS,KAAK,eAAgB,OAAM,CAAC,EAC/F,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,gCAAiC,CAAC,CAAC,GAmBzE,eAAe,CAAC,EAAkE,CAChF,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,OAAO,KAAK,iBAAiB,CAAE,aAAc,KAAK,aAAc,QAAS,KAAK,eAAgB,OAAM,CAAC,EACrG,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,kCAAmC,CAAC,CAAC,GAY3E,gBAAgB,CAAC,EAA8G,CAC7H,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,OAAO,KAAK,eAAe,CAAE,WAAY,KAAK,WAAY,QAAS,OAAW,OAAM,CAAC,EACrF,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,mCAAoC,CAAC,CAAC,GAY5E,kBAAkB,CAAC,EAAkE,CACnF,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,OAAO,KAAK,iBAAiB,CAAE,aAAc,KAAK,aAAc,QAAS,OAAW,OAAM,CAAC,EAC3F,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,qCAAsC,CAAC,CAAC,GAY9E,gBAAgB,CAAC,EAAsD,CACrE,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,OAAO,KAAK,SAAS,YAAY,GAAW,KAAK,cAAc,EAC/D,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,QAAS,mCAAoC,CAAC,CAAC,GAc3E,oBAAoB,CAAC,EAAkB,EAAwD,CAC7F,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,OAAO,KAAK,iBAAiB,CAC3B,aAAc,KAAK,aACnB,QAAS,GAAW,KAAK,eACzB,MAAO,CAAE,YAAa,EAAU,YAAa,EAAU,MAAO,GAAO,CACvE,CAAC,EACD,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,uCAAwC,CAAC,CAAC,GAiBhF,WAAW,CACT,EACA,EACY,CACZ,IAAM,EAAY,IAAI,IAAgC,EAAO,IAAI,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,WAAY,CAAC,CAAC,CAAC,EAChG,EAAW,IAAI,IAAgC,EAAM,IAAI,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,WAAY,CAAC,CAAC,CAAC,EAC9F,EAA8B,CAAC,EAC/B,EAAgC,CAAC,EACjC,EAA6E,CAAC,EACpF,QAAY,EAAK,KAAa,EAAU,CACtC,IAAM,EAAY,EAAU,IAAI,CAAG,EACnC,GAAI,CAAC,EACH,EAAM,KAAK,CAAQ,EACd,QAAI,EAAU,cAAgB,EAAS,YAC5C,EAAS,KAAK,CAAE,OAAQ,EAAW,MAAO,CAAS,CAAC,EAGxD,QAAY,EAAK,KAAc,EAC7B,GAAI,CAAC,EAAS,IAAI,CAAG,EAAG,EAAQ,KAAK,CAAS,EAEhD,MAAO,CAAE,QAAO,UAAS,UAAS,EAmBpC,eAAe,CAAC,EAAkB,EAAkB,EAAQ,IAAwC,CAClG,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,OAAO,KAAK,iBAAiB,CAC3B,aAAc,KAAK,aACnB,QAAS,GAAW,KAAK,eACzB,MAAO,CAAE,YAAa,EAAU,KAAM,UAAW,QAAS,GAAW,KAAK,eAAgB,OAAM,CAClG,CAAC,EAAE,IAAI,KAAK,EAAE,WAAW,EACzB,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,kCAAmC,CAAC,CAAC,GAoB3E,aAAa,CAAC,EAAkB,EAAkB,EAAQ,IAAwC,CAChG,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,OAAO,KAAK,iBAAiB,CAC3B,aAAc,KAAK,aACnB,QAAS,GAAW,KAAK,eACzB,MAAO,CAAE,YAAa,EAAU,KAAM,UAAW,QAAS,GAAW,KAAK,eAAgB,OAAM,CAClG,CAAC,EAAE,IAAI,KAAK,EAAE,WAAW,EACzB,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,gCAAiC,CAAC,CAAC,QAuBnE,YAAW,CAAC,EAAwB,EAA2D,CACnG,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CAEF,OADU,KAAK,gBAAgB,CAAO,EAC7B,oBAAoB,CAAY,EACzC,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,8BAA+B,CAAC,CAAC,QAuBjE,SAAQ,CAAC,EAA0D,CACvE,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CAEF,OADU,KAAK,gBAAgB,CAAO,EAC7B,SAAS,EAClB,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,2BAA4B,CAAC,CAAC,QAe9D,eAAc,CAAC,EAAwE,CAC3F,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CAEF,OADU,KAAK,gBAAgB,CAAO,EAC7B,iBAAiB,EAC1B,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,iCAAkC,CAAC,CAAC,QAYpE,0BAAyB,CAAC,EAAkB,EAA2D,CAC3G,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CAEF,OADU,KAAK,gBAAgB,CAAO,EAC7B,0BAA0B,CAAQ,EAC3C,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,4CAA6C,CAAC,CAAC,QAc/E,cAAa,CAAC,EAA6D,CAC/E,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CAEF,OADU,KAAK,gBAAgB,CAAO,EAC7B,cAAc,EACvB,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,gCAAiC,CAAC,CAAC,GAkBzE,cAAc,CACZ,EACA,EACuE,CACvE,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,IAAM,EAAmB,GAAW,KAAK,eAGnC,EAAU,KAAK,WAAW,cAAc,CAC5C,QAAS,EACT,WAAY,GACZ,MAAO,GACT,CAAC,EAGK,EAAkB,IAAI,IAC5B,QAAW,IAAW,CAAC,UAAW,YAAY,EAAY,CACxD,IAAM,EAAY,KAAK,aAAa,UAAU,EAAkB,CAAO,EACvE,QAAW,KAAO,EAChB,GAAI,EAAI,eAAiB,KACvB,EAAgB,IAAI,GAAG,EAAI,gBAAgB,EAAI,eAAe,EAMpE,IAAM,EAAc,GAAM,YACpB,EAAwB,CAAC,WAAY,YAAa,SAAS,EAmBjE,OAhBa,EACV,OAAO,CAAC,IAAQ,CAEf,GAAI,EAAgB,IAAI,GAAG,EAAI,aAAa,EAAI,MAAM,EAAG,MAAO,GAGhE,GAAI,IAAgB,OAElB,MAAO,CAAC,EAAY,SAAS,EAAI,QAAQ,EAG3C,IAAM,EAAW,EAAI,SAAS,MAAM,GAAG,EAAE,IAAI,GAAK,EAAI,SACtD,MAAO,CAAC,EAAsB,SAAS,CAAQ,EAChD,EACA,IAAI,CAAC,KAAS,CAAE,WAAY,EAAI,KAAM,SAAU,EAAI,QAAS,EAAE,EAGlE,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,QAAS,iCAAkC,CAAC,CAAC,GAezE,aAAa,CACX,EACA,EACA,EACkC,CAClC,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,IAAM,EAAmB,GAAW,KAAK,eACnC,EAAU,KAAK,eAAe,CAClC,WAAY,KAAK,WACjB,QAAS,EACT,MAAO,CAAE,KAAM,EAAY,MAAO,GAAM,WAAU,MAAO,CAAE,CAC7D,CAAC,EACD,GAAI,EAAQ,SAAW,EACrB,OAAO,EAAI,EAAa,SAAU,oBAAoB,oBAA6B,IAAW,CAAC,EAEjG,IAAM,EAAM,EAAQ,GACd,EAAI,EAAI,OAWd,MAVyB,IACpB,EACH,QAAS,MAAM,QAAQ,EAAE,OAAO,EAAK,EAAE,QAAoC,OAC3E,MAAO,OAAO,EAAE,QAAU,SAAW,EAAE,MAAQ,OAC/C,WAAY,OAAO,EAAE,aAAe,SAAW,EAAE,WAAa,OAC9D,WAAY,OAAO,EAAE,aAAe,SAAW,EAAE,WAAa,OAC9D,SAAU,MAAM,QAAQ,EAAE,QAAQ,EAAK,EAAE,SAAwB,OACjE,WAAY,MAAM,QAAQ,EAAE,UAAU,EAAK,EAAE,WAA0C,OACvF,eAAgB,OAAO,EAAE,iBAAmB,SAAW,EAAE,eAAiB,MAC5E,EAEA,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,gCAAiC,CAAC,CAAC,GAczE,YAAY,CACV,EACA,EACiC,CACjC,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,IAAM,EAAmB,GAAW,KAAK,eACnC,EAAa,KAAK,SAAS,QAAQ,EAAkB,CAAQ,EACnE,GAAI,CAAC,EACH,OAAO,EAAI,EAAa,SAAU,kBAAkB,wBAA+B,CAAC,EAEtF,IAAM,EAAU,KAAK,WAAW,eAAe,EAAkB,CAAQ,EACnE,EAAY,KAAK,aAAa,YAAY,EAAkB,CAAQ,EAC1E,MAAO,CACL,SAAU,EAAW,SACrB,UAAW,EAAW,WAAa,EACnC,KAAM,EAAW,KACjB,YAAa,EAAQ,OACrB,oBAAqB,EAAQ,OAAO,CAAC,IAAM,EAAE,UAAU,EAAE,OACzD,cAAe,EAAU,MAC3B,EACA,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,QAAS,+BAAgC,CAAC,CAAC,QAgBjE,cAAa,CACjB,EACA,EAC2C,CAC3C,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,IAAM,EAAI,KAAK,gBAAgB,CAAO,EACtC,MAAO,CACL,WACA,MAAO,EAAE,cAAc,CAAQ,EAAE,OACjC,OAAQ,EAAE,gBAAgB,CAAQ,EAAE,MACtC,EACA,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,gCAAiC,CAAC,CAAC,GAiBzE,aAAa,CACX,EACA,EACA,EACsC,CACtC,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,IAAM,EAAmB,GAAW,KAAK,eACnC,EAAU,IAAI,IACd,EAAyD,CAAC,EAE5D,EAAc,EACd,EAAc,EAElB,OAAS,CACP,IAAM,EAAM,GAAG,MAAgB,IAC/B,GAAI,EAAQ,IAAI,CAAG,EACjB,OAAO,EAAI,EAAa,SAAU,0DAA0D,CAAC,EAE/F,EAAQ,IAAI,CAAG,EAEf,IAAM,EAAO,KAAK,iBAAiB,CACjC,aAAc,KAAK,aACnB,QAAS,EACT,MAAO,CAAE,KAAM,aAAc,YAAa,EAAa,MAAO,GAAI,CACpE,CAAC,EAEG,EACA,EAEJ,QAAW,KAAO,EAAM,CACtB,IAAI,EACJ,GAAI,EAAI,SACN,GAAI,CACF,IAAM,EAAO,KAAK,MAAM,EAAI,QAAQ,EACpC,GAAI,MAAM,QAAQ,EAAK,UAAa,EAClC,EAAa,EAAK,WAEpB,KAAM,EAEV,GAAI,CAAC,EAAY,SACjB,IAAM,EAAQ,EAAW,KAAK,CAAC,IAAM,EAAE,WAAa,CAAW,EAC/D,GAAI,CAAC,EAAO,SACZ,EAAW,EAAI,YACf,EAAW,EAAM,MACjB,MAGF,GAAI,CAAC,GAAY,CAAC,EAChB,MAAO,CAAE,aAAc,EAAa,iBAAkB,EAAa,cAAe,CAAM,EAG1F,EAAM,KAAK,CAAE,SAAU,EAAa,WAAY,CAAY,CAAC,EAC7D,EAAc,EACd,EAAc,QAgBZ,YAAW,CACf,EACA,EAC+C,CAC/C,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,IAAM,EAAmB,GAAM,SAAW,KAAK,eACzC,EAAsB,GAAM,UAC9B,EAAK,UACL,KAAK,SAAS,YAAY,CAAgB,EAAE,IAAI,CAAC,IAAM,EAAE,QAAQ,EAErE,OAAO,MAAM,KAAK,gBAAgB,CAAE,UAAS,WAAU,CAAC,EACxD,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,8BAA+B,CAAC,CAAC,QAqBjE,sBAAqB,CACzB,EACA,EAC8C,CAC9C,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,KAAK,OAAS,QAChB,OAAO,EAAI,EAAa,SAAU,+DAA+D,CAAC,EAEpG,GAAI,CACF,IAAM,EAAyB,CAAC,EAChC,QAAW,KAAe,EAAU,CAClC,IAAM,EAAa,GAAK,QAAQ,KAAK,YAAa,eAAgB,CAAW,EAC7E,GAAI,CAAC,KAAK,aAAa,CAAU,EAC/B,OAAO,EAAI,EAAa,aAAc,+CAA+C,GAAa,CAAC,EAErG,IAAM,EAAU,aAAa,IAgBvB,EAAS,MAfK,KAAK,0BACrB,KAAK,0BAA0B,EAAY,CAAO,EAClD,IAAI,GAAiB,CACnB,YAAa,EACb,WAAY,CAAC,CAAE,IAAK,IAAK,SAAQ,CAAC,EAClC,WAAY,CAAC,OAAO,EACpB,eAAgB,CAAC,EACjB,aAAc,KAAK,GACnB,WAAY,KAAK,WAEjB,SAAU,KAAK,SACf,WAAY,KAAK,WACjB,aAAc,KAAK,aACnB,OAAQ,KAAK,MACf,CAAC,GAC4B,UAAU,EAC3C,EAAQ,KAAK,CAAM,EAErB,OAAO,EACP,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,QAAS,wCAAyC,CAAC,CAAC,QAc1E,WAAU,CAAC,EAA6E,CAC5F,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,IAAM,EAAS,IAAI,IAcnB,OAbA,MAAM,QAAQ,IACZ,EAAU,IAAI,MAAO,IAAO,CAC1B,GAAI,CACF,IAAM,EAAO,MAAM,KAAK,WAAW,CAAE,EAC/B,EAAS,KAAK,cAAc,EAAI,CAAI,EAC1C,GAAI,CAAC,GAAM,CAAM,EACf,EAAO,IAAI,EAAI,CAAoB,EAErC,KAAM,GAGT,CACH,EACO,EAWT,kBAAkB,CAAC,EAAkB,EAAyD,CAC5F,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CAMF,IAAM,EALU,KAAK,eAAe,CAClC,WAAY,KAAK,WACjB,QAAS,GAAW,KAAK,eACzB,MAAO,CAAE,WAAU,WAAY,EAAK,CACtC,CAAC,EACuB,IAAI,CAAC,KAAO,CAClC,KAAM,EAAE,KACR,KAAM,EAAE,KACR,WAAa,EAAE,OAAO,YAAqC,OAC3D,WAAa,EAAE,OAAO,YAAqC,OAC3D,MAAQ,EAAE,OAAO,OAAgC,MACnD,EAAE,EACF,MAAO,CAAE,WAAU,SAAQ,EAC3B,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,qCAAsC,CAAC,CAAC,QAgBxE,iBAAgB,CACpB,EACA,EACA,EAC6C,CAC7C,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,IAAM,EAAO,GAAW,KAAK,eACvB,EAAU,IAAI,IAEd,EAAY,CAAC,EAAiB,EAAY,IAAkD,CAChG,IAAM,EAAM,GAAG,MAAY,IAC3B,GAAI,EAAQ,IAAI,CAAG,EACjB,MAAO,CAAE,WAAY,EAAS,SAAU,EAAI,OAAM,SAAU,CAAC,CAAE,EAEjE,EAAQ,IAAI,CAAG,EAaf,IAAM,EAXO,KAAK,iBAAiB,CACjC,aAAc,KAAK,aACnB,QAAS,EACT,MAAO,CAAE,YAAa,EAAI,cAAe,EAAS,MAAO,IAAK,CAChE,CAAC,EAEyB,OACxB,CAAC,IACC,EAAE,OAAS,WAAa,EAAE,OAAS,YACvC,EAGG,OAAO,CAAC,IAAM,EAAE,eAAiB,IAAI,EACrC,IAAI,CAAC,IAAM,EAAU,EAAE,cAAgB,EAAE,YAAa,EAAE,IAAI,CAAC,EAEhE,MAAO,CAAE,WAAY,EAAS,SAAU,EAAI,OAAM,UAAS,GAG7D,OAAO,EAAU,EAAY,CAAQ,EACrC,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,mCAAoC,CAAC,CAAC,GAa5E,YAAY,CAAC,EAA0C,CACrD,GAAI,KAAK,OAAQ,OACjB,OAAO,KAAK,WAAW,IAAI,CAAQ,EAarC,WAAW,CAAC,EAAkB,EAA2D,CACvF,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,OAAO,KAAK,SAAS,QAAQ,GAAW,KAAK,eAAgB,CAAQ,EACrE,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,QAAS,8BAA+B,CAAC,CAAC,GAatE,gBAAgB,CAAC,EAAkB,EAA8D,CAC/F,OAAO,KAAK,cAAc,CAAE,WAAU,QAAS,GAAW,OAAW,MAAO,GAAO,CAAC,EAExF",
41
- "debugId": "643C91DBA7E3F7CF64756E2164756E21",
40
+ "mappings": ";iIAAA,cAAS,WAAK,wBACd,qBACA,qBAAS,YCFT,cAAS,wBACT,oBAAS,oBC+BF,SAAS,CAAY,CAAC,EAAwB,EAAiB,EAA+B,CACnG,OAAO,IAAU,OACb,CAAE,OAAM,UAAS,OAAM,EACvB,CAAE,OAAM,SAAQ,ED7Bf,SAAS,EAAW,CACzB,EACA,EACA,EACA,EAAuC,GACL,CAClC,GAAI,CACF,IAAQ,UAAS,SAAQ,YAAa,EAAY,EAAU,EAAY,CAAO,EAC/E,MAAO,CAAE,WAAU,QAAS,EAAkC,SAAQ,WAAU,YAAW,EAC3F,MAAO,EAAG,CACV,OAAO,GAAI,EAAa,QAAS,yBAAyB,IAAY,CAAC,CAAC,GEhBrE,MAAM,EAAe,CAC1B,GACA,GAAO,IAAI,IAEX,WAAW,CAAC,EAAkB,CAC5B,KAAK,GAAY,KAAK,IAAI,EAAG,CAAQ,KAGnC,KAAI,EAAW,CACjB,OAAO,KAAK,GAAK,KAGnB,GAAG,CAAC,EAAiB,CACnB,OAAO,KAAK,GAAK,IAAI,CAAG,EAG1B,GAAG,CAAC,EAAuB,CACzB,GAAI,CAAC,KAAK,GAAK,IAAI,CAAG,EACpB,OAEF,IAAM,EAAQ,KAAK,GAAK,IAAI,CAAG,EAG/B,OAFA,KAAK,GAAK,OAAO,CAAG,EACpB,KAAK,GAAK,IAAI,EAAK,CAAK,EACjB,EAGT,GAAG,CAAC,EAAQ,EAAgB,CAC1B,GAAI,KAAK,GAAK,IAAI,CAAG,EACnB,KAAK,GAAK,OAAO,CAAG,EAKtB,GAFA,KAAK,GAAK,IAAI,EAAK,CAAK,EAEpB,KAAK,GAAK,KAAO,KAAK,GAAW,CACnC,IAAM,EAAY,KAAK,GAAK,KAAK,EAAE,KAAK,EAAE,MAC1C,GAAI,IAAc,OAChB,KAAK,GAAK,OAAO,CAAS,GAKhC,MAAM,CAAC,EAAiB,CACtB,OAAO,KAAK,GAAK,OAAO,CAAG,EAG7B,KAAK,EAAS,CACZ,KAAK,GAAK,MAAM,EAEpB,CC7CO,MAAM,EAAW,CACL,IAEjB,WAAW,CAAC,EAAmB,IAAK,CAClC,KAAK,IAAM,IAAI,GAA6B,CAAQ,EAGtD,GAAG,CAAC,EAA0C,CAC5C,OAAO,KAAK,IAAI,IAAI,CAAQ,EAG9B,GAAG,CAAC,EAAkB,EAA0B,CAC9C,KAAK,IAAI,IAAI,EAAU,CAAM,EAG/B,UAAU,CAAC,EAAwB,CACjC,KAAK,IAAI,OAAO,CAAQ,EAG1B,aAAa,EAAS,CACpB,KAAK,IAAI,MAAM,EAGjB,IAAI,EAAW,CACb,OAAO,KAAK,IAAI,KAEpB,CC3BO,SAAS,EAAgB,CAAC,EAA8B,CAC7D,IAAM,EAAoB,CAAC,CAAC,EAC5B,QAAS,EAAI,EAAG,EAAI,EAAW,OAAQ,IACrC,GAAI,EAAW,KAAO;AAAA,EACpB,EAAQ,KAAK,EAAI,CAAC,EAGtB,OAAO,EAGF,SAAS,EAAa,CAAC,EAAmB,EAAgC,CAC/E,IAAI,EAAK,EACL,EAAK,EAAQ,OAAS,EAC1B,MAAO,EAAK,EAAI,CACd,IAAM,EAAO,EAAK,EAAK,GAAM,EAC7B,GAAI,EAAQ,IAAS,EACnB,EAAK,EAEL,OAAK,EAAM,EAGf,MAAO,CAAE,KAAM,EAAK,EAAG,OAAQ,EAAS,EAAQ,EAAK,ECvBvD,cAAS,wBACT,gBAAS,wBAIF,SAAS,EAAU,CAAC,EAAuD,CAChF,GAAI,CACF,IAAI,EAAW,EAAY,KAAK,EAChC,GAAI,EAAS,WAAW,KAAK,EAAG,EAAW,EAAS,MAAM,CAAC,EAC3D,GAAI,EAAS,SAAS,IAAI,EAAG,EAAW,EAAS,MAAM,EAAG,EAAE,EAG5D,IAAM,EADS,GAAM,OAAO,MAAa,EACpB,IAAM,CAAE,YAAa,GAAI,KAAM,CAAC,CAAE,EAEvD,MAAO,CACL,aAAc,EAAM,aAAe,IAAI,KAAK,EAC5C,MAAO,EAAM,MAAQ,CAAC,GAAG,IAAI,CAAC,KAAO,CACnC,IAAK,EAAE,KAAO,GACd,KAAM,EAAE,MAAQ,GAChB,KAAM,EAAE,MAAQ,GAChB,YAAa,EAAE,aAAe,GAC9B,SAAU,EAAE,UAAY,MACpB,EAAE,UAAY,OAAY,CAAE,QAAS,EAAE,OAAQ,EAAI,CAAC,CAC1D,EAAE,CACJ,EACA,MAAO,EAAG,CACV,OAAO,GAAI,EAAa,QAAS,gCAAiC,CAAC,CAAC,GCdxE,gBAAS,wBA0EF,SAAS,EAAc,CAAC,EAAuC,CACpE,IAAQ,UAAS,aAAY,YAAa,EACpC,EAAc,GAAiB,CAAU,EAE/C,SAAS,CAAI,CAAC,EAAe,EAAyB,CACpD,MAAO,CACL,MAAO,GAAc,EAAa,CAAK,EACvC,IAAK,GAAc,EAAa,CAAG,CACrC,EAGF,SAAS,CAAgB,CAAC,EAAuC,CAC/D,IAAI,EAA8C,KAClD,QAAW,KAAK,EAAU,CACxB,GAAI,EAAE,OAAS,QAAS,SACxB,GAAI,EAAE,IAAM,EAAW,SACvB,GAAI,CAAC,EAAE,MAAM,WAAW,GAAG,EAAG,SAC9B,GAAI,CAAC,GAAQ,EAAE,IAAM,EAAK,IACxB,EAAO,CAAE,MAAO,KAAK,EAAE,UAAW,IAAK,EAAE,GAAI,EAGjD,GAAI,CAAC,EAAM,OAEX,QAAW,KAAQ,EAAQ,KAAM,CAC/B,IAAM,EAAa,EAA4B,OAAS,EACxD,GAAI,IAAc,EAAW,SAC7B,GAAI,EAAY,EAAK,KAAO,EAAY,EACtC,OAIJ,OAAO,EAAK,MAGd,SAAS,CAAQ,CAAC,EAAmE,CACnF,GAAI,CAAC,EAAgB,OACrB,IAAM,EAAQ,EAAe,gBAAkB,EAC/C,OAAO,EAAW,MAAM,EAAM,MAAO,EAAM,GAAG,EAGhD,SAAS,CAAiB,CAAC,EAAoC,CAC7D,GAAI,CAAC,GAAc,EAAW,SAAW,EAAG,MAAO,CAAC,EACpD,OAAO,EAAW,IAAI,CAAC,IAAM,CAC3B,IAAM,EAAO,EAAE,WACf,GAAI,CAAC,EAAM,MAAO,CAAE,KAAM,SAAU,EACpC,GAAI,EAAK,OAAS,iBAAkB,CAClC,IAAM,EAAO,EAAK,QAAQ,MAAQ,EAAK,QAAQ,UAAU,MAAQ,UAC3D,GAAQ,EAAK,WAAa,CAAC,GAAG,IAAI,CAAC,IAAe,EAAW,MAAM,EAAE,MAAO,EAAE,GAAG,CAAC,EACxF,MAAO,CAAE,OAAM,UAAW,EAAK,OAAS,EAAI,EAAO,MAAU,EAE/D,GAAI,EAAK,OAAS,aAAc,MAAO,CAAE,KAAM,EAAK,MAAQ,SAAU,EACtE,MAAO,CAAE,KAAM,EAAW,MAAM,EAAK,MAAO,EAAK,GAAG,CAAE,EACvD,EAGH,SAAS,CAAY,CAAC,EAAwB,CAC5C,IAAM,EAAQ,EAAE,OAAS,sBAAwB,EAAE,UAAY,EAE/D,GAAI,GAAO,OAAS,cAAe,CAEjC,IAAM,EAAO,MADW,EAAM,UAAU,MAAQ,YAE1C,EAAU,EAAM,eAChB,EAAO,EAAU,EAAS,CAAO,EAAI,OACrC,EAAmB,CAAE,OAAM,WAAY,EAAM,EACnD,GAAI,EAAM,EAAM,KAAO,EACvB,OAAO,EAGT,GAAI,GAAO,OAAS,oBAAqB,CACvC,IAAmB,KAAb,EACc,MAAd,GAAQ,EACR,EAAe,GAAM,MAAQ,UAC7B,EAAU,GAAM,eAChB,EAAO,EAAU,EAAS,CAAO,EAAI,OACrC,EAAuB,EAAW,MAAM,EAAO,MAAO,EAAO,GAAG,EAChE,GAAQ,EAAkB,GAAM,YAAc,CAAC,CAAC,EAChD,EAAmB,CAAE,OAAM,WAAY,GAAM,cAAa,EAChE,GAAI,EAAM,EAAM,KAAO,EACvB,GAAI,GAAM,OAAS,EAAG,EAAM,WAAa,GACzC,OAAO,EAGT,IAAM,EAAe,GAAO,MAAQ,GAAO,SAAS,MAAQ,UACtD,EAAoB,CAAC,CAAE,GAAO,SAC9B,EAAU,GAAO,eACjB,EAAO,EAAU,EAAS,CAAO,EAAI,OACrC,EAAQ,EAAkB,GAAO,YAAc,CAAC,CAAC,EACjD,EAAmB,CAAE,OAAM,WAAY,CAAS,EACtD,GAAI,EAAM,EAAM,KAAO,EACvB,GAAI,EAAM,OAAS,EAAG,EAAM,WAAa,EACzC,OAAO,EAGT,SAAS,CAAgB,CAAC,EAAkB,EAA6B,CACvE,IAAM,EAAmB,CAAC,EAC1B,GAAI,GAAI,MAAO,EAAK,KAAK,OAAO,EAChC,GAAI,EAAK,OAAQ,EAAK,KAAK,QAAQ,EACnC,GAAI,EAAK,SAAU,EAAK,KAAK,UAAU,EACvC,GAAI,EAAK,SAAU,EAAK,KAAK,UAAU,EACvC,GAAI,EAAK,SAAU,EAAK,KAAK,UAAU,EACvC,GAAI,EAAK,QAAS,EAAK,KAAK,SAAS,EACrC,GAAI,EAAK,MAAO,EAAK,KAAK,OAAO,EACjC,IAAM,EAAM,EAAK,cACjB,GAAI,IAAQ,UAAW,EAAK,KAAK,SAAS,EACrC,QAAI,IAAQ,YAAa,EAAK,KAAK,WAAW,EAC9C,QAAI,IAAQ,SAAU,EAAK,KAAK,QAAQ,EAC7C,OAAO,EAGT,SAAS,CAAa,CAAC,EAA2B,CAChD,IAAM,EAAuB,CAAC,EAC9B,GAAI,EAAK,WAAY,CACnB,IAAM,EAAO,EAAW,MAAM,EAAK,WAAW,MAAO,EAAK,WAAW,GAAG,EACxE,EAAS,KAAK,CAAE,KAAM,UAAW,MAAK,CAAC,EAEzC,IAAM,EAAQ,EAAK,YAAc,CAAC,EAClC,QAAW,KAAQ,EAAO,CACxB,IAAM,EAAO,EAAK,YAAc,EAC1B,EAAO,EAAW,MAAM,EAAK,MAAO,EAAK,GAAG,EAClD,EAAS,KAAK,CAAE,KAAM,aAAc,MAAK,CAAC,EAE5C,OAAO,EAGT,SAAS,CAAiB,CAAC,EAA2B,CACpD,IAAM,EAAuB,CAAC,EAC9B,QAAW,KAAQ,EAAK,SAAW,CAAC,EAAI,CACtC,IAAM,EAAO,EAAI,YAAc,EACzB,EAAO,EAAW,MAAM,EAAK,MAAO,EAAK,GAAG,EAClD,EAAS,KAAK,CAAE,KAAM,UAAW,MAAK,CAAC,EAEzC,OAAO,EAGT,SAAS,CAAmB,CAAC,EAA2C,CACtE,IAAM,EAA6B,CAAC,EACpC,QAAW,KAAK,EACd,GAAI,EAAE,OAAS,mBAAoB,CACjC,IAAM,EAAe,EAAE,KAAK,MAAQ,UAC9B,EAAU,EAAE,MACZ,EAAkB,EAAE,MAAQ,SAC5B,EACJ,IAAY,cACR,cACA,IAAY,MACV,SACA,IAAY,MACV,SACA,SACJ,EAAO,EAAiB,EAAG,CAAO,EAClC,GAAU,GAAS,QAAU,CAAC,GAAG,IAAI,CAAY,EACjD,EAAa,EAAS,GAAS,UAAU,EACzC,EAAqB,CACzB,KAAM,SACN,OACA,KAAM,EAAK,EAAE,MAAO,EAAE,GAAG,EACzB,WAAY,GACZ,aACA,UAAW,EACX,WAAY,EAAO,OAAS,EAAI,EAAS,OACzC,YACF,EACA,EAAQ,KAAK,CAAC,EACT,QAAI,EAAE,OAAS,qBAAsB,CAC1C,IAAM,EAAe,EAAE,KAAK,MAAQ,UAC9B,EAAO,EAAiB,CAAC,EACzB,EAAqB,CACzB,KAAM,WACN,OACA,KAAM,EAAK,EAAE,MAAO,EAAE,GAAG,EACzB,WAAY,GACZ,UAAW,CACb,EACA,EAAQ,KAAK,CAAC,EAGlB,OAAO,EAGT,SAAS,CAAuB,CAAC,EAA2C,CAC1E,IAAM,EAA6B,CAAC,EACpC,QAAW,KAAK,EACd,GAAI,EAAE,OAAS,oBAAqB,CAClC,IAAM,EAAe,EAAE,KAAK,MAAQ,UAC9B,GAAU,EAAE,QAAU,CAAC,GAAG,IAAI,CAAY,EAC1C,EAAa,EAAS,EAAE,UAAU,EACxC,EAAQ,KAAK,CACX,KAAM,SACN,OACA,KAAM,EAAK,EAAE,MAAO,EAAE,GAAG,EACzB,WAAY,GACZ,UAAW,CAAC,EACZ,WAAY,SACZ,WAAY,EAAO,OAAS,EAAI,EAAS,OACzC,YACF,CAAC,EACI,QAAI,EAAE,OAAS,sBAAuB,CAC3C,IAAM,EAAe,EAAE,KAAK,MAAQ,UAC9B,EAAU,EAAS,EAAE,cAAc,EACnC,EAAqB,CACzB,KAAM,WACN,OACA,KAAM,EAAK,EAAE,MAAO,EAAE,GAAG,EACzB,WAAY,GACZ,UAAW,EAAE,SAAW,CAAC,UAAU,EAAI,CAAC,EACxC,WAAY,CACd,EACA,EAAQ,KAAK,CAAC,EAGlB,OAAO,EAGT,SAAS,CAAW,CAAC,EAAe,EAAiE,CACnG,IAAM,EAAe,EAAK,MAAQ,GAElC,GAAI,IAAS,sBAAuB,CAClC,IAAM,EAAe,EAAK,IAAI,MAAQ,UAChC,GAAU,EAAK,QAAU,CAAC,GAAG,IAAI,CAAY,EAC7C,EAAa,EAAS,EAAK,UAAU,EACrC,EAAO,EAAiB,EAAM,CAAI,EAClC,EAAQ,EAAkB,EAAK,YAAc,CAAC,CAAC,EAC/C,EACJ,EAAK,gBAAgB,QAAQ,IAAI,CAAC,IAAoC,EAAE,MAAM,IAAc,EAAE,OAAO,OAAO,GAAK,OAC7G,EAAuB,CAC3B,KAAM,WACN,OACA,KAAM,EAAK,EAAK,MAAO,EAAK,GAAG,EAC/B,aACA,UAAW,EACX,WAAY,EAAO,OAAS,EAAI,EAAS,OACzC,aACA,WAAY,EAAM,OAAS,EAAI,EAAQ,MACzC,EACA,GAAI,GAAkB,EAAe,OAAS,EAAG,EAAI,eAAiB,EACtE,OAAO,EAGT,GAAI,IAAS,oBAAsB,IAAS,kBAAmB,CAC7D,IAAM,EAAe,EAAK,IAAI,MAAQ,UAChC,EAAW,EAAc,CAAI,EAC7B,EAAU,EAAoB,EAAK,MAAM,MAAQ,CAAC,CAAC,EACnD,EAAQ,EAAkB,EAAK,YAAc,CAAC,CAAC,EAC/C,EAAO,EAAiB,EAAM,CAAI,EAClC,EACJ,EAAK,gBAAgB,QAAQ,IAAI,CAAC,IAAoC,EAAE,MAAM,IAAc,EAAE,OAAO,OAAO,GAAK,OAC7G,EAAuB,CAC3B,KAAM,QACN,OACA,KAAM,EAAK,EAAK,MAAO,EAAK,GAAG,EAC/B,aACA,UAAW,EACX,SAAU,EAAS,OAAS,EAAI,EAAW,OAC3C,QAAS,EAAQ,OAAS,EAAI,EAAU,OACxC,WAAY,EAAM,OAAS,EAAI,EAAQ,MACzC,EACA,GAAI,GAAkB,EAAe,OAAS,EAAG,EAAI,eAAiB,EACtE,OAAO,EAGT,GAAI,IAAS,sBAAuB,CAClC,IAAM,EAA6B,CAAC,EACpC,QAAW,KAAQ,EAAK,cAAgB,CAAC,EAAG,CAC1C,IAAgB,GAAV,EACY,KAAZ,GAAO,EAEb,GAAI,GAAI,OAAS,gBAAiB,CAChC,QAAW,KAAQ,EAAG,YAAc,CAAC,EAAG,CACtC,IAAM,EAAmB,EAAK,OAAO,MAAQ,EAAK,KAAK,MAAQ,UAC/D,EAAQ,KAAK,CACX,KAAM,WACN,KAAM,EACN,KAAM,EAAK,EAAK,OAAS,EAAK,MAAO,EAAK,KAAO,EAAK,GAAG,EACzD,aACA,UAAW,CAAC,CACd,CAAC,EAEH,SAGF,GAAI,GAAI,OAAS,eAAgB,CAC/B,QAAW,KAAQ,EAAG,UAAY,CAAC,EAAG,CACpC,GAAI,CAAC,GAAQ,EAAK,OAAS,aAAc,SACzC,IAAM,EAAmB,EAAK,MAAQ,UACtC,EAAQ,KAAK,CACX,KAAM,WACN,KAAM,EACN,KAAM,EAAK,EAAK,OAAS,EAAK,MAAO,EAAK,KAAO,EAAK,GAAG,EACzD,aACA,UAAW,CAAC,CACd,CAAC,EAEH,SAGF,IAAM,EAAe,GAAI,MAAQ,UAC7B,EAAmB,WACnB,EACA,EAEJ,GACE,GAAM,OAAS,sBACf,GAAM,OAAS,0BAEf,EAAO,WAEP,GADkB,EAAK,QAAU,CAAC,GACf,IAAI,CAAY,EACnC,EAAa,EAAS,EAAK,UAAU,EAEvC,IAAM,EAAmB,CAAC,EAC1B,EAAQ,KAAK,CACX,OACA,OACA,KAAM,EAAK,EAAK,MAAO,EAAK,GAAG,EAC/B,aACA,UAAW,EACX,WAAY,EACZ,YACF,CAAC,EAEH,GAAI,EAAQ,SAAW,EAAG,OAAO,KACjC,GAAI,EAAQ,SAAW,EAAG,OAAO,EAAQ,GACzC,OAAO,EAGT,GAAI,IAAS,yBAEX,MAAO,CACL,KAAM,OACN,KAHmB,EAAK,IAAI,MAAQ,UAIpC,KAAM,EAAK,EAAK,MAAO,EAAK,GAAG,EAC/B,aACA,UAAW,CAAC,CACd,EAGF,GAAI,IAAS,yBAA0B,CACrC,IAAM,EAAe,EAAK,IAAI,MAAQ,UAChC,EAAW,EAAkB,CAAI,EACjC,EAAU,EAAwB,EAAK,MAAM,MAAQ,CAAC,CAAC,EACvD,EACJ,EAAK,gBAAgB,QAAQ,IAAI,CAAC,IAAoC,EAAE,MAAM,IAAc,EAAE,OAAO,OAAO,GAAK,OAC7G,EAAuB,CAC3B,KAAM,YACN,OACA,KAAM,EAAK,EAAK,MAAO,EAAK,GAAG,EAC/B,aACA,UAAW,CAAC,EACZ,SAAU,EAAS,OAAS,EAAI,EAAW,OAC3C,QAAS,EAAQ,OAAS,EAAI,EAAU,MAC1C,EACA,GAAI,GAAkB,EAAe,OAAS,EAAG,EAAI,eAAiB,EACtE,OAAO,EAGT,GAAI,IAAS,oBAAqB,CAChC,IAAM,EAAe,EAAK,IAAI,MAAQ,UAChC,EAAO,EAAiB,CAAI,EAE5B,GAD0E,EAAK,MAAM,SAAW,CAAC,GACzD,IAAI,CAAC,KAAO,CACxD,KAAM,WACN,KAAM,EAAE,IAAI,MAAQ,EAAE,IAAI,OAAS,UACnC,KAAM,EAAK,EAAE,MAAO,EAAE,GAAG,EACzB,WAAY,GACZ,UAAW,CAAC,CACd,EAAE,EACF,MAAO,CACL,KAAM,OACN,OACA,KAAM,EAAK,EAAK,MAAO,EAAK,GAAG,EAC/B,aACA,UAAW,EACX,QAAS,EAAQ,OAAS,EAAI,EAAU,MAC1C,EAGF,OAAO,KAGT,IAAM,EAA4B,CAAC,EAEnC,QAAW,KAAQ,EAAQ,KAAM,CAC/B,IAAI,EAAkD,KAChD,EAAS,EACT,EAAe,OAAO,EAAO,OAAS,SAAW,EAAO,KAAO,GAErE,GAAI,IAAS,yBAA0B,CACrC,IAAM,EAAI,EAKV,GAAI,EAAE,aAEJ,GADA,EAAM,EAAY,EAAE,YAAwB,EAAI,EAC5C,GAAO,CAAC,MAAM,QAAQ,CAAG,EAC3B,EAAI,KAAO,EAAK,EAAE,MAAO,EAAE,GAAG,EACzB,QAAI,MAAM,QAAQ,CAAG,EAC1B,QAAW,KAAK,EAAK,EAAE,KAAO,EAAK,EAAE,MAAO,EAAE,GAAG,GAGhD,QAAI,IAAS,2BAA4B,CAC9C,IAAM,EAAI,EAKJ,EAAO,EAAE,YACf,GAAI,GAEF,GADA,EAAM,EAAY,EAA4B,EAAI,EAC9C,GAAO,CAAC,MAAM,QAAQ,CAAG,EAC3B,EAAI,KAAO,EAAK,IAAI,MAAQ,UAC5B,EAAI,WAAa,GACjB,EAAI,KAAO,EAAK,EAAE,MAAO,EAAE,GAAG,GAIlC,OAAM,EAAY,EAA4B,EAAK,EAGrD,IAAM,EAA0B,MAAM,QAAQ,CAAG,EAAI,EAAM,EAAM,CAAC,CAAG,EAAI,CAAC,EAC1E,QAAW,KAAK,EAAM,CACpB,IAAM,EAAa,EAA4B,OAAS,EAClD,EAAY,EAAiB,CAAS,EAC5C,GAAI,EAAW,CACb,IAAM,EAAc,GAAW,CAAS,EACxC,GAAI,CAAC,GAAM,CAAW,EAAG,EAAE,MAAQ,EAErC,EAAO,KAAK,CAAC,GAIjB,OAAO,ECrgBT,kBAAS,cAAS,cAAS,cAKpB,SAAS,EAAa,CAC3B,EACA,EACA,EACU,CACV,IAAM,EAA2B,CAAC,IAA+B,CAC/D,IAAM,EAAY,GAAQ,CAAQ,EAClC,GAAI,IAAc,GAChB,MAAO,CACL,EAAW,MACX,EAAW,YACX,EAAW,OACX,EAAW,aACX,EAAW,OACX,EAAW,YACb,EAEF,GAAI,IAAc,MAAO,MAAO,CAAC,EAAS,MAAM,EAAG,EAAE,EAAI,KAAK,EAC9D,GAAI,IAAc,OAAQ,MAAO,CAAC,EAAS,MAAM,EAAG,EAAE,EAAI,MAAM,EAChE,GAAI,IAAc,OAAQ,MAAO,CAAC,EAAS,MAAM,EAAG,EAAE,EAAI,MAAM,EAChE,MAAO,CAAC,CAAQ,GAGlB,GAAI,EAAW,WAAW,GAAG,EAAG,CAC9B,IAAM,EAAW,GAAQ,GAAQ,CAAe,EAAG,CAAU,EAC7D,OAAO,EAAyB,CAAQ,EAG1C,GAAI,EACF,QAAY,EAAS,KAAY,EAAc,MAAO,CACpD,GAAI,EAAQ,SAAW,EAAG,SAE1B,IAAM,EAAU,EAAQ,QAAQ,GAAG,EAEnC,GAAI,IAAY,IACd,GAAI,IAAe,EAAS,CAC1B,IAAM,EAAuB,CAAC,EAC9B,QAAW,KAAK,EACd,EAAW,KAAK,GAAG,EAAyB,GAAQ,EAAc,QAAS,CAAC,CAAC,CAAC,EAEhF,OAAO,GAEJ,KACL,IAAM,EAAS,EAAQ,MAAM,EAAG,CAAO,EACjC,EAAS,EAAQ,MAAM,EAAU,CAAC,EACxC,GACE,EAAW,WAAW,CAAM,IAC3B,IAAW,IAAM,EAAW,SAAS,CAAM,GAC5C,CACA,IAAM,EAAW,EAAW,MAC1B,EAAO,OACP,IAAW,GAAK,OAAY,EAAW,OAAS,EAAO,MACzD,EACM,EAAuB,CAAC,EAC9B,QAAW,KAAK,EACd,EAAW,KAAK,GAAG,EAAyB,GAAQ,EAAc,QAAS,EAAE,QAAQ,IAAK,CAAQ,CAAC,CAAC,CAAC,EAEvG,OAAO,IAMf,MAAO,CAAC,EAGH,SAAS,EAAc,CAC5B,EACA,EACA,EACA,EAIgB,GACc,CAC9B,IAAM,EAAM,IAAI,IACV,EAAQ,EAA6D,MAAQ,CAAC,EAEpF,QAAW,KAAQ,EAAM,CACvB,GAAI,EAAK,OAAS,oBAAqB,SAEvC,IAAM,EAAuB,EAAK,QAA2C,OAAU,GACjF,EAAa,EAAgB,EAAiB,EAAY,CAAa,EAC7E,GAAI,EAAW,SAAW,EAAG,SAC7B,IAAM,EAAW,EAAW,GAEtB,EAAc,EAAK,YAA6D,CAAC,EACvF,QAAW,KAAQ,EACjB,OAAQ,EAAK,UACN,kBACH,EAAI,IAAK,EAAK,MAA2B,KAAM,CAC7C,KAAM,EACN,aAAe,EAAK,SAA8B,IACpD,CAAC,EACD,UACG,yBACH,EAAI,IAAK,EAAK,MAA2B,KAAM,CAC7C,KAAM,EACN,aAAc,SAChB,CAAC,EACD,UACG,2BACH,EAAI,IAAK,EAAK,MAA2B,KAAM,CAC7C,KAAM,EACN,aAAc,GAChB,CAAC,EACD,OAKR,OAAO,ECnHT,IAAM,GAAY,IAAI,IAAI,CAAC,MAAO,QAAS,MAAO,OAAO,CAAC,EAUnD,SAAS,EAAK,CACnB,EACA,EACM,CACN,GAAI,CAAC,GAAQ,OAAO,IAAS,SAAU,OAEvC,GAAI,MAAM,QAAQ,CAAI,EAAG,CACvB,QAAW,KAAQ,EAAM,GAAM,EAAM,CAAQ,EAC7C,OAGF,IAAM,EAAS,EACf,EAAS,CAAM,EAEf,QAAW,KAAO,OAAO,KAAK,CAAM,EAAG,CACrC,GAAI,GAAU,IAAI,CAAG,EAAG,SACxB,IAAM,EAAQ,EAAO,GACrB,GAAI,GAAS,OAAO,IAAU,SAC5B,GAAM,EAAO,CAAQ,GAqEpB,SAAS,EAAqB,CAAC,EAA8B,CAClE,GAAI,CAAC,GAAQ,OAAO,IAAS,UAAY,MAAM,QAAQ,CAAI,EAAG,OAAO,KACrE,IAAM,EAAS,EACf,IACG,EAAO,OAAS,iBAAmB,EAAO,OAAS,YACpD,OAAO,EAAO,QAAU,SAExB,OAAO,EAAO,MAEhB,OAAO,KAGF,SAAS,CAAgB,CAAC,EAAqC,CACpE,GAAI,CAAC,GAAQ,OAAO,IAAS,UAAY,MAAM,QAAQ,CAAI,EAAG,OAAO,KACrE,IAAM,EAAO,EAEb,GAAI,EAAK,OAAS,aAAc,CAC9B,IAAM,EAAO,EAAK,KAClB,MAAO,CAAE,KAAM,EAAM,MAAO,CAAC,EAAG,KAAM,CAAK,EAG7C,GAAI,EAAK,OAAS,iBAChB,MAAO,CAAE,KAAM,OAAQ,MAAO,CAAC,EAAG,KAAM,MAAO,EAGjD,GAAI,EAAK,OAAS,QAChB,MAAO,CAAE,KAAM,QAAS,MAAO,CAAC,EAAG,KAAM,OAAQ,EAGnD,GAAI,EAAK,OAAS,mBAAoB,CACpC,IAAM,EAAkB,CAAC,EACrB,EAAmC,EAEvC,MAAO,EAAQ,OAAS,mBAAoB,CAC1C,IAAM,EAAO,EAAQ,SACrB,GAAI,CAAC,GAAQ,OAAO,EAAK,OAAS,SAAU,OAAO,KACnD,EAAM,QAAQ,EAAK,IAAI,EACvB,EAAU,EAAQ,OAGpB,IAAI,EACJ,GAAI,EAAQ,OAAS,aACnB,EAAO,EAAQ,KACV,QAAI,EAAQ,OAAS,iBAC1B,EAAO,OACF,QAAI,EAAQ,OAAS,QAC1B,EAAO,QAEP,YAAO,KAGT,IAAM,EAAO,CAAC,EAAM,GAAG,CAAK,EAAE,KAAK,GAAG,EACtC,MAAO,CAAE,OAAM,QAAO,MAAK,EAG7B,OAAO,KCpJF,SAAS,EAAc,CAC5B,EACA,EACA,EACA,EAIgB,GACA,CAChB,IAAM,EAA4B,CAAC,EAC7B,EAAQ,EAA6D,MAAQ,CAAC,EAEpF,QAAW,KAAQ,EAAM,CACvB,GAAI,EAAK,OAAS,oBAAqB,CACrC,IAAM,EAAuB,EAAK,QAA2C,OAAU,GACjF,EAAa,EAAgB,EAAU,EAAY,CAAa,EACtE,GAAI,EAAW,SAAW,EAAG,SAC7B,IAAM,EAAW,EAAW,GAEtB,EAAS,EAAK,aAAe,OAC7B,EAAc,EAAK,YAA6D,CAAC,EAEvF,GAAI,EAAW,SAAW,EAAG,CAE3B,IAAM,EAAgC,CAAC,EACvC,GAAI,EAAQ,EAAK,OAAS,GAC1B,EAAU,KAAK,CACb,KAAM,EAAS,kBAAoB,UACnC,YAAa,EACb,cAAe,KACf,YAAa,EACb,cAAe,QACX,OAAO,KAAK,CAAI,EAAE,OAAS,EAAI,CAAE,SAAU,KAAK,UAAU,CAAI,CAAE,EAAI,CAAC,CAC3E,CAAC,EAED,aAAW,KAAQ,EAAY,CAC7B,IAAM,EAAW,EAAK,KAChB,EAAa,GAAW,EAAK,aAA0B,OACvD,EAAgC,CAAC,EACvC,GAAI,EAAY,EAAK,OAAS,GAE9B,IAAI,EACA,EAEJ,GAAI,IAAa,yBACf,EAAgB,UAChB,EAAiB,EAAK,MAA2B,KAC5C,QAAI,IAAa,2BACtB,EAAgB,IAChB,EAAiB,EAAK,MAA2B,KACjD,EAAK,WAAa,YAGlB,OAAiB,EAAK,SAA8B,KACpD,EAAiB,EAAK,MAA2B,KAGnD,EAAU,KAAK,CACb,KAAM,EAAa,kBAAoB,UACvC,YAAa,EACb,gBACA,YAAa,EACb,mBACI,OAAO,KAAK,CAAI,EAAE,OAAS,EAAI,CAAE,SAAU,KAAK,UAAU,CAAI,CAAE,EAAI,CAAC,CAC3E,CAAC,EAGL,SAGF,GAAI,EAAK,OAAS,wBAA0B,EAAK,OAAQ,CACvD,IAAM,EAAuB,EAAK,QAA2C,OAAU,GACjF,EAAa,EAAgB,EAAU,EAAY,CAAa,EACtE,GAAI,EAAW,SAAW,EAAG,SAC7B,IAAM,EAAW,EAAW,GAEtB,EAAS,EAAK,aAAe,OAC7B,EAAgC,CAAE,WAAY,EAAK,EACzD,GAAI,EAAQ,EAAK,OAAS,GAC1B,EAAU,KAAK,CACb,KAAM,EAAS,kBAAoB,aACnC,YAAa,EACb,cAAe,KACf,YAAa,EACb,cAAe,KACf,SAAU,KAAK,UAAU,CAAI,CAC/B,CAAC,EACD,SAGF,GAAI,EAAK,OAAS,0BAA4B,EAAK,OAAQ,CACzD,IAAM,EAAuB,EAAK,QAA2C,OAAU,GACjF,EAAa,EAAgB,EAAU,EAAY,CAAa,EACtE,GAAI,EAAW,SAAW,EAAG,SAC7B,IAAM,EAAW,EAAW,GAEtB,EAAS,EAAK,aAAe,OAO7B,EAAgC,CAAE,WAAY,GAAM,YANlC,EAAK,YAA6D,CAAC,GACzD,IAAI,CAAC,KAAO,CAC5C,MAAQ,EAAE,MAA2B,KACrC,SAAW,EAAE,SAA8B,IAC7C,EAAE,CAEmE,EACrE,GAAI,EAAQ,EAAK,OAAS,GAE1B,EAAU,KAAK,CACb,KAAM,EAAS,kBAAoB,aACnC,YAAa,EACb,cAAe,KACf,YAAa,EACb,cAAe,KACf,SAAU,KAAK,UAAU,CAAI,CAC/B,CAAC,GAsBL,OAlBA,GAAM,EAAK,CAAC,IAAS,CACnB,GAAI,EAAK,OAAS,mBAAoB,OACtC,IAAM,EAAc,GAAsB,EAAK,MAAM,EACrD,GAAI,CAAC,EAAa,OAClB,IAAM,EAAa,EAAgB,EAAU,EAAa,CAAa,EACvE,GAAI,EAAW,SAAW,EAAG,OAC7B,IAAM,EAAW,EAAW,GAE5B,EAAU,KAAK,CACb,KAAM,UACN,YAAa,EACb,cAAe,KACf,YAAa,EACb,cAAe,KACf,SAAU,KAAK,UAAU,CAAE,UAAW,EAAK,CAAC,CAC9C,CAAC,EACF,EAEM,EC1IF,SAAS,EAAY,CAC1B,EACA,EACA,EACgB,CAChB,IAAM,EAA4B,CAAC,EAC7B,EAA0B,CAAC,EAC3B,EAAuB,CAAC,EAE9B,SAAS,CAAa,EAAkB,CACtC,GAAI,EAAc,OAAS,EAAG,OAAO,EAAc,EAAc,OAAS,IAAM,KAChF,OAAO,KAGT,SAAS,CAAa,CACpB,EAC2E,CAC3E,GAAI,CAAC,EAAI,OAAO,KAEhB,IAAM,EAAM,EAAU,IAAI,EAAG,IAAI,EAEjC,GAAI,EAAG,MAAM,SAAW,EAAG,CACzB,GAAI,EACF,MAAO,CAAE,YAAa,EAAI,KAAM,cAAe,EAAI,aAAc,WAAY,QAAS,EAExF,MAAO,CAAE,YAAa,EAAU,cAAe,EAAG,KAAM,WAAY,OAAQ,EACvE,KACL,GAAI,GAAO,EAAI,eAAiB,IAAK,CACnC,IAAM,EAAgB,EAAG,MAAM,EAAG,MAAM,OAAS,GACjD,MAAO,CAAE,YAAa,EAAI,KAAM,gBAAe,WAAY,WAAY,EAEzE,MAAO,CAAE,YAAa,EAAU,cAAe,EAAG,KAAM,WAAY,cAAe,GAIvF,SAAS,CAAI,CAAC,EAAqB,CACjC,GAAI,CAAC,GAAQ,OAAO,IAAS,SAAU,OAEvC,GAAI,MAAM,QAAQ,CAAI,EAAG,CACvB,QAAW,KAAQ,EAAM,EAAK,CAAI,EAClC,OAGF,IAAM,EAAS,EACT,EAAe,OAAO,EAAO,OAAS,SAAW,EAAO,KAAO,GAErE,GAAI,IAAS,oBAAsB,IAAS,kBAAmB,CAC7D,IAAM,EAAY,EACZ,EAAoB,EAAU,IAAI,MAAQ,iBAChD,EAAW,KAAK,CAAS,EACzB,EAAK,EAAU,IAAI,EACnB,EAAW,IAAI,EACf,OAGF,GAAI,IAAS,sBAAuB,CAClC,IAAM,EAAe,EACf,EAAe,EAAa,IAAI,MAAQ,YAC9C,EAAc,KAAK,CAAI,EACvB,EAAK,EAAa,IAAI,EACtB,EAAc,IAAI,EAClB,OAGF,GAAI,IAAS,sBAAyB,EAAwC,OAC3E,EAAwC,MAAM,OAAS,sBACvD,EAAwC,MAAM,OAAS,2BACvD,CACD,IAAM,EAAa,EACb,EAAe,EAAW,IAAI,MAAQ,YAC5C,EAAc,KAAK,CAAI,EACvB,EAAK,EAAW,MAAM,MAAQ,EAAW,IAAI,EAC7C,EAAc,IAAI,EAClB,OAGF,GAAI,IAAS,oBAAuB,EAA+B,MAAO,CACxE,IAAM,EAAS,EACT,EAAY,EAAW,EAAW,OAAS,IAAM,GACjD,EAAqB,EAAO,KAAK,MAAQ,YACzC,EAAW,EAAY,GAAG,KAAa,IAAe,EAC5D,EAAc,KAAK,CAAQ,EAC3B,EAAK,EAAO,OAAO,IAAI,EACvB,EAAc,IAAI,EAClB,OAGF,GAAI,IAAS,sBAAwB,IAAS,0BAA2B,CACvE,IAAM,EAAe,EAAc,EAC7B,EAAgB,EAAe,GAAG,gBAA6B,cACrE,EAAc,KAAK,CAAa,EAChC,EAAM,EAA8B,IAAI,EACxC,EAAc,IAAI,EAClB,OAGF,GAAI,IAAS,iBAAkB,CAC7B,IAAM,EAAO,EACP,EAAK,EAAiB,EAAK,MAAM,EACjC,EAAM,EAAc,CAAE,EAC5B,GAAI,EAAK,CACP,IAAM,EAAgB,EAAc,EAC9B,EAAgC,CAAC,EACvC,GAAI,IAAkB,KAAM,EAAK,MAAQ,SAEzC,EAAU,KAAK,CACb,KAAM,QACN,YAAa,EACb,gBACA,YAAa,EAAI,YACjB,cAAe,EAAI,iBACf,OAAO,KAAK,CAAI,EAAE,OAAS,EAAI,CAAE,SAAU,KAAK,UAAU,CAAI,CAAE,EAAI,CAAC,CAC3E,CAAC,EAEH,EAAK,EAAK,MAAM,EAChB,QAAW,KAAO,EAAK,WAAa,CAAC,EAAG,EAAK,CAAG,EAChD,OAGF,GAAI,IAAS,gBAAiB,CAC5B,IAAM,EAAW,EACX,EAAK,EAAiB,EAAS,MAAM,EACrC,EAAM,EAAc,CAAE,EAC5B,GAAI,EAAK,CACP,IAAM,EAAgB,EAAc,EAC9B,EAAgC,CAAE,MAAO,EAAK,EACpD,GAAI,IAAkB,KAAM,EAAK,MAAQ,SAEzC,EAAU,KAAK,CACb,KAAM,QACN,YAAa,EACb,gBACA,YAAa,EAAI,YACjB,cAAe,EAAI,cACnB,SAAU,KAAK,UAAU,CAAI,CAC/B,CAAC,EAEH,QAAW,KAAO,EAAS,WAAa,CAAC,EAAG,EAAK,CAAG,EACpD,OAGF,QAAW,KAAO,OAAO,KAAK,CAAM,EAAG,CACrC,GAAI,IAAQ,OAAS,IAAQ,SAAW,IAAQ,OAAS,IAAQ,QAAS,SAC1E,IAAM,EAAQ,EAAO,GACrB,GAAI,GAAS,OAAO,IAAU,SAC5B,EAAK,CAAK,GAMhB,OADA,EAAK,CAAG,EACD,ECvJF,SAAS,EAAe,CAC7B,EACA,EACA,EACgB,CAChB,IAAM,EAA4B,CAAC,EAsDnC,OApDA,GAAM,EAAK,CAAC,IAAS,CACnB,GAAI,EAAK,OAAS,yBAA0B,CAC1C,IAAM,EAA0B,EAAK,IAAsC,MAAS,qBAC9E,EAAc,EAAK,SAAqC,CAAC,EAC/D,QAAW,KAAQ,EAAY,CAC7B,IAAM,EAAQ,EAAkC,YAAc,EACxD,EAAK,EAAiB,CAAI,EAChC,GAAI,CAAC,EAAI,SACT,IAAM,EAAM,GAAmB,EAAI,EAAU,CAAS,EACtD,EAAU,KAAK,CACb,KAAM,UACN,YAAa,EACb,cAAe,KACZ,CACL,CAAC,EAEH,OAGF,GAAI,EAAK,OAAS,oBAAsB,EAAK,OAAS,kBAAmB,OAEzE,IAAM,EACF,EAAK,IAAsC,MAAS,iBAExD,GAAI,EAAK,WAAY,CACnB,IAAM,EAAK,EAAiB,EAAK,UAAU,EAC3C,GAAI,EAAI,CACN,IAAM,EAAM,GAAmB,EAAI,EAAU,CAAS,EACtD,EAAU,KAAK,CACb,KAAM,UACN,YAAa,EACb,cAAe,KACZ,CACL,CAAC,GAIL,IAAM,EAAS,EAAK,YAAwC,CAAC,EAC7D,QAAW,KAAQ,EAAO,CACxB,IAAM,EAAQ,EAAkC,YAAc,EACxD,EAAK,EAAiB,CAAI,EAChC,GAAI,CAAC,EAAI,SACT,IAAM,EAAM,GAAmB,EAAI,EAAU,CAAS,EACtD,EAAU,KAAK,CACb,KAAM,aACN,YAAa,EACb,cAAe,KACZ,CACL,CAAC,GAEJ,EAEM,EAGT,SAAS,EAAkB,CACzB,EACA,EACA,EACmE,CACnE,IAAM,EAAM,EAAU,IAAI,EAAG,IAAI,EAEjC,GAAI,EAAK,CACP,GAAI,EAAI,eAAiB,IAAK,CAC5B,IAAM,EAAgB,EAAG,MAAM,EAAG,MAAM,OAAS,IAAM,EAAG,KAC1D,MAAO,CACL,YAAa,EAAI,KACjB,gBACA,SAAU,KAAK,UAAU,CAAE,kBAAmB,EAAK,CAAC,CACtD,EAEF,MAAO,CACL,YAAa,EAAI,KACjB,cAAe,EAAG,MAAM,OAAS,EAAI,EAAG,KAAO,EAAI,YACrD,EAGF,MAAO,CACL,YAAa,EACb,cAAe,EAAG,KAClB,SAAU,KAAK,UAAU,CAAE,QAAS,EAAK,CAAC,CAC5C,ECpFK,SAAS,EAAgB,CAC9B,EACA,EACA,EACgB,CAChB,IAAM,EAAY,GAAe,EAAK,EAAU,CAAa,EAEvD,EAAU,GAAe,EAAK,EAAU,CAAa,EACrD,EAAQ,GAAa,EAAK,EAAU,CAAS,EAC7C,EAAW,GAAgB,EAAK,EAAU,CAAS,EAEzD,MAAO,CAAC,GAAG,EAAS,GAAG,EAAO,GAAG,CAAQ,ECnB3C,cAAS,YAAK,wBACd,mBAAS,oBACT,oBAAS,iBAAW,iBAAY,YAChC,kBAAS,WAAS,cAClB,kBAAS,gCACT,kBAAS,0HCLT,cAAS,qBACT,sBACE,WACA,aACA,UACA,YACA,iBACA,iBACA,YACA,iCAGK,IAAM,EAAQ,GACnB,QACA,CACE,QAAS,EAAK,SAAS,EAAE,QAAQ,EACjC,SAAU,EAAK,WAAW,EAAE,QAAQ,EACpC,QAAS,GAAK,UAAU,EAAE,QAAQ,EAClC,KAAM,EAAQ,MAAM,EAAE,QAAQ,EAC9B,YAAa,EAAK,cAAc,EAAE,QAAQ,EAC1C,UAAW,EAAK,YAAY,EAAE,QAAQ,EACtC,UAAW,EAAQ,YAAY,CACjC,EACA,CAAC,IAAU,CAAC,GAAW,CAAE,QAAS,CAAC,EAAM,QAAS,EAAM,QAAQ,CAAE,CAAC,CAAC,CACtE,EAEa,EAAU,GACrB,UACA,CACE,GAAI,EAAQ,IAAI,EAAE,WAAW,CAAE,cAAe,EAAK,CAAC,EACpD,QAAS,EAAK,SAAS,EAAE,QAAQ,EACjC,SAAU,EAAK,WAAW,EAAE,QAAQ,EACpC,KAAM,EAAK,MAAM,EAAE,QAAQ,EAC3B,KAAM,EAAK,MAAM,EAAE,QAAQ,EAC3B,UAAW,EAAQ,YAAY,EAAE,QAAQ,EACzC,YAAa,EAAQ,cAAc,EAAE,QAAQ,EAC7C,QAAS,EAAQ,UAAU,EAAE,QAAQ,EACrC,UAAW,EAAQ,YAAY,EAAE,QAAQ,EACzC,WAAY,EAAQ,aAAa,EAAE,QAAQ,EAAE,QAAQ,CAAC,EACtD,UAAW,EAAK,WAAW,EAC3B,YAAa,EAAK,aAAa,EAC/B,WAAY,EAAK,aAAa,EAC9B,YAAa,EAAK,cAAc,EAAE,QAAQ,EAC1C,UAAW,EAAK,YAAY,EAAE,QAAQ,CACxC,EACA,CAAC,IAAU,CACT,GAAM,0BAA0B,EAAE,GAAG,EAAM,QAAS,EAAM,QAAQ,EAClE,GAAM,0BAA0B,EAAE,GAAG,EAAM,QAAS,EAAM,IAAI,EAC9D,GAAM,0BAA0B,EAAE,GAAG,EAAM,QAAS,EAAM,IAAI,EAC9D,GAAM,yBAAyB,EAAE,GAAG,EAAM,QAAS,EAAM,WAAW,EACpE,GAAW,CACT,QAAS,CAAC,EAAM,QAAS,EAAM,QAAQ,EACvC,eAAgB,CAAC,EAAM,QAAS,EAAM,QAAQ,CAChD,CAAC,EAAE,SAAS,SAAS,CACvB,CACF,EAEa,EAAY,GACvB,YACA,CACE,GAAI,EAAQ,IAAI,EAAE,WAAW,CAAE,cAAe,EAAK,CAAC,EACpD,QAAS,EAAK,SAAS,EAAE,QAAQ,EACjC,KAAM,EAAK,MAAM,EAAE,QAAQ,EAC3B,YAAa,EAAK,eAAe,EAAE,QAAQ,EAC3C,cAAe,EAAK,iBAAiB,EACrC,YAAa,EAAK,eAAe,EAAE,QAAQ,EAC3C,cAAe,EAAK,iBAAiB,EACrC,SAAU,EAAK,WAAW,CAC5B,EACA,CAAC,IAAU,CACT,GAAM,mBAAmB,EAAE,GAAG,EAAM,QAAS,EAAM,WAAW,EAC9D,GAAM,mBAAmB,EAAE,GAAG,EAAM,QAAS,EAAM,WAAW,EAC9D,GAAM,oBAAoB,EAAE,GAAG,EAAM,QAAS,EAAM,IAAI,EACxD,GAAW,CACT,QAAS,CAAC,EAAM,QAAS,EAAM,WAAW,EAC1C,eAAgB,CAAC,EAAM,QAAS,EAAM,QAAQ,CAChD,CAAC,EAAE,SAAS,SAAS,EACrB,GAAW,CACT,QAAS,CAAC,EAAM,QAAS,EAAM,WAAW,EAC1C,eAAgB,CAAC,EAAM,QAAS,EAAM,QAAQ,CAChD,CAAC,EAAE,SAAS,SAAS,CACvB,CACF,EAEa,GAAe,GAC1B,gBACA,CACE,GAAI,EAAQ,IAAI,EAAE,WAAW,EAC7B,IAAK,EAAQ,KAAK,EAAE,QAAQ,EAC5B,UAAW,EAAK,YAAY,EAAE,QAAQ,EACtC,YAAa,EAAK,cAAc,EAAE,QAAQ,CAC5C,EACA,CAAC,IAAU,CAAC,GAAM,0BAA2B,KAAM,EAAM,QAAQ,CAAC,CACpE,ED/EO,MAAM,EAAa,CAChB,OAA0B,KAC1B,QAAmD,KAC1C,OACT,QAAU,EAElB,WAAW,CAAC,EAA2B,CACrC,KAAK,OAAS,GAAK,EAAK,YAAa,UAAW,YAAY,KAG1D,UAAS,EAAqC,CAChD,GAAI,CAAC,KAAK,QAAS,MAAU,MAAM,0CAA0C,EAC7E,OAAO,KAAK,QAGd,IAAI,EAA+B,CACjC,GAAI,CACF,GAAU,GAAQ,KAAK,MAAM,EAAG,CAAE,UAAW,EAAK,CAAC,EACnD,KAAK,OAAS,IAAI,GAAS,KAAK,MAAM,EAEtC,KAAK,OAAO,IAAI,2BAA2B,EAC3C,KAAK,OAAO,IAAI,0BAA0B,EAC1C,KAAK,OAAO,IAAI,4BAA4B,EAE5C,KAAK,QAAU,GAAQ,KAAK,OAAQ,CAAE,SAAO,CAAC,EAE9C,GAAQ,KAAK,QAAS,CACpB,iBAAkB,GAAK,YAAY,QAAS,YAAY,CAC1D,CAAC,EAID,IAAM,EAAY,KAAK,OACvB,GAAI,OAAO,EAAU,WAAgB,WAClC,EAAU,SAAyB,KAClC,KAAK,OACL,SACA,CAAC,EAAiB,IAA0B,CAC1C,GAAI,CACF,OAAO,IAAI,OAAO,CAAO,EAAE,KAAK,CAAK,EAAI,EAAI,EAC7C,KAAM,CACN,MAAO,IAGb,EAEF,MAAO,EAAG,CACV,GAAI,KAAK,kBAAkB,CAAC,GAAK,GAAW,KAAK,MAAM,EAAG,CACxD,KAAK,YAAY,EACjB,GAAW,KAAK,MAAM,EACtB,QAAW,IAAO,CAAC,OAAQ,MAAM,EAAG,CAClC,IAAM,EAAI,KAAK,OAAS,EACxB,GAAI,GAAW,CAAC,EAAG,GAAW,CAAC,EAEjC,IAAM,EAAc,KAAK,KAAK,EAC9B,GAAI,GAAM,CAAW,EACnB,OAAO,GAAI,EAAa,QAAS,iCAAiC,KAAK,SAAU,EAAY,IAAI,CAAC,EAEpG,OAAO,EAET,OAAO,GAAI,EAAa,QAAS,8BAA8B,KAAK,SAAU,CAAC,CAAC,GAIpF,KAAK,EAAS,CACZ,KAAK,YAAY,EACjB,KAAK,QAAU,KAGjB,WAAc,CAAC,EAAgC,CAC7C,IAAM,EAAK,KAAK,cAAc,EAE9B,GAAI,KAAK,UAAY,EAAG,CACtB,KAAK,UACL,GAAI,CACF,OAAO,EAAG,YAAY,IAAM,EAAG,IAAI,CAAC,EAAE,SACtC,CACA,KAAK,WAIT,IAAM,EAAK,MAAM,KAAK,YACtB,EAAG,IAAI,cAAc,IAAK,EAC1B,GAAI,CACF,IAAM,EAAS,EAAG,IAAI,EAEtB,OADA,EAAG,IAAI,sBAAsB,IAAK,EAC3B,EACP,MAAO,EAAK,CAGZ,MAFA,EAAG,IAAI,0BAA0B,IAAK,EACtC,EAAG,IAAI,sBAAsB,IAAK,EAC5B,SACN,CACA,KAAK,WAIT,oBAAuB,CAAC,EAAgB,CACtC,IAAM,EAAK,KAAK,cAAc,EAC9B,KAAK,UACL,EAAG,IAAI,iBAAiB,EACxB,GAAI,CACF,IAAM,EAAS,EAAG,EAElB,OADA,EAAG,IAAI,QAAQ,EACR,EACP,MAAO,EAAK,CAEZ,MADA,EAAG,IAAI,UAAU,EACX,SACN,CACA,KAAK,WAIT,KAAK,CAAC,EAAsB,CAC1B,IAAM,EAAM,KAAK,cAAc,EAAE,QAAQ,CAAG,EAAE,IAAI,EAClD,GAAI,CAAC,EAAK,OAAO,KACjB,OAAO,OAAO,OAAO,CAAG,EAAE,GAG5B,aAAa,EAAa,CAIxB,OAHa,KAAK,cAAc,EAC7B,MAAM,qDAAqD,EAC3D,IAAI,EACK,IAAI,CAAC,IAAM,EAAE,IAAI,EAG/B,WAAW,EAAsD,CAI/D,OAHY,KAAK,cAAc,EAC5B,QAAQ,0DAA0D,EAClE,IAAI,GACO,OAGhB,WAAW,CAAC,EAAmB,CAC7B,IAAM,EAAM,IAAI,KAAK,EAAE,YAAY,EACnC,KAAK,cAAc,EAChB,QAAQ,mFAAmF,EAC3F,IAAI,EAAK,EAAK,CAAG,EAGtB,YAAY,CAAC,EAAmB,CAC9B,IAAM,EAAM,IAAI,KAAK,EAAE,YAAY,EACnC,KAAK,cAAc,EAChB,QAAQ,8FAA8F,EACtG,IAAI,EAAK,EAAK,CAAG,EAGtB,UAAU,CAAC,EAAmB,CAC5B,IAAM,EAAM,IAAI,KAAK,EAAE,YAAY,EACnC,KAAK,cAAc,EAChB,QAAQ,oEAAoE,EAC5E,IAAI,EAAK,CAAG,EAGjB,WAAW,CAAC,EAAmB,CAC7B,KAAK,cAAc,EAChB,QAAQ,oDAAoD,EAC5D,IAAI,CAAG,EAGJ,aAAa,EAAa,CAChC,GAAI,CAAC,KAAK,OAAQ,MAAU,MAAM,0CAA0C,EAC5E,OAAO,KAAK,OAGN,WAAW,EAAS,CAC1B,GAAI,KAAK,OACP,KAAK,OAAO,MAAM,EAClB,KAAK,OAAS,KAIV,iBAAiB,CAAC,EAAuB,CAC/C,GAAI,EAAE,aAAe,OAAQ,MAAO,GACpC,IAAM,EAAM,EAAI,QAAQ,YAAY,EACpC,OACE,EAAI,SAAS,WAAW,GACxB,EAAI,SAAS,SAAS,GACtB,EAAI,SAAS,gBAAgB,GAC7B,EAAI,SAAS,gBAAgB,GAC7B,EAAI,SAAS,gBAAgB,EAGnC,CEpMA,aAAS,UAAI,qBA2BN,MAAM,EAAe,CACG,GAA7B,WAAW,CAAkB,EAAkB,CAAlB,UAE7B,OAAO,CAAC,EAAiB,EAAqC,CAC5D,OAAO,KAAK,GAAG,UACZ,OAAO,EACP,KAAK,CAAK,EACV,MAAM,GAAI,GAAG,EAAM,QAAS,CAAO,EAAG,GAAG,EAAM,SAAU,CAAQ,CAAC,CAAC,EACnE,IAAI,GAAK,KAGd,UAAU,CAAC,EAA0B,CACnC,KAAK,GAAG,UACL,OAAO,CAAK,EACZ,OAAO,CACN,QAAS,EAAO,QAChB,SAAU,EAAO,SACjB,QAAS,EAAO,QAChB,KAAM,EAAO,KACb,YAAa,EAAO,YACpB,UAAW,EAAO,UAClB,UAAW,EAAO,WAAa,IACjC,CAAC,EACA,mBAAmB,CAClB,OAAQ,CAAC,EAAM,QAAS,EAAM,QAAQ,EACtC,IAAK,CACH,QAAS,EAAO,QAChB,KAAM,EAAO,KACb,YAAa,EAAO,YACpB,UAAW,EAAO,UAClB,UAAW,EAAO,WAAa,IACjC,CACF,CAAC,EACA,IAAI,EAGT,WAAW,CAAC,EAA+B,CACzC,OAAO,KAAK,GAAG,UACZ,OAAO,EACP,KAAK,CAAK,EACV,MAAM,GAAG,EAAM,QAAS,CAAO,CAAC,EAChC,IAAI,EAGT,WAAW,CAAC,EAA0C,CACpD,IAAM,EAAO,KAAK,YAAY,CAAO,EAC/B,EAAM,IAAI,IAChB,QAAW,KAAK,EAAM,EAAI,IAAI,EAAE,SAAU,CAAC,EAC3C,OAAO,EAGT,UAAU,CAAC,EAAiB,EAAwB,CAClD,KAAK,GAAG,UACL,OAAO,CAAK,EACZ,MAAM,GAAI,GAAG,EAAM,QAAS,CAAO,EAAG,GAAG,EAAM,SAAU,CAAQ,CAAC,CAAC,EACnE,IAAI,EAEX,CCpFA,aAAS,SAAI,UAAK,YAAK,qBCAhB,SAAS,EAAgB,CAAC,EAAsB,CACrD,OAAO,EACJ,KAAK,EACL,MAAM,KAAK,EACX,IAAI,CAAC,IAAU,EAAM,KAAK,CAAC,EAC3B,OAAO,CAAC,IAAU,EAAM,OAAS,CAAC,EAClC,IAAI,CAAC,IAAU,IAAI,EAAM,WAAW,IAAK,IAAI,KAAK,EAClD,KAAK,GAAG,EDgCN,MAAM,EAAiB,CACC,GAA7B,WAAW,CAAkB,EAAkB,CAAlB,UAE7B,kBAAkB,CAChB,EACA,EACA,EACA,EACM,CAMN,GALA,KAAK,GAAG,UACL,OAAO,CAAO,EACd,MAAM,GAAI,EAAG,EAAQ,QAAS,CAAO,EAAG,EAAG,EAAQ,SAAU,CAAQ,CAAC,CAAC,EACvE,IAAI,EAEH,CAAC,EAAK,OAAQ,OAElB,IAAM,EAAM,IAAI,KAAK,EAAE,YAAY,EACnC,QAAW,KAAO,EAChB,KAAK,GAAG,UAAU,OAAO,CAAO,EAAE,OAAO,CACvC,UACA,WACA,KAAM,EAAI,MAAQ,UAClB,KAAM,EAAI,MAAQ,GAClB,UAAW,EAAI,WAAa,EAC5B,YAAa,EAAI,aAAe,EAChC,QAAS,EAAI,SAAW,EACxB,UAAW,EAAI,WAAa,EAC5B,WAAY,EAAI,YAAc,EAC9B,UAAW,EAAI,WAAa,KAC5B,YAAa,EAAI,aAAe,KAChC,WAAY,EAAI,YAAc,KAC9B,cACA,UAAW,EAAI,WAAa,CAC9B,CAAC,EAAE,IAAI,EAIX,cAAc,CAAC,EAAiB,EAAkC,CAChE,OAAO,KAAK,GAAG,UACZ,OAAO,EACP,KAAK,CAAO,EACZ,MAAM,GAAI,EAAG,EAAQ,QAAS,CAAO,EAAG,EAAG,EAAQ,SAAU,CAAQ,CAAC,CAAC,EACvE,IAAI,EAGT,YAAY,CAAC,EAAiB,EAAe,EAAsB,CAAC,EAAmB,CACrF,IAAM,EAAQ,EAAK,OAAS,GACtB,EAAW,GAAiB,CAAK,EAEvC,GAAI,CAAC,EAAU,MAAO,CAAC,EAevB,OAbc,KAAK,GAAG,UACnB,OAAO,EACP,KAAK,CAAO,EACZ,MACC,GACE,KAAM,EAAQ,gEAAgE,KAC9E,EAAG,EAAQ,QAAS,CAAO,EAC3B,EAAK,KAAO,EAAG,EAAQ,KAAM,EAAK,IAAI,EAAI,MAC5C,CACF,EACC,QAAQ,EAAQ,IAAI,EACpB,MAAM,CAAK,EAEC,IAAI,EAGrB,YAAY,CAAC,EAAiB,EAA8B,CAC1D,OAAO,KAAK,GAAG,UACZ,OAAO,EACP,KAAK,CAAO,EACZ,MAAM,GAAI,EAAG,EAAQ,QAAS,CAAO,EAAG,EAAG,EAAQ,KAAM,CAAI,CAAC,CAAC,EAC/D,QAAQ,EAAQ,IAAI,EACpB,IAAI,EAGT,QAAQ,CAAC,EAA8B,CACrC,IAAM,EAAM,KAAK,GAAG,UACjB,OAAO,CACN,YAAa,GAAM,EACnB,UAAW,oBAA6B,EAAQ,WAClD,CAAC,EACA,KAAK,CAAO,EACZ,MAAM,EAAG,EAAQ,QAAS,CAAO,CAAC,EAClC,IAAI,EACP,MAAO,CACL,YAAa,GAAK,aAAe,EACjC,UAAW,GAAK,WAAa,CAC/B,EAGF,gBAAgB,CAAC,EAAiB,EAAqC,CACrE,OAAO,KAAK,GAAG,UACZ,OAAO,EACP,KAAK,CAAO,EACZ,MAAM,GAAI,EAAG,EAAQ,QAAS,CAAO,EAAG,EAAG,EAAQ,YAAa,CAAW,CAAC,CAAC,EAC7E,IAAI,EAGT,iBAAiB,CAAC,EAAiB,EAAwB,CACzD,KAAK,GAAG,UACL,OAAO,CAAO,EACd,MAAM,GAAI,EAAG,EAAQ,QAAS,CAAO,EAAG,EAAG,EAAQ,SAAU,CAAQ,CAAC,CAAC,EACvE,IAAI,EAGT,aAAa,CAAC,EAUwB,CACpC,IAAM,EAAU,KAAK,GAAG,UACrB,OAAO,EACP,KAAK,CAAO,EACZ,MACC,GACE,EAAK,SACD,KAAM,EAAQ,gEAAgE,EAAK,YACnF,OACJ,EAAK,UAAY,EAAG,EAAQ,KAAM,EAAK,SAAS,EAAI,OACpD,EAAK,UAAY,OAAY,EAAG,EAAQ,QAAS,EAAK,OAAO,EAAI,OACjE,EAAK,KAAO,EAAG,EAAQ,KAAM,EAAK,IAAI,EAAI,OAC1C,EAAK,WAAa,OAAY,EAAG,EAAQ,SAAU,EAAK,QAAQ,EAAI,OACpE,EAAK,aAAe,OAChB,EAAG,EAAQ,WAAY,EAAK,WAAa,EAAI,CAAC,EAC9C,OACJ,EAAK,UACD,KAAM,EAAQ,2HAA2H,EAAK,aAC9I,MAEN,CACF,EACC,QAAQ,EAAQ,IAAI,EAEpB,MAAM,EAAK,MAAQ,KAAK,IAAI,EAAK,MAAQ,GAAI,IAAI,EAAI,EAAK,KAAK,EAC/D,IAAI,EAEP,GAAI,CAAC,EAAK,MAAO,OAAO,EAGxB,GAAI,CACF,IAAM,EAAU,IAAI,OAAO,EAAK,KAAK,EACrC,OAAO,EAAQ,OAAO,KAAK,EAAQ,KAAK,EAAE,IAAI,CAAC,EAAE,MAAM,EAAG,EAAK,KAAK,EACpE,KAAM,CACN,MAAO,CAAC,GAGd,CEhMA,aAAS,SAAI,YAAK,SAAQ,qBAcnB,MAAM,EAAmB,CACD,GAA7B,WAAW,CAAkB,EAAkB,CAAlB,UAE7B,oBAAoB,CAClB,EACA,EACA,EACM,CAMN,GALA,KAAK,GAAG,UACL,OAAO,CAAc,EACrB,MAAM,EAAI,EAAG,EAAe,QAAS,CAAO,EAAG,EAAG,EAAe,YAAa,CAAW,CAAC,CAAC,EAC3F,IAAI,EAEH,CAAC,EAAK,OAAQ,OAElB,QAAW,KAAO,EAChB,KAAK,GAAG,UAAU,OAAO,CAAc,EAAE,OAAO,CAC9C,UACA,KAAM,EAAI,MAAQ,UAClB,YAAa,EAAI,aAAe,EAChC,cAAe,EAAI,eAAiB,KACpC,YAAa,EAAI,aAAe,GAChC,cAAe,EAAI,eAAiB,KACpC,SAAU,EAAI,UAAY,IAC5B,CAAC,EAAE,IAAI,EAIX,WAAW,CAAC,EAAiB,EAAqB,EAA0C,CAC1F,GAAI,IAAkB,OACpB,OAAO,KAAK,GAAG,UACZ,OAAO,CACN,QAAS,EAAe,QACxB,KAAM,EAAe,KACrB,YAAa,EAAe,YAC5B,cAAe,EAAe,cAC9B,YAAa,EAAe,YAC5B,cAAe,EAAe,cAC9B,SAAU,EAAe,QAC3B,CAAC,EACA,KAAK,CAAc,EACnB,MACC,EACE,EAAG,EAAe,QAAS,CAAO,EAClC,EAAG,EAAe,YAAa,CAAW,EAC1C,GACE,EAAG,EAAe,cAAe,CAAa,EAC9C,GAAO,EAAe,aAAa,CACrC,CACF,CACF,EACC,IAAI,EAGT,OAAO,KAAK,GAAG,UACZ,OAAO,CACN,QAAS,EAAe,QACxB,KAAM,EAAe,KACrB,YAAa,EAAe,YAC5B,cAAe,EAAe,cAC9B,YAAa,EAAe,YAC5B,cAAe,EAAe,cAC9B,SAAU,EAAe,QAC3B,CAAC,EACA,KAAK,CAAc,EACnB,MACC,EACE,EAAG,EAAe,QAAS,CAAO,EAClC,EAAG,EAAe,YAAa,CAAW,CAC5C,CACF,EACC,IAAI,EAGT,WAAW,CAAC,EAAiB,EAAuC,CAClE,OAAO,KAAK,GAAG,UACZ,OAAO,CACN,QAAS,EAAe,QACxB,KAAM,EAAe,KACrB,YAAa,EAAe,YAC5B,cAAe,EAAe,cAC9B,YAAa,EAAe,YAC5B,cAAe,EAAe,cAC9B,SAAU,EAAe,QAC3B,CAAC,EACA,KAAK,CAAc,EACnB,MACC,EACE,EAAG,EAAe,QAAS,CAAO,EAClC,EAAG,EAAe,YAAa,CAAW,CAC5C,CACF,EACC,IAAI,EAGT,SAAS,CAAC,EAAiB,EAAgC,CACzD,OAAO,KAAK,GAAG,UACZ,OAAO,CACN,QAAS,EAAe,QACxB,KAAM,EAAe,KACrB,YAAa,EAAe,YAC5B,cAAe,EAAe,cAC9B,YAAa,EAAe,YAC5B,cAAe,EAAe,cAC9B,SAAU,EAAe,QAC3B,CAAC,EACA,KAAK,CAAc,EACnB,MACC,EACE,EAAG,EAAe,QAAS,CAAO,EAClC,EAAG,EAAe,KAAM,CAAI,CAC9B,CACF,EACC,IAAI,EAGT,mBAAmB,CAAC,EAAiB,EAA2B,CAC9D,KAAK,GAAG,UACL,OAAO,CAAc,EACrB,MAAM,EAAI,EAAG,EAAe,QAAS,CAAO,EAAG,EAAG,EAAe,YAAa,CAAW,CAAC,CAAC,EAC3F,IAAI,EAGT,eAAe,CAAC,EAQK,CACnB,OAAO,KAAK,GAAG,UACZ,OAAO,CACN,QAAS,EAAe,QACxB,KAAM,EAAe,KACrB,YAAa,EAAe,YAC5B,cAAe,EAAe,cAC9B,YAAa,EAAe,YAC5B,cAAe,EAAe,cAC9B,SAAU,EAAe,QAC3B,CAAC,EACA,KAAK,CAAc,EACnB,MACC,EACE,EAAK,UAAY,OAAY,EAAG,EAAe,QAAS,EAAK,OAAO,EAAI,OACxE,EAAK,cAAgB,OACjB,EAAG,EAAe,YAAa,EAAK,WAAW,EAC/C,OACJ,EAAK,gBAAkB,OACnB,EAAG,EAAe,cAAe,EAAK,aAAa,EACnD,OACJ,EAAK,cAAgB,OACjB,EAAG,EAAe,YAAa,EAAK,WAAW,EAC/C,OACJ,EAAK,gBAAkB,OACnB,EAAG,EAAe,cAAe,EAAK,aAAa,EACnD,OACJ,EAAK,OAAS,OAAY,EAAG,EAAe,KAAM,EAAK,IAAI,EAAI,MACjE,CACF,EACC,MAAM,EAAK,KAAK,EAChB,IAAI,EAGT,iBAAiB,CACf,EACA,EACA,EACA,EACA,EACM,CACN,IAAM,EAAY,IAAc,KAC5B,EACE,EAAG,EAAe,QAAS,CAAO,EAClC,EAAG,EAAe,YAAa,CAAO,EACtC,GAAO,EAAe,aAAa,CACrC,EACA,EACE,EAAG,EAAe,QAAS,CAAO,EAClC,EAAG,EAAe,YAAa,CAAO,EACtC,EAAG,EAAe,cAAe,CAAS,CAC5C,EAEJ,KAAK,GAAG,UACL,OAAO,CAAc,EACrB,IAAI,CAAE,YAAa,EAAS,cAAe,CAAU,CAAC,EACtD,MAAM,CAAS,EACf,IAAI,EAEX,CC5MA,cAAS,wBAKT,oBAAS,yBAIT,qBAWA,IAAM,GAA0C,CAC9C,aACA,gBACA,aACA,oBACF,EAEM,GAAoB,IAAI,IAAI,CAAC,eAAgB,eAAe,CAAC,EAEnE,SAAS,EAAa,CAAC,EAAuB,CAC5C,OAAO,EAAM,WAAW,KAAM,GAAG,EAGnC,SAAS,EAAY,CAAC,EAA8C,CAClE,GAAI,IAAS,SACX,MAAO,SAGT,GAAI,IAAS,SACX,MAAO,SAGT,MAAO,SAGF,MAAM,EAAe,CAC1B,GACA,GACA,GACA,GACA,GACA,GAEA,WAAW,CAAC,EAAyB,EAA2B,GAAiB,EAAiB,QAAS,CACzG,KAAK,GAAY,EAAQ,YACzB,KAAK,GAAe,CAAC,GAAG,GAAsB,GAAI,EAAQ,gBAAkB,CAAC,CAAE,EAC/E,KAAK,GAAc,IAAI,KACpB,EAAQ,YAAc,CAAC,MAAO,OAAQ,MAAM,GAAG,IAAI,CAAC,IACnD,EAAI,YAAY,CAClB,CACF,EACA,KAAK,GAAa,EAClB,KAAK,GAAU,OAGX,MAAK,CAAC,EAAiF,CAC3F,GAAI,CACF,KAAK,GAAgB,MAAM,KAAK,GAC9B,KAAK,GACL,CAAC,EAAO,IAAW,CACjB,GAAI,EAAO,CACT,KAAK,GAAQ,MAAM,EAAa,UAAW,iBAAkB,CAAK,CAAC,EACnE,OAGF,GAAI,CACF,QAAW,KAAY,EAAQ,CAC7B,IAAM,EAAe,GAAc,GAAK,SAAS,KAAK,GAAW,EAAS,IAAI,CAAC,EAE/E,GAAI,EAAa,WAAW,IAAI,EAC9B,SAGF,IAAM,EAAW,GAAK,SAAS,CAAY,EACrC,EAAY,GAAK,QAAQ,CAAY,EAAE,YAAY,EAGzD,GAAI,CAFiB,GAAkB,IAAI,CAAQ,GAE9B,CAAC,KAAK,GAAY,IAAI,CAAS,EAClD,SAGF,GAAI,EAAa,SAAS,OAAO,EAC/B,SAGF,EAAS,CACP,UAAW,GAAa,EAAS,IAAI,EACrC,SAAU,CACZ,CAAC,GAEH,MAAO,EAAe,CACtB,KAAK,GAAQ,MAAM,EAAa,UAAW,iBAAkB,CAAa,CAAC,IAG/E,CACE,OAAQ,KAAK,EACf,CACF,EACA,MAAO,EAAO,CACd,OAAO,GAAI,EAAa,UAAW,8BAA+B,CAAK,CAAC,QAItE,MAAK,EAAwC,CACjD,GAAI,CAAC,KAAK,GACR,OAGF,GAAI,CACF,MAAM,KAAK,GAAc,YAAY,EACrC,KAAK,GAAgB,OACrB,MAAO,EAAO,CACd,OAAO,GAAI,EAAa,UAAW,0BAA2B,CAAK,CAAC,GAG1E,CC7HA,qBACA,mBAAS,YAcT,IAAM,GAAoB,CAAC,qBAAsB,aAAc,gBAAiB,YAAY,EAE5F,eAAsB,EAAgB,CAAC,EAAiD,CACtF,IAAM,EAAgC,CAAC,EAEvC,cAAiB,KAAuB,GAAG,KAAK,kBAAmB,CACjE,IAAK,EACL,QAAS,EACX,CAAC,EAAG,CACF,IAAM,EAAa,GAAK,QAAQ,CAAmB,EAAE,WAAW,KAAM,GAAG,EACnE,EAAc,GAAK,KAAK,EAAa,CAAmB,EACxD,EAAU,MAAM,IAAI,KAAK,CAAW,EAAE,KAAK,EAE3C,EACJ,OAAO,GAAS,OAAS,UAAY,EAAQ,KAAK,OAAS,EACvD,EAAQ,KACR,GAAK,SAAS,IAAe,IAAM,EAAc,CAAU,EAEjE,EAAW,KAAK,CACd,IAAK,EACL,QAAS,CACX,CAAC,EAIH,OADA,EAAW,KAAK,CAAC,EAAM,IAAU,EAAM,IAAI,OAAS,EAAK,IAAI,MAAM,EAC5D,EAGF,SAAS,CAAkB,CAChC,EACA,EACA,EAAc,UACN,CACR,IAAM,EAAqB,EAAS,WAAW,KAAM,GAAG,EACxD,QAAW,KAAY,EAAY,CACjC,GAAI,EAAS,MAAQ,IACnB,OAAO,EAAS,QAGlB,GACE,IAAuB,EAAS,KAChC,EAAmB,WAAW,GAAG,EAAS,MAAM,EAEhD,OAAO,EAAS,QAIpB,OAAO,EC9DT,qBAOA,IAAM,EAAQ,IAAI,IAElB,eAAe,EAAU,CAAC,EAA6D,CACrF,IAAM,EAAO,IAAI,KAAK,CAAU,EAChC,GAAI,CAAE,MAAM,EAAK,OAAO,EACtB,OAAO,KAGT,IAAM,EAAS,MAAM,EAAK,KAAK,EAC/B,OAAO,OAAO,IAAW,UAAY,IAAW,KAAQ,EAAqC,KAG/F,eAAsB,EAAiB,CAAC,EAAoD,CAC1F,GAAI,EAAM,IAAI,CAAW,EACvB,OAAO,EAAM,IAAI,CAAW,GAAK,KAGnC,IAAM,EAAe,GAAK,KAAK,EAAa,eAAe,EAErD,EAAS,MAAM,GAAW,CAAY,EAC5C,GAAI,CAAC,EAEH,OADA,EAAM,IAAI,EAAa,IAAI,EACpB,KAGT,IAAM,EACJ,OAAO,EAAO,kBAAoB,UAAY,EAAO,kBAAoB,KACpE,EAAO,gBACR,KAEN,GAAI,CAAC,EAEH,OADA,EAAM,IAAI,EAAa,IAAI,EACpB,KAGT,IAAM,EAAa,OAAO,EAAgB,UAAY,SAAW,EAAgB,QAAU,KACrF,EACJ,OAAO,EAAgB,QAAU,UAAY,EAAgB,QAAU,KAClE,EAAgB,MACjB,KAEN,GAAI,CAAC,GAAc,CAAC,EAElB,OADA,EAAM,IAAI,EAAa,IAAI,EACpB,KAGT,IAAM,EAAkB,EAAa,GAAK,QAAQ,EAAa,CAAU,EAAI,EACvE,EAAQ,IAAI,IAElB,GAAI,EACF,QAAY,EAAS,KAAY,OAAO,QAAQ,CAAQ,EAAG,CACzD,GAAI,CAAC,MAAM,QAAQ,CAAO,EACxB,SAGF,IAAM,EAAoB,EAAQ,OAAO,CAAC,IAA2B,OAAO,IAAU,QAAQ,EAC9F,EAAM,IAAI,EAAS,CAAiB,EAIxC,IAAM,EAAwB,CAC5B,QAAS,EACT,OACF,EAGA,OADA,EAAM,IAAI,EAAa,CAAM,EACtB,EAGF,SAAS,EAAuB,CAAC,EAA4B,CAClE,GAAI,EAAa,CACf,EAAM,OAAO,CAAW,EACxB,OAGF,EAAM,MAAM,EClFd,qBAEO,SAAS,EAAc,CAAC,EAAqB,EAA8B,CAChF,OAAO,GAAK,SAAS,EAAa,CAAY,EAAE,WAAW,KAAM,GAAG,EAG/D,SAAS,EAAc,CAAC,EAAqB,EAA8B,CAChF,OAAO,GAAK,QAAQ,EAAa,CAAY,ECPxC,SAAS,CAAU,CAAC,EAAuB,CAChD,IAAM,EAAM,IAAI,KAAK,SAAS,CAAK,EAEnC,OADiB,OAAO,QAAQ,GAAI,OAAO,CAAG,CAAC,EAC/B,SAAS,EAAE,EAAE,SAAS,GAAI,GAAG,ECI/C,gBAAS,wBCPT,mBAAS,YACT,eAAS,cA2BT,eAAsB,EAAa,CAAC,EAA0D,CAC5F,IAAQ,cAAa,aAAY,iBAAgB,YAAa,EAExD,EAAc,EAAS,YAAY,EACnC,EAAY,IAAI,IAChB,EAA8B,CAAC,EAC/B,EAAgC,CAAC,EAEjC,EAAc,EAAe,IAAI,CAAC,IAAM,IAAI,IAAI,KAAK,CAAC,CAAC,EAE7D,cAAiB,KAAgB,GAAW,KAAK,OAAQ,CAAE,IAAK,CAAY,CAAC,EAAG,CAC9E,GAAI,CAAC,EAAW,KAAK,CAAC,IAAQ,EAAa,SAAS,CAAG,CAAC,EAAG,SAE3D,GAAI,EAAY,KAAK,CAAC,IAAM,EAAE,MAAM,CAAY,CAAC,EAAG,SAEpD,EAAU,IAAI,CAAY,EAE1B,IAAM,EAAU,GAAK,EAAa,CAAY,EACxC,EAAU,IAAI,KAAK,CAAO,GACxB,OAAM,aAAc,GAAY,EAElC,EAAW,EAAY,IAAI,CAAY,EAE7C,GAAI,CAAC,EAAU,CACb,IAAM,EAAO,MAAM,EAAQ,KAAK,EAC1B,EAAc,EAAW,CAAI,EACnC,EAAQ,KAAK,CAAE,SAAU,EAAc,cAAa,UAAS,MAAK,CAAC,EACnE,SAGF,GAAI,EAAS,UAAY,GAAW,EAAS,OAAS,EAAM,CAC1D,EAAU,KAAK,CAAE,SAAU,EAAc,YAAa,EAAS,YAAa,UAAS,MAAK,CAAC,EAC3F,SAGF,IAAM,EAAO,MAAM,EAAQ,KAAK,EAC1B,EAAc,EAAW,CAAI,EACnC,GAAI,IAAgB,EAAS,YAC3B,EAAU,KAAK,CAAE,SAAU,EAAc,cAAa,UAAS,MAAK,CAAC,EAErE,OAAQ,KAAK,CAAE,SAAU,EAAc,cAAa,UAAS,MAAK,CAAC,EAIvE,IAAM,EAAoB,CAAC,EAC3B,QAAW,KAAY,EAAY,KAAK,EACtC,GAAI,CAAC,EAAU,IAAI,CAAQ,EACzB,EAAQ,KAAK,CAAQ,EAIzB,MAAO,CAAE,UAAS,YAAW,SAAQ,ECxCvC,SAAS,EAAc,CAAC,EAAqC,CAC3D,GAAI,EAAI,OAAS,YAAc,EAAI,OAAS,SAAU,CACpD,IAAM,EAAa,EAAI,YAAY,QAAU,EACvC,EAAU,EAAI,UAAU,SAAS,OAAO,EAAI,EAAI,EACtD,MAAO,UAAU,WAAoB,IAEvC,OAAO,KAGT,SAAS,EAAe,CAAC,EAAqC,CAC5D,IAAM,EAAkC,CAAC,EAEzC,GAAI,EAAI,MAAO,EAAO,MAAQ,EAAI,MAElC,GAAI,EAAI,OAAS,YAAc,EAAI,OAAS,SAAU,CACpD,GAAI,EAAI,aAAe,OAAW,EAAO,WAAa,EAAI,WAC1D,GAAI,EAAI,aAAe,OAAW,EAAO,WAAa,EAAI,WAG5D,GAAI,EAAI,UAAU,OAAQ,EAAO,SAAW,EAAI,SAChD,GAAI,EAAI,YAAY,OAAQ,EAAO,WAAa,EAAI,WACpD,GAAI,EAAI,gBAAgB,OAAQ,EAAO,eAAiB,EAAI,eAC5D,GAAI,EAAI,WAAW,OAAQ,EAAO,UAAY,EAAI,UAClD,GAAI,EAAI,SAAS,OACf,EAAO,QAAU,EAAI,QAAQ,IAAI,CAAC,IAAM,CACtC,IAAM,EAAa,EAAE,UAAU,KAC7B,CAAC,IAAgB,IAAQ,WAAa,IAAQ,aAAe,IAAQ,QACvE,EACA,MAAO,CACL,KAAM,EAAE,KACR,KAAM,EAAE,YAAc,EAAE,KACxB,KAAM,EAAE,WACR,aACA,SAAU,EAAE,UAAU,SAAS,QAAQ,GAAK,OAC5C,WAAY,EAAE,UAAU,SAAS,UAAU,GAAK,MAClD,EACD,EAGH,OAAO,OAAO,KAAK,CAAM,EAAE,OAAS,EAAI,KAAK,UAAU,CAAM,EAAI,KAGnE,SAAS,EAAQ,CACf,EACA,EACA,EACA,EACA,EACa,CACb,IAAM,EAAY,GAAe,CAAG,EAC9B,EAAc,EAAW,GAAG,KAAQ,EAAI,QAAQ,GAAa,IAAI,EAEvE,MAAO,CACL,UACA,WACA,KAAM,EAAI,KACV,OACA,UAAW,EAAI,KAAK,MAAM,KAC1B,YAAa,EAAI,KAAK,MAAM,OAC5B,QAAS,EAAI,KAAK,IAAI,KACtB,UAAW,EAAI,KAAK,IAAI,OACxB,WAAY,EAAI,WAAa,EAAI,EACjC,YACA,cACA,WAAY,GAAgB,CAAG,EAC/B,cACA,UAAW,IAAI,KAAK,EAAE,YAAY,CACpC,EAGK,SAAS,EAAgB,CAAC,EAAqC,CACpE,IAAQ,SAAQ,UAAS,WAAU,cAAa,cAAe,EAEzD,EAAY,GAAe,CAAM,EACjC,EAAsB,CAAC,EAE7B,QAAW,KAAO,EAAW,CAC3B,EAAK,KAAK,GAAS,EAAK,EAAI,KAAM,EAAS,EAAU,CAAW,CAAC,EAEjE,QAAW,KAAU,EAAI,SAAW,CAAC,EACnC,EAAK,KAAK,GAAS,EAAQ,GAAG,EAAI,QAAQ,EAAO,OAAQ,EAAS,EAAU,CAAW,CAAC,EAI5F,EAAW,mBAAmB,EAAS,EAAU,EAAa,CAAI,EC3F7D,SAAS,EAAkB,CAAC,EAAyC,CAC1E,IAAQ,MAAK,UAAS,WAAU,eAAc,cAAa,iBAAkB,EAEvE,EAAc,GAAe,EAAa,CAAQ,EAClD,EAAe,GAAiB,EAAK,EAAa,CAAa,EAE/D,EAAwB,CAAC,EAE/B,QAAW,KAAO,EAAc,CAC9B,IAAM,EAAS,GAAe,EAAa,EAAI,WAAW,EAE1D,GAAI,EAAO,WAAW,IAAI,EAAG,SAE7B,IAAM,EAAS,GAAe,EAAa,EAAI,WAAW,EAE1D,EAAK,KAAK,CACR,UACA,KAAM,EAAI,KACV,YAAa,EACb,cAAe,EAAI,eAAiB,KACpC,YAAa,EACb,cAAe,EAAI,eAAiB,KACpC,SAAU,EAAI,UAAY,IAC5B,CAAC,EAIH,OADA,EAAa,qBAAqB,EAAS,EAAU,CAAI,EAClD,EAAK,OHzCP,IAAM,GAAsB,IAoE5B,MAAM,EAAiB,CACX,KACA,OAEA,UAAY,IAAI,IAEzB,aAAe,GAEf,cAAmC,CAAC,EAEpC,cAAsD,KAEtD,gBAA+C,KAE/C,iBAAmB,GAEnB,wBAAsG,CAAC,EAEvG,iBAEA,kBAA0C,KAElD,WAAW,CAAC,EAA+B,CACzC,KAAK,KAAO,EACZ,KAAK,OAAS,EAAK,QAAU,QAC7B,KAAK,iBAAmB,GAAkB,EAAK,WAAW,KAGxD,cAAa,EAAkC,CACjD,OAAO,KAAK,iBAGd,SAAS,EAAyB,CAChC,OAAO,KAAK,WAAW,OAAW,EAAI,EAGxC,gBAAgB,CAAC,EAAkD,CACjE,OAAO,KAAK,WAAW,EAAQ,EAAK,EAGtC,SAAS,CAAC,EAA+C,CAEvD,OADA,KAAK,UAAU,IAAI,CAAE,EACd,IAAM,KAAK,UAAU,OAAO,CAAE,EAGvC,kBAAkB,CAAC,EAA8B,CAC/C,GAAI,EAAM,SAAS,SAAS,eAAe,EAAG,CAC5C,GAAwB,KAAK,KAAK,WAAW,EAC7C,KAAK,iBAAmB,GAAkB,KAAK,KAAK,WAAW,EAC/D,KAAK,UAAU,EAAE,MAAM,CAAC,IAAQ,CAC9B,KAAK,OAAO,MAAM,6DAA8D,CAAG,EACpF,EACD,OAGF,GAAI,EAAM,SAAS,SAAS,cAAc,EAAG,CAC3C,IAAM,EAAW,KAAK,KAAK,oBAAsB,GACjD,KAAK,kBAAoB,EAAS,KAAK,KAAK,WAAW,EAAE,KAAK,CAAC,IAAM,CACnE,KAAK,KAAK,WAAa,EACxB,EAKH,GAFA,KAAK,cAAc,KAAK,CAAK,EAEzB,KAAK,gBAAkB,KACzB,KAAK,cAAgB,WAAW,IAAM,CACpC,KAAK,cAAgB,KACrB,KAAK,aAAa,GACjB,EAAmB,OAIpB,SAAQ,EAAkB,CAC9B,GAAI,KAAK,gBAAkB,KACzB,aAAa,KAAK,aAAa,EAC/B,KAAK,cAAgB,KAEvB,GAAI,KAAK,gBACP,MAAM,KAAK,gBAIP,UAAU,CAAC,EAAuC,EAA+C,CACvG,GAAI,KAAK,aAAc,CACrB,GAAI,EAEF,OADA,KAAK,iBAAmB,GACjB,IAAI,QAAqB,CAAC,EAAS,IAAW,CACnD,KAAK,wBAAwB,KAAK,CAAE,UAAS,QAAO,CAAC,EACtD,EAEH,OAAO,KAAK,gBAEd,KAAK,aAAe,GAEpB,IAAM,EAAO,KAAK,QAAQ,EAAQ,CAAc,EAC7C,KAAK,CAAC,IAAW,CAEhB,OADA,KAAK,cAAc,CAAM,EAClB,EACR,EACA,QAAQ,IAAM,CAGb,GAFA,KAAK,aAAe,GACpB,KAAK,gBAAkB,KACnB,KAAK,iBAAkB,CACzB,KAAK,iBAAmB,GACxB,IAAM,EAAU,KAAK,wBAAwB,OAAO,CAAC,EACrD,KAAK,WAAW,OAAW,EAAI,EAC5B,KAAK,CAAC,IAAW,CAChB,QAAW,KAAU,EAAS,EAAO,QAAQ,CAAM,EACpD,EACA,MAAM,CAAC,IAAU,CAChB,QAAW,KAAU,EAAS,EAAO,OAAO,CAAK,EAClD,EACE,QAAI,KAAK,cAAc,OAAS,EAAG,CACxC,IAAM,EAAU,KAAK,cAAc,OAAO,CAAC,EAC3C,KAAK,WAAW,EAAS,EAAK,EAAE,MAAM,CAAC,IACrC,KAAK,OAAO,MAAM,6CAA8C,CAAG,CACrE,GAEH,EAGH,OADA,KAAK,gBAAkB,EAChB,OAGK,QAAO,CAAC,EAAuC,EAA+C,CAC1G,IAAM,EAAQ,KAAK,IAAI,GACf,WAAU,aAAY,eAAc,gBAAiB,KAAK,KAElE,GAAI,KAAK,kBACP,MAAM,KAAK,kBACX,KAAK,kBAAoB,KAG3B,IAAI,EACA,EAEJ,GAAI,IAAW,OACb,EAAU,EACP,OAAO,CAAC,IAAM,EAAE,YAAc,UAAY,EAAE,YAAc,QAAQ,EAClE,IAAI,CAAC,KAAO,CACX,SAAU,EAAE,SACZ,YAAa,GACb,QAAS,EACT,KAAM,CACR,EAAE,EACJ,EAAU,EAAO,OAAO,CAAC,IAAM,EAAE,YAAc,QAAQ,EAAE,IAAI,CAAC,IAAM,EAAE,QAAQ,EACzE,KACL,IAAM,EAAc,IAAI,IACxB,QAAW,KAAY,KAAK,KAAK,WAC/B,QAAY,EAAK,KAAQ,EAAS,YAAY,EAAS,OAAO,EAC5D,EAAY,IAAI,EAAK,CAAG,EAG5B,IAAM,EAAS,MAAM,GAAc,CACjC,YAAa,KAAK,KAAK,YACvB,WAAY,KAAK,KAAK,WACtB,eAAgB,KAAK,KAAK,eAC1B,SAAU,CAAE,YAAa,IAAM,CAAY,CAC7C,CAAC,EACD,EAAU,EAAO,QACjB,EAAU,EAAO,QAGnB,IAAM,EAAiB,MAAM,KAAK,kBAAqB,OAEjD,EAAiB,IAAI,IAC3B,QAAW,KAAY,EAAS,CAC9B,IAAM,EAAU,EAAmB,EAAU,KAAK,KAAK,UAAU,EAC3D,EAAO,EAAW,eAAe,EAAS,CAAQ,EACxD,EAAe,IAAI,EAAU,CAAI,EAKnC,IAAM,EAAiB,IAAI,IACrB,EAAgB,IAAI,IAE1B,GAAI,EAEF,QAAW,KAAY,KAAK,KAAK,WAC/B,QAAW,KAAK,EAAS,YAAY,EAAS,OAAO,EACnD,QAAW,KAAO,EAAW,eAAe,EAAS,QAAS,EAAE,QAAQ,EACtE,EAAe,IAAI,GAAG,EAAI,aAAa,EAAI,OAAQ,CACjD,KAAM,EAAI,KAAM,SAAU,EAAI,SAAU,KAAM,EAAI,KAAM,YAAa,EAAI,WAC3E,CAAC,EAIF,KAEL,QAAW,KAAQ,EAAS,CAC1B,IAAM,EAAU,EAAmB,EAAK,SAAU,KAAK,KAAK,UAAU,EACtE,QAAW,KAAO,EAAW,eAAe,EAAS,EAAK,QAAQ,EAChE,EAAe,IAAI,GAAG,EAAI,aAAa,EAAI,OAAQ,CACjD,KAAM,EAAI,KAAM,SAAU,EAAI,SAAU,KAAM,EAAI,KAAM,YAAa,EAAI,WAC3E,CAAC,EAIL,SAAc,KAAS,EACrB,QAAW,KAAO,EAChB,EAAe,IAAI,GAAG,EAAI,aAAa,EAAI,OAAQ,CACjD,KAAM,EAAI,KAAM,SAAU,EAAI,SAAU,KAAM,EAAI,KAAM,YAAa,EAAI,WAC3E,CAAC,EAKP,IAAM,EAAiB,IAAM,CAC3B,QAAW,KAAY,EAAS,CAC9B,IAAM,EAAU,EAAmB,EAAU,KAAK,KAAK,UAAU,EACjE,EAAW,kBAAkB,EAAS,CAAQ,EAC9C,EAAa,oBAAoB,EAAS,CAAQ,EAClD,EAAS,WAAW,EAAS,CAAQ,IAInC,EAAiB,SAAoF,CACzG,IAAI,EAAU,EACV,EAAY,EACV,EAAwB,CAAC,EAC/B,QAAW,KAAQ,EACjB,GAAI,CACF,IAAM,EAAI,MAAM,KAAK,YAAY,EAAK,SAAU,EAAK,aAAe,OAAW,CAAa,EAC5F,GAAW,EAAE,YACb,GAAa,EAAE,SACf,MAAO,EAAK,CACZ,KAAK,OAAO,MAAM,sCAAsC,EAAK,YAAa,CAAG,EAC7E,EAAY,KAAK,EAAK,QAAQ,EAGlC,MAAO,CAAE,UAAS,YAAW,aAAY,GAGvC,EAAe,EACf,EAAiB,EACjB,EAA2B,CAAC,EAEhC,GAAI,EAAgB,CAClB,IAAQ,cAAa,cAAe,KAAK,MACjC,cAAe,KAAK,KACtB,EAAiB,MAAM,QAAQ,WACnC,EAAQ,IAAI,MAAO,IAAS,CAC1B,IAAM,EAAU,GAAe,EAAa,EAAK,QAAQ,EACnD,EAAU,IAAI,KAAK,CAAO,EAC1B,EAAO,MAAM,EAAQ,KAAK,EAC1B,EAAc,EAAK,aAAe,EAAW,CAAI,EACvD,MAAO,CAAE,SAAU,EAAK,SAAU,OAAM,cAAa,QAAS,EAAQ,aAAc,KAAM,EAAQ,IAAK,EACxG,CACH,EACM,EAAU,EACb,OAAO,CAAC,IAA2H,EAAE,SAAW,WAAW,EAC3J,IAAI,CAAC,IAAM,EAAE,KAAK,EACrB,QAAW,KAAK,EACd,GAAI,EAAE,SAAW,WACf,KAAK,OAAO,MAAM,8CAA+C,EAAE,MAAM,EAI7E,IAAM,EAAmE,CAAC,EAE1E,EAAa,YAAY,IAAM,CAC7B,QAAW,KAAY,EAAY,CACjC,IAAM,EAAe,EAAS,YAAY,EAAS,OAAO,EAC1D,QAAW,KAAK,EACd,EAAS,WAAW,EAAE,QAAS,EAAE,QAAQ,EAM7C,QAAW,KAAM,EAAS,CACxB,IAAM,EAAU,EAAmB,EAAG,SAAU,CAAU,EAC1D,EAAS,WAAW,CAClB,UACA,SAAU,EAAG,SACb,QAAS,EAAG,QACZ,KAAM,EAAG,KACT,YAAa,EAAG,YAChB,UAAW,IAAI,KAAK,EAAE,YAAY,EAClC,UAAW,EAAG,KAAK,MAAM;AAAA,CAAI,EAAE,MACjC,CAAC,EAIH,IAAM,EAAU,KAAK,KAAK,eAAiB,GAC3C,QAAW,KAAM,EAAS,CACxB,IAAM,EAAU,EAAmB,EAAG,SAAU,CAAU,EACpD,EAAc,EAAQ,GAAe,EAAa,EAAG,QAAQ,EAAG,EAAG,IAAI,EAC7E,GAAI,GAAM,CAAW,EAAG,MAAM,EAAY,KAC1C,IAAM,EAAS,EACf,EAAmB,KAAK,CAAE,SAAU,EAAG,SAAU,QAAO,CAAC,EACzD,GAAiB,CAAE,SAAQ,UAAS,SAAU,EAAG,SAAU,YAAa,EAAG,YAAa,YAAW,CAAC,EACpG,GAAkB,GAAmB,CACnC,IAAK,EAAO,QACZ,UACA,SAAU,EAAG,SACb,eACA,cACA,eACF,CAAC,EACD,GAAgB,EAAW,eAAe,EAAS,EAAG,QAAQ,EAAE,QAEnE,EAED,QAAW,KAAS,EAClB,EAAW,IAAI,EAAM,SAAU,EAAM,MAAM,EAExC,KACL,EAAe,EACf,IAAM,EAAS,MAAM,EAAe,EACpC,EAAe,EAAO,QACtB,EAAiB,EAAO,UACxB,EAAiB,EAAO,YAI1B,QAAW,KAAQ,EAAS,CAC1B,IAAM,EAAU,EAAmB,EAAK,SAAU,KAAK,KAAK,UAAU,EACtE,QAAW,KAAO,EAAW,eAAe,EAAS,EAAK,QAAQ,EAChE,EAAc,IAAI,GAAG,EAAI,aAAa,EAAI,OAAQ,CAChD,KAAM,EAAI,KAAM,SAAU,EAAI,SAAU,KAAM,EAAI,KAAM,YAAa,EAAI,WAC3E,CAAC,EAKL,IAAM,EAAgD,CAAE,MAAO,CAAC,EAAG,SAAU,CAAC,EAAG,QAAS,CAAC,CAAE,EAC7F,QAAY,EAAK,KAAU,EAAe,CACxC,IAAM,EAAS,EAAe,IAAI,CAAG,EACrC,GAAI,CAAC,EACH,EAAe,MAAM,KAAK,CAAE,KAAM,EAAM,KAAM,SAAU,EAAM,SAAU,KAAM,EAAM,IAAK,CAAC,EACrF,QAAI,EAAO,cAAgB,EAAM,YACtC,EAAe,SAAS,KAAK,CAAE,KAAM,EAAM,KAAM,SAAU,EAAM,SAAU,KAAM,EAAM,IAAK,CAAC,EAGjG,QAAY,EAAK,KAAW,EAC1B,GAAI,CAAC,EAAc,IAAI,CAAG,EACxB,EAAe,QAAQ,KAAK,CAAE,KAAM,EAAO,KAAM,SAAU,EAAO,SAAU,KAAM,EAAO,IAAK,CAAC,EAInG,GAAI,CAAC,EACH,QAAY,EAAS,KAAS,EAC5B,QAAW,KAAO,EAAM,CACtB,GAAI,CAAC,EAAI,YAAa,SACtB,IAAM,EAAa,EAAmB,EAAS,KAAK,KAAK,UAAU,EAC7D,EAAU,EAAW,iBAAiB,EAAY,EAAI,WAAW,EACvE,GAAI,EAAQ,SAAW,EAAG,CACxB,IAAM,EAAS,EAAQ,GACvB,EAAa,kBACX,EACA,EACA,EAAI,KACJ,EAAO,SACP,EAAO,IACT,GAMR,MAAO,CACL,aAAc,EAAQ,OACtB,aAAc,EAAQ,OACtB,eACA,iBACA,WAAY,KAAK,IAAI,EAAI,EACzB,aAAc,EAAQ,IAAI,CAAC,IAAM,EAAE,QAAQ,EAC3C,aAAc,CAAC,GAAG,CAAO,EACzB,YAAa,EACb,gBACF,OAGY,YAAW,CACvB,EACA,EACA,EACoD,CACpD,IAAQ,cAAa,cAAe,KAAK,MACjC,WAAU,aAAY,eAAc,cAAe,KAAK,KAE1D,EAAU,GAAe,EAAa,CAAQ,EAC9C,EAAU,IAAI,KAAK,CAAO,EAC1B,EAAO,MAAM,EAAQ,KAAK,EAC1B,EAAc,GAAa,EAAW,CAAI,EAE1C,EAAU,EAAmB,EAAU,CAAU,EAGjD,GADU,KAAK,KAAK,eAAiB,IACf,EAAS,CAAI,EACzC,GAAI,GAAM,CAAW,EAAG,MAAM,EAAY,KAC1C,IAAM,EAAS,EACf,EAAW,IAAI,EAAU,CAAM,EAE/B,EAAS,WAAW,CAClB,UACA,WACA,QAAS,EAAQ,aACjB,KAAM,EAAQ,KACd,cACA,UAAW,IAAI,KAAK,EAAE,YAAY,EAClC,UAAW,EAAK,MAAM;AAAA,CAAI,EAAE,MAC9B,CAAC,EAED,GAAiB,CAAE,SAAQ,UAAS,WAAU,cAAa,YAAW,CAAC,EAEvE,IAAM,EAAW,GAAmB,CAClC,IAAK,EAAO,QACZ,UACA,WACA,eACA,cACA,eACF,CAAC,EAGD,MAAO,CAAE,YADW,EAAW,eAAe,EAAS,CAAQ,EAAE,OAC3C,UAAS,EAGzB,aAAa,CAAC,EAA2B,CAC/C,QAAW,KAAM,KAAK,UACpB,GAAI,CACF,EAAG,CAAM,EACT,MAAO,EAAK,CACZ,KAAK,OAAO,MAAM,+CAAgD,CAAG,GAKnE,YAAY,EAAS,CAC3B,GAAI,KAAK,aACP,OAEF,GAAI,KAAK,cAAc,OAAS,EAAG,CACjC,IAAM,EAAS,KAAK,cAAc,OAAO,CAAC,EAC1C,KAAK,WAAW,EAAQ,EAAK,EAAE,MAAM,CAAC,IACpC,KAAK,OAAO,MAAM,oDAAqD,CAAG,CAC5E,GAGN,CI1fA,SAAS,EAAc,CAAC,EAAsB,CAC5C,GAAI,CAEF,OADA,QAAQ,KAAK,EAAK,CAAC,EACZ,GACP,MAAO,EAAO,CACd,GAAI,OAAO,IAAU,UAAY,GAAS,SAAU,EAClD,OAAQ,EAA4B,OAAS,QAG/C,MAAO,IAIX,SAAS,EAAS,CAAC,EAAuB,CACxC,IAAM,EAAK,IAAI,KAAK,CAAK,EAAE,QAAQ,EACnC,OAAO,OAAO,MAAM,CAAE,EAAI,EAAI,EAGzB,SAAS,EAAkB,CAChC,EACA,EACA,EAA0B,CAAC,EACd,CACb,IAAM,EAAM,EAAQ,KAAO,KAAK,IAC1B,EAAU,EAAQ,SAAW,GAC7B,EAAoB,EAAQ,mBAAqB,GAEvD,OAAO,EAAG,qBAAqB,IAAM,CACnC,IAAM,EAAQ,EAAG,YAAY,EAC7B,GAAI,CAAC,EAEH,OADA,EAAG,YAAY,CAAG,EACX,QAGT,IAAM,EAAsB,KAAK,OAAO,EAAI,EAAI,GAAU,EAAM,YAAY,GAAK,IAAI,EACrF,GAAI,EAAQ,EAAM,GAAG,GAAK,EAAsB,EAC9C,MAAO,SAIT,OADA,EAAG,aAAa,CAAG,EACZ,QACR,EAGI,SAAS,EAAkB,CAAC,EAAuB,EAAmB,CAC3E,EAAG,YAAY,CAAG,EAGb,SAAS,EAAe,CAAC,EAAuB,EAAmB,CACxE,EAAG,WAAW,CAAG,ECSZ,SAAS,EAAY,CAAC,EAIJ,CACvB,IAAQ,aAAY,UAAS,SAAU,EACjC,EAAmB,EAAM,SAAW,EACpC,EAAQ,EAAM,OAAS,IAEvB,EAAoD,CACxD,KAAM,EAAM,KACZ,SAAU,EAAM,SAChB,WAAY,EAAM,WAClB,QAAS,EACT,OACF,EAEA,GAAI,EAAM,KACR,GAAI,EAAM,MACR,EAAK,UAAY,EAAM,KAClB,KACL,IAAM,EAAW,GAAiB,EAAM,IAAI,EAC5C,GAAI,EAAU,EAAK,SAAW,EAIlC,GAAI,EAAM,UAAW,EAAK,UAAY,EAAM,UAC5C,GAAI,EAAM,MAAO,EAAK,MAAQ,EAAM,MAIpC,OAFgB,EAAW,cAAc,CAAI,EAE9B,IAAI,MAAM,CACvB,GAAI,EAAE,GACN,SAAU,EAAE,SACZ,KAAM,EAAE,KACR,KAAM,EAAE,KACR,KAAM,CACJ,MAAO,CAAE,KAAM,EAAE,UAAW,OAAQ,EAAE,WAAY,EAClD,IAAK,CAAE,KAAM,EAAE,QAAS,OAAQ,EAAE,SAAU,CAC9C,EACA,WAAY,EAAE,aAAe,EAC7B,UAAW,EAAE,UACb,YAAa,EAAE,YACf,OAAQ,EAAE,YAAc,IAAM,CAC5B,GAAI,CAAE,OAAO,KAAK,MAAM,EAAE,UAAW,EACrC,KAAM,CAAE,MAAO,CAAC,KACf,EAAI,CAAC,CACV,EAAE,ECpFG,SAAS,EAAc,CAAC,EAIZ,CACjB,IAAQ,eAAc,UAAS,SAAU,EACnC,EAAmB,EAAM,SAAW,EACpC,EAAQ,EAAM,OAAS,IAY7B,OAVgB,EAAa,gBAAgB,CAC3C,YAAa,EAAM,YACnB,cAAe,EAAM,cACrB,YAAa,EAAM,YACnB,cAAe,EAAM,cACrB,KAAM,EAAM,KACZ,QAAS,EACT,OACF,CAAC,EAEc,IAAI,KAAK,CACtB,IAAI,EACJ,GAAI,EAAE,SACJ,GAAI,CACF,EAAO,KAAK,MAAM,EAAE,QAAQ,EAC5B,KAAM,CACN,QAAQ,MAAM,uCAAwC,EAAE,QAAQ,EAGpE,MAAO,CACL,KAAM,EAAE,KACR,YAAa,EAAE,YACf,cAAe,EAAE,cACjB,YAAa,EAAE,YACf,cAAe,EAAE,cACjB,SAAU,EAAE,UAAY,OACxB,MACF,EACD,EC3DI,MAAM,EAAgB,CAKR,QAJX,cAAgB,IAAI,IACpB,qBAAuB,IAAI,IAEnC,WAAW,CACQ,EAIjB,CAJiB,eAWnB,KAAK,EAAS,CACZ,KAAK,cAAgB,IAAI,IACzB,KAAK,qBAAuB,IAAI,IAEhC,IAAM,EAAY,CAChB,GAAG,KAAK,QAAQ,aAAa,UAAU,KAAK,QAAQ,QAAS,SAAS,EACtE,GAAG,KAAK,QAAQ,aAAa,UAAU,KAAK,QAAQ,QAAS,iBAAiB,EAC9E,GAAG,KAAK,QAAQ,aAAa,UAAU,KAAK,QAAQ,QAAS,YAAY,CAC3E,EAEA,QAAW,KAAO,EAAW,CAC3B,IAAQ,cAAa,eAAgB,EAErC,GAAI,CAAC,KAAK,cAAc,IAAI,CAAW,EACrC,KAAK,cAAc,IAAI,EAAa,IAAI,GAAK,EAK/C,GAHA,KAAK,cAAc,IAAI,CAAW,EAAG,IAAI,CAAW,EAGhD,CAAC,KAAK,cAAc,IAAI,CAAW,EACrC,KAAK,cAAc,IAAI,EAAa,IAAI,GAAK,EAG/C,GAAI,CAAC,KAAK,qBAAqB,IAAI,CAAW,EAC5C,KAAK,qBAAqB,IAAI,EAAa,IAAI,GAAK,EAEtD,KAAK,qBAAqB,IAAI,CAAW,EAAG,IAAI,CAAW,GAS/D,eAAe,CAAC,EAA4B,CAC1C,OAAO,MAAM,KAAK,KAAK,cAAc,IAAI,CAAQ,GAAK,CAAC,CAAC,EAQ1D,aAAa,CAAC,EAA4B,CACxC,OAAO,MAAM,KAAK,KAAK,qBAAqB,IAAI,CAAQ,GAAK,CAAC,CAAC,EASjE,uBAAuB,CAAC,EAA4B,CAClD,IAAM,EAAU,IAAI,IACd,EAAkB,CAAC,CAAQ,EAEjC,MAAO,EAAM,OAAS,EAAG,CACvB,IAAM,EAAU,EAAM,MAAM,EAC5B,QAAW,KAAa,KAAK,qBAAqB,IAAI,CAAO,GAAK,CAAC,EACjE,GAAI,CAAC,EAAQ,IAAI,CAAS,EACxB,EAAQ,IAAI,CAAS,EACrB,EAAM,KAAK,CAAS,EAK1B,OAAO,MAAM,KAAK,CAAO,EAU3B,QAAQ,EAAY,CAClB,IAAM,EAAU,IAAI,IACd,EAAS,IAAI,IAEnB,QAAW,KAAa,KAAK,cAAc,KAAK,EAAG,CACjD,GAAI,EAAQ,IAAI,CAAS,EAAG,SAE5B,IAAM,EAAmD,CAAC,CAAE,KAAM,EAAW,QAAS,EAAM,CAAC,EAE7F,MAAO,EAAM,OAAS,EAAG,CACvB,IAAM,EAAU,EAAM,IAAI,EAE1B,GAAI,EAAQ,QAAS,CACnB,EAAO,OAAO,EAAQ,IAAI,EAC1B,SAGF,GAAI,EAAO,IAAI,EAAQ,IAAI,EACzB,MAAO,GAGT,GAAI,EAAQ,IAAI,EAAQ,IAAI,EAC1B,SAGF,EAAQ,IAAI,EAAQ,IAAI,EACxB,EAAO,IAAI,EAAQ,IAAI,EACvB,EAAM,KAAK,CAAE,KAAM,EAAQ,KAAM,QAAS,EAAK,CAAC,EAEhD,QAAW,KAAY,KAAK,cAAc,IAAI,EAAQ,IAAI,GAAK,CAAC,EAAG,CACjE,GAAI,EAAO,IAAI,CAAQ,EACrB,MAAO,GAET,GAAI,CAAC,EAAQ,IAAI,CAAQ,EACvB,EAAM,KAAK,CAAE,KAAM,EAAU,QAAS,EAAM,CAAC,IAMrD,MAAO,GAYT,mBAAmB,CAAC,EAAkC,CACpD,IAAM,EAAc,IAAI,IAExB,QAAW,KAAQ,EACjB,QAAW,KAAO,KAAK,wBAAwB,CAAI,EACjD,EAAY,IAAI,CAAG,EAIvB,OAAO,MAAM,KAAK,CAAW,EAW/B,gBAAgB,EAA0B,CACxC,IAAM,EAAS,IAAI,IACnB,QAAY,EAAM,KAAU,KAAK,cAC/B,EAAO,IAAI,EAAM,MAAM,KAAK,CAAK,CAAC,EAEpC,OAAO,EAWT,yBAAyB,CAAC,EAA4B,CACpD,IAAM,EAAU,IAAI,IACd,EAAkB,CAAC,CAAQ,EAEjC,MAAO,EAAM,OAAS,EAAG,CACvB,IAAM,EAAU,EAAM,MAAM,EAC5B,QAAW,KAAO,KAAK,cAAc,IAAI,CAAO,GAAK,CAAC,EACpD,GAAI,CAAC,EAAQ,IAAI,CAAG,EAClB,EAAQ,IAAI,CAAG,EACf,EAAM,KAAK,CAAG,EAKpB,OAAO,MAAM,KAAK,CAAO,EAkB3B,aAAa,CAAC,EAA8C,CAC1D,IAAM,EAAY,GAAS,WAAa,IAExC,GAAI,GAAa,EAAG,MAAO,CAAC,EAG5B,IAAM,EAAY,IAAI,IACtB,QAAY,EAAM,KAAU,KAAK,cAC/B,EAAU,IAAI,EAAM,MAAM,KAAK,CAAK,CAAC,EAGvC,OAAO,GAAa,EAAW,CAAS,EAE5C,CAIA,IAAM,GAAiB,CAAC,EAAW,IAAsB,EAAE,cAAc,CAAC,EAM1E,SAAS,EAAc,CAAC,EAAwC,CAC9D,IAAM,EACJ,EAAM,OAAS,GAAK,EAAM,KAAO,EAAM,EAAM,OAAS,GAClD,EAAM,MAAM,EAAG,EAAE,EACjB,CAAC,GAAG,CAAK,EAEf,GAAI,EAAO,SAAW,EAAG,MAAO,CAAC,EAEjC,IAAI,EAAO,EACX,QAAS,EAAI,EAAG,EAAI,EAAO,OAAQ,IAAK,CACtC,IAAM,EAAU,EAAO,MAAM,CAAC,EAAE,OAAO,EAAO,MAAM,EAAG,CAAC,CAAC,EACzD,GAAI,EAAQ,KAAK,IAAI,EAAI,EAAK,KAAK,IAAI,EACrC,EAAO,EAIX,MAAO,CAAC,GAAG,CAAI,EAOjB,SAAS,EAAe,CACtB,EACA,EACA,EACS,CACT,IAAM,EAAa,GAAe,CAAI,EACtC,GAAI,EAAW,SAAW,EAAG,MAAO,GAEpC,IAAM,EAAM,EAAW,KAAK,IAAI,EAChC,GAAI,EAAU,IAAI,CAAG,EAAG,MAAO,GAI/B,OAFA,EAAU,IAAI,CAAG,EACjB,EAAO,KAAK,CAAU,EACf,GAUT,SAAS,EAAS,CAAC,EAAsD,CACvE,IAAI,EAAQ,EACN,EAAkB,CAAC,EACnB,EAAU,IAAI,IACd,EAAU,IAAI,IACd,EAAW,IAAI,IACf,EAAyB,CAAC,EAE1B,EAAgB,CAAC,IAAuB,CAC5C,EAAQ,IAAI,EAAM,CAAK,EACvB,EAAS,IAAI,EAAM,CAAK,EACxB,GAAS,EAET,EAAM,KAAK,CAAI,EACf,EAAQ,IAAI,CAAI,EAEhB,QAAW,KAAQ,EAAM,IAAI,CAAI,GAAK,CAAC,EACrC,GAAI,CAAC,EAAQ,IAAI,CAAI,EACnB,EAAc,CAAI,EAClB,EAAS,IAAI,EAAM,KAAK,IAAI,EAAS,IAAI,CAAI,GAAK,EAAG,EAAS,IAAI,CAAI,GAAK,CAAC,CAAC,EACxE,QAAI,EAAQ,IAAI,CAAI,EACzB,EAAS,IAAI,EAAM,KAAK,IAAI,EAAS,IAAI,CAAI,GAAK,EAAG,EAAQ,IAAI,CAAI,GAAK,CAAC,CAAC,EAIhF,GAAI,EAAS,IAAI,CAAI,IAAM,EAAQ,IAAI,CAAI,EAAG,CAC5C,IAAM,EAAsB,CAAC,EACzB,EAAU,GACd,GACE,EAAU,EAAM,IAAI,GAAK,GACzB,EAAQ,OAAO,CAAO,EACtB,EAAU,KAAK,CAAO,QACf,IAAY,GAAQ,EAAM,OAAS,GAC5C,EAAW,KAAK,CAAS,IAI7B,QAAW,KAAQ,EAAM,KAAK,EAC5B,GAAI,CAAC,EAAQ,IAAI,CAAI,EACnB,EAAc,CAAI,EAItB,MAAO,CAAE,YAAW,EAOtB,SAAS,EAAe,CACtB,EACA,EACA,EACY,CACZ,IAAM,EAAqB,CAAC,EACtB,EAAY,IAAI,IAChB,EAAQ,CAAC,GAAG,CAAG,EAAE,KAAK,EAAc,EAEpC,EAAU,CAAC,EAAc,EAAsB,IAA6C,CAChG,EAAQ,OAAO,CAAI,EACnB,IAAM,EAAY,EAAS,IAAI,CAAI,EACnC,GAAI,CAAC,EAAW,OAChB,QAAW,KAAS,EAClB,GAAI,EAAQ,IAAI,CAAK,EACnB,EAAQ,EAAO,EAAS,CAAQ,EAGpC,EAAU,MAAM,GAGlB,QAAS,EAAI,EAAG,EAAI,EAAM,QAAU,EAAO,OAAS,EAAa,IAAK,CACpE,IAAM,EAAQ,EAAM,IAAM,GACpB,EAAU,IAAI,IAAI,EAAM,MAAM,CAAC,CAAC,EAChC,EAAU,IAAI,IACd,EAAW,IAAI,IACf,EAAkB,CAAC,EAEnB,EAAY,CAAC,KAChB,EAAU,IAAI,CAAC,GAAK,CAAC,GAAG,OAAO,KAAK,EAAQ,IAAI,CAAC,CAAC,EAE/C,EAAU,CAAC,IAA0B,CACzC,GAAI,EAAO,QAAU,EAAa,MAAO,GAEzC,IAAI,EAAQ,GACZ,EAAM,KAAK,CAAI,EACf,EAAQ,IAAI,CAAI,EAEhB,QAAW,KAAQ,EAAU,CAAI,EAAG,CAClC,GAAI,EAAO,QAAU,EAAa,MAElC,GAAI,IAAS,EACX,GAAgB,EAAW,EAAQ,EAAM,OAAO,CAAK,CAAC,EACtD,EAAQ,GACH,QAAI,CAAC,EAAQ,IAAI,CAAI,GAC1B,GAAI,EAAQ,CAAI,EACd,EAAQ,IAKd,GAAI,EACF,EAAQ,EAAM,EAAS,CAAQ,EAE/B,aAAW,KAAQ,EAAU,CAAI,EAAG,CAClC,IAAM,EAAM,EAAS,IAAI,CAAI,GAAK,IAAI,IACtC,EAAI,IAAI,CAAI,EACZ,EAAS,IAAI,EAAM,CAAG,EAK1B,OADA,EAAM,IAAI,EACH,GAGT,EAAQ,CAAK,EAGf,OAAO,EAMT,SAAS,EAAY,CACnB,EACA,EACY,CACZ,IAAQ,cAAe,GAAU,CAAS,EACpC,EAAqB,CAAC,EACtB,EAAY,IAAI,IAEtB,QAAW,KAAa,EAAY,CAClC,GAAI,EAAO,QAAU,EAAW,MAEhC,GAAI,EAAU,SAAW,EAAG,SAE5B,GAAI,EAAU,SAAW,EAAG,CAC1B,IAAM,EAAO,EAAU,IAAM,GAE7B,IADkB,EAAU,IAAI,CAAI,GAAK,CAAC,GAC5B,SAAS,CAAI,EACzB,GAAgB,EAAW,EAAQ,CAAC,EAAM,CAAI,CAAC,EAEjD,SAGF,IAAM,EAAY,EAAY,EAAO,OAC/B,EAAW,GAAgB,EAAW,EAAW,CAAS,EAEhE,QAAW,KAAK,EAAU,CACxB,GAAI,EAAO,QAAU,EAAW,MAChC,GAAgB,EAAW,EAAQ,CAAC,GAIxC,OAAO,EC3cT,sBAAS,WAAa,wBAiCtB,eAAsB,EAAa,CAAC,EAAqD,CACvF,GAAI,EAAK,UAAU,SAAW,EAAG,MAAO,CAAC,EAEzC,IAAM,EAA0B,CAAC,EAsBjC,OApBA,MAAM,GACJ,GAAK,WACL,CACE,MAAO,EAAK,UACZ,QAAS,CAAE,KAAM,CAAE,QAAS,EAAK,OAAQ,CAAE,CAC7C,EACA,CAAC,EAAK,IAAU,CACd,GAAI,EAAK,OACT,QAAW,KAAQ,EAAO,CACxB,IAAM,EAAI,EAAK,MAAM,EACrB,EAAQ,KAAK,CACX,SAAU,EAAK,QAAQ,EAAE,SAAS,EAClC,UAAW,EAAE,MAAM,KAAO,EAC1B,QAAS,EAAE,IAAI,KAAO,EACtB,YAAa,EAAK,KAAK,CACzB,CAAC,GAGP,EAEO,EjCtBT,IAAM,GAAwB,MACxB,GAA0B,MAC1B,GAA0B,GAmOzB,MAAM,EAAQ,CAEV,YAEQ,GACA,WACA,aACA,SACA,WACT,YAIA,QACS,qBACA,cACA,iBACA,mBACA,eACA,iBACA,gBACA,WACA,SACA,aACA,0BACA,OACA,eAER,KACD,MAA+C,KAC/C,eAA8C,CAAC,EAC/C,OAAS,GACT,cAAsC,KACtC,WAAgC,CAAC,EACxB,mBAAqB,IAAI,IAElC,WAAqC,KAErC,cAA+B,KAE/B,WAAW,CAAC,EA0BjB,CACD,KAAK,YAAc,EAAK,YACxB,KAAK,GAAK,EAAK,GACf,KAAK,WAAa,EAAK,WACvB,KAAK,aAAe,EAAK,aACzB,KAAK,SAAW,EAAK,SACrB,KAAK,WAAa,EAAK,WACvB,KAAK,YAAc,EAAK,YACxB,KAAK,QAAU,EAAK,QACpB,KAAK,qBAAuB,EAAK,qBACjC,KAAK,cAAgB,EAAK,cAC1B,KAAK,iBAAmB,EAAK,iBAC7B,KAAK,mBAAqB,EAAK,mBAC/B,KAAK,eAAiB,EAAK,eAC3B,KAAK,iBAAmB,EAAK,iBAC7B,KAAK,gBAAkB,EAAK,gBAC5B,KAAK,WAAa,EAAK,WACvB,KAAK,SAAW,EAAK,SACrB,KAAK,aAAe,EAAK,aACzB,KAAK,0BAA4B,EAAK,0BACtC,KAAK,OAAS,EAAK,OACnB,KAAK,eAAiB,EAAK,eAC3B,KAAK,KAAO,EAAK,iBAuBN,KAAI,CAAC,EAA0F,CAC1G,IACE,cACA,aAAa,CAAC,MAAO,OAAQ,MAAM,EACnC,iBAAiB,CAAC,EAClB,qBAAqB,IACrB,SAAS,QACT,eAAe,GACf,sBACA,iBACA,qBACA,oBACA,uBAAuB,GACvB,uBAAuB,GACvB,oBAAoB,GACpB,qBAAqB,GACrB,gBAAgB,GAChB,mBAAmB,GACnB,qBAAqB,GACrB,iBAAiB,GACjB,mBAAmB,GACnB,kBAAkB,GAClB,sBAAsB,GACtB,4BACA,aAAa,MAAO,IAAe,IAAI,KAAK,CAAE,EAAE,KAAK,EACrD,WAAW,MAAO,IAAe,CAAE,MAAM,IAAI,KAAK,CAAE,EAAE,OAAO,GAC7D,aACE,EAEJ,GAAI,CAAC,GAAK,WAAW,CAAW,EAC9B,OAAO,EAAI,EAAa,aAAc,wDAAwD,IAAc,CAAC,EAE/G,GAAI,CAAC,EAAa,CAAW,EAC3B,OAAO,EAAI,EAAa,aAAc,yCAAyC,IAAc,CAAC,EAGhG,IAAM,EAAK,EACP,EAAoB,EACpB,IAAI,GAAa,CAAE,aAAY,CAAC,EAC9B,EAAa,EAAG,KAAK,EAC3B,GAAI,GAAM,CAAU,EAAG,OAAO,EAC9B,GAAI,CAEJ,IAAM,EAAgC,MAAM,EAAmB,CAAW,EACpE,EAAiB,EAAW,IAAI,SAAW,GAAK,SAAS,CAAW,EAEpE,EAAQ,EACV,EAAkB,GACjB,IAAM,CACL,IAAM,EAAa,EACnB,MAAO,CACL,SAAU,IAAI,GAAe,CAAU,EACvC,WAAY,IAAI,GAAiB,CAAU,EAC3C,aAAc,IAAI,GAAmB,CAAU,EAC/C,WAAY,IAAI,GAAW,CAAkB,CAC/C,IACC,EAED,GAAc,GAAa,GAC7B,EACJ,GAAI,GACF,EAAO,MAAM,QAAQ,QACnB,EAAqB,EAAI,QAAQ,IAAK,CAAC,CAAC,CAC1C,EAEA,OAAO,QAGT,IAAI,GAGQ,KACR,GAA0D,KAExD,EAAW,IAAI,GAAQ,CAC3B,cACA,KACA,WAAY,EAAM,WAClB,aAAc,EAAM,aACpB,SAAU,EAAM,SAChB,WAAY,EAAM,WAClB,eACA,WACA,qBAAsB,EACtB,cAAe,EACf,iBAAkB,EAClB,mBAAoB,EACpB,eAAgB,EAChB,iBAAkB,EAClB,gBAAiB,EACjB,WAAY,EACZ,SAAU,EACV,eACA,4BACA,SACA,iBACA,MACF,CAAC,EAID,GAHA,GAAwB,CAAW,EACnC,EAAS,cAAgB,MAAM,EAAoB,CAAW,EAC9D,EAAS,WAAa,EAClB,IAAS,QAAS,CACpB,IAAM,EAAI,EACN,EAAmB,EACnB,IAAI,GAAiB,CACnB,cACA,aACA,aACA,iBACA,aAAc,EACd,WAAY,EAAM,WAClB,SAAU,EAAM,SAChB,WAAY,EAAM,WAClB,aAAc,EAAM,aACpB,QACF,CAAC,EAKL,GAHA,EAAS,YAAc,EACvB,EAAE,UAAU,IAAM,EAAS,qBAAqB,CAAC,EAE7C,GAAa,CACf,IAAM,EAAI,EACN,EAAe,EACf,IAAI,GAAe,CAAE,cAAa,iBAAgB,YAAW,EAAG,OAAW,CAAM,EAErF,EAAS,QAAU,EAEnB,MAAM,EAAE,MAAM,CAAC,IAAU,EAAE,qBAAqB,CAAK,CAAC,EAAE,KAAK,CAAC,IAAgB,CAC5E,GAAI,GAAM,CAAW,EAAG,MAAM,EAAY,KAC3C,EAED,IAAM,EAAQ,YAAY,IAAM,CAC9B,EAAkB,EAAI,QAAQ,GAAG,GAChC,EAAqB,EACxB,EAAS,MAAQ,EAGnB,MAAM,EAAE,UAAU,EACb,KACL,IAAI,EAAa,EACX,EAAc,SAAY,CAC9B,GAAI,CACF,IAAM,EAAU,MAAM,QAAQ,QAC5B,EAAqB,EAAI,QAAQ,IAAK,CAAC,CAAC,CAC1C,EAEA,GADA,EAAa,EACT,IAAY,QAAS,CACvB,cAAc,EAAS,KAAM,EAC7B,EAAS,MAAQ,KACjB,IAAI,EAAkE,KAClE,EAGQ,KACZ,GAAI,CACF,EAAkB,EACd,EAAe,EACf,IAAI,GAAe,CAAE,cAAa,iBAAgB,YAAW,EAAG,OAAW,CAAM,EACrF,EAAsB,EAClB,EAAmB,EACnB,IAAI,GAAiB,CACnB,cACA,aACA,aACA,iBACA,aAAc,EACd,WAAY,EAAM,WAClB,SAAU,EAAM,SAChB,WAAY,EAAM,WAClB,aAAc,EAAM,aACpB,QACF,CAAC,EACL,QAAW,KAAM,EAAS,mBACxB,EAAoB,UAAU,CAAE,EAElC,EAAoB,UAAU,IAAM,EAAS,qBAAqB,CAAC,EACnE,MAAM,EAAgB,MAAM,CAAC,IAAU,GAAqB,qBAAqB,CAAK,CAAC,EAAE,KAAK,CAAC,IAAgB,CAC7G,GAAI,GAAM,CAAW,EAAG,MAAM,EAAY,KAC3C,EACD,IAAM,GAAU,YAAY,IAAM,CAChC,EAAkB,EAAI,QAAQ,GAAG,GAChC,EAAqB,EACxB,EAAS,MAAQ,GACjB,EAAS,YAAc,EACvB,EAAS,QAAU,EACnB,MAAM,EAAoB,UAAU,EACpC,MAAO,GAAU,CAEjB,GADA,EAAO,MAAM,wDAAyD,EAAQ,EAC1E,EAAiB,CACnB,IAAM,EAAc,MAAM,EAAgB,MAAM,EAChD,GAAI,GAAM,CAAW,EAAG,EAAO,MAAM,0DAA2D,EAAY,IAAI,EAChH,EAAS,QAAU,KAErB,GAAI,EACF,MAAM,EAAoB,SAAS,EAAE,MAAM,CAAC,IAC1C,EAAO,MAAM,iEAAkE,CAAC,CAClF,EACA,EAAS,YAAc,KAEzB,GAAI,EAAS,QAAU,KACrB,EAAS,MAAQ,YAAY,EAAa,EAAuB,IAIvE,MAAO,EAAK,CAGZ,GAFA,IACA,EAAO,MAAM,8BAA+B,CAAG,EAC3C,GAAc,GAChB,EAAO,MAAM,4DAA4D,EACzE,cAAc,EAAS,KAAM,EAC7B,EAAS,MAAQ,KACjB,EAAS,MAAM,EAAE,MAAM,CAAC,IACtB,EAAO,MAAM,oDAAqD,CAAQ,CAC5E,IAIA,EAAQ,YAAY,EAAa,EAAuB,EAC9D,EAAS,MAAQ,EAGnB,GAAI,GAAa,CACf,IAAM,EAAgD,CAAC,UAAW,SAAU,YAAY,EACxF,QAAW,KAAO,EAAS,CACzB,IAAM,EAAU,IAAM,CAAE,EAAS,MAAM,EAAE,MAAM,KAAO,EAAO,MAAM,sCAAuC,EAAK,CAAG,CAAC,GACnH,GAAI,IAAQ,aACV,QAAQ,GAAG,aAAc,CAAO,EAEhC,aAAQ,GAAG,EAAK,CAAO,EAEzB,EAAS,eAAe,KAAK,CAAC,EAAK,CAAO,CAAC,GAI/C,OAAO,EACL,MAAO,EAAO,CAEd,OADA,EAAG,MAAM,EACF,EAAI,EAAa,QAAS,iCAAkC,CAAK,CAAC,QAwBvE,MAAK,CAAC,EAAmE,CAC7E,GAAI,KAAK,OAAQ,OACjB,KAAK,OAAS,GAEd,IAAM,EAAyB,CAAC,EAEhC,QAAY,EAAK,KAAY,KAAK,eAChC,GAAI,IAAQ,aACV,QAAQ,IAAI,aAAc,CAAO,EAEjC,aAAQ,IAAI,EAAuB,CAAO,EAK9C,GAFA,KAAK,eAAiB,CAAC,EAEnB,KAAK,YACP,GAAI,CACF,MAAM,KAAK,YAAY,SAAS,EAChC,MAAO,EAAK,CACZ,EAAY,KAAK,aAAe,MAAQ,EAAU,MAAM,OAAO,CAAG,CAAC,CAAC,EAIxE,GAAI,KAAK,QAAS,CAChB,IAAM,EAAc,MAAM,KAAK,QAAQ,MAAM,EAC7C,GAAI,GAAM,CAAW,EAAG,EAAY,KAAK,EAAY,IAAI,EAG3D,GAAI,KAAK,QAAU,KACjB,cAAc,KAAK,KAAK,EACxB,KAAK,MAAQ,KAGf,GAAI,CACF,KAAK,qBAAqB,KAAK,GAAI,QAAQ,GAAG,EAC9C,MAAO,EAAK,CACZ,EAAY,KAAK,aAAe,MAAQ,EAAU,MAAM,OAAO,CAAG,CAAC,CAAC,EAGtE,GAAI,CACF,KAAK,GAAG,MAAM,EACd,MAAO,EAAK,CACZ,EAAY,KAAK,aAAe,MAAQ,EAAU,MAAM,OAAO,CAAG,CAAC,CAAC,EAGtE,GAAI,GAAM,QACR,QAAW,IAAO,CAAC,GAAI,OAAQ,MAAM,EACnC,GAAI,CACF,MAAM,KAAK,SAAS,GAAK,KAAK,KAAK,YAAa,UAAW,aAAe,CAAG,CAAC,EAC9E,KAAM,EAIZ,GAAI,EAAY,OAAS,EACvB,OAAO,EAAI,EAAa,QAAS,sDAAuD,CAAW,CAAC,EAmBxG,SAAS,CAAC,EAAqD,CAE7D,GADA,KAAK,mBAAmB,IAAI,CAAQ,EAChC,CAAC,KAAK,YACR,MAAO,IAAM,CAAE,KAAK,mBAAmB,OAAO,CAAQ,GAExD,IAAM,EAAc,KAAK,YAAY,UAAU,CAAQ,EACvD,MAAO,IAAM,CACX,KAAK,mBAAmB,OAAO,CAAQ,EACvC,EAAY,GA2BhB,WAAW,CAAC,EAAkB,EAAoB,EAA2D,CAC3G,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,IAAM,EAAS,KAAK,cAAc,EAAU,EAAY,CAAO,EAC/D,GAAI,GAAM,CAAM,EAAG,OAAO,EAE1B,OADA,KAAK,WAAW,IAAI,EAAU,CAAM,EAC7B,EAsBT,cAAc,CAAC,EAA6D,CAC1E,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,OAAO,KAAK,iBAAiB,CAAM,EAqBrC,gBAAgB,CAAC,EAA0D,CACzE,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,OAAO,KAAK,mBACV,EAAO,QACP,EAAO,SACP,KAAK,eAAiB,MACxB,EAIM,oBAAoB,EAAS,CACnC,KAAK,WAAa,KAClB,KAAK,cAAgB,KASf,eAAe,CAAC,EAAmC,CACzD,IAAM,EAAM,GAAW,YACvB,GAAI,KAAK,YAAc,KAAK,gBAAkB,EAC5C,OAAO,KAAK,WAEd,IAAM,EAAI,IAAI,GAAgB,CAC5B,aAAc,KAAK,aACnB,QAAS,GAAW,KAAK,cAC3B,CAAC,EAID,OAHA,EAAE,MAAM,EACR,KAAK,WAAa,EAClB,KAAK,cAAgB,EACd,OAuBH,QAAO,EAA+C,CAC1D,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CAAC,KAAK,YACR,OAAO,EAAI,EAAa,SAAU,iDAAiD,CAAC,EAEtF,GAAI,CACF,IAAM,EAAS,MAAM,KAAK,YAAY,UAAU,EAEhD,OADA,KAAK,qBAAqB,EACnB,EACP,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,QAAS,0BAA2B,CAAC,CAAC,MAS9D,SAAQ,EAAsB,CAChC,MAAO,CAAC,GAAG,KAAK,UAAU,EAkB5B,QAAQ,CAAC,EAAqD,CAC5D,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,OAAO,KAAK,WAAW,SAAS,GAAW,KAAK,cAAc,EAC9D,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,QAAS,2BAA4B,CAAC,CAAC,GAoBnE,aAAa,CAAC,EAAsE,CAClF,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,OAAO,KAAK,eAAe,CAAE,WAAY,KAAK,WAAY,QAAS,KAAK,eAAgB,OAAM,CAAC,EAC/F,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,gCAAiC,CAAC,CAAC,GAmBzE,eAAe,CAAC,EAAkE,CAChF,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,OAAO,KAAK,iBAAiB,CAAE,aAAc,KAAK,aAAc,QAAS,KAAK,eAAgB,OAAM,CAAC,EACrG,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,kCAAmC,CAAC,CAAC,GAY3E,gBAAgB,CAAC,EAA8G,CAC7H,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,OAAO,KAAK,eAAe,CAAE,WAAY,KAAK,WAAY,QAAS,OAAW,OAAM,CAAC,EACrF,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,mCAAoC,CAAC,CAAC,GAY5E,kBAAkB,CAAC,EAAkE,CACnF,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,OAAO,KAAK,iBAAiB,CAAE,aAAc,KAAK,aAAc,QAAS,OAAW,OAAM,CAAC,EAC3F,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,qCAAsC,CAAC,CAAC,GAY9E,gBAAgB,CAAC,EAAsD,CACrE,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,OAAO,KAAK,SAAS,YAAY,GAAW,KAAK,cAAc,EAC/D,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,QAAS,mCAAoC,CAAC,CAAC,GAc3E,oBAAoB,CAAC,EAAkB,EAAwD,CAC7F,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,OAAO,KAAK,iBAAiB,CAC3B,aAAc,KAAK,aACnB,QAAS,GAAW,KAAK,eACzB,MAAO,CAAE,YAAa,EAAU,YAAa,EAAU,MAAO,GAAO,CACvE,CAAC,EACD,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,uCAAwC,CAAC,CAAC,GAiBhF,WAAW,CACT,EACA,EACY,CACZ,IAAM,EAAY,IAAI,IAAgC,EAAO,IAAI,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,WAAY,CAAC,CAAC,CAAC,EAChG,EAAW,IAAI,IAAgC,EAAM,IAAI,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,WAAY,CAAC,CAAC,CAAC,EAC9F,EAA8B,CAAC,EAC/B,EAAgC,CAAC,EACjC,EAA6E,CAAC,EACpF,QAAY,EAAK,KAAa,EAAU,CACtC,IAAM,EAAY,EAAU,IAAI,CAAG,EACnC,GAAI,CAAC,EACH,EAAM,KAAK,CAAQ,EACd,QAAI,EAAU,cAAgB,EAAS,YAC5C,EAAS,KAAK,CAAE,OAAQ,EAAW,MAAO,CAAS,CAAC,EAGxD,QAAY,EAAK,KAAc,EAC7B,GAAI,CAAC,EAAS,IAAI,CAAG,EAAG,EAAQ,KAAK,CAAS,EAEhD,MAAO,CAAE,QAAO,UAAS,UAAS,EAmBpC,eAAe,CAAC,EAAkB,EAAkB,EAAQ,IAAwC,CAClG,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,OAAO,KAAK,iBAAiB,CAC3B,aAAc,KAAK,aACnB,QAAS,GAAW,KAAK,eACzB,MAAO,CAAE,YAAa,EAAU,KAAM,UAAW,QAAS,GAAW,KAAK,eAAgB,OAAM,CAClG,CAAC,EAAE,IAAI,KAAK,EAAE,WAAW,EACzB,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,kCAAmC,CAAC,CAAC,GAoB3E,aAAa,CAAC,EAAkB,EAAkB,EAAQ,IAAwC,CAChG,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,OAAO,KAAK,iBAAiB,CAC3B,aAAc,KAAK,aACnB,QAAS,GAAW,KAAK,eACzB,MAAO,CAAE,YAAa,EAAU,KAAM,UAAW,QAAS,GAAW,KAAK,eAAgB,OAAM,CAClG,CAAC,EAAE,IAAI,KAAK,EAAE,WAAW,EACzB,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,gCAAiC,CAAC,CAAC,QAuBnE,YAAW,CAAC,EAAwB,EAA2D,CACnG,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CAEF,OADU,KAAK,gBAAgB,CAAO,EAC7B,oBAAoB,CAAY,EACzC,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,8BAA+B,CAAC,CAAC,QAuBjE,SAAQ,CAAC,EAA0D,CACvE,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CAEF,OADU,KAAK,gBAAgB,CAAO,EAC7B,SAAS,EAClB,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,2BAA4B,CAAC,CAAC,QAe9D,eAAc,CAAC,EAAwE,CAC3F,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CAEF,OADU,KAAK,gBAAgB,CAAO,EAC7B,iBAAiB,EAC1B,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,iCAAkC,CAAC,CAAC,QAYpE,0BAAyB,CAAC,EAAkB,EAA2D,CAC3G,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CAEF,OADU,KAAK,gBAAgB,CAAO,EAC7B,0BAA0B,CAAQ,EAC3C,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,4CAA6C,CAAC,CAAC,QAiB/E,cAAa,CAAC,EAAkB,EAA6E,CACjH,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CAEF,OADU,KAAK,gBAAgB,CAAO,EAC7B,cAAc,CAAO,EAC9B,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,gCAAiC,CAAC,CAAC,GAezE,aAAa,CACX,EACA,EACA,EACkC,CAClC,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,IAAM,EAAmB,GAAW,KAAK,eACnC,EAAU,KAAK,eAAe,CAClC,WAAY,KAAK,WACjB,QAAS,EACT,MAAO,CAAE,KAAM,EAAY,MAAO,GAAM,WAAU,MAAO,CAAE,CAC7D,CAAC,EACD,GAAI,EAAQ,SAAW,EACrB,OAAO,EAAI,EAAa,SAAU,oBAAoB,oBAA6B,IAAW,CAAC,EAEjG,IAAM,EAAM,EAAQ,GACd,EAAI,EAAI,OAWd,MAVyB,IACpB,EACH,QAAS,MAAM,QAAQ,EAAE,OAAO,EAAK,EAAE,QAAoC,OAC3E,MAAO,OAAO,EAAE,QAAU,SAAW,EAAE,MAAQ,OAC/C,WAAY,OAAO,EAAE,aAAe,SAAW,EAAE,WAAa,OAC9D,WAAY,OAAO,EAAE,aAAe,SAAW,EAAE,WAAa,OAC9D,SAAU,MAAM,QAAQ,EAAE,QAAQ,EAAK,EAAE,SAAwB,OACjE,WAAY,MAAM,QAAQ,EAAE,UAAU,EAAK,EAAE,WAA0C,OACvF,eAAgB,OAAO,EAAE,iBAAmB,SAAW,EAAE,eAAiB,MAC5E,EAEA,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,gCAAiC,CAAC,CAAC,GAczE,YAAY,CACV,EACA,EACiC,CACjC,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,IAAM,EAAmB,GAAW,KAAK,eACnC,EAAa,KAAK,SAAS,QAAQ,EAAkB,CAAQ,EACnE,GAAI,CAAC,EACH,OAAO,EAAI,EAAa,SAAU,kBAAkB,wBAA+B,CAAC,EAEtF,IAAM,EAAU,KAAK,WAAW,eAAe,EAAkB,CAAQ,EACnE,EAAY,KAAK,aAAa,YAAY,EAAkB,CAAQ,EAC1E,MAAO,CACL,SAAU,EAAW,SACrB,UAAW,EAAW,WAAa,EACnC,KAAM,EAAW,KACjB,YAAa,EAAQ,OACrB,oBAAqB,EAAQ,OAAO,CAAC,IAAM,EAAE,UAAU,EAAE,OACzD,cAAe,EAAU,MAC3B,EACA,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,QAAS,+BAAgC,CAAC,CAAC,QAgBjE,cAAa,CACjB,EACA,EAC2C,CAC3C,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,IAAM,EAAI,KAAK,gBAAgB,CAAO,EACtC,MAAO,CACL,WACA,MAAO,EAAE,cAAc,CAAQ,EAAE,OACjC,OAAQ,EAAE,gBAAgB,CAAQ,EAAE,MACtC,EACA,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,gCAAiC,CAAC,CAAC,GAiBzE,aAAa,CACX,EACA,EACA,EACsC,CACtC,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,IAAM,EAAmB,GAAW,KAAK,eACnC,EAAU,IAAI,IACd,EAAyD,CAAC,EAE5D,EAAc,EACd,EAAc,EAElB,OAAS,CACP,IAAM,EAAM,GAAG,MAAgB,IAC/B,GAAI,EAAQ,IAAI,CAAG,EACjB,OAAO,EAAI,EAAa,SAAU,0DAA0D,CAAC,EAE/F,EAAQ,IAAI,CAAG,EAEf,IAAM,EAAO,KAAK,iBAAiB,CACjC,aAAc,KAAK,aACnB,QAAS,EACT,MAAO,CAAE,KAAM,aAAc,YAAa,EAAa,MAAO,GAAI,CACpE,CAAC,EAEG,EACA,EAEJ,QAAW,KAAO,EAAM,CACtB,IAAI,EACJ,GAAI,EAAI,SACN,GAAI,CACF,IAAM,EAAO,KAAK,MAAM,EAAI,QAAQ,EACpC,GAAI,MAAM,QAAQ,EAAK,UAAa,EAClC,EAAa,EAAK,WAEpB,KAAM,EAEV,GAAI,CAAC,EAAY,SACjB,IAAM,EAAQ,EAAW,KAAK,CAAC,IAAM,EAAE,WAAa,CAAW,EAC/D,GAAI,CAAC,EAAO,SACZ,EAAW,EAAI,YACf,EAAW,EAAM,MACjB,MAGF,GAAI,CAAC,GAAY,CAAC,EAChB,MAAO,CAAE,aAAc,EAAa,iBAAkB,EAAa,cAAe,CAAM,EAG1F,EAAM,KAAK,CAAE,SAAU,EAAa,WAAY,CAAY,CAAC,EAC7D,EAAc,EACd,EAAc,QAgBZ,YAAW,CACf,EACA,EAC+C,CAC/C,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,IAAM,EAAmB,GAAM,SAAW,KAAK,eACzC,EAAsB,GAAM,UAC9B,EAAK,UACL,KAAK,SAAS,YAAY,CAAgB,EAAE,IAAI,CAAC,IAAM,EAAE,QAAQ,EAErE,OAAO,MAAM,KAAK,gBAAgB,CAAE,UAAS,WAAU,CAAC,EACxD,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,8BAA+B,CAAC,CAAC,QAqBjE,sBAAqB,CACzB,EACA,EAC8C,CAC9C,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,KAAK,OAAS,QAChB,OAAO,EAAI,EAAa,SAAU,+DAA+D,CAAC,EAEpG,GAAI,CACF,IAAM,EAAyB,CAAC,EAChC,QAAW,KAAe,EAAU,CAClC,IAAM,EAAa,GAAK,QAAQ,KAAK,YAAa,eAAgB,CAAW,EAC7E,GAAI,CAAC,KAAK,aAAa,CAAU,EAC/B,OAAO,EAAI,EAAa,aAAc,+CAA+C,GAAa,CAAC,EAErG,IAAM,EAAU,aAAa,IAgBvB,EAAS,MAfK,KAAK,0BACrB,KAAK,0BAA0B,EAAY,CAAO,EAClD,IAAI,GAAiB,CACnB,YAAa,EACb,WAAY,CAAC,CAAE,IAAK,IAAK,SAAQ,CAAC,EAClC,WAAY,CAAC,OAAO,EACpB,eAAgB,CAAC,EACjB,aAAc,KAAK,GACnB,WAAY,KAAK,WAEjB,SAAU,KAAK,SACf,WAAY,KAAK,WACjB,aAAc,KAAK,aACnB,OAAQ,KAAK,MACf,CAAC,GAC4B,UAAU,EAC3C,EAAQ,KAAK,CAAM,EAErB,OAAO,EACP,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,QAAS,wCAAyC,CAAC,CAAC,QAe1E,WAAU,CAAC,EAAqB,EAAiF,CACrH,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,IAAM,EAAS,IAAI,IAcnB,OAbA,MAAM,QAAQ,IACZ,EAAU,IAAI,MAAO,IAAO,CAC1B,GAAI,CACF,IAAM,EAAO,MAAM,KAAK,WAAW,CAAE,EAC/B,EAAS,KAAK,cAAc,EAAI,EAAM,CAAO,EACnD,GAAI,CAAC,GAAM,CAAM,EACf,EAAO,IAAI,EAAI,CAAoB,EAErC,KAAM,GAGT,CACH,EACO,EAWT,kBAAkB,CAAC,EAAkB,EAAyD,CAC5F,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CAMF,IAAM,EALU,KAAK,eAAe,CAClC,WAAY,KAAK,WACjB,QAAS,GAAW,KAAK,eACzB,MAAO,CAAE,WAAU,WAAY,EAAK,CACtC,CAAC,EACuB,IAAI,CAAC,KAAO,CAClC,KAAM,EAAE,KACR,KAAM,EAAE,KACR,WAAa,EAAE,OAAO,YAAqC,OAC3D,WAAa,EAAE,OAAO,YAAqC,OAC3D,MAAQ,EAAE,OAAO,OAAgC,MACnD,EAAE,EACF,MAAO,CAAE,WAAU,SAAQ,EAC3B,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,qCAAsC,CAAC,CAAC,QAgBxE,iBAAgB,CACpB,EACA,EACA,EAC6C,CAC7C,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,IAAM,EAAO,GAAW,KAAK,eACvB,EAAU,IAAI,IAEd,EAAY,CAAC,EAAiB,EAAY,IAAkD,CAChG,IAAM,EAAM,GAAG,MAAY,IAC3B,GAAI,EAAQ,IAAI,CAAG,EACjB,MAAO,CAAE,WAAY,EAAS,SAAU,EAAI,OAAM,SAAU,CAAC,CAAE,EAEjE,EAAQ,IAAI,CAAG,EAaf,IAAM,EAXO,KAAK,iBAAiB,CACjC,aAAc,KAAK,aACnB,QAAS,EACT,MAAO,CAAE,YAAa,EAAI,cAAe,EAAS,MAAO,IAAK,CAChE,CAAC,EAEyB,OACxB,CAAC,IACC,EAAE,OAAS,WAAa,EAAE,OAAS,YACvC,EAGG,OAAO,CAAC,IAAM,EAAE,eAAiB,IAAI,EACrC,IAAI,CAAC,IAAM,EAAU,EAAE,cAAgB,EAAE,YAAa,EAAE,IAAI,CAAC,EAEhE,MAAO,CAAE,WAAY,EAAS,SAAU,EAAI,OAAM,UAAS,GAG7D,OAAO,EAAU,EAAY,CAAQ,EACrC,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,SAAU,mCAAoC,CAAC,CAAC,GAa5E,YAAY,CAAC,EAA0C,CACrD,GAAI,KAAK,OAAQ,OACjB,OAAO,KAAK,WAAW,IAAI,CAAQ,EAarC,WAAW,CAAC,EAAkB,EAA2D,CACvF,GAAI,KAAK,OAAQ,OAAO,EAAI,EAAa,SAAU,6BAA6B,CAAC,EACjF,GAAI,CACF,OAAO,KAAK,SAAS,QAAQ,GAAW,KAAK,eAAgB,CAAQ,EACrE,MAAO,EAAG,CACV,OAAO,EAAI,EAAa,QAAS,8BAA+B,CAAC,CAAC,GAatE,gBAAgB,CAAC,EAAkB,EAA8D,CAC/F,OAAO,KAAK,cAAc,CAAE,WAAU,QAAS,GAAW,OAAW,MAAO,GAAO,CAAC,EAExF",
41
+ "debugId": "F837B101196A860D64756E2164756E21",
42
42
  "names": []
43
43
  }