@memstack/core 0.7.3 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +234 -7
- package/dist/index.cjs +665 -116
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +178 -5
- package/dist/index.d.ts +178 -5
- package/dist/index.js +660 -117
- package/dist/index.js.map +1 -1
- package/package.json +4 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/memory/Summarizer.ts","../src/memory/Pruner.ts","../src/memory/ContextCompiler.ts","../src/memory/MemoryStore.ts","../src/adapters/storage/memory.ts","../src/client.ts","../src/adapters/storage/disk.ts","../src/adapters/storage/markdown.ts","../src/adapters/storage/hybrid.ts","../src/adapters/storage/postgres.ts","../src/adapters/storage/redis.ts","../src/adapters/storage/qdrant.ts","../src/adapters/storage/neo4j.ts","../src/adapters/storage/weaviate.ts","../src/adapters/storage/lancedb.ts","../src/adapters/storage/mongodb.ts","../src/adapters/storage/sqlite.ts","../src/adapters/llm/openai.ts","../src/adapters/llm/anthropic.ts","../src/adapters/embedding/openai.ts","../src/adapters/embedding/cohere.ts","../src/adapters/llm/ollama.ts","../src/adapters/llm/groq.ts"],"names":["mkdir","join","readFile","writeFile","rename","unlink","open","stat","readdir","appendFile","vector","results","points","filters","result","objects"],"mappings":"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","file":"index.cjs","sourcesContent":["export type MemStackErrorCode =\n | \"STORAGE_ERROR\"\n | \"EMBEDDING_ERROR\"\n | \"LLM_ERROR\"\n | \"VALIDATION_ERROR\"\n | \"NOT_FOUND\"\n | \"CONFIG_ERROR\";\n\nexport class MemStackError extends Error {\n code: MemStackErrorCode;\n retryable: boolean;\n details?: Record<string, unknown>;\n\n constructor(\n code: MemStackErrorCode,\n message: string,\n options: { retryable?: boolean; details?: Record<string, unknown> } = {}\n ) {\n super(message);\n this.name = \"MemStackError\";\n this.code = code;\n this.retryable = options.retryable ?? false;\n this.details = options.details;\n }\n}\n\nexport function notFound(entity: string, id: string): MemStackError {\n return new MemStackError(\"NOT_FOUND\", `${entity} not found: ${id}`, {\n retryable: false,\n details: { entity, id },\n });\n}\n\nexport function validationError(message: string, details?: Record<string, unknown>): MemStackError {\n return new MemStackError(\"VALIDATION_ERROR\", message, { details });\n}\n\nexport function storageError(message: string, cause?: unknown): MemStackError {\n return new MemStackError(\"STORAGE_ERROR\", message, {\n retryable: true,\n details: { cause: cause instanceof Error ? cause.message : String(cause) },\n });\n}\n\nexport function configError(message: string): MemStackError {\n return new MemStackError(\"CONFIG_ERROR\", message, { retryable: false });\n}\n","import type { LLMProvider } from \"../interfaces.js\";\nimport type { Memory } from \"../types.js\";\nimport type { SummarizeOptions } from \"../interfaces.js\";\nimport { MemStackError } from \"../errors.js\";\n\nexport class Summarizer {\n private llm: LLMProvider;\n private defaultPrompt: string;\n\n constructor(llm: LLMProvider, defaultPrompt?: string) {\n this.llm = llm;\n this.defaultPrompt = defaultPrompt ??\n \"You are a memory summarizer. Condense the following list of memories into a single, concise summary paragraph that captures the key events, emotional tone, and important details. Write in third person past tense.\";\n }\n\n async summarize(\n memories: Memory[],\n options: SummarizeOptions = {},\n promptOverride?: string\n ): Promise<{ summaryContent: string; tokenCount: number }> {\n if (memories.length === 0) {\n throw new MemStackError(\"VALIDATION_ERROR\", \"No memories to summarize\");\n }\n\n const chunkSize = options.chunkSize ?? 50;\n if (memories.length > chunkSize) {\n return this._summarizeChunked(memories, options, promptOverride);\n }\n\n const sorted = [...memories].sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n const memoryTexts = sorted.map((m) => `[${m.createdAt.toISOString()}] ${m.content}`);\n\n const system = promptOverride ?? this.defaultPrompt;\n const user = memoryTexts.join(\"\\n\\n\");\n\n try {\n const response = await this.llm.complete({ system, user });\n return {\n summaryContent: response.text.trim(),\n tokenCount: response.tokens.total,\n };\n } catch (err) {\n if (err instanceof MemStackError) throw err;\n throw new MemStackError(\n \"LLM_ERROR\",\n `Summarization failed: ${err instanceof Error ? err.message : String(err)}`,\n { retryable: true, details: { cause: err instanceof Error ? err.message : String(err) } }\n );\n }\n }\n\n private async _summarizeChunked(\n memories: Memory[],\n options: SummarizeOptions,\n promptOverride?: string\n ): Promise<{ summaryContent: string; tokenCount: number }> {\n const chunkSize = options.chunkSize ?? 50;\n const sorted = [...memories].sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n\n const chunks: Memory[][] = [];\n for (let i = 0; i < sorted.length; i += chunkSize) {\n chunks.push(sorted.slice(i, i + chunkSize));\n }\n\n let totalTokens = 0;\n\n const chunkSummaries: string[] = [];\n for (const chunk of chunks) {\n const memoryTexts = chunk.map((m) => `[${m.createdAt.toISOString()}] ${m.content}`);\n const system = promptOverride ?? this.defaultPrompt;\n const user = memoryTexts.join(\"\\n\\n\");\n\n try {\n const response = await this.llm.complete({ system, user });\n chunkSummaries.push(response.text.trim());\n totalTokens += response.tokens.total;\n } catch (err) {\n if (err instanceof MemStackError) throw err;\n throw new MemStackError(\n \"LLM_ERROR\",\n `Chunked summarization failed: ${err instanceof Error ? err.message : String(err)}`,\n { retryable: true, details: { cause: err instanceof Error ? err.message : String(err) } }\n );\n }\n }\n\n if (chunkSummaries.length === 1) {\n return { summaryContent: chunkSummaries[0], tokenCount: totalTokens };\n }\n\n const summaryMemories: Memory[] = chunkSummaries.map((content, i) => ({\n id: `_chunk_summary_${i}`,\n actorId: sorted[0].actorId,\n memoryType: \"summary\" as const,\n content,\n importance: 0.5,\n emotionalValence: 0,\n tags: [\"summary\"],\n createdAt: sorted[sorted.length - 1].createdAt,\n }));\n\n const merged = await this._summarizeChunked(summaryMemories, options, promptOverride);\n return {\n summaryContent: merged.summaryContent,\n tokenCount: totalTokens + merged.tokenCount,\n };\n }\n\n async *summarizeStream(\n memories: Memory[],\n options: SummarizeOptions = {},\n promptOverride?: string\n ): AsyncIterable<{ chunk: string; text: string }> {\n if (memories.length === 0) {\n throw new MemStackError(\"VALIDATION_ERROR\", \"No memories to summarize\");\n }\n if (!this.llm.completeStream) {\n const result = await this.summarize(memories, options, promptOverride);\n yield { chunk: result.summaryContent, text: result.summaryContent };\n return;\n }\n\n const chunkSize = options.chunkSize ?? 50;\n let toSummarize = memories;\n if (memories.length > chunkSize) {\n const chunked = await this._summarizeChunked(memories, options, promptOverride);\n toSummarize = [{ id: \"_chunked\", actorId: \"summarizer\", memoryType: \"summary\", content: chunked.summaryContent, importance: 0.5, emotionalValence: 0, tags: [], createdAt: new Date() }];\n }\n\n const sorted = [...toSummarize].sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n const memoryTexts = sorted.map((m) => `[${m.createdAt.toISOString()}] ${m.content}`);\n const system = promptOverride ?? this.defaultPrompt;\n const user = memoryTexts.join(\"\\n\\n\");\n\n let fullText = \"\";\n for await (const chunk of this.llm.completeStream({ system, user })) {\n fullText += chunk.text;\n yield { chunk: chunk.text, text: fullText };\n }\n }\n}\n","import type { Memory } from \"../types.js\";\nimport type { PruneStrategy } from \"../interfaces.js\";\n\nexport class Pruner {\n /** Returns memories to KEEP after applying the strategy. */\n execute(memories: Memory[], strategy: PruneStrategy): Memory[] {\n switch (strategy.type) {\n case \"byAge\":\n return this.keepByAge(memories, strategy);\n case \"byImportance\":\n return this.keepByImportance(memories, strategy);\n case \"byCount\":\n return this.keepByCount(memories, strategy);\n case \"byType\":\n return this.removeByType(memories, strategy);\n case \"custom\":\n return this.removeCustom(memories, strategy);\n case \"compose\":\n return this.keepCompose(memories, strategy);\n default:\n return memories;\n }\n }\n\n dryRun(memories: Memory[], strategy: PruneStrategy): Memory[] {\n return this.execute(memories, strategy);\n }\n\n private keepByAge(memories: Memory[], strategy: PruneStrategy): Memory[] {\n if (!strategy.maxAge) return memories;\n const cutoff = Date.now() - strategy.maxAge;\n return memories.filter((m) => m.createdAt.getTime() >= cutoff);\n }\n\n private keepByImportance(memories: Memory[], strategy: PruneStrategy): Memory[] {\n const threshold = strategy.minImportance ?? 0.5;\n return memories.filter((m) => m.importance >= threshold);\n }\n\n private keepByCount(memories: Memory[], strategy: PruneStrategy): Memory[] {\n const maxPerActor = strategy.maxPerActor ?? 100;\n const grouped = new Map<string, Memory[]>();\n for (const m of memories) {\n const list = grouped.get(m.actorId) || [];\n list.push(m);\n grouped.set(m.actorId, list);\n }\n\n const kept: Memory[] = [];\n for (const [, actorMemories] of grouped) {\n const sorted = [...actorMemories].sort((a, b) => b.importance - a.importance);\n kept.push(...sorted.slice(0, maxPerActor));\n }\n return kept;\n }\n\n /** Remove memories of specified types. Opposite of filtering — removes the matches. */\n private removeByType(memories: Memory[], strategy: PruneStrategy): Memory[] {\n if (!strategy.memoryTypes || strategy.memoryTypes.length === 0) return memories;\n return memories.filter((m) => !strategy.memoryTypes!.includes(m.memoryType));\n }\n\n /** Remove memories matching the predicate. Predicate returns true = should be removed. */\n private removeCustom(memories: Memory[], strategy: PruneStrategy): Memory[] {\n if (!strategy.shouldRemove) return memories;\n return memories.filter((m) => !strategy.shouldRemove!(m));\n }\n\n /** Apply sub-strategies cumulatively: kept memories must pass ALL. */\n private keepCompose(memories: Memory[], strategy: PruneStrategy): Memory[] {\n if (!strategy.strategies || strategy.strategies.length === 0) {\n return memories;\n }\n\n let kept = memories;\n for (const sub of strategy.strategies) {\n kept = this.execute(kept, sub);\n }\n return kept;\n }\n}\n","import type { Memory, CompiledContext } from \"../types.js\";\nimport type { ContextOptions, TokenCounter } from \"../interfaces.js\";\n\nexport class ContextCompiler {\n private tokenCounter: TokenCounter;\n private importantRatio: number;\n\n constructor(tokenCounter?: TokenCounter, importantRatio?: number) {\n this.tokenCounter = tokenCounter ?? this._heuristicTokens.bind(this);\n this.importantRatio = importantRatio ?? 0.6;\n }\n\n private _heuristicTokens(text: string): number {\n const charEst = Math.ceil(text.length / 4);\n const words = text.split(/\\s+/).filter((w) => w.length > 0);\n const wordEst = Math.ceil(words.length * 1.3);\n return Math.max(charEst, Math.max(1, wordEst));\n }\n\n private estimateTokens(text: string): number {\n return this.tokenCounter(text);\n }\n\n /**\n * Truncate text to fit within a token budget, preserving whole words.\n * Appends \"...\" when content is cut. Falls back to character-based\n * truncation for text with few/no word boundaries.\n */\n private truncateToTokens(text: string, maxTokens: number): string {\n if (this.estimateTokens(text) <= maxTokens) return text;\n\n const words = text.split(/\\s+/);\n const targetWords = Math.max(1, Math.floor(maxTokens / 1.3));\n let currentTokens = 0;\n let i = 0;\n for (; i < words.length && i < targetWords; i++) {\n currentTokens += this.estimateTokens(words[i]);\n if (currentTokens > maxTokens) break;\n }\n if (i >= words.length) return text;\n if (i > 0) return words.slice(0, i).join(\" \") + \"...\";\n\n // Single long word (e.g., JSON): fall back to character-based cut\n const charLimit = maxTokens * 4;\n return text.slice(0, charLimit) + \"...\";\n }\n\n compile(memories: Memory[], options: ContextOptions): CompiledContext {\n const maxTokens = options.maxTokens ?? 2000;\n\n const relevant = memories.filter((m) => {\n if (options.memoryTypes && options.memoryTypes.length > 0) {\n return options.memoryTypes.includes(m.memoryType);\n }\n return true;\n });\n\n const sortedRecent = [...relevant].sort(\n (a, b) => b.createdAt.getTime() - a.createdAt.getTime()\n );\n\n const sortedImportant = this.deduplicate(\n [...relevant]\n .filter((m) => m.importance >= 0.5)\n .sort((a, b) => b.importance - a.importance)\n );\n\n const { recentMemories, importantMemories, systemPrompt } =\n this.assembleTokenBudgeted(sortedRecent, sortedImportant, maxTokens);\n\n const tokenEstimate = this.estimateTokens(systemPrompt);\n\n if (options.format === \"messages\") {\n return {\n systemPrompt,\n messages: [{ role: \"system\", content: systemPrompt }],\n recentMemories,\n importantMemories,\n tokenEstimate,\n };\n }\n\n return { systemPrompt, recentMemories, importantMemories, tokenEstimate };\n }\n\n private assembleTokenBudgeted(\n recent: Memory[],\n important: Memory[],\n maxTokens: number\n ): { recentMemories: Memory[]; importantMemories: Memory[]; systemPrompt: string } {\n const includedImportant: Memory[] = [];\n const includedRecent: Memory[] = [];\n const seen = new Set<string>();\n let usedTokens = 0;\n\n // Add important memories first (signal over recency)\n for (const m of important) {\n if (seen.has(m.id)) continue;\n const prefix = `- `;\n const suffix = ` (${m.memoryType}, importance: ${m.importance.toFixed(2)})\\n`;\n const overhead = this.estimateTokens(prefix + suffix);\n let tokens = this.estimateTokens(m.content) + overhead;\n const remaining = Math.floor(maxTokens * this.importantRatio) - usedTokens;\n if (remaining <= 0) break;\n if (tokens > remaining) {\n const contentBudget = Math.max(0, remaining - overhead);\n if (contentBudget > 0) {\n const truncatedContent = this.truncateToTokens(m.content, contentBudget);\n includedImportant.push({ ...m, content: truncatedContent });\n tokens = this.estimateTokens(truncatedContent) + overhead;\n usedTokens += tokens;\n seen.add(m.id);\n }\n } else {\n includedImportant.push(m);\n usedTokens += tokens;\n seen.add(m.id);\n }\n }\n\n // Add recent memories until budget is full\n for (const m of recent) {\n if (seen.has(m.id)) continue;\n const prefix = `- `;\n const suffix = `\\n`;\n const overhead = this.estimateTokens(prefix + suffix);\n let tokens = this.estimateTokens(m.content) + overhead;\n const remaining = maxTokens - usedTokens;\n if (remaining <= 0) break;\n if (tokens > remaining) {\n const contentBudget = Math.max(0, remaining - overhead);\n if (contentBudget > 0) {\n const truncatedContent = this.truncateToTokens(m.content, contentBudget);\n includedRecent.push({ ...m, content: truncatedContent });\n tokens = this.estimateTokens(truncatedContent) + overhead;\n usedTokens += tokens;\n seen.add(m.id);\n }\n } else {\n includedRecent.push(m);\n usedTokens += tokens;\n seen.add(m.id);\n }\n }\n\n const parts: string[] = [];\n if (includedImportant.length > 0) {\n parts.push(\"## Important Memories\");\n for (const m of includedImportant) {\n parts.push(`- ${m.content} (${m.memoryType}, importance: ${m.importance.toFixed(2)})`);\n }\n }\n if (includedRecent.length > 0) {\n parts.push(\"\\n## Recent Interactions\");\n for (const m of includedRecent) {\n parts.push(`- ${m.content}`);\n }\n }\n\n return { recentMemories: includedRecent, importantMemories: includedImportant, systemPrompt: parts.join(\"\\n\") };\n }\n\n private deduplicate(memories: Memory[]): Memory[] {\n const seen = new Set<string>();\n const result: Memory[] = [];\n for (const m of memories) {\n const key = m.content.toLowerCase().trim();\n if (!seen.has(key)) {\n seen.add(key);\n result.push(m);\n }\n }\n return result;\n }\n}\n","import type { Memory, CompiledContext, MemoryStats } from \"../types.js\";\nimport type {\n StorageProvider,\n EmbeddingProvider,\n LLMProvider,\n MemoryStoreInput,\n MemoryRetrieveQuery,\n MemoryCountFilter,\n ContextOptions,\n SummarizeOptions,\n PruneStrategy,\n TokenCounter,\n} from \"../interfaces.js\";\nimport { Summarizer } from \"./Summarizer.js\";\nimport { Pruner } from \"./Pruner.js\";\nimport { ContextCompiler } from \"./ContextCompiler.js\";\nimport { notFound, validationError } from \"../errors.js\";\n\nexport interface MemoryStoreConfig {\n storage: StorageProvider;\n embedding?: EmbeddingProvider;\n llm?: LLMProvider;\n embedOnStore?: boolean;\n summarizationPrompt?: string;\n tokenCounter?: TokenCounter;\n contextImportantRatio?: number;\n limits?: {\n dedupScan?: number;\n contextScan?: number;\n summarizeScan?: number;\n pruneScan?: number;\n exportScan?: number;\n purgeScan?: number;\n };\n}\n\nexport class MemoryStore {\n private storage: StorageProvider;\n private embedding?: EmbeddingProvider;\n private summarizer?: Summarizer;\n private pruner: Pruner;\n private compiler: ContextCompiler;\n private embedOnStore: boolean;\n private limits: Required<NonNullable<MemoryStoreConfig[\"limits\"]>>;\n private contentHashIndex: Map<string, string> | null = null;\n private initialized = false;\n\n private async _ensureInit(): Promise<void> {\n if (!this.initialized) {\n await this.storage.initialize();\n this.initialized = true;\n }\n }\n\n constructor(config: MemoryStoreConfig) {\n this.storage = config.storage;\n this.embedding = config.embedding;\n this.embedOnStore = config.embedOnStore ?? true;\n if (config.llm) {\n this.summarizer = new Summarizer(config.llm, config.summarizationPrompt);\n }\n this.pruner = new Pruner();\n this.compiler = new ContextCompiler(config.tokenCounter, config.contextImportantRatio);\n this.limits = {\n dedupScan: 1000,\n contextScan: 50,\n summarizeScan: 1000,\n pruneScan: 10000,\n exportScan: 100000,\n purgeScan: 100000,\n ...config.limits,\n };\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n await this._ensureInit();\n if (input.onConflict === \"append\") {\n await this._ensureHashIndex();\n const hash = this._hashContent(input.actorId, input.content);\n const existingId = this.contentHashIndex!.get(hash);\n if (existingId) {\n const match = await this.storage.get(existingId);\n if (match) {\n const mergedTags = [...new Set([...(match.tags ?? []), ...(input.tags ?? [])])];\n const updated = await this.storage.store({\n id: match.id,\n actorId: match.actorId,\n content: match.content,\n memoryType: match.memoryType,\n importance: input.importance ?? match.importance,\n emotionalValence: input.emotionalValence ?? match.emotionalValence,\n tags: mergedTags,\n embedding: match.embedding,\n sourceId: input.sourceId ?? match.sourceId,\n metadata: { ...match.metadata, ...input.metadata },\n expiresAt: input.expiresAt ?? match.expiresAt,\n });\n this.contentHashIndex!.set(hash, updated.id);\n return updated;\n }\n }\n }\n\n let withEmbedding = input;\n if (this.embedding && this.embedOnStore) {\n const embeddings = await this.embedding.embed([input.content]);\n withEmbedding = { ...input, embedding: embeddings[0] };\n }\n const { onConflict: _, ...clean } = withEmbedding;\n const memory = await this.storage.store(clean);\n if (this.contentHashIndex !== null) {\n const hash = this._hashContent(memory.actorId, memory.content);\n this.contentHashIndex.set(hash, memory.id);\n }\n return memory;\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n await this._ensureInit();\n const appendInputs = inputs.filter((i) => i.onConflict === \"append\");\n const normalInputs = inputs.filter((i) => i.onConflict !== \"append\");\n\n const results: Memory[] = [];\n\n for (const input of appendInputs) {\n results.push(await this.store(input));\n }\n\n if (normalInputs.length === 0) return results;\n\n let stored: Memory[];\n if (this.embedding && this.embedOnStore) {\n const enrichedResults: Memory[] = [];\n const batchSize = this.embedding.maxBatchSize ?? 2048;\n for (let i = 0; i < normalInputs.length; i += batchSize) {\n const batch = normalInputs.slice(i, i + batchSize);\n const texts = batch.map((inp) => inp.content);\n const embeddings = await this.embedding!.embed(texts);\n const enriched = batch.map((input, j) => ({ ...input, embedding: embeddings[j] }));\n const batchResults = await this.storage.storeBatch(enriched);\n enrichedResults.push(...batchResults);\n }\n stored = enrichedResults;\n } else {\n stored = await this.storage.storeBatch(normalInputs);\n }\n\n if (this.contentHashIndex !== null) {\n for (const mem of stored) {\n const hash = this._hashContent(mem.actorId, mem.content);\n this.contentHashIndex.set(hash, mem.id);\n }\n }\n\n results.push(...stored);\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n await this._ensureInit();\n return this.storage.get(id);\n }\n\n async delete(id: string): Promise<void> {\n await this._ensureInit();\n return this.storage.delete(id);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n await this._ensureInit();\n return this.storage.deleteMany(ids);\n }\n\n async touch(id: string): Promise<void> {\n await this._ensureInit();\n const memory = await this.storage.get(id);\n if (!memory) throw notFound(\"Memory\", id);\n if (this.storage.touch) {\n return this.storage.touch(id);\n }\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n await this._ensureInit();\n return this.storage.count(filter);\n }\n\n async retrieve(query: MemoryRetrieveQuery): Promise<Memory[]> {\n await this._ensureInit();\n let embedding: number[] | undefined;\n if (this.embedding && query.query && (query.strategy === \"semantic\" || query.strategy === \"hybrid\")) {\n const vecs = await this.embedding.embed([query.query]);\n embedding = vecs[0];\n }\n let results = await this.storage.retrieve(query, embedding);\n if (query.createdAfter) {\n results = results.filter((m) => m.createdAt >= query.createdAfter!);\n }\n if (query.createdBefore) {\n results = results.filter((m) => m.createdAt <= query.createdBefore!);\n }\n return results;\n }\n\n async compileContext(options: ContextOptions): Promise<CompiledContext> {\n await this._ensureInit();\n const maxTokens = options.maxTokens ?? 2000;\n const memories = await this.storage.retrieve({\n actorId: options.actorId,\n limit: this.limits.contextScan,\n strategy: options.retrieveStrategy,\n });\n return this.compiler.compile(memories, { ...options, maxTokens });\n }\n\n async summarize(\n options: SummarizeOptions,\n onError?: (err: Error) => void\n ): Promise<{ summary: Memory; deletedCount: number }> {\n await this._ensureInit();\n if (!this.summarizer) {\n throw validationError(\"No LLM configured for summarization\");\n }\n\n const allMemories = await this.storage.retrieve({\n actorId: options.actorId,\n memoryTypes: options.memoryTypes ?? [\"interaction\"],\n limit: this.limits.summarizeScan,\n strategy: \"recent\",\n });\n\n let toSummarize = allMemories;\n if (options.olderThan) {\n toSummarize = toSummarize.filter((m) => m.createdAt < options.olderThan!);\n }\n if (options.skipMostRecent) {\n const sorted = [...toSummarize].sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n toSummarize = sorted.slice(0, Math.max(0, sorted.length - options.skipMostRecent));\n }\n if (options.targetCount && toSummarize.length > options.targetCount) {\n const sorted = [...toSummarize].sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n toSummarize = sorted.slice(0, options.targetCount);\n }\n\n if (toSummarize.length === 0) {\n throw validationError(\"No memories to summarize\");\n }\n\n let summaryContent: string;\n try {\n const result = await this.summarizer.summarize(toSummarize, options, options.prompt);\n summaryContent = result.summaryContent;\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n throw err;\n }\n\n const summary: Memory = await this.storage.store({\n actorId: options.actorId ?? toSummarize[0].actorId,\n content: summaryContent,\n memoryType: \"summary\",\n importance: Math.max(...toSummarize.map((m) => m.importance)),\n emotionalValence:\n toSummarize.reduce((sum, m) => sum + m.emotionalValence, 0) / toSummarize.length,\n tags: [\"summary\"],\n sourceId: toSummarize[0].id,\n });\n\n let deletedCount = 0;\n if (!options.keepOriginals) {\n const ids = toSummarize.map((m) => m.id);\n deletedCount = await this.storage.deleteMany(ids);\n }\n\n return { summary, deletedCount };\n }\n\n async *summarizeStream(options: SummarizeOptions): AsyncIterable<{ chunk: string; text: string }> {\n await this._ensureInit();\n if (!this.summarizer) {\n throw validationError(\"No LLM configured for summarization\");\n }\n\n const allMemories = await this.storage.retrieve({\n actorId: options.actorId,\n memoryTypes: options.memoryTypes ?? [\"interaction\"],\n limit: this.limits.summarizeScan,\n strategy: \"recent\",\n });\n\n let toSummarize = allMemories;\n if (options.olderThan) {\n toSummarize = toSummarize.filter((m) => m.createdAt < options.olderThan!);\n }\n if (options.skipMostRecent) {\n const sorted = [...toSummarize].sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n toSummarize = sorted.slice(0, Math.max(0, sorted.length - options.skipMostRecent));\n }\n if (options.targetCount && toSummarize.length > options.targetCount) {\n const sorted = [...toSummarize].sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n toSummarize = sorted.slice(0, options.targetCount);\n }\n\n if (toSummarize.length === 0) {\n throw validationError(\"No memories to summarize\");\n }\n\n yield* this.summarizer.summarizeStream(toSummarize, options, options.prompt);\n }\n\n async prune(strategy: PruneStrategy): Promise<{ pruned: string[]; count: number }> {\n await this._ensureInit();\n const allMemories = await this.storage.retrieve({ actorId: strategy.actorId, limit: this.limits.pruneScan });\n const kept = this.pruner.execute(allMemories, strategy);\n const keptIds = new Set(kept.map((k) => k.id));\n const prunedIds = allMemories.filter((m) => !keptIds.has(m.id)).map((m) => m.id);\n let count = 0;\n if (prunedIds.length > 0) {\n count = await this.storage.deleteMany(prunedIds);\n }\n return { pruned: prunedIds, count };\n }\n\n async dryRunPrune(strategy: PruneStrategy): Promise<{ wouldPrune: string[]; count: number }> {\n await this._ensureInit();\n const allMemories = await this.storage.retrieve({ actorId: strategy.actorId, limit: this.limits.pruneScan });\n const kept = this.pruner.execute(allMemories, strategy);\n const keptIds = new Set(kept.map((k) => k.id));\n const wouldPrune = allMemories.filter((m) => !keptIds.has(m.id)).map((m) => m.id);\n return { wouldPrune, count: wouldPrune.length };\n }\n\n async export(actorId?: string): Promise<Memory[]> {\n await this._ensureInit();\n return this.storage.retrieve({ actorId, limit: this.limits.exportScan });\n }\n\n async stats(actorId?: string): Promise<MemoryStats> {\n await this._ensureInit();\n const memories = await this.storage.retrieve({ actorId, limit: this.limits.exportScan });\n const now = new Date();\n const byType: Record<string, number> = {};\n const byActor: Record<string, { count: number; oldest: Date; newest: Date; totalImportance: number }> = {};\n let totalImportance = 0;\n let expired = 0;\n let oldest: Date | null = null;\n let newest: Date | null = null;\n\n for (const m of memories) {\n totalImportance += m.importance;\n byType[m.memoryType] = (byType[m.memoryType] ?? 0) + 1;\n\n const actor = byActor[m.actorId] ?? { count: 0, oldest: m.createdAt, newest: m.createdAt, totalImportance: 0 };\n actor.count++;\n actor.totalImportance += m.importance;\n if (m.createdAt < actor.oldest) actor.oldest = m.createdAt;\n if (m.createdAt > actor.newest) actor.newest = m.createdAt;\n byActor[m.actorId] = actor;\n\n if (m.expiresAt && m.expiresAt <= now) expired++;\n if (!oldest || m.createdAt < oldest) oldest = m.createdAt;\n if (!newest || m.createdAt > newest) newest = m.createdAt;\n }\n\n const byActorFinal: MemoryStats[\"byActor\"] = {};\n for (const [id, a] of Object.entries(byActor)) {\n byActorFinal[id] = { count: a.count, oldest: a.oldest, newest: a.newest, avgImportance: a.totalImportance / a.count };\n }\n\n return {\n total: memories.length,\n expired,\n oldest,\n newest,\n avgImportance: memories.length > 0 ? totalImportance / memories.length : 0,\n byType: byType as Record<string, number>,\n byActor: byActorFinal,\n };\n }\n\n async purgeActor(actorId: string): Promise<number> {\n await this._ensureInit();\n const memories = await this.storage.retrieve({ actorId, limit: this.limits.purgeScan ?? 100000 });\n if (memories.length === 0) return 0;\n return this.storage.deleteMany(memories.map((m) => m.id));\n }\n\n async merge(ids: string[]): Promise<Memory> {\n await this._ensureInit();\n if (ids.length < 2) throw validationError(\"merge requires at least 2 memory IDs\");\n\n const memories: Memory[] = [];\n for (const id of ids) {\n const m = await this.storage.get(id);\n if (m) memories.push(m);\n }\n if (memories.length < 2) throw validationError(\"At least 2 of the provided IDs must exist\");\n\n const sorted = memories.sort((a, b) => b.importance - a.importance);\n const winner = sorted[0];\n const rest = sorted.slice(1);\n\n const mergedContent = [\n winner.content,\n \"\",\n \"--- merged from \" + rest.length + \" related memories ---\",\n ...rest.map((m) => \"- \" + m.content),\n ].join(\"\\n\");\n\n const mergedTags = [...new Set(memories.flatMap((m) => m.tags))];\n const mergedMetadata = {\n ...winner.metadata,\n mergedFrom: rest.map((m) => m.id),\n };\n\n const updated = await this.storage.store({\n id: winner.id,\n actorId: winner.actorId,\n content: mergedContent,\n memoryType: winner.memoryType,\n importance: winner.importance,\n emotionalValence: winner.emotionalValence,\n tags: mergedTags,\n embedding: winner.embedding,\n sourceId: winner.sourceId,\n metadata: mergedMetadata,\n expiresAt: winner.expiresAt,\n });\n\n await this.storage.deleteMany(rest.map((m) => m.id));\n\n return updated;\n }\n\n private async _ensureHashIndex(): Promise<void> {\n if (this.contentHashIndex !== null) return;\n this.contentHashIndex = new Map();\n const existing = await this.storage.retrieve({ limit: this.limits.dedupScan });\n for (const m of existing) {\n const hash = this._hashContent(m.actorId, m.content);\n this.contentHashIndex.set(hash, m.id);\n }\n }\n\n private _hashContent(actorId: string, content: string): string {\n const normalized = `${actorId}::${content.toLowerCase().trim()}`;\n let hash = 14695981039346656037n;\n for (let i = 0; i < normalized.length; i++) {\n hash ^= BigInt(normalized.charCodeAt(i));\n hash *= 1099511628211n;\n }\n return hash.toString(36);\n }\n}\n","import type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter } from \"../../interfaces.js\";\nimport { notFound } from \"../../errors.js\";\n\ninterface MemoryRecord extends Memory {\n _touchedAt: Date;\n}\n\nexport class InMemoryStorageAdapter implements StorageProvider {\n private memories: Map<string, MemoryRecord> = new Map();\n\n async initialize(): Promise<void> {}\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date();\n const memory: MemoryRecord = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? now,\n _touchedAt: now,\n };\n this.memories.set(memory.id, memory);\n return memory;\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const results: Memory[] = [];\n for (const input of inputs) {\n results.push(await this.store(input));\n }\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n const memory = this.memories.get(id);\n if (!memory) return null;\n if (memory.expiresAt && memory.expiresAt <= new Date()) {\n this.memories.delete(id);\n return null;\n }\n return memory;\n }\n\n async delete(id: string): Promise<void> {\n if (!this.memories.has(id)) throw notFound(\"Memory\", id);\n this.memories.delete(id);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n let count = 0;\n for (const id of ids) {\n if (this.memories.has(id)) {\n this.memories.delete(id);\n count++;\n }\n }\n return count;\n }\n\n async retrieve(query: MemoryRetrieveQuery, _embedding?: number[]): Promise<Memory[]> {\n let results = Array.from(this.memories.values());\n\n // Filter out expired\n const now = new Date();\n results = results.filter((m) => !m.expiresAt || m.expiresAt > now);\n\n if (query.actorId) {\n results = results.filter((m) => m.actorId === query.actorId);\n }\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n results = results.filter((m) => query.memoryTypes!.includes(m.memoryType));\n }\n if (query.tags && query.tags.length > 0) {\n results = results.filter((m) => m.tags?.some((t) => query.tags!.includes(t)));\n }\n if (query.query) {\n const terms = query.query.toLowerCase().split(/\\s+/).filter(Boolean);\n results = results.filter((m) => {\n const content = m.content.toLowerCase();\n return terms.some((t) => content.includes(t));\n });\n }\n if (query.createdAfter) {\n results = results.filter((m) => m.createdAt >= query.createdAfter!);\n }\n if (query.createdBefore) {\n results = results.filter((m) => m.createdAt <= query.createdBefore!);\n }\n\n switch (query.strategy) {\n case \"recent\":\n results.sort((a, b) => b._touchedAt.getTime() - a._touchedAt.getTime());\n break;\n case \"important\":\n results.sort((a, b) => b.importance - a.importance);\n break;\n case \"hybrid\":\n case \"semantic\":\n default:\n results.sort((a, b) => b.importance - a.importance || b._touchedAt.getTime() - a._touchedAt.getTime());\n break;\n }\n\n // Touch records on retrieval (for recency tracking in context assembly)\n for (const r of results.slice(0, query.limit ?? 10)) {\n r._touchedAt = new Date();\n }\n\n const limit = query.limit ?? 10;\n return results.slice(0, limit);\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n const now = new Date();\n let results = Array.from(this.memories.values())\n .filter((m) => !m.expiresAt || m.expiresAt > now);\n\n if (filter?.actorId) {\n results = results.filter((m) => m.actorId === filter.actorId);\n }\n if (filter?.memoryType) {\n results = results.filter((m) => m.memoryType === filter.memoryType);\n }\n if (filter?.minImportance !== undefined) {\n results = results.filter((m) => m.importance >= filter.minImportance!);\n }\n return results.length;\n }\n\n async touch(id: string): Promise<void> {\n const memory = this.memories.get(id);\n if (!memory) throw notFound(\"Memory\", id);\n memory._touchedAt = new Date();\n }\n\n async close(): Promise<void> {\n this.memories.clear();\n }\n\n getAllMemories(): Memory[] {\n return Array.from(this.memories.values());\n }\n}\n","import type { Memory, ProcessResult, MemStackSnapshot, HealthStatus } from \"./types.js\";\nimport type { MemStackConfig, ProcessInput, MemoryStoreInput, StorageProvider } from \"./interfaces.js\";\nimport { MemoryStore } from \"./memory/MemoryStore.js\";\nimport { InMemoryStorageAdapter } from \"./adapters/storage/memory.js\";\nimport { configError, validationError } from \"./errors.js\";\n\nexport class MemStack {\n readonly memory: MemoryStore;\n\n private config: MemStackConfig;\n private storage: StorageProvider;\n private processCounts = new Map<string, number>();\n private pruneCheckCount = 0;\n\n constructor(config: MemStackConfig) {\n if (!config.llm) {\n throw configError(\"LLM provider is required\");\n }\n\n this.config = config;\n this.storage = config.storage ?? new InMemoryStorageAdapter();\n\n this.memory = new MemoryStore({\n storage: this.storage,\n embedding: config.embedding,\n llm: config.llm,\n embedOnStore: config.defaults?.embedOnStore ?? true,\n summarizationPrompt: config.defaults?.summarizationPrompt,\n });\n }\n\n async process(input: ProcessInput): Promise<ProcessResult> {\n // Auto-enrichment: importance + tags via LLM when not provided\n let importance = input.importance;\n let tags = input.tags;\n\n const needImportance = importance === undefined && this.config.defaults?.autoImportance;\n const needTags = (!tags || tags.length === 0) && this.config.defaults?.autoTags;\n\n if (needImportance || needTags) {\n try {\n if (needImportance && needTags) {\n // Batch both into one LLM call\n const result = await this.config.llm.complete({\n system:\n \"Analyze the memory and respond with a JSON object: {\\\"importance\\\": <0.0-1.0>, \\\"tags\\\": [<array of 1-5 lowercase single-word tags>]}. Return ONLY the JSON, nothing else.\",\n user: input.content,\n maxTokens: 100,\n temperature: 0,\n });\n const parsed = this._parseEnrichmentJson(result.text);\n if (parsed.importance !== undefined) importance = parsed.importance;\n if (parsed.tags) tags = parsed.tags;\n } else if (needImportance) {\n const result = await this.config.llm.complete({\n system:\n \"Rate the importance of the following memory for an AI agent on a scale of 0.0 to 1.0, where 0.0 is trivial and 1.0 is critical. Return ONLY a single float number, nothing else.\",\n user: input.content,\n maxTokens: 10,\n temperature: 0,\n });\n const parsed = parseFloat(result.text.trim());\n importance = Number.isFinite(parsed) ? Math.max(0, Math.min(1, parsed)) : 0.5;\n } else if (needTags) {\n const result = await this.config.llm.complete({\n system:\n \"Extract 1-5 concise, lowercase, single-word tags from the following memory. Return ONLY a JSON array of strings, nothing else. Example: [\\\"combat\\\", \\\"goblin\\\", \\\"forest\\\"]\",\n user: input.content,\n maxTokens: 80,\n temperature: 0,\n });\n tags = this._parseTagsJson(result.text);\n }\n } catch (err) {\n this.config.hooks?.onError?.(\n err instanceof Error ? err : new Error(String(err)),\n \"auto-enrich\"\n );\n if (importance === undefined) importance = 0.5;\n if (!tags) tags = [];\n }\n }\n\n const memoryInput: MemoryStoreInput = {\n actorId: input.actorId,\n content: input.content,\n memoryType: input.memoryType ?? \"interaction\",\n importance: importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: tags ?? [],\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n onConflict: input.onConflict,\n };\n\n const memory = await this.memory.store(memoryInput);\n this.config.hooks?.onMemoryStored?.(memory);\n\n const count = (this.processCounts.get(input.actorId) ?? 0) + 1;\n this.processCounts.set(input.actorId, count);\n\n // Auto-summarize if threshold is hit\n let summaryCreated: Memory | undefined;\n const threshold = this.config.defaults?.summarizationThreshold ?? 100;\n if (threshold > 0 && count % threshold === 0) {\n try {\n const result = await this.memory.summarize(\n {\n actorId: input.actorId,\n memoryTypes: [\"interaction\"],\n skipMostRecent: 5,\n targetCount: Math.min(15, count),\n },\n this.config.hooks?.onError\n ? (err) => this.config.hooks!.onError!(err, \"summarize\")\n : undefined\n );\n summaryCreated = result.summary;\n this.config.hooks?.onSummaryCreated?.(result.summary, result.deletedCount);\n } catch (err) {\n this.config.hooks?.onError?.(\n err instanceof Error ? err : new Error(String(err)),\n \"summarize\"\n );\n }\n }\n\n // Auto-prune if configured (throttled)\n this.pruneCheckCount++;\n const pruneStrategy = this.config.defaults?.pruneStrategy;\n const pruneInterval = this.config.defaults?.pruneInterval ?? 100;\n if (pruneStrategy && this.pruneCheckCount % pruneInterval === 0) {\n try {\n const pruneResult = await this.memory.prune(pruneStrategy);\n if (pruneResult.count > 0) {\n this.config.hooks?.onMemoryPruned?.(pruneResult.pruned);\n }\n } catch (err) {\n this.config.hooks?.onError?.(\n err instanceof Error ? err : new Error(String(err)),\n \"prune\"\n );\n }\n }\n\n return { memory, summaryCreated };\n }\n\n async export(actorId?: string): Promise<MemStackSnapshot> {\n const memories = await this.memory.export(actorId);\n return {\n version: 1,\n memories,\n exportedAt: new Date().toISOString(),\n };\n }\n\n async import(snapshot: MemStackSnapshot): Promise<void> {\n if (snapshot.version !== 1) {\n throw validationError(`Unsupported snapshot version: ${snapshot.version}`);\n }\n const memories = snapshot.memories.map((m, i) => {\n const createdAt = typeof m.createdAt === \"string\" ? new Date(m.createdAt) : m.createdAt;\n const expiresAt = typeof m.expiresAt === \"string\" ? new Date(m.expiresAt) : m.expiresAt;\n const label = m.id ? `id: ${m.id}` : `index ${i}`;\n if (createdAt && isNaN(createdAt.getTime())) {\n throw validationError(`Invalid createdAt for memory (${label}): ${String(m.createdAt)}`);\n }\n if (expiresAt && isNaN(expiresAt.getTime())) {\n throw validationError(`Invalid expiresAt for memory (${label}): ${String(m.expiresAt)}`);\n }\n return { ...m, createdAt, expiresAt };\n });\n await this.memory.storeBatch(memories);\n }\n\n async health(): Promise<HealthStatus> {\n const status: HealthStatus = { storage: false, llm: false, embedding: false };\n\n try {\n await this.memory.count();\n status.storage = true;\n } catch { /* storage check failed */ }\n\n try {\n await this.config.llm.complete({ system: \"ok\", user: \"health\", maxTokens: 1 });\n status.llm = true;\n } catch { /* llm check failed */ }\n\n if (this.config.embedding) {\n try {\n await this.config.embedding.embed([\"health check\"]);\n status.embedding = true;\n } catch { /* embedding check failed */ }\n }\n\n return status;\n }\n\n async close(): Promise<void> {\n await this.storage.close();\n }\n\n private _parseEnrichmentJson(\n text: string\n ): { importance?: number; tags?: string[] } {\n try {\n const json = JSON.parse(this._extractJson(text)) as Record<string, unknown>;\n const result: { importance?: number; tags?: string[] } = {};\n if (typeof json.importance === \"number\" && Number.isFinite(json.importance)) {\n result.importance = Math.max(0, Math.min(1, json.importance));\n }\n if (\n Array.isArray(json.tags) &&\n json.tags.every((t: unknown) => typeof t === \"string\")\n ) {\n result.tags = (json.tags as string[]).map((t) => t.toLowerCase().trim()).slice(0, 5);\n }\n return result;\n } catch {\n return {};\n }\n }\n\n private _parseTagsJson(text: string): string[] {\n try {\n const parsed = JSON.parse(this._extractJson(text)) as unknown;\n if (Array.isArray(parsed) && parsed.every((t: unknown) => typeof t === \"string\")) {\n return (parsed as string[]).map((t) => t.toLowerCase().trim()).slice(0, 5);\n }\n } catch {\n // Fallback: try comma-separated\n }\n return text\n .split(\",\")\n .map((t) => t.replace(/[\\[\\]\"]/g, \"\").trim().toLowerCase())\n .filter((t) => t.length > 0)\n .slice(0, 5);\n }\n\n /** Strip markdown code fences and extract the JSON payload from LLM output. */\n private _extractJson(text: string): string {\n let cleaned = text.trim();\n // Remove ```json ... ``` or ``` ... ``` fences\n const fenceMatch = cleaned.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n if (fenceMatch) cleaned = fenceMatch[1].trim();\n return cleaned;\n }\n}\n","import { mkdir, readFile, writeFile, readdir, open, unlink, rename, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter } from \"../../interfaces.js\";\nimport { storageError, notFound } from \"../../errors.js\";\n\ninterface MemoryRecord extends Memory {\n _touchedAt: string;\n}\n\nexport interface DiskStorageConfig {\n /** Directory to store memory files. Default: \"./memstack-data\" */\n storageDir?: string;\n}\n\nexport class DiskStorageAdapter implements StorageProvider {\n private dir: string;\n private _writeLocks = new Map<string, Promise<void>>();\n private _idIndex = new Map<string, string>();\n\n constructor(config: DiskStorageConfig = {}) {\n this.dir = config.storageDir ?? \"./memstack-data\";\n }\n\n async initialize(): Promise<void> {\n await mkdir(this.dir, { recursive: true });\n await this._buildIndex();\n }\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date();\n const memory: MemoryRecord = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? now,\n _touchedAt: now.toISOString(),\n };\n\n await this._withWriteLock(input.actorId, async () => {\n const records = await this._readFile(input.actorId);\n const existingIdx = records.findIndex((r) => r.id === memory.id);\n if (existingIdx !== -1) {\n records[existingIdx] = memory;\n } else {\n records.push(memory);\n }\n this._idIndex.set(memory.id, input.actorId);\n await this._writeFile(input.actorId, records);\n });\n\n return this._toExternal(memory);\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const byActor = new Map<string, MemoryRecord[]>();\n const now = new Date();\n const all: MemoryRecord[] = [];\n\n for (const input of inputs) {\n const memory: MemoryRecord = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? now,\n _touchedAt: now.toISOString(),\n };\n all.push(memory);\n const group = byActor.get(input.actorId) ?? [];\n group.push(memory);\n byActor.set(input.actorId, group);\n }\n\n for (const [actorId, group] of byActor) {\n await this._withWriteLock(actorId, async () => {\n const existing = await this._readFile(actorId);\n for (const mem of group) {\n const existingIdx = existing.findIndex((r) => r.id === mem.id);\n if (existingIdx !== -1) {\n existing[existingIdx] = mem;\n } else {\n existing.push(mem);\n }\n this._idIndex.set(mem.id, actorId);\n }\n await this._writeFile(actorId, existing);\n });\n }\n\n return all.map((m) => this._toExternal(m));\n }\n\n async get(id: string): Promise<Memory | null> {\n const actorId = this._idIndex.get(id);\n if (actorId) {\n const records = await this._readFile(actorId);\n const record = records.find((r) => r.id === id);\n if (record) {\n if (record.expiresAt && new Date(record.expiresAt) <= new Date()) return null;\n return this._toExternal(record);\n }\n }\n const actorIds = await this._listActors();\n for (const aid of actorIds) {\n const records = await this._readFile(aid);\n const record = records.find((r) => r.id === id);\n if (record) {\n this._idIndex.set(id, aid);\n if (record.expiresAt && new Date(record.expiresAt) <= new Date()) return null;\n return this._toExternal(record);\n }\n }\n return null;\n }\n\n async delete(id: string): Promise<void> {\n let actorId = this._idIndex.get(id);\n if (!actorId) {\n const actorIds = await this._listActors();\n for (const aid of actorIds) {\n const records = await this._readFile(aid);\n if (records.some((r) => r.id === id)) { actorId = aid; break; }\n }\n }\n if (!actorId) throw notFound(\"Memory\", id);\n\n let deleted = false;\n await this._withWriteLock(actorId, async () => {\n const fresh = await this._readFile(actorId);\n const i = fresh.findIndex((r) => r.id === id);\n if (i !== -1) {\n fresh.splice(i, 1);\n this._idIndex.delete(id);\n await this._writeFile(actorId, fresh);\n deleted = true;\n }\n });\n\n if (!deleted) throw notFound(\"Memory\", id);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n const idSet = new Set(ids);\n let count = 0;\n const actorIds = await this._listActors();\n\n for (const actorId of actorIds) {\n await this._withWriteLock(actorId, async () => {\n const records = await this._readFile(actorId);\n const before = records.length;\n const filtered = records.filter((r) => !idSet.has(r.id));\n count += before - filtered.length;\n if (before !== filtered.length) {\n for (const r of records) {\n if (idSet.has(r.id)) this._idIndex.delete(r.id);\n }\n await this._writeFile(actorId, filtered);\n }\n });\n }\n\n return count;\n }\n\n async retrieve(query: MemoryRetrieveQuery, _embedding?: number[]): Promise<Memory[]> {\n const actorIds = query.actorId ? [query.actorId] : await this._listActors();\n let results: MemoryRecord[] = [];\n\n for (const actorId of actorIds) {\n let records = await this._readFile(actorId);\n const now = new Date();\n records = records.filter((r) => !r.expiresAt || new Date(r.expiresAt) > now);\n\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n records = records.filter((r) => query.memoryTypes!.includes(r.memoryType));\n }\n if (query.tags && query.tags.length > 0) {\n records = records.filter((r) => r.tags?.some((t) => query.tags!.includes(t)));\n }\n if (query.query) {\n const terms = query.query.toLowerCase().split(/\\s+/).filter(Boolean);\n records = records.filter((r) => {\n const content = r.content.toLowerCase();\n return terms.some((t) => content.includes(t));\n });\n }\n\n results.push(...records);\n }\n\n switch (query.strategy) {\n case \"recent\":\n results.sort((a, b) => new Date(b._touchedAt).getTime() - new Date(a._touchedAt).getTime());\n break;\n case \"important\":\n results.sort((a, b) => b.importance - a.importance);\n break;\n case \"hybrid\":\n case \"semantic\":\n default:\n results.sort(\n (a, b) =>\n b.importance - a.importance || new Date(b._touchedAt).getTime() - new Date(a._touchedAt).getTime()\n );\n break;\n }\n\n // Touch records on retrieval\n const nowStr = new Date().toISOString();\n const toTouch = results.slice(0, query.limit ?? 10);\n const touchedActors = new Set<string>();\n for (const r of toTouch) {\n r._touchedAt = nowStr;\n touchedActors.add(r.actorId);\n }\n // Persist touches back to disk\n for (const actorId of touchedActors) {\n await this._withWriteLock(actorId, async () => {\n const records = await this._readFile(actorId);\n let changed = false;\n for (const r of records) {\n const touched = toTouch.find((t) => t.id === r.id);\n if (touched) { r._touchedAt = nowStr; changed = true; }\n }\n if (changed) await this._writeFile(actorId, records);\n });\n }\n\n const limit = query.limit ?? 10;\n return results.slice(0, limit).map((r) => this._toExternal(r));\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n const actorIds = filter?.actorId ? [filter.actorId] : await this._listActors();\n let total = 0;\n const now = new Date();\n\n for (const actorId of actorIds) {\n let records = await this._readFile(actorId);\n records = records.filter((r) => !r.expiresAt || new Date(r.expiresAt) > now);\n\n if (filter?.memoryType) {\n records = records.filter((r) => r.memoryType === filter.memoryType);\n }\n if (filter?.minImportance !== undefined) {\n records = records.filter((r) => r.importance >= filter.minImportance!);\n }\n total += records.length;\n }\n\n return total;\n }\n\n async touch(id: string): Promise<void> {\n const actorId = this._idIndex.get(id);\n if (!actorId) throw notFound(\"Memory\", id);\n\n const nowStr = new Date().toISOString();\n await this._withWriteLock(actorId, async () => {\n const fresh = await this._readFile(actorId);\n const match = fresh.find((r) => r.id === id);\n if (!match) throw notFound(\"Memory\", id);\n match._touchedAt = nowStr;\n await this._writeFile(actorId, fresh);\n });\n }\n\n async close(): Promise<void> {\n this._writeLocks.clear();\n }\n\n // ── Internal ──\n\n private _filePath(actorId: string): string {\n const safe = actorId.replace(/[^a-zA-Z0-9_\\-.,@]/g, \"_\");\n return join(this.dir, `${safe}.json`);\n }\n\n private async _readFile(actorId: string): Promise<MemoryRecord[]> {\n try {\n const raw = await readFile(this._filePath(actorId), \"utf-8\");\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as MemoryRecord[]) : [];\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw storageError(`Failed to read memories for actor ${actorId}: ${(err as Error).message}`);\n }\n }\n\n private async _writeFile(actorId: string, records: MemoryRecord[]): Promise<void> {\n const filePath = this._filePath(actorId);\n // Write-then-rename instead of an in-place write: `rename` is atomic on\n // POSIX filesystems, so a concurrent reader (get/retrieve, which don't\n // take the write lock) never observes a partially-written file.\n const tmpPath = `${filePath}.${process.pid}.${Date.now().toString(36)}.tmp`;\n try {\n await writeFile(tmpPath, JSON.stringify(records, null, 2), \"utf-8\");\n await rename(tmpPath, filePath);\n } catch (err) {\n await unlink(tmpPath).catch(() => {});\n throw storageError(`Failed to write memories for actor ${actorId}: ${(err as Error).message}`);\n }\n }\n\n private async _withWriteLock(actorId: string, fn: () => Promise<void>): Promise<void> {\n // In-process serialization: cheap, and avoids every same-process caller\n // hitting the cross-process lockfile's retry loop for no reason.\n const prev = this._writeLocks.get(actorId) ?? Promise.resolve();\n let resolve!: () => void;\n const next = new Promise<void>((r) => { resolve = r; });\n this._writeLocks.set(actorId, next);\n await prev;\n // Cross-process serialization: the in-process chain above only protects\n // callers sharing this adapter instance. Separate OS processes (e.g. two\n // `memstack` CLI invocations, or multiple server workers) each have their\n // own instance and their own copy of `_writeLocks`, so without this an\n // interleaved read-modify-write across processes silently loses updates.\n const releaseFileLock = await this._acquireFileLock(actorId);\n try {\n await fn();\n } finally {\n await releaseFileLock();\n resolve();\n // Clean up: only remove this entry if it hasn't been replaced by a newer lock\n if (this._writeLocks.get(actorId) === next) {\n this._writeLocks.delete(actorId);\n }\n }\n }\n\n /**\n * Acquires an exclusive cross-process lock for `actorId` via `open(path, \"wx\")`\n * (atomic create-if-absent). Retries with jittered backoff while the lock is\n * held elsewhere, and steals locks left behind by a crashed process once\n * they're older than `staleMs`.\n */\n private async _acquireFileLock(actorId: string): Promise<() => Promise<void>> {\n const lockPath = `${this._filePath(actorId)}.lock`;\n const staleMs = 10_000;\n const timeoutMs = 30_000;\n const start = Date.now();\n\n while (true) {\n try {\n const handle = await open(lockPath, \"wx\");\n await handle.close();\n return async () => {\n await unlink(lockPath).catch(() => {});\n };\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw storageError(`Failed to acquire lock for actor ${actorId}: ${(err as Error).message}`);\n }\n try {\n const st = await stat(lockPath);\n if (Date.now() - st.mtimeMs > staleMs) {\n await unlink(lockPath).catch(() => {});\n continue;\n }\n } catch {\n continue; // lock file disappeared between EEXIST and stat — retry immediately\n }\n if (Date.now() - start > timeoutMs) {\n throw storageError(`Timed out waiting for disk storage lock: ${lockPath}`);\n }\n await new Promise((r) => setTimeout(r, 15 + Math.random() * 35));\n }\n }\n }\n\n private async _listActors(): Promise<string[]> {\n try {\n const entries = await readdir(this.dir);\n return entries.filter((e) => e.endsWith(\".json\")).map((e) => e.slice(0, -5));\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw storageError(`Failed to list actors: ${(err as Error).message}`);\n }\n }\n\n private async _buildIndex(): Promise<void> {\n const actorIds = await this._listActors();\n for (const actorId of actorIds) {\n const records = await this._readFile(actorId);\n for (const r of records) {\n this._idIndex.set(r.id, actorId);\n }\n }\n }\n\n private _toExternal(record: MemoryRecord): Memory {\n const { _touchedAt: _, ...rest } = record;\n return {\n ...rest,\n createdAt: new Date(record.createdAt),\n expiresAt: record.expiresAt ? new Date(record.expiresAt) : undefined,\n };\n }\n}\n","import { mkdir, readFile, writeFile, appendFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter } from \"../../interfaces.js\";\nimport { storageError, notFound } from \"../../errors.js\";\n\nexport interface MarkdownStorageConfig {\n dir: string;\n oneFilePerActor?: boolean;\n}\n\nexport class MarkdownStorageAdapter implements StorageProvider {\n private dir: string;\n private oneFilePerActor: boolean;\n private _cache: Map<string, Memory> | null = null;\n private _deletedIds: Set<string> = new Set();\n private _cacheDirty: boolean = true;\n\n constructor(config: MarkdownStorageConfig) {\n this.dir = config.dir;\n this.oneFilePerActor = config.oneFilePerActor ?? true;\n }\n\n async initialize(): Promise<void> {\n await mkdir(this.dir, { recursive: true });\n }\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date();\n const memory: Memory = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? now,\n };\n\n const filePath = this._filePath(input.actorId);\n const block = this._formatBlock(memory);\n await appendFile(filePath, block, \"utf-8\");\n this._cacheDirty = true;\n return memory;\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const results: Memory[] = [];\n for (const input of inputs) {\n results.push(await this.store(input));\n }\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n await this._ensureCache();\n const memory = this._cache!.get(id);\n if (!memory) return null;\n if (memory.expiresAt && memory.expiresAt <= new Date()) return null;\n if (this._deletedIds.has(id)) return null;\n return memory;\n }\n\n async delete(id: string): Promise<void> {\n await this._ensureCache();\n const memory = this._cache!.get(id);\n if (!memory || this._deletedIds.has(id)) {\n throw notFound(\"Memory\", id);\n }\n if (memory.expiresAt && memory.expiresAt <= new Date()) {\n throw notFound(\"Memory\", id);\n }\n\n const filePath = this._filePath(memory.actorId);\n const tombstone = this._formatTombstone(id);\n await appendFile(filePath, tombstone, \"utf-8\");\n this._cacheDirty = true;\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n await this._ensureCache();\n const idSet = new Set(ids);\n \n const toDelete: { id: string; actorId: string }[] = [];\n for (const id of ids) {\n const memory = this._cache!.get(id);\n if (memory && !this._deletedIds.has(id)) {\n if (!memory.expiresAt || memory.expiresAt > new Date()) {\n toDelete.push({ id, actorId: memory.actorId });\n }\n }\n }\n\n const byActor = new Map<string, string[]>();\n for (const { id, actorId } of toDelete) {\n const group = byActor.get(actorId) ?? [];\n group.push(id);\n byActor.set(actorId, group);\n }\n\n for (const [actorId, groupIds] of byActor) {\n const filePath = this._filePath(actorId);\n const blocks = groupIds.map((gid) => this._formatTombstone(gid)).join(\"\");\n await appendFile(filePath, blocks, \"utf-8\");\n }\n\n this._cacheDirty = true;\n return toDelete.length;\n }\n\n async retrieve(query: MemoryRetrieveQuery, _embedding?: number[]): Promise<Memory[]> {\n await this._ensureCache();\n const now = new Date();\n let results = Array.from(this._cache!.values())\n .filter((m) => !this._deletedIds.has(m.id))\n .filter((m) => !m.expiresAt || m.expiresAt > now);\n\n if (query.actorId) {\n results = results.filter((m) => m.actorId === query.actorId);\n }\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n results = results.filter((m) => query.memoryTypes!.includes(m.memoryType));\n }\n if (query.tags && query.tags.length > 0) {\n results = results.filter((m) => m.tags?.some((t) => query.tags!.includes(t)));\n }\n if (query.query) {\n const terms = query.query.toLowerCase().split(/\\s+/).filter(Boolean);\n results = results.filter((m) => {\n const content = m.content.toLowerCase();\n return terms.some((t) => content.includes(t));\n });\n }\n\n switch (query.strategy) {\n case \"recent\":\n results.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n break;\n case \"important\":\n results.sort((a, b) => b.importance - a.importance);\n break;\n case \"hybrid\":\n case \"semantic\":\n default:\n results.sort(\n (a, b) => b.importance - a.importance || b.createdAt.getTime() - a.createdAt.getTime()\n );\n break;\n }\n\n const limit = query.limit ?? 10;\n return results.slice(0, limit);\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n await this._ensureCache();\n const now = new Date();\n let results = Array.from(this._cache!.values())\n .filter((m) => !this._deletedIds.has(m.id))\n .filter((m) => !m.expiresAt || m.expiresAt > now);\n\n if (filter?.actorId) {\n results = results.filter((m) => m.actorId === filter.actorId);\n }\n if (filter?.memoryType) {\n results = results.filter((m) => m.memoryType === filter.memoryType);\n }\n if (filter?.minImportance !== undefined) {\n results = results.filter((m) => m.importance >= filter.minImportance!);\n }\n return results.length;\n }\n\n async close(): Promise<void> {\n this._cache = null;\n this._deletedIds.clear();\n this._cacheDirty = true;\n }\n\n async vacuum(): Promise<void> {\n if (this.oneFilePerActor) {\n const actorIds = await this._listActors();\n for (const actorId of actorIds) {\n await this._vacuumFile(this._filePath(actorId));\n }\n } else {\n await this._vacuumFile(this._filePath(\"\"));\n }\n this._cacheDirty = true;\n }\n\n // ── Internal ──\n\n private _filePath(actorId: string): string {\n if (!this.oneFilePerActor) {\n return join(this.dir, \"memories.md\");\n }\n const safe = actorId.replace(/[^a-zA-Z0-9_\\-.,@]/g, \"_\");\n return join(this.dir, `${safe}.md`);\n }\n\n private _formatBlock(memory: Memory): string {\n const iso = memory.createdAt.toISOString();\n const meta = JSON.stringify({\n id: memory.id,\n actorId: memory.actorId,\n memoryType: memory.memoryType,\n importance: memory.importance,\n emotionalValence: memory.emotionalValence,\n tags: memory.tags,\n embedding: memory.embedding,\n sourceId: memory.sourceId ?? null,\n metadata: memory.metadata ?? {},\n createdAt: memory.createdAt.toISOString(),\n expiresAt: memory.expiresAt?.toISOString() ?? null,\n });\n return `## ${iso}\\n\\n~~~json\\n${meta}\\n~~~\\n\\n${memory.content}\\n\\n---\\n`;\n }\n\n private _formatTombstone(id: string): string {\n const iso = new Date().toISOString();\n return `## ${iso}\\n\\n<!-- deleted: ${id} -->\\n\\n---\\n`;\n }\n\n private async _ensureCache(): Promise<void> {\n if (!this._cacheDirty) return;\n\n const allMemories = new Map<string, Memory>();\n const allDeletedIds = new Set<string>();\n\n if (this.oneFilePerActor) {\n const actorIds = await this._listActors();\n for (const actorId of actorIds) {\n const { memories, deletedIds } = await this._parseFile(this._filePath(actorId));\n for (const mem of memories) {\n allMemories.set(mem.id, mem);\n }\n for (const did of deletedIds) {\n allDeletedIds.add(did);\n }\n }\n } else {\n const { memories, deletedIds } = await this._parseFile(this._filePath(\"\"));\n for (const mem of memories) {\n allMemories.set(mem.id, mem);\n }\n for (const did of deletedIds) {\n allDeletedIds.add(did);\n }\n }\n\n this._cache = allMemories;\n this._deletedIds = allDeletedIds;\n this._cacheDirty = false;\n }\n\n private async _parseFile(filePath: string): Promise<{ memories: Memory[]; deletedIds: string[] }> {\n let raw: string;\n try {\n raw = await readFile(filePath, \"utf-8\");\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { memories: [], deletedIds: [] };\n }\n throw storageError(`Failed to read file ${filePath}: ${(err as Error).message}`);\n }\n\n const memories: Memory[] = [];\n const deletedIds: string[] = [];\n\n const sections = raw.split(\"\\n---\\n\");\n\n for (const section of sections) {\n const trimmed = section.trim();\n if (!trimmed) continue;\n\n const cleanBlock = trimmed.replace(/\\n---$/, \"\");\n const lines = cleanBlock.split(\"\\n\");\n let i = 0;\n\n if (!lines[i]?.startsWith(\"## \")) continue;\n i++;\n\n while (i < lines.length && lines[i].trim() === \"\") i++;\n if (i >= lines.length) continue;\n\n const tombstoneMatch = lines[i].trim().match(/^<!-- deleted:\\s*(\\S+)\\s*-->/);\n if (tombstoneMatch) {\n deletedIds.push(tombstoneMatch[1]);\n continue;\n }\n\n if (lines[i].trim() !== \"~~~json\") continue;\n i++;\n\n const jsonLines: string[] = [];\n while (i < lines.length && lines[i].trim() !== \"~~~\") {\n jsonLines.push(lines[i]);\n i++;\n }\n i++;\n\n let metadata: Record<string, unknown> | null = null;\n try {\n metadata = JSON.parse(jsonLines.join(\"\\n\"));\n } catch {\n continue;\n }\n\n while (i < lines.length && lines[i].trim() === \"\") i++;\n\n const contentLines: string[] = [];\n while (i < lines.length) {\n contentLines.push(lines[i]);\n i++;\n }\n const content = contentLines.join(\"\\n\").trim();\n\n if (metadata && typeof metadata.id === \"string\") {\n memories.push({\n id: metadata.id,\n actorId: metadata.actorId as string,\n memoryType: (metadata.memoryType as MemoryType) ?? \"interaction\",\n content,\n importance: (metadata.importance as number) ?? 0.5,\n emotionalValence: (metadata.emotionalValence as number) ?? 0,\n tags: (metadata.tags as string[]) ?? [],\n embedding: metadata.embedding as number[] | undefined,\n sourceId: (metadata.sourceId as string | undefined) ?? undefined,\n metadata: (metadata.metadata as Record<string, unknown>) ?? {},\n createdAt: new Date(metadata.createdAt as string),\n expiresAt: metadata.expiresAt ? new Date(metadata.expiresAt as string) : undefined,\n });\n }\n }\n\n return { memories, deletedIds };\n }\n\n private async _vacuumFile(filePath: string): Promise<void> {\n await this._ensureCache();\n\n let raw: string;\n try {\n raw = await readFile(filePath, \"utf-8\");\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return;\n throw storageError(`Failed to read file for vacuum: ${(err as Error).message}`);\n }\n\n const sections = raw.split(\"\\n---\\n\");\n const kept: string[] = [];\n\n for (const section of sections) {\n const trimmed = section.trim();\n if (!trimmed) continue;\n\n const cleanBlock = trimmed.replace(/\\n---$/, \"\");\n const lines = cleanBlock.split(\"\\n\");\n let i = 0;\n\n if (!lines[i]?.startsWith(\"## \")) {\n kept.push(trimmed);\n continue;\n }\n i++;\n\n while (i < lines.length && lines[i].trim() === \"\") i++;\n if (i >= lines.length) {\n kept.push(trimmed);\n continue;\n }\n\n const tombstoneMatch = lines[i].trim().match(/^<!-- deleted:\\s*(\\S+)\\s*-->/);\n if (tombstoneMatch) continue;\n\n if (lines[i].trim() !== \"~~~json\") {\n kept.push(trimmed);\n continue;\n }\n i++;\n\n while (i < lines.length && lines[i].trim() !== \"~~~\") i++;\n i++;\n\n while (i < lines.length && lines[i].trim() === \"\") i++;\n\n const contentLines: string[] = [];\n while (i < lines.length) {\n contentLines.push(lines[i]);\n i++;\n }\n\n try {\n const jsonStartIdx = lines.findIndex((l) => l.trim() === \"~~~json\");\n const jsonEndIdx = lines.findIndex((l, idx) => idx > jsonStartIdx && l.trim() === \"~~~\");\n const jsonText = lines.slice(jsonStartIdx + 1, jsonEndIdx).join(\"\\n\");\n const meta = JSON.parse(jsonText);\n if (this._deletedIds.has(meta.id)) continue;\n } catch {\n // Keep block if we can't parse its metadata\n }\n\n const content = contentLines.join(\"\\n\").trim();\n if (content || trimmed.includes(\"~~~json\")) {\n kept.push(trimmed);\n }\n }\n\n const output = kept.length > 0 ? kept.join(\"\\n---\\n\") + \"\\n---\\n\" : \"\";\n await writeFile(filePath, output, \"utf-8\");\n }\n\n private async _listActors(): Promise<string[]> {\n try {\n const entries = await readdir(this.dir);\n return entries.filter((e) => e.endsWith(\".md\")).map((e) => e.slice(0, -3));\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw storageError(`Failed to list actors: ${(err as Error).message}`);\n }\n }\n}\n","import type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter } from \"../../interfaces.js\";\nimport type { Memory } from \"../../types.js\";\nexport interface HybridStorageConfig {\n cache: StorageProvider;\n durable: StorageProvider;\n writeBoth?: boolean;\n readFromCache?: boolean;\n syncOnInit?: boolean;\n}\n\nexport class HybridStorageAdapter implements StorageProvider {\n private cache: StorageProvider;\n private durable: StorageProvider;\n private writeBoth: boolean;\n private readFromCache: boolean;\n private syncOnInit: boolean;\n\n constructor(config: HybridStorageConfig) {\n this.cache = config.cache;\n this.durable = config.durable;\n this.writeBoth = config.writeBoth ?? true;\n this.readFromCache = config.readFromCache ?? true;\n this.syncOnInit = config.syncOnInit ?? false;\n }\n\n async initialize(): Promise<void> {\n await Promise.all([this.cache.initialize(), this.durable.initialize()]);\n\n if (this.syncOnInit) {\n const results = await this.durable.retrieve({ limit: 100000 });\n if (results.length > 0) {\n await this.cache.storeBatch(results.map((m) => ({\n actorId: m.actorId,\n content: m.content,\n memoryType: m.memoryType,\n importance: m.importance,\n emotionalValence: m.emotionalValence,\n tags: m.tags,\n embedding: m.embedding,\n sourceId: m.sourceId,\n metadata: m.metadata,\n expiresAt: m.expiresAt,\n id: m.id,\n }))).catch(() => {});\n }\n }\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const result = await this.durable.store(input);\n\n if (this.writeBoth) {\n try {\n await this.cache.store({ ...input, id: result.id });\n } catch {}\n }\n\n return result;\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const results = await this.durable.storeBatch(inputs);\n\n if (this.writeBoth) {\n const cacheInputs: MemoryStoreInput[] = results.map((r, i) => ({\n ...inputs[i],\n id: r.id,\n }));\n try {\n await this.cache.storeBatch(cacheInputs);\n } catch {}\n }\n\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n if (this.readFromCache) {\n const cached = await this.cache.get(id);\n if (cached) return cached;\n\n const result = await this.durable.get(id);\n if (result) {\n try { await this.cache.store({\n actorId: result.actorId,\n content: result.content,\n memoryType: result.memoryType,\n importance: result.importance,\n emotionalValence: result.emotionalValence,\n tags: result.tags,\n embedding: result.embedding,\n sourceId: result.sourceId,\n metadata: result.metadata,\n expiresAt: result.expiresAt,\n id: result.id,\n }); } catch {}\n }\n return result;\n }\n\n return this.durable.get(id);\n }\n\n async retrieve(query: MemoryRetrieveQuery, embedding?: number[]): Promise<Memory[]> {\n if (this.readFromCache) {\n const cached = await this.cache.retrieve(query, embedding);\n if (cached.length > 0) return cached;\n\n const results = await this.durable.retrieve(query, embedding);\n if (results.length > 0) {\n const inputs: MemoryStoreInput[] = results.map((r) => ({\n actorId: r.actorId,\n content: r.content,\n memoryType: r.memoryType,\n importance: r.importance,\n emotionalValence: r.emotionalValence,\n tags: r.tags,\n embedding: r.embedding,\n sourceId: r.sourceId,\n metadata: r.metadata,\n expiresAt: r.expiresAt,\n id: r.id,\n }));\n try { await this.cache.storeBatch(inputs); } catch {}\n }\n return results;\n }\n\n return this.durable.retrieve(query, embedding);\n }\n\n async delete(id: string): Promise<void> {\n const results = await Promise.allSettled([\n this.cache.delete(id),\n this.durable.delete(id),\n ]);\n\n const durableResult = results[1];\n if (durableResult.status === \"rejected\") {\n throw durableResult.reason;\n }\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n const [cacheResult, durableCount] = await Promise.all([\n this.cache.deleteMany(ids).catch(() => 0),\n this.durable.deleteMany(ids),\n ]);\n\n return durableCount;\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n return this.durable.count(filter);\n }\n\n async touch(id: string): Promise<void> {\n if (this.durable.touch) {\n await this.durable.touch(id);\n }\n }\n\n async close(): Promise<void> {\n await Promise.all([this.cache.close(), this.durable.close()]);\n }\n}\n","import type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter } from \"../../interfaces.js\";\nimport { notFound, configError } from \"../../errors.js\";\n\ntype PgPool = {\n query(text: string, params?: unknown[]): Promise<{ rows: unknown[] }>;\n end?: () => Promise<void>;\n};\n\ninterface PgMemoryRow {\n id: string;\n actor_id: string;\n memory_type: string;\n content: string;\n importance: number;\n emotional_valence: number;\n tags: string[];\n embedding: number[] | null;\n source_id: string | null;\n metadata: Record<string, unknown>;\n expires_at: string | null;\n created_at: string;\n touched_at: string;\n}\n\nexport interface PostgresStorageConfig {\n pool?: PgPool;\n connectionString?: string;\n host?: string; port?: number; database?: string; user?: string; password?: string;\n tableName?: string;\n vectorDimensions?: number;\n ssl?: boolean | object;\n}\n\nexport class PostgresStorageAdapter implements StorageProvider {\n private pool!: PgPool;\n private table: string;\n private vectorDimensions: number;\n private _ownsPool = false;\n\n constructor(config: PostgresStorageConfig) {\n this.table = config.tableName ?? \"memstack_memories\";\n if (!/^[a-zA-Z0-9_]+$/.test(this.table)) {\n throw configError(`Invalid table name: \"${this.table}\". Use only alphanumeric characters and underscores.`);\n }\n this.vectorDimensions = config.vectorDimensions ?? 1536;\n\n if (config.pool) {\n this.pool = config.pool;\n } else if (config.connectionString) {\n this._connectionString = config.connectionString;\n this._ssl = config.ssl;\n } else if (config.host || config.database || config.user) {\n this._connParts = { host: config.host, port: config.port, database: config.database, user: config.user, password: config.password, ssl: config.ssl };\n } else {\n throw configError(\"PostgresStorageAdapter requires a pool, connectionString, or connection details\");\n }\n }\n\n private _connectionString?: string;\n private _connParts?: { host?: string; port?: number; database?: string; user?: string; password?: string; ssl?: boolean | object };\n private _ssl?: boolean | object;\n\n async initialize(): Promise<void> {\n if (this._connectionString || this._connParts) {\n this.pool = await this._createPool();\n this._ownsPool = true;\n }\n\n await this._runMigration();\n }\n\n private async _createPool(): Promise<PgPool> {\n const connStr = this._connectionString ?? this._buildConnString();\n\n try {\n const { default: createPostgres } = await import(\"postgres\");\n const options: Record<string, unknown> = {};\n if (this._ssl) {\n options.ssl = typeof this._ssl === \"object\" ? this._ssl : \"require\";\n }\n const sql = createPostgres(connStr, options) as { unsafe: (t: string, p: unknown[]) => Promise<unknown[]>; end: () => Promise<void> };\n return {\n query: (text: string, params?: unknown[]) =>\n sql.unsafe(text, params as never[]).then((r: unknown[]) => ({ rows: r })),\n end: () => sql.end(),\n };\n } catch {\n try {\n // @ts-expect-error — optional peer dep without bundled declarations\n const { Pool } = await import(\"pg\");\n const pool = new Pool({ connectionString: connStr, ssl: this._ssl }) as PgPool & { end: () => Promise<void> };\n return { query: (text: string, params?: unknown[]) => pool.query(text, params), end: () => pool.end() };\n } catch {\n throw configError(\"connectionString requires 'postgres' (postgres.js) or 'pg' (node-postgres) to be installed\");\n }\n }\n }\n\n private _buildConnString(): string {\n const p = this._connParts!;\n const host = p.host ?? \"localhost\";\n const port = p.port ?? 5432;\n const db = p.database ?? \"postgres\";\n const user = encodeURIComponent(p.user ?? \"postgres\");\n const pw = p.password ? `:${encodeURIComponent(p.password)}` : \"\";\n let connStr = `postgres://${user}${pw}@${host}:${port}/${db}`;\n if (this._ssl) {\n const sslmode = typeof this._ssl === \"object\" ? \"no-verify\" : \"require\";\n connStr += `?sslmode=${sslmode}`;\n }\n return connStr;\n }\n\n private async _runMigration(): Promise<void> {\n try { await this.pool.query(\"CREATE EXTENSION IF NOT EXISTS vector\"); } catch { /* pgvector may not be available */ }\n await this.pool.query(`\n CREATE TABLE IF NOT EXISTS ${this.table} (\n id TEXT PRIMARY KEY,\n actor_id TEXT NOT NULL,\n memory_type TEXT NOT NULL DEFAULT 'interaction',\n content TEXT NOT NULL,\n importance REAL NOT NULL DEFAULT 0.5,\n emotional_valence REAL NOT NULL DEFAULT 0,\n tags JSONB NOT NULL DEFAULT '[]',\n embedding vector(${this.vectorDimensions}),\n source_id TEXT,\n metadata JSONB NOT NULL DEFAULT '{}',\n expires_at TIMESTAMPTZ,\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n touched_at TIMESTAMPTZ NOT NULL DEFAULT NOW()\n )\n `);\n try {\n await this.pool.query(`CREATE INDEX IF NOT EXISTS idx_${this.table}_actor ON ${this.table} (actor_id)`);\n await this.pool.query(`CREATE INDEX IF NOT EXISTS idx_${this.table}_created ON ${this.table} (created_at DESC)`);\n await this.pool.query(`CREATE INDEX IF NOT EXISTS idx_${this.table}_importance ON ${this.table} (importance DESC)`);\n await this.pool.query(`CREATE INDEX IF NOT EXISTS idx_${this.table}_embedding ON ${this.table} USING hnsw (embedding vector_cosine_ops) WITH (m = 16, ef_construction = 64)`);\n } catch { /* index creation may fail; non-critical */ }\n }\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date().toISOString();\n const id = input.id ?? this.generateId();\n\n await this.pool.query(\n `INSERT INTO ${this.table} (id, actor_id, memory_type, content, importance, emotional_valence, tags, embedding, source_id, metadata, expires_at, created_at, touched_at)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8::float8[]::vector, $9, $10, $11, $12, $13)\n ON CONFLICT (id) DO UPDATE SET\n content = EXCLUDED.content,\n importance = EXCLUDED.importance,\n emotional_valence = EXCLUDED.emotional_valence,\n tags = EXCLUDED.tags,\n embedding = EXCLUDED.embedding,\n source_id = EXCLUDED.source_id,\n metadata = EXCLUDED.metadata,\n expires_at = EXCLUDED.expires_at,\n touched_at = EXCLUDED.touched_at`,\n [\n id,\n input.actorId,\n input.memoryType ?? \"interaction\",\n input.content,\n input.importance ?? 0.5,\n input.emotionalValence ?? 0,\n JSON.stringify(input.tags ?? []),\n input.embedding ? `{${input.embedding.join(\",\")}}` : null,\n input.sourceId ?? null,\n JSON.stringify(input.metadata ?? {}),\n input.expiresAt?.toISOString() ?? null,\n now,\n now,\n ]\n );\n\n return {\n id,\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? new Date(now),\n };\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const results: Memory[] = [];\n for (const input of inputs) {\n results.push(await this.store(input));\n }\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n const { rows } = await this.pool.query(\n `SELECT * FROM ${this.table} WHERE id = $1 AND (expires_at IS NULL OR expires_at > NOW())`,\n [id]\n );\n if (rows.length === 0) return null;\n return this._rowToMemory(rows[0] as PgMemoryRow);\n }\n\n async delete(id: string): Promise<void> {\n const { rows } = await this.pool.query(`SELECT id FROM ${this.table} WHERE id = $1`, [id]);\n if (rows.length === 0) throw notFound(\"Memory\", id);\n await this.pool.query(`DELETE FROM ${this.table} WHERE id = $1`, [id]);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n const placeholders = ids.map((_, i) => `$${i + 1}`).join(\", \");\n const { rows } = await this.pool.query(\n `DELETE FROM ${this.table} WHERE id IN (${placeholders}) RETURNING id`,\n ids\n );\n return rows.length;\n }\n\n async touch(id: string): Promise<void> {\n const { rows } = await this.pool.query(`SELECT id FROM ${this.table} WHERE id = $1`, [id]);\n if (rows.length === 0) throw notFound(\"Memory\", id);\n await this.pool.query(`UPDATE ${this.table} SET touched_at = NOW() WHERE id = $1`, [id]);\n }\n\n async retrieve(query: MemoryRetrieveQuery, embedding?: number[]): Promise<Memory[]> {\n const conditions: string[] = [\"(expires_at IS NULL OR expires_at > NOW())\"];\n const params: unknown[] = [];\n let paramIdx = 1;\n\n if (query.actorId) {\n conditions.push(`actor_id = $${paramIdx++}`);\n params.push(query.actorId);\n }\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n conditions.push(`memory_type = ANY($${paramIdx++})`);\n params.push(query.memoryTypes);\n }\n if (query.tags && query.tags.length > 0) {\n conditions.push(`tags ?| $${paramIdx++}`);\n params.push(query.tags);\n }\n if (query.query) {\n conditions.push(`content ILIKE $${paramIdx++}`);\n params.push(`%${query.query}%`);\n }\n if (query.createdAfter) {\n conditions.push(`created_at >= $${paramIdx++}`);\n params.push(query.createdAfter.toISOString());\n }\n if (query.createdBefore) {\n conditions.push(`created_at <= $${paramIdx++}`);\n params.push(query.createdBefore.toISOString());\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(\" AND \")}` : \"\";\n\n let orderBy: string;\n switch (query.strategy) {\n case \"recent\":\n orderBy = \"touched_at DESC\";\n break;\n case \"important\":\n orderBy = \"importance DESC\";\n break;\n case \"hybrid\":\n case \"semantic\":\n default:\n if (embedding) {\n return this._semanticRetrieve(embedding, query, params, where, paramIdx);\n }\n orderBy = \"importance DESC, touched_at DESC\";\n break;\n }\n\n const limit = query.limit ?? 10;\n const sql = `SELECT * FROM ${this.table} ${where} ORDER BY ${orderBy} LIMIT $${paramIdx}`;\n params.push(limit);\n\n const { rows } = await this.pool.query(sql, params);\n\n for (const row of rows.slice(0, limit)) {\n const r = row as PgMemoryRow;\n await this.pool.query(`UPDATE ${this.table} SET touched_at = NOW() WHERE id = $1`, [r.id]);\n }\n\n return (rows as PgMemoryRow[]).map((r) => this._rowToMemory(r));\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n const conditions: string[] = [\"(expires_at IS NULL OR expires_at > NOW())\"];\n const params: unknown[] = [];\n let paramIdx = 1;\n\n if (filter?.actorId) {\n conditions.push(`actor_id = $${paramIdx++}`);\n params.push(filter.actorId);\n }\n if (filter?.memoryType) {\n conditions.push(`memory_type = $${paramIdx++}`);\n params.push(filter.memoryType);\n }\n if (filter?.minImportance !== undefined) {\n conditions.push(`importance >= $${paramIdx++}`);\n params.push(filter.minImportance);\n }\n if (filter?.createdAfter) {\n conditions.push(`created_at >= $${paramIdx++}`);\n params.push(filter.createdAfter.toISOString());\n }\n if (filter?.createdBefore) {\n conditions.push(`created_at <= $${paramIdx++}`);\n params.push(filter.createdBefore.toISOString());\n }\n\n const where = conditions.join(\" AND \");\n const { rows } = await this.pool.query(\n `SELECT COUNT(*) as count FROM ${this.table} WHERE ${where}`,\n params\n );\n return Number((rows[0] as { count: string }).count);\n }\n\n async close(): Promise<void> {\n if (this._ownsPool && this.pool?.end) {\n await this.pool.end();\n }\n }\n\n private async _semanticRetrieve(\n embedding: number[],\n query: MemoryRetrieveQuery,\n params: unknown[],\n baseWhere: string,\n paramIdx: number\n ): Promise<Memory[]> {\n const limit = query.limit ?? 10;\n const conditions = baseWhere.replace(/^WHERE\\s+/i, \"\");\n const whereClause = conditions\n ? `WHERE ${conditions} AND embedding IS NOT NULL`\n : `WHERE embedding IS NOT NULL`;\n const isHybrid = query.strategy === \"hybrid\";\n const sql = isHybrid ? `\n SELECT *,\n (embedding <-> $${paramIdx}::float8[]::vector) AS distance,\n (1.0 - (embedding <-> $${paramIdx}::float8[]::vector) / 2.0 + importance) AS score\n FROM ${this.table}\n ${whereClause}\n ORDER BY score DESC\n LIMIT $${paramIdx + 1}\n ` : `\n SELECT *,\n (embedding <-> $${paramIdx}::float8[]::vector) AS distance\n FROM ${this.table}\n ${whereClause}\n ORDER BY distance ASC\n LIMIT $${paramIdx + 1}\n `;\n params.push(embedding);\n params.push(limit);\n\n const { rows } = await this.pool.query(sql, params);\n\n for (const row of rows.slice(0, limit)) {\n const r = row as PgMemoryRow;\n await this.pool.query(`UPDATE ${this.table} SET touched_at = NOW() WHERE id = $1`, [r.id]);\n }\n\n return (rows as PgMemoryRow[]).map((r) => this._rowToMemory(r));\n }\n\n private _rowToMemory(row: PgMemoryRow): Memory {\n return {\n id: row.id,\n actorId: row.actor_id,\n memoryType: row.memory_type as MemoryType,\n content: row.content,\n importance: row.importance,\n emotionalValence: row.emotional_valence,\n tags: Array.isArray(row.tags) ? row.tags : [],\n embedding: row.embedding ?? undefined,\n sourceId: row.source_id ?? undefined,\n metadata: row.metadata ?? {},\n expiresAt: row.expires_at ? new Date(row.expires_at) : undefined,\n createdAt: new Date(row.created_at),\n };\n }\n}\n","import type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter } from \"../../interfaces.js\";\nimport { notFound } from \"../../errors.js\";\n\ntype RedisClient = {\n set(key: string, value: string): Promise<unknown>;\n get(key: string): Promise<string | null>;\n del(key: string | string[]): Promise<number>;\n sadd(key: string, ...members: string[]): Promise<number>;\n srem(key: string, ...members: string[]): Promise<number>;\n smembers(key: string): Promise<string[]>;\n mget(...keys: string[]): Promise<(string | null)[]>;\n};\n\ninterface MemoryRecord extends Memory {\n _touchedAt: string;\n}\n\nexport interface RedisStorageConfig {\n redis: RedisClient;\n keyPrefix?: string;\n}\n\nexport class RedisStorageAdapter implements StorageProvider {\n private redis: RedisClient;\n private prefix: string;\n constructor(config: RedisStorageConfig) {\n this.redis = config.redis;\n this.prefix = config.keyPrefix ?? \"memstack\";\n }\n\n async initialize(): Promise<void> {\n // Connection is user-managed; no-op\n }\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date();\n const memory: MemoryRecord = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? now,\n _touchedAt: now.toISOString(),\n };\n\n await this.redis.set(this._memKey(memory.id), JSON.stringify(memory));\n await this.redis.sadd(this._actorKey(memory.actorId), memory.id);\n await this.redis.sadd(this._actorsSetKey(), memory.actorId);\n\n return this._toExternal(memory);\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const results: Memory[] = [];\n const now = new Date();\n\n for (const input of inputs) {\n const memory: MemoryRecord = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? now,\n _touchedAt: now.toISOString(),\n };\n\n await this.redis.set(this._memKey(memory.id), JSON.stringify(memory));\n await this.redis.sadd(this._actorKey(memory.actorId), memory.id);\n await this.redis.sadd(this._actorsSetKey(), memory.actorId);\n results.push(this._toExternal(memory));\n }\n\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n const raw = await this.redis.get(this._memKey(id));\n if (!raw) return null;\n\n const record = JSON.parse(raw) as MemoryRecord;\n if (record.expiresAt && new Date(record.expiresAt) <= new Date()) return null;\n return this._toExternal(record);\n }\n\n async delete(id: string): Promise<void> {\n const raw = await this.redis.get(this._memKey(id));\n if (!raw) throw notFound(\"Memory\", id);\n\n const record = JSON.parse(raw) as MemoryRecord;\n await this.redis.del(this._memKey(id));\n await this.redis.srem(this._actorKey(record.actorId), id);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n let count = 0;\n const byActor = new Map<string, string[]>();\n\n for (const id of ids) {\n const raw = await this.redis.get(this._memKey(id));\n if (raw) {\n const record = JSON.parse(raw) as MemoryRecord;\n const list = byActor.get(record.actorId) ?? [];\n list.push(id);\n byActor.set(record.actorId, list);\n }\n }\n\n for (const [actorId, memIds] of byActor) {\n await this.redis.del(memIds.map((id) => this._memKey(id)));\n await this.redis.srem(this._actorKey(actorId), ...memIds);\n count += memIds.length;\n }\n\n return count;\n }\n\n async touch(id: string): Promise<void> {\n const raw = await this.redis.get(this._memKey(id));\n if (!raw) throw notFound(\"Memory\", id);\n\n const record = JSON.parse(raw) as MemoryRecord;\n record._touchedAt = new Date().toISOString();\n await this.redis.set(this._memKey(id), JSON.stringify(record));\n }\n\n async retrieve(query: MemoryRetrieveQuery, _embedding?: number[]): Promise<Memory[]> {\n let allRecords: MemoryRecord[] = [];\n\n if (query.actorId) {\n allRecords = await this._getActorRecords(query.actorId);\n } else {\n const actorIds = await this._listActors();\n for (const actorId of actorIds) {\n const records = await this._getActorRecords(actorId);\n allRecords.push(...records);\n }\n }\n\n const now = new Date();\n let results = allRecords.filter((r) => !r.expiresAt || new Date(r.expiresAt) > now);\n\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n results = results.filter((r) => query.memoryTypes!.includes(r.memoryType));\n }\n if (query.tags && query.tags.length > 0) {\n results = results.filter((r) => r.tags?.some((t) => query.tags!.includes(t)));\n }\n if (query.query) {\n const q = query.query.toLowerCase();\n results = results.filter((r) => r.content.toLowerCase().includes(q));\n }\n\n switch (query.strategy) {\n case \"recent\":\n results.sort((a, b) => new Date(b._touchedAt).getTime() - new Date(a._touchedAt).getTime());\n break;\n case \"important\":\n results.sort((a, b) => b.importance - a.importance);\n break;\n case \"hybrid\":\n case \"semantic\":\n default:\n results.sort(\n (a, b) =>\n b.importance - a.importance || new Date(b._touchedAt).getTime() - new Date(a._touchedAt).getTime()\n );\n break;\n }\n\n const nowStr = new Date().toISOString();\n const toTouch = results.slice(0, query.limit ?? 10);\n for (const r of toTouch) {\n r._touchedAt = nowStr;\n await this.redis.set(this._memKey(r.id), JSON.stringify(r));\n }\n\n const limit = query.limit ?? 10;\n return results.slice(0, limit).map((r) => this._toExternal(r));\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n let allRecords: MemoryRecord[] = [];\n\n if (filter?.actorId) {\n allRecords = await this._getActorRecords(filter.actorId);\n } else {\n const actorIds = await this._listActors();\n for (const actorId of actorIds) {\n const records = await this._getActorRecords(actorId);\n allRecords.push(...records);\n }\n }\n\n const now = new Date();\n let results = allRecords.filter((r) => !r.expiresAt || new Date(r.expiresAt) > now);\n\n if (filter?.memoryType) {\n results = results.filter((r) => r.memoryType === filter.memoryType);\n }\n if (filter?.minImportance !== undefined) {\n results = results.filter((r) => r.importance >= filter.minImportance!);\n }\n\n return results.length;\n }\n\n async close(): Promise<void> {\n }\n\n private _actorsSetKey(): string {\n return `${this.prefix}:actors`;\n }\n\n private _actorKey(actorId: string): string {\n const safe = actorId.replace(/[^a-zA-Z0-9_\\-.,@]/g, \"_\");\n return `${this.prefix}:a:${safe}`;\n }\n\n private _memKey(id: string): string {\n return `${this.prefix}:m:${id}`;\n }\n\n private async _getActorRecords(actorId: string): Promise<MemoryRecord[]> {\n const ids = await this.redis.smembers(this._actorKey(actorId));\n if (ids.length === 0) return [];\n\n const keys = ids.map((id) => this._memKey(id));\n const raws = await this.redis.mget(...keys);\n\n const records: MemoryRecord[] = [];\n for (const raw of raws) {\n if (raw) {\n try {\n records.push(JSON.parse(raw) as MemoryRecord);\n } catch {\n // Skip corrupted records\n }\n }\n }\n\n return records;\n }\n\n private async _listActors(): Promise<string[]> {\n return this.redis.smembers(this._actorsSetKey());\n }\n\n private _toExternal(record: MemoryRecord): Memory {\n const { _touchedAt: _, ...rest } = record;\n return {\n ...rest,\n createdAt: new Date(record.createdAt),\n expiresAt: record.expiresAt ? new Date(record.expiresAt) : undefined,\n };\n }\n}\n","import type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter } from \"../../interfaces.js\";\nimport { storageError, notFound } from \"../../errors.js\";\n\ntype QdrantClient = {\n createCollection(name: string, config: { vectors: { size: number; distance: string } }): Promise<unknown>;\n getCollection(name: string): Promise<unknown>;\n upsert(name: string, opts: { points: { id: string; vector: number[]; payload: Record<string, unknown> }[] }): Promise<unknown>;\n retrieve(name: string, opts: { ids: string[] }): Promise<unknown[]>;\n search(name: string, opts: { vector: number[]; limit: number; filter?: { must: unknown[] } }): Promise<unknown[]>;\n delete(name: string, opts: { points: string[] }): Promise<unknown>;\n count(name: string, opts?: { filter?: { must: unknown[] } }): Promise<{ count: number }>;\n scroll(name: string, opts?: { filter?: { must: unknown[] }; limit?: number }): Promise<{ points: unknown[] }>;\n};\n\nexport interface QdrantStorageConfig {\n client: QdrantClient;\n collectionName?: string;\n vectorSize?: number;\n}\n\ninterface QdrantPoint {\n id: string;\n payload: Record<string, unknown>;\n vector?: number[];\n}\n\nexport class QdrantStorageAdapter implements StorageProvider {\n private client: QdrantClient;\n private collectionName: string;\n private vectorSize: number;\n private _idToQdrant = new Map<string, string>();\n\n constructor(config: QdrantStorageConfig) {\n this.client = config.client;\n this.collectionName = config.collectionName ?? \"memstack\";\n this.vectorSize = config.vectorSize ?? 1536;\n }\n\n async initialize(): Promise<void> {\n try {\n await this.client.getCollection(this.collectionName);\n } catch {\n await this.client.createCollection(this.collectionName, {\n vectors: { size: this.vectorSize, distance: \"Cosine\" },\n });\n }\n }\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date();\n const memory: Memory = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? now,\n };\n\n const qdrantId = crypto.randomUUID();\n await this.client.upsert(this.collectionName, {\n points: [\n {\n id: qdrantId,\n vector: input.embedding ?? new Array(this.vectorSize).fill(0),\n payload: this._toPayload(memory),\n },\n ],\n });\n\n this._idToQdrant.set(memory.id, qdrantId);\n return memory;\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const results: Memory[] = [];\n const now = new Date();\n const points: { id: string; vector: number[]; payload: Record<string, unknown> }[] = [];\n\n for (const input of inputs) {\n const memory: Memory = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? now,\n };\n results.push(memory);\n const qid = crypto.randomUUID();\n points.push({\n id: qid,\n vector: input.embedding ?? new Array(this.vectorSize).fill(0),\n payload: this._toPayload(memory),\n });\n this._idToQdrant.set(memory.id, qid);\n }\n\n await this.client.upsert(this.collectionName, { points });\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n const qdrantId = this._idToQdrant.get(id);\n if (qdrantId) {\n const points = await this.client.retrieve(this.collectionName, { ids: [qdrantId] });\n if (points && points.length > 0) {\n const point = points[0] as QdrantPoint;\n if (point.payload.expiresAt && new Date(point.payload.expiresAt as string) <= new Date()) return null;\n return this._fromPoint(point);\n }\n }\n return null;\n }\n\n async delete(id: string): Promise<void> {\n const qdrantId = this._idToQdrant.get(id);\n if (!qdrantId) throw notFound(\"Memory\", id);\n await this.client.delete(this.collectionName, { points: [qdrantId] });\n this._idToQdrant.delete(id);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n const qdrantIds: string[] = [];\n for (const id of ids) {\n const qid = this._idToQdrant.get(id);\n if (qid) { qdrantIds.push(qid); this._idToQdrant.delete(id); }\n }\n if (qdrantIds.length === 0) return 0;\n await this.client.delete(this.collectionName, { points: qdrantIds });\n return qdrantIds.length;\n }\n\n async retrieve(query: MemoryRetrieveQuery, embedding?: number[]): Promise<Memory[]> {\n const must: unknown[] = [];\n\n if (query.actorId) {\n must.push({ key: \"actorId\", match: { value: query.actorId } });\n }\n\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n must.push({ key: \"memoryType\", match: { any: query.memoryTypes } });\n }\n\n if (query.tags && query.tags.length > 0) {\n must.push({ key: \"tags\", match: { any: query.tags } });\n }\n\n const filter = must.length > 0 ? { must } : undefined;\n const limit = query.limit ?? 10;\n\n if (query.strategy === \"semantic\" || query.strategy === \"hybrid\") {\n const vector = embedding ?? new Array(this.vectorSize).fill(0);\n const results = await this.client.search(this.collectionName, {\n vector,\n limit,\n filter: filter as { must: unknown[] } | undefined,\n });\n const points = results as QdrantPoint[];\n return points.map((p) => this._fromPoint(p));\n }\n\n const vector = new Array(this.vectorSize).fill(0);\n const results = await this.client.search(this.collectionName, {\n vector,\n limit: 10000,\n filter: filter as { must: unknown[] } | undefined,\n });\n let points = results as QdrantPoint[];\n\n switch (query.strategy) {\n case \"recent\":\n points.sort((a, b) => {\n const aTime = new Date(a.payload.createdAt as string).getTime();\n const bTime = new Date(b.payload.createdAt as string).getTime();\n return bTime - aTime;\n });\n break;\n case \"important\":\n points.sort((a, b) => (b.payload.importance as number) - (a.payload.importance as number));\n break;\n }\n\n return points.slice(0, limit).map((p) => this._fromPoint(p));\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n const must: unknown[] = [];\n\n if (filter?.actorId) {\n must.push({ key: \"actorId\", match: { value: filter.actorId } });\n }\n\n if (filter?.memoryType) {\n must.push({ key: \"memoryType\", match: { value: filter.memoryType } });\n }\n\n if (filter?.minImportance !== undefined) {\n must.push({ key: \"importance\", range: { gte: filter.minImportance } });\n }\n\n const filterObj = must.length > 0 ? { must } : undefined;\n const result = await this.client.count(this.collectionName, filterObj ? { filter: filterObj } : undefined);\n return result.count;\n }\n\n async close(): Promise<void> {}\n\n private _toPayload(memory: Memory): Record<string, unknown> {\n return {\n _id: memory.id,\n actorId: memory.actorId,\n memoryType: memory.memoryType,\n importance: memory.importance,\n emotionalValence: memory.emotionalValence,\n tags: memory.tags,\n content: memory.content,\n metadata: memory.metadata ?? {},\n createdAt: memory.createdAt.toISOString(),\n sourceId: memory.sourceId ?? null,\n expiresAt: memory.expiresAt?.toISOString() ?? null,\n };\n }\n\n private _fromPoint(point: QdrantPoint): Memory {\n const p = point.payload;\n return {\n id: (p._id as string) ?? point.id,\n actorId: p.actorId as string,\n memoryType: p.memoryType as MemoryType,\n content: p.content as string,\n importance: p.importance as number,\n emotionalValence: (p.emotionalValence as number) ?? 0,\n tags: (p.tags as string[]) ?? [],\n embedding: point.vector as number[] | undefined,\n sourceId: (p.sourceId as string | undefined) ?? undefined,\n metadata: (p.metadata as Record<string, unknown>) ?? {},\n expiresAt: p.expiresAt ? new Date(p.expiresAt as string) : undefined,\n createdAt: new Date(p.createdAt as string),\n };\n }\n}\n","import type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter } from \"../../interfaces.js\";\nimport { storageError, notFound } from \"../../errors.js\";\n\ntype Neo4jDriver = {\n session(opts?: { database?: string }): Neo4jSession;\n close(): Promise<void>;\n};\n\ntype Neo4jSession = {\n run(query: string, params?: Record<string, unknown>): Promise<{ records: { get(key: string): unknown; toObject(): Record<string, unknown> }[] }>;\n close(): Promise<void>;\n};\n\ninterface Neo4jMemoryNode {\n id: string;\n actorId: string;\n memoryType: string;\n content: string;\n importance: number;\n emotionalValence: number;\n tags: string[];\n sourceId: string | null;\n metadata: string;\n expiresAt: string | null;\n createdAt: string;\n embedding: number[] | null;\n}\n\nexport interface Neo4jStorageConfig {\n driver: Neo4jDriver;\n database?: string;\n}\n\nexport class Neo4jStorageAdapter implements StorageProvider {\n private driver: Neo4jDriver;\n private database: string;\n\n constructor(config: Neo4jStorageConfig) {\n this.driver = config.driver;\n this.database = config.database ?? \"neo4j\";\n }\n\n async initialize(): Promise<void> {\n const session = this.driver.session({ database: this.database });\n try {\n await session.run(\n \"CREATE CONSTRAINT memory_id IF NOT EXISTS FOR (m:Memory) REQUIRE m.id IS UNIQUE\"\n );\n await session.run(\n `CREATE VECTOR INDEX memory_embedding IF NOT EXISTS FOR (m:Memory) ON m.embedding\n OPTIONS { indexConfig: { \\`vector.dimensions\\`: 1536, \\`vector.similarity_function\\`: \"cosine\" } }`\n );\n } finally {\n await session.close();\n }\n }\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date().toISOString();\n const id = input.id ?? this.generateId();\n\n const props: Record<string, unknown> = {\n actorId: input.actorId,\n memoryType: input.memoryType ?? \"interaction\",\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n sourceId: input.sourceId ?? null,\n metadata: JSON.stringify(input.metadata ?? {}),\n expiresAt: input.expiresAt?.toISOString() ?? null,\n createdAt: input.createdAt?.toISOString() ?? now,\n embedding: input.embedding ?? null,\n };\n\n const updateProps = { ...props };\n if (!input.createdAt) {\n delete updateProps.createdAt;\n }\n\n const session = this.driver.session({ database: this.database });\n try {\n await session.run(\n \"MERGE (m:Memory {id: $id}) ON CREATE SET m += $props ON MATCH SET m += $updateProps\",\n { id, props, updateProps }\n );\n } finally {\n await session.close();\n }\n\n return {\n id,\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? new Date(now),\n };\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const results: Memory[] = [];\n for (const input of inputs) {\n results.push(await this.store(input));\n }\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n const session = this.driver.session({ database: this.database });\n try {\n const result = await session.run(\n \"MATCH (m:Memory {id: $id}) WHERE m.expiresAt IS NULL OR m.expiresAt > datetime() RETURN m\",\n { id }\n );\n if (result.records.length === 0) return null;\n const raw = result.records[0].get(\"m\") as Record<string, unknown>;\n const node = (raw.properties ?? raw) as Neo4jMemoryNode;\n return this._nodeToMemory(node);\n } finally {\n await session.close();\n }\n }\n\n async delete(id: string): Promise<void> {\n const session = this.driver.session({ database: this.database });\n try {\n const check = await session.run(\"MATCH (m:Memory {id: $id}) RETURN m.id as id\", { id });\n if (check.records.length === 0) throw notFound(\"Memory\", id);\n await session.run(\"MATCH (m:Memory {id: $id}) DETACH DELETE m\", { id });\n } finally {\n await session.close();\n }\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n const session = this.driver.session({ database: this.database });\n try {\n const result = await session.run(\n \"UNWIND $ids AS mid MATCH (m:Memory {id: mid}) DETACH DELETE m RETURN count(m) as deleted\",\n { ids }\n );\n const record = result.records[0];\n if (!record) return 0;\n return record.get(\"deleted\") as number;\n } finally {\n await session.close();\n }\n }\n\n async retrieve(query: MemoryRetrieveQuery, embedding?: number[]): Promise<Memory[]> {\n const session = this.driver.session({ database: this.database });\n try {\n const limit = Math.floor(query.limit ?? 10);\n const strategy = query.strategy ?? \"hybrid\";\n\n if (strategy === \"semantic\" && embedding) {\n return this._semanticRetrieve(session, embedding, query, limit);\n }\n\n const strLimit = String(limit);\n let cypher: string;\n const params: Record<string, unknown> = {};\n\n const hasActor = query.actorId !== undefined;\n\n switch (strategy) {\n case \"recent\":\n if (hasActor) {\n cypher = \"MATCH (m:Memory) WHERE m.actorId = $actorId RETURN m ORDER BY m.createdAt DESC LIMIT \" + strLimit;\n params.actorId = query.actorId;\n } else {\n cypher = \"MATCH (m:Memory) RETURN m ORDER BY m.createdAt DESC LIMIT \" + strLimit;\n }\n break;\n case \"important\":\n if (hasActor) {\n cypher = \"MATCH (m:Memory) WHERE m.actorId = $actorId RETURN m ORDER BY m.importance DESC LIMIT \" + strLimit;\n params.actorId = query.actorId;\n } else {\n cypher = \"MATCH (m:Memory) RETURN m ORDER BY m.importance DESC LIMIT \" + strLimit;\n }\n break;\n case \"hybrid\":\n default:\n if (embedding) {\n return this._semanticRetrieve(session, embedding, query, limit);\n }\n if (hasActor) {\n cypher = \"MATCH (m:Memory) WHERE m.actorId = $actorId RETURN m ORDER BY m.importance DESC, m.createdAt DESC LIMIT \" + strLimit;\n params.actorId = query.actorId;\n } else {\n cypher = \"MATCH (m:Memory) RETURN m ORDER BY m.importance DESC, m.createdAt DESC LIMIT \" + strLimit;\n }\n break;\n }\n\n const result = await session.run(cypher, params);\n const memories = result.records.map((r) => {\n const raw = r.get(\"m\") as Record<string, unknown>;\n const node = (raw.properties ?? raw) as Neo4jMemoryNode;\n return this._nodeToMemory(node);\n });\n\n return this._postFilter(memories, query);\n } finally {\n await session.close();\n }\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n const session = this.driver.session({ database: this.database });\n try {\n const conditions: string[] = [];\n const params: Record<string, unknown> = {};\n\n if (filter?.actorId) {\n conditions.push(\"m.actorId = $actorId\");\n params.actorId = filter.actorId;\n }\n if (filter?.memoryType) {\n conditions.push(\"m.memoryType = $memoryType\");\n params.memoryType = filter.memoryType;\n }\n if (filter?.minImportance !== undefined) {\n conditions.push(\"m.importance >= $minImportance\");\n params.minImportance = filter.minImportance;\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(\" AND \")}` : \"\";\n const result = await session.run(\n `MATCH (m:Memory) ${where} RETURN count(m) as count`,\n params\n );\n const rawCount = result.records[0].get(\"count\");\n return typeof rawCount === \"number\" ? rawCount : Number(rawCount);\n } finally {\n await session.close();\n }\n }\n\n async graphQuery(cypher: string, params?: Record<string, unknown>): Promise<Memory[]> {\n const session = this.driver.session({ database: this.database });\n try {\n const result = await session.run(cypher, params);\n return result.records.map((r) => {\n const obj = r.toObject();\n const mKey = Object.keys(obj).find((k) => obj[k] && typeof obj[k] === \"object\" && \"properties\" in (obj[k] as object));\n if (mKey) {\n const raw = obj[mKey] as Record<string, unknown>;\n const node = (raw.properties ?? raw) as Neo4jMemoryNode;\n return this._nodeToMemory(node);\n }\n return this._nodeToMemory(obj as unknown as Neo4jMemoryNode);\n });\n } finally {\n await session.close();\n }\n }\n\n async close(): Promise<void> {\n await this.driver.close();\n }\n\n private async _semanticRetrieve(\n session: Neo4jSession,\n embedding: number[],\n query: MemoryRetrieveQuery,\n limit: number\n ): Promise<Memory[]> {\n const hasActor = query.actorId !== undefined;\n const strLimit = String(limit);\n const cypher = hasActor\n ? `CALL db.index.vector.queryNodes('memory_embedding', ${strLimit}, $embedding) YIELD node, score\n MATCH (node) WHERE node.actorId = $actorId\n RETURN node ORDER BY score LIMIT ${strLimit}`\n : `CALL db.index.vector.queryNodes('memory_embedding', ${strLimit}, $embedding) YIELD node, score\n RETURN node ORDER BY score LIMIT ${strLimit}`;\n const params: Record<string, unknown> = { embedding };\n if (hasActor) params.actorId = query.actorId;\n\n const result = await session.run(cypher, params);\n const memories = result.records.map((r) => {\n const raw = r.get(\"node\") as Record<string, unknown>;\n const node = (raw.properties ?? raw) as Neo4jMemoryNode;\n return this._nodeToMemory(node);\n });\n\n return this._postFilter(memories, query);\n }\n\n private _postFilter(memories: Memory[], query: MemoryRetrieveQuery): Memory[] {\n const now = new Date();\n let results = memories.filter((m) => !m.expiresAt || m.expiresAt > now);\n\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n results = results.filter((m) => query.memoryTypes!.includes(m.memoryType));\n }\n if (query.tags && query.tags.length > 0) {\n results = results.filter((m) => m.tags?.some((t) => query.tags!.includes(t)));\n }\n if (query.query) {\n const q = query.query.toLowerCase();\n results = results.filter((m) => m.content.toLowerCase().includes(q));\n }\n\n return results;\n }\n\n private _nodeToMemory(node: Neo4jMemoryNode): Memory {\n return {\n id: node.id,\n actorId: node.actorId,\n memoryType: (node.memoryType ?? \"interaction\") as MemoryType,\n content: node.content,\n importance: node.importance ?? 0.5,\n emotionalValence: node.emotionalValence ?? 0,\n tags: Array.isArray(node.tags) ? node.tags : [],\n embedding: node.embedding ?? undefined,\n sourceId: node.sourceId ?? undefined,\n metadata: typeof node.metadata === \"string\" ? JSON.parse(node.metadata) : (node.metadata ?? {}),\n expiresAt: node.expiresAt ? new Date(node.expiresAt) : undefined,\n createdAt: new Date(node.createdAt),\n };\n }\n}\n","import type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter } from \"../../interfaces.js\";\nimport { notFound } from \"../../errors.js\";\n\ntype WeaviateClient = {\n collections: {\n create(opts: { name: string; properties: { name: string; dataType: string }[]; vectorizers?: unknown }): Promise<unknown>;\n get(name: string): WeaviateCollection;\n delete(name: string): Promise<void>;\n exists(name: string): Promise<boolean>;\n listAll(): Promise<string[]>;\n };\n};\n\ntype WeaviateCollection = {\n data: {\n insert(opts: { properties: Record<string, unknown>; vectors: number[]; id?: string }): Promise<string>;\n deleteById(id: string): Promise<void>;\n };\n query: {\n fetchObjectById(id: string, opts?: { includeVector?: boolean }): Promise<{ properties: Record<string, unknown>; vectors?: { default?: number[] } } | null>;\n fetchObjects(opts: { limit: number; filters?: unknown; includeVector?: boolean }): Promise<{ objects: { uuid: string; properties: Record<string, unknown>; vectors?: { default?: number[] }; metadata?: { creationTimeUnix: number } }[] }>;\n nearVector(vector: number[], opts: { limit: number; returnProperties?: string[]; returnMetadata?: string[]; filters?: unknown; includeVector?: boolean }): Promise<{ objects: { uuid: string; properties: Record<string, unknown>; vectors?: { default?: number[] }; metadata?: { creationTimeUnix: number } }[] }>;\n };\n config: {\n get(): Promise<{ name: string }>;\n update(opts: { vectorIndexConfig: Record<string, unknown> }): Promise<void>;\n };\n};\n\nexport interface WeaviateStorageConfig {\n client: WeaviateClient;\n className?: string;\n}\n\nexport class WeaviateStorageAdapter implements StorageProvider {\n private client: WeaviateClient;\n private className: string;\n private _collection: WeaviateCollection | null = null;\n private _idToWv = new Map<string, string>();\n\n constructor(config: WeaviateStorageConfig) {\n this.client = config.client;\n this.className = config.className ?? \"MemstackMemory\";\n }\n\n async initialize(): Promise<void> {\n this._collection = this.client.collections.get(this.className);\n }\n\n private collection(): WeaviateCollection {\n if (!this._collection) {\n this._collection = this.client.collections.get(this.className);\n }\n return this._collection;\n }\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date();\n const memory: Memory = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? now,\n };\n\n const wvId = await this.collection().data.insert({\n id: crypto.randomUUID(),\n properties: this._toProperties(memory),\n vectors: input.embedding ?? new Array(1536).fill(0),\n });\n this._idToWv.set(memory.id, wvId);\n\n return memory;\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const results: Memory[] = [];\n for (const input of inputs) {\n results.push(await this.store(input));\n }\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n const wvId = this._idToWv.get(id);\n if (!wvId) return null;\n\n const obj = await this.collection().query.fetchObjectById(wvId, { includeVector: true });\n if (!obj) return null;\n\n const memory = this._fromProperties(obj.properties, obj.vectors?.default ?? undefined);\n if (memory.expiresAt && memory.expiresAt <= new Date()) return null;\n return memory;\n }\n\n async delete(id: string): Promise<void> {\n const wvId = this._idToWv.get(id);\n if (!wvId) throw notFound(\"Memory\", id);\n await this.collection().data.deleteById(wvId);\n this._idToWv.delete(id);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n let count = 0;\n for (const id of ids) {\n try {\n await this.delete(id);\n count++;\n } catch {\n //\n }\n }\n return count;\n }\n\n async retrieve(query: MemoryRetrieveQuery, embedding?: number[]): Promise<Memory[]> {\n const strategy = query.strategy ?? \"recent\";\n const limit = query.limit ?? 10;\n\n if ((strategy === \"semantic\" || strategy === \"hybrid\") && embedding) {\n const filters = this._buildFilter(query);\n const result = await this.collection().query.nearVector(embedding, {\n limit: 100,\n filters,\n includeVector: true,\n });\n\n let objects = result.objects.map((o) => ({\n ...this._fromProperties(o.properties, o.vectors?.default),\n _score: o.metadata?.creationTimeUnix ?? 0,\n }));\n\n objects = objects.filter((o) => !o.expiresAt || o.expiresAt > new Date());\n\n if (query.actorId) {\n objects = objects.filter((o) => o.actorId === query.actorId);\n }\n\n if (strategy === \"hybrid\") {\n objects.sort((a, b) => (b._score + b.importance) - (a._score + a.importance));\n }\n\n return objects.slice(0, limit);\n }\n\n const filters = this._buildFilter(query);\n const result = await this.collection().query.fetchObjects({\n limit: 10000,\n filters,\n });\n\n let objects = result.objects.map((o) => ({\n ...this._fromProperties(o.properties, o.vectors?.default),\n _createdAt: o.properties.createdAt as string,\n _importance: (o.properties.importance as number) ?? 0.5,\n }));\n\n objects = objects.filter((o) => !o.expiresAt || o.expiresAt > new Date());\n\n if (query.actorId) {\n objects = objects.filter((o) => o.actorId === query.actorId);\n }\n\n switch (strategy) {\n case \"recent\":\n objects.sort((a, b) => new Date(b._createdAt).getTime() - new Date(a._createdAt).getTime());\n break;\n case \"important\":\n objects.sort((a, b) => b._importance - a._importance);\n break;\n case \"hybrid\":\n case \"semantic\":\n default:\n objects.sort((a, b) => b._importance - a._importance || new Date(b._createdAt).getTime() - new Date(a._createdAt).getTime());\n break;\n }\n\n return objects.slice(0, limit);\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n const and: unknown[] = [];\n if (filter?.actorId) {\n and.push({ operator: \"Equal\", target: { property: \"actorId\" }, value: filter.actorId });\n }\n if (filter?.memoryType) {\n and.push({ operator: \"Equal\", target: { property: \"memoryType\" }, value: filter.memoryType });\n }\n if (filter?.minImportance !== undefined) {\n and.push({ operator: \"GreaterThanEqual\", target: { property: \"importance\" }, value: filter.minImportance });\n }\n\n const finalFilter = and.length === 0 ? undefined : and.length === 1 ? and[0] : { operator: \"And\", filters: and };\n const result = await this.collection().query.fetchObjects({\n limit: 10000,\n filters: finalFilter,\n });\n return result.objects.length;\n }\n\n async close(): Promise<void> {\n //\n }\n\n private _buildFilter(query: MemoryRetrieveQuery): unknown {\n const and: unknown[] = [];\n\n if (query.actorId) {\n and.push({ operator: \"Equal\", target: { property: \"actorId\" }, value: query.actorId });\n }\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n if (query.memoryTypes.length === 1) {\n and.push({ operator: \"Equal\", target: { property: \"memoryType\" }, value: query.memoryTypes[0] });\n } else {\n and.push({\n operator: \"Or\",\n filters: query.memoryTypes.map((t) => ({ operator: \"Equal\", target: { property: \"memoryType\" }, value: t })),\n });\n }\n }\n if (query.tags && query.tags.length > 0) {\n if (query.tags.length === 1) {\n and.push({ operator: \"ContainsAny\", target: { property: \"tags\" }, values: query.tags });\n } else {\n and.push({\n operator: \"Or\",\n filters: query.tags.map((t) => ({ operator: \"ContainsAny\", target: { property: \"tags\" }, values: [t] })),\n });\n }\n }\n if (query.query) {\n and.push({ operator: \"Like\", target: { property: \"content\" }, value: `*${query.query}*` });\n }\n\n return and.length === 0 ? undefined : and.length === 1 ? and[0] : { operator: \"And\", filters: and };\n }\n\n private _toProperties(memory: Memory): Record<string, unknown> {\n return {\n _memstackId: memory.id,\n actorId: memory.actorId,\n memoryType: memory.memoryType,\n content: memory.content,\n importance: memory.importance,\n emotionalValence: memory.emotionalValence,\n tags: memory.tags,\n metadata: JSON.stringify(memory.metadata ?? {}),\n sourceId: memory.sourceId ?? null,\n expiresAt: memory.expiresAt?.toISOString() ?? null,\n createdAt: memory.createdAt.toISOString(),\n };\n }\n\n private _fromProperties(props: Record<string, unknown>, vectors?: number[]): Memory {\n return {\n id: (props._memstackId as string) ?? \"\",\n actorId: (props.actorId as string) ?? \"\",\n memoryType: (props.memoryType as MemoryType) ?? \"interaction\",\n content: (props.content as string) ?? \"\",\n importance: (props.importance as number) ?? 0.5,\n emotionalValence: (props.emotionalValence as number) ?? 0,\n tags: Array.isArray(props.tags) ? (props.tags as string[]) : [],\n embedding: vectors,\n sourceId: (props.sourceId as string) ?? undefined,\n metadata: typeof props.metadata === \"string\" ? JSON.parse(props.metadata as string) : (props.metadata ?? {}),\n expiresAt: props.expiresAt ? new Date(props.expiresAt as string) : undefined,\n createdAt: new Date((props.createdAt as string) ?? new Date().toISOString()),\n };\n }\n}\n","import type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter } from \"../../interfaces.js\";\nimport { storageError, notFound, configError } from \"../../errors.js\";\n\ntype LanceDBConnection = {\n createTable(name: string, data: { id: string; vector: number[]; actor_id: string; memory_type: string; content: string; importance: number; emotional_valence: number; tags: string; source_id: string; metadata: string; expires_at: string; created_at: string }[]): Promise<LanceDBTable>;\n openTable(name: string): Promise<LanceDBTable>;\n tableNames(): Promise<string[]>;\n};\n\ntype LanceDBTable = {\n add(data: { id: string; vector: number[]; actor_id: string; memory_type: string; content: string; importance: number; emotional_valence: number; tags: string; source_id: string; metadata: string; expires_at: string; created_at: string }[]): Promise<void>;\n search(vector: number[]): { limit(n: number): { where(predicate: string): { execute(): Promise<LanceDBMemoryRow[]>; prefilter(value: boolean): { execute(): Promise<LanceDBMemoryRow[]> } } } };\n delete(predicate: string): Promise<void>;\n countRows(predicate?: string): Promise<number>;\n};\n\nexport interface LanceDBStorageConfig {\n connection: LanceDBConnection;\n tableName?: string;\n}\n\ninterface LanceDBMemoryRow {\n id: string;\n vector: number[];\n actor_id: string;\n memory_type: string;\n content: string;\n importance: number;\n emotional_valence: number;\n tags: string;\n source_id: string;\n metadata: string;\n expires_at: string;\n created_at: string;\n _distance?: number;\n}\n\nexport class LanceDBStorageAdapter implements StorageProvider {\n private connection: LanceDBConnection;\n private table!: LanceDBTable;\n private tableName: string;\n private _zeroVector: number[];\n\n constructor(config: LanceDBStorageConfig) {\n if (!config.connection) {\n throw configError(\"LanceDBStorageAdapter requires a LanceDB connection instance\");\n }\n this.connection = config.connection;\n this.tableName = config.tableName ?? \"memstack\";\n this._zeroVector = new Array(1536).fill(0);\n }\n\n async initialize(): Promise<void> {\n const tables = await this.connection.tableNames();\n if (!tables.includes(this.tableName)) {\n this.table = await this.connection.createTable(this.tableName, []);\n } else {\n this.table = await this.connection.openTable(this.tableName);\n }\n }\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date();\n const id = input.id ?? this.generateId();\n\n const row = {\n id,\n vector: input.embedding ?? this._zeroVector,\n actor_id: input.actorId,\n memory_type: input.memoryType ?? \"interaction\",\n content: input.content,\n importance: input.importance ?? 0.5,\n emotional_valence: input.emotionalValence ?? 0,\n tags: JSON.stringify(input.tags ?? []),\n source_id: input.sourceId ?? \"\",\n metadata: JSON.stringify(input.metadata ?? {}),\n expires_at: input.expiresAt?.toISOString() ?? \"\",\n created_at: now.toISOString(),\n };\n\n await this.table.add([row]);\n\n return {\n id,\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? now,\n };\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const results: Memory[] = [];\n for (const input of inputs) {\n results.push(await this.store(input));\n }\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n const results = await this.table.search(this._zeroVector).limit(1).where(`id = \"${id}\"`).prefilter(true).execute();\n if (results.length === 0) return null;\n\n const row = results[0];\n if (row.expires_at) {\n const expiresAt = new Date(row.expires_at);\n if (expiresAt <= new Date()) {\n await this.table.delete(`id = \"${id}\"`);\n return null;\n }\n }\n\n return this._rowToMemory(row);\n }\n\n async delete(id: string): Promise<void> {\n const existing = await this.get(id);\n if (!existing) throw notFound(\"Memory\", id);\n await this.table.delete(`id = \"${id}\"`);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n const before = await this.table.countRows();\n const inClause = ids.map((id) => `\"${id}\"`).join(\", \");\n await this.table.delete(`id IN (${inClause})`);\n const after = await this.table.countRows();\n return before - after;\n }\n\n async retrieve(query: MemoryRetrieveQuery, embedding?: number[]): Promise<Memory[]> {\n const conditions: string[] = [];\n if (query.actorId) {\n conditions.push(`actor_id = \"${query.actorId}\"`);\n }\n\n const where = conditions.length > 0 ? conditions.join(\" AND \") : \"\";\n\n const isSemantic = (query.strategy === \"semantic\" || query.strategy === \"hybrid\") && embedding && embedding.length > 0;\n const searchVec = isSemantic ? embedding! : this._zeroVector;\n const scanLimit = isSemantic ? (query.limit ?? 10) : 10000;\n\n const results = await this.table\n .search(searchVec)\n .limit(scanLimit)\n .where(where)\n .execute();\n\n let rows = results as LanceDBMemoryRow[];\n\n const now = new Date();\n rows = rows.filter((r) => !r.expires_at || new Date(r.expires_at) > now);\n\n if (query.actorId) {\n rows = rows.filter((r) => r.actor_id === query.actorId);\n }\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n rows = rows.filter((r) => query.memoryTypes!.includes(r.memory_type as MemoryType));\n }\n if (query.tags && query.tags.length > 0) {\n rows = rows.filter((r) => {\n const tags: string[] = JSON.parse(r.tags);\n return tags.some((t) => query.tags!.includes(t));\n });\n }\n if (query.query) {\n const q = query.query.toLowerCase();\n rows = rows.filter((r) => r.content.toLowerCase().includes(q));\n }\n\n const limit = query.limit ?? 10;\n\n if (isSemantic && query.strategy === \"hybrid\") {\n rows.sort((a, b) => {\n const scoreA = (a._distance ?? 0) + a.importance;\n const scoreB = (b._distance ?? 0) + b.importance;\n return scoreB - scoreA;\n });\n } else if (query.strategy === \"recent\") {\n rows.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());\n } else if (query.strategy === \"important\") {\n rows.sort((a, b) => b.importance - a.importance);\n } else if (!isSemantic) {\n rows.sort((a, b) => b.importance - a.importance || new Date(b.created_at).getTime() - new Date(a.created_at).getTime());\n }\n\n return rows.slice(0, limit).map((r) => this._rowToMemory(r));\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n const conditions: string[] = [];\n if (filter?.actorId) {\n conditions.push(`actor_id = \"${filter.actorId}\"`);\n }\n\n const where = conditions.length > 0 ? conditions.join(\" AND \") : \"\";\n\n const results = await this.table\n .search(this._zeroVector)\n .limit(10000)\n .where(where)\n .execute();\n\n const now = new Date();\n let rows = results.filter((r) => !r.expires_at || new Date(r.expires_at) > now);\n\n if (filter?.actorId) {\n rows = rows.filter((r) => r.actor_id === filter.actorId);\n }\n if (filter?.memoryType) {\n rows = rows.filter((r) => r.memory_type === filter.memoryType);\n }\n if (filter?.minImportance !== undefined) {\n rows = rows.filter((r) => r.importance >= filter.minImportance!);\n }\n\n return rows.length;\n }\n\n async close(): Promise<void> {\n }\n\n private _rowToMemory(row: LanceDBMemoryRow): Memory {\n return {\n id: row.id,\n actorId: row.actor_id,\n memoryType: row.memory_type as MemoryType,\n content: row.content,\n importance: row.importance,\n emotionalValence: row.emotional_valence,\n tags: row.tags ? JSON.parse(row.tags) : [],\n embedding: row.vector && row.vector.length > 0 ? row.vector : undefined,\n sourceId: row.source_id || undefined,\n metadata: row.metadata ? JSON.parse(row.metadata) : {},\n expiresAt: row.expires_at ? new Date(row.expires_at) : undefined,\n createdAt: new Date(row.created_at),\n };\n }\n}\n","import type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter } from \"../../interfaces.js\";\nimport { storageError, notFound } from \"../../errors.js\";\n\ntype MongoCollection = {\n insertOne(doc: Record<string, unknown>): Promise<{ insertedId: string }>;\n findOne(filter: Record<string, unknown>): Promise<Record<string, unknown> | null>;\n updateOne(filter: Record<string, unknown>, update: Record<string, unknown>, opts?: { upsert?: boolean }): Promise<{ upsertedId?: string }>;\n deleteOne(filter: Record<string, unknown>): Promise<{ deletedCount: number }>;\n deleteMany(filter: Record<string, unknown>): Promise<{ deletedCount: number }>;\n find(filter: Record<string, unknown>): { sort(sort: Record<string, number>): { limit(n: number): { toArray(): Promise<Record<string, unknown>[]> } } };\n countDocuments(filter?: Record<string, unknown>): Promise<number>;\n aggregate(pipeline: Record<string, unknown>[]): { toArray(): Promise<Record<string, unknown>[]> };\n};\n\nexport interface MongoDBStorageConfig {\n collection: MongoCollection;\n vectorDimensions?: number;\n}\n\ninterface MongoDoc {\n _id: string;\n actorId: string;\n memoryType: MemoryType;\n content: string;\n importance: number;\n emotionalValence: number;\n tags: string[];\n embedding?: number[];\n sourceId?: string;\n metadata?: Record<string, unknown>;\n expiresAt?: Date;\n createdAt: Date;\n}\n\nexport class MongoDBStorageAdapter implements StorageProvider {\n private collection: MongoCollection;\n private vectorDimensions: number;\n\n constructor(config: MongoDBStorageConfig) {\n this.collection = config.collection;\n this.vectorDimensions = config.vectorDimensions ?? 1536;\n }\n\n async initialize(): Promise<void> {\n try {\n const col = this.collection as MongoCollection & { createSearchIndex?: (def: Record<string, unknown>) => Promise<unknown> };\n if (col.createSearchIndex) {\n await col.createSearchIndex({\n name: \"memstack_vector\",\n definition: {\n mappings: {\n dynamic: false,\n fields: {\n embedding: {\n type: \"knnVector\",\n dimensions: this.vectorDimensions,\n similarity: \"cosine\",\n },\n },\n },\n },\n });\n }\n } catch {}\n }\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date();\n const memory: Memory = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? now,\n };\n await this.collection.insertOne(this.toDoc(memory) as unknown as Record<string, unknown>);\n return memory;\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const results: Memory[] = [];\n for (const input of inputs) {\n results.push(await this.store(input));\n }\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n const doc = await this.collection.findOne({ _id: id });\n if (!doc) return null;\n const memory = this.toMemory(doc as unknown as MongoDoc);\n if (memory.expiresAt && memory.expiresAt <= new Date()) return null;\n return memory;\n }\n\n async delete(id: string): Promise<void> {\n const result = await this.collection.deleteOne({ _id: id });\n if (result.deletedCount === 0) throw notFound(\"Memory\", id);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n const result = await this.collection.deleteMany({ _id: { $in: ids } });\n return result.deletedCount;\n }\n\n async retrieve(query: MemoryRetrieveQuery, embedding?: number[]): Promise<Memory[]> {\n if (query.strategy === \"semantic\" && embedding) {\n return this.retrieveSemantic(query, embedding);\n }\n return this.retrieveStandard(query);\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n const mongoFilter: Record<string, unknown> = {};\n if (filter?.actorId) mongoFilter.actorId = filter.actorId;\n if (filter?.memoryType) mongoFilter.memoryType = filter.memoryType;\n if (filter?.minImportance !== undefined) {\n mongoFilter.importance = { $gte: filter.minImportance };\n }\n return this.collection.countDocuments(mongoFilter);\n }\n\n async close(): Promise<void> {}\n\n private async retrieveStandard(query: MemoryRetrieveQuery): Promise<Memory[]> {\n const filter: Record<string, unknown> = {};\n if (query.actorId) filter.actorId = query.actorId;\n\n if (query.tags && query.tags.length > 0) {\n filter.tags = { $in: query.tags };\n }\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n filter.memoryType = { $in: query.memoryTypes };\n }\n\n let sortObj: Record<string, number>;\n switch (query.strategy) {\n case \"recent\":\n sortObj = { createdAt: -1 };\n break;\n case \"important\":\n sortObj = { importance: -1 };\n break;\n default:\n sortObj = { importance: -1, createdAt: -1 };\n break;\n }\n\n const docs = await this.collection\n .find(filter)\n .sort(sortObj)\n .limit(10000)\n .toArray();\n\n const now = new Date();\n let results = docs\n .map((doc) => this.toMemory(doc as unknown as MongoDoc))\n .filter((m) => !m.expiresAt || m.expiresAt > now);\n\n if (query.query) {\n const q = query.query.toLowerCase();\n results = results.filter((m) => m.content.toLowerCase().includes(q));\n }\n\n return results.slice(0, query.limit ?? 10);\n }\n\n private async retrieveSemantic(query: MemoryRetrieveQuery, embedding: number[]): Promise<Memory[]> {\n try {\n const filter: Record<string, unknown> = {};\n if (query.actorId) filter.actorId = query.actorId;\n\n const pipeline: Record<string, unknown>[] = [\n {\n $vectorSearch: {\n index: \"memstack_vector\",\n path: \"embedding\",\n queryVector: embedding,\n numCandidates: 100,\n limit: query.limit ?? 10,\n filter: filter,\n },\n },\n ];\n\n const docs = await this.collection.aggregate(pipeline).toArray();\n const now = new Date();\n return docs\n .map((doc) => this.toMemory(doc as unknown as MongoDoc))\n .filter((m) => !m.expiresAt || m.expiresAt > now);\n } catch {\n return this.retrieveStandard(query);\n }\n }\n\n private toMemory(doc: MongoDoc): Memory {\n return {\n id: doc._id,\n actorId: doc.actorId,\n memoryType: doc.memoryType,\n content: doc.content,\n importance: doc.importance,\n emotionalValence: doc.emotionalValence,\n tags: doc.tags,\n embedding: doc.embedding,\n sourceId: doc.sourceId,\n metadata: doc.metadata,\n expiresAt: doc.expiresAt,\n createdAt: doc.createdAt,\n };\n }\n\n private toDoc(memory: Memory): MongoDoc {\n return {\n _id: memory.id,\n actorId: memory.actorId,\n memoryType: memory.memoryType,\n content: memory.content,\n importance: memory.importance,\n emotionalValence: memory.emotionalValence,\n tags: memory.tags,\n embedding: memory.embedding,\n sourceId: memory.sourceId,\n metadata: memory.metadata,\n expiresAt: memory.expiresAt,\n createdAt: memory.createdAt,\n };\n }\n}\n","import type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter } from \"../../interfaces.js\";\nimport { notFound, configError } from \"../../errors.js\";\n\ntype BetterSqlite3Db = {\n exec(sql: string): void;\n prepare(sql: string): {\n run(...params: unknown[]): { changes: number; lastInsertRowid: number | bigint };\n get(...params: unknown[]): unknown | undefined;\n all(...params: unknown[]): unknown[];\n };\n close(): void;\n};\n\ninterface SqliteMemoryRow {\n id: string;\n actor_id: string;\n memory_type: string;\n content: string;\n importance: number;\n emotional_valence: number;\n tags: string;\n embedding: string | null;\n source_id: string | null;\n metadata: string;\n expires_at: string | null;\n created_at: string;\n touched_at: string;\n}\n\nexport interface SQLiteStorageConfig {\n db: BetterSqlite3Db;\n tableName?: string;\n vectorDimensions?: number;\n}\n\nfunction cosineSimilarity(a: number[], b: number[]): number {\n if (a.length === 0 || b.length === 0) return 0;\n const dims = Math.min(a.length, b.length);\n let dot = 0;\n let magA = 0;\n let magB = 0;\n for (let i = 0; i < dims; i++) {\n dot += a[i] * b[i];\n magA += a[i] * a[i];\n magB += b[i] * b[i];\n }\n const mag = Math.sqrt(magA) * Math.sqrt(magB);\n return mag === 0 ? 0 : dot / mag;\n}\n\nexport class SQLiteStorageAdapter implements StorageProvider {\n private db: BetterSqlite3Db;\n private table: string;\n private vectorDimensions: number;\n\n constructor(config: SQLiteStorageConfig) {\n if (!config.db) {\n throw configError(\"SQLiteStorageAdapter requires a better-sqlite3 database instance\");\n }\n this.db = config.db;\n this.table = config.tableName ?? \"memstack_memories\";\n if (!/^[a-zA-Z0-9_]+$/.test(this.table)) {\n throw configError(`Invalid table name: \"${this.table}\". Use only alphanumeric characters and underscores.`);\n }\n this.vectorDimensions = config.vectorDimensions ?? 1536;\n }\n\n async initialize(): Promise<void> {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS ${this.table} (\n id TEXT PRIMARY KEY,\n actor_id TEXT NOT NULL,\n memory_type TEXT NOT NULL DEFAULT 'interaction',\n content TEXT NOT NULL,\n importance REAL NOT NULL DEFAULT 0.5,\n emotional_valence REAL NOT NULL DEFAULT 0,\n tags TEXT NOT NULL DEFAULT '[]',\n embedding TEXT,\n source_id TEXT,\n metadata TEXT NOT NULL DEFAULT '{}',\n expires_at TEXT,\n created_at TEXT NOT NULL,\n touched_at TEXT NOT NULL\n )\n `);\n this.db.exec(`CREATE INDEX IF NOT EXISTS idx_${this.table}_actor ON ${this.table}(actor_id)`);\n this.db.exec(`CREATE INDEX IF NOT EXISTS idx_${this.table}_created ON ${this.table}(created_at DESC)`);\n this.db.exec(`CREATE INDEX IF NOT EXISTS idx_${this.table}_importance ON ${this.table}(importance DESC)`);\n }\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date().toISOString();\n const id = input.id ?? this.generateId();\n\n this.db.prepare(\n `INSERT INTO ${this.table} (id, actor_id, memory_type, content, importance, emotional_valence, tags, embedding, source_id, metadata, expires_at, created_at, touched_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n content = excluded.content,\n importance = excluded.importance,\n emotional_valence = excluded.emotional_valence,\n tags = excluded.tags,\n embedding = excluded.embedding,\n source_id = excluded.source_id,\n metadata = excluded.metadata,\n expires_at = excluded.expires_at,\n touched_at = excluded.touched_at`\n ).run(\n id,\n input.actorId,\n input.memoryType ?? \"interaction\",\n input.content,\n input.importance ?? 0.5,\n input.emotionalValence ?? 0,\n JSON.stringify(input.tags ?? []),\n input.embedding ? JSON.stringify(input.embedding) : null,\n input.sourceId ?? null,\n JSON.stringify(input.metadata ?? {}),\n input.expiresAt?.toISOString() ?? null,\n now,\n now\n );\n\n return {\n id,\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? new Date(now),\n };\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const results: Memory[] = [];\n for (const input of inputs) {\n results.push(await this.store(input));\n }\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n const row = this.db.prepare(\n `SELECT * FROM ${this.table} WHERE id = ? AND (expires_at IS NULL OR expires_at > ?)`\n ).get(id, new Date().toISOString()) as SqliteMemoryRow | undefined;\n\n if (!row) return null;\n return this._rowToMemory(row);\n }\n\n async delete(id: string): Promise<void> {\n const row = this.db.prepare(`SELECT id FROM ${this.table} WHERE id = ?`).get(id) as { id: string } | undefined;\n if (!row) throw notFound(\"Memory\", id);\n this.db.prepare(`DELETE FROM ${this.table} WHERE id = ?`).run(id);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n const placeholders = ids.map(() => \"?\").join(\", \");\n const result = this.db.prepare(\n `DELETE FROM ${this.table} WHERE id IN (${placeholders})`\n ).run(...ids);\n return result.changes;\n }\n\n async touch(id: string): Promise<void> {\n const row = this.db.prepare(`SELECT id FROM ${this.table} WHERE id = ?`).get(id) as { id: string } | undefined;\n if (!row) throw notFound(\"Memory\", id);\n this.db.prepare(`UPDATE ${this.table} SET touched_at = ? WHERE id = ?`).run(new Date().toISOString(), id);\n }\n\n async retrieve(query: MemoryRetrieveQuery, embedding?: number[]): Promise<Memory[]> {\n const conditions: string[] = [\"(expires_at IS NULL OR expires_at > ?)\"];\n const params: unknown[] = [new Date().toISOString()];\n\n if (query.actorId) {\n conditions.push(\"actor_id = ?\");\n params.push(query.actorId);\n }\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n const placeholders = query.memoryTypes.map(() => \"?\").join(\", \");\n conditions.push(`memory_type IN (${placeholders})`);\n params.push(...query.memoryTypes);\n }\n if (query.createdAfter) {\n conditions.push(\"created_at >= ?\");\n params.push(query.createdAfter.toISOString());\n }\n if (query.createdBefore) {\n conditions.push(\"created_at <= ?\");\n params.push(query.createdBefore.toISOString());\n }\n\n const where = `WHERE ${conditions.join(\" AND \")}`;\n\n const hasSemantic = (query.strategy === \"semantic\" || query.strategy === \"hybrid\") && embedding && embedding.length > 0;\n\n let orderBy: string;\n switch (query.strategy) {\n case \"recent\":\n orderBy = \"touched_at DESC\";\n break;\n case \"important\":\n orderBy = \"importance DESC\";\n break;\n case \"hybrid\":\n case \"semantic\":\n default:\n if (hasSemantic) {\n orderBy = \"touched_at DESC\";\n } else {\n orderBy = \"importance DESC, touched_at DESC\";\n }\n break;\n }\n\n const limit = query.limit ?? 10;\n const sql = `SELECT * FROM ${this.table} ${where} ORDER BY ${orderBy}`;\n const rows = this.db.prepare(sql).all(...params) as SqliteMemoryRow[];\n\n let results: SqliteMemoryRow[] = rows;\n\n if (query.query) {\n const q = query.query.toLowerCase();\n results = results.filter((r) => r.content.toLowerCase().includes(q));\n }\n\n if (query.tags && query.tags.length > 0) {\n results = results.filter((r) => {\n const tags: string[] = JSON.parse(r.tags);\n return tags.some((t) => query.tags!.includes(t));\n });\n }\n\n if (hasSemantic && embedding) {\n const scored = results\n .filter((r) => r.embedding !== null)\n .map((r) => {\n const emb: number[] = JSON.parse(r.embedding!);\n const score = cosineSimilarity(embedding, emb);\n return { row: r, score };\n })\n .sort((a, b) => b.score - a.score);\n\n if (query.strategy === \"hybrid\") {\n scored.sort((a, b) => (b.score + b.row.importance) - (a.score + a.row.importance));\n }\n\n const topK = scored.slice(0, limit);\n for (const { row } of topK) {\n this.db.prepare(`UPDATE ${this.table} SET touched_at = ? WHERE id = ?`).run(new Date().toISOString(), row.id);\n }\n return topK.map(({ row }) => this._rowToMemory(row));\n }\n\n const now = new Date().toISOString();\n const limited = results.slice(0, limit);\n for (const row of limited) {\n this.db.prepare(`UPDATE ${this.table} SET touched_at = ? WHERE id = ?`).run(now, row.id);\n }\n\n return limited.map((r) => this._rowToMemory(r));\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n const conditions: string[] = [\"(expires_at IS NULL OR expires_at > ?)\"];\n const params: unknown[] = [new Date().toISOString()];\n\n if (filter?.actorId) {\n conditions.push(\"actor_id = ?\");\n params.push(filter.actorId);\n }\n if (filter?.memoryType) {\n conditions.push(\"memory_type = ?\");\n params.push(filter.memoryType);\n }\n if (filter?.minImportance !== undefined) {\n conditions.push(\"importance >= ?\");\n params.push(filter.minImportance);\n }\n if (filter?.createdAfter) {\n conditions.push(\"created_at >= ?\");\n params.push(filter.createdAfter.toISOString());\n }\n if (filter?.createdBefore) {\n conditions.push(\"created_at <= ?\");\n params.push(filter.createdBefore.toISOString());\n }\n\n const where = conditions.join(\" AND \");\n const row = this.db.prepare(\n `SELECT COUNT(*) as count FROM ${this.table} WHERE ${where}`\n ).get(...params) as { count: number } | undefined;\n\n return row?.count ?? 0;\n }\n\n async close(): Promise<void> {\n this.db.close();\n }\n\n private _rowToMemory(row: SqliteMemoryRow): Memory {\n return {\n id: row.id,\n actorId: row.actor_id,\n memoryType: row.memory_type as MemoryType,\n content: row.content,\n importance: row.importance,\n emotionalValence: row.emotional_valence,\n tags: JSON.parse(row.tags),\n embedding: row.embedding ? JSON.parse(row.embedding) : undefined,\n sourceId: row.source_id ?? undefined,\n metadata: JSON.parse(row.metadata),\n expiresAt: row.expires_at ? new Date(row.expires_at) : undefined,\n createdAt: new Date(row.created_at),\n };\n }\n}\n","import type { LLMProvider } from \"../../interfaces.js\";\nimport { MemStackError } from \"../../errors.js\";\n\nexport interface OpenAILLMConfig {\n apiKey: string;\n baseURL?: string;\n defaultModel?: string;\n defaultTemperature?: number;\n defaultMaxTokens?: number;\n}\n\nexport class OpenAILLMAdapter implements LLMProvider {\n private apiKey: string;\n private baseURL: string;\n private defaultModel: string;\n private defaultTemperature: number;\n private defaultMaxTokens: number;\n\n constructor(config: OpenAILLMConfig) {\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL ?? \"https://api.openai.com/v1\";\n this.defaultModel = config.defaultModel ?? \"gpt-4o-mini\";\n this.defaultTemperature = config.defaultTemperature ?? 0.7;\n this.defaultMaxTokens = config.defaultMaxTokens ?? 1024;\n }\n\n async complete(request: {\n system: string;\n user: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n }): Promise<{ text: string; tokens: { prompt: number; completion: number; total: number } }> {\n const model = request.model ?? this.defaultModel;\n const temperature = request.temperature ?? this.defaultTemperature;\n const maxTokens = request.maxTokens ?? this.defaultMaxTokens;\n\n try {\n const response = await fetch(`${this.baseURL}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages: [\n { role: \"system\", content: request.system },\n { role: \"user\", content: request.user },\n ],\n temperature,\n max_tokens: maxTokens,\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new MemStackError(\"LLM_ERROR\", `OpenAI API error: ${response.status} ${err}`, {\n retryable: response.status >= 500,\n });\n }\n\n const data = (await response.json()) as {\n choices: { message: { content: string } }[];\n usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n };\n\n return {\n text: data.choices[0]?.message?.content ?? \"\",\n tokens: {\n prompt: data.usage?.prompt_tokens ?? 0,\n completion: data.usage?.completion_tokens ?? 0,\n total: data.usage?.total_tokens ?? 0,\n },\n };\n } catch (err) {\n if (err instanceof MemStackError) throw err;\n throw new MemStackError(\"LLM_ERROR\", `LLM request failed: ${err instanceof Error ? err.message : String(err)}`, {\n retryable: true,\n });\n }\n }\n\n async *completeStream(request: {\n system: string;\n user: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n }): AsyncIterable<{ text: string; tokens: { prompt: number; completion: number; total: number } }> {\n const model = request.model ?? this.defaultModel;\n const temperature = request.temperature ?? this.defaultTemperature;\n const maxTokens = request.maxTokens ?? this.defaultMaxTokens;\n\n let response: Response;\n try {\n response = await fetch(`${this.baseURL}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages: [\n { role: \"system\", content: request.system },\n { role: \"user\", content: request.user },\n ],\n temperature,\n max_tokens: maxTokens,\n stream: true,\n stream_options: { include_usage: true },\n }),\n });\n } catch (err) {\n throw new MemStackError(\"LLM_ERROR\", `OpenAI streaming request failed: ${err instanceof Error ? err.message : String(err)}`, {\n retryable: true,\n });\n }\n\n if (!response.ok) {\n const err = await response.text();\n throw new MemStackError(\"LLM_ERROR\", `OpenAI streaming error: ${response.status} ${err}`, {\n retryable: response.status >= 500,\n });\n }\n\n const reader = response.body?.getReader();\n if (!reader) throw new MemStackError(\"LLM_ERROR\", \"No response body for streaming\");\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let promptTokens = 0;\n let completionTokens = 0;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || !trimmed.startsWith(\"data: \")) continue;\n const data = trimmed.slice(6);\n if (data === \"[DONE]\") continue;\n\n try {\n const parsed = JSON.parse(data) as {\n choices?: { delta?: { content?: string } }[];\n usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n };\n\n const content = parsed.choices?.[0]?.delta?.content ?? \"\";\n const usage = parsed.usage;\n if (usage) {\n promptTokens = usage.prompt_tokens;\n completionTokens = usage.completion_tokens;\n }\n\n if (content || usage) {\n yield {\n text: content,\n tokens: { prompt: promptTokens, completion: completionTokens, total: promptTokens + completionTokens },\n };\n }\n } catch {\n // Skip unparseable chunks\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n","import type { LLMProvider } from \"../../interfaces.js\";\nimport { MemStackError } from \"../../errors.js\";\n\ninterface AnthropicSDK {\n messages: {\n create(params: {\n model: string;\n max_tokens: number;\n temperature?: number;\n system: string;\n messages: { role: string; content: string }[];\n }): Promise<{ content: { text: string }[]; usage?: { input_tokens: number; output_tokens: number } }>;\n };\n}\n\nexport interface AnthropicLLMConfig {\n apiKey: string;\n baseURL?: string;\n defaultModel?: string;\n defaultMaxTokens?: number;\n}\n\nexport class AnthropicLLMAdapter implements LLMProvider {\n private apiKey: string;\n private baseURL: string;\n private defaultModel: string;\n private defaultMaxTokens: number;\n private sdk?: AnthropicSDK;\n\n constructor(config: AnthropicLLMConfig) {\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL ?? \"https://api.anthropic.com\";\n this.defaultModel = config.defaultModel ?? \"claude-sonnet-4-5-20250929\";\n this.defaultMaxTokens = config.defaultMaxTokens ?? 1024;\n }\n\n async complete(request: {\n system: string;\n user: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n }): Promise<{ text: string; tokens: { prompt: number; completion: number; total: number } }> {\n const model = request.model ?? this.defaultModel;\n const maxTokens = request.maxTokens ?? this.defaultMaxTokens;\n\n try {\n if (!this.sdk) {\n // @ts-expect-error — optional peer dep\n const { default: Anthropic } = await import(\"@anthropic-ai/sdk\");\n this.sdk = new Anthropic({ apiKey: this.apiKey, baseURL: this.baseURL }) as AnthropicSDK;\n }\n\n const sdk = this.sdk;\n const response = await sdk.messages.create({\n model,\n system: request.system,\n messages: [{ role: \"user\", content: request.user }],\n max_tokens: maxTokens,\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\n });\n\n const text = response.content.length > 0 && \"text\" in response.content[0]\n ? (response.content[0] as { text: string }).text\n : \"\";\n\n return {\n text,\n tokens: {\n prompt: response.usage?.input_tokens ?? 0,\n completion: response.usage?.output_tokens ?? 0,\n total: (response.usage?.input_tokens ?? 0) + (response.usage?.output_tokens ?? 0),\n },\n };\n } catch (err) {\n if (err instanceof MemStackError) throw err;\n const msg = err instanceof Error ? err.message : String(err);\n // Node's ERR_MODULE_NOT_FOUND/MODULE_NOT_FOUND codes are the stable\n // signal for a real \"package isn't installed\" failure; the message-text\n // fallback covers bundler/dev-server module loaders (e.g. Vite, used\n // under this project's own test runner) that don't set `code` at all.\n // Either way, requiring the package name in the message keeps this\n // from misattributing an unrelated failure to a missing SDK.\n const code = (err as { code?: string } | undefined)?.code;\n const isMissingSdk =\n msg.includes(\"@anthropic-ai/sdk\") &&\n (code === \"ERR_MODULE_NOT_FOUND\" ||\n code === \"MODULE_NOT_FOUND\" ||\n /cannot find (package|module)/i.test(msg) ||\n /failed to (load|resolve)/i.test(msg));\n if (isMissingSdk) {\n throw new MemStackError(\"LLM_ERROR\", \"Anthropic adapter requires @anthropic-ai/sdk. Install it: npm install @anthropic-ai/sdk\", {\n retryable: false,\n });\n }\n throw new MemStackError(\"LLM_ERROR\", `Anthropic request failed: ${msg}`, {\n retryable: true,\n });\n }\n }\n}\n","import type { EmbeddingProvider } from \"../../interfaces.js\";\nimport { MemStackError } from \"../../errors.js\";\n\nexport interface OpenAIEmbeddingConfig {\n apiKey: string;\n baseURL?: string;\n model?: string;\n}\n\nexport class OpenAIEmbeddingAdapter implements EmbeddingProvider {\n private apiKey: string;\n private baseURL: string;\n private model: string;\n readonly dimensions: number;\n readonly maxBatchSize = 2048;\n\n constructor(config: OpenAIEmbeddingConfig) {\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL ?? \"https://api.openai.com/v1\";\n this.model = config.model ?? \"text-embedding-3-small\";\n this.dimensions = this.model === \"text-embedding-3-large\" ? 3072 : 1536;\n }\n\n async embed(texts: string[]): Promise<number[][]> {\n if (texts.length === 0) return [];\n if (texts.length > this.maxBatchSize) {\n throw new MemStackError(\"VALIDATION_ERROR\", `Max ${this.maxBatchSize} texts per batch, got ${texts.length}`);\n }\n\n try {\n const response = await fetch(`${this.baseURL}/embeddings`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model: this.model,\n input: texts,\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new MemStackError(\"EMBEDDING_ERROR\", `OpenAI Embedding error: ${response.status} ${err}`, {\n retryable: response.status >= 500,\n });\n }\n\n const data = (await response.json()) as {\n data: { embedding: number[]; index: number }[];\n };\n\n return data.data\n .sort((a, b) => a.index - b.index)\n .map((item) => item.embedding);\n } catch (err) {\n if (err instanceof MemStackError) throw err;\n throw new MemStackError(\n \"EMBEDDING_ERROR\",\n `Embedding request failed: ${err instanceof Error ? err.message : String(err)}`,\n { retryable: true }\n );\n }\n }\n}\n","import type { EmbeddingProvider } from \"../../interfaces.js\";\nimport { MemStackError } from \"../../errors.js\";\n\nexport interface CohereEmbeddingConfig {\n /** Cohere API key */\n apiKey: string;\n /** Model name. Default: \"embed-english-v3.0\" (1024 dims) */\n model?: string;\n /** Base URL. Default: \"https://api.cohere.ai/v1\" */\n baseURL?: string;\n}\n\nconst DIMENSIONS: Record<string, number> = {\n \"embed-english-v3.0\": 1024,\n \"embed-multilingual-v3.0\": 1024,\n \"embed-english-light-v3.0\": 384,\n \"embed-multilingual-light-v3.0\": 384,\n \"embed-english-v2.0\": 4096,\n \"embed-multilingual-v2.0\": 768,\n};\n\nexport class CohereEmbeddingAdapter implements EmbeddingProvider {\n private apiKey: string;\n private baseURL: string;\n private model: string;\n readonly dimensions: number;\n readonly maxBatchSize = 96;\n\n constructor(config: CohereEmbeddingConfig) {\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL ?? \"https://api.cohere.ai/v1\";\n this.model = config.model ?? \"embed-english-v3.0\";\n this.dimensions = DIMENSIONS[this.model] ?? 1024;\n }\n\n async embed(texts: string[]): Promise<number[][]> {\n if (texts.length === 0) return [];\n if (texts.length > this.maxBatchSize) {\n throw new MemStackError(\"VALIDATION_ERROR\", `Cohere max ${this.maxBatchSize} texts per batch, got ${texts.length}`);\n }\n\n try {\n const response = await fetch(`${this.baseURL}/embed`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model: this.model,\n texts,\n input_type: \"search_document\",\n embedding_types: [\"float\"],\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new MemStackError(\"EMBEDDING_ERROR\", `Cohere Embedding error: ${response.status} ${err}`, {\n retryable: response.status >= 500,\n });\n }\n\n const data = (await response.json()) as {\n embeddings: { float?: number[][] };\n };\n\n return data.embeddings?.float ?? [];\n } catch (err) {\n if (err instanceof MemStackError) throw err;\n throw new MemStackError(\n \"EMBEDDING_ERROR\",\n `Cohere embedding request failed: ${err instanceof Error ? err.message : String(err)}`,\n { retryable: true }\n );\n }\n }\n}\n","import type { LLMProvider } from \"../../interfaces.js\";\nimport { MemStackError } from \"../../errors.js\";\n\nexport interface OllamaLLMConfig {\n /** Ollama server URL. Default: \"http://localhost:11434\" */\n baseURL?: string;\n /** Default model name. Default: \"llama3.2\" */\n defaultModel?: string;\n /** Default temperature. Default: 0.7 */\n defaultTemperature?: number;\n /** Default max tokens. Default: 1024 */\n defaultMaxTokens?: number;\n}\n\nexport class OllamaLLMAdapter implements LLMProvider {\n private baseURL: string;\n private defaultModel: string;\n private defaultTemperature: number;\n private defaultMaxTokens: number;\n\n constructor(config: OllamaLLMConfig = {}) {\n this.baseURL = config.baseURL ?? \"http://localhost:11434\";\n this.defaultModel = config.defaultModel ?? \"llama3.2\";\n this.defaultTemperature = config.defaultTemperature ?? 0.7;\n this.defaultMaxTokens = config.defaultMaxTokens ?? 1024;\n }\n\n async complete(request: {\n system: string;\n user: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n }): Promise<{ text: string; tokens: { prompt: number; completion: number; total: number } }> {\n const model = request.model ?? this.defaultModel;\n const temperature = request.temperature ?? this.defaultTemperature;\n const maxTokens = request.maxTokens ?? this.defaultMaxTokens;\n\n try {\n const response = await fetch(`${this.baseURL}/api/chat`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n model,\n messages: [\n { role: \"system\", content: request.system },\n { role: \"user\", content: request.user },\n ],\n options: { temperature, num_predict: maxTokens },\n stream: false,\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new MemStackError(\"LLM_ERROR\", `Ollama API error: ${response.status} ${err}`, {\n retryable: response.status >= 500,\n });\n }\n\n const data = (await response.json()) as {\n message?: { content: string };\n prompt_eval_count?: number;\n eval_count?: number;\n };\n\n const promptTokens = data.prompt_eval_count ?? 0;\n const completionTokens = data.eval_count ?? 0;\n\n return {\n text: data.message?.content ?? \"\",\n tokens: {\n prompt: promptTokens,\n completion: completionTokens,\n total: promptTokens + completionTokens,\n },\n };\n } catch (err) {\n if (err instanceof MemStackError) throw err;\n throw new MemStackError(\"LLM_ERROR\", `Ollama request failed: ${err instanceof Error ? err.message : String(err)}`, {\n retryable: true,\n });\n }\n }\n}\n","import type { LLMProvider } from \"../../interfaces.js\";\nimport { MemStackError } from \"../../errors.js\";\n\nexport interface GroqLLMConfig {\n /** Groq API key */\n apiKey: string;\n /** Base URL. Default: \"https://api.groq.com/openai/v1\" */\n baseURL?: string;\n /** Default model. Default: \"llama-3.3-70b-versatile\" */\n defaultModel?: string;\n /** Default temperature. Default: 0.7 */\n defaultTemperature?: number;\n /** Default max tokens. Default: 1024 */\n defaultMaxTokens?: number;\n}\n\nexport class GroqLLMAdapter implements LLMProvider {\n private apiKey: string;\n private baseURL: string;\n private defaultModel: string;\n private defaultTemperature: number;\n private defaultMaxTokens: number;\n\n constructor(config: GroqLLMConfig) {\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL ?? \"https://api.groq.com/openai/v1\";\n this.defaultModel = config.defaultModel ?? \"llama-3.3-70b-versatile\";\n this.defaultTemperature = config.defaultTemperature ?? 0.7;\n this.defaultMaxTokens = config.defaultMaxTokens ?? 1024;\n }\n\n async complete(request: {\n system: string;\n user: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n }): Promise<{ text: string; tokens: { prompt: number; completion: number; total: number } }> {\n const model = request.model ?? this.defaultModel;\n const temperature = request.temperature ?? this.defaultTemperature;\n const maxTokens = request.maxTokens ?? this.defaultMaxTokens;\n\n try {\n const response = await fetch(`${this.baseURL}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages: [\n { role: \"system\", content: request.system },\n { role: \"user\", content: request.user },\n ],\n temperature,\n max_tokens: maxTokens,\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new MemStackError(\"LLM_ERROR\", `Groq API error: ${response.status} ${err}`, {\n retryable: response.status >= 500,\n });\n }\n\n const data = (await response.json()) as {\n choices: { message: { content: string } }[];\n usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n };\n\n return {\n text: data.choices[0]?.message?.content ?? \"\",\n tokens: {\n prompt: data.usage?.prompt_tokens ?? 0,\n completion: data.usage?.completion_tokens ?? 0,\n total: data.usage?.total_tokens ?? 0,\n },\n };\n } catch (err) {\n if (err instanceof MemStackError) throw err;\n throw new MemStackError(\"LLM_ERROR\", `Groq request failed: ${err instanceof Error ? err.message : String(err)}`, {\n retryable: true,\n });\n }\n }\n\n async *completeStream(request: {\n system: string;\n user: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n }): AsyncIterable<{ text: string; tokens: { prompt: number; completion: number; total: number } }> {\n const model = request.model ?? this.defaultModel;\n const temperature = request.temperature ?? this.defaultTemperature;\n const maxTokens = request.maxTokens ?? this.defaultMaxTokens;\n\n let response: Response;\n try {\n response = await fetch(`${this.baseURL}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages: [\n { role: \"system\", content: request.system },\n { role: \"user\", content: request.user },\n ],\n temperature,\n max_tokens: maxTokens,\n stream: true,\n stream_options: { include_usage: true },\n }),\n });\n } catch (err) {\n throw new MemStackError(\"LLM_ERROR\", `Groq streaming request failed: ${err instanceof Error ? err.message : String(err)}`, {\n retryable: true,\n });\n }\n\n if (!response.ok) {\n const err = await response.text();\n throw new MemStackError(\"LLM_ERROR\", `Groq streaming error: ${response.status} ${err}`, {\n retryable: response.status >= 500,\n });\n }\n\n const reader = response.body?.getReader();\n if (!reader) throw new MemStackError(\"LLM_ERROR\", \"No response body for streaming\");\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let promptTokens = 0;\n let completionTokens = 0;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || !trimmed.startsWith(\"data: \")) continue;\n const data = trimmed.slice(6);\n if (data === \"[DONE]\") continue;\n\n try {\n const parsed = JSON.parse(data) as {\n choices?: { delta?: { content?: string } }[];\n usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n x_groq?: { usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number } };\n };\n\n const content = parsed.choices?.[0]?.delta?.content ?? \"\";\n const usage = parsed.usage ?? parsed.x_groq?.usage;\n if (usage) {\n promptTokens = usage.prompt_tokens;\n completionTokens = usage.completion_tokens;\n }\n\n if (content || usage) {\n yield {\n text: content,\n tokens: { prompt: promptTokens, completion: completionTokens, total: promptTokens + completionTokens },\n };\n }\n } catch {\n // Skip unparseable chunks\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/memory/Summarizer.ts","../src/memory/Pruner.ts","../src/memory/ContextCompiler.ts","../src/memory/MemoryStore.ts","../src/adapters/storage/memory.ts","../src/enrichment.ts","../src/client.ts","../src/retrieval/text.ts","../src/retrieval/LexicalRetriever.ts","../src/harness/namespaces.ts","../src/harness/HarnessMemory.ts","../src/adapters/storage/disk.ts","../src/adapters/storage/markdown.ts","../src/adapters/storage/hybrid.ts","../src/adapters/storage/postgres.ts","../src/adapters/storage/redis.ts","../src/adapters/storage/qdrant.ts","../src/adapters/storage/neo4j.ts","../src/adapters/storage/weaviate.ts","../src/adapters/storage/lancedb.ts","../src/adapters/storage/mongodb.ts","../src/adapters/storage/sqlite.ts","../src/adapters/llm/openai.ts","../src/adapters/llm/anthropic.ts","../src/adapters/embedding/openai.ts","../src/adapters/embedding/cohere.ts","../src/adapters/llm/ollama.ts","../src/adapters/llm/groq.ts"],"names":["mkdir","join","readFile","writeFile","rename","unlink","open","stat","readdir","appendFile","vector","results","points","filters","result","objects"],"mappings":";;;;;;AAQO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EACvC,IAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EAEA,WAAA,CACE,IAAA,EACA,OAAA,EACA,OAAA,GAAsE,EAAC,EACvE;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,KAAA;AACtC,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AAAA,EACzB;AACF;AAEO,SAAS,QAAA,CAAS,QAAgB,EAAA,EAA2B;AAClE,EAAA,OAAO,IAAI,aAAA,CAAc,WAAA,EAAa,GAAG,MAAM,CAAA,YAAA,EAAe,EAAE,CAAA,CAAA,EAAI;AAAA,IAClE,SAAA,EAAW,KAAA;AAAA,IACX,OAAA,EAAS,EAAE,MAAA,EAAQ,EAAA;AAAG,GACvB,CAAA;AACH;AAEO,SAAS,eAAA,CAAgB,SAAiB,OAAA,EAAkD;AACjG,EAAA,OAAO,IAAI,aAAA,CAAc,kBAAA,EAAoB,OAAA,EAAS,EAAE,SAAS,CAAA;AACnE;AAEO,SAAS,YAAA,CAAa,SAAiB,KAAA,EAAgC;AAC5E,EAAA,OAAO,IAAI,aAAA,CAAc,eAAA,EAAiB,OAAA,EAAS;AAAA,IACjD,SAAA,EAAW,IAAA;AAAA,IACX,OAAA,EAAS,EAAE,KAAA,EAAO,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA;AAAE,GAC1E,CAAA;AACH;AAEO,SAAS,YAAY,OAAA,EAAgC;AAC1D,EAAA,OAAO,IAAI,aAAA,CAAc,cAAA,EAAgB,SAAS,EAAE,SAAA,EAAW,OAAO,CAAA;AACxE;;;ACzCO,IAAM,aAAN,MAAiB;AAAA,EACd,GAAA;AAAA,EACA,aAAA;AAAA,EAER,WAAA,CAAY,KAAkB,aAAA,EAAwB;AACpD,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,gBAAgB,aAAA,IACnB,sNAAA;AAAA,EACJ;AAAA,EAEA,MAAM,SAAA,CACJ,QAAA,EACA,OAAA,GAA4B,IAC5B,cAAA,EACyD;AACzD,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,aAAA,CAAc,kBAAA,EAAoB,0BAA0B,CAAA;AAAA,IACxE;AAEA,IAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,EAAA;AACvC,IAAA,IAAI,QAAA,CAAS,SAAS,SAAA,EAAW;AAC/B,MAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,QAAA,EAAU,OAAA,EAAS,cAAc,CAAA;AAAA,IACjE;AAEA,IAAA,MAAM,SAAS,CAAC,GAAG,QAAQ,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,UAAU,OAAA,EAAQ,GAAI,CAAA,CAAE,SAAA,CAAU,SAAS,CAAA;AACzF,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAA,CAAE,SAAA,CAAU,WAAA,EAAa,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAEnF,IAAA,MAAM,MAAA,GAAS,kBAAkB,IAAA,CAAK,aAAA;AACtC,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA;AAEpC,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,SAAS,EAAE,MAAA,EAAQ,MAAM,CAAA;AACzD,MAAA,OAAO;AAAA,QACL,cAAA,EAAgB,QAAA,CAAS,IAAA,CAAK,IAAA,EAAK;AAAA,QACnC,UAAA,EAAY,SAAS,MAAA,CAAO;AAAA,OAC9B;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,GAAA,YAAe,eAAe,MAAM,GAAA;AACxC,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,WAAA;AAAA,QACA,yBAAyB,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,QACzE,EAAE,SAAA,EAAW,IAAA,EAAM,OAAA,EAAS,EAAE,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,GAAE;AAAE,OAC1F;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,iBAAA,CACZ,QAAA,EACA,OAAA,EACA,cAAA,EACyD;AACzD,IAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,EAAA;AACvC,IAAA,MAAM,SAAS,CAAC,GAAG,QAAQ,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,UAAU,OAAA,EAAQ,GAAI,CAAA,CAAE,SAAA,CAAU,SAAS,CAAA;AAEzF,IAAA,MAAM,SAAqB,EAAC;AAC5B,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,SAAA,EAAW;AACjD,MAAA,MAAA,CAAO,KAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,SAAS,CAAC,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAI,WAAA,GAAc,CAAA;AAElB,IAAA,MAAM,iBAA2B,EAAC;AAClC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAA,CAAE,SAAA,CAAU,WAAA,EAAa,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAClF,MAAA,MAAM,MAAA,GAAS,kBAAkB,IAAA,CAAK,aAAA;AACtC,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA;AAEpC,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,SAAS,EAAE,MAAA,EAAQ,MAAM,CAAA;AACzD,QAAA,cAAA,CAAe,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,CAAA;AACxC,QAAA,WAAA,IAAe,SAAS,MAAA,CAAO,KAAA;AAAA,MACjC,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,GAAA,YAAe,eAAe,MAAM,GAAA;AACxC,QAAA,MAAM,IAAI,aAAA;AAAA,UACR,WAAA;AAAA,UACA,iCAAiC,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,UACjF,EAAE,SAAA,EAAW,IAAA,EAAM,OAAA,EAAS,EAAE,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,GAAE;AAAE,SAC1F;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,MAAA,OAAO,EAAE,cAAA,EAAgB,cAAA,CAAe,CAAC,CAAA,EAAG,YAAY,WAAA,EAAY;AAAA,IACtE;AAEA,IAAA,MAAM,eAAA,GAA4B,cAAA,CAAe,GAAA,CAAI,CAAC,SAAS,CAAA,MAAO;AAAA,MACpE,EAAA,EAAI,kBAAkB,CAAC,CAAA,CAAA;AAAA,MACvB,OAAA,EAAS,MAAA,CAAO,CAAC,CAAA,CAAE,OAAA;AAAA,MACnB,UAAA,EAAY,SAAA;AAAA,MACZ,OAAA;AAAA,MACA,UAAA,EAAY,GAAA;AAAA,MACZ,gBAAA,EAAkB,CAAA;AAAA,MAClB,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,MAChB,SAAA,EAAW,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,CAAE;AAAA,KACvC,CAAE,CAAA;AAEF,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,iBAAA,CAAkB,eAAA,EAAiB,SAAS,cAAc,CAAA;AACpF,IAAA,OAAO;AAAA,MACL,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,UAAA,EAAY,cAAc,MAAA,CAAO;AAAA,KACnC;AAAA,EACF;AAAA,EAEA,OAAO,eAAA,CACL,QAAA,EACA,OAAA,GAA4B,IAC5B,cAAA,EACgD;AAChD,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,aAAA,CAAc,kBAAA,EAAoB,0BAA0B,CAAA;AAAA,IACxE;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,cAAA,EAAgB;AAC5B,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,SAAS,cAAc,CAAA;AACrE,MAAA,MAAM,EAAE,KAAA,EAAO,MAAA,CAAO,cAAA,EAAgB,IAAA,EAAM,OAAO,cAAA,EAAe;AAClE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,EAAA;AACvC,IAAA,IAAI,WAAA,GAAc,QAAA;AAClB,IAAA,IAAI,QAAA,CAAS,SAAS,SAAA,EAAW;AAC/B,MAAA,MAAM,UAAU,MAAM,IAAA,CAAK,iBAAA,CAAkB,QAAA,EAAU,SAAS,cAAc,CAAA;AAC9E,MAAA,WAAA,GAAc,CAAC,EAAE,EAAA,EAAI,UAAA,EAAY,SAAS,YAAA,EAAc,UAAA,EAAY,SAAA,EAAW,OAAA,EAAS,OAAA,CAAQ,cAAA,EAAgB,YAAY,GAAA,EAAK,gBAAA,EAAkB,GAAG,IAAA,EAAM,IAAI,SAAA,kBAAW,IAAI,IAAA,EAAK,EAAG,CAAA;AAAA,IACzL;AAEA,IAAA,MAAM,SAAS,CAAC,GAAG,WAAW,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,UAAU,OAAA,EAAQ,GAAI,CAAA,CAAE,SAAA,CAAU,SAAS,CAAA;AAC5F,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAA,CAAE,SAAA,CAAU,WAAA,EAAa,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACnF,IAAA,MAAM,MAAA,GAAS,kBAAkB,IAAA,CAAK,aAAA;AACtC,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA;AAEpC,IAAA,IAAI,QAAA,GAAW,EAAA;AACf,IAAA,WAAA,MAAiB,KAAA,IAAS,KAAK,GAAA,CAAI,cAAA,CAAe,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAA,EAAG;AACnE,MAAA,QAAA,IAAY,KAAA,CAAM,IAAA;AAClB,MAAA,MAAM,EAAE,KAAA,EAAO,KAAA,CAAM,IAAA,EAAM,MAAM,QAAA,EAAS;AAAA,IAC5C;AAAA,EACF;AACF,CAAA;;;ACzIO,IAAM,SAAN,MAAa;AAAA;AAAA,EAElB,OAAA,CAAQ,UAAoB,QAAA,EAAmC;AAC7D,IAAA,QAAQ,SAAS,IAAA;AAAM,MACrB,KAAK,OAAA;AACH,QAAA,OAAO,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,QAAQ,CAAA;AAAA,MAC1C,KAAK,cAAA;AACH,QAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAU,QAAQ,CAAA;AAAA,MACjD,KAAK,SAAA;AACH,QAAA,OAAO,IAAA,CAAK,WAAA,CAAY,QAAA,EAAU,QAAQ,CAAA;AAAA,MAC5C,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,QAAQ,CAAA;AAAA,MAC7C,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,QAAQ,CAAA;AAAA,MAC7C,KAAK,SAAA;AACH,QAAA,OAAO,IAAA,CAAK,WAAA,CAAY,QAAA,EAAU,QAAQ,CAAA;AAAA,MAC5C;AACE,QAAA,OAAO,QAAA;AAAA;AACX,EACF;AAAA,EAEA,MAAA,CAAO,UAAoB,QAAA,EAAmC;AAC5D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,QAAQ,CAAA;AAAA,EACxC;AAAA,EAEQ,SAAA,CAAU,UAAoB,QAAA,EAAmC;AACvE,IAAA,IAAI,CAAC,QAAA,CAAS,MAAA,EAAQ,OAAO,QAAA;AAC7B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,CAAS,MAAA;AACrC,IAAA,OAAO,QAAA,CAAS,OAAO,CAAC,CAAA,KAAM,EAAE,SAAA,CAAU,OAAA,MAAa,MAAM,CAAA;AAAA,EAC/D;AAAA,EAEQ,gBAAA,CAAiB,UAAoB,QAAA,EAAmC;AAC9E,IAAA,MAAM,SAAA,GAAY,SAAS,aAAA,IAAiB,GAAA;AAC5C,IAAA,OAAO,SAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,SAAS,CAAA;AAAA,EACzD;AAAA,EAEQ,WAAA,CAAY,UAAoB,QAAA,EAAmC;AACzE,IAAA,MAAM,WAAA,GAAc,SAAS,WAAA,IAAe,GAAA;AAC5C,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAsB;AAC1C,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,MAAM,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,OAAO,KAAK,EAAC;AACxC,MAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AACX,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,OAAA,EAAS,IAAI,CAAA;AAAA,IAC7B;AAEA,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,KAAA,MAAW,GAAG,aAAa,CAAA,IAAK,OAAA,EAAS;AACvC,MAAA,MAAM,MAAA,GAAS,CAAC,GAAG,aAAa,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,UAAA,GAAa,CAAA,CAAE,UAAU,CAAA;AAC5E,MAAA,IAAA,CAAK,KAAK,GAAG,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,WAAW,CAAC,CAAA;AAAA,IAC3C;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGQ,YAAA,CAAa,UAAoB,QAAA,EAAmC;AAC1E,IAAA,IAAI,CAAC,QAAA,CAAS,WAAA,IAAe,SAAS,WAAA,CAAY,MAAA,KAAW,GAAG,OAAO,QAAA;AACvE,IAAA,OAAO,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,SAAS,WAAA,CAAa,QAAA,CAAS,CAAA,CAAE,UAAU,CAAC,CAAA;AAAA,EAC7E;AAAA;AAAA,EAGQ,YAAA,CAAa,UAAoB,QAAA,EAAmC;AAC1E,IAAA,IAAI,CAAC,QAAA,CAAS,YAAA,EAAc,OAAO,QAAA;AACnC,IAAA,OAAO,QAAA,CAAS,OAAO,CAAC,CAAA,KAAM,CAAC,QAAA,CAAS,YAAA,CAAc,CAAC,CAAC,CAAA;AAAA,EAC1D;AAAA;AAAA,EAGQ,WAAA,CAAY,UAAoB,QAAA,EAAmC;AACzE,IAAA,IAAI,CAAC,QAAA,CAAS,UAAA,IAAc,QAAA,CAAS,UAAA,CAAW,WAAW,CAAA,EAAG;AAC5D,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,IAAI,IAAA,GAAO,QAAA;AACX,IAAA,KAAA,MAAW,GAAA,IAAO,SAAS,UAAA,EAAY;AACrC,MAAA,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAAA,IAC/B;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;;;AC7EO,IAAM,kBAAN,MAAsB;AAAA,EACnB,YAAA;AAAA,EACA,cAAA;AAAA,EAER,WAAA,CAAY,cAA6B,cAAA,EAAyB;AAChE,IAAA,IAAA,CAAK,YAAA,GAAe,YAAA,IAAgB,IAAA,CAAK,gBAAA,CAAiB,KAAK,IAAI,CAAA;AACnE,IAAA,IAAA,CAAK,iBAAiB,cAAA,IAAkB,GAAA;AAAA,EAC1C;AAAA,EAEQ,iBAAiB,IAAA,EAAsB;AAC7C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,SAAS,CAAC,CAAA;AACzC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAE,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AAC1D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,SAAS,GAAG,CAAA;AAC5C,IAAA,OAAO,KAAK,GAAA,CAAI,OAAA,EAAS,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAC,CAAA;AAAA,EAC/C;AAAA,EAEQ,eAAe,IAAA,EAAsB;AAC3C,IAAA,OAAO,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,gBAAA,CAAiB,MAAc,SAAA,EAA2B;AAChE,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA,IAAK,WAAW,OAAO,IAAA;AAEnD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC9B,IAAA,MAAM,WAAA,GAAc,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,SAAA,GAAY,GAAG,CAAC,CAAA;AAC3D,IAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,OAAO,CAAA,GAAI,KAAA,CAAM,MAAA,IAAU,CAAA,GAAI,aAAa,CAAA,EAAA,EAAK;AAC/C,MAAA,aAAA,IAAiB,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,CAAC,CAAC,CAAA;AAC7C,MAAA,IAAI,gBAAgB,SAAA,EAAW;AAAA,IACjC;AACA,IAAA,IAAI,CAAA,IAAK,KAAA,CAAM,MAAA,EAAQ,OAAO,IAAA;AAC9B,IAAA,IAAI,CAAA,GAAI,CAAA,EAAG,OAAO,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,KAAA;AAGhD,IAAA,MAAM,YAAY,SAAA,GAAY,CAAA;AAC9B,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA,GAAI,KAAA;AAAA,EACpC;AAAA,EAEA,OAAA,CAAQ,UAAoB,OAAA,EAA0C;AACpE,IAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,GAAA;AAEvC,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM;AACtC,MAAA,IAAI,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,WAAA,CAAY,SAAS,CAAA,EAAG;AACzD,QAAA,OAAO,OAAA,CAAQ,WAAA,CAAY,QAAA,CAAS,CAAA,CAAE,UAAU,CAAA;AAAA,MAClD;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,MAAM,YAAA,GAAe,CAAC,GAAG,QAAQ,CAAA,CAAE,IAAA;AAAA,MACjC,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,UAAU,OAAA,EAAQ,GAAI,CAAA,CAAE,SAAA,CAAU,OAAA;AAAQ,KACxD;AAEA,IAAA,MAAM,kBAAkB,IAAA,CAAK,WAAA;AAAA,MAC3B,CAAC,GAAG,QAAQ,EACT,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,UAAA,IAAc,GAAG,CAAA,CACjC,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,UAAA,GAAa,EAAE,UAAU;AAAA,KAC/C;AAEA,IAAA,MAAM,EAAE,gBAAgB,iBAAA,EAAmB,YAAA,KACzC,IAAA,CAAK,qBAAA,CAAsB,YAAA,EAAc,eAAA,EAAiB,SAAS,CAAA;AAErE,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,cAAA,CAAe,YAAY,CAAA;AAEtD,IAAA,IAAI,OAAA,CAAQ,WAAW,UAAA,EAAY;AACjC,MAAA,OAAO;AAAA,QACL,YAAA;AAAA,QACA,UAAU,CAAC,EAAE,MAAM,QAAA,EAAU,OAAA,EAAS,cAAc,CAAA;AAAA,QACpD,cAAA;AAAA,QACA,iBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,YAAA,EAAc,cAAA,EAAgB,iBAAA,EAAmB,aAAA,EAAc;AAAA,EAC1E;AAAA,EAEQ,qBAAA,CACN,MAAA,EACA,SAAA,EACA,SAAA,EACiF;AACjF,IAAA,MAAM,oBAA8B,EAAC;AACrC,IAAA,MAAM,iBAA2B,EAAC;AAClC,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,IAAI,UAAA,GAAa,CAAA;AAGjB,IAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AACpB,MAAA,MAAM,MAAA,GAAS,CAAA,EAAA,CAAA;AACf,MAAA,MAAM,MAAA,GAAS,KAAK,CAAA,CAAE,UAAU,iBAAiB,CAAA,CAAE,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,CAAA;AACxE,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,MAAA,GAAS,MAAM,CAAA;AACpD,MAAA,IAAI,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,CAAA,CAAE,OAAO,CAAA,GAAI,QAAA;AAC9C,MAAA,MAAM,YAAY,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,IAAA,CAAK,cAAc,CAAA,GAAI,UAAA;AAChE,MAAA,IAAI,aAAa,CAAA,EAAG;AACpB,MAAA,IAAI,SAAS,SAAA,EAAW;AACtB,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,YAAY,QAAQ,CAAA;AACtD,QAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,UAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,gBAAA,CAAiB,CAAA,CAAE,SAAS,aAAa,CAAA;AACvE,UAAA,iBAAA,CAAkB,KAAK,EAAE,GAAG,CAAA,EAAG,OAAA,EAAS,kBAAkB,CAAA;AAC1D,UAAA,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,gBAAgB,CAAA,GAAI,QAAA;AACjD,UAAA,UAAA,IAAc,MAAA;AACd,UAAA,IAAA,CAAK,GAAA,CAAI,EAAE,EAAE,CAAA;AAAA,QACf;AAAA,MACF,CAAA,MAAO;AACL,QAAA,iBAAA,CAAkB,KAAK,CAAC,CAAA;AACxB,QAAA,UAAA,IAAc,MAAA;AACd,QAAA,IAAA,CAAK,GAAA,CAAI,EAAE,EAAE,CAAA;AAAA,MACf;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AACpB,MAAA,MAAM,MAAA,GAAS,CAAA,EAAA,CAAA;AACf,MAAA,MAAM,MAAA,GAAS;AAAA,CAAA;AACf,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,MAAA,GAAS,MAAM,CAAA;AACpD,MAAA,IAAI,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,CAAA,CAAE,OAAO,CAAA,GAAI,QAAA;AAC9C,MAAA,MAAM,YAAY,SAAA,GAAY,UAAA;AAC9B,MAAA,IAAI,aAAa,CAAA,EAAG;AACpB,MAAA,IAAI,SAAS,SAAA,EAAW;AACtB,QAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,YAAY,QAAQ,CAAA;AACtD,QAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,UAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,gBAAA,CAAiB,CAAA,CAAE,SAAS,aAAa,CAAA;AACvE,UAAA,cAAA,CAAe,KAAK,EAAE,GAAG,CAAA,EAAG,OAAA,EAAS,kBAAkB,CAAA;AACvD,UAAA,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,gBAAgB,CAAA,GAAI,QAAA;AACjD,UAAA,UAAA,IAAc,MAAA;AACd,UAAA,IAAA,CAAK,GAAA,CAAI,EAAE,EAAE,CAAA;AAAA,QACf;AAAA,MACF,CAAA,MAAO;AACL,QAAA,cAAA,CAAe,KAAK,CAAC,CAAA;AACrB,QAAA,UAAA,IAAc,MAAA;AACd,QAAA,IAAA,CAAK,GAAA,CAAI,EAAE,EAAE,CAAA;AAAA,MACf;AAAA,IACF;AAEA,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,IAAI,iBAAA,CAAkB,SAAS,CAAA,EAAG;AAChC,MAAA,KAAA,CAAM,KAAK,uBAAuB,CAAA;AAClC,MAAA,KAAA,MAAW,KAAK,iBAAA,EAAmB;AACjC,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,EAAA,EAAK,CAAA,CAAE,UAAU,CAAA,cAAA,EAAiB,CAAA,CAAE,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,MACvF;AAAA,IACF;AACA,IAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,MAAA,KAAA,CAAM,KAAK,0BAA0B,CAAA;AACrC,MAAA,KAAA,MAAW,KAAK,cAAA,EAAgB;AAC9B,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAAA,MAC7B;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,gBAAgB,cAAA,EAAgB,iBAAA,EAAmB,mBAAmB,YAAA,EAAc,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAE;AAAA,EAChH;AAAA,EAEQ,YAAY,QAAA,EAA8B;AAChD,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,CAAQ,WAAA,GAAc,IAAA,EAAK;AACzC,MAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AAClB,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MACf;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACF,CAAA;;;AC1IO,IAAM,cAAN,MAAkB;AAAA,EACf,OAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,gBAAA,GAA+C,IAAA;AAAA,EAC/C,WAAA,GAAc,KAAA;AAAA,EAEtB,MAAc,WAAA,GAA6B;AACzC,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,IAAA,CAAK,QAAQ,UAAA,EAAW;AAC9B,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,YAAY,MAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AACtB,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,SAAA;AACxB,IAAA,IAAA,CAAK,YAAA,GAAe,OAAO,YAAA,IAAgB,IAAA;AAC3C,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,IAAA,CAAK,aAAa,IAAI,UAAA,CAAW,MAAA,CAAO,GAAA,EAAK,OAAO,mBAAmB,CAAA;AAAA,IACzE;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,EAAO;AACzB,IAAA,IAAA,CAAK,WAAW,IAAI,eAAA,CAAgB,MAAA,CAAO,YAAA,EAAc,OAAO,qBAAqB,CAAA;AACrF,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,SAAA,EAAW,GAAA;AAAA,MACX,WAAA,EAAa,EAAA;AAAA,MACb,aAAA,EAAe,GAAA;AAAA,MACf,SAAA,EAAW,GAAA;AAAA,MACX,UAAA,EAAY,GAAA;AAAA,MACZ,SAAA,EAAW,GAAA;AAAA,MACX,GAAG,MAAA,CAAO;AAAA,KACZ;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,KAAA,EAA0C;AACpD,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,KAAA,CAAM,eAAe,QAAA,EAAU;AACjC,MAAA,MAAM,KAAK,gBAAA,EAAiB;AAC5B,MAAA,MAAM,OAAO,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,OAAA,EAAS,MAAM,OAAO,CAAA;AAC3D,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,gBAAA,CAAkB,GAAA,CAAI,IAAI,CAAA;AAClD,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAI,UAAU,CAAA;AAC/C,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,aAAa,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAI,KAAA,CAAM,IAAA,IAAQ,IAAK,GAAI,KAAA,CAAM,QAAQ,EAAG,CAAC,CAAC,CAAA;AAC9E,UAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM;AAAA,YACvC,IAAI,KAAA,CAAM,EAAA;AAAA,YACV,SAAS,KAAA,CAAM,OAAA;AAAA,YACf,SAAS,KAAA,CAAM,OAAA;AAAA,YACf,YAAY,KAAA,CAAM,UAAA;AAAA,YAClB,UAAA,EAAY,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,UAAA;AAAA,YACtC,gBAAA,EAAkB,KAAA,CAAM,gBAAA,IAAoB,KAAA,CAAM,gBAAA;AAAA,YAClD,IAAA,EAAM,UAAA;AAAA,YACN,WAAW,KAAA,CAAM,SAAA;AAAA,YACjB,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,QAAA;AAAA,YAClC,UAAU,EAAE,GAAG,MAAM,QAAA,EAAU,GAAG,MAAM,QAAA,EAAS;AAAA,YACjD,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM;AAAA,WACrC,CAAA;AACD,UAAA,IAAA,CAAK,gBAAA,CAAkB,GAAA,CAAI,IAAA,EAAM,OAAA,CAAQ,EAAE,CAAA;AAC3C,UAAA,OAAO,OAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,aAAA,GAAgB,KAAA;AACpB,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,YAAA,EAAc;AACvC,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,KAAA,CAAM,OAAO,CAAC,CAAA;AAC7D,MAAA,aAAA,GAAgB,EAAE,GAAG,KAAA,EAAO,SAAA,EAAW,UAAA,CAAW,CAAC,CAAA,EAAE;AAAA,IACvD;AACA,IAAA,MAAM,EAAE,UAAA,EAAY,CAAA,EAAG,GAAG,OAAM,GAAI,aAAA;AACpC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,KAAK,CAAA;AAC7C,IAAA,IAAI,IAAA,CAAK,qBAAqB,IAAA,EAAM;AAClC,MAAA,MAAM,OAAO,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,OAAA,EAAS,OAAO,OAAO,CAAA;AAC7D,MAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,IAAA,EAAM,MAAA,CAAO,EAAE,CAAA;AAAA,IAC3C;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,MAAA,EAA+C;AAC9D,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,MAAM,eAAe,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,eAAe,QAAQ,CAAA;AACnE,IAAA,MAAM,eAAe,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,eAAe,QAAQ,CAAA;AAEnE,IAAA,MAAM,UAAoB,EAAC;AAE3B,IAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,MAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IACtC;AAEA,IAAA,IAAI,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG,OAAO,OAAA;AAEtC,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,YAAA,EAAc;AACvC,MAAA,MAAM,kBAA4B,EAAC;AACnC,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,YAAA,IAAgB,IAAA;AACjD,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,MAAA,EAAQ,KAAK,SAAA,EAAW;AACvD,QAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,IAAI,SAAS,CAAA;AACjD,QAAA,MAAM,QAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAI,OAAO,CAAA;AAC5C,QAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,SAAA,CAAW,MAAM,KAAK,CAAA;AACpD,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,MAAO,EAAE,GAAG,KAAA,EAAO,SAAA,EAAW,UAAA,CAAW,CAAC,GAAE,CAAE,CAAA;AACjF,QAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAW,QAAQ,CAAA;AAC3D,QAAA,eAAA,CAAgB,IAAA,CAAK,GAAG,YAAY,CAAA;AAAA,MACtC;AACA,MAAA,MAAA,GAAS,eAAA;AAAA,IACX,CAAA,MAAO;AACL,MAAA,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,YAAY,CAAA;AAAA,IACrD;AAEA,IAAA,IAAI,IAAA,CAAK,qBAAqB,IAAA,EAAM;AAClC,MAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,QAAA,MAAM,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,IAAI,OAAO,CAAA;AACvD,QAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,EAAE,CAAA;AAAA,MACxC;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,MAAM,CAAA;AACtB,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,EAAA,EAAoC;AAC5C,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAAA,EAC5B;AAAA,EAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,EAAE,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,WAAW,GAAA,EAAgC;AAC/C,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA;AAAA,EACpC;AAAA,EAEA,MAAM,MAAM,EAAA,EAA2B;AACrC,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAI,EAAE,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,QAAA,CAAS,UAAU,EAAE,CAAA;AACxC,IAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,EAAE,CAAA;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,MAAA,EAA6C;AACvD,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA;AAAA,EAClC;AAAA,EAEA,MAAM,SAAS,KAAA,EAA+C;AAC5D,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,IAAA,CAAK,aAAa,KAAA,CAAM,KAAA,KAAU,MAAM,QAAA,KAAa,UAAA,IAAc,KAAA,CAAM,QAAA,KAAa,QAAA,CAAA,EAAW;AACnG,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,KAAA,CAAM,KAAK,CAAC,CAAA;AACrD,MAAA,SAAA,GAAY,KAAK,CAAC,CAAA;AAAA,IACpB;AACA,IAAA,IAAI,UAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,OAAO,SAAS,CAAA;AAC1D,IAAA,IAAI,MAAM,YAAA,EAAc;AACtB,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,SAAA,IAAa,MAAM,YAAa,CAAA;AAAA,IACpE;AACA,IAAA,IAAI,MAAM,aAAA,EAAe;AACvB,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,SAAA,IAAa,MAAM,aAAc,CAAA;AAAA,IACrE;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,eAAe,OAAA,EAAmD;AACtE,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,GAAA;AACvC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS;AAAA,MAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,KAAA,EAAO,KAAK,MAAA,CAAO,WAAA;AAAA,MACnB,UAAU,OAAA,CAAQ;AAAA,KACnB,CAAA;AACD,IAAA,OAAO,IAAA,CAAK,SAAS,OAAA,CAAQ,QAAA,EAAU,EAAE,GAAG,OAAA,EAAS,WAAW,CAAA;AAAA,EAClE;AAAA,EAEA,MAAM,SAAA,CACJ,OAAA,EACA,OAAA,EACoD;AACpD,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,MAAM,gBAAgB,qCAAqC,CAAA;AAAA,IAC7D;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS;AAAA,MAC9C,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,WAAA,EAAa,OAAA,CAAQ,WAAA,IAAe,CAAC,aAAa,CAAA;AAAA,MAClD,KAAA,EAAO,KAAK,MAAA,CAAO,aAAA;AAAA,MACnB,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,IAAI,WAAA,GAAc,WAAA;AAClB,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,WAAA,GAAc,YAAY,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,SAAA,GAAY,QAAQ,SAAU,CAAA;AAAA,IAC1E;AACA,IAAA,IAAI,QAAQ,cAAA,EAAgB;AAC1B,MAAA,MAAM,SAAS,CAAC,GAAG,WAAW,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,UAAU,OAAA,EAAQ,GAAI,CAAA,CAAE,SAAA,CAAU,SAAS,CAAA;AAC5F,MAAA,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAG,MAAA,CAAO,MAAA,GAAS,OAAA,CAAQ,cAAc,CAAC,CAAA;AAAA,IACnF;AACA,IAAA,IAAI,OAAA,CAAQ,WAAA,IAAe,WAAA,CAAY,MAAA,GAAS,QAAQ,WAAA,EAAa;AACnE,MAAA,MAAM,SAAS,CAAC,GAAG,WAAW,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,UAAU,OAAA,EAAQ,GAAI,CAAA,CAAE,SAAA,CAAU,SAAS,CAAA;AAC5F,MAAA,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,OAAA,CAAQ,WAAW,CAAA;AAAA,IACnD;AAEA,IAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,MAAA,MAAM,gBAAgB,0BAA0B,CAAA;AAAA,IAClD;AAEA,IAAA,IAAI,cAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,UAAU,WAAA,EAAa,OAAA,EAAS,QAAQ,MAAM,CAAA;AACnF,MAAA,cAAA,GAAiB,MAAA,CAAO,cAAA;AAAA,IAC1B,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,GAAU,GAAA,YAAe,QAAQ,GAAA,GAAM,IAAI,MAAM,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA;AAC7D,MAAA,MAAM,GAAA;AAAA,IACR;AAEA,IAAA,MAAM,OAAA,GAAkB,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM;AAAA,MAC/C,OAAA,EAAS,OAAA,CAAQ,OAAA,IAAW,WAAA,CAAY,CAAC,CAAA,CAAE,OAAA;AAAA,MAC3C,OAAA,EAAS,cAAA;AAAA,MACT,UAAA,EAAY,SAAA;AAAA,MACZ,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,GAAG,WAAA,CAAY,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAC,CAAA;AAAA,MAC5D,gBAAA,EACE,WAAA,CAAY,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,gBAAA,EAAkB,CAAC,CAAA,GAAI,WAAA,CAAY,MAAA;AAAA,MAC5E,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,MAChB,QAAA,EAAU,WAAA,CAAY,CAAC,CAAA,CAAE;AAAA,KAC1B,CAAA;AAED,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,IAAI,CAAC,QAAQ,aAAA,EAAe;AAC1B,MAAA,MAAM,MAAM,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AACvC,MAAA,YAAA,GAAe,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA;AAAA,IAClD;AAEA,IAAA,OAAO,EAAE,SAAS,YAAA,EAAa;AAAA,EACjC;AAAA,EAEA,OAAO,gBAAgB,OAAA,EAA2E;AAChG,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,MAAM,gBAAgB,qCAAqC,CAAA;AAAA,IAC7D;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS;AAAA,MAC9C,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,WAAA,EAAa,OAAA,CAAQ,WAAA,IAAe,CAAC,aAAa,CAAA;AAAA,MAClD,KAAA,EAAO,KAAK,MAAA,CAAO,aAAA;AAAA,MACnB,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,IAAI,WAAA,GAAc,WAAA;AAClB,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,WAAA,GAAc,YAAY,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,SAAA,GAAY,QAAQ,SAAU,CAAA;AAAA,IAC1E;AACA,IAAA,IAAI,QAAQ,cAAA,EAAgB;AAC1B,MAAA,MAAM,SAAS,CAAC,GAAG,WAAW,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,UAAU,OAAA,EAAQ,GAAI,CAAA,CAAE,SAAA,CAAU,SAAS,CAAA;AAC5F,MAAA,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAG,MAAA,CAAO,MAAA,GAAS,OAAA,CAAQ,cAAc,CAAC,CAAA;AAAA,IACnF;AACA,IAAA,IAAI,OAAA,CAAQ,WAAA,IAAe,WAAA,CAAY,MAAA,GAAS,QAAQ,WAAA,EAAa;AACnE,MAAA,MAAM,SAAS,CAAC,GAAG,WAAW,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,UAAU,OAAA,EAAQ,GAAI,CAAA,CAAE,SAAA,CAAU,SAAS,CAAA;AAC5F,MAAA,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,OAAA,CAAQ,WAAW,CAAA;AAAA,IACnD;AAEA,IAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,MAAA,MAAM,gBAAgB,0BAA0B,CAAA;AAAA,IAClD;AAEA,IAAA,OAAO,KAAK,UAAA,CAAW,eAAA,CAAgB,WAAA,EAAa,OAAA,EAAS,QAAQ,MAAM,CAAA;AAAA,EAC7E;AAAA,EAEA,MAAM,MAAM,QAAA,EAAuE;AACjF,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,EAAE,OAAA,EAAS,QAAA,CAAS,OAAA,EAAS,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA;AAC3G,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,QAAQ,CAAA;AACtD,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,IAAA,CAAK,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAC7C,IAAA,MAAM,YAAY,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAC/E,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,KAAA,GAAQ,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA;AAAA,IACjD;AACA,IAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAM;AAAA,EACpC;AAAA,EAEA,MAAM,YAAY,QAAA,EAA2E;AAC3F,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,EAAE,OAAA,EAAS,QAAA,CAAS,OAAA,EAAS,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA;AAC3G,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,QAAQ,CAAA;AACtD,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,IAAA,CAAK,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAC7C,IAAA,MAAM,aAAa,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAChF,IAAA,OAAO,EAAE,UAAA,EAAY,KAAA,EAAO,UAAA,CAAW,MAAA,EAAO;AAAA,EAChD;AAAA,EAEA,MAAM,OAAO,OAAA,EAAqC;AAChD,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,OAAO,IAAA,CAAK,QAAQ,QAAA,CAAS,EAAE,SAAS,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY,CAAA;AAAA,EACzE;AAAA,EAEA,MAAM,MAAM,OAAA,EAAwC;AAClD,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,EAAE,OAAA,EAAS,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY,CAAA;AACvF,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,MAAM,UAAkG,EAAC;AACzG,IAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,MAAA,GAAsB,IAAA;AAC1B,IAAA,IAAI,MAAA,GAAsB,IAAA;AAE1B,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,eAAA,IAAmB,CAAA,CAAE,UAAA;AACrB,MAAA,MAAA,CAAO,EAAE,UAAU,CAAA,GAAA,CAAK,OAAO,CAAA,CAAE,UAAU,KAAK,CAAA,IAAK,CAAA;AAErD,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAA,EAAQ,CAAA,CAAE,SAAA,EAAW,iBAAiB,CAAA,EAAE;AAC7G,MAAA,KAAA,CAAM,KAAA,EAAA;AACN,MAAA,KAAA,CAAM,mBAAmB,CAAA,CAAE,UAAA;AAC3B,MAAA,IAAI,EAAE,SAAA,GAAY,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,SAAS,CAAA,CAAE,SAAA;AACjD,MAAA,IAAI,EAAE,SAAA,GAAY,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,SAAS,CAAA,CAAE,SAAA;AACjD,MAAA,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAA,GAAI,KAAA;AAErB,MAAA,IAAI,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,SAAA,IAAa,GAAA,EAAK,OAAA,EAAA;AACvC,MAAA,IAAI,CAAC,MAAA,IAAU,CAAA,CAAE,SAAA,GAAY,MAAA,WAAiB,CAAA,CAAE,SAAA;AAChD,MAAA,IAAI,CAAC,MAAA,IAAU,CAAA,CAAE,SAAA,GAAY,MAAA,WAAiB,CAAA,CAAE,SAAA;AAAA,IAClD;AAEA,IAAA,MAAM,eAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC7C,MAAA,YAAA,CAAa,EAAE,CAAA,GAAI,EAAE,KAAA,EAAO,CAAA,CAAE,OAAO,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,MAAA,EAAQ,EAAE,MAAA,EAAQ,aAAA,EAAe,CAAA,CAAE,eAAA,GAAkB,EAAE,KAAA,EAAM;AAAA,IACtH;AAEA,IAAA,OAAO;AAAA,MACL,OAAO,QAAA,CAAS,MAAA;AAAA,MAChB,OAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,eAAe,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,eAAA,GAAkB,SAAS,MAAA,GAAS,CAAA;AAAA,MACzE,MAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,OAAA,EAAkC;AACjD,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,EAAE,OAAA,EAAS,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,GAAA,EAAQ,CAAA;AAChG,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAClC,IAAA,OAAO,IAAA,CAAK,QAAQ,UAAA,CAAW,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAM,MAAM,GAAA,EAAgC;AAC1C,IAAA,MAAM,KAAK,WAAA,EAAY;AACvB,IAAA,IAAI,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,MAAM,gBAAgB,sCAAsC,CAAA;AAEhF,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,MAAA,MAAM,CAAA,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAI,EAAE,CAAA;AACnC,MAAA,IAAI,CAAA,EAAG,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA;AAAA,IACxB;AACA,IAAA,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,MAAM,gBAAgB,2CAA2C,CAAA;AAE1F,IAAA,MAAM,MAAA,GAAS,SAAS,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,UAAA,GAAa,CAAA,CAAE,UAAU,CAAA;AAClE,IAAA,MAAM,MAAA,GAAS,OAAO,CAAC,CAAA;AACvB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAE3B,IAAA,MAAM,aAAA,GAAgB;AAAA,MACpB,MAAA,CAAO,OAAA;AAAA,MACP,EAAA;AAAA,MACA,kBAAA,GAAqB,KAAK,MAAA,GAAS,uBAAA;AAAA,MACnC,GAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,GAAO,EAAE,OAAO;AAAA,KACrC,CAAE,KAAK,IAAI,CAAA;AAEX,IAAA,MAAM,UAAA,GAAa,CAAC,GAAG,IAAI,GAAA,CAAI,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA;AAC/D,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,GAAG,MAAA,CAAO,QAAA;AAAA,MACV,YAAY,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE;AAAA,KAClC;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM;AAAA,MACvC,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,OAAA,EAAS,aAAA;AAAA,MACT,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,kBAAkB,MAAA,CAAO,gBAAA;AAAA,MACzB,IAAA,EAAM,UAAA;AAAA,MACN,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,QAAA,EAAU,cAAA;AAAA,MACV,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAED,IAAA,MAAM,IAAA,CAAK,QAAQ,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAEnD,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAc,gBAAA,GAAkC;AAC9C,IAAA,IAAI,IAAA,CAAK,qBAAqB,IAAA,EAAM;AACpC,IAAA,IAAA,CAAK,gBAAA,uBAAuB,GAAA,EAAI;AAChC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,EAAE,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW,CAAA;AAC7E,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,MAAM,OAAO,IAAA,CAAK,YAAA,CAAa,CAAA,CAAE,OAAA,EAAS,EAAE,OAAO,CAAA;AACnD,MAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,EAAE,CAAA;AAAA,IACtC;AAAA,EACF;AAAA,EAEQ,YAAA,CAAa,SAAiB,OAAA,EAAyB;AAC7D,IAAA,MAAM,UAAA,GAAa,GAAG,OAAO,CAAA,EAAA,EAAK,QAAQ,WAAA,EAAY,CAAE,MAAM,CAAA,CAAA;AAC9D,IAAA,IAAI,IAAA,GAAO,qBAAA;AACX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC1C,MAAA,IAAA,IAAQ,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,CAAC,CAAC,CAAA;AACvC,MAAA,IAAA,IAAQ,cAAA;AAAA,IACV;AACA,IAAA,OAAO,IAAA,CAAK,SAAS,EAAE,CAAA;AAAA,EACzB;AACF,CAAA;;;AC7bO,IAAM,yBAAN,MAAwD;AAAA,EACpD,YAAA,GAAoC,EAAE,YAAA,EAAc,KAAA,EAAM;AAAA,EAC3D,QAAA,uBAA0C,GAAA,EAAI;AAAA,EAEtD,MAAM,UAAA,GAA4B;AAAA,EAAC;AAAA,EAEnC,UAAA,GAAqB;AACnB,IAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,UAAA,EAAW,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,MAAM,KAAA,EAA0C;AACpD,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,MAAA,GAAuB;AAAA,MAC3B,EAAA,EAAI,KAAA,CAAM,EAAA,IAAM,IAAA,CAAK,UAAA,EAAW;AAAA,MAChC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAa,MAAM,UAAA,IAAc,aAAA;AAAA,MACjC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAY,MAAM,UAAA,IAAc,GAAA;AAAA,MAChC,gBAAA,EAAkB,MAAM,gBAAA,IAAoB,CAAA;AAAA,MAC5C,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAA,MACrB,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY,EAAC;AAAA,MAC7B,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,SAAA,EAAW,MAAM,SAAA,IAAa,GAAA;AAAA,MAC9B,UAAA,EAAY;AAAA,KACd;AACA,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,MAAM,CAAA;AACnC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,MAAA,EAA+C;AAC9D,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,EAAA,EAAoC;AAC5C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AACnC,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,IAAI,OAAO,SAAA,IAAa,MAAA,CAAO,SAAA,oBAAa,IAAI,MAAK,EAAG;AACtD,MAAA,IAAA,CAAK,QAAA,CAAS,OAAO,EAAE,CAAA;AACvB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,IAAI,CAAC,KAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG,MAAM,QAAA,CAAS,QAAA,EAAU,EAAE,CAAA;AACvD,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,EAAE,CAAA;AAAA,EACzB;AAAA,EAEA,MAAM,WAAW,GAAA,EAAgC;AAC/C,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG;AACzB,QAAA,IAAA,CAAK,QAAA,CAAS,OAAO,EAAE,CAAA;AACvB,QAAA,KAAA,EAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,QAAA,CAAS,KAAA,EAA4B,UAAA,EAA0C;AACnF,IAAA,IAAI,UAAU,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAG/C,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,SAAA,GAAY,GAAG,CAAA;AAEjE,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,KAAY,MAAM,OAAO,CAAA;AAAA,IAC7D;AACA,IAAA,IAAI,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,WAAA,CAAY,SAAS,CAAA,EAAG;AACrD,MAAA,OAAA,GAAU,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,MAAM,WAAA,CAAa,QAAA,CAAS,CAAA,CAAE,UAAU,CAAC,CAAA;AAAA,IAC3E;AACA,IAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,EAAG;AACvC,MAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,EAAM,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAM,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAAA,IAC9E;AACA,IAAA,IAAI,MAAM,KAAA,EAAO;AACf,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACnE,MAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM;AAC9B,QAAA,MAAM,OAAA,GAAU,CAAA,CAAE,OAAA,CAAQ,WAAA,EAAY;AACtC,QAAA,OAAO,MAAM,IAAA,CAAK,CAAC,MAAM,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,MAC9C,CAAC,CAAA;AAAA,IACH;AACA,IAAA,IAAI,MAAM,YAAA,EAAc;AACtB,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,SAAA,IAAa,MAAM,YAAa,CAAA;AAAA,IACpE;AACA,IAAA,IAAI,MAAM,aAAA,EAAe;AACvB,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,SAAA,IAAa,MAAM,aAAc,CAAA;AAAA,IACrE;AAEA,IAAA,QAAQ,MAAM,QAAA;AAAU,MACtB,KAAK,QAAA;AACH,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,OAAA,EAAQ,GAAI,CAAA,CAAE,UAAA,CAAW,OAAA,EAAS,CAAA;AACtE,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,UAAA,GAAa,EAAE,UAAU,CAAA;AAClD,QAAA;AAAA,MACF,KAAK,QAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL;AACE,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,UAAA,GAAa,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,WAAW,OAAA,EAAQ,GAAI,CAAA,CAAE,UAAA,CAAW,SAAS,CAAA;AACrG,QAAA;AAAA;AAIJ,IAAA,IAAI,KAAA,CAAM,UAAU,KAAA,EAAO;AACzB,MAAA,KAAA,MAAW,KAAK,OAAA,CAAQ,KAAA,CAAM,GAAG,KAAA,CAAM,KAAA,IAAS,EAAE,CAAA,EAAG;AACnD,QAAA,CAAA,CAAE,UAAA,uBAAiB,IAAA,EAAK;AAAA,MAC1B;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,EAAA;AAC7B,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,MAAM,MAAA,EAA6C;AACvD,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,IAAI,UAAU,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,CAC5C,MAAA,CAAO,CAAC,MAAM,CAAC,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,YAAY,GAAG,CAAA;AAElD,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,KAAY,OAAO,OAAO,CAAA;AAAA,IAC9D;AACA,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,UAAA,KAAe,OAAO,UAAU,CAAA;AAAA,IACpE;AACA,IAAA,IAAI,MAAA,EAAQ,kBAAkB,MAAA,EAAW;AACvC,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,UAAA,IAAc,OAAO,aAAc,CAAA;AAAA,IACvE;AACA,IAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,EACjB;AAAA,EAEA,MAAM,MAAM,EAAA,EAA2B;AACrC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AACnC,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,QAAA,CAAS,UAAU,EAAE,CAAA;AACxC,IAAA,MAAA,CAAO,UAAA,uBAAiB,IAAA,EAAK;AAAA,EAC/B;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,EACtB;AAAA,EAEA,cAAA,GAA2B;AACzB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAAA,EAC1C;AACF;;;ACvJO,IAAM,qBAAA,GAAwB,IAAA;AAG9B,SAAS,YAAY,IAAA,EAAsB;AAChD,EAAA,IAAI,OAAA,GAAU,KAAK,IAAA,EAAK;AAExB,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,8BAA8B,CAAA;AAC/D,EAAA,IAAI,UAAA,EAAY,OAAA,GAAU,UAAA,CAAW,CAAC,EAAE,IAAA,EAAK;AAC7C,EAAA,OAAO,OAAA;AACT;AAGO,SAAS,SAAA,CAAU,IAAA,EAAc,GAAA,GAAM,CAAA,EAAa;AACzD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,IAAI,CAAC,CAAA;AAC3C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,IAAK,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,KAAe,OAAO,CAAA,KAAM,QAAQ,CAAA,EAAG;AAChF,MAAA,OAAQ,MAAA,CAAoB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAY,CAAE,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAAA,IAC7E;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,IAAA,CACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,CAAE,IAAA,GAAO,WAAA,EAAa,CAAA,CACzD,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAC1B,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AACjB;;;AC1BO,IAAM,WAAN,MAAe;AAAA,EACX,MAAA;AAAA,EAED,MAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA,uBAAoB,GAAA,EAAoB;AAAA,EACxC,eAAA,GAAkB,CAAA;AAAA,EAE1B,YAAY,MAAA,EAAwB;AAClC,IAAA,IAAI,CAAC,OAAO,GAAA,EAAK;AACf,MAAA,MAAM,YAAY,0BAA0B,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,IAAI,sBAAA,EAAuB;AAE5D,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,WAAA,CAAY;AAAA,MAC5B,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,YAAA,EAAc,MAAA,CAAO,QAAA,EAAU,YAAA,IAAgB,IAAA;AAAA,MAC/C,mBAAA,EAAqB,OAAO,QAAA,EAAU;AAAA,KACvC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,QAAQ,KAAA,EAA6C;AAEzD,IAAA,IAAI,aAAa,KAAA,CAAM,UAAA;AACvB,IAAA,IAAI,OAAO,KAAA,CAAM,IAAA;AAEjB,IAAA,MAAM,cAAA,GAAiB,UAAA,KAAe,MAAA,IAAa,IAAA,CAAK,OAAO,QAAA,EAAU,cAAA;AACzE,IAAA,MAAM,QAAA,GAAA,CAAY,CAAC,IAAA,IAAQ,IAAA,CAAK,WAAW,CAAA,KAAM,IAAA,CAAK,OAAO,QAAA,EAAU,QAAA;AAEvE,IAAA,IAAI,kBAAkB,QAAA,EAAU;AAC9B,MAAA,IAAI;AACF,QAAA,IAAI,kBAAkB,QAAA,EAAU;AAE9B,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,IAAI,QAAA,CAAS;AAAA,YAC5C,MAAA,EACE,wKAAA;AAAA,YACF,MAAM,KAAA,CAAM,OAAA;AAAA,YACZ,SAAA,EAAW,qBAAA;AAAA,YACX,WAAA,EAAa;AAAA,WACd,CAAA;AACD,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,oBAAA,CAAqB,MAAA,CAAO,IAAI,CAAA;AACpD,UAAA,IAAI,MAAA,CAAO,UAAA,KAAe,KAAA,CAAA,EAAW,UAAA,GAAa,MAAA,CAAO,UAAA;AACzD,UAAA,IAAI,MAAA,CAAO,IAAA,EAAM,IAAA,GAAO,MAAA,CAAO,IAAA;AAAA,QACjC,WAAW,cAAA,EAAgB;AACzB,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,IAAI,QAAA,CAAS;AAAA,YAC5C,MAAA,EACE,kLAAA;AAAA,YACF,MAAM,KAAA,CAAM,OAAA;AAAA,YACZ,SAAA,EAAW,qBAAA;AAAA,YACX,WAAA,EAAa;AAAA,WACd,CAAA;AACD,UAAA,MAAM,MAAA,GAAS,UAAA,CAAW,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAC5C,UAAA,UAAA,GAAa,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAM,CAAC,CAAA,GAAI,GAAA;AAAA,QAC5E,WAAW,QAAA,EAAU;AACnB,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,IAAI,QAAA,CAAS;AAAA,YAC5C,MAAA,EACE,wKAAA;AAAA,YACF,MAAM,KAAA,CAAM,OAAA;AAAA,YACZ,SAAA,EAAW,qBAAA;AAAA,YACX,WAAA,EAAa;AAAA,WACd,CAAA;AACD,UAAA,IAAA,GAAO,SAAA,CAAU,OAAO,IAAI,CAAA;AAAA,QAC9B;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,IAAA,CAAK,OAAO,KAAA,EAAO,OAAA;AAAA,UACjB,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,UAClD;AAAA,SACF;AACA,QAAA,IAAI,UAAA,KAAe,QAAW,UAAA,GAAa,GAAA;AAC3C,QAAA,IAAI,CAAC,IAAA,EAAM,IAAA,GAAO,EAAC;AAAA,MACrB;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAgC;AAAA,MACpC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAY,MAAM,UAAA,IAAc,aAAA;AAAA,MAChC,YAAY,UAAA,IAAc,GAAA;AAAA,MAC1B,gBAAA,EAAkB,MAAM,gBAAA,IAAoB,CAAA;AAAA,MAC5C,IAAA,EAAM,QAAQ,EAAC;AAAA,MACf,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY,EAAC;AAAA,MAC7B,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,YAAY,KAAA,CAAM;AAAA,KACpB;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,WAAW,CAAA;AAClD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,cAAA,GAAiB,MAAM,CAAA;AAE1C,IAAA,MAAM,SAAS,IAAA,CAAK,aAAA,CAAc,IAAI,KAAA,CAAM,OAAO,KAAK,CAAA,IAAK,CAAA;AAC7D,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAA,CAAM,OAAA,EAAS,KAAK,CAAA;AAG3C,IAAA,IAAI,cAAA;AACJ,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,sBAAA,IAA0B,GAAA;AAClE,IAAA,IAAI,SAAA,GAAY,CAAA,IAAK,KAAA,GAAQ,SAAA,KAAc,CAAA,EAAG;AAC1C,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,SAAA;AAAA,UAC/B;AAAA,YACE,SAAS,KAAA,CAAM,OAAA;AAAA,YACf,WAAA,EAAa,CAAC,aAAa,CAAA;AAAA,YAC3B,cAAA,EAAgB,CAAA;AAAA,YAChB,WAAA,EAAa,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,KAAK;AAAA,WACjC;AAAA,UACA,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,OAAA,GACf,CAAC,GAAA,KAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,CAAO,OAAA,CAAS,GAAA,EAAK,WAAW,CAAA,GACrD,KAAA;AAAA,SACN;AACA,QAAA,cAAA,GAAiB,MAAA,CAAO,OAAA;AACxB,QAAA,IAAA,CAAK,OAAO,KAAA,EAAO,gBAAA,GAAmB,MAAA,CAAO,OAAA,EAAS,OAAO,YAAY,CAAA;AAAA,MAC3E,SAAS,GAAA,EAAK;AACZ,QAAA,IAAA,CAAK,OAAO,KAAA,EAAO,OAAA;AAAA,UACjB,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,UAClD;AAAA,SACF;AAAA,MACF;AAAA,IACJ;AAGA,IAAA,IAAA,CAAK,eAAA,EAAA;AACL,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,aAAA;AAC5C,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,aAAA,IAAiB,GAAA;AAC7D,IAAA,IAAI,aAAA,IAAiB,IAAA,CAAK,eAAA,GAAkB,aAAA,KAAkB,CAAA,EAAG;AAC/D,MAAA,IAAI;AACF,QAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,aAAa,CAAA;AACzD,QAAA,IAAI,WAAA,CAAY,QAAQ,CAAA,EAAG;AACzB,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,cAAA,GAAiB,WAAA,CAAY,MAAM,CAAA;AAAA,QACxD;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,IAAA,CAAK,OAAO,KAAA,EAAO,OAAA;AAAA,UACjB,eAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,UAClD;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,QAAQ,cAAA,EAAe;AAAA,EAClC;AAAA,EAEA,MAAM,OAAO,OAAA,EAA6C;AACxD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,OAAO,OAAO,CAAA;AACjD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,CAAA;AAAA,MACT,QAAA;AAAA,MACA,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACrC;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,QAAA,EAA2C;AACtD,IAAA,IAAI,QAAA,CAAS,YAAY,CAAA,EAAG;AAC1B,MAAA,MAAM,eAAA,CAAgB,CAAA,8BAAA,EAAiC,QAAA,CAAS,OAAO,CAAA,CAAE,CAAA;AAAA,IAC3E;AACA,IAAA,MAAM,WAAW,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AAC/C,MAAA,MAAM,SAAA,GAAY,OAAO,CAAA,CAAE,SAAA,KAAc,QAAA,GAAW,IAAI,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA,GAAI,CAAA,CAAE,SAAA;AAC9E,MAAA,MAAM,SAAA,GAAY,OAAO,CAAA,CAAE,SAAA,KAAc,QAAA,GAAW,IAAI,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA,GAAI,CAAA,CAAE,SAAA;AAC9E,MAAA,MAAM,KAAA,GAAQ,EAAE,EAAA,GAAK,CAAA,IAAA,EAAO,EAAE,EAAE,CAAA,CAAA,GAAK,SAAS,CAAC,CAAA,CAAA;AAC/C,MAAA,IAAI,SAAA,IAAa,KAAA,CAAM,SAAA,CAAU,OAAA,EAAS,CAAA,EAAG;AAC3C,QAAA,MAAM,eAAA,CAAgB,iCAAiC,KAAK,CAAA,GAAA,EAAM,OAAO,CAAA,CAAE,SAAS,CAAC,CAAA,CAAE,CAAA;AAAA,MACzF;AACA,MAAA,IAAI,SAAA,IAAa,KAAA,CAAM,SAAA,CAAU,OAAA,EAAS,CAAA,EAAG;AAC3C,QAAA,MAAM,eAAA,CAAgB,iCAAiC,KAAK,CAAA,GAAA,EAAM,OAAO,CAAA,CAAE,SAAS,CAAC,CAAA,CAAE,CAAA;AAAA,MACzF;AACA,MAAA,OAAO,EAAE,GAAG,CAAA,EAAG,SAAA,EAAW,SAAA,EAAU;AAAA,IACtC,CAAC,CAAA;AACD,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,QAAQ,CAAA;AAAA,EACvC;AAAA,EAEA,MAAM,MAAA,GAAgC;AACpC,IAAA,MAAM,SAAuB,EAAE,OAAA,EAAS,OAAO,GAAA,EAAK,KAAA,EAAO,WAAW,KAAA,EAAM;AAE5E,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,OAAO,KAAA,EAAM;AACxB,MAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AAAA,IACnB,CAAA,CAAA,MAAQ;AAAA,IAA6B;AAErC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAA,CAAS,EAAE,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,CAAA,EAAG,CAAA;AAC7E,MAAA,MAAA,CAAO,GAAA,GAAM,IAAA;AAAA,IACf,CAAA,CAAA,MAAQ;AAAA,IAAyB;AAEjC,IAAA,IAAI,IAAA,CAAK,OAAO,SAAA,EAAW;AACzB,MAAA,IAAI;AACF,QAAA,MAAM,KAAK,MAAA,CAAO,SAAA,CAAU,KAAA,CAAM,CAAC,cAAc,CAAC,CAAA;AAClD,QAAA,MAAA,CAAO,SAAA,GAAY,IAAA;AAAA,MACrB,CAAA,CAAA,MAAQ;AAAA,MAA+B;AAAA,IACzC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EAC3B;AAAA,EAEQ,qBACN,IAAA,EAC0C;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,IAAI,CAAC,CAAA;AACzC,MAAA,MAAM,SAAmD,EAAC;AAC1D,MAAA,IAAI,OAAO,KAAK,UAAA,KAAe,QAAA,IAAY,OAAO,QAAA,CAAS,IAAA,CAAK,UAAU,CAAA,EAAG;AAC3E,QAAA,MAAA,CAAO,UAAA,GAAa,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,MAC9D;AACA,MAAA,IACE,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,IACvB,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,KAAe,OAAO,CAAA,KAAM,QAAQ,CAAA,EACrD;AACA,QAAA,MAAA,CAAO,IAAA,GAAQ,IAAA,CAAK,IAAA,CAAkB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAY,CAAE,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,MACrF;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AACF;;;AC7NA,IAAM,SAAA,uBAAgB,GAAA,CAAI;AAAA,EACxB,GAAA;AAAA,EAAK,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,IAAA;AAAA,EAAM,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,MAAA;AAAA,EAC7E,KAAA;AAAA,EAAO,GAAA;AAAA,EAAK,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,KAAA;AAAA,EAClF,MAAA;AAAA,EAAQ,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,IAAA;AAAA,EAAM,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,KAAA;AAAA,EAAO,KAAA;AAAA,EAC5E,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,MAAA;AAAA;AAAA,EAEf,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,QAAA;AAAA,EAAU,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS;AAC3E,CAAC,CAAA;AAGM,SAAS,SAAS,IAAA,EAAwB;AAC/C,EAAA,OAAO,KAAK,WAAA,EAAY,CAAE,KAAA,CAAM,iBAAiB,KAAK,EAAC;AACzD;AAGO,SAAS,WAAW,IAAA,EAAwB;AACjD,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,IAAI,IAAI,QAAA,CAAS,IAAI,CAAC,CAAC,CAAA;AACzC,EAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,CAAC,MAAM,CAAC,SAAA,CAAU,GAAA,CAAI,CAAC,CAAC,CAAA;AACxD,EAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,UAAA,GAAa,KAAA,EAAO,GAAA,CAAI,IAAI,CAAC,CAAC,CAAA;AAC5E;AAGO,SAAS,cAAc,IAAA,EAAwB;AACpD,EAAA,OAAO,QAAA,CAAS,IAAI,CAAA,CAAE,GAAA,CAAI,IAAI,CAAA;AAChC;AAKA,IAAM,KAAA,GAAgC;AAAA,EACpC,OAAA,EAAS,KAAA;AAAA,EAAO,MAAA,EAAQ,MAAA;AAAA,EAAQ,IAAA,EAAM,MAAA;AAAA,EAAQ,IAAA,EAAM,MAAA;AAAA,EAAQ,IAAA,EAAM,KAAA;AAAA,EAAO,GAAA,EAAK,KAAA;AAAA,EAC9E,IAAA,EAAM,IAAA;AAAA,EAAM,KAAA,EAAO,KAAA;AAAA,EAAO,GAAA,EAAK,GAAA;AAAA,EAAK,KAAA,EAAO,KAAA;AAAA,EAAO,OAAA,EAAS,KAAA;AAAA,EAAO,KAAA,EAAO,KAAA;AAAA,EACzE,IAAA,EAAM,KAAA;AAAA,EAAO,KAAA,EAAO,IAAA;AAAA,EAAM,OAAA,EAAS,KAAA;AAAA,EAAO,OAAA,EAAS,KAAA;AAAA,EAAO,OAAA,EAAS,KAAA;AAAA,EAAO,KAAA,EAAO,IAAA;AAAA,EACjF,KAAA,EAAO,KAAA;AAAA,EAAO,MAAA,EAAQ,KAAA;AAAA,EAAO,IAAA,EAAM;AACrC,CAAA;AAEA,IAAM,KAAA,GAAgC;AAAA,EACpC,KAAA,EAAO,IAAA;AAAA,EAAM,KAAA,EAAO,EAAA;AAAA,EAAI,KAAA,EAAO,IAAA;AAAA,EAAM,KAAA,EAAO,IAAA;AAAA,EAAM,IAAA,EAAM,IAAA;AAAA,EAAM,GAAA,EAAK,EAAA;AAAA,EAAI,IAAA,EAAM;AAC/E,CAAA;AAGA,IAAM,KAAA,GAAQ,qFAAA;AAEd,IAAM,CAAA,GAAI,UAAA;AACV,IAAM,CAAA,GAAI,UAAA;AACV,IAAM,EAAA,GAAK,GAAG,CAAC,CAAA,UAAA,CAAA;AACf,IAAM,EAAA,GAAK,GAAG,CAAC,CAAA,QAAA,CAAA;AACf,IAAM,IAAA,GAAO,IAAI,MAAA,CAAO,CAAA,EAAA,EAAK,EAAE,CAAA,EAAA,EAAK,EAAE,CAAA,EAAG,EAAE,CAAA,CAAE,CAAA;AAC7C,IAAM,IAAA,GAAO,IAAI,MAAA,CAAO,CAAA,EAAA,EAAK,EAAE,CAAA,EAAA,EAAK,EAAE,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,CAAK,CAAA;AACtD,IAAM,IAAA,GAAO,IAAI,MAAA,CAAO,CAAA,EAAA,EAAK,EAAE,CAAA,EAAA,EAAK,EAAE,CAAA,EAAG,EAAE,CAAA,EAAG,EAAE,CAAA,EAAG,EAAE,CAAA,CAAE,CAAA;AACvD,IAAM,YAAY,IAAI,MAAA,CAAO,KAAK,EAAE,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA;AAC5C,IAAM,MAAM,IAAI,MAAA,CAAO,IAAI,EAAE,CAAA,EAAG,CAAC,CAAA,YAAA,CAAc,CAAA;AAExC,SAAS,KAAK,IAAA,EAAsB;AACzC,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,IAAK,CAAC,WAAW,IAAA,CAAK,IAAI,GAAG,OAAO,IAAA;AAEtD,EAAA,IAAI,CAAA,GAAI,IAAA;AACR,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,CAAC,CAAA,KAAM,GAAA;AACxB,EAAA,IAAI,MAAA,EAAQ,CAAA,GAAI,GAAA,GAAM,CAAA,CAAE,MAAM,CAAC,CAAA;AAG/B,EAAA,IAAI,WAAA,CAAY,KAAK,CAAC,CAAA,MAAO,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAAA,OAAA,IACjC,QAAA,CAAS,KAAK,CAAC,CAAA,MAAO,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAG5C,EAAA,IAAI,CAAA;AACJ,EAAA,IAAK,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,YAAY,CAAA,EAAI;AAC/B,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,CAAA,CAAE,CAAC,CAAC,GAAG,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACxC,CAAA,MAAA,IAAY,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,iBAAiB,CAAA,EAAI;AAC3C,IAAA,MAAM,IAAA,GAAO,EAAE,CAAC,CAAA;AAChB,IAAA,IAAI,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,EAAG;AACxB,MAAA,CAAA,GAAI,IAAA;AACJ,MAAA,IAAI,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,IAAK,GAAA;AAAA,WAAA,IACvB,mBAAA,CAAoB,KAAK,CAAC,CAAA,MAAO,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAAA,WAAA,IAC9C,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,IAAK,GAAA;AAAA,IAC7B;AAAA,EACF;AAGA,EAAA,IAAA,CAAK,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,UAAU,MAAM,SAAA,CAAU,IAAA,CAAK,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,GAAA;AAGlE,EAAA,IAAK,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,0IAA0I,CAAA,EAAI;AAC7J,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,KAAA,CAAM,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,EAC5C;AAGA,EAAA,IAAK,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,gDAAgD,CAAA,EAAI;AACnE,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,KAAA,CAAM,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,EAC5C;AAGA,EAAA,IAAK,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,EAAI;AACxB,IAAA,IAAI,IAAA,CAAK,KAAK,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,CAAA,GAAI,EAAE,CAAC,CAAA;AAAA,EAC9B,CAAA,MAAA,IAAY,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,mBAAmB,CAAA,EAAI;AAC7C,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,GAAI,EAAE,CAAC,CAAA;AACvB,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA;AAAA,EAC3B;AAGA,EAAA,IAAK,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,UAAU,CAAA,EAAI;AAC7B,IAAA,MAAM,IAAA,GAAO,EAAE,CAAC,CAAA;AAChB,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,IAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,IAAK,CAAC,GAAA,CAAI,IAAA,CAAK,IAAI,GAAI,CAAA,GAAI,IAAA;AAAA,EACnE;AACA,EAAA,IAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAEpD,EAAA,IAAI,MAAA,EAAQ,CAAA,GAAI,GAAA,GAAM,CAAA,CAAE,MAAM,CAAC,CAAA;AAC/B,EAAA,OAAO,CAAA;AACT;;;AC3EA,IAAM,EAAA,GAAK,GAAA;AACX,IAAM,CAAA,GAAI,IAAA;AAEV,IAAM,aAAA,GAAgB,GAAA;AACtB,IAAM,iBAAA,GAAoB,CAAA;AAcnB,IAAM,mBAAN,MAAuB;AAAA,EAI5B,WAAA,CAAoB,OAAA,EAA0B,MAAA,GAAiC,EAAC,EAAG;AAA/D,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAClB,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAO,cAAA,IAAkB,GAAA;AAC/C,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAO,KAAA,IAAS,IAAA;AAAA,EAC/B;AAAA,EAHoB,OAAA;AAAA,EAHZ,cAAA;AAAA,EACA,KAAA;AAAA,EAOR,MAAM,OAAO,KAAA,EAA2C;AACtD,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,EAAA;AAC7B,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,GAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,KAAA,IAAS,EAAE,CAAA;AAE1C,IAAA,IAAI,SAAsB,EAAC;AAC3B,IAAA,IAAI,UAAA;AAEJ,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,IAAK,IAAA,CAAK,QAAQ,MAAA,IAAU,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAc,UAAA,EAAY;AACpF,MAAA,MAAA,GAAA,CAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO;AAAA,QAClC,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,aAAa,KAAA,CAAM,WAAA;AAAA,QACnB,OAAO,IAAA,CAAK;AAAA,OACb,CAAA,EAAG,GAAA,CAAI,CAAC,EAAE,MAAA,EAAQ,KAAA,EAAM,MAAO,EAAE,MAAA,EAAQ,KAAA,EAAM,CAAE,CAAA;AAAA,IACpD,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC3B,MAAA,UAAA,GAAa,MAAM,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAC5C,MAAA,MAAA,GAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,IACjC;AAEA,IAAA,MAAM,QAAA,GAAW,OAAO,MAAA,KAAW,CAAA;AACnC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,UAAA,KAAe,MAAM,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAC9C,MAAA,MAAA,GAAS,CAAC,GAAG,UAAU,CAAA,CAAE,KAAK,uBAAuB,CAAA,CAAE,GAAA,CAAI,CAAC,MAAA,MAAY,EAAE,MAAA,EAAQ,KAAA,EAAO,GAAE,CAAE,CAAA;AAAA,IAC/F;AAEA,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,MAAA,EAAQ,KAAA,EAAO,QAAQ,CAAA;AACjD,IAAA,IAAI,IAAA,CAAK,KAAA,EAAO,MAAM,IAAA,CAAK,SAAS,IAAI,CAAA;AACxC,IAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAAA,EAC1B;AAAA,EAEA,MAAc,eAAe,KAAA,EAAuC;AAClE,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAoB;AACrC,IAAA,KAAA,MAAW,OAAA,IAAW,IAAI,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,EAAG;AAC7C,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS;AAAA,QAC3C,OAAA;AAAA,QACA,aAAa,KAAA,CAAM,WAAA;AAAA,QACnB,OAAO,IAAA,CAAK,cAAA;AAAA,QACZ,QAAA,EAAU,WAAA;AAAA,QACV,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,KAAA,MAAW,UAAU,QAAA,EAAU,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAI,MAAM,CAAA;AAAA,IAC3D;AACA,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAc,SAAS,IAAA,EAAkC;AACvD,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO;AACzB,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,IAAA,CAAK,GAAA;AAAA,QAAI,CAAC,EAAE,MAAA,EAAO,KACjB,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAO,MAAA,CAAO,EAAE,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,QAE3C,CAAC;AAAA;AACH,KACF;AAAA,EACF;AACF;AAEA,SAAS,IAAA,CAAK,UAAoB,KAAA,EAA8B;AAC9D,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AACnC,EAAA,MAAM,UAAA,GAA0B,QAAA,CAAS,GAAA,CAAI,CAAC,MAAA,KAAW;AACvD,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,CAAA,EAAI,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA,CAAE,CAAA;AACzE,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,KAAA,EAAA,CAAQ,OAAO,GAAA,CAAI,KAAK,CAAA,IAAK,CAAA,IAAK,CAAC,CAAA;AAC1E,IAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,OAAO,MAAA,EAAO;AAAA,EACxD,CAAC,CAAA;AAED,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA,GAAI,UAAA,CAAW,MAAA,IAAU,CAAA;AAC1F,EAAA,MAAM,IAAI,UAAA,CAAW,MAAA;AAGrB,EAAA,MAAM,cAAc,KAAA,CAAM,GAAA;AAAA,IAAI,CAAC,IAAA,KAC7B,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM;AACpB,MAAA,IAAI,EAAA,GAAK,CAAA,CAAE,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,IAAK,CAAA;AAC9B,MAAA,IAAI,IAAA,CAAK,UAAU,iBAAA,EAAmB;AACpC,QAAA,KAAA,MAAW,CAAC,OAAA,EAAS,KAAK,CAAA,IAAK,EAAE,KAAA,EAAO;AACtC,UAAA,IAAI,YAAY,IAAA,IAAQ,OAAA,CAAQ,WAAW,IAAI,CAAA,QAAS,KAAA,GAAQ,aAAA;AAAA,QAClE;AAAA,MACF;AACA,MAAA,OAAO,EAAA;AAAA,IACT,CAAC;AAAA,GACH;AAEA,EAAA,MAAM,OAAoB,EAAC;AAC3B,EAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AAC3B,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,YAAA,KAAiB;AACpC,MAAA,MAAM,EAAA,GAAK,aAAa,CAAC,CAAA;AACzB,MAAA,IAAI,OAAO,CAAA,EAAG;AACd,MAAA,MAAM,KAAK,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,CAAE,MAAA;AAC7C,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,CAAI,CAAA,GAAA,CAAK,IAAI,EAAA,GAAK,GAAA,KAAQ,KAAK,GAAA,CAAI,CAAA;AACpD,MAAA,KAAA,IAAS,GAAA,IAAQ,EAAA,IAAM,EAAA,GAAK,CAAA,CAAA,IAAO,EAAA,GAAK,MAAM,CAAA,GAAI,CAAA,GAAK,CAAA,GAAI,CAAA,CAAE,MAAA,GAAU,SAAA,CAAA,CAAA,CAAA;AAAA,IACzE,CAAC,CAAA;AACD,IAAA,IAAI,KAAA,GAAQ,GAAG,IAAA,CAAK,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EACtD,CAAC,CAAA;AAED,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAS,uBAAA,CAAwB,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,MAAM,CAAC,CAAA;AAC7F;AAEA,SAAS,uBAAA,CAAwB,GAAW,CAAA,EAAmB;AAC7D,EAAA,OAAO,CAAA,CAAE,UAAA,GAAa,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,UAAU,OAAA,EAAQ,GAAI,CAAA,CAAE,SAAA,CAAU,OAAA,EAAQ;AACpF;AAEA,SAAS,YAAA,CAAa,MAAA,EAAqB,KAAA,EAAe,QAAA,EAA+B;AACvF,EAAA,MAAM,OAAoB,EAAC;AAC3B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,IAAA,IAAI,IAAA,CAAK,UAAU,KAAA,EAAO;AAC1B,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,MAAA;AAChC,IAAA,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,KAAA,GAAQ,OAAO,QAAA,EAAU;AAChD,IAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AACb,IAAA,KAAA,IAAS,IAAA;AAAA,EACX;AACA,EAAA,OAAO,IAAA;AACT;;;AC9KO,IAAM,gBAAA,GAAmB;AAEzB,SAAS,iBAAiB,SAAA,EAA2B;AAC1D,EAAA,IAAI,CAAC,SAAA,EAAW,MAAM,IAAI,MAAM,uBAAuB,CAAA;AACvD,EAAA,OAAO,WAAW,SAAS,CAAA,CAAA;AAC7B;AAEO,SAAS,gBAAA,CAAiB,WAAmB,SAAA,EAA2B;AAC7E,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,WAAW,MAAM,IAAI,MAAM,sCAAsC,CAAA;AACpF,EAAA,OAAO,CAAA,QAAA,EAAW,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAC1C;AAGO,SAAS,wBAAwB,SAAA,EAA6B;AACnE,EAAA,OAAO,CAAC,gBAAA,CAAiB,SAAS,CAAA,EAAG,gBAAgB,CAAA;AACvD;;;ACwBA,IAAM,QAAA,GAAW,CAAA;AAEjB,IAAM,UAAA,GACJ,yVAAA;AAWK,IAAM,gBAAN,MAAoB;AAAA,EACjB,OAAA;AAAA,EACA,GAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EAER,YAAY,MAAA,EAA6B;AACvC,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AACtB,IAAA,IAAA,CAAK,MAAM,MAAA,CAAO,GAAA;AAClB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,gBAAA,CAAiB,MAAA,CAAO,SAAS,EAAE,cAAA,EAAgB,MAAA,CAAO,cAAA,EAAgB,CAAA;AAC/F,IAAA,IAAA,CAAK,QAAA,GAAW,OAAO,QAAA,IAAY,IAAA;AACnC,IAAA,IAAA,CAAK,YAAA,GAAe,OAAO,YAAA,IAAgB,GAAA;AAC3C,IAAA,IAAA,CAAK,eAAA,GAAkB,OAAO,eAAA,IAAmB,GAAA;AACjD,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AAAA,EACxB;AAAA,EAEA,MAAM,SAAS,KAAA,EAAuC;AACpD,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAK;AACnC,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,eAAA,CAAgB,yBAAyB,CAAA;AAC7D,IAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,eAAA,EAAiB;AACzC,MAAA,MAAM,eAAA,CAAgB,CAAA,8BAAA,EAAiC,IAAA,CAAK,eAAe,CAAA,WAAA,CAAA,EAAe;AAAA,QACxF,QAAQ,OAAA,CAAQ;AAAA,OACjB,CAAA;AAAA,IACH;AACA,IAAA,IAAI,CAAC,KAAA,CAAM,SAAA,EAAW,MAAM,gBAAgB,uBAAuB,CAAA;AACnE,IAAA,IAAI,KAAA,CAAM,eAAe,MAAA,IAAa,EAAE,MAAM,UAAA,IAAc,CAAA,IAAK,KAAA,CAAM,UAAA,IAAc,CAAA,CAAA,EAAI;AACvF,MAAA,MAAM,gBAAgB,oCAAA,EAAsC,EAAE,UAAA,EAAY,KAAA,CAAM,YAAY,CAAA;AAAA,IAC9F;AAEA,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,MAAM,OAAA,GAAU,KAAK,QAAA,GAAW,MAAM,KAAK,WAAA,CAAY,OAAO,IAAI,EAAC;AACnE,IAAA,MAAM,IAAA,GAAO,CAAC,GAAG,IAAI,GAAA,CAAI,CAAC,GAAI,KAAA,CAAM,IAAA,IAAQ,EAAC,EAAI,GAAG,OAAO,EAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAY,CAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAC,CAAC,CAAA;AAEhH,IAAA,OAAO,IAAA,CAAK,QAAQ,KAAA,CAAM;AAAA,MACxB,SAAS,KAAA,CAAM,SAAA;AAAA,MACf,OAAA;AAAA,MACA,UAAA,EAAY,MAAM,IAAA,IAAQ,aAAA;AAAA,MAC1B,UAAA,EAAY,MAAM,UAAA,IAAc,GAAA;AAAA,MAChC,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AAAA,MAC5B,QAAA,EAAU,EAAE,MAAA,EAAQ,KAAA,CAAM,MAAA;AAAO,KAClC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,KAAA,EAAkD;AAC7D,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,OAAO,IAAA,CAAK,UAAU,MAAA,CAAO;AAAA,MAC3B,UAAU,KAAA,CAAM,UAAA;AAAA,MAChB,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,aAAa,KAAA,CAAM,KAAA;AAAA,MACnB,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,UAAU,KAAA,CAAM;AAAA,KACjB,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,GAAA,CAAI,EAAA,EAAY,UAAA,EAA8C;AAClE,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAI,EAAE,CAAA;AACxC,IAAA,OAAO,UAAU,UAAA,CAAW,QAAA,CAAS,MAAA,CAAO,OAAO,IAAI,MAAA,GAAS,IAAA;AAAA,EAClE;AAAA;AAAA,EAGA,MAAM,MAAA,CAAO,EAAA,EAAY,UAAA,EAAqC;AAC5D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,CAAI,IAAI,UAAU,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,QAAA,CAAS,UAAU,EAAE,CAAA;AACxC,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,EAAE,CAAA;AAAA,EAC9B;AAAA;AAAA,EAGA,MAAM,MAAM,UAAA,EAAuD;AACjE,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,KAAA,MAAW,SAAA,IAAa,IAAI,GAAA,CAAI,UAAU,CAAA,EAAG;AAC3C,MAAA,MAAA,CAAO,SAAS,IAAI,MAAM,IAAA,CAAK,QAAQ,KAAA,CAAM,EAAE,OAAA,EAAS,SAAA,EAAW,CAAA;AAAA,IACrE;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,aAAA,CAAc,IAAA,EAAc,EAAA,EAA6B;AAC7D,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,EAAA,EAAI,MAAM,gBAAgB,8BAA8B,CAAA;AACtE,IAAA,IAAI,IAAA,KAAS,IAAI,OAAO,CAAA;AACxB,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,WAAS;AACP,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,GAAA,EAAK,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,OAAO,CAAA;AACzG,MAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAC/B,MAAA,IAAI,UAAA,GAAa,KAAA;AACjB,MAAA,KAAA,MAAW,UAAU,KAAA,EAAO;AAC1B,QAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM;AAAA,UACpC,OAAA,EAAS,EAAA;AAAA,UACT,SAAS,MAAA,CAAO,OAAA;AAAA,UAChB,YAAY,MAAA,CAAO,UAAA;AAAA,UACnB,YAAY,MAAA,CAAO,UAAA;AAAA,UACnB,kBAAkB,MAAA,CAAO,gBAAA;AAAA,UACzB,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,WAAW,MAAA,CAAO;AAAA,SACnB,CAAA;AACD,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AACnC,UAAA,KAAA,EAAA;AACA,UAAA,UAAA,GAAa,IAAA;AAAA,QACf,SAAS,KAAA,EAAO;AACd,UAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AACjC,UAAA,IAAI,EAAE,KAAA,YAAiB,aAAA,IAAiB,KAAA,CAAM,IAAA,KAAS,cAAc,MAAM,KAAA;AAAA,QAC7E;AAAA,MACF;AACA,MAAA,IAAI,CAAC,YAAY,OAAO,KAAA;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAA,CAAc,WAAA,EAAuB,SAAA,EAAoC;AAC7E,IAAA,MAAM,MAAA,GAAS,iBAAiB,SAAS,CAAA;AACzC,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,EAAA,IAAM,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AACrC,MAAA,MAAM,IAAA,GAAO,iBAAiB,EAAE,CAAA;AAChC,MAAA,IAAI,SAAS,MAAA,EAAQ;AACrB,MAAA,MAAM,KAAK,UAAA,EAAW;AACtB,MAAA,IAAK,MAAM,KAAK,OAAA,CAAQ,KAAA,CAAM,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA,KAAO,CAAA,EAAG;AACzD,MAAA,KAAA,IAAS,MAAM,IAAA,CAAK,aAAA,CAAc,IAAA,EAAM,MAAM,CAAA;AAAA,IAChD;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,UAAA,GAA4B;AAClC,IAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK,OAAA,CAAQ,YAAW,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAC9D,MAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AACnB,MAAA,MAAM,KAAA;AAAA,IACR,CAAC,CAAA;AACD,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA,EAEA,MAAc,YAAY,OAAA,EAAoC;AAC5D,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAe,CAAC,GAAG,MAAA,KAAW;AAChD,QAAA,KAAA,GAAQ,UAAA,CAAW,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAA,CAAK,YAAY,CAAA,GAAA,CAAK,CAAC,CAAA,EAAG,IAAA,CAAK,YAAY,CAAA;AAAA,MAClH,CAAC,CAAA;AACD,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,IAAA,CAAK;AAAA,QAChC,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,EAAE,MAAA,EAAQ,UAAA,EAAY,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,qBAAA,EAAuB,WAAA,EAAa,CAAA,EAAG,CAAA;AAAA,QACzG;AAAA,OACD,CAAA;AACD,MAAA,IAAI,CAAC,OAAO,IAAA,CAAK,IAAA,IAAQ,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAC1E,MAAA,OAAO,SAAA,CAAU,MAAA,CAAO,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,mBAAA,CAAoB,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,IACzE,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,MAAM,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,iBAAiB,CAAA;AAC3F,MAAA,OAAO,EAAC;AAAA,IACV,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF;AACF;ACjNO,IAAM,qBAAN,MAAoD;AAAA,EAChD,YAAA,GAAoC,EAAE,YAAA,EAAc,KAAA,EAAM;AAAA,EAC3D,GAAA;AAAA,EACA,WAAA,uBAAkB,GAAA,EAA2B;AAAA,EAC7C,QAAA,uBAAe,GAAA,EAAoB;AAAA,EAE3C,WAAA,CAAY,MAAA,GAA4B,EAAC,EAAG;AAC1C,IAAA,IAAA,CAAK,GAAA,GAAM,OAAO,UAAA,IAAc,iBAAA;AAAA,EAClC;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,MAAMA,eAAM,IAAA,CAAK,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACzC,IAAA,MAAM,KAAK,WAAA,EAAY;AAAA,EACzB;AAAA,EAEA,UAAA,GAAqB;AACnB,IAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,UAAA,EAAW,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,MAAM,KAAA,EAA0C;AACpD,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,MAAA,GAAuB;AAAA,MAC3B,EAAA,EAAI,KAAA,CAAM,EAAA,IAAM,IAAA,CAAK,UAAA,EAAW;AAAA,MAChC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAa,MAAM,UAAA,IAAc,aAAA;AAAA,MACjC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAY,MAAM,UAAA,IAAc,GAAA;AAAA,MAChC,gBAAA,EAAkB,MAAM,gBAAA,IAAoB,CAAA;AAAA,MAC5C,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAA,MACrB,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY,EAAC;AAAA,MAC7B,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,SAAA,EAAW,MAAM,SAAA,IAAa,GAAA;AAAA,MAC9B,UAAA,EAAY,IAAI,WAAA;AAAY,KAC9B;AAEA,IAAA,MAAM,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,OAAA,EAAS,YAAY;AACnD,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,OAAO,CAAA;AAClD,MAAA,MAAM,WAAA,GAAc,QAAQ,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,OAAO,EAAE,CAAA;AAC/D,MAAA,IAAI,gBAAgB,EAAA,EAAI;AACtB,QAAA,OAAA,CAAQ,WAAW,CAAA,GAAI,MAAA;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,MACrB;AACA,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,MAAM,OAAO,CAAA;AAC1C,MAAA,MAAM,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,OAAA,EAAS,OAAO,CAAA;AAAA,IAC9C,CAAC,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,EAChC;AAAA,EAEA,MAAM,WAAW,MAAA,EAA+C;AAC9D,IAAA,MAAM,OAAA,uBAAc,GAAA,EAA4B;AAChD,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,MAAsB,EAAC;AAE7B,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,MAAA,GAAuB;AAAA,QAC3B,EAAA,EAAI,KAAA,CAAM,EAAA,IAAM,IAAA,CAAK,UAAA,EAAW;AAAA,QAChC,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,UAAA,EAAa,MAAM,UAAA,IAAc,aAAA;AAAA,QACjC,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,UAAA,EAAY,MAAM,UAAA,IAAc,GAAA;AAAA,QAChC,gBAAA,EAAkB,MAAM,gBAAA,IAAoB,CAAA;AAAA,QAC5C,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAA,QACrB,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY,EAAC;AAAA,QAC7B,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,SAAA,EAAW,MAAM,SAAA,IAAa,GAAA;AAAA,QAC9B,UAAA,EAAY,IAAI,WAAA;AAAY,OAC9B;AACA,MAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AACf,MAAA,MAAM,QAAQ,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,OAAO,KAAK,EAAC;AAC7C,MAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AACjB,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,OAAA,EAAS,KAAK,CAAA;AAAA,IAClC;AAEA,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,KAAK,CAAA,IAAK,OAAA,EAAS;AACtC,MAAA,MAAM,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,YAAY;AAC7C,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC7C,QAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,UAAA,MAAM,WAAA,GAAc,SAAS,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,IAAI,EAAE,CAAA;AAC7D,UAAA,IAAI,gBAAgB,EAAA,EAAI;AACtB,YAAA,QAAA,CAAS,WAAW,CAAA,GAAI,GAAA;AAAA,UAC1B,CAAA,MAAO;AACL,YAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AAAA,UACnB;AACA,UAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,OAAO,CAAA;AAAA,QACnC;AACA,QAAA,MAAM,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,QAAQ,CAAA;AAAA,MACzC,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAI,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,WAAA,CAAY,CAAC,CAAC,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,IAAI,EAAA,EAAoC;AAC5C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AACpC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC5C,MAAA,MAAM,SAAS,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC9C,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAI,MAAA,CAAO,SAAA,IAAa,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,oBAAK,IAAI,IAAA,EAAK,EAAG,OAAO,IAAA;AACzE,QAAA,OAAO,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,MAChC;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AACxC,MAAA,MAAM,SAAS,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC9C,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAA,EAAI,GAAG,CAAA;AACzB,QAAA,IAAI,MAAA,CAAO,SAAA,IAAa,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,oBAAK,IAAI,IAAA,EAAK,EAAG,OAAO,IAAA;AACzE,QAAA,OAAO,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,MAChC;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,IAAI,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAClC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,MAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AACxC,QAAA,IAAI,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA,EAAG;AAAE,UAAA,OAAA,GAAU,GAAA;AAAK,UAAA;AAAA,QAAO;AAAA,MAChE;AAAA,IACF;AACA,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,QAAA,CAAS,UAAU,EAAE,CAAA;AAEzC,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,YAAY;AAC7C,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC1C,MAAA,MAAM,IAAI,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC5C,MAAA,IAAI,MAAM,EAAA,EAAI;AACZ,QAAA,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AACjB,QAAA,IAAA,CAAK,QAAA,CAAS,OAAO,EAAE,CAAA;AACvB,QAAA,MAAM,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,KAAK,CAAA;AACpC,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,QAAA,CAAS,UAAU,EAAE,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,WAAW,GAAA,EAAgC;AAC/C,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,GAAG,CAAA;AACzB,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AAExC,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,YAAY;AAC7C,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC5C,QAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,QAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AACvD,QAAA,KAAA,IAAS,SAAS,QAAA,CAAS,MAAA;AAC3B,QAAA,IAAI,MAAA,KAAW,SAAS,MAAA,EAAQ;AAC9B,UAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,YAAA,IAAI,KAAA,CAAM,IAAI,CAAA,CAAE,EAAE,GAAG,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,UAChD;AACA,UAAA,MAAM,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,QAAQ,CAAA;AAAA,QACzC;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,QAAA,CAAS,KAAA,EAA4B,UAAA,EAA0C;AACnF,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,GAAU,CAAC,MAAM,OAAO,CAAA,GAAI,MAAM,IAAA,CAAK,WAAA,EAAY;AAC1E,IAAA,IAAI,UAA0B,EAAC;AAE/B,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC1C,MAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,MAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,SAAA,IAAa,IAAI,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA,GAAI,GAAG,CAAA;AAE3E,MAAA,IAAI,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,WAAA,CAAY,SAAS,CAAA,EAAG;AACrD,QAAA,OAAA,GAAU,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,MAAM,WAAA,CAAa,QAAA,CAAS,CAAA,CAAE,UAAU,CAAC,CAAA;AAAA,MAC3E;AACA,MAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,EAAG;AACvC,QAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,EAAM,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAM,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAAA,MAC9E;AACA,MAAA,IAAI,MAAM,KAAA,EAAO;AACf,QAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACnE,QAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM;AAC9B,UAAA,MAAM,OAAA,GAAU,CAAA,CAAE,OAAA,CAAQ,WAAA,EAAY;AACtC,UAAA,OAAO,MAAM,IAAA,CAAK,CAAC,MAAM,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,QAC9C,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,OAAO,CAAA;AAAA,IACzB;AAEA,IAAA,QAAQ,MAAM,QAAA;AAAU,MACtB,KAAK,QAAA;AACH,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,KAAK,CAAA,CAAE,UAAU,CAAA,CAAE,OAAA,KAAY,IAAI,IAAA,CAAK,EAAE,UAAU,CAAA,CAAE,SAAS,CAAA;AAC1F,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,UAAA,GAAa,EAAE,UAAU,CAAA;AAClD,QAAA;AAAA,MACF,KAAK,QAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL;AACE,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAC,CAAA,EAAG,CAAA,KACF,EAAE,UAAA,GAAa,CAAA,CAAE,cAAc,IAAI,IAAA,CAAK,EAAE,UAAU,CAAA,CAAE,SAAQ,GAAI,IAAI,KAAK,CAAA,CAAE,UAAU,EAAE,OAAA;AAAQ,SACrG;AACA,QAAA;AAAA;AAGJ,IAAA,IAAI,KAAA,CAAM,UAAU,KAAA,EAAO;AAEzB,MAAA,MAAM,MAAA,GAAA,iBAAS,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACtC,MAAA,MAAM,UAAU,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,SAAS,EAAE,CAAA;AAClD,MAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,MAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,QAAA,CAAA,CAAE,UAAA,GAAa,MAAA;AACf,QAAA,aAAA,CAAc,GAAA,CAAI,EAAE,OAAO,CAAA;AAAA,MAC7B;AAEA,MAAA,KAAA,MAAW,WAAW,aAAA,EAAe;AACnC,QAAA,MAAM,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,YAAY;AAC7C,UAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC5C,UAAA,IAAI,OAAA,GAAU,KAAA;AACd,UAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,YAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,EAAE,EAAE,CAAA;AACjD,YAAA,IAAI,OAAA,EAAS;AAAE,cAAA,CAAA,CAAE,UAAA,GAAa,MAAA;AAAQ,cAAA,OAAA,GAAU,IAAA;AAAA,YAAM;AAAA,UACxD;AACA,UAAA,IAAI,OAAA,EAAS,MAAM,IAAA,CAAK,UAAA,CAAW,SAAS,OAAO,CAAA;AAAA,QACrD,CAAC,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,EAAA;AAC7B,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,WAAA,CAAY,CAAC,CAAC,CAAA;AAAA,EAC/D;AAAA,EAEA,MAAM,MAAM,MAAA,EAA6C;AACvD,IAAA,MAAM,QAAA,GAAW,QAAQ,OAAA,GAAU,CAAC,OAAO,OAAO,CAAA,GAAI,MAAM,IAAA,CAAK,WAAA,EAAY;AAC7E,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AAErB,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC1C,MAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,SAAA,IAAa,IAAI,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA,GAAI,GAAG,CAAA;AAE3E,MAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,QAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,UAAA,KAAe,OAAO,UAAU,CAAA;AAAA,MACpE;AACA,MAAA,IAAI,MAAA,EAAQ,kBAAkB,MAAA,EAAW;AACvC,QAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,UAAA,IAAc,OAAO,aAAc,CAAA;AAAA,MACvE;AACA,MAAA,KAAA,IAAS,OAAA,CAAQ,MAAA;AAAA,IACnB;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,EAAA,EAA2B;AACrC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AACpC,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,QAAA,CAAS,UAAU,EAAE,CAAA;AAEzC,IAAA,MAAM,MAAA,GAAA,iBAAS,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACtC,IAAA,MAAM,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,YAAY;AAC7C,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC1C,MAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAC3C,MAAA,IAAI,CAAC,KAAA,EAAO,MAAM,QAAA,CAAS,UAAU,EAAE,CAAA;AACvC,MAAA,KAAA,CAAM,UAAA,GAAa,MAAA;AACnB,MAAA,MAAM,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,KAAK,CAAA;AAAA,IACtC,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EACzB;AAAA;AAAA,EAIQ,UAAU,OAAA,EAAyB;AACzC,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,qBAAA,EAAuB,GAAG,CAAA;AACvD,IAAA,OAAOC,SAAA,CAAK,IAAA,CAAK,GAAA,EAAK,CAAA,EAAG,IAAI,CAAA,KAAA,CAAO,CAAA;AAAA,EACtC;AAAA,EAEA,MAAc,UAAU,OAAA,EAA0C;AAChE,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAMC,iBAAA,CAAS,KAAK,SAAA,CAAU,OAAO,GAAG,OAAO,CAAA;AAC3D,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,MAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAK,SAA4B,EAAC;AAAA,IAC/D,SAAS,GAAA,EAAc;AACrB,MAAA,IAAK,GAAA,CAA8B,IAAA,KAAS,QAAA,EAAU,OAAO,EAAC;AAC9D,MAAA,MAAM,aAAa,CAAA,kCAAA,EAAqC,OAAO,CAAA,EAAA,EAAM,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,IAC9F;AAAA,EACF;AAAA,EAEA,MAAc,UAAA,CAAW,OAAA,EAAiB,OAAA,EAAwC;AAChF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAIvC,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,OAAA,CAAQ,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,IAAA,CAAA;AACrE,IAAA,IAAI;AACF,MAAA,MAAMC,kBAAA,CAAU,SAAS,IAAA,CAAK,SAAA,CAAU,SAAS,IAAA,EAAM,CAAC,GAAG,OAAO,CAAA;AAClE,MAAA,MAAMC,eAAA,CAAO,SAAS,QAAQ,CAAA;AAAA,IAChC,SAAS,GAAA,EAAK;AACZ,MAAA,MAAMC,eAAA,CAAO,OAAO,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AACpC,MAAA,MAAM,aAAa,CAAA,mCAAA,EAAsC,OAAO,CAAA,EAAA,EAAM,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,IAC/F;AAAA,EACF;AAAA,EAEA,MAAc,cAAA,CAAe,OAAA,EAAiB,EAAA,EAAwC;AAGpF,IAAA,MAAM,OAAO,IAAA,CAAK,WAAA,CAAY,IAAI,OAAO,CAAA,IAAK,QAAQ,OAAA,EAAQ;AAC9D,IAAA,IAAI,OAAA;AACJ,IAAA,MAAM,IAAA,GAAO,IAAI,OAAA,CAAc,CAAC,CAAA,KAAM;AAAE,MAAA,OAAA,GAAU,CAAA;AAAA,IAAG,CAAC,CAAA;AACtD,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,OAAA,EAAS,IAAI,CAAA;AAClC,IAAA,MAAM,IAAA;AAMN,IAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA;AAC3D,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,EAAG;AAAA,IACX,CAAA,SAAE;AACA,MAAA,MAAM,eAAA,EAAgB;AACtB,MAAA,OAAA,EAAQ;AAER,MAAA,IAAI,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,OAAO,MAAM,IAAA,EAAM;AAC1C,QAAA,IAAA,CAAK,WAAA,CAAY,OAAO,OAAO,CAAA;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,iBAAiB,OAAA,EAA+C;AAC5E,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA,KAAA,CAAA;AAC3C,IAAA,MAAM,OAAA,GAAU,GAAA;AAChB,IAAA,MAAM,SAAA,GAAY,GAAA;AAClB,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AAEvB,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAMC,aAAA,CAAK,QAAA,EAAU,IAAI,CAAA;AACxC,QAAA,MAAM,OAAO,KAAA,EAAM;AACnB,QAAA,OAAO,YAAY;AACjB,UAAA,MAAMD,eAAA,CAAO,QAAQ,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,UAAC,CAAC,CAAA;AAAA,QACvC,CAAA;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,IAAK,GAAA,CAA8B,SAAS,QAAA,EAAU;AACpD,UAAA,MAAM,aAAa,CAAA,iCAAA,EAAoC,OAAO,CAAA,EAAA,EAAM,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,QAC7F;AACA,QAAA,IAAI;AACF,UAAA,MAAM,EAAA,GAAK,MAAME,aAAA,CAAK,QAAQ,CAAA;AAC9B,UAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,EAAA,CAAG,UAAU,OAAA,EAAS;AACrC,YAAA,MAAMF,eAAA,CAAO,QAAQ,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,YAAC,CAAC,CAAA;AACrC,YAAA;AAAA,UACF;AAAA,QACF,CAAA,CAAA,MAAQ;AACN,UAAA;AAAA,QACF;AACA,QAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,GAAQ,SAAA,EAAW;AAClC,UAAA,MAAM,YAAA,CAAa,CAAA,yCAAA,EAA4C,QAAQ,CAAA,CAAE,CAAA;AAAA,QAC3E;AACA,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,CAAA,KAAM,UAAA,CAAW,CAAA,EAAG,EAAA,GAAK,IAAA,CAAK,MAAA,EAAO,GAAI,EAAE,CAAC,CAAA;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,WAAA,GAAiC;AAC7C,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAMG,gBAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AACtC,MAAA,OAAO,QAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,OAAO,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IAC7E,SAAS,GAAA,EAAc;AACrB,MAAA,IAAK,GAAA,CAA8B,IAAA,KAAS,QAAA,EAAU,OAAO,EAAC;AAC9D,MAAA,MAAM,YAAA,CAAa,CAAA,uBAAA,EAA2B,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,IACvE;AAAA,EACF;AAAA,EAEA,MAAc,WAAA,GAA6B;AACzC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC5C,MAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAY,MAAA,EAA8B;AAChD,IAAA,MAAM,EAAE,UAAA,EAAY,CAAA,EAAG,GAAG,MAAK,GAAI,MAAA;AACnC,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,SAAA,EAAW,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AAAA,MACpC,WAAW,MAAA,CAAO,SAAA,GAAY,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,GAAI;AAAA,KAC7D;AAAA,EACF;AACF;AC1ZO,IAAM,yBAAN,MAAwD;AAAA,EACpD,YAAA,GAAoC,EAAE,YAAA,EAAc,KAAA,EAAM;AAAA,EAC3D,GAAA;AAAA,EACA,eAAA;AAAA,EACA,MAAA,GAAqC,IAAA;AAAA,EACrC,WAAA,uBAA+B,GAAA,EAAI;AAAA,EACnC,WAAA,GAAuB,IAAA;AAAA,EAE/B,YAAY,MAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,MAAM,MAAA,CAAO,GAAA;AAClB,IAAA,IAAA,CAAK,eAAA,GAAkB,OAAO,eAAA,IAAmB,IAAA;AAAA,EACnD;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,MAAMR,eAAM,IAAA,CAAK,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EAC3C;AAAA,EAEA,UAAA,GAAqB;AACnB,IAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,UAAA,EAAW,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,MAAM,KAAA,EAA0C;AACpD,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,MAAA,GAAiB;AAAA,MACrB,EAAA,EAAI,KAAA,CAAM,EAAA,IAAM,IAAA,CAAK,UAAA,EAAW;AAAA,MAChC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAa,MAAM,UAAA,IAAc,aAAA;AAAA,MACjC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAY,MAAM,UAAA,IAAc,GAAA;AAAA,MAChC,gBAAA,EAAkB,MAAM,gBAAA,IAAoB,CAAA;AAAA,MAC5C,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAA,MACrB,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY,EAAC;AAAA,MAC7B,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,SAAA,EAAW,MAAM,SAAA,IAAa;AAAA,KAChC;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,OAAO,CAAA;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AACtC,IAAA,MAAMS,mBAAA,CAAW,QAAA,EAAU,KAAA,EAAO,OAAO,CAAA;AACzC,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,MAAA,EAA+C;AAC9D,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,EAAA,EAAoC;AAC5C,IAAA,MAAM,KAAK,YAAA,EAAa;AACxB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAClC,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,IAAI,OAAO,SAAA,IAAa,MAAA,CAAO,6BAAa,IAAI,IAAA,IAAQ,OAAO,IAAA;AAC/D,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,GAAG,OAAO,IAAA;AACrC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,KAAK,YAAA,EAAa;AACxB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAClC,IAAA,IAAI,CAAC,MAAA,IAAU,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA,EAAG;AACvC,MAAA,MAAM,QAAA,CAAS,UAAU,EAAE,CAAA;AAAA,IAC7B;AACA,IAAA,IAAI,OAAO,SAAA,IAAa,MAAA,CAAO,SAAA,oBAAa,IAAI,MAAK,EAAG;AACtD,MAAA,MAAM,QAAA,CAAS,UAAU,EAAE,CAAA;AAAA,IAC7B;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,OAAO,CAAA;AAC9C,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,gBAAA,CAAiB,EAAE,CAAA;AAC1C,IAAA,MAAMA,mBAAA,CAAW,QAAA,EAAU,SAAA,EAAW,OAAO,CAAA;AAC7C,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;AAAA,EAEA,MAAM,WAAW,GAAA,EAAgC;AAC/C,IAAA,MAAM,KAAK,YAAA,EAAa;AACxB,IAAc,IAAI,GAAA,CAAI,GAAG;AAEzB,IAAA,MAAM,WAA8C,EAAC;AACrD,IAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAClC,MAAA,IAAI,UAAU,CAAC,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA,EAAG;AACvC,QAAA,IAAI,CAAC,MAAA,CAAO,SAAA,IAAa,OAAO,SAAA,mBAAY,IAAI,MAAK,EAAG;AACtD,UAAA,QAAA,CAAS,KAAK,EAAE,EAAA,EAAI,OAAA,EAAS,MAAA,CAAO,SAAS,CAAA;AAAA,QAC/C;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAsB;AAC1C,IAAA,KAAA,MAAW,EAAE,EAAA,EAAI,OAAA,EAAQ,IAAK,QAAA,EAAU;AACtC,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,OAAO,KAAK,EAAC;AACvC,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,MAAA,OAAA,CAAQ,GAAA,CAAI,SAAS,KAAK,CAAA;AAAA,IAC5B;AAEA,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,QAAQ,CAAA,IAAK,OAAA,EAAS;AACzC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AACvC,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AACxE,MAAA,MAAMA,mBAAA,CAAW,QAAA,EAAU,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,OAAO,QAAA,CAAS,MAAA;AAAA,EAClB;AAAA,EAEA,MAAM,QAAA,CAAS,KAAA,EAA4B,UAAA,EAA0C;AACnF,IAAA,MAAM,KAAK,YAAA,EAAa;AACxB,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,IAAI,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAQ,MAAA,EAAQ,CAAA,CAC3C,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA,CACzC,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,SAAA,GAAY,GAAG,CAAA;AAElD,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,KAAY,MAAM,OAAO,CAAA;AAAA,IAC7D;AACA,IAAA,IAAI,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,WAAA,CAAY,SAAS,CAAA,EAAG;AACrD,MAAA,OAAA,GAAU,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,MAAM,WAAA,CAAa,QAAA,CAAS,CAAA,CAAE,UAAU,CAAC,CAAA;AAAA,IAC3E;AACA,IAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,EAAG;AACvC,MAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,EAAM,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAM,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAAA,IAC9E;AACA,IAAA,IAAI,MAAM,KAAA,EAAO;AACf,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACnE,MAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM;AAC9B,QAAA,MAAM,OAAA,GAAU,CAAA,CAAE,OAAA,CAAQ,WAAA,EAAY;AACtC,QAAA,OAAO,MAAM,IAAA,CAAK,CAAC,MAAM,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,MAC9C,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,QAAQ,MAAM,QAAA;AAAU,MACtB,KAAK,QAAA;AACH,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,SAAA,CAAU,OAAA,EAAQ,GAAI,CAAA,CAAE,SAAA,CAAU,OAAA,EAAS,CAAA;AACpE,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,UAAA,GAAa,EAAE,UAAU,CAAA;AAClD,QAAA;AAAA,MACF,KAAK,QAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL;AACE,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,UAAA,GAAa,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,SAAA,CAAU,OAAA,EAAQ,GAAI,CAAA,CAAE,UAAU,OAAA;AAAQ,SACvF;AACA,QAAA;AAAA;AAGJ,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,EAAA;AAC7B,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,MAAM,MAAA,EAA6C;AACvD,IAAA,MAAM,KAAK,YAAA,EAAa;AACxB,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,IAAI,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAQ,MAAA,EAAQ,CAAA,CAC3C,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA,CACzC,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,SAAA,GAAY,GAAG,CAAA;AAElD,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,KAAY,OAAO,OAAO,CAAA;AAAA,IAC9D;AACA,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,UAAA,KAAe,OAAO,UAAU,CAAA;AAAA,IACpE;AACA,IAAA,IAAI,MAAA,EAAQ,kBAAkB,MAAA,EAAW;AACvC,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,UAAA,IAAc,OAAO,aAAc,CAAA;AAAA,IACvE;AACA,IAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,EACjB;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;AAAA,EAEA,MAAM,MAAA,GAAwB;AAC5B,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,MAAM,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,MAChD;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC,CAAA;AAAA,IAC3C;AACA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;AAAA;AAAA,EAIQ,UAAU,OAAA,EAAyB;AACzC,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,MAAA,OAAOR,SAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,aAAa,CAAA;AAAA,IACrC;AACA,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,qBAAA,EAAuB,GAAG,CAAA;AACvD,IAAA,OAAOA,SAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,CAAA,EAAG,IAAI,CAAA,GAAA,CAAK,CAAA;AAAA,EACpC;AAAA,EAEQ,aAAa,MAAA,EAAwB;AAC3C,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,SAAA,CAAU,WAAA,EAAY;AACzC,IAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU;AAAA,MAC1B,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,kBAAkB,MAAA,CAAO,gBAAA;AAAA,MACzB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,QAAA,EAAU,OAAO,QAAA,IAAY,IAAA;AAAA,MAC7B,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY,EAAC;AAAA,MAC9B,SAAA,EAAW,MAAA,CAAO,SAAA,CAAU,WAAA,EAAY;AAAA,MACxC,SAAA,EAAW,MAAA,CAAO,SAAA,EAAW,WAAA,EAAY,IAAK;AAAA,KAC/C,CAAA;AACD,IAAA,OAAO,MAAM,GAAG;;AAAA;AAAA,EAAgB,IAAI;AAAA;;AAAA,EAAY,OAAO,OAAO;;AAAA;AAAA,CAAA;AAAA,EAChE;AAAA,EAEQ,iBAAiB,EAAA,EAAoB;AAC3C,IAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,IAAA,OAAO,MAAM,GAAG;;AAAA,cAAA,EAAqB,EAAE,CAAA;;AAAA;AAAA,CAAA;AAAA,EACzC;AAAA,EAEA,MAAc,YAAA,GAA8B;AAC1C,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AAEvB,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAC5C,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AAEtC,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAW,GAAI,MAAM,KAAK,UAAA,CAAW,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAC9E,QAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,UAAA,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,GAAG,CAAA;AAAA,QAC7B;AACA,QAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,UAAA,aAAA,CAAc,IAAI,GAAG,CAAA;AAAA,QACvB;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAW,GAAI,MAAM,KAAK,UAAA,CAAW,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC,CAAA;AACzE,MAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,QAAA,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,GAAG,CAAA;AAAA,MAC7B;AACA,MAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,QAAA,aAAA,CAAc,IAAI,GAAG,CAAA;AAAA,MACvB;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,WAAA;AACd,IAAA,IAAA,CAAK,WAAA,GAAc,aAAA;AACnB,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AAAA,EACrB;AAAA,EAEA,MAAc,WAAW,QAAA,EAAyE;AAChG,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,MAAMC,iBAAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAAA,IACxC,SAAS,GAAA,EAAc;AACrB,MAAA,IAAK,GAAA,CAA8B,SAAS,QAAA,EAAU;AACpD,QAAA,OAAO,EAAE,QAAA,EAAU,EAAC,EAAG,UAAA,EAAY,EAAC,EAAE;AAAA,MACxC;AACA,MAAA,MAAM,aAAa,CAAA,oBAAA,EAAuB,QAAQ,CAAA,EAAA,EAAM,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,IACjF;AAEA,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,MAAM,aAAuB,EAAC;AAE9B,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA;AAEpC,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAC7B,MAAA,IAAI,CAAC,OAAA,EAAS;AAEd,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAC/C,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AACnC,MAAA,IAAI,CAAA,GAAI,CAAA;AAER,MAAA,IAAI,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,UAAA,CAAW,KAAK,CAAA,EAAG;AAClC,MAAA,CAAA,EAAA;AAEA,MAAA,OAAO,CAAA,GAAI,MAAM,MAAA,IAAU,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,OAAW,EAAA,EAAI,CAAA,EAAA;AACnD,MAAA,IAAI,CAAA,IAAK,MAAM,MAAA,EAAQ;AAEvB,MAAA,MAAM,iBAAiB,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK,CAAE,MAAM,8BAA8B,CAAA;AAC3E,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,UAAA,CAAW,IAAA,CAAK,cAAA,CAAe,CAAC,CAAC,CAAA;AACjC,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,OAAW,SAAA,EAAW;AACnC,MAAA,CAAA,EAAA;AAEA,MAAA,MAAM,YAAsB,EAAC;AAC7B,MAAA,OAAO,CAAA,GAAI,MAAM,MAAA,IAAU,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,OAAW,KAAA,EAAO;AACpD,QAAA,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AACvB,QAAA,CAAA,EAAA;AAAA,MACF;AACA,MAAA,CAAA,EAAA;AAEA,MAAA,IAAI,QAAA,GAA2C,IAAA;AAC/C,MAAA,IAAI;AACF,QAAA,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,MAC5C,CAAA,CAAA,MAAQ;AACN,QAAA;AAAA,MACF;AAEA,MAAA,OAAO,CAAA,GAAI,MAAM,MAAA,IAAU,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,OAAW,EAAA,EAAI,CAAA,EAAA;AAEnD,MAAA,MAAM,eAAyB,EAAC;AAChC,MAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,QAAA,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAC1B,QAAA,CAAA,EAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,YAAA,CAAa,IAAA,CAAK,IAAI,EAAE,IAAA,EAAK;AAE7C,MAAA,IAAI,QAAA,IAAY,OAAO,QAAA,CAAS,EAAA,KAAO,QAAA,EAAU;AAC/C,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,IAAI,QAAA,CAAS,EAAA;AAAA,UACb,SAAS,QAAA,CAAS,OAAA;AAAA,UAClB,UAAA,EAAa,SAAS,UAAA,IAA6B,aAAA;AAAA,UACnD,OAAA;AAAA,UACA,UAAA,EAAa,SAAS,UAAA,IAAyB,GAAA;AAAA,UAC/C,gBAAA,EAAmB,SAAS,gBAAA,IAA+B,CAAA;AAAA,UAC3D,IAAA,EAAO,QAAA,CAAS,IAAA,IAAqB,EAAC;AAAA,UACtC,WAAW,QAAA,CAAS,SAAA;AAAA,UACpB,QAAA,EAAW,SAAS,QAAA,IAAmC,MAAA;AAAA,UACvD,QAAA,EAAW,QAAA,CAAS,QAAA,IAAwC,EAAC;AAAA,UAC7D,SAAA,EAAW,IAAI,IAAA,CAAK,QAAA,CAAS,SAAmB,CAAA;AAAA,UAChD,WAAW,QAAA,CAAS,SAAA,GAAY,IAAI,IAAA,CAAK,QAAA,CAAS,SAAmB,CAAA,GAAI;AAAA,SAC1E,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,UAAU,UAAA,EAAW;AAAA,EAChC;AAAA,EAEA,MAAc,YAAY,QAAA,EAAiC;AACzD,IAAA,MAAM,KAAK,YAAA,EAAa;AAExB,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,MAAMA,iBAAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAAA,IACxC,SAAS,GAAA,EAAc;AACrB,MAAA,IAAK,GAAA,CAA8B,SAAS,QAAA,EAAU;AACtD,MAAA,MAAM,YAAA,CAAa,CAAA,gCAAA,EAAoC,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,IAChF;AAEA,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA;AACpC,IAAA,MAAM,OAAiB,EAAC;AAExB,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAC7B,MAAA,IAAI,CAAC,OAAA,EAAS;AAEd,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAC/C,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AACnC,MAAA,IAAI,CAAA,GAAI,CAAA;AAER,MAAA,IAAI,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,UAAA,CAAW,KAAK,CAAA,EAAG;AAChC,QAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AACjB,QAAA;AAAA,MACF;AACA,MAAA,CAAA,EAAA;AAEA,MAAA,OAAO,CAAA,GAAI,MAAM,MAAA,IAAU,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,OAAW,EAAA,EAAI,CAAA,EAAA;AACnD,MAAA,IAAI,CAAA,IAAK,MAAM,MAAA,EAAQ;AACrB,QAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AACjB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,iBAAiB,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK,CAAE,MAAM,8BAA8B,CAAA;AAC3E,MAAA,IAAI,cAAA,EAAgB;AAEpB,MAAA,IAAI,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,OAAW,SAAA,EAAW;AACjC,QAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AACjB,QAAA;AAAA,MACF;AACA,MAAA,CAAA,EAAA;AAEA,MAAA,OAAO,CAAA,GAAI,MAAM,MAAA,IAAU,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,OAAW,KAAA,EAAO,CAAA,EAAA;AACtD,MAAA,CAAA,EAAA;AAEA,MAAA,OAAO,CAAA,GAAI,MAAM,MAAA,IAAU,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,OAAW,EAAA,EAAI,CAAA,EAAA;AAEnD,MAAA,MAAM,eAAyB,EAAC;AAChC,MAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,QAAA,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAC1B,QAAA,CAAA,EAAA;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,YAAA,GAAe,MAAM,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,IAAA,OAAW,SAAS,CAAA;AAClE,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,EAAG,GAAA,KAAQ,GAAA,GAAM,YAAA,IAAgB,CAAA,CAAE,IAAA,EAAK,KAAM,KAAK,CAAA;AACvF,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,YAAA,GAAe,GAAG,UAAU,CAAA,CAAE,KAAK,IAAI,CAAA;AACpE,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAChC,QAAA,IAAI,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AAAA,MACrC,CAAA,CAAA,MAAQ;AAAA,MAER;AAEA,MAAA,MAAM,OAAA,GAAU,YAAA,CAAa,IAAA,CAAK,IAAI,EAAE,IAAA,EAAK;AAC7C,MAAA,IAAI,OAAA,IAAW,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,EAAG;AAC1C,QAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,GAAS,CAAA,GAAI,KAAK,IAAA,CAAK,SAAS,IAAI,SAAA,GAAY,EAAA;AACpE,IAAA,MAAMC,kBAAAA,CAAU,QAAA,EAAU,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAc,WAAA,GAAiC;AAC7C,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAMK,gBAAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AACtC,MAAA,OAAO,QAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,KAAK,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IAC3E,SAAS,GAAA,EAAc;AACrB,MAAA,IAAK,GAAA,CAA8B,IAAA,KAAS,QAAA,EAAU,OAAO,EAAC;AAC9D,MAAA,MAAM,YAAA,CAAa,CAAA,uBAAA,EAA2B,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,IACvE;AAAA,EACF;AACF;;;ACtaO,IAAM,uBAAN,MAAsD;AAAA,EACnD,KAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EAER,YAAY,MAAA,EAA6B;AACvC,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AACpB,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,OAAA;AACtB,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,SAAA,IAAa,IAAA;AACrC,IAAA,IAAA,CAAK,aAAA,GAAgB,OAAO,aAAA,IAAiB,IAAA;AAC7C,IAAA,IAAA,CAAK,UAAA,GAAa,OAAO,UAAA,IAAc,KAAA;AAAA,EACzC;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,CAAK,KAAA,CAAM,UAAA,EAAW,EAAG,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAY,CAAC,CAAA;AAEtE,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,EAAE,KAAA,EAAO,KAAQ,CAAA;AAC7D,MAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,QAAA,MAAM,KAAK,KAAA,CAAM,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UAC9C,SAAS,CAAA,CAAE,OAAA;AAAA,UACX,SAAS,CAAA,CAAE,OAAA;AAAA,UACX,YAAY,CAAA,CAAE,UAAA;AAAA,UACd,YAAY,CAAA,CAAE,UAAA;AAAA,UACd,kBAAkB,CAAA,CAAE,gBAAA;AAAA,UACpB,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,WAAW,CAAA,CAAE,SAAA;AAAA,UACb,UAAU,CAAA,CAAE,QAAA;AAAA,UACZ,UAAU,CAAA,CAAE,QAAA;AAAA,UACZ,WAAW,CAAA,CAAE,SAAA;AAAA,UACb,IAAI,CAAA,CAAE;AAAA,SACR,CAAE,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,KAAA,EAA0C;AACpD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,KAAK,CAAA;AAE7C,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,MAAM,KAAA,CAAM,EAAE,GAAG,KAAA,EAAO,EAAA,EAAI,MAAA,CAAO,EAAA,EAAI,CAAA;AAAA,MACpD,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACX;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,MAAA,EAA+C;AAC9D,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAW,MAAM,CAAA;AAEpD,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,WAAA,GAAkC,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO;AAAA,QAC7D,GAAG,OAAO,CAAC,CAAA;AAAA,QACX,IAAI,CAAA,CAAE;AAAA,OACR,CAAE,CAAA;AACF,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,WAAW,CAAA;AAAA,MACzC,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACX;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,EAAA,EAAoC;AAC5C,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,EAAE,CAAA;AACtC,MAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAI,EAAE,CAAA;AACxC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAI;AAAE,UAAA,MAAM,IAAA,CAAK,MAAM,KAAA,CAAM;AAAA,YAC3B,SAAS,MAAA,CAAO,OAAA;AAAA,YAChB,SAAS,MAAA,CAAO,OAAA;AAAA,YAChB,YAAY,MAAA,CAAO,UAAA;AAAA,YACnB,YAAY,MAAA,CAAO,UAAA;AAAA,YACnB,kBAAkB,MAAA,CAAO,gBAAA;AAAA,YACzB,MAAM,MAAA,CAAO,IAAA;AAAA,YACb,WAAW,MAAA,CAAO,SAAA;AAAA,YAClB,UAAU,MAAA,CAAO,QAAA;AAAA,YACjB,UAAU,MAAA,CAAO,QAAA;AAAA,YACjB,WAAW,MAAA,CAAO,SAAA;AAAA,YAClB,IAAI,MAAA,CAAO;AAAA,WACZ,CAAA;AAAA,QAAG,CAAA,CAAA,MAAQ;AAAA,QAAC;AAAA,MACf;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAAA,EAC5B;AAAA,EAEA,MAAM,QAAA,CAAS,KAAA,EAA4B,SAAA,EAAyC;AAClF,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,OAAO,SAAS,CAAA;AACzD,MAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,MAAA;AAE9B,MAAA,MAAM,UAAU,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,OAAO,SAAS,CAAA;AAC5D,MAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,QAAA,MAAM,MAAA,GAA6B,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UACrD,SAAS,CAAA,CAAE,OAAA;AAAA,UACX,SAAS,CAAA,CAAE,OAAA;AAAA,UACX,YAAY,CAAA,CAAE,UAAA;AAAA,UACd,YAAY,CAAA,CAAE,UAAA;AAAA,UACd,kBAAkB,CAAA,CAAE,gBAAA;AAAA,UACpB,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,WAAW,CAAA,CAAE,SAAA;AAAA,UACb,UAAU,CAAA,CAAE,QAAA;AAAA,UACZ,UAAU,CAAA,CAAE,QAAA;AAAA,UACZ,WAAW,CAAA,CAAE,SAAA;AAAA,UACb,IAAI,CAAA,CAAE;AAAA,SACR,CAAE,CAAA;AACF,QAAA,IAAI;AAAE,UAAA,MAAM,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA;AAAA,QAAG,CAAA,CAAA,MAAQ;AAAA,QAAC;AAAA,MACtD;AACA,MAAA,OAAO,OAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,KAAA,EAAO,SAAS,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA,CAAW;AAAA,MACvC,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA;AAAA,MACpB,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,EAAE;AAAA,KACvB,CAAA;AAED,IAAA,MAAM,aAAA,GAAgB,QAAQ,CAAC,CAAA;AAC/B,IAAA,IAAI,aAAA,CAAc,WAAW,UAAA,EAAY;AACvC,MAAA,MAAM,aAAA,CAAc,MAAA;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,GAAA,EAAgC;AAC/C,IAAA,MAAM,CAAC,WAAA,EAAa,YAAY,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MACpD,KAAK,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,CAAE,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,MACxC,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,GAAG;AAAA,KAC5B,CAAA;AAED,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,MAAA,EAA6C;AACvD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA;AAAA,EAClC;AAAA,EAEA,MAAM,MAAM,EAAA,EAA2B;AACrC,IAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,EAAE,CAAA;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,CAAK,KAAA,CAAM,KAAA,EAAM,EAAG,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,CAAC,CAAA;AAAA,EAC9D;AACF;;;ACnIO,IAAM,yBAAN,MAAwD;AAAA,EACpD,YAAA,GAAoC,EAAE,YAAA,EAAc,IAAA,EAAK;AAAA,EAC1D,IAAA;AAAA,EACA,KAAA;AAAA,EACA,gBAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EAEpB,YAAY,MAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAO,SAAA,IAAa,mBAAA;AACjC,IAAA,IAAI,CAAC,iBAAA,CAAkB,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,EAAG;AACvC,MAAA,MAAM,WAAA,CAAY,CAAA,qBAAA,EAAwB,IAAA,CAAK,KAAK,CAAA,oDAAA,CAAsD,CAAA;AAAA,IAC5G;AACA,IAAA,IAAA,CAAK,gBAAA,GAAmB,OAAO,gBAAA,IAAoB,IAAA;AAEnD,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA;AAAA,IACrB,CAAA,MAAA,IAAW,OAAO,gBAAA,EAAkB;AAClC,MAAA,IAAA,CAAK,oBAAoB,MAAA,CAAO,gBAAA;AAChC,MAAA,IAAA,CAAK,OAAO,MAAA,CAAO,GAAA;AAAA,IACrB,WAAW,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,QAAA,IAAY,OAAO,IAAA,EAAM;AACxD,MAAA,IAAA,CAAK,aAAa,EAAE,IAAA,EAAM,OAAO,IAAA,EAAM,IAAA,EAAM,OAAO,IAAA,EAAM,QAAA,EAAU,OAAO,QAAA,EAAU,IAAA,EAAM,OAAO,IAAA,EAAM,QAAA,EAAU,OAAO,QAAA,EAAU,GAAA,EAAK,OAAO,GAAA,EAAI;AAAA,IACrJ,CAAA,MAAO;AACL,MAAA,MAAM,YAAY,iFAAiF,CAAA;AAAA,IACrG;AAAA,EACF;AAAA,EAEQ,iBAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA;AAAA,EAER,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,IAAA,CAAK,iBAAA,IAAqB,IAAA,CAAK,UAAA,EAAY;AAC7C,MAAA,IAAA,CAAK,IAAA,GAAO,MAAM,IAAA,CAAK,WAAA,EAAY;AACnC,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AAEA,IAAA,MAAM,KAAK,aAAA,EAAc;AAAA,EAC3B;AAAA,EAEA,MAAc,WAAA,GAA+B;AAC3C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,IAAqB,IAAA,CAAK,gBAAA,EAAiB;AAEhE,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAe,GAAI,MAAM,OAAO,UAAU,CAAA;AAG3D,MAAA,MAAM,OAAA,GAAmC,EAAE,QAAA,EAAU,MAAM;AAAA,MAAC,CAAA,EAAE;AAC9D,MAAA,IAAI,KAAK,IAAA,EAAM;AACb,QAAA,OAAA,CAAQ,MAAM,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,KAAK,IAAA,GAAO,SAAA;AAAA,MAC5D;AACA,MAAA,MAAM,GAAA,GAAM,cAAA,CAAe,OAAA,EAAS,OAAO,CAAA;AAC3C,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,CAAC,IAAA,EAAc,MAAA,KACpB,IAAI,MAAA,CAAO,IAAA,EAAM,MAAiB,CAAA,CAAE,KAAK,CAAC,CAAA,MAAkB,EAAE,IAAA,EAAM,GAAE,CAAE,CAAA;AAAA,QAC1E,GAAA,EAAK,MAAM,GAAA,CAAI,GAAA;AAAI,OACrB;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,IAAI;AAEF,QAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,OAAO,IAAI,CAAA;AAClC,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,EAAE,kBAAkB,OAAA,EAAS,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,CAAA;AACnE,QAAA,OAAO,EAAE,KAAA,EAAO,CAAC,IAAA,EAAc,WAAuB,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,MAAM,CAAA,EAAG,GAAA,EAAK,MAAM,IAAA,CAAK,KAAI,EAAE;AAAA,MACxG,CAAA,CAAA,MAAQ;AACN,QAAA,MAAM,YAAY,4FAA4F,CAAA;AAAA,MAChH;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gBAAA,GAA2B;AACjC,IAAA,MAAM,IAAI,IAAA,CAAK,UAAA;AACf,IAAA,MAAM,IAAA,GAAO,EAAE,IAAA,IAAQ,WAAA;AACvB,IAAA,MAAM,IAAA,GAAO,EAAE,IAAA,IAAQ,IAAA;AACvB,IAAA,MAAM,EAAA,GAAK,EAAE,QAAA,IAAY,UAAA;AACzB,IAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,CAAA,CAAE,IAAA,IAAQ,UAAU,CAAA;AACpD,IAAA,MAAM,EAAA,GAAK,EAAE,QAAA,GAAW,CAAA,CAAA,EAAI,mBAAmB,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAA,GAAK,EAAA;AAC/D,IAAA,IAAI,OAAA,GAAU,CAAA,WAAA,EAAc,IAAI,CAAA,EAAG,EAAE,IAAI,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AAC3D,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,MAAM,OAAA,GAAU,OAAO,IAAA,CAAK,IAAA,KAAS,WAAW,WAAA,GAAc,SAAA;AAC9D,MAAA,OAAA,IAAW,YAAY,OAAO,CAAA,CAAA;AAAA,IAChC;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,aAAA,GAA+B;AAC3C,IAAA,MAAM,IAAA,CAAK,KAAK,KAAA,CAAM;AAAA;AAAA;AAAA,iEAAA,EAGyC,KAAK,KAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mCAAA,EAMxC,KAAK,KAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAAA,EAQlB,KAAK,gBAAgB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yCAAA,EAQP,IAAA,CAAK,KAAK,CAAA,UAAA,EAAa,IAAA,CAAK,KAAK,CAAA;AAAA,yCAAA,EACjC,IAAA,CAAK,KAAK,CAAA,YAAA,EAAe,IAAA,CAAK,KAAK,CAAA;AAAA,yCAAA,EACnC,IAAA,CAAK,KAAK,CAAA,eAAA,EAAkB,IAAA,CAAK,KAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yCAAA,EAKtC,IAAA,CAAK,KAAK,CAAA,cAAA,EAAiB,IAAA,CAAK,KAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAM3E,CAAA;AAAA,EACH;AAAA,EAGA,UAAA,GAAqB;AACnB,IAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,UAAA,EAAW,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,MAAM,KAAA,EAA0C;AACpD,IAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,EAAA,IAAM,IAAA,CAAK,UAAA,EAAW;AAEvC,IAAA,MAAM,KAAK,IAAA,CAAK,KAAA;AAAA,MACd,CAAA,YAAA,EAAe,KAAK,KAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yCAAA,CAAA;AAAA,MAYzB;AAAA,QACE,EAAA;AAAA,QACA,KAAA,CAAM,OAAA;AAAA,QACN,MAAM,UAAA,IAAc,aAAA;AAAA,QACpB,KAAA,CAAM,OAAA;AAAA,QACN,MAAM,UAAA,IAAc,GAAA;AAAA,QACpB,MAAM,gBAAA,IAAoB,CAAA;AAAA,QAC1B,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAA,IAAQ,EAAE,CAAA;AAAA,QAC/B,KAAA,CAAM,YAAY,CAAA,CAAA,EAAI,KAAA,CAAM,UAAU,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA,GAAM,IAAA;AAAA,QACrD,MAAM,QAAA,IAAY,IAAA;AAAA,QAClB,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,QAAA,IAAY,EAAE,CAAA;AAAA,QACnC,KAAA,CAAM,SAAA,EAAW,WAAA,EAAY,IAAK,IAAA;AAAA,QAClC,GAAA;AAAA,QACA;AAAA;AACF,KACF;AAEA,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAa,MAAM,UAAA,IAAc,aAAA;AAAA,MACjC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAY,MAAM,UAAA,IAAc,GAAA;AAAA,MAChC,gBAAA,EAAkB,MAAM,gBAAA,IAAoB,CAAA;AAAA,MAC5C,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAA,MACrB,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY,EAAC;AAAA,MAC7B,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,IAAI,KAAK,GAAG;AAAA,KAC5C;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,MAAA,EAA+C;AAC9D,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,EAAA,EAAoC;AAC5C,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,KAAK,IAAA,CAAK,KAAA;AAAA,MAC/B,CAAA,cAAA,EAAiB,KAAK,KAAK,CAAA,6DAAA,CAAA;AAAA,MAC3B,CAAC,EAAE;AAAA,KACL;AACA,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC9B,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,CAAC,CAAgB,CAAA;AAAA,EACjD;AAAA,EAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAA,eAAA,EAAkB,IAAA,CAAK,KAAK,CAAA,cAAA,CAAA,EAAkB,CAAC,EAAE,CAAC,CAAA;AACzF,IAAA,IAAI,KAAK,MAAA,KAAW,CAAA,EAAG,MAAM,QAAA,CAAS,UAAU,EAAE,CAAA;AAClD,IAAA,MAAM,IAAA,CAAK,KAAK,KAAA,CAAM,CAAA,YAAA,EAAe,KAAK,KAAK,CAAA,cAAA,CAAA,EAAkB,CAAC,EAAE,CAAC,CAAA;AAAA,EACvE;AAAA,EAEA,MAAM,WAAW,GAAA,EAAgC;AAC/C,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAA,EAAI,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC7D,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,KAAK,IAAA,CAAK,KAAA;AAAA,MAC/B,CAAA,YAAA,EAAe,IAAA,CAAK,KAAK,CAAA,cAAA,EAAiB,YAAY,CAAA,cAAA,CAAA;AAAA,MACtD;AAAA,KACF;AACA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,MAAM,MAAM,EAAA,EAA2B;AACrC,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAA,eAAA,EAAkB,IAAA,CAAK,KAAK,CAAA,cAAA,CAAA,EAAkB,CAAC,EAAE,CAAC,CAAA;AACzF,IAAA,IAAI,KAAK,MAAA,KAAW,CAAA,EAAG,MAAM,QAAA,CAAS,UAAU,EAAE,CAAA;AAClD,IAAA,MAAM,IAAA,CAAK,KAAK,KAAA,CAAM,CAAA,OAAA,EAAU,KAAK,KAAK,CAAA,qCAAA,CAAA,EAAyC,CAAC,EAAE,CAAC,CAAA;AAAA,EACzF;AAAA,EAEA,MAAM,QAAA,CAAS,KAAA,EAA4B,SAAA,EAAyC;AAClF,IAAA,MAAM,UAAA,GAAuB,CAAC,4CAA4C,CAAA;AAC1E,IAAA,MAAM,SAAoB,EAAC;AAC3B,IAAA,IAAI,QAAA,GAAW,CAAA;AAEf,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,YAAA,EAAe,QAAA,EAAU,CAAA,CAAE,CAAA;AAC3C,MAAA,MAAA,CAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,WAAA,CAAY,SAAS,CAAA,EAAG;AACrD,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,mBAAA,EAAsB,QAAA,EAAU,CAAA,CAAA,CAAG,CAAA;AACnD,MAAA,MAAA,CAAO,IAAA,CAAK,MAAM,WAAW,CAAA;AAAA,IAC/B;AACA,IAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,EAAG;AACvC,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,SAAA,EAAY,QAAA,EAAU,CAAA,CAAE,CAAA;AACxC,MAAA,MAAA,CAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACxB;AACA,IAAA,IAAI,MAAM,KAAA,EAAO;AACf,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,eAAA,EAAkB,QAAA,EAAU,CAAA,CAAE,CAAA;AAC9C,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,EAAI,KAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAChC;AACA,IAAA,IAAI,MAAM,YAAA,EAAc;AACtB,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,eAAA,EAAkB,QAAA,EAAU,CAAA,CAAE,CAAA;AAC9C,MAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,WAAA,EAAa,CAAA;AAAA,IAC9C;AACA,IAAA,IAAI,MAAM,aAAA,EAAe;AACvB,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,eAAA,EAAkB,QAAA,EAAU,CAAA,CAAE,CAAA;AAC9C,MAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,WAAA,EAAa,CAAA;AAAA,IAC/C;AAEA,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAA,GAAS,CAAA,GAAI,SAAS,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAE5E,IAAA,IAAI,OAAA;AACJ,IAAA,QAAQ,MAAM,QAAA;AAAU,MACtB,KAAK,QAAA;AACH,QAAA,OAAA,GAAU,iBAAA;AACV,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,OAAA,GAAU,iBAAA;AACV,QAAA;AAAA,MACF,KAAK,QAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL;AACE,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,OAAO,KAAK,iBAAA,CAAkB,SAAA,EAAW,KAAA,EAAO,MAAA,EAAQ,OAAO,QAAQ,CAAA;AAAA,QACzE;AACA,QAAA,OAAA,GAAU,kCAAA;AACV,QAAA;AAAA;AAGJ,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,EAAA;AAC7B,IAAA,MAAM,GAAA,GAAM,iBAAiB,IAAA,CAAK,KAAK,IAAI,KAAK,CAAA,UAAA,EAAa,OAAO,CAAA,QAAA,EAAW,QAAQ,CAAA,CAAA;AACvF,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAEjB,IAAA,MAAM,EAAE,MAAK,GAAI,MAAM,KAAK,IAAA,CAAK,KAAA,CAAM,KAAK,MAAM,CAAA;AAElD,IAAA,IAAI,KAAA,CAAM,UAAU,KAAA,EAAO;AACzB,MAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,EAAG;AACtC,QAAA,MAAM,CAAA,GAAI,GAAA;AACV,QAAA,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,qCAAA,CAAA,EAAyC,CAAC,CAAA,CAAE,EAAE,CAAC,CAAA;AAAA,MAC3F;AAAA,IACF;AAEA,IAAA,OAAQ,KAAuB,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,EAChE;AAAA,EAEA,MAAM,MAAM,MAAA,EAA6C;AACvD,IAAA,MAAM,UAAA,GAAuB,CAAC,4CAA4C,CAAA;AAC1E,IAAA,MAAM,SAAoB,EAAC;AAC3B,IAAA,IAAI,QAAA,GAAW,CAAA;AAEf,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,YAAA,EAAe,QAAA,EAAU,CAAA,CAAE,CAAA;AAC3C,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,OAAO,CAAA;AAAA,IAC5B;AACA,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,eAAA,EAAkB,QAAA,EAAU,CAAA,CAAE,CAAA;AAC9C,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,IAC/B;AACA,IAAA,IAAI,MAAA,EAAQ,kBAAkB,MAAA,EAAW;AACvC,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,eAAA,EAAkB,QAAA,EAAU,CAAA,CAAE,CAAA;AAC9C,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,aAAa,CAAA;AAAA,IAClC;AACA,IAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,eAAA,EAAkB,QAAA,EAAU,CAAA,CAAE,CAAA;AAC9C,MAAA,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,WAAA,EAAa,CAAA;AAAA,IAC/C;AACA,IAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,eAAA,EAAkB,QAAA,EAAU,CAAA,CAAE,CAAA;AAC9C,MAAA,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,WAAA,EAAa,CAAA;AAAA,IAChD;AAEA,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,OAAO,CAAA;AACrC,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,KAAK,IAAA,CAAK,KAAA;AAAA,MAC/B,CAAA,8BAAA,EAAiC,IAAA,CAAK,KAAK,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAAA,MAC1D;AAAA,KACF;AACA,IAAA,OAAO,MAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,CAAwB,KAAK,CAAA;AAAA,EACpD;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,IAAA,EAAM,GAAA,EAAK;AACpC,MAAA,MAAM,IAAA,CAAK,KAAK,GAAA,EAAI;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAc,iBAAA,CACZ,SAAA,EACA,KAAA,EACA,MAAA,EACA,WACA,QAAA,EACmB;AACnB,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,EAAA;AAC7B,IAAA,MAAM,UAAA,GAAa,SAAA,CAAU,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA;AACrD,IAAA,MAAM,WAAA,GAAc,UAAA,GAChB,CAAA,MAAA,EAAS,UAAU,CAAA,0BAAA,CAAA,GACnB,CAAA,2BAAA,CAAA;AACJ,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,KAAa,QAAA;AACpC,IAAA,MAAM,MAAM,QAAA,GAAW;AAAA;AAAA,wBAAA,EAED,QAAQ,CAAA;AAAA,+BAAA,EACD,QAAQ,CAAA;AAAA,WAAA,EAC5B,KAAK,KAAK;AAAA,MAAA,EACf,WAAW;AAAA;AAAA,aAAA,EAEJ,WAAW,CAAC;AAAA,IAAA,CAAA,GACnB;AAAA;AAAA,wBAAA,EAEkB,QAAQ,CAAA;AAAA,WAAA,EACrB,KAAK,KAAK;AAAA,MAAA,EACf,WAAW;AAAA;AAAA,aAAA,EAEJ,WAAW,CAAC;AAAA,IAAA,CAAA;AAEvB,IAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AACrB,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAEjB,IAAA,MAAM,EAAE,MAAK,GAAI,MAAM,KAAK,IAAA,CAAK,KAAA,CAAM,KAAK,MAAM,CAAA;AAElD,IAAA,IAAI,KAAA,CAAM,UAAU,KAAA,EAAO;AACzB,MAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,EAAG;AACtC,QAAA,MAAM,CAAA,GAAI,GAAA;AACV,QAAA,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,qCAAA,CAAA,EAAyC,CAAC,CAAA,CAAE,EAAE,CAAC,CAAA;AAAA,MAC3F;AAAA,IACF;AAEA,IAAA,OAAQ,KAAuB,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,EAChE;AAAA,EAEQ,aAAa,GAAA,EAA0B;AAC7C,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,SAAS,GAAA,CAAI,QAAA;AAAA,MACb,YAAY,GAAA,CAAI,WAAA;AAAA,MAChB,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,kBAAkB,GAAA,CAAI,iBAAA;AAAA,MACtB,IAAA,EAAM,MAAM,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,GAAI,GAAA,CAAI,OAAO,EAAC;AAAA,MAC5C,SAAA,EAAW,IAAI,SAAA,IAAa,MAAA;AAAA,MAC5B,QAAA,EAAU,IAAI,SAAA,IAAa,MAAA;AAAA,MAC3B,QAAA,EAAU,GAAA,CAAI,QAAA,IAAY,EAAC;AAAA,MAC3B,WAAW,GAAA,CAAI,UAAA,GAAa,IAAI,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,GAAI,MAAA;AAAA,MACvD,SAAA,EAAW,IAAI,IAAA,CAAK,GAAA,CAAI,UAAU;AAAA,KACpC;AAAA,EACF;AACF;;;AC/YO,IAAM,sBAAN,MAAqD;AAAA,EACjD,YAAA,GAAoC,EAAE,YAAA,EAAc,IAAA,EAAK;AAAA,EAC1D,KAAA;AAAA,EACA,MAAA;AAAA,EACR,YAAY,MAAA,EAA4B;AACtC,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AACpB,IAAA,IAAA,CAAK,MAAA,GAAS,OAAO,SAAA,IAAa,UAAA;AAAA,EACpC;AAAA,EAEA,MAAM,UAAA,GAA4B;AAAA,EAElC;AAAA,EAEA,UAAA,GAAqB;AACnB,IAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,UAAA,EAAW,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,MAAM,KAAA,EAA0C;AACpD,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,MAAA,GAAuB;AAAA,MAC3B,EAAA,EAAI,KAAA,CAAM,EAAA,IAAM,IAAA,CAAK,UAAA,EAAW;AAAA,MAChC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAa,MAAM,UAAA,IAAc,aAAA;AAAA,MACjC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAY,MAAM,UAAA,IAAc,GAAA;AAAA,MAChC,gBAAA,EAAkB,MAAM,gBAAA,IAAoB,CAAA;AAAA,MAC5C,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAA,MACrB,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY,EAAC;AAAA,MAC7B,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,SAAA,EAAW,MAAM,SAAA,IAAa,GAAA;AAAA,MAC9B,UAAA,EAAY,IAAI,WAAA;AAAY,KAC9B;AAEA,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,EAAE,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AACpE,IAAA,MAAM,IAAA,CAAK,MAAM,IAAA,CAAK,IAAA,CAAK,UAAU,MAAA,CAAO,OAAO,CAAA,EAAG,MAAA,CAAO,EAAE,CAAA;AAC/D,IAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,aAAA,EAAc,EAAG,OAAO,OAAO,CAAA;AAE1D,IAAA,OAAO,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,EAChC;AAAA,EAEA,MAAM,WAAW,MAAA,EAA+C;AAC9D,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AAErB,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,MAAA,GAAuB;AAAA,QAC3B,EAAA,EAAI,KAAA,CAAM,EAAA,IAAM,IAAA,CAAK,UAAA,EAAW;AAAA,QAChC,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,UAAA,EAAa,MAAM,UAAA,IAAc,aAAA;AAAA,QACjC,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,UAAA,EAAY,MAAM,UAAA,IAAc,GAAA;AAAA,QAChC,gBAAA,EAAkB,MAAM,gBAAA,IAAoB,CAAA;AAAA,QAC5C,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAA,QACrB,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY,EAAC;AAAA,QAC7B,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,SAAA,EAAW,MAAM,SAAA,IAAa,GAAA;AAAA,QAC9B,UAAA,EAAY,IAAI,WAAA;AAAY,OAC9B;AAEA,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,EAAE,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AACpE,MAAA,MAAM,IAAA,CAAK,MAAM,IAAA,CAAK,IAAA,CAAK,UAAU,MAAA,CAAO,OAAO,CAAA,EAAG,MAAA,CAAO,EAAE,CAAA;AAC/D,MAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,KAAK,aAAA,EAAc,EAAG,OAAO,OAAO,CAAA;AAC1D,MAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,MAAM,CAAC,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,EAAA,EAAoC;AAC5C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAC,CAAA;AACjD,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,IAAI,MAAA,CAAO,SAAA,IAAa,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,oBAAK,IAAI,IAAA,EAAK,EAAG,OAAO,IAAA;AACzE,IAAA,OAAO,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,EAChC;AAAA,EAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAC,CAAA;AACjD,IAAA,IAAI,CAAC,GAAA,EAAK,MAAM,QAAA,CAAS,UAAU,EAAE,CAAA;AAErC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,MAAM,KAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAC,CAAA;AACrC,IAAA,MAAM,IAAA,CAAK,MAAM,IAAA,CAAK,IAAA,CAAK,UAAU,MAAA,CAAO,OAAO,GAAG,EAAE,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAM,WAAW,GAAA,EAAgC;AAC/C,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAsB;AAE1C,IAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAC,CAAA;AACjD,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,QAAA,MAAM,OAAO,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,OAAO,KAAK,EAAC;AAC7C,QAAA,IAAA,CAAK,KAAK,EAAE,CAAA;AACZ,QAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,OAAA,EAAS,IAAI,CAAA;AAAA,MAClC;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,MAAM,CAAA,IAAK,OAAA,EAAS;AACvC,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,EAAA,KAAO,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAC,CAAC,CAAA;AACzD,MAAA,MAAM,IAAA,CAAK,MAAM,IAAA,CAAK,IAAA,CAAK,UAAU,OAAO,CAAA,EAAG,GAAG,MAAM,CAAA;AACxD,MAAA,KAAA,IAAS,MAAA,CAAO,MAAA;AAAA,IAClB;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,MAAM,EAAA,EAA2B;AACrC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAC,CAAA;AACjD,IAAA,IAAI,CAAC,GAAA,EAAK,MAAM,QAAA,CAAS,UAAU,EAAE,CAAA;AAErC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,MAAA,CAAO,UAAA,GAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC3C,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA,EAC/D;AAAA,EAEA,MAAM,QAAA,CAAS,KAAA,EAA4B,UAAA,EAA0C;AACnF,IAAA,IAAI,aAA6B,EAAC;AAElC,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,UAAA,GAAa,MAAM,IAAA,CAAK,gBAAA,CAAiB,KAAA,CAAM,OAAO,CAAA;AAAA,IACxD,CAAA,MAAO;AACL,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA;AACnD,QAAA,UAAA,CAAW,IAAA,CAAK,GAAG,OAAO,CAAA;AAAA,MAC5B;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,IAAI,OAAA,GAAU,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,SAAA,IAAa,IAAI,IAAA,CAAK,CAAA,CAAE,SAAS,IAAI,GAAG,CAAA;AAElF,IAAA,IAAI,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,WAAA,CAAY,SAAS,CAAA,EAAG;AACrD,MAAA,OAAA,GAAU,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,MAAM,WAAA,CAAa,QAAA,CAAS,CAAA,CAAE,UAAU,CAAC,CAAA;AAAA,IAC3E;AACA,IAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,EAAG;AACvC,MAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,EAAM,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAM,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAAA,IAC9E;AACA,IAAA,IAAI,MAAM,KAAA,EAAO;AACf,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,WAAA,EAAY;AAClC,MAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IACrE;AAEA,IAAA,QAAQ,MAAM,QAAA;AAAU,MACtB,KAAK,QAAA;AACH,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,KAAK,CAAA,CAAE,UAAU,CAAA,CAAE,OAAA,KAAY,IAAI,IAAA,CAAK,EAAE,UAAU,CAAA,CAAE,SAAS,CAAA;AAC1F,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,UAAA,GAAa,EAAE,UAAU,CAAA;AAClD,QAAA;AAAA,MACF,KAAK,QAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL;AACE,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAC,CAAA,EAAG,CAAA,KACF,EAAE,UAAA,GAAa,CAAA,CAAE,cAAc,IAAI,IAAA,CAAK,EAAE,UAAU,CAAA,CAAE,SAAQ,GAAI,IAAI,KAAK,CAAA,CAAE,UAAU,EAAE,OAAA;AAAQ,SACrG;AACA,QAAA;AAAA;AAGJ,IAAA,IAAI,KAAA,CAAM,UAAU,KAAA,EAAO;AACzB,MAAA,MAAM,MAAA,GAAA,iBAAS,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACtC,MAAA,MAAM,UAAU,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,SAAS,EAAE,CAAA;AAClD,MAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,QAAA,CAAA,CAAE,UAAA,GAAa,MAAA;AACf,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,CAAA,CAAE,EAAE,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,MAC5D;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,EAAA;AAC7B,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,WAAA,CAAY,CAAC,CAAC,CAAA;AAAA,EAC/D;AAAA,EAEA,MAAM,MAAM,MAAA,EAA6C;AACvD,IAAA,IAAI,aAA6B,EAAC;AAElC,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,UAAA,GAAa,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,OAAO,CAAA;AAAA,IACzD,CAAA,MAAO;AACL,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA;AACnD,QAAA,UAAA,CAAW,IAAA,CAAK,GAAG,OAAO,CAAA;AAAA,MAC5B;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,IAAI,OAAA,GAAU,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,SAAA,IAAa,IAAI,IAAA,CAAK,CAAA,CAAE,SAAS,IAAI,GAAG,CAAA;AAElF,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,UAAA,KAAe,OAAO,UAAU,CAAA;AAAA,IACpE;AACA,IAAA,IAAI,MAAA,EAAQ,kBAAkB,MAAA,EAAW;AACvC,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,UAAA,IAAc,OAAO,aAAc,CAAA;AAAA,IACvE;AAEA,IAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,EACjB;AAAA,EAEA,MAAM,KAAA,GAAuB;AAAA,EAC7B;AAAA,EAEQ,aAAA,GAAwB;AAC9B,IAAA,OAAO,CAAA,EAAG,KAAK,MAAM,CAAA,OAAA,CAAA;AAAA,EACvB;AAAA,EAEQ,UAAU,OAAA,EAAyB;AACzC,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,qBAAA,EAAuB,GAAG,CAAA;AACvD,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,CAAA;AAAA,EACjC;AAAA,EAEQ,QAAQ,EAAA,EAAoB;AAClC,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAc,iBAAiB,OAAA,EAA0C;AACvE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,KAAA,CAAM,SAAS,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAC7D,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAE9B,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,CAAC,OAAO,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAC,CAAA;AAC7C,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAG,IAAI,CAAA;AAE1C,IAAA,MAAM,UAA0B,EAAC;AACjC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAiB,CAAA;AAAA,QAC9C,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAc,WAAA,GAAiC;AAC7C,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,IAAA,CAAK,eAAe,CAAA;AAAA,EACjD;AAAA,EAEQ,YAAY,MAAA,EAA8B;AAChD,IAAA,MAAM,EAAE,UAAA,EAAY,CAAA,EAAG,GAAG,MAAK,GAAI,MAAA;AACnC,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,SAAA,EAAW,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AAAA,MACpC,WAAW,MAAA,CAAO,SAAA,GAAY,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,GAAI;AAAA,KAC7D;AAAA,EACF;AACF;;;AC1PO,IAAM,uBAAN,MAAsD;AAAA,EACnD,MAAA;AAAA,EACA,cAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA,uBAAkB,GAAA,EAAoB;AAAA,EAE9C,YAAY,MAAA,EAA6B;AACvC,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAO,cAAA,IAAkB,UAAA;AAC/C,IAAA,IAAA,CAAK,UAAA,GAAa,OAAO,UAAA,IAAc,IAAA;AAAA,EACzC;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,IAAA,CAAK,cAAc,CAAA;AAAA,IACrD,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,IAAA,CAAK,cAAA,EAAgB;AAAA,QACtD,SAAS,EAAE,IAAA,EAAM,IAAA,CAAK,UAAA,EAAY,UAAU,QAAA;AAAS,OACtD,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,UAAA,GAAqB;AACnB,IAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,UAAA,EAAW,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,MAAM,KAAA,EAA0C;AACpD,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,MAAA,GAAiB;AAAA,MACrB,EAAA,EAAI,KAAA,CAAM,EAAA,IAAM,IAAA,CAAK,UAAA,EAAW;AAAA,MAChC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAa,MAAM,UAAA,IAAc,aAAA;AAAA,MACjC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAY,MAAM,UAAA,IAAc,GAAA;AAAA,MAChC,gBAAA,EAAkB,MAAM,gBAAA,IAAoB,CAAA;AAAA,MAC5C,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAA,MACrB,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY,EAAC;AAAA,MAC7B,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,SAAA,EAAW,MAAM,SAAA,IAAa;AAAA,KAChC;AAEA,IAAA,MAAM,QAAA,GAAW,OAAO,UAAA,EAAW;AACnC,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,cAAA,EAAgB;AAAA,MAC5C,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,EAAA,EAAI,QAAA;AAAA,UACJ,MAAA,EAAQ,MAAM,SAAA,IAAa,IAAI,MAAM,IAAA,CAAK,UAAU,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA;AAAA,UAC5D,OAAA,EAAS,IAAA,CAAK,UAAA,CAAW,MAAM;AAAA;AACjC;AACF,KACD,CAAA;AAED,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,QAAQ,CAAA;AACxC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,MAAA,EAA+C;AAC9D,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,SAA+E,EAAC;AAEtF,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,MAAA,GAAiB;AAAA,QACrB,EAAA,EAAI,KAAA,CAAM,EAAA,IAAM,IAAA,CAAK,UAAA,EAAW;AAAA,QAChC,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,UAAA,EAAa,MAAM,UAAA,IAAc,aAAA;AAAA,QACjC,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,UAAA,EAAY,MAAM,UAAA,IAAc,GAAA;AAAA,QAChC,gBAAA,EAAkB,MAAM,gBAAA,IAAoB,CAAA;AAAA,QAC5C,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAA,QACrB,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY,EAAC;AAAA,QAC7B,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,SAAA,EAAW,MAAM,SAAA,IAAa;AAAA,OAChC;AACA,MAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AACnB,MAAA,MAAM,GAAA,GAAM,OAAO,UAAA,EAAW;AAC9B,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,EAAA,EAAI,GAAA;AAAA,QACJ,MAAA,EAAQ,MAAM,SAAA,IAAa,IAAI,MAAM,IAAA,CAAK,UAAU,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA;AAAA,QAC5D,OAAA,EAAS,IAAA,CAAK,UAAA,CAAW,MAAM;AAAA,OAChC,CAAA;AACD,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,GAAG,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,KAAK,MAAA,CAAO,MAAA,CAAO,KAAK,cAAA,EAAgB,EAAE,QAAQ,CAAA;AACxD,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,EAAA,EAAoC;AAC5C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AACxC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,cAAA,EAAgB,EAAE,GAAA,EAAK,CAAC,QAAQ,CAAA,EAAG,CAAA;AAClF,MAAA,IAAI,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC/B,QAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,IAAa,IAAI,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,SAAmB,CAAA,oBAAK,IAAI,IAAA,EAAK,EAAG,OAAO,IAAA;AACjG,QAAA,OAAO,IAAA,CAAK,WAAW,KAAK,CAAA;AAAA,MAC9B;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AACxC,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,QAAA,CAAS,UAAU,EAAE,CAAA;AAC1C,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,cAAA,EAAgB,EAAE,MAAA,EAAQ,CAAC,QAAQ,CAAA,EAAG,CAAA;AACpE,IAAA,IAAA,CAAK,WAAA,CAAY,OAAO,EAAE,CAAA;AAAA,EAC5B;AAAA,EAEA,MAAM,WAAW,GAAA,EAAgC;AAC/C,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AACnC,MAAA,IAAI,GAAA,EAAK;AAAE,QAAA,SAAA,CAAU,KAAK,GAAG,CAAA;AAAG,QAAA,IAAA,CAAK,WAAA,CAAY,OAAO,EAAE,CAAA;AAAA,MAAG;AAAA,IAC/D;AACA,IAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AACnC,IAAA,MAAM,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA,CAAK,gBAAgB,EAAE,MAAA,EAAQ,WAAW,CAAA;AACnE,IAAA,OAAO,SAAA,CAAU,MAAA;AAAA,EACnB;AAAA,EAEA,MAAM,QAAA,CAAS,KAAA,EAA4B,SAAA,EAAyC;AAClF,IAAA,MAAM,OAAkB,EAAC;AAEzB,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA,EAAQ,EAAG,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAI,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,WAAA,CAAY,SAAS,CAAA,EAAG;AACrD,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAE,GAAA,EAAK,KAAA,CAAM,WAAA,EAAY,EAAG,CAAA;AAAA,IACpE;AAEA,IAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,EAAG;AACvC,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,EAAE,GAAA,EAAK,KAAA,CAAM,IAAA,EAAK,EAAG,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,EAAE,MAAK,GAAI,MAAA;AAC5C,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,EAAA;AAE7B,IAAA,IAAI,KAAA,CAAM,QAAA,KAAa,UAAA,IAAc,KAAA,CAAM,aAAa,QAAA,EAAU;AAChE,MAAA,MAAME,OAAAA,GAAS,aAAa,IAAI,KAAA,CAAM,KAAK,UAAU,CAAA,CAAE,KAAK,CAAC,CAAA;AAC7D,MAAA,MAAMC,WAAU,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,KAAK,cAAA,EAAgB;AAAA,QAC5D,MAAA,EAAAD,OAAAA;AAAA,QACA,KAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAA,MAAME,OAAAA,GAASD,QAAAA;AACf,MAAA,OAAOC,QAAO,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,SAAS,IAAI,KAAA,CAAM,KAAK,UAAU,CAAA,CAAE,KAAK,CAAC,CAAA;AAChD,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,KAAK,cAAA,EAAgB;AAAA,MAC5D,MAAA;AAAA,MACA,KAAA,EAAO,GAAA;AAAA,MACP;AAAA,KACD,CAAA;AACD,IAAA,IAAI,MAAA,GAAS,OAAA;AAEb,IAAA,QAAQ,MAAM,QAAA;AAAU,MACtB,KAAK,QAAA;AACH,QAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACpB,UAAA,MAAM,QAAQ,IAAI,IAAA,CAAK,EAAE,OAAA,CAAQ,SAAmB,EAAE,OAAA,EAAQ;AAC9D,UAAA,MAAM,QAAQ,IAAI,IAAA,CAAK,EAAE,OAAA,CAAQ,SAAmB,EAAE,OAAA,EAAQ;AAC9D,UAAA,OAAO,KAAA,GAAQ,KAAA;AAAA,QACjB,CAAC,CAAA;AACD,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAO,EAAE,OAAA,CAAQ,UAAA,GAAyB,CAAA,CAAE,OAAA,CAAQ,UAAqB,CAAA;AACzF,QAAA;AAAA;AAGJ,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAA;AAAA,EAC7D;AAAA,EAEA,MAAM,MAAM,MAAA,EAA6C;AACvD,IAAA,MAAM,OAAkB,EAAC;AAEzB,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,CAAO,OAAA,EAAQ,EAAG,CAAA;AAAA,IAChE;AAEA,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,CAAO,UAAA,EAAW,EAAG,CAAA;AAAA,IACtE;AAEA,IAAA,IAAI,MAAA,EAAQ,kBAAkB,MAAA,EAAW;AACvC,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,EAAE,GAAA,EAAK,MAAA,CAAO,aAAA,EAAc,EAAG,CAAA;AAAA,IACvE;AAEA,IAAA,MAAM,YAAY,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,EAAE,MAAK,GAAI,MAAA;AAC/C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,cAAA,EAAgB,SAAA,GAAY,EAAE,MAAA,EAAQ,SAAA,EAAU,GAAI,MAAS,CAAA;AACzG,IAAA,OAAO,MAAA,CAAO,KAAA;AAAA,EAChB;AAAA,EAEA,MAAM,KAAA,GAAuB;AAAA,EAAC;AAAA,EAEtB,WAAW,MAAA,EAAyC;AAC1D,IAAA,OAAO;AAAA,MACL,KAAK,MAAA,CAAO,EAAA;AAAA,MACZ,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,kBAAkB,MAAA,CAAO,gBAAA;AAAA,MACzB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY,EAAC;AAAA,MAC9B,SAAA,EAAW,MAAA,CAAO,SAAA,CAAU,WAAA,EAAY;AAAA,MACxC,QAAA,EAAU,OAAO,QAAA,IAAY,IAAA;AAAA,MAC7B,SAAA,EAAW,MAAA,CAAO,SAAA,EAAW,WAAA,EAAY,IAAK;AAAA,KAChD;AAAA,EACF;AAAA,EAEQ,WAAW,KAAA,EAA4B;AAC7C,IAAA,MAAM,IAAI,KAAA,CAAM,OAAA;AAChB,IAAA,OAAO;AAAA,MACL,EAAA,EAAK,CAAA,CAAE,GAAA,IAAkB,KAAA,CAAM,EAAA;AAAA,MAC/B,SAAS,CAAA,CAAE,OAAA;AAAA,MACX,YAAY,CAAA,CAAE,UAAA;AAAA,MACd,SAAS,CAAA,CAAE,OAAA;AAAA,MACX,YAAY,CAAA,CAAE,UAAA;AAAA,MACd,gBAAA,EAAmB,EAAE,gBAAA,IAA+B,CAAA;AAAA,MACpD,IAAA,EAAO,CAAA,CAAE,IAAA,IAAqB,EAAC;AAAA,MAC/B,WAAW,KAAA,CAAM,MAAA;AAAA,MACjB,QAAA,EAAW,EAAE,QAAA,IAAmC,MAAA;AAAA,MAChD,QAAA,EAAW,CAAA,CAAE,QAAA,IAAwC,EAAC;AAAA,MACtD,WAAW,CAAA,CAAE,SAAA,GAAY,IAAI,IAAA,CAAK,CAAA,CAAE,SAAmB,CAAA,GAAI,MAAA;AAAA,MAC3D,SAAA,EAAW,IAAI,IAAA,CAAK,CAAA,CAAE,SAAmB;AAAA,KAC3C;AAAA,EACF;AACF;;;AChOO,IAAM,sBAAN,MAAqD;AAAA,EAClD,MAAA;AAAA,EACA,QAAA;AAAA,EAER,YAAY,MAAA,EAA4B;AACtC,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,QAAA,GAAW,OAAO,QAAA,IAAY,OAAA;AAAA,EACrC;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,EAAE,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,QACZ;AAAA,OACF;AACA,MAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,QACZ,CAAA;AAAA,2GAAA;AAAA,OAEF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,UAAA,GAAqB;AACnB,IAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,UAAA,EAAW,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,MAAM,KAAA,EAA0C;AACpD,IAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,EAAA,IAAM,IAAA,CAAK,UAAA,EAAW;AAEvC,IAAA,MAAM,KAAA,GAAiC;AAAA,MACrC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAY,MAAM,UAAA,IAAc,aAAA;AAAA,MAChC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAY,MAAM,UAAA,IAAc,GAAA;AAAA,MAChC,gBAAA,EAAkB,MAAM,gBAAA,IAAoB,CAAA;AAAA,MAC5C,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAA,MACrB,QAAA,EAAU,MAAM,QAAA,IAAY,IAAA;AAAA,MAC5B,UAAU,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,QAAA,IAAY,EAAE,CAAA;AAAA,MAC7C,SAAA,EAAW,KAAA,CAAM,SAAA,EAAW,WAAA,EAAY,IAAK,IAAA;AAAA,MAC7C,SAAA,EAAW,KAAA,CAAM,SAAA,EAAW,WAAA,EAAY,IAAK,GAAA;AAAA,MAC7C,SAAA,EAAW,MAAM,SAAA,IAAa;AAAA,KAChC;AAEA,IAAA,MAAM,WAAA,GAAc,EAAE,GAAG,KAAA,EAAM;AAC/B,IAAA,IAAI,CAAC,MAAM,SAAA,EAAW;AACpB,MAAA,OAAO,WAAA,CAAY,SAAA;AAAA,IACrB;AAEA,IAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,EAAE,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,QACZ,qFAAA;AAAA,QACA,EAAE,EAAA,EAAI,KAAA,EAAO,WAAA;AAAY,OAC3B;AAAA,IACF,CAAA,SAAE;AACA,MAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,IACtB;AAEA,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAa,MAAM,UAAA,IAAc,aAAA;AAAA,MACjC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAY,MAAM,UAAA,IAAc,GAAA;AAAA,MAChC,gBAAA,EAAkB,MAAM,gBAAA,IAAoB,CAAA;AAAA,MAC5C,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAA,MACrB,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY,EAAC;AAAA,MAC7B,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,IAAI,KAAK,GAAG;AAAA,KAC5C;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,MAAA,EAA+C;AAC9D,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,EAAA,EAAoC;AAC5C,IAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,EAAE,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA;AAAA,QAC3B,2FAAA;AAAA,QACA,EAAE,EAAA;AAAG,OACP;AACA,MAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACxC,MAAA,MAAM,MAAM,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAI,GAAG,CAAA;AACrC,MAAA,MAAM,IAAA,GAAQ,IAAI,UAAA,IAAc,GAAA;AAChC,MAAA,OAAO,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,IAChC,CAAA,SAAE;AACA,MAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,EAAE,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,MAAM,OAAA,CAAQ,IAAI,8CAAA,EAAgD,EAAE,IAAI,CAAA;AACtF,MAAA,IAAI,MAAM,OAAA,CAAQ,MAAA,KAAW,GAAG,MAAM,QAAA,CAAS,UAAU,EAAE,CAAA;AAC3D,MAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,4CAAA,EAA8C,EAAE,IAAI,CAAA;AAAA,IACxE,CAAA,SAAE;AACA,MAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,GAAA,EAAgC;AAC/C,IAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,EAAE,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA;AAAA,QAC3B,0FAAA;AAAA,QACA,EAAE,GAAA;AAAI,OACR;AACA,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA;AAC/B,MAAA,IAAI,CAAC,QAAQ,OAAO,CAAA;AACpB,MAAA,OAAO,MAAA,CAAO,IAAI,SAAS,CAAA;AAAA,IAC7B,CAAA,SAAE;AACA,MAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,CAAS,KAAA,EAA4B,SAAA,EAAyC;AAClF,IAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,EAAE,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,SAAS,EAAE,CAAA;AAC1C,MAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,QAAA;AAEnC,MAAA,IAAI,QAAA,KAAa,cAAc,SAAA,EAAW;AACxC,QAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,OAAA,EAAS,SAAA,EAAW,OAAO,KAAK,CAAA;AAAA,MAChE;AAEA,MAAA,MAAM,QAAA,GAAW,OAAO,KAAK,CAAA;AAC7B,MAAA,IAAI,MAAA;AACJ,MAAA,MAAM,SAAkC,EAAC;AAEzC,MAAA,MAAM,QAAA,GAAW,MAAM,OAAA,KAAY,KAAA,CAAA;AAEnC,MAAA,QAAQ,QAAA;AAAU,QAChB,KAAK,QAAA;AACH,UAAA,IAAI,QAAA,EAAU;AACX,YAAA,MAAA,GAAS,uFAAA,GAA0F,QAAA;AACpG,YAAA,MAAA,CAAO,UAAU,KAAA,CAAM,OAAA;AAAA,UACzB,CAAA,MAAO;AACL,YAAA,MAAA,GAAS,4DAAA,GAA+D,QAAA;AAAA,UAC1E;AACA,UAAA;AAAA,QACF,KAAK,WAAA;AACH,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,MAAA,GAAS,wFAAA,GAA2F,QAAA;AACpG,YAAA,MAAA,CAAO,UAAU,KAAA,CAAM,OAAA;AAAA,UACzB,CAAA,MAAO;AACL,YAAA,MAAA,GAAS,6DAAA,GAAgE,QAAA;AAAA,UAC3E;AACA,UAAA;AAAA,QACF,KAAK,QAAA;AAAA,QACL;AACE,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,OAAA,EAAS,SAAA,EAAW,OAAO,KAAK,CAAA;AAAA,UAChE;AACA,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,MAAA,GAAS,0GAAA,GAA6G,QAAA;AACtH,YAAA,MAAA,CAAO,UAAU,KAAA,CAAM,OAAA;AAAA,UACzB,CAAA,MAAO;AACL,YAAA,MAAA,GAAS,+EAAA,GAAkF,QAAA;AAAA,UAC7F;AACA,UAAA;AAAA;AAGJ,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,MAAM,CAAA;AAC/C,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM;AACzC,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA;AACrB,QAAA,MAAM,IAAA,GAAQ,IAAI,UAAA,IAAc,GAAA;AAChC,QAAA,OAAO,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,MAChC,CAAC,CAAA;AAED,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,QAAA,EAAU,KAAK,CAAA;AAAA,IACzC,CAAA,SAAE;AACA,MAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,MAAA,EAA6C;AACvD,IAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,EAAE,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,aAAuB,EAAC;AAC9B,MAAA,MAAM,SAAkC,EAAC;AAEzC,MAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,QAAA,UAAA,CAAW,KAAK,sBAAsB,CAAA;AACtC,QAAA,MAAA,CAAO,UAAU,MAAA,CAAO,OAAA;AAAA,MAC1B;AACA,MAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,QAAA,UAAA,CAAW,KAAK,4BAA4B,CAAA;AAC5C,QAAA,MAAA,CAAO,aAAa,MAAA,CAAO,UAAA;AAAA,MAC7B;AACA,MAAA,IAAI,MAAA,EAAQ,kBAAkB,KAAA,CAAA,EAAW;AACvC,QAAA,UAAA,CAAW,KAAK,gCAAgC,CAAA;AAChD,QAAA,MAAA,CAAO,gBAAgB,MAAA,CAAO,aAAA;AAAA,MAChC;AAEA,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAA,GAAS,CAAA,GAAI,SAAS,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,GAAK,EAAA;AAC5E,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA;AAAA,QAC3B,oBAAoB,KAAK,CAAA,yBAAA,CAAA;AAAA,QACzB;AAAA,OACF;AACA,MAAA,MAAM,WAAW,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAI,OAAO,CAAA;AAC9C,MAAA,OAAO,OAAO,QAAA,KAAa,QAAA,GAAW,QAAA,GAAW,OAAO,QAAQ,CAAA;AAAA,IAClE,CAAA,SAAE;AACA,MAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,CAAW,MAAA,EAAgB,MAAA,EAAqD;AACpF,IAAA,MAAM,OAAA,GAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,EAAE,QAAA,EAAU,IAAA,CAAK,UAAU,CAAA;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,MAAM,CAAA;AAC/C,MAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM;AAC/B,QAAA,MAAM,GAAA,GAAM,EAAE,QAAA,EAAS;AACvB,QAAA,MAAM,OAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,CAAI,CAAC,CAAA,IAAK,OAAO,IAAI,CAAC,CAAA,KAAM,YAAY,YAAA,IAAiB,GAAA,CAAI,CAAC,CAAY,CAAA;AACpH,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,MAAM,GAAA,GAAM,IAAI,IAAI,CAAA;AACpB,UAAA,MAAM,IAAA,GAAQ,IAAI,UAAA,IAAc,GAAA;AAChC,UAAA,OAAO,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,QAChC;AACA,QAAA,OAAO,IAAA,CAAK,cAAc,GAAiC,CAAA;AAAA,MAC7D,CAAC,CAAA;AAAA,IACH,CAAA,SAAE;AACA,MAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,EAC1B;AAAA,EAEA,MAAc,iBAAA,CACZ,OAAA,EACA,SAAA,EACA,OACA,KAAA,EACmB;AACnB,IAAA,MAAM,QAAA,GAAW,MAAM,OAAA,KAAY,MAAA;AACnC,IAAA,MAAM,QAAA,GAAW,OAAO,KAAK,CAAA;AAC7B,IAAA,MAAM,MAAA,GAAS,QAAA,GACX,CAAA,oDAAA,EAAuD,QAAQ,CAAA;AAAA;AAAA,0CAAA,EAE3B,QAAQ,CAAA,CAAA,GAC3C,CAAA,oDAAA,EAAuD,QAAQ,CAAA;AAAA,0CAAA,EAC5B,QAAQ,CAAA,CAAA;AAChD,IAAA,MAAM,MAAA,GAAkC,EAAE,SAAA,EAAU;AACpD,IAAA,IAAI,QAAA,EAAU,MAAA,CAAO,OAAA,GAAU,KAAA,CAAM,OAAA;AAErC,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,MAAM,CAAA;AAC/C,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM;AACzC,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACxB,MAAA,MAAM,IAAA,GAAQ,IAAI,UAAA,IAAc,GAAA;AAChC,MAAA,OAAO,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,IAChC,CAAC,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,QAAA,EAAU,KAAK,CAAA;AAAA,EACzC;AAAA,EAEQ,WAAA,CAAY,UAAoB,KAAA,EAAsC;AAC5E,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,IAAI,OAAA,GAAU,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,SAAA,GAAY,GAAG,CAAA;AAEtE,IAAA,IAAI,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,WAAA,CAAY,SAAS,CAAA,EAAG;AACrD,MAAA,OAAA,GAAU,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,MAAM,WAAA,CAAa,QAAA,CAAS,CAAA,CAAE,UAAU,CAAC,CAAA;AAAA,IAC3E;AACA,IAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,EAAG;AACvC,MAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,EAAM,IAAA,CAAK,CAAC,CAAA,KAAM,KAAA,CAAM,IAAA,CAAM,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAAA,IAC9E;AACA,IAAA,IAAI,MAAM,KAAA,EAAO;AACf,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,WAAA,EAAY;AAClC,MAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IACrE;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,cAAc,IAAA,EAA+B;AACnD,IAAA,OAAO;AAAA,MACL,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,UAAA,EAAa,KAAK,UAAA,IAAc,aAAA;AAAA,MAChC,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,UAAA,EAAY,KAAK,UAAA,IAAc,GAAA;AAAA,MAC/B,gBAAA,EAAkB,KAAK,gBAAA,IAAoB,CAAA;AAAA,MAC3C,IAAA,EAAM,MAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,OAAO,EAAC;AAAA,MAC9C,SAAA,EAAW,KAAK,SAAA,IAAa,MAAA;AAAA,MAC7B,QAAA,EAAU,KAAK,QAAA,IAAY,MAAA;AAAA,MAC3B,QAAA,EAAU,OAAO,IAAA,CAAK,QAAA,KAAa,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,GAAK,IAAA,CAAK,QAAA,IAAY,EAAC;AAAA,MAC7F,WAAW,IAAA,CAAK,SAAA,GAAY,IAAI,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,GAAI,MAAA;AAAA,MACvD,SAAA,EAAW,IAAI,IAAA,CAAK,IAAA,CAAK,SAAS;AAAA,KACpC;AAAA,EACF;AACF;;;AC7SO,IAAM,yBAAN,MAAwD;AAAA,EACrD,MAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA,GAAyC,IAAA;AAAA,EACzC,OAAA,uBAAc,GAAA,EAAoB;AAAA,EAE1C,YAAY,MAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,SAAA,IAAa,gBAAA;AAAA,EACvC;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,KAAK,SAAS,CAAA;AAAA,EAC/D;AAAA,EAEQ,UAAA,GAAiC;AACvC,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,IAAA,CAAK,cAAc,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,KAAK,SAAS,CAAA;AAAA,IAC/D;AACA,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA,EAEA,UAAA,GAAqB;AACnB,IAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,UAAA,EAAW,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,MAAM,KAAA,EAA0C;AACpD,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,MAAA,GAAiB;AAAA,MACrB,EAAA,EAAI,KAAA,CAAM,EAAA,IAAM,IAAA,CAAK,UAAA,EAAW;AAAA,MAChC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAa,MAAM,UAAA,IAAc,aAAA;AAAA,MACjC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAY,MAAM,UAAA,IAAc,GAAA;AAAA,MAChC,gBAAA,EAAkB,MAAM,gBAAA,IAAoB,CAAA;AAAA,MAC5C,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAA,MACrB,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY,EAAC;AAAA,MAC7B,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,SAAA,EAAW,MAAM,SAAA,IAAa;AAAA,KAChC;AAEA,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,UAAA,EAAW,CAAE,KAAK,MAAA,CAAO;AAAA,MAC/C,EAAA,EAAI,OAAO,UAAA,EAAW;AAAA,MACtB,UAAA,EAAY,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA;AAAA,MACrC,OAAA,EAAS,MAAM,SAAA,IAAa,IAAI,MAAM,IAAI,CAAA,CAAE,KAAK,CAAC;AAAA,KACnD,CAAA;AACD,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,IAAI,CAAA;AAEhC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,MAAA,EAA+C;AAC9D,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,EAAA,EAAoC;AAC5C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,UAAA,EAAW,CAAE,KAAA,CAAM,eAAA,CAAgB,IAAA,EAAM,EAAE,aAAA,EAAe,IAAA,EAAM,CAAA;AACvF,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,IAAA,MAAM,MAAA,GAAS,KAAK,eAAA,CAAgB,GAAA,CAAI,YAAY,GAAA,CAAI,OAAA,EAAS,WAAW,MAAS,CAAA;AACrF,IAAA,IAAI,OAAO,SAAA,IAAa,MAAA,CAAO,6BAAa,IAAI,IAAA,IAAQ,OAAO,IAAA;AAC/D,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,IAAA,EAAM,MAAM,QAAA,CAAS,UAAU,EAAE,CAAA;AACtC,IAAA,MAAM,IAAA,CAAK,UAAA,EAAW,CAAE,IAAA,CAAK,WAAW,IAAI,CAAA;AAC5C,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,EACxB;AAAA,EAEA,MAAM,WAAW,GAAA,EAAgC;AAC/C,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,OAAO,EAAE,CAAA;AACpB,QAAA,KAAA,EAAA;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,QAAA,CAAS,KAAA,EAA4B,SAAA,EAAyC;AAClF,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,QAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,EAAA;AAE7B,IAAA,IAAA,CAAK,QAAA,KAAa,UAAA,IAAc,QAAA,KAAa,QAAA,KAAa,SAAA,EAAW;AACnE,MAAA,MAAMC,QAAAA,GAAU,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AACvC,MAAA,MAAMC,UAAS,MAAM,IAAA,CAAK,YAAW,CAAE,KAAA,CAAM,WAAW,SAAA,EAAW;AAAA,QACjE,KAAA,EAAO,GAAA;AAAA,QACP,OAAA,EAAAD,QAAAA;AAAA,QACA,aAAA,EAAe;AAAA,OAChB,CAAA;AAED,MAAA,IAAIE,QAAAA,GAAUD,OAAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACvC,GAAG,IAAA,CAAK,eAAA,CAAgB,EAAE,UAAA,EAAY,CAAA,CAAE,SAAS,OAAO,CAAA;AAAA,QACxD,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAU,gBAAA,IAAoB;AAAA,OAC1C,CAAE,CAAA;AAEF,MAAAC,QAAAA,GAAUA,QAAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,SAAA,mBAAY,IAAI,IAAA,EAAM,CAAA;AAExE,MAAA,IAAI,MAAM,OAAA,EAAS;AACjB,QAAAA,QAAAA,GAAUA,SAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,KAAY,MAAM,OAAO,CAAA;AAAA,MAC7D;AAEA,MAAA,IAAI,aAAa,QAAA,EAAU;AACzB,QAAAA,QAAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,UAAA,IAAe,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,UAAA,CAAW,CAAA;AAAA,MAC9E;AAEA,MAAA,OAAOA,QAAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAAA,IAC/B;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AACvC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,UAAA,EAAW,CAAE,MAAM,YAAA,CAAa;AAAA,MACxD,KAAA,EAAO,GAAA;AAAA,MACP;AAAA,KACD,CAAA;AAED,IAAA,IAAI,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACvC,GAAG,IAAA,CAAK,eAAA,CAAgB,EAAE,UAAA,EAAY,CAAA,CAAE,SAAS,OAAO,CAAA;AAAA,MACxD,UAAA,EAAY,EAAE,UAAA,CAAW,SAAA;AAAA,MACzB,WAAA,EAAc,CAAA,CAAE,UAAA,CAAW,UAAA,IAAyB;AAAA,KACtD,CAAE,CAAA;AAEF,IAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,SAAA,mBAAY,IAAI,IAAA,EAAM,CAAA;AAExE,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,KAAY,MAAM,OAAO,CAAA;AAAA,IAC7D;AAEA,IAAA,QAAQ,QAAA;AAAU,MAChB,KAAK,QAAA;AACH,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,KAAK,CAAA,CAAE,UAAU,CAAA,CAAE,OAAA,KAAY,IAAI,IAAA,CAAK,EAAE,UAAU,CAAA,CAAE,SAAS,CAAA;AAC1F,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,WAAA,GAAc,EAAE,WAAW,CAAA;AACpD,QAAA;AAAA,MACF,KAAK,QAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL;AACE,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,WAAA,GAAc,CAAA,CAAE,eAAe,IAAI,IAAA,CAAK,EAAE,UAAU,CAAA,CAAE,SAAQ,GAAI,IAAI,KAAK,CAAA,CAAE,UAAU,CAAA,CAAE,OAAA,EAAS,CAAA;AAC3H,QAAA;AAAA;AAGJ,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAM,MAAM,MAAA,EAA6C;AACvD,IAAA,MAAM,MAAiB,EAAC;AACxB,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,QAAA,EAAU,OAAA,EAAS,MAAA,EAAQ,EAAE,QAAA,EAAU,SAAA,EAAU,EAAG,KAAA,EAAO,MAAA,CAAO,OAAA,EAAS,CAAA;AAAA,IACxF;AACA,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,QAAA,EAAU,OAAA,EAAS,MAAA,EAAQ,EAAE,QAAA,EAAU,YAAA,EAAa,EAAG,KAAA,EAAO,MAAA,CAAO,UAAA,EAAY,CAAA;AAAA,IAC9F;AACA,IAAA,IAAI,MAAA,EAAQ,kBAAkB,MAAA,EAAW;AACvC,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,QAAA,EAAU,kBAAA,EAAoB,MAAA,EAAQ,EAAE,QAAA,EAAU,YAAA,EAAa,EAAG,KAAA,EAAO,MAAA,CAAO,aAAA,EAAe,CAAA;AAAA,IAC5G;AAEA,IAAA,MAAM,WAAA,GAAc,GAAA,CAAI,MAAA,KAAW,CAAA,GAAI,SAAY,GAAA,CAAI,MAAA,KAAW,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,GAAI,EAAE,QAAA,EAAU,KAAA,EAAO,SAAS,GAAA,EAAI;AAC/G,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,UAAA,EAAW,CAAE,MAAM,YAAA,CAAa;AAAA,MACxD,KAAA,EAAO,GAAA;AAAA,MACP,OAAA,EAAS;AAAA,KACV,CAAA;AACD,IAAA,OAAO,OAAO,OAAA,CAAQ,MAAA;AAAA,EACxB;AAAA,EAEA,MAAM,KAAA,GAAuB;AAAA,EAE7B;AAAA,EAEQ,aAAa,KAAA,EAAqC;AACxD,IAAA,MAAM,MAAiB,EAAC;AAExB,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,QAAA,EAAU,OAAA,EAAS,MAAA,EAAQ,EAAE,QAAA,EAAU,SAAA,EAAU,EAAG,KAAA,EAAO,KAAA,CAAM,OAAA,EAAS,CAAA;AAAA,IACvF;AACA,IAAA,IAAI,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,WAAA,CAAY,SAAS,CAAA,EAAG;AACrD,MAAA,IAAI,KAAA,CAAM,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AAClC,QAAA,GAAA,CAAI,IAAA,CAAK,EAAE,QAAA,EAAU,OAAA,EAAS,QAAQ,EAAE,QAAA,EAAU,YAAA,EAAa,EAAG,KAAA,EAAO,KAAA,CAAM,WAAA,CAAY,CAAC,GAAG,CAAA;AAAA,MACjG,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,IAAA,CAAK;AAAA,UACP,QAAA,EAAU,IAAA;AAAA,UACV,SAAS,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,CAAC,OAAO,EAAE,QAAA,EAAU,OAAA,EAAS,MAAA,EAAQ,EAAE,QAAA,EAAU,YAAA,EAAa,EAAG,KAAA,EAAO,GAAE,CAAE;AAAA,SAC5G,CAAA;AAAA,MACH;AAAA,IACF;AACA,IAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,EAAG;AACvC,MAAA,IAAI,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC3B,QAAA,GAAA,CAAI,IAAA,CAAK,EAAE,QAAA,EAAU,aAAA,EAAe,MAAA,EAAQ,EAAE,QAAA,EAAU,MAAA,EAAO,EAAG,MAAA,EAAQ,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,MACxF,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,IAAA,CAAK;AAAA,UACP,QAAA,EAAU,IAAA;AAAA,UACV,SAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,MAAO,EAAE,QAAA,EAAU,aAAA,EAAe,MAAA,EAAQ,EAAE,UAAU,MAAA,EAAO,EAAG,QAAQ,CAAC,CAAC,GAAE,CAAE;AAAA,SACxG,CAAA;AAAA,MACH;AAAA,IACF;AACA,IAAA,IAAI,MAAM,KAAA,EAAO;AACf,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,QAAA,EAAU,MAAA,EAAQ,QAAQ,EAAE,QAAA,EAAU,SAAA,EAAU,EAAG,KAAA,EAAO,CAAA,CAAA,EAAI,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,IAC3F;AAEA,IAAA,OAAO,GAAA,CAAI,MAAA,KAAW,CAAA,GAAI,MAAA,GAAY,IAAI,MAAA,KAAW,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,GAAI,EAAE,QAAA,EAAU,KAAA,EAAO,SAAS,GAAA,EAAI;AAAA,EACpG;AAAA,EAEQ,cAAc,MAAA,EAAyC;AAC7D,IAAA,OAAO;AAAA,MACL,aAAa,MAAA,CAAO,EAAA;AAAA,MACpB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,kBAAkB,MAAA,CAAO,gBAAA;AAAA,MACzB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAU,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,QAAA,IAAY,EAAE,CAAA;AAAA,MAC9C,QAAA,EAAU,OAAO,QAAA,IAAY,IAAA;AAAA,MAC7B,SAAA,EAAW,MAAA,CAAO,SAAA,EAAW,WAAA,EAAY,IAAK,IAAA;AAAA,MAC9C,SAAA,EAAW,MAAA,CAAO,SAAA,CAAU,WAAA;AAAY,KAC1C;AAAA,EACF;AAAA,EAEQ,eAAA,CAAgB,OAAgC,OAAA,EAA4B;AAClF,IAAA,OAAO;AAAA,MACL,EAAA,EAAK,MAAM,WAAA,IAA0B,EAAA;AAAA,MACrC,OAAA,EAAU,MAAM,OAAA,IAAsB,EAAA;AAAA,MACtC,UAAA,EAAa,MAAM,UAAA,IAA6B,aAAA;AAAA,MAChD,OAAA,EAAU,MAAM,OAAA,IAAsB,EAAA;AAAA,MACtC,UAAA,EAAa,MAAM,UAAA,IAAyB,GAAA;AAAA,MAC5C,gBAAA,EAAmB,MAAM,gBAAA,IAA+B,CAAA;AAAA,MACxD,IAAA,EAAM,MAAM,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,GAAK,KAAA,CAAM,OAAoB,EAAC;AAAA,MAC9D,SAAA,EAAW,OAAA;AAAA,MACX,QAAA,EAAW,MAAM,QAAA,IAAuB,MAAA;AAAA,MACxC,QAAA,EAAU,OAAO,KAAA,CAAM,QAAA,KAAa,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,QAAkB,CAAA,GAAK,KAAA,CAAM,QAAA,IAAY,EAAC;AAAA,MAC1G,WAAW,KAAA,CAAM,SAAA,GAAY,IAAI,IAAA,CAAK,KAAA,CAAM,SAAmB,CAAA,GAAI,MAAA;AAAA,MACnE,SAAA,EAAW,IAAI,IAAA,CAAM,KAAA,CAAM,8BAAwB,IAAI,IAAA,EAAK,EAAE,WAAA,EAAa;AAAA,KAC7E;AAAA,EACF;AACF;;;ACpPO,IAAM,wBAAN,MAAuD;AAAA,EACpD,UAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EAER,YAAY,MAAA,EAA8B;AACxC,IAAA,IAAI,CAAC,OAAO,UAAA,EAAY;AACtB,MAAA,MAAM,YAAY,8DAA8D,CAAA;AAAA,IAClF;AACA,IAAA,IAAA,CAAK,aAAa,MAAA,CAAO,UAAA;AACzB,IAAA,IAAA,CAAK,SAAA,GAAY,OAAO,SAAA,IAAa,UAAA;AACrC,IAAA,IAAA,CAAK,cAAc,IAAI,KAAA,CAAM,IAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,UAAA,EAAW;AAChD,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA,EAAG;AACpC,MAAA,IAAA,CAAK,KAAA,GAAQ,MAAM,IAAA,CAAK,UAAA,CAAW,YAAY,IAAA,CAAK,SAAA,EAAW,EAAE,CAAA;AAAA,IACnE,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,QAAQ,MAAM,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,KAAK,SAAS,CAAA;AAAA,IAC7D;AAAA,EACF;AAAA,EAEA,UAAA,GAAqB;AACnB,IAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,UAAA,EAAW,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,MAAM,KAAA,EAA0C;AACpD,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,EAAA,IAAM,IAAA,CAAK,UAAA,EAAW;AAEvC,IAAA,MAAM,GAAA,GAAM;AAAA,MACV,EAAA;AAAA,MACA,MAAA,EAAQ,KAAA,CAAM,SAAA,IAAa,IAAA,CAAK,WAAA;AAAA,MAChC,UAAU,KAAA,CAAM,OAAA;AAAA,MAChB,WAAA,EAAa,MAAM,UAAA,IAAc,aAAA;AAAA,MACjC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAY,MAAM,UAAA,IAAc,GAAA;AAAA,MAChC,iBAAA,EAAmB,MAAM,gBAAA,IAAoB,CAAA;AAAA,MAC7C,MAAM,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAA,IAAQ,EAAE,CAAA;AAAA,MACrC,SAAA,EAAW,MAAM,QAAA,IAAY,EAAA;AAAA,MAC7B,UAAU,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,QAAA,IAAY,EAAE,CAAA;AAAA,MAC7C,UAAA,EAAY,KAAA,CAAM,SAAA,EAAW,WAAA,EAAY,IAAK,EAAA;AAAA,MAC9C,UAAA,EAAY,IAAI,WAAA;AAAY,KAC9B;AAEA,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,GAAG,CAAC,CAAA;AAE1B,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAa,MAAM,UAAA,IAAc,aAAA;AAAA,MACjC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAY,MAAM,UAAA,IAAc,GAAA;AAAA,MAChC,gBAAA,EAAkB,MAAM,gBAAA,IAAoB,CAAA;AAAA,MAC5C,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAA,MACrB,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY,EAAC;AAAA,MAC7B,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,SAAA,EAAW,MAAM,SAAA,IAAa;AAAA,KAChC;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,MAAA,EAA+C;AAC9D,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,EAAA,EAAoC;AAC5C,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,MAAM,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA,CAAM,SAAS,EAAE,CAAA,CAAA,CAAG,EAAE,SAAA,CAAU,IAAI,EAAE,OAAA,EAAQ;AACjH,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEjC,IAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,IAAA,IAAI,IAAI,UAAA,EAAY;AAClB,MAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AACzC,MAAA,IAAI,SAAA,oBAAa,IAAI,IAAA,EAAK,EAAG;AAC3B,QAAA,MAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAA,MAAA,EAAS,EAAE,CAAA,CAAA,CAAG,CAAA;AACtC,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,IAAA,CAAK,aAAa,GAAG,CAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAClC,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,QAAA,CAAS,UAAU,EAAE,CAAA;AAC1C,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAA,MAAA,EAAS,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,WAAW,GAAA,EAAgC;AAC/C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAM,SAAA,EAAU;AAC1C,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,CAAI,CAAC,EAAA,KAAO,IAAI,EAAE,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACrD,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAA,CAAG,CAAA;AAC7C,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,SAAA,EAAU;AACzC,IAAA,OAAO,MAAA,GAAS,KAAA;AAAA,EAClB;AAAA,EAEA,MAAM,QAAA,CAAS,KAAA,EAA4B,SAAA,EAAyC;AAClF,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,YAAA,EAAe,KAAA,CAAM,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAA,GAAS,IAAI,UAAA,CAAW,IAAA,CAAK,OAAO,CAAA,GAAI,EAAA;AAEjE,IAAA,MAAM,UAAA,GAAA,CAAc,MAAM,QAAA,KAAa,UAAA,IAAc,MAAM,QAAA,KAAa,QAAA,KAAa,SAAA,IAAa,SAAA,CAAU,MAAA,GAAS,CAAA;AACrH,IAAA,MAAM,SAAA,GAAY,UAAA,GAAa,SAAA,GAAa,IAAA,CAAK,WAAA;AACjD,IAAA,MAAM,SAAA,GAAY,UAAA,GAAc,KAAA,CAAM,KAAA,IAAS,EAAA,GAAM,GAAA;AAErD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,CACxB,MAAA,CAAO,SAAS,CAAA,CAChB,KAAA,CAAM,SAAS,CAAA,CACf,KAAA,CAAM,KAAK,EACX,OAAA,EAAQ;AAEX,IAAA,IAAI,IAAA,GAAO,OAAA;AAEX,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,UAAA,IAAc,IAAI,IAAA,CAAK,CAAA,CAAE,UAAU,CAAA,GAAI,GAAG,CAAA;AAEvE,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,IAAA,GAAO,KAAK,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,MAAM,OAAO,CAAA;AAAA,IACxD;AACA,IAAA,IAAI,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,WAAA,CAAY,SAAS,CAAA,EAAG;AACrD,MAAA,IAAA,GAAO,IAAA,CAAK,OAAO,CAAC,CAAA,KAAM,MAAM,WAAA,CAAa,QAAA,CAAS,CAAA,CAAE,WAAyB,CAAC,CAAA;AAAA,IACpF;AACA,IAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,EAAG;AACvC,MAAA,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM;AACxB,QAAA,MAAM,IAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA;AACxC,QAAA,OAAO,IAAA,CAAK,KAAK,CAAC,CAAA,KAAM,MAAM,IAAA,CAAM,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,MACjD,CAAC,CAAA;AAAA,IACH;AACA,IAAA,IAAI,MAAM,KAAA,EAAO;AACf,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,WAAA,EAAY;AAClC,MAAA,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IAC/D;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,EAAA;AAE7B,IAAA,IAAI,UAAA,IAAc,KAAA,CAAM,QAAA,KAAa,QAAA,EAAU;AAC7C,MAAA,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAClB,QAAA,MAAM,MAAA,GAAA,CAAU,CAAA,CAAE,SAAA,IAAa,CAAA,IAAK,CAAA,CAAE,UAAA;AACtC,QAAA,MAAM,MAAA,GAAA,CAAU,CAAA,CAAE,SAAA,IAAa,CAAA,IAAK,CAAA,CAAE,UAAA;AACtC,QAAA,OAAO,MAAA,GAAS,MAAA;AAAA,MAClB,CAAC,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,KAAA,CAAM,QAAA,KAAa,QAAA,EAAU;AACtC,MAAA,IAAA,CAAK,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,KAAK,CAAA,CAAE,UAAU,CAAA,CAAE,OAAA,KAAY,IAAI,IAAA,CAAK,EAAE,UAAU,CAAA,CAAE,SAAS,CAAA;AAAA,IACzF,CAAA,MAAA,IAAW,KAAA,CAAM,QAAA,KAAa,WAAA,EAAa;AACzC,MAAA,IAAA,CAAK,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,UAAA,GAAa,EAAE,UAAU,CAAA;AAAA,IACjD,CAAA,MAAA,IAAW,CAAC,UAAA,EAAY;AACtB,MAAA,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,UAAA,GAAa,CAAA,CAAE,cAAc,IAAI,IAAA,CAAK,EAAE,UAAU,CAAA,CAAE,SAAQ,GAAI,IAAI,KAAK,CAAA,CAAE,UAAU,CAAA,CAAE,OAAA,EAAS,CAAA;AAAA,IACxH;AAEA,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,EAC7D;AAAA,EAEA,MAAM,MAAM,MAAA,EAA6C;AACvD,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,YAAA,EAAe,MAAA,CAAO,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAClD;AAEA,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAA,GAAS,IAAI,UAAA,CAAW,IAAA,CAAK,OAAO,CAAA,GAAI,EAAA;AAEjE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,CACxB,OAAO,IAAA,CAAK,WAAW,CAAA,CACvB,KAAA,CAAM,GAAK,CAAA,CACX,KAAA,CAAM,KAAK,EACX,OAAA,EAAQ;AAEX,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,IAAI,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,UAAA,IAAc,IAAI,IAAA,CAAK,CAAA,CAAE,UAAU,IAAI,GAAG,CAAA;AAE9E,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,IAAA,GAAO,KAAK,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,OAAO,OAAO,CAAA;AAAA,IACzD;AACA,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,IAAA,GAAO,KAAK,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,WAAA,KAAgB,OAAO,UAAU,CAAA;AAAA,IAC/D;AACA,IAAA,IAAI,MAAA,EAAQ,kBAAkB,MAAA,EAAW;AACvC,MAAA,IAAA,GAAO,KAAK,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,UAAA,IAAc,OAAO,aAAc,CAAA;AAAA,IACjE;AAEA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,MAAM,KAAA,GAAuB;AAAA,EAC7B;AAAA,EAEQ,aAAa,GAAA,EAA+B;AAClD,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,SAAS,GAAA,CAAI,QAAA;AAAA,MACb,YAAY,GAAA,CAAI,WAAA;AAAA,MAChB,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,kBAAkB,GAAA,CAAI,iBAAA;AAAA,MACtB,IAAA,EAAM,IAAI,IAAA,GAAO,IAAA,CAAK,MAAM,GAAA,CAAI,IAAI,IAAI,EAAC;AAAA,MACzC,SAAA,EAAW,IAAI,MAAA,IAAU,GAAA,CAAI,OAAO,MAAA,GAAS,CAAA,GAAI,IAAI,MAAA,GAAS,MAAA;AAAA,MAC9D,QAAA,EAAU,IAAI,SAAA,IAAa,MAAA;AAAA,MAC3B,QAAA,EAAU,IAAI,QAAA,GAAW,IAAA,CAAK,MAAM,GAAA,CAAI,QAAQ,IAAI,EAAC;AAAA,MACrD,WAAW,GAAA,CAAI,UAAA,GAAa,IAAI,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,GAAI,MAAA;AAAA,MACvD,SAAA,EAAW,IAAI,IAAA,CAAK,GAAA,CAAI,UAAU;AAAA,KACpC;AAAA,EACF;AACF;;;ACtNO,IAAM,wBAAN,MAAuD;AAAA,EACnD,YAAA,GAAoC,EAAE,YAAA,EAAc,IAAA,EAAK;AAAA,EAC1D,UAAA;AAAA,EACA,gBAAA;AAAA,EAER,YAAY,MAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,aAAa,MAAA,CAAO,UAAA;AACzB,IAAA,IAAA,CAAK,gBAAA,GAAmB,OAAO,gBAAA,IAAoB,IAAA;AAAA,EACrD;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,IAAA,CAAK,UAAA;AACjB,MAAA,IAAI,IAAI,iBAAA,EAAmB;AACzB,QAAA,MAAM,IAAI,iBAAA,CAAkB;AAAA,UAC1B,IAAA,EAAM,iBAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,QAAA,EAAU;AAAA,cACR,OAAA,EAAS,KAAA;AAAA,cACT,MAAA,EAAQ;AAAA,gBACN,SAAA,EAAW;AAAA,kBACT,IAAA,EAAM,WAAA;AAAA,kBACN,YAAY,IAAA,CAAK,gBAAA;AAAA,kBACjB,UAAA,EAAY;AAAA;AACd;AACF;AACF;AACF,SACD,CAAA;AAAA,MACH;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX;AAAA,EAEA,UAAA,GAAqB;AACnB,IAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,UAAA,EAAW,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,MAAM,KAAA,EAA0C;AACpD,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,MAAA,GAAiB;AAAA,MACrB,EAAA,EAAI,KAAA,CAAM,EAAA,IAAM,IAAA,CAAK,UAAA,EAAW;AAAA,MAChC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAa,MAAM,UAAA,IAAc,aAAA;AAAA,MACjC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAY,MAAM,UAAA,IAAc,GAAA;AAAA,MAChC,gBAAA,EAAkB,MAAM,gBAAA,IAAoB,CAAA;AAAA,MAC5C,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAA,MACrB,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY,EAAC;AAAA,MAC7B,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,SAAA,EAAW,MAAM,SAAA,IAAa;AAAA,KAChC;AACA,IAAA,IAAI,MAAM,EAAA,EAAI;AAEZ,MAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAS,UAAA,EAAY,SAAA,EAAW,GAAG,MAAA,EAAO,GAAI,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAC5E,MAAA,MAAM,KAAK,UAAA,CAAW,SAAA;AAAA,QACpB,EAAE,GAAA,EAAI;AAAA,QACN,EAAE,MAAM,MAAA,EAAQ,YAAA,EAAc,EAAE,OAAA,EAAS,UAAA,EAAY,WAAU,EAAE;AAAA,QACjE,EAAE,QAAQ,IAAA;AAAK,OACjB;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,KAAK,UAAA,CAAW,SAAA,CAAU,IAAA,CAAK,KAAA,CAAM,MAAM,CAAuC,CAAA;AAAA,IAC1F;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,MAAA,EAA+C;AAC9D,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAI,EAAA,EAAoC;AAC5C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,UAAA,CAAW,QAAQ,EAAE,GAAA,EAAK,IAAI,CAAA;AACrD,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,GAA0B,CAAA;AACvD,IAAA,IAAI,OAAO,SAAA,IAAa,MAAA,CAAO,6BAAa,IAAI,IAAA,IAAQ,OAAO,IAAA;AAC/D,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,UAAU,EAAE,GAAA,EAAK,IAAI,CAAA;AAC1D,IAAA,IAAI,OAAO,YAAA,KAAiB,CAAA,EAAG,MAAM,QAAA,CAAS,UAAU,EAAE,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAM,WAAW,GAAA,EAAgC;AAC/C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,UAAA,CAAW,EAAE,GAAA,EAAK,EAAE,GAAA,EAAK,GAAA,EAAI,EAAG,CAAA;AACrE,IAAA,OAAO,MAAA,CAAO,YAAA;AAAA,EAChB;AAAA,EAEA,MAAM,QAAA,CAAS,KAAA,EAA4B,SAAA,EAAyC;AAClF,IAAA,IAAI,KAAA,CAAM,QAAA,KAAa,UAAA,IAAc,SAAA,EAAW;AAC9C,MAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,SAAS,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAAA,EACpC;AAAA,EAEA,MAAM,MAAM,MAAA,EAA6C;AACvD,IAAA,MAAM,cAAuC,EAAC;AAC9C,IAAA,IAAI,MAAA,EAAQ,OAAA,EAAS,WAAA,CAAY,OAAA,GAAU,MAAA,CAAO,OAAA;AAClD,IAAA,IAAI,MAAA,EAAQ,UAAA,EAAY,WAAA,CAAY,UAAA,GAAa,MAAA,CAAO,UAAA;AACxD,IAAA,IAAI,MAAA,EAAQ,kBAAkB,MAAA,EAAW;AACvC,MAAA,WAAA,CAAY,UAAA,GAAa,EAAE,IAAA,EAAM,MAAA,CAAO,aAAA,EAAc;AAAA,IACxD;AACA,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,cAAA,CAAe,WAAW,CAAA;AAAA,EACnD;AAAA,EAEA,MAAM,KAAA,GAAuB;AAAA,EAAC;AAAA,EAE9B,MAAc,iBAAiB,KAAA,EAA+C;AAC5E,IAAA,MAAM,SAAkC,EAAC;AACzC,IAAA,IAAI,KAAA,CAAM,OAAA,EAAS,MAAA,CAAO,OAAA,GAAU,KAAA,CAAM,OAAA;AAE1C,IAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,EAAG;AACvC,MAAA,MAAA,CAAO,IAAA,GAAO,EAAE,GAAA,EAAK,KAAA,CAAM,IAAA,EAAK;AAAA,IAClC;AACA,IAAA,IAAI,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,WAAA,CAAY,SAAS,CAAA,EAAG;AACrD,MAAA,MAAA,CAAO,UAAA,GAAa,EAAE,GAAA,EAAK,KAAA,CAAM,WAAA,EAAY;AAAA,IAC/C;AAEA,IAAA,IAAI,OAAA;AACJ,IAAA,QAAQ,MAAM,QAAA;AAAU,MACtB,KAAK,QAAA;AACH,QAAA,OAAA,GAAU,EAAE,WAAW,EAAA,EAAG;AAC1B,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,OAAA,GAAU,EAAE,YAAY,EAAA,EAAG;AAC3B,QAAA;AAAA,MACF;AACE,QAAA,OAAA,GAAU,EAAE,UAAA,EAAY,EAAA,EAAI,SAAA,EAAW,EAAA,EAAG;AAC1C,QAAA;AAAA;AAGJ,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,UAAA,CACrB,IAAA,CAAK,MAAM,CAAA,CACX,IAAA,CAAK,OAAO,CAAA,CACZ,KAAA,CAAM,GAAK,EACX,OAAA,EAAQ;AAEX,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,IAAI,UAAU,IAAA,CACX,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,SAAS,GAA0B,CAAC,CAAA,CACtD,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,SAAA,IAAa,CAAA,CAAE,YAAY,GAAG,CAAA;AAElD,IAAA,IAAI,MAAM,KAAA,EAAO;AACf,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,WAAA,EAAY;AAClC,MAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IACrE;AAEA,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,SAAS,EAAE,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAc,gBAAA,CAAiB,KAAA,EAA4B,SAAA,EAAwC;AACjG,IAAA,IAAI;AACF,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,IAAI,KAAA,CAAM,OAAA,EAAS,MAAA,CAAO,OAAA,GAAU,KAAA,CAAM,OAAA;AAE1C,MAAA,MAAM,QAAA,GAAsC;AAAA,QAC1C;AAAA,UACE,aAAA,EAAe;AAAA,YACb,KAAA,EAAO,iBAAA;AAAA,YACP,IAAA,EAAM,WAAA;AAAA,YACN,WAAA,EAAa,SAAA;AAAA,YACb,aAAA,EAAe,GAAA;AAAA,YACf,KAAA,EAAO,MAAM,KAAA,IAAS,EAAA;AAAA,YACtB;AAAA;AACF;AACF,OACF;AAEA,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,WAAW,SAAA,CAAU,QAAQ,EAAE,OAAA,EAAQ;AAC/D,MAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,MAAA,OAAO,KACJ,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAA,CAAK,SAAS,GAA0B,CAAC,CAAA,CACtD,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,SAAA,IAAa,CAAA,CAAE,YAAY,GAAG,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAAA,IACpC;AAAA,EACF;AAAA,EAEQ,SAAS,GAAA,EAAuB;AACtC,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,GAAA;AAAA,MACR,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,kBAAkB,GAAA,CAAI,gBAAA;AAAA,MACtB,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,WAAW,GAAA,CAAI;AAAA,KACjB;AAAA,EACF;AAAA,EAEQ,MAAM,MAAA,EAA0B;AACtC,IAAA,OAAO;AAAA,MACL,KAAK,MAAA,CAAO,EAAA;AAAA,MACZ,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,kBAAkB,MAAA,CAAO,gBAAA;AAAA,MACzB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,WAAW,MAAA,CAAO;AAAA,KACpB;AAAA,EACF;AACF;;;AClNA,IAAM,gBAAA,GAAmB,4BAAA;AAQzB,IAAM,UAAA,GAA0B;AAAA,EAC9B;AAAA,IACE,OAAA,EAAS,CAAA;AAAA,IACT,GAAA,EAAK,CAAC,CAAA,KAAM;AAAA,iCAAA,EACmB,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCAAA,EAeG,CAAC,aAAa,CAAC,CAAA;AAAA,qCAAA,EACf,CAAC,eAAe,CAAC,CAAA;AAAA,qCAAA,EACjB,CAAC,kBAAkB,CAAC,CAAA;AAAA,IAAA;AAAA;AAG3D,CAAA;AAEqC,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,CAAE;AAEvE,SAAS,gBAAA,CAAiB,GAAa,CAAA,EAAqB;AAC1D,EAAA,IAAI,EAAE,MAAA,KAAW,CAAA,IAAK,CAAA,CAAE,MAAA,KAAW,GAAG,OAAO,CAAA;AAC7C,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,EAAE,MAAM,CAAA;AACxC,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,GAAA,IAAO,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AACjB,IAAA,IAAA,IAAQ,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAClB,IAAA,IAAA,IAAQ,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAAA,EACpB;AACA,EAAA,MAAM,MAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,KAAK,IAAI,CAAA;AAC5C,EAAA,OAAO,GAAA,KAAQ,CAAA,GAAI,CAAA,GAAI,GAAA,GAAM,GAAA;AAC/B;AAEO,IAAM,uBAAN,MAAsD;AAAA,EAClD,YAAA,GAAoC,EAAE,YAAA,EAAc,IAAA,EAAK;AAAA,EAC1D,EAAA;AAAA,EACA,KAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EAER,YAAY,MAAA,EAA6B;AACvC,IAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,MAAA,MAAM,YAAY,kEAAkE,CAAA;AAAA,IACtF;AACA,IAAA,IAAA,CAAK,KAAK,MAAA,CAAO,EAAA;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAO,SAAA,IAAa,mBAAA;AACjC,IAAA,IAAI,CAAC,iBAAA,CAAkB,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,EAAG;AACvC,MAAA,MAAM,WAAA,CAAY,CAAA,qBAAA,EAAwB,IAAA,CAAK,KAAK,CAAA,oDAAA,CAAsD,CAAA;AAAA,IAC5G;AACA,IAAA,IAAA,CAAK,gBAAA,GAAmB,OAAO,gBAAA,IAAoB,IAAA;AACnD,IAAA,IAAA,CAAK,aAAA,GAAgB,OAAO,aAAA,IAAiB,GAAA;AAC7C,IAAA,IAAI,CAAC,OAAO,SAAA,CAAU,IAAA,CAAK,aAAa,CAAA,IAAK,IAAA,CAAK,gBAAgB,CAAA,EAAG;AACnE,MAAA,MAAM,WAAA,CAAY,CAAA,uBAAA,EAA0B,MAAA,CAAO,aAAa,CAAA,6BAAA,CAA+B,CAAA;AAAA,IACjG;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,IAAA;AAAA,EACnC;AAAA,EAEA,MAAM,UAAA,GAA4B;AAEhC,IAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,CAAA,sBAAA,EAAyB,IAAA,CAAK,aAAa,CAAA,CAAE,CAAA;AAC1D,IAAA,IAAI,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,EAAA,CAAG,KAAK,2BAA2B,CAAA;AAC1D,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA;AAAA,EAGA,aAAA,GAAwB;AACtB,IAAA,MAAM,GAAA,GAAM,KAAK,EAAA,CAAG,OAAA;AAAA,MAClB,uBAAuB,gBAAgB,CAAA,qBAAA;AAAA,KACzC,CAAE,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AAChB,IAAA,OAAO,KAAK,OAAA,IAAW,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA,EAIQ,OAAA,GAAgB;AACtB,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,IAAA,CAAK,YAAY,MAAM;AACrB,QAAA,IAAA,CAAK,EAAA,CAAG,IAAA;AAAA,UACN,8BAA8B,gBAAgB,CAAA,wDAAA;AAAA,SAChD;AAEA,QAAA,IAAI,IAAA,CAAK,aAAA,EAAc,IAAK,SAAA,CAAU,OAAA,EAAS;AAC/C,QAAA,IAAA,CAAK,GAAG,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,KAAK,CAAC,CAAA;AACtC,QAAA,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,UACN,eAAe,gBAAgB,CAAA;AAAA,2EAAA;AAAA,SAEjC,CAAE,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,UAAU,OAAO,CAAA;AAAA,MACrC,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA,EAIQ,YAAe,EAAA,EAAgB;AACrC,IAAA,IAAI,IAAA,CAAK,EAAA,CAAG,aAAA,EAAe,OAAO,EAAA,EAAG;AACrC,IAAA,IAAA,CAAK,EAAA,CAAG,KAAK,iBAAiB,CAAA;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,EAAA,EAAG;AAClB,MAAA,IAAA,CAAK,EAAA,CAAG,KAAK,QAAQ,CAAA;AACrB,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,IAAA,CAAK,EAAA,CAAG,aAAA,KAAkB,KAAA,EAAO;AACnC,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,EAAA,CAAG,KAAK,UAAU,CAAA;AAAA,QACzB,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,UAAA,GAAqB;AACnB,IAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,UAAA,EAAW,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,MAAM,KAAA,EAA0C;AACpD,IAAA,OAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EAC1B;AAAA,EAEQ,OAAO,KAAA,EAAiC;AAC9C,IAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,EAAA,IAAM,IAAA,CAAK,UAAA,EAAW;AAEvC,IAAA,IAAA,CAAK,EAAA,CAAG,OAAA;AAAA,MACN,CAAA,YAAA,EAAe,KAAK,KAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yCAAA;AAAA,KAY3B,CAAE,GAAA;AAAA,MACA,EAAA;AAAA,MACA,KAAA,CAAM,OAAA;AAAA,MACN,MAAM,UAAA,IAAc,aAAA;AAAA,MACpB,KAAA,CAAM,OAAA;AAAA,MACN,MAAM,UAAA,IAAc,GAAA;AAAA,MACpB,MAAM,gBAAA,IAAoB,CAAA;AAAA,MAC1B,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAA,IAAQ,EAAE,CAAA;AAAA,MAC/B,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,SAAS,CAAA,GAAI,IAAA;AAAA,MACpD,MAAM,QAAA,IAAY,IAAA;AAAA,MAClB,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,QAAA,IAAY,EAAE,CAAA;AAAA,MACnC,KAAA,CAAM,SAAA,EAAW,WAAA,EAAY,IAAK,IAAA;AAAA,MAClC,GAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAa,MAAM,UAAA,IAAc,aAAA;AAAA,MACjC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,UAAA,EAAY,MAAM,UAAA,IAAc,GAAA;AAAA,MAChC,gBAAA,EAAkB,MAAM,gBAAA,IAAoB,CAAA;AAAA,MAC5C,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAA,MACrB,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,QAAA,EAAU,KAAA,CAAM,QAAA,IAAY,EAAC;AAAA,MAC7B,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,SAAA,EAAW,KAAA,CAAM,SAAA,IAAa,IAAI,KAAK,GAAG;AAAA,KAC5C;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,MAAA,EAA+C;AAC9D,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAM,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAAA,EACzE;AAAA,EAEA,MAAM,IAAI,EAAA,EAAoC;AAC5C,IAAA,MAAM,GAAA,GAAM,KAAK,EAAA,CAAG,OAAA;AAAA,MAClB,CAAA,cAAA,EAAiB,KAAK,KAAK,CAAA,wDAAA;AAAA,MAC3B,GAAA,CAAI,EAAA,EAAA,qBAAQ,IAAA,EAAK,EAAE,aAAa,CAAA;AAElC,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,OAAO,IAAA,CAAK,aAAa,GAAG,CAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,CAAA,eAAA,EAAkB,KAAK,KAAK,CAAA,aAAA,CAAe,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA;AAC/E,IAAA,IAAI,CAAC,GAAA,EAAK,MAAM,QAAA,CAAS,UAAU,EAAE,CAAA;AACrC,IAAA,IAAA,CAAK,EAAA,CAAG,QAAQ,CAAA,YAAA,EAAe,IAAA,CAAK,KAAK,CAAA,aAAA,CAAe,CAAA,CAAE,IAAI,EAAE,CAAA;AAAA,EAClE;AAAA,EAEA,MAAM,WAAW,GAAA,EAAgC;AAC/C,IAAA,MAAM,eAAe,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AACjD,IAAA,MAAM,MAAA,GAAS,KAAK,EAAA,CAAG,OAAA;AAAA,MACrB,CAAA,YAAA,EAAe,IAAA,CAAK,KAAK,CAAA,cAAA,EAAiB,YAAY,CAAA,CAAA;AAAA,KACxD,CAAE,GAAA,CAAI,GAAG,GAAG,CAAA;AACZ,IAAA,OAAO,MAAA,CAAO,OAAA;AAAA,EAChB;AAAA,EAEA,MAAM,MAAM,EAAA,EAA2B;AACrC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,CAAA,eAAA,EAAkB,KAAK,KAAK,CAAA,aAAA,CAAe,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA;AAC/E,IAAA,IAAI,CAAC,GAAA,EAAK,MAAM,QAAA,CAAS,UAAU,EAAE,CAAA;AACrC,IAAA,IAAA,CAAK,EAAA,CAAG,OAAA,CAAQ,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,gCAAA,CAAkC,CAAA,CAAE,GAAA,CAAA,iBAAI,IAAI,IAAA,EAAK,EAAE,WAAA,IAAe,EAAE,CAAA;AAAA,EAC1G;AAAA,EAEA,MAAM,QAAA,CAAS,KAAA,EAA4B,SAAA,EAAyC;AAClF,IAAA,MAAM,UAAA,GAAuB,CAAC,wCAAwC,CAAA;AACtE,IAAA,MAAM,SAAoB,CAAA,iBAAC,IAAI,IAAA,EAAK,EAAE,aAAa,CAAA;AAEnD,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,UAAA,CAAW,KAAK,cAAc,CAAA;AAC9B,MAAA,MAAA,CAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,WAAA,CAAY,SAAS,CAAA,EAAG;AACrD,MAAA,MAAM,YAAA,GAAe,MAAM,WAAA,CAAY,GAAA,CAAI,MAAM,GAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AAC/D,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,gBAAA,EAAmB,YAAY,CAAA,CAAA,CAAG,CAAA;AAClD,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,KAAA,CAAM,WAAW,CAAA;AAAA,IAClC;AACA,IAAA,IAAI,MAAM,YAAA,EAAc;AACtB,MAAA,UAAA,CAAW,KAAK,iBAAiB,CAAA;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,WAAA,EAAa,CAAA;AAAA,IAC9C;AACA,IAAA,IAAI,MAAM,aAAA,EAAe;AACvB,MAAA,UAAA,CAAW,KAAK,iBAAiB,CAAA;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,WAAA,EAAa,CAAA;AAAA,IAC/C;AAEA,IAAA,MAAM,WAAA,GAAA,CAAe,MAAM,QAAA,KAAa,UAAA,IAAc,MAAM,QAAA,KAAa,QAAA,KAAa,SAAA,IAAa,SAAA,CAAU,MAAA,GAAS,CAAA;AAEtH,IAAA,IAAI,OAAA;AACJ,IAAA,QAAQ,MAAM,QAAA;AAAU,MACtB,KAAK,QAAA;AACH,QAAA,OAAA,GAAU,iBAAA;AACV,QAAA;AAAA,MACF,KAAK,WAAA;AACH,QAAA,OAAA,GAAU,iBAAA;AACV,QAAA;AAAA,MACF,KAAK,QAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL;AACE,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,OAAA,GAAU,iBAAA;AAAA,QACZ,CAAA,MAAO;AACL,UAAA,OAAA,GAAU,kCAAA;AAAA,QACZ;AACA,QAAA;AAAA;AAGJ,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,EAAA;AAC7B,IAAA,MAAM,GAAA,GAAM,CAAA,cAAA,EAAiB,IAAA,CAAK,KAAK,CAAA,OAAA,EAAU,WAAW,IAAA,CAAK,OAAO,CAAC,CAAA,UAAA,EAAa,OAAO,CAAA,CAAA;AAC7F,IAAA,IAAI,OAAA,GAAU,KAAK,EAAA,CAAG,OAAA,CAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA;AAEhD,IAAA,IAAI,MAAM,KAAA,EAAO;AACf,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,WAAA,EAAY;AAClC,MAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IACrE;AAEA,IAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,EAAG;AACvC,MAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM;AAC9B,QAAA,MAAM,IAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA;AACxC,QAAA,OAAO,IAAA,CAAK,KAAK,CAAC,CAAA,KAAM,MAAM,IAAA,CAAM,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,MACjD,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,eAAe,SAAA,EAAW;AAC5B,MAAA,MAAM,MAAA,GAAS,OAAA,CACZ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,KAAc,IAAI,CAAA,CAClC,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,QAAA,MAAM,GAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,SAAU,CAAA;AAC7C,QAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,SAAA,EAAW,GAAG,CAAA;AAC7C,QAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,KAAA,EAAM;AAAA,MACzB,CAAC,EACA,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAA;AAEnC,MAAA,IAAI,KAAA,CAAM,aAAa,QAAA,EAAU;AAC/B,QAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,GAAA,CAAI,UAAA,IAAe,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,IAAI,UAAA,CAAW,CAAA;AAAA,MACnF;AAEA,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,EAAE,GAAA,EAAI,KAAM,GAAG,CAAA;AACxD,MAAA,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,KAAA,CAAM,KAAK,CAAA;AAChC,MAAA,OAAO,KAAK,GAAA,CAAI,CAAC,QAAQ,IAAA,CAAK,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AACtC,IAAA,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,KAAA,CAAM,KAAK,CAAA;AACnC,IAAA,OAAO,QAAQ,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,EAChD;AAAA,EAEA,MAAM,MAAM,MAAA,EAA6C;AACvD,IAAA,MAAM,UAAA,GAAuB,CAAC,wCAAwC,CAAA;AACtE,IAAA,MAAM,SAAoB,CAAA,iBAAC,IAAI,IAAA,EAAK,EAAE,aAAa,CAAA;AAEnD,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,UAAA,CAAW,KAAK,cAAc,CAAA;AAC9B,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,OAAO,CAAA;AAAA,IAC5B;AACA,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,UAAA,CAAW,KAAK,iBAAiB,CAAA;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,UAAU,CAAA;AAAA,IAC/B;AACA,IAAA,IAAI,MAAA,EAAQ,kBAAkB,MAAA,EAAW;AACvC,MAAA,UAAA,CAAW,KAAK,iBAAiB,CAAA;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,aAAa,CAAA;AAAA,IAClC;AACA,IAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,MAAA,UAAA,CAAW,KAAK,iBAAiB,CAAA;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,WAAA,EAAa,CAAA;AAAA,IAC/C;AACA,IAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,MAAA,UAAA,CAAW,KAAK,iBAAiB,CAAA;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,WAAA,EAAa,CAAA;AAAA,IAChD;AAEA,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,OAAO,CAAA;AACrC,IAAA,MAAM,GAAA,GAAM,KAAK,EAAA,CAAG,OAAA;AAAA,MAClB,CAAA,8BAAA,EAAiC,IAAA,CAAK,KAAK,CAAA,OAAA,EAAU,KAAK,CAAA;AAAA,KAC5D,CAAE,GAAA,CAAI,GAAG,MAAM,CAAA;AAEf,IAAA,OAAO,KAAK,KAAA,IAAS,CAAA;AAAA,EACvB;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AAAA,EAChB;AAAA,EAEQ,SAAA,CAAU,MAAyB,KAAA,EAAkC;AAC3E,IAAA,IAAI,KAAA,KAAU,KAAA,IAAS,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC1C,IAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,IAAA,MAAM,OAAO,IAAA,CAAK,EAAA,CAAG,QAAQ,CAAA,OAAA,EAAU,IAAA,CAAK,KAAK,CAAA,gCAAA,CAAkC,CAAA;AACnF,IAAA,IAAA,CAAK,YAAY,MAAM;AACrB,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAI,EAAE,CAAA;AAAA,IAC9C,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,aAAa,GAAA,EAA8B;AACjD,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,SAAS,GAAA,CAAI,QAAA;AAAA,MACb,YAAY,GAAA,CAAI,WAAA;AAAA,MAChB,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,kBAAkB,GAAA,CAAI,iBAAA;AAAA,MACtB,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAAA,MACzB,WAAW,GAAA,CAAI,SAAA,GAAY,KAAK,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA,GAAI,MAAA;AAAA,MACvD,QAAA,EAAU,IAAI,SAAA,IAAa,MAAA;AAAA,MAC3B,QAAA,EAAU,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AAAA,MACjC,WAAW,GAAA,CAAI,UAAA,GAAa,IAAI,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,GAAI,MAAA;AAAA,MACvD,SAAA,EAAW,IAAI,IAAA,CAAK,GAAA,CAAI,UAAU;AAAA,KACpC;AAAA,EACF;AACF;;;AC5YO,IAAM,mBAAN,MAA8C;AAAA,EAC3C,MAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EAER,YAAY,MAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,2BAAA;AACjC,IAAA,IAAA,CAAK,YAAA,GAAe,OAAO,YAAA,IAAgB,aAAA;AAC3C,IAAA,IAAA,CAAK,kBAAA,GAAqB,OAAO,kBAAA,IAAsB,GAAA;AACvD,IAAA,IAAA,CAAK,gBAAA,GAAmB,OAAO,gBAAA,IAAoB,IAAA;AAAA,EACrD;AAAA,EAEA,MAAM,SAAS,OAAA,EAM8E;AAC3F,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,YAAA;AACpC,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,WAAA,IAAe,IAAA,CAAK,kBAAA;AAChD,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,gBAAA;AAE5C,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,iBAAA,CAAA,EAAqB;AAAA,QAC/D,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAAA,SACtC;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,KAAA;AAAA,UACA,QAAA,EAAU;AAAA,YACR,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,QAAQ,MAAA,EAAO;AAAA,YAC1C,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,QAAQ,IAAA;AAAK,WACxC;AAAA,UACA,WAAA;AAAA,UACA,UAAA,EAAY;AAAA,SACb;AAAA,OACF,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,IAAA,EAAK;AAChC,QAAA,MAAM,IAAI,cAAc,WAAA,EAAa,CAAA,kBAAA,EAAqB,SAAS,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI;AAAA,UAClF,SAAA,EAAW,SAAS,MAAA,IAAU;AAAA,SAC/B,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAKlC,MAAA,OAAO;AAAA,QACL,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,EAAA;AAAA,QAC3C,MAAA,EAAQ;AAAA,UACN,MAAA,EAAQ,IAAA,CAAK,KAAA,EAAO,aAAA,IAAiB,CAAA;AAAA,UACrC,UAAA,EAAY,IAAA,CAAK,KAAA,EAAO,iBAAA,IAAqB,CAAA;AAAA,UAC7C,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,YAAA,IAAgB;AAAA;AACrC,OACF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,GAAA,YAAe,eAAe,MAAM,GAAA;AACxC,MAAA,MAAM,IAAI,aAAA,CAAc,WAAA,EAAa,CAAA,oBAAA,EAAuB,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA,EAAI;AAAA,QAC9G,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,OAAO,eAAe,OAAA,EAM6E;AACjG,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,YAAA;AACpC,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,WAAA,IAAe,IAAA,CAAK,kBAAA;AAChD,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,gBAAA;AAE5C,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,iBAAA,CAAA,EAAqB;AAAA,QACzD,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAAA,SACtC;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,KAAA;AAAA,UACA,QAAA,EAAU;AAAA,YACR,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,QAAQ,MAAA,EAAO;AAAA,YAC1C,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,QAAQ,IAAA;AAAK,WACxC;AAAA,UACA,WAAA;AAAA,UACA,UAAA,EAAY,SAAA;AAAA,UACZ,MAAA,EAAQ,IAAA;AAAA,UACR,cAAA,EAAgB,EAAE,aAAA,EAAe,IAAA;AAAK,SACvC;AAAA,OACF,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,IAAI,aAAA,CAAc,WAAA,EAAa,CAAA,iCAAA,EAAoC,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA,EAAI;AAAA,QAC3H,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,IAAA,EAAK;AAChC,MAAA,MAAM,IAAI,cAAc,WAAA,EAAa,CAAA,wBAAA,EAA2B,SAAS,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI;AAAA,QACxF,SAAA,EAAW,SAAS,MAAA,IAAU;AAAA,OAC/B,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,SAAA,EAAU;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,aAAA,CAAc,aAAa,gCAAgC,CAAA;AAElF,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,IAAI,gBAAA,GAAmB,CAAA;AAEvB,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,EAAM;AACX,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,QAAA,IAAI,IAAA,EAAM;AAEV,QAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,QAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,UAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC/C,UAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA;AAC5B,UAAA,IAAI,SAAS,QAAA,EAAU;AAEvB,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAK9B,YAAA,MAAM,UAAU,MAAA,CAAO,OAAA,GAAU,CAAC,CAAA,EAAG,OAAO,OAAA,IAAW,EAAA;AACvD,YAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,YAAA,IAAI,KAAA,EAAO;AACT,cAAA,YAAA,GAAe,KAAA,CAAM,aAAA;AACrB,cAAA,gBAAA,GAAmB,KAAA,CAAM,iBAAA;AAAA,YAC3B;AAEA,YAAA,IAAI,WAAW,KAAA,EAAO;AACpB,cAAA,MAAM;AAAA,gBACJ,IAAA,EAAM,OAAA;AAAA,gBACN,MAAA,EAAQ,EAAE,MAAA,EAAQ,YAAA,EAAc,YAAY,gBAAA,EAAkB,KAAA,EAAO,eAAe,gBAAA;AAAiB,eACvG;AAAA,YACF;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,MAAA,CAAO,WAAA,EAAY;AAAA,IACrB;AAAA,EACF;AACF;;;AC5JO,IAAM,sBAAN,MAAiD;AAAA,EAC9C,MAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,GAAA;AAAA,EAER,YAAY,MAAA,EAA4B;AACtC,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,2BAAA;AACjC,IAAA,IAAA,CAAK,YAAA,GAAe,OAAO,YAAA,IAAgB,4BAAA;AAC3C,IAAA,IAAA,CAAK,gBAAA,GAAmB,OAAO,gBAAA,IAAoB,IAAA;AAAA,EACrD;AAAA,EAEA,MAAM,SAAS,OAAA,EAM8E;AAC3F,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,YAAA;AACpC,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,gBAAA;AAE5C,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AAEb,QAAA,MAAM,EAAE,OAAA,EAAS,SAAA,EAAU,GAAI,MAAM,OAAO,mBAAmB,CAAA;AAC/D,QAAA,IAAA,CAAK,GAAA,GAAM,IAAI,SAAA,CAAU,EAAE,MAAA,EAAQ,KAAK,MAAA,EAAQ,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,MACzE;AAEA,MAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,MAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO;AAAA,QACzC,KAAA;AAAA,QACA,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,QAAA,EAAU,CAAC,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAS,OAAA,CAAQ,MAAM,CAAA;AAAA,QAClD,UAAA,EAAY,SAAA;AAAA,QACZ,GAAI,QAAQ,WAAA,KAAgB,KAAA,CAAA,GAAY,EAAE,WAAA,EAAa,OAAA,CAAQ,WAAA,EAAY,GAAI;AAAC,OACjF,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,MAAA,GAAS,KAAK,MAAA,IAAU,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,GACnE,QAAA,CAAS,OAAA,CAAQ,CAAC,EAAuB,IAAA,GAC1C,EAAA;AAEJ,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,MAAA,EAAQ,QAAA,CAAS,KAAA,EAAO,YAAA,IAAgB,CAAA;AAAA,UACxC,UAAA,EAAY,QAAA,CAAS,KAAA,EAAO,aAAA,IAAiB,CAAA;AAAA,UAC7C,QAAQ,QAAA,CAAS,KAAA,EAAO,gBAAgB,CAAA,KAAM,QAAA,CAAS,OAAO,aAAA,IAAiB,CAAA;AAAA;AACjF,OACF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,GAAA,YAAe,eAAe,MAAM,GAAA;AACxC,MAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAO3D,MAAA,MAAM,OAAQ,GAAA,EAAuC,IAAA;AACrD,MAAA,MAAM,YAAA,GACJ,GAAA,CAAI,QAAA,CAAS,mBAAmB,MAC/B,IAAA,KAAS,sBAAA,IACR,IAAA,KAAS,kBAAA,IACT,gCAAgC,IAAA,CAAK,GAAG,CAAA,IACxC,2BAAA,CAA4B,KAAK,GAAG,CAAA,CAAA;AACxC,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,MAAM,IAAI,aAAA,CAAc,WAAA,EAAa,yFAAA,EAA2F;AAAA,UAC9H,SAAA,EAAW;AAAA,SACZ,CAAA;AAAA,MACH;AACA,MAAA,MAAM,IAAI,aAAA,CAAc,WAAA,EAAa,CAAA,0BAAA,EAA6B,GAAG,CAAA,CAAA,EAAI;AAAA,QACvE,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH;AAAA,EACF;AACF;;;AC3FO,IAAM,yBAAN,MAA0D;AAAA,EACvD,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACC,UAAA;AAAA,EACA,YAAA,GAAe,IAAA;AAAA,EAExB,YAAY,MAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,2BAAA;AACjC,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAO,KAAA,IAAS,wBAAA;AAC7B,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,KAAA,KAAU,wBAAA,GAA2B,IAAA,GAAO,IAAA;AAAA,EACrE;AAAA,EAEA,MAAM,MAAM,KAAA,EAAsC;AAChD,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAChC,IAAA,IAAI,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,YAAA,EAAc;AACpC,MAAA,MAAM,IAAI,cAAc,kBAAA,EAAoB,CAAA,IAAA,EAAO,KAAK,YAAY,CAAA,sBAAA,EAAyB,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AAAA,IAC7G;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,WAAA,CAAA,EAAe;AAAA,QACzD,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAAA,SACtC;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,KAAA,EAAO;AAAA,SACR;AAAA,OACF,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,IAAA,EAAK;AAChC,QAAA,MAAM,IAAI,cAAc,iBAAA,EAAmB,CAAA,wBAAA,EAA2B,SAAS,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI;AAAA,UAC9F,SAAA,EAAW,SAAS,MAAA,IAAU;AAAA,SAC/B,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAIlC,MAAA,OAAO,IAAA,CAAK,IAAA,CACT,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAK,CAAA,CAChC,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,SAAS,CAAA;AAAA,IACjC,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,GAAA,YAAe,eAAe,MAAM,GAAA;AACxC,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,iBAAA;AAAA,QACA,6BAA6B,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,QAC7E,EAAE,WAAW,IAAA;AAAK,OACpB;AAAA,IACF;AAAA,EACF;AACF;;;ACrDA,IAAM,UAAA,GAAqC;AAAA,EACzC,oBAAA,EAAsB,IAAA;AAAA,EACtB,yBAAA,EAA2B,IAAA;AAAA,EAC3B,0BAAA,EAA4B,GAAA;AAAA,EAC5B,+BAAA,EAAiC,GAAA;AAAA,EACjC,oBAAA,EAAsB,IAAA;AAAA,EACtB,yBAAA,EAA2B;AAC7B,CAAA;AAEO,IAAM,yBAAN,MAA0D;AAAA,EACvD,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACC,UAAA;AAAA,EACA,YAAA,GAAe,EAAA;AAAA,EAExB,YAAY,MAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,0BAAA;AACjC,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAO,KAAA,IAAS,oBAAA;AAC7B,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA,IAAK,IAAA;AAAA,EAC9C;AAAA,EAEA,MAAM,MAAM,KAAA,EAAsC;AAChD,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAChC,IAAA,IAAI,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,YAAA,EAAc;AACpC,MAAA,MAAM,IAAI,cAAc,kBAAA,EAAoB,CAAA,WAAA,EAAc,KAAK,YAAY,CAAA,sBAAA,EAAyB,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AAAA,IACpH;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,MAAA,CAAA,EAAU;AAAA,QACpD,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAAA,SACtC;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,KAAA;AAAA,UACA,UAAA,EAAY,iBAAA;AAAA,UACZ,eAAA,EAAiB,CAAC,OAAO;AAAA,SAC1B;AAAA,OACF,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,IAAA,EAAK;AAChC,QAAA,MAAM,IAAI,cAAc,iBAAA,EAAmB,CAAA,wBAAA,EAA2B,SAAS,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI;AAAA,UAC9F,SAAA,EAAW,SAAS,MAAA,IAAU;AAAA,SAC/B,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAIlC,MAAA,OAAO,IAAA,CAAK,UAAA,EAAY,KAAA,IAAS,EAAC;AAAA,IACpC,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,GAAA,YAAe,eAAe,MAAM,GAAA;AACxC,MAAA,MAAM,IAAI,aAAA;AAAA,QACR,iBAAA;AAAA,QACA,oCAAoC,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,QACpF,EAAE,WAAW,IAAA;AAAK,OACpB;AAAA,IACF;AAAA,EACF;AACF;;;AC/DO,IAAM,mBAAN,MAA8C;AAAA,EAC3C,OAAA;AAAA,EACA,YAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EAER,WAAA,CAAY,MAAA,GAA0B,EAAC,EAAG;AACxC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,wBAAA;AACjC,IAAA,IAAA,CAAK,YAAA,GAAe,OAAO,YAAA,IAAgB,UAAA;AAC3C,IAAA,IAAA,CAAK,kBAAA,GAAqB,OAAO,kBAAA,IAAsB,GAAA;AACvD,IAAA,IAAA,CAAK,gBAAA,GAAmB,OAAO,gBAAA,IAAoB,IAAA;AAAA,EACrD;AAAA,EAEA,MAAM,SAAS,OAAA,EAM8E;AAC3F,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,YAAA;AACpC,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,WAAA,IAAe,IAAA,CAAK,kBAAA;AAChD,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,gBAAA;AAE5C,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,SAAA,CAAA,EAAa;AAAA,QACvD,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,KAAA;AAAA,UACA,QAAA,EAAU;AAAA,YACR,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,QAAQ,MAAA,EAAO;AAAA,YAC1C,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,QAAQ,IAAA;AAAK,WACxC;AAAA,UACA,OAAA,EAAS,EAAE,WAAA,EAAa,WAAA,EAAa,SAAA,EAAU;AAAA,UAC/C,MAAA,EAAQ;AAAA,SACT;AAAA,OACF,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,IAAA,EAAK;AAChC,QAAA,MAAM,IAAI,cAAc,WAAA,EAAa,CAAA,kBAAA,EAAqB,SAAS,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI;AAAA,UAClF,SAAA,EAAW,SAAS,MAAA,IAAU;AAAA,SAC/B,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAMlC,MAAA,MAAM,YAAA,GAAe,KAAK,iBAAA,IAAqB,CAAA;AAC/C,MAAA,MAAM,gBAAA,GAAmB,KAAK,UAAA,IAAc,CAAA;AAE5C,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,IAAA,CAAK,OAAA,EAAS,OAAA,IAAW,EAAA;AAAA,QAC/B,MAAA,EAAQ;AAAA,UACN,MAAA,EAAQ,YAAA;AAAA,UACR,UAAA,EAAY,gBAAA;AAAA,UACZ,OAAO,YAAA,GAAe;AAAA;AACxB,OACF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,GAAA,YAAe,eAAe,MAAM,GAAA;AACxC,MAAA,MAAM,IAAI,aAAA,CAAc,WAAA,EAAa,CAAA,uBAAA,EAA0B,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA,EAAI;AAAA,QACjH,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH;AAAA,EACF;AACF;;;ACpEO,IAAM,iBAAN,MAA4C;AAAA,EACzC,MAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EAER,YAAY,MAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,gCAAA;AACjC,IAAA,IAAA,CAAK,YAAA,GAAe,OAAO,YAAA,IAAgB,yBAAA;AAC3C,IAAA,IAAA,CAAK,kBAAA,GAAqB,OAAO,kBAAA,IAAsB,GAAA;AACvD,IAAA,IAAA,CAAK,gBAAA,GAAmB,OAAO,gBAAA,IAAoB,IAAA;AAAA,EACrD;AAAA,EAEA,MAAM,SAAS,OAAA,EAM8E;AAC3F,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,YAAA;AACpC,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,WAAA,IAAe,IAAA,CAAK,kBAAA;AAChD,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,gBAAA;AAE5C,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,iBAAA,CAAA,EAAqB;AAAA,QAC/D,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAAA,SACtC;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,KAAA;AAAA,UACA,QAAA,EAAU;AAAA,YACR,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,QAAQ,MAAA,EAAO;AAAA,YAC1C,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,QAAQ,IAAA;AAAK,WACxC;AAAA,UACA,WAAA;AAAA,UACA,UAAA,EAAY;AAAA,SACb;AAAA,OACF,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,IAAA,EAAK;AAChC,QAAA,MAAM,IAAI,cAAc,WAAA,EAAa,CAAA,gBAAA,EAAmB,SAAS,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI;AAAA,UAChF,SAAA,EAAW,SAAS,MAAA,IAAU;AAAA,SAC/B,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAKlC,MAAA,OAAO;AAAA,QACL,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,SAAS,OAAA,IAAW,EAAA;AAAA,QAC3C,MAAA,EAAQ;AAAA,UACN,MAAA,EAAQ,IAAA,CAAK,KAAA,EAAO,aAAA,IAAiB,CAAA;AAAA,UACrC,UAAA,EAAY,IAAA,CAAK,KAAA,EAAO,iBAAA,IAAqB,CAAA;AAAA,UAC7C,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,YAAA,IAAgB;AAAA;AACrC,OACF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,GAAA,YAAe,eAAe,MAAM,GAAA;AACxC,MAAA,MAAM,IAAI,aAAA,CAAc,WAAA,EAAa,CAAA,qBAAA,EAAwB,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA,EAAI;AAAA,QAC/G,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,OAAO,eAAe,OAAA,EAM6E;AACjG,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,YAAA;AACpC,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,WAAA,IAAe,IAAA,CAAK,kBAAA;AAChD,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,gBAAA;AAE5C,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,iBAAA,CAAA,EAAqB;AAAA,QACzD,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA;AAAA,SACtC;AAAA,QACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,KAAA;AAAA,UACA,QAAA,EAAU;AAAA,YACR,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,QAAQ,MAAA,EAAO;AAAA,YAC1C,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,QAAQ,IAAA;AAAK,WACxC;AAAA,UACA,WAAA;AAAA,UACA,UAAA,EAAY,SAAA;AAAA,UACZ,MAAA,EAAQ,IAAA;AAAA,UACR,cAAA,EAAgB,EAAE,aAAA,EAAe,IAAA;AAAK,SACvC;AAAA,OACF,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,IAAI,aAAA,CAAc,WAAA,EAAa,CAAA,+BAAA,EAAkC,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA,EAAI;AAAA,QACzH,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,IAAA,EAAK;AAChC,MAAA,MAAM,IAAI,cAAc,WAAA,EAAa,CAAA,sBAAA,EAAyB,SAAS,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI;AAAA,QACtF,SAAA,EAAW,SAAS,MAAA,IAAU;AAAA,OAC/B,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,SAAA,EAAU;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,aAAA,CAAc,aAAa,gCAAgC,CAAA;AAElF,IAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,IAAI,gBAAA,GAAmB,CAAA;AAEvB,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,EAAM;AACX,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,QAAA,IAAI,IAAA,EAAM;AAEV,QAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,QAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,UAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC/C,UAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA;AAC5B,UAAA,IAAI,SAAS,QAAA,EAAU;AAEvB,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAM9B,YAAA,MAAM,UAAU,MAAA,CAAO,OAAA,GAAU,CAAC,CAAA,EAAG,OAAO,OAAA,IAAW,EAAA;AACvD,YAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,MAAA,EAAQ,KAAA;AAC7C,YAAA,IAAI,KAAA,EAAO;AACT,cAAA,YAAA,GAAe,KAAA,CAAM,aAAA;AACrB,cAAA,gBAAA,GAAmB,KAAA,CAAM,iBAAA;AAAA,YAC3B;AAEA,YAAA,IAAI,WAAW,KAAA,EAAO;AACpB,cAAA,MAAM;AAAA,gBACJ,IAAA,EAAM,OAAA;AAAA,gBACN,MAAA,EAAQ,EAAE,MAAA,EAAQ,YAAA,EAAc,YAAY,gBAAA,EAAkB,KAAA,EAAO,eAAe,gBAAA;AAAiB,eACvG;AAAA,YACF;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,MAAA,CAAO,WAAA,EAAY;AAAA,IACrB;AAAA,EACF;AACF","file":"index.cjs","sourcesContent":["export type MemStackErrorCode =\n | \"STORAGE_ERROR\"\n | \"EMBEDDING_ERROR\"\n | \"LLM_ERROR\"\n | \"VALIDATION_ERROR\"\n | \"NOT_FOUND\"\n | \"CONFIG_ERROR\";\n\nexport class MemStackError extends Error {\n code: MemStackErrorCode;\n retryable: boolean;\n details?: Record<string, unknown>;\n\n constructor(\n code: MemStackErrorCode,\n message: string,\n options: { retryable?: boolean; details?: Record<string, unknown> } = {}\n ) {\n super(message);\n this.name = \"MemStackError\";\n this.code = code;\n this.retryable = options.retryable ?? false;\n this.details = options.details;\n }\n}\n\nexport function notFound(entity: string, id: string): MemStackError {\n return new MemStackError(\"NOT_FOUND\", `${entity} not found: ${id}`, {\n retryable: false,\n details: { entity, id },\n });\n}\n\nexport function validationError(message: string, details?: Record<string, unknown>): MemStackError {\n return new MemStackError(\"VALIDATION_ERROR\", message, { details });\n}\n\nexport function storageError(message: string, cause?: unknown): MemStackError {\n return new MemStackError(\"STORAGE_ERROR\", message, {\n retryable: true,\n details: { cause: cause instanceof Error ? cause.message : String(cause) },\n });\n}\n\nexport function configError(message: string): MemStackError {\n return new MemStackError(\"CONFIG_ERROR\", message, { retryable: false });\n}\n","import type { LLMProvider } from \"../interfaces.js\";\nimport type { Memory } from \"../types.js\";\nimport type { SummarizeOptions } from \"../interfaces.js\";\nimport { MemStackError } from \"../errors.js\";\n\nexport class Summarizer {\n private llm: LLMProvider;\n private defaultPrompt: string;\n\n constructor(llm: LLMProvider, defaultPrompt?: string) {\n this.llm = llm;\n this.defaultPrompt = defaultPrompt ??\n \"You are a memory summarizer. Condense the following list of memories into a single, concise summary paragraph that captures the key events, emotional tone, and important details. Write in third person past tense.\";\n }\n\n async summarize(\n memories: Memory[],\n options: SummarizeOptions = {},\n promptOverride?: string\n ): Promise<{ summaryContent: string; tokenCount: number }> {\n if (memories.length === 0) {\n throw new MemStackError(\"VALIDATION_ERROR\", \"No memories to summarize\");\n }\n\n const chunkSize = options.chunkSize ?? 50;\n if (memories.length > chunkSize) {\n return this._summarizeChunked(memories, options, promptOverride);\n }\n\n const sorted = [...memories].sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n const memoryTexts = sorted.map((m) => `[${m.createdAt.toISOString()}] ${m.content}`);\n\n const system = promptOverride ?? this.defaultPrompt;\n const user = memoryTexts.join(\"\\n\\n\");\n\n try {\n const response = await this.llm.complete({ system, user });\n return {\n summaryContent: response.text.trim(),\n tokenCount: response.tokens.total,\n };\n } catch (err) {\n if (err instanceof MemStackError) throw err;\n throw new MemStackError(\n \"LLM_ERROR\",\n `Summarization failed: ${err instanceof Error ? err.message : String(err)}`,\n { retryable: true, details: { cause: err instanceof Error ? err.message : String(err) } }\n );\n }\n }\n\n private async _summarizeChunked(\n memories: Memory[],\n options: SummarizeOptions,\n promptOverride?: string\n ): Promise<{ summaryContent: string; tokenCount: number }> {\n const chunkSize = options.chunkSize ?? 50;\n const sorted = [...memories].sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n\n const chunks: Memory[][] = [];\n for (let i = 0; i < sorted.length; i += chunkSize) {\n chunks.push(sorted.slice(i, i + chunkSize));\n }\n\n let totalTokens = 0;\n\n const chunkSummaries: string[] = [];\n for (const chunk of chunks) {\n const memoryTexts = chunk.map((m) => `[${m.createdAt.toISOString()}] ${m.content}`);\n const system = promptOverride ?? this.defaultPrompt;\n const user = memoryTexts.join(\"\\n\\n\");\n\n try {\n const response = await this.llm.complete({ system, user });\n chunkSummaries.push(response.text.trim());\n totalTokens += response.tokens.total;\n } catch (err) {\n if (err instanceof MemStackError) throw err;\n throw new MemStackError(\n \"LLM_ERROR\",\n `Chunked summarization failed: ${err instanceof Error ? err.message : String(err)}`,\n { retryable: true, details: { cause: err instanceof Error ? err.message : String(err) } }\n );\n }\n }\n\n if (chunkSummaries.length === 1) {\n return { summaryContent: chunkSummaries[0], tokenCount: totalTokens };\n }\n\n const summaryMemories: Memory[] = chunkSummaries.map((content, i) => ({\n id: `_chunk_summary_${i}`,\n actorId: sorted[0].actorId,\n memoryType: \"summary\" as const,\n content,\n importance: 0.5,\n emotionalValence: 0,\n tags: [\"summary\"],\n createdAt: sorted[sorted.length - 1].createdAt,\n }));\n\n const merged = await this._summarizeChunked(summaryMemories, options, promptOverride);\n return {\n summaryContent: merged.summaryContent,\n tokenCount: totalTokens + merged.tokenCount,\n };\n }\n\n async *summarizeStream(\n memories: Memory[],\n options: SummarizeOptions = {},\n promptOverride?: string\n ): AsyncIterable<{ chunk: string; text: string }> {\n if (memories.length === 0) {\n throw new MemStackError(\"VALIDATION_ERROR\", \"No memories to summarize\");\n }\n if (!this.llm.completeStream) {\n const result = await this.summarize(memories, options, promptOverride);\n yield { chunk: result.summaryContent, text: result.summaryContent };\n return;\n }\n\n const chunkSize = options.chunkSize ?? 50;\n let toSummarize = memories;\n if (memories.length > chunkSize) {\n const chunked = await this._summarizeChunked(memories, options, promptOverride);\n toSummarize = [{ id: \"_chunked\", actorId: \"summarizer\", memoryType: \"summary\", content: chunked.summaryContent, importance: 0.5, emotionalValence: 0, tags: [], createdAt: new Date() }];\n }\n\n const sorted = [...toSummarize].sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n const memoryTexts = sorted.map((m) => `[${m.createdAt.toISOString()}] ${m.content}`);\n const system = promptOverride ?? this.defaultPrompt;\n const user = memoryTexts.join(\"\\n\\n\");\n\n let fullText = \"\";\n for await (const chunk of this.llm.completeStream({ system, user })) {\n fullText += chunk.text;\n yield { chunk: chunk.text, text: fullText };\n }\n }\n}\n","import type { Memory } from \"../types.js\";\nimport type { PruneStrategy } from \"../interfaces.js\";\n\nexport class Pruner {\n /** Returns memories to KEEP after applying the strategy. */\n execute(memories: Memory[], strategy: PruneStrategy): Memory[] {\n switch (strategy.type) {\n case \"byAge\":\n return this.keepByAge(memories, strategy);\n case \"byImportance\":\n return this.keepByImportance(memories, strategy);\n case \"byCount\":\n return this.keepByCount(memories, strategy);\n case \"byType\":\n return this.removeByType(memories, strategy);\n case \"custom\":\n return this.removeCustom(memories, strategy);\n case \"compose\":\n return this.keepCompose(memories, strategy);\n default:\n return memories;\n }\n }\n\n dryRun(memories: Memory[], strategy: PruneStrategy): Memory[] {\n return this.execute(memories, strategy);\n }\n\n private keepByAge(memories: Memory[], strategy: PruneStrategy): Memory[] {\n if (!strategy.maxAge) return memories;\n const cutoff = Date.now() - strategy.maxAge;\n return memories.filter((m) => m.createdAt.getTime() >= cutoff);\n }\n\n private keepByImportance(memories: Memory[], strategy: PruneStrategy): Memory[] {\n const threshold = strategy.minImportance ?? 0.5;\n return memories.filter((m) => m.importance >= threshold);\n }\n\n private keepByCount(memories: Memory[], strategy: PruneStrategy): Memory[] {\n const maxPerActor = strategy.maxPerActor ?? 100;\n const grouped = new Map<string, Memory[]>();\n for (const m of memories) {\n const list = grouped.get(m.actorId) || [];\n list.push(m);\n grouped.set(m.actorId, list);\n }\n\n const kept: Memory[] = [];\n for (const [, actorMemories] of grouped) {\n const sorted = [...actorMemories].sort((a, b) => b.importance - a.importance);\n kept.push(...sorted.slice(0, maxPerActor));\n }\n return kept;\n }\n\n /** Remove memories of specified types. Opposite of filtering — removes the matches. */\n private removeByType(memories: Memory[], strategy: PruneStrategy): Memory[] {\n if (!strategy.memoryTypes || strategy.memoryTypes.length === 0) return memories;\n return memories.filter((m) => !strategy.memoryTypes!.includes(m.memoryType));\n }\n\n /** Remove memories matching the predicate. Predicate returns true = should be removed. */\n private removeCustom(memories: Memory[], strategy: PruneStrategy): Memory[] {\n if (!strategy.shouldRemove) return memories;\n return memories.filter((m) => !strategy.shouldRemove!(m));\n }\n\n /** Apply sub-strategies cumulatively: kept memories must pass ALL. */\n private keepCompose(memories: Memory[], strategy: PruneStrategy): Memory[] {\n if (!strategy.strategies || strategy.strategies.length === 0) {\n return memories;\n }\n\n let kept = memories;\n for (const sub of strategy.strategies) {\n kept = this.execute(kept, sub);\n }\n return kept;\n }\n}\n","import type { Memory, CompiledContext } from \"../types.js\";\nimport type { ContextOptions, TokenCounter } from \"../interfaces.js\";\n\nexport class ContextCompiler {\n private tokenCounter: TokenCounter;\n private importantRatio: number;\n\n constructor(tokenCounter?: TokenCounter, importantRatio?: number) {\n this.tokenCounter = tokenCounter ?? this._heuristicTokens.bind(this);\n this.importantRatio = importantRatio ?? 0.6;\n }\n\n private _heuristicTokens(text: string): number {\n const charEst = Math.ceil(text.length / 4);\n const words = text.split(/\\s+/).filter((w) => w.length > 0);\n const wordEst = Math.ceil(words.length * 1.3);\n return Math.max(charEst, Math.max(1, wordEst));\n }\n\n private estimateTokens(text: string): number {\n return this.tokenCounter(text);\n }\n\n /**\n * Truncate text to fit within a token budget, preserving whole words.\n * Appends \"...\" when content is cut. Falls back to character-based\n * truncation for text with few/no word boundaries.\n */\n private truncateToTokens(text: string, maxTokens: number): string {\n if (this.estimateTokens(text) <= maxTokens) return text;\n\n const words = text.split(/\\s+/);\n const targetWords = Math.max(1, Math.floor(maxTokens / 1.3));\n let currentTokens = 0;\n let i = 0;\n for (; i < words.length && i < targetWords; i++) {\n currentTokens += this.estimateTokens(words[i]);\n if (currentTokens > maxTokens) break;\n }\n if (i >= words.length) return text;\n if (i > 0) return words.slice(0, i).join(\" \") + \"...\";\n\n // Single long word (e.g., JSON): fall back to character-based cut\n const charLimit = maxTokens * 4;\n return text.slice(0, charLimit) + \"...\";\n }\n\n compile(memories: Memory[], options: ContextOptions): CompiledContext {\n const maxTokens = options.maxTokens ?? 2000;\n\n const relevant = memories.filter((m) => {\n if (options.memoryTypes && options.memoryTypes.length > 0) {\n return options.memoryTypes.includes(m.memoryType);\n }\n return true;\n });\n\n const sortedRecent = [...relevant].sort(\n (a, b) => b.createdAt.getTime() - a.createdAt.getTime()\n );\n\n const sortedImportant = this.deduplicate(\n [...relevant]\n .filter((m) => m.importance >= 0.5)\n .sort((a, b) => b.importance - a.importance)\n );\n\n const { recentMemories, importantMemories, systemPrompt } =\n this.assembleTokenBudgeted(sortedRecent, sortedImportant, maxTokens);\n\n const tokenEstimate = this.estimateTokens(systemPrompt);\n\n if (options.format === \"messages\") {\n return {\n systemPrompt,\n messages: [{ role: \"system\", content: systemPrompt }],\n recentMemories,\n importantMemories,\n tokenEstimate,\n };\n }\n\n return { systemPrompt, recentMemories, importantMemories, tokenEstimate };\n }\n\n private assembleTokenBudgeted(\n recent: Memory[],\n important: Memory[],\n maxTokens: number\n ): { recentMemories: Memory[]; importantMemories: Memory[]; systemPrompt: string } {\n const includedImportant: Memory[] = [];\n const includedRecent: Memory[] = [];\n const seen = new Set<string>();\n let usedTokens = 0;\n\n // Add important memories first (signal over recency)\n for (const m of important) {\n if (seen.has(m.id)) continue;\n const prefix = `- `;\n const suffix = ` (${m.memoryType}, importance: ${m.importance.toFixed(2)})\\n`;\n const overhead = this.estimateTokens(prefix + suffix);\n let tokens = this.estimateTokens(m.content) + overhead;\n const remaining = Math.floor(maxTokens * this.importantRatio) - usedTokens;\n if (remaining <= 0) break;\n if (tokens > remaining) {\n const contentBudget = Math.max(0, remaining - overhead);\n if (contentBudget > 0) {\n const truncatedContent = this.truncateToTokens(m.content, contentBudget);\n includedImportant.push({ ...m, content: truncatedContent });\n tokens = this.estimateTokens(truncatedContent) + overhead;\n usedTokens += tokens;\n seen.add(m.id);\n }\n } else {\n includedImportant.push(m);\n usedTokens += tokens;\n seen.add(m.id);\n }\n }\n\n // Add recent memories until budget is full\n for (const m of recent) {\n if (seen.has(m.id)) continue;\n const prefix = `- `;\n const suffix = `\\n`;\n const overhead = this.estimateTokens(prefix + suffix);\n let tokens = this.estimateTokens(m.content) + overhead;\n const remaining = maxTokens - usedTokens;\n if (remaining <= 0) break;\n if (tokens > remaining) {\n const contentBudget = Math.max(0, remaining - overhead);\n if (contentBudget > 0) {\n const truncatedContent = this.truncateToTokens(m.content, contentBudget);\n includedRecent.push({ ...m, content: truncatedContent });\n tokens = this.estimateTokens(truncatedContent) + overhead;\n usedTokens += tokens;\n seen.add(m.id);\n }\n } else {\n includedRecent.push(m);\n usedTokens += tokens;\n seen.add(m.id);\n }\n }\n\n const parts: string[] = [];\n if (includedImportant.length > 0) {\n parts.push(\"## Important Memories\");\n for (const m of includedImportant) {\n parts.push(`- ${m.content} (${m.memoryType}, importance: ${m.importance.toFixed(2)})`);\n }\n }\n if (includedRecent.length > 0) {\n parts.push(\"\\n## Recent Interactions\");\n for (const m of includedRecent) {\n parts.push(`- ${m.content}`);\n }\n }\n\n return { recentMemories: includedRecent, importantMemories: includedImportant, systemPrompt: parts.join(\"\\n\") };\n }\n\n private deduplicate(memories: Memory[]): Memory[] {\n const seen = new Set<string>();\n const result: Memory[] = [];\n for (const m of memories) {\n const key = m.content.toLowerCase().trim();\n if (!seen.has(key)) {\n seen.add(key);\n result.push(m);\n }\n }\n return result;\n }\n}\n","import type { Memory, CompiledContext, MemoryStats } from \"../types.js\";\nimport type {\n StorageProvider,\n EmbeddingProvider,\n LLMProvider,\n MemoryStoreInput,\n MemoryRetrieveQuery,\n MemoryCountFilter,\n ContextOptions,\n SummarizeOptions,\n PruneStrategy,\n TokenCounter,\n} from \"../interfaces.js\";\nimport { Summarizer } from \"./Summarizer.js\";\nimport { Pruner } from \"./Pruner.js\";\nimport { ContextCompiler } from \"./ContextCompiler.js\";\nimport { notFound, validationError } from \"../errors.js\";\n\nexport interface MemoryStoreConfig {\n storage: StorageProvider;\n embedding?: EmbeddingProvider;\n llm?: LLMProvider;\n embedOnStore?: boolean;\n summarizationPrompt?: string;\n tokenCounter?: TokenCounter;\n contextImportantRatio?: number;\n limits?: {\n dedupScan?: number;\n contextScan?: number;\n summarizeScan?: number;\n pruneScan?: number;\n exportScan?: number;\n purgeScan?: number;\n };\n}\n\nexport class MemoryStore {\n private storage: StorageProvider;\n private embedding?: EmbeddingProvider;\n private summarizer?: Summarizer;\n private pruner: Pruner;\n private compiler: ContextCompiler;\n private embedOnStore: boolean;\n private limits: Required<NonNullable<MemoryStoreConfig[\"limits\"]>>;\n private contentHashIndex: Map<string, string> | null = null;\n private initialized = false;\n\n private async _ensureInit(): Promise<void> {\n if (!this.initialized) {\n await this.storage.initialize();\n this.initialized = true;\n }\n }\n\n constructor(config: MemoryStoreConfig) {\n this.storage = config.storage;\n this.embedding = config.embedding;\n this.embedOnStore = config.embedOnStore ?? true;\n if (config.llm) {\n this.summarizer = new Summarizer(config.llm, config.summarizationPrompt);\n }\n this.pruner = new Pruner();\n this.compiler = new ContextCompiler(config.tokenCounter, config.contextImportantRatio);\n this.limits = {\n dedupScan: 1000,\n contextScan: 50,\n summarizeScan: 1000,\n pruneScan: 10000,\n exportScan: 100000,\n purgeScan: 100000,\n ...config.limits,\n };\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n await this._ensureInit();\n if (input.onConflict === \"append\") {\n await this._ensureHashIndex();\n const hash = this._hashContent(input.actorId, input.content);\n const existingId = this.contentHashIndex!.get(hash);\n if (existingId) {\n const match = await this.storage.get(existingId);\n if (match) {\n const mergedTags = [...new Set([...(match.tags ?? []), ...(input.tags ?? [])])];\n const updated = await this.storage.store({\n id: match.id,\n actorId: match.actorId,\n content: match.content,\n memoryType: match.memoryType,\n importance: input.importance ?? match.importance,\n emotionalValence: input.emotionalValence ?? match.emotionalValence,\n tags: mergedTags,\n embedding: match.embedding,\n sourceId: input.sourceId ?? match.sourceId,\n metadata: { ...match.metadata, ...input.metadata },\n expiresAt: input.expiresAt ?? match.expiresAt,\n });\n this.contentHashIndex!.set(hash, updated.id);\n return updated;\n }\n }\n }\n\n let withEmbedding = input;\n if (this.embedding && this.embedOnStore) {\n const embeddings = await this.embedding.embed([input.content]);\n withEmbedding = { ...input, embedding: embeddings[0] };\n }\n const { onConflict: _, ...clean } = withEmbedding;\n const memory = await this.storage.store(clean);\n if (this.contentHashIndex !== null) {\n const hash = this._hashContent(memory.actorId, memory.content);\n this.contentHashIndex.set(hash, memory.id);\n }\n return memory;\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n await this._ensureInit();\n const appendInputs = inputs.filter((i) => i.onConflict === \"append\");\n const normalInputs = inputs.filter((i) => i.onConflict !== \"append\");\n\n const results: Memory[] = [];\n\n for (const input of appendInputs) {\n results.push(await this.store(input));\n }\n\n if (normalInputs.length === 0) return results;\n\n let stored: Memory[];\n if (this.embedding && this.embedOnStore) {\n const enrichedResults: Memory[] = [];\n const batchSize = this.embedding.maxBatchSize ?? 2048;\n for (let i = 0; i < normalInputs.length; i += batchSize) {\n const batch = normalInputs.slice(i, i + batchSize);\n const texts = batch.map((inp) => inp.content);\n const embeddings = await this.embedding!.embed(texts);\n const enriched = batch.map((input, j) => ({ ...input, embedding: embeddings[j] }));\n const batchResults = await this.storage.storeBatch(enriched);\n enrichedResults.push(...batchResults);\n }\n stored = enrichedResults;\n } else {\n stored = await this.storage.storeBatch(normalInputs);\n }\n\n if (this.contentHashIndex !== null) {\n for (const mem of stored) {\n const hash = this._hashContent(mem.actorId, mem.content);\n this.contentHashIndex.set(hash, mem.id);\n }\n }\n\n results.push(...stored);\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n await this._ensureInit();\n return this.storage.get(id);\n }\n\n async delete(id: string): Promise<void> {\n await this._ensureInit();\n return this.storage.delete(id);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n await this._ensureInit();\n return this.storage.deleteMany(ids);\n }\n\n async touch(id: string): Promise<void> {\n await this._ensureInit();\n const memory = await this.storage.get(id);\n if (!memory) throw notFound(\"Memory\", id);\n if (this.storage.touch) {\n return this.storage.touch(id);\n }\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n await this._ensureInit();\n return this.storage.count(filter);\n }\n\n async retrieve(query: MemoryRetrieveQuery): Promise<Memory[]> {\n await this._ensureInit();\n let embedding: number[] | undefined;\n if (this.embedding && query.query && (query.strategy === \"semantic\" || query.strategy === \"hybrid\")) {\n const vecs = await this.embedding.embed([query.query]);\n embedding = vecs[0];\n }\n let results = await this.storage.retrieve(query, embedding);\n if (query.createdAfter) {\n results = results.filter((m) => m.createdAt >= query.createdAfter!);\n }\n if (query.createdBefore) {\n results = results.filter((m) => m.createdAt <= query.createdBefore!);\n }\n return results;\n }\n\n async compileContext(options: ContextOptions): Promise<CompiledContext> {\n await this._ensureInit();\n const maxTokens = options.maxTokens ?? 2000;\n const memories = await this.storage.retrieve({\n actorId: options.actorId,\n limit: this.limits.contextScan,\n strategy: options.retrieveStrategy,\n });\n return this.compiler.compile(memories, { ...options, maxTokens });\n }\n\n async summarize(\n options: SummarizeOptions,\n onError?: (err: Error) => void\n ): Promise<{ summary: Memory; deletedCount: number }> {\n await this._ensureInit();\n if (!this.summarizer) {\n throw validationError(\"No LLM configured for summarization\");\n }\n\n const allMemories = await this.storage.retrieve({\n actorId: options.actorId,\n memoryTypes: options.memoryTypes ?? [\"interaction\"],\n limit: this.limits.summarizeScan,\n strategy: \"recent\",\n });\n\n let toSummarize = allMemories;\n if (options.olderThan) {\n toSummarize = toSummarize.filter((m) => m.createdAt < options.olderThan!);\n }\n if (options.skipMostRecent) {\n const sorted = [...toSummarize].sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n toSummarize = sorted.slice(0, Math.max(0, sorted.length - options.skipMostRecent));\n }\n if (options.targetCount && toSummarize.length > options.targetCount) {\n const sorted = [...toSummarize].sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n toSummarize = sorted.slice(0, options.targetCount);\n }\n\n if (toSummarize.length === 0) {\n throw validationError(\"No memories to summarize\");\n }\n\n let summaryContent: string;\n try {\n const result = await this.summarizer.summarize(toSummarize, options, options.prompt);\n summaryContent = result.summaryContent;\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n throw err;\n }\n\n const summary: Memory = await this.storage.store({\n actorId: options.actorId ?? toSummarize[0].actorId,\n content: summaryContent,\n memoryType: \"summary\",\n importance: Math.max(...toSummarize.map((m) => m.importance)),\n emotionalValence:\n toSummarize.reduce((sum, m) => sum + m.emotionalValence, 0) / toSummarize.length,\n tags: [\"summary\"],\n sourceId: toSummarize[0].id,\n });\n\n let deletedCount = 0;\n if (!options.keepOriginals) {\n const ids = toSummarize.map((m) => m.id);\n deletedCount = await this.storage.deleteMany(ids);\n }\n\n return { summary, deletedCount };\n }\n\n async *summarizeStream(options: SummarizeOptions): AsyncIterable<{ chunk: string; text: string }> {\n await this._ensureInit();\n if (!this.summarizer) {\n throw validationError(\"No LLM configured for summarization\");\n }\n\n const allMemories = await this.storage.retrieve({\n actorId: options.actorId,\n memoryTypes: options.memoryTypes ?? [\"interaction\"],\n limit: this.limits.summarizeScan,\n strategy: \"recent\",\n });\n\n let toSummarize = allMemories;\n if (options.olderThan) {\n toSummarize = toSummarize.filter((m) => m.createdAt < options.olderThan!);\n }\n if (options.skipMostRecent) {\n const sorted = [...toSummarize].sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n toSummarize = sorted.slice(0, Math.max(0, sorted.length - options.skipMostRecent));\n }\n if (options.targetCount && toSummarize.length > options.targetCount) {\n const sorted = [...toSummarize].sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n toSummarize = sorted.slice(0, options.targetCount);\n }\n\n if (toSummarize.length === 0) {\n throw validationError(\"No memories to summarize\");\n }\n\n yield* this.summarizer.summarizeStream(toSummarize, options, options.prompt);\n }\n\n async prune(strategy: PruneStrategy): Promise<{ pruned: string[]; count: number }> {\n await this._ensureInit();\n const allMemories = await this.storage.retrieve({ actorId: strategy.actorId, limit: this.limits.pruneScan });\n const kept = this.pruner.execute(allMemories, strategy);\n const keptIds = new Set(kept.map((k) => k.id));\n const prunedIds = allMemories.filter((m) => !keptIds.has(m.id)).map((m) => m.id);\n let count = 0;\n if (prunedIds.length > 0) {\n count = await this.storage.deleteMany(prunedIds);\n }\n return { pruned: prunedIds, count };\n }\n\n async dryRunPrune(strategy: PruneStrategy): Promise<{ wouldPrune: string[]; count: number }> {\n await this._ensureInit();\n const allMemories = await this.storage.retrieve({ actorId: strategy.actorId, limit: this.limits.pruneScan });\n const kept = this.pruner.execute(allMemories, strategy);\n const keptIds = new Set(kept.map((k) => k.id));\n const wouldPrune = allMemories.filter((m) => !keptIds.has(m.id)).map((m) => m.id);\n return { wouldPrune, count: wouldPrune.length };\n }\n\n async export(actorId?: string): Promise<Memory[]> {\n await this._ensureInit();\n return this.storage.retrieve({ actorId, limit: this.limits.exportScan });\n }\n\n async stats(actorId?: string): Promise<MemoryStats> {\n await this._ensureInit();\n const memories = await this.storage.retrieve({ actorId, limit: this.limits.exportScan });\n const now = new Date();\n const byType: Record<string, number> = {};\n const byActor: Record<string, { count: number; oldest: Date; newest: Date; totalImportance: number }> = {};\n let totalImportance = 0;\n let expired = 0;\n let oldest: Date | null = null;\n let newest: Date | null = null;\n\n for (const m of memories) {\n totalImportance += m.importance;\n byType[m.memoryType] = (byType[m.memoryType] ?? 0) + 1;\n\n const actor = byActor[m.actorId] ?? { count: 0, oldest: m.createdAt, newest: m.createdAt, totalImportance: 0 };\n actor.count++;\n actor.totalImportance += m.importance;\n if (m.createdAt < actor.oldest) actor.oldest = m.createdAt;\n if (m.createdAt > actor.newest) actor.newest = m.createdAt;\n byActor[m.actorId] = actor;\n\n if (m.expiresAt && m.expiresAt <= now) expired++;\n if (!oldest || m.createdAt < oldest) oldest = m.createdAt;\n if (!newest || m.createdAt > newest) newest = m.createdAt;\n }\n\n const byActorFinal: MemoryStats[\"byActor\"] = {};\n for (const [id, a] of Object.entries(byActor)) {\n byActorFinal[id] = { count: a.count, oldest: a.oldest, newest: a.newest, avgImportance: a.totalImportance / a.count };\n }\n\n return {\n total: memories.length,\n expired,\n oldest,\n newest,\n avgImportance: memories.length > 0 ? totalImportance / memories.length : 0,\n byType: byType as Record<string, number>,\n byActor: byActorFinal,\n };\n }\n\n async purgeActor(actorId: string): Promise<number> {\n await this._ensureInit();\n const memories = await this.storage.retrieve({ actorId, limit: this.limits.purgeScan ?? 100000 });\n if (memories.length === 0) return 0;\n return this.storage.deleteMany(memories.map((m) => m.id));\n }\n\n async merge(ids: string[]): Promise<Memory> {\n await this._ensureInit();\n if (ids.length < 2) throw validationError(\"merge requires at least 2 memory IDs\");\n\n const memories: Memory[] = [];\n for (const id of ids) {\n const m = await this.storage.get(id);\n if (m) memories.push(m);\n }\n if (memories.length < 2) throw validationError(\"At least 2 of the provided IDs must exist\");\n\n const sorted = memories.sort((a, b) => b.importance - a.importance);\n const winner = sorted[0];\n const rest = sorted.slice(1);\n\n const mergedContent = [\n winner.content,\n \"\",\n \"--- merged from \" + rest.length + \" related memories ---\",\n ...rest.map((m) => \"- \" + m.content),\n ].join(\"\\n\");\n\n const mergedTags = [...new Set(memories.flatMap((m) => m.tags))];\n const mergedMetadata = {\n ...winner.metadata,\n mergedFrom: rest.map((m) => m.id),\n };\n\n const updated = await this.storage.store({\n id: winner.id,\n actorId: winner.actorId,\n content: mergedContent,\n memoryType: winner.memoryType,\n importance: winner.importance,\n emotionalValence: winner.emotionalValence,\n tags: mergedTags,\n embedding: winner.embedding,\n sourceId: winner.sourceId,\n metadata: mergedMetadata,\n expiresAt: winner.expiresAt,\n });\n\n await this.storage.deleteMany(rest.map((m) => m.id));\n\n return updated;\n }\n\n private async _ensureHashIndex(): Promise<void> {\n if (this.contentHashIndex !== null) return;\n this.contentHashIndex = new Map();\n const existing = await this.storage.retrieve({ limit: this.limits.dedupScan });\n for (const m of existing) {\n const hash = this._hashContent(m.actorId, m.content);\n this.contentHashIndex.set(hash, m.id);\n }\n }\n\n private _hashContent(actorId: string, content: string): string {\n const normalized = `${actorId}::${content.toLowerCase().trim()}`;\n let hash = 14695981039346656037n;\n for (let i = 0; i < normalized.length; i++) {\n hash ^= BigInt(normalized.charCodeAt(i));\n hash *= 1099511628211n;\n }\n return hash.toString(36);\n }\n}\n","import type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter, StorageCapabilities } from \"../../interfaces.js\";\nimport { notFound } from \"../../errors.js\";\n\ninterface MemoryRecord extends Memory {\n _touchedAt: Date;\n}\n\nexport class InMemoryStorageAdapter implements StorageProvider {\n readonly capabilities: StorageCapabilities = { multiProcess: false };\n private memories: Map<string, MemoryRecord> = new Map();\n\n async initialize(): Promise<void> {}\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date();\n const memory: MemoryRecord = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? now,\n _touchedAt: now,\n };\n this.memories.set(memory.id, memory);\n return memory;\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const results: Memory[] = [];\n for (const input of inputs) {\n results.push(await this.store(input));\n }\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n const memory = this.memories.get(id);\n if (!memory) return null;\n if (memory.expiresAt && memory.expiresAt <= new Date()) {\n this.memories.delete(id);\n return null;\n }\n return memory;\n }\n\n async delete(id: string): Promise<void> {\n if (!this.memories.has(id)) throw notFound(\"Memory\", id);\n this.memories.delete(id);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n let count = 0;\n for (const id of ids) {\n if (this.memories.has(id)) {\n this.memories.delete(id);\n count++;\n }\n }\n return count;\n }\n\n async retrieve(query: MemoryRetrieveQuery, _embedding?: number[]): Promise<Memory[]> {\n let results = Array.from(this.memories.values());\n\n // Filter out expired\n const now = new Date();\n results = results.filter((m) => !m.expiresAt || m.expiresAt > now);\n\n if (query.actorId) {\n results = results.filter((m) => m.actorId === query.actorId);\n }\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n results = results.filter((m) => query.memoryTypes!.includes(m.memoryType));\n }\n if (query.tags && query.tags.length > 0) {\n results = results.filter((m) => m.tags?.some((t) => query.tags!.includes(t)));\n }\n if (query.query) {\n const terms = query.query.toLowerCase().split(/\\s+/).filter(Boolean);\n results = results.filter((m) => {\n const content = m.content.toLowerCase();\n return terms.some((t) => content.includes(t));\n });\n }\n if (query.createdAfter) {\n results = results.filter((m) => m.createdAt >= query.createdAfter!);\n }\n if (query.createdBefore) {\n results = results.filter((m) => m.createdAt <= query.createdBefore!);\n }\n\n switch (query.strategy) {\n case \"recent\":\n results.sort((a, b) => b._touchedAt.getTime() - a._touchedAt.getTime());\n break;\n case \"important\":\n results.sort((a, b) => b.importance - a.importance);\n break;\n case \"hybrid\":\n case \"semantic\":\n default:\n results.sort((a, b) => b.importance - a.importance || b._touchedAt.getTime() - a._touchedAt.getTime());\n break;\n }\n\n // Touch records on retrieval (for recency tracking in context assembly)\n if (query.touch !== false) {\n for (const r of results.slice(0, query.limit ?? 10)) {\n r._touchedAt = new Date();\n }\n }\n\n const limit = query.limit ?? 10;\n return results.slice(0, limit);\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n const now = new Date();\n let results = Array.from(this.memories.values())\n .filter((m) => !m.expiresAt || m.expiresAt > now);\n\n if (filter?.actorId) {\n results = results.filter((m) => m.actorId === filter.actorId);\n }\n if (filter?.memoryType) {\n results = results.filter((m) => m.memoryType === filter.memoryType);\n }\n if (filter?.minImportance !== undefined) {\n results = results.filter((m) => m.importance >= filter.minImportance!);\n }\n return results.length;\n }\n\n async touch(id: string): Promise<void> {\n const memory = this.memories.get(id);\n if (!memory) throw notFound(\"Memory\", id);\n memory._touchedAt = new Date();\n }\n\n async close(): Promise<void> {\n this.memories.clear();\n }\n\n getAllMemories(): Memory[] {\n return Array.from(this.memories.values());\n }\n}\n","// Parsing helpers for LLM enrichment output, shared by the client and harness memory.\n\n/**\n * Token cap for enrichment calls. A ceiling, not a target: reasoning models\n * such as deepseek-flash spend tokens thinking before they answer and return\n * an empty reply when the cap is hit first.\n */\nexport const ENRICHMENT_MAX_TOKENS = 1024;\n\n/** Strip markdown code fences and extract the JSON payload from LLM output. */\nexport function extractJson(text: string): string {\n let cleaned = text.trim();\n // Remove ```json ... ``` or ``` ... ``` fences\n const fenceMatch = cleaned.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n if (fenceMatch) cleaned = fenceMatch[1].trim();\n return cleaned;\n}\n\n/** Parse a JSON array of tags, falling back to comma-separated text. At most `max` tags. */\nexport function parseTags(text: string, max = 5): string[] {\n try {\n const parsed = JSON.parse(extractJson(text)) as unknown;\n if (Array.isArray(parsed) && parsed.every((t: unknown) => typeof t === \"string\")) {\n return (parsed as string[]).map((t) => t.toLowerCase().trim()).slice(0, max);\n }\n } catch {\n // Fallback: try comma-separated\n }\n return text\n .split(\",\")\n .map((t) => t.replace(/[\\[\\]\"]/g, \"\").trim().toLowerCase())\n .filter((t) => t.length > 0)\n .slice(0, max);\n}\n","import type { Memory, ProcessResult, MemStackSnapshot, HealthStatus } from \"./types.js\";\nimport type { MemStackConfig, ProcessInput, MemoryStoreInput, StorageProvider } from \"./interfaces.js\";\nimport { MemoryStore } from \"./memory/MemoryStore.js\";\nimport { InMemoryStorageAdapter } from \"./adapters/storage/memory.js\";\nimport { configError, validationError } from \"./errors.js\";\nimport { ENRICHMENT_MAX_TOKENS, extractJson, parseTags } from \"./enrichment.js\";\n\nexport class MemStack {\n readonly memory: MemoryStore;\n\n private config: MemStackConfig;\n private storage: StorageProvider;\n private processCounts = new Map<string, number>();\n private pruneCheckCount = 0;\n\n constructor(config: MemStackConfig) {\n if (!config.llm) {\n throw configError(\"LLM provider is required\");\n }\n\n this.config = config;\n this.storage = config.storage ?? new InMemoryStorageAdapter();\n\n this.memory = new MemoryStore({\n storage: this.storage,\n embedding: config.embedding,\n llm: config.llm,\n embedOnStore: config.defaults?.embedOnStore ?? true,\n summarizationPrompt: config.defaults?.summarizationPrompt,\n });\n }\n\n async process(input: ProcessInput): Promise<ProcessResult> {\n // Auto-enrichment: importance + tags via LLM when not provided\n let importance = input.importance;\n let tags = input.tags;\n\n const needImportance = importance === undefined && this.config.defaults?.autoImportance;\n const needTags = (!tags || tags.length === 0) && this.config.defaults?.autoTags;\n\n if (needImportance || needTags) {\n try {\n if (needImportance && needTags) {\n // Batch both into one LLM call\n const result = await this.config.llm.complete({\n system:\n \"Analyze the memory and respond with a JSON object: {\\\"importance\\\": <0.0-1.0>, \\\"tags\\\": [<array of 1-5 lowercase single-word tags>]}. Return ONLY the JSON, nothing else.\",\n user: input.content,\n maxTokens: ENRICHMENT_MAX_TOKENS,\n temperature: 0,\n });\n const parsed = this._parseEnrichmentJson(result.text);\n if (parsed.importance !== undefined) importance = parsed.importance;\n if (parsed.tags) tags = parsed.tags;\n } else if (needImportance) {\n const result = await this.config.llm.complete({\n system:\n \"Rate the importance of the following memory for an AI agent on a scale of 0.0 to 1.0, where 0.0 is trivial and 1.0 is critical. Return ONLY a single float number, nothing else.\",\n user: input.content,\n maxTokens: ENRICHMENT_MAX_TOKENS,\n temperature: 0,\n });\n const parsed = parseFloat(result.text.trim());\n importance = Number.isFinite(parsed) ? Math.max(0, Math.min(1, parsed)) : 0.5;\n } else if (needTags) {\n const result = await this.config.llm.complete({\n system:\n \"Extract 1-5 concise, lowercase, single-word tags from the following memory. Return ONLY a JSON array of strings, nothing else. Example: [\\\"combat\\\", \\\"goblin\\\", \\\"forest\\\"]\",\n user: input.content,\n maxTokens: ENRICHMENT_MAX_TOKENS,\n temperature: 0,\n });\n tags = parseTags(result.text);\n }\n } catch (err) {\n this.config.hooks?.onError?.(\n err instanceof Error ? err : new Error(String(err)),\n \"auto-enrich\"\n );\n if (importance === undefined) importance = 0.5;\n if (!tags) tags = [];\n }\n }\n\n const memoryInput: MemoryStoreInput = {\n actorId: input.actorId,\n content: input.content,\n memoryType: input.memoryType ?? \"interaction\",\n importance: importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: tags ?? [],\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n onConflict: input.onConflict,\n };\n\n const memory = await this.memory.store(memoryInput);\n this.config.hooks?.onMemoryStored?.(memory);\n\n const count = (this.processCounts.get(input.actorId) ?? 0) + 1;\n this.processCounts.set(input.actorId, count);\n\n // Auto-summarize if threshold is hit\n let summaryCreated: Memory | undefined;\n const threshold = this.config.defaults?.summarizationThreshold ?? 100;\n if (threshold > 0 && count % threshold === 0) {\n try {\n const result = await this.memory.summarize(\n {\n actorId: input.actorId,\n memoryTypes: [\"interaction\"],\n skipMostRecent: 5,\n targetCount: Math.min(15, count),\n },\n this.config.hooks?.onError\n ? (err) => this.config.hooks!.onError!(err, \"summarize\")\n : undefined\n );\n summaryCreated = result.summary;\n this.config.hooks?.onSummaryCreated?.(result.summary, result.deletedCount);\n } catch (err) {\n this.config.hooks?.onError?.(\n err instanceof Error ? err : new Error(String(err)),\n \"summarize\"\n );\n }\n }\n\n // Auto-prune if configured (throttled)\n this.pruneCheckCount++;\n const pruneStrategy = this.config.defaults?.pruneStrategy;\n const pruneInterval = this.config.defaults?.pruneInterval ?? 100;\n if (pruneStrategy && this.pruneCheckCount % pruneInterval === 0) {\n try {\n const pruneResult = await this.memory.prune(pruneStrategy);\n if (pruneResult.count > 0) {\n this.config.hooks?.onMemoryPruned?.(pruneResult.pruned);\n }\n } catch (err) {\n this.config.hooks?.onError?.(\n err instanceof Error ? err : new Error(String(err)),\n \"prune\"\n );\n }\n }\n\n return { memory, summaryCreated };\n }\n\n async export(actorId?: string): Promise<MemStackSnapshot> {\n const memories = await this.memory.export(actorId);\n return {\n version: 1,\n memories,\n exportedAt: new Date().toISOString(),\n };\n }\n\n async import(snapshot: MemStackSnapshot): Promise<void> {\n if (snapshot.version !== 1) {\n throw validationError(`Unsupported snapshot version: ${snapshot.version}`);\n }\n const memories = snapshot.memories.map((m, i) => {\n const createdAt = typeof m.createdAt === \"string\" ? new Date(m.createdAt) : m.createdAt;\n const expiresAt = typeof m.expiresAt === \"string\" ? new Date(m.expiresAt) : m.expiresAt;\n const label = m.id ? `id: ${m.id}` : `index ${i}`;\n if (createdAt && isNaN(createdAt.getTime())) {\n throw validationError(`Invalid createdAt for memory (${label}): ${String(m.createdAt)}`);\n }\n if (expiresAt && isNaN(expiresAt.getTime())) {\n throw validationError(`Invalid expiresAt for memory (${label}): ${String(m.expiresAt)}`);\n }\n return { ...m, createdAt, expiresAt };\n });\n await this.memory.storeBatch(memories);\n }\n\n async health(): Promise<HealthStatus> {\n const status: HealthStatus = { storage: false, llm: false, embedding: false };\n\n try {\n await this.memory.count();\n status.storage = true;\n } catch { /* storage check failed */ }\n\n try {\n await this.config.llm.complete({ system: \"ok\", user: \"health\", maxTokens: 1 });\n status.llm = true;\n } catch { /* llm check failed */ }\n\n if (this.config.embedding) {\n try {\n await this.config.embedding.embed([\"health check\"]);\n status.embedding = true;\n } catch { /* embedding check failed */ }\n }\n\n return status;\n }\n\n async close(): Promise<void> {\n await this.storage.close();\n }\n\n private _parseEnrichmentJson(\n text: string\n ): { importance?: number; tags?: string[] } {\n try {\n const json = JSON.parse(extractJson(text)) as Record<string, unknown>;\n const result: { importance?: number; tags?: string[] } = {};\n if (typeof json.importance === \"number\" && Number.isFinite(json.importance)) {\n result.importance = Math.max(0, Math.min(1, json.importance));\n }\n if (\n Array.isArray(json.tags) &&\n json.tags.every((t: unknown) => typeof t === \"string\")\n ) {\n result.tags = (json.tags as string[]).map((t) => t.toLowerCase().trim()).slice(0, 5);\n }\n return result;\n } catch {\n return {};\n }\n }\n}\n","// Tokenizing and stemming for Core lexical retrieval. Kept dependency-free\n// so recall behaves the same on every storage adapter.\n\nconst STOPWORDS = new Set([\n \"a\", \"an\", \"and\", \"are\", \"as\", \"at\", \"be\", \"by\", \"did\", \"do\", \"does\", \"for\", \"from\",\n \"how\", \"i\", \"in\", \"is\", \"it\", \"its\", \"me\", \"my\", \"of\", \"on\", \"or\", \"our\", \"that\", \"the\",\n \"this\", \"to\", \"was\", \"we\", \"were\", \"what\", \"when\", \"where\", \"which\", \"who\", \"why\",\n \"with\", \"you\", \"your\",\n // Verbs that frame a question (\"what do we use?\") without saying what it is about.\n \"can\", \"could\", \"has\", \"have\", \"should\", \"use\", \"used\", \"uses\", \"using\", \"would\",\n]);\n\n/** Lowercased words, split on anything that is not a letter or digit. */\nexport function tokenize(text: string): string[] {\n return text.toLowerCase().match(/[\\p{L}\\p{N}]+/gu) ?? [];\n}\n\n/** Stemmed query terms, without stopwords unless the query has nothing else. */\nexport function queryTerms(text: string): string[] {\n const words = [...new Set(tokenize(text))];\n const meaningful = words.filter((w) => !STOPWORDS.has(w));\n return [...new Set((meaningful.length > 0 ? meaningful : words).map(stem))];\n}\n\n/** Stemmed document terms, stopwords included so term frequencies stay honest. */\nexport function documentTerms(text: string): string[] {\n return tokenize(text).map(stem);\n}\n\n// Porter stemmer (M. F. Porter, 1980), for ASCII English words. Words with\n// other characters, and words shorter than three letters, are returned as-is.\n\nconst STEP2: Record<string, string> = {\n ational: \"ate\", tional: \"tion\", enci: \"ence\", anci: \"ance\", izer: \"ize\", bli: \"ble\",\n alli: \"al\", entli: \"ent\", eli: \"e\", ousli: \"ous\", ization: \"ize\", ation: \"ate\",\n ator: \"ate\", alism: \"al\", iveness: \"ive\", fulness: \"ful\", ousness: \"ous\", aliti: \"al\",\n iviti: \"ive\", biliti: \"ble\", logi: \"log\",\n};\n\nconst STEP3: Record<string, string> = {\n icate: \"ic\", ative: \"\", alize: \"al\", iciti: \"ic\", ical: \"ic\", ful: \"\", ness: \"\",\n};\n\n// The lazy prefix makes the regex strip the longest matching suffix.\nconst STEP4 = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;\n\nconst C = \"[^aeiou]\";\nconst V = \"[aeiouy]\";\nconst CS = `${C}[^aeiouy]*`;\nconst VS = `${V}[aeiou]*`;\nconst MGR0 = new RegExp(`^(${CS})?${VS}${CS}`);\nconst MEQ1 = new RegExp(`^(${CS})?${VS}${CS}(${VS})?$`);\nconst MGR1 = new RegExp(`^(${CS})?${VS}${CS}${VS}${CS}`);\nconst HAS_VOWEL = new RegExp(`^(${CS})?${V}`);\nconst CVC = new RegExp(`^${CS}${V}[^aeiouwxy]$`);\n\nexport function stem(word: string): string {\n if (word.length < 3 || !/^[a-z]+$/.test(word)) return word;\n\n let w = word;\n const firstY = w[0] === \"y\";\n if (firstY) w = \"Y\" + w.slice(1);\n\n // Step 1a\n if (/(ss|i)es$/.test(w)) w = w.slice(0, -2);\n else if (/[^s]s$/.test(w)) w = w.slice(0, -1);\n\n // Step 1b\n let m: RegExpMatchArray | null;\n if ((m = w.match(/^(.+?)eed$/))) {\n if (MGR0.test(m[1])) w = w.slice(0, -1);\n } else if ((m = w.match(/^(.+?)(ed|ing)$/))) {\n const base = m[1];\n if (HAS_VOWEL.test(base)) {\n w = base;\n if (/(at|bl|iz)$/.test(w)) w += \"e\";\n else if (/([^aeiouylsz])\\1$/.test(w)) w = w.slice(0, -1);\n else if (CVC.test(w)) w += \"e\";\n }\n }\n\n // Step 1c\n if ((m = w.match(/^(.+?)y$/)) && HAS_VOWEL.test(m[1])) w = m[1] + \"i\";\n\n // Step 2\n if ((m = w.match(/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/))) {\n if (MGR0.test(m[1])) w = m[1] + STEP2[m[2]];\n }\n\n // Step 3\n if ((m = w.match(/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/))) {\n if (MGR0.test(m[1])) w = m[1] + STEP3[m[2]];\n }\n\n // Step 4\n if ((m = w.match(STEP4))) {\n if (MGR1.test(m[1])) w = m[1];\n } else if ((m = w.match(/^(.+?)(s|t)(ion)$/))) {\n const base = m[1] + m[2];\n if (MGR1.test(base)) w = base;\n }\n\n // Step 5\n if ((m = w.match(/^(.+?)e$/))) {\n const base = m[1];\n if (MGR1.test(base) || (MEQ1.test(base) && !CVC.test(base))) w = base;\n }\n if (/ll$/.test(w) && MGR1.test(w)) w = w.slice(0, -1);\n\n if (firstY) w = \"y\" + w.slice(1);\n return w;\n}\n","import type { Memory, MemoryType } from \"../types.js\";\nimport type { StorageProvider } from \"../interfaces.js\";\nimport { documentTerms, queryTerms } from \"./text.js\";\n\nexport interface RecallQuery {\n /** Namespaces to recall from, matched exactly against `actorId`, e.g. `[\"project:abc\", \"global\"]`. */\n actorIds: string[];\n /** Free text. When empty or without words, recall returns the fallback. */\n query?: string;\n memoryTypes?: MemoryType[];\n /** Maximum memories returned. Default 10. */\n limit?: number;\n /** Maximum total characters of returned content. The top result is always returned. Default 8000. */\n maxChars?: number;\n}\n\nexport interface RecallHit {\n memory: Memory;\n /** BM25 score, or 0 for fallback results. */\n score: number;\n}\n\nexport interface RecallResult {\n hits: RecallHit[];\n /** True when nothing matched the query and the hits are the most important and recent memories. */\n fallback: boolean;\n}\n\nexport interface LexicalRetrieverConfig {\n /** Memories loaded per namespace for ranking, most important first. Default 2000. */\n candidateLimit?: number;\n /** Mark returned memories as accessed via `storage.touch`. Default true. */\n touch?: boolean;\n}\n\n// BM25 parameters; the usual defaults.\nconst K1 = 1.2;\nconst B = 0.75;\n// A query term that only prefixes a document term (\"hon\" for \"hono\") scores at this weight.\nconst PREFIX_WEIGHT = 0.5;\nconst MIN_PREFIX_LENGTH = 3;\n\ninterface Candidate {\n memory: Memory;\n terms: Map<string, number>;\n length: number;\n}\n\n/**\n * Recall that works on every storage adapter: memories in scope are loaded\n * through `StorageProvider.retrieve` and ranked in Core with BM25 over\n * content and tags. Adapters with native `search()` are used instead when\n * they declare `textSearch`. Recall never calls an LLM.\n */\nexport class LexicalRetriever {\n private candidateLimit: number;\n private touch: boolean;\n\n constructor(private storage: StorageProvider, config: LexicalRetrieverConfig = {}) {\n this.candidateLimit = config.candidateLimit ?? 2000;\n this.touch = config.touch ?? true;\n }\n\n async recall(query: RecallQuery): Promise<RecallResult> {\n const limit = query.limit ?? 10;\n const maxChars = query.maxChars ?? 8000;\n const terms = queryTerms(query.query ?? \"\");\n\n let ranked: RecallHit[] = [];\n let candidates: Memory[] | undefined;\n\n if (terms.length > 0 && this.storage.search && this.storage.capabilities?.textSearch) {\n ranked = (await this.storage.search({\n actorIds: query.actorIds,\n query: query.query!,\n memoryTypes: query.memoryTypes,\n limit: this.candidateLimit,\n })).map(({ memory, score }) => ({ memory, score }));\n } else if (terms.length > 0) {\n candidates = await this.loadCandidates(query);\n ranked = rank(candidates, terms);\n }\n\n const fallback = ranked.length === 0;\n if (fallback) {\n candidates ??= await this.loadCandidates(query);\n ranked = [...candidates].sort(byImportanceThenRecency).map((memory) => ({ memory, score: 0 }));\n }\n\n const hits = withinBudget(ranked, limit, maxChars);\n if (this.touch) await this.touchAll(hits);\n return { hits, fallback };\n }\n\n private async loadCandidates(query: RecallQuery): Promise<Memory[]> {\n const byId = new Map<string, Memory>();\n for (const actorId of new Set(query.actorIds)) {\n const memories = await this.storage.retrieve({\n actorId,\n memoryTypes: query.memoryTypes,\n limit: this.candidateLimit,\n strategy: \"important\",\n touch: false,\n });\n for (const memory of memories) byId.set(memory.id, memory);\n }\n return [...byId.values()];\n }\n\n private async touchAll(hits: RecallHit[]): Promise<void> {\n if (!this.storage.touch) return;\n await Promise.all(\n hits.map(({ memory }) =>\n this.storage.touch!(memory.id).catch(() => {\n // Deleted by another process since it was loaded; nothing to mark.\n })\n )\n );\n }\n}\n\nfunction rank(memories: Memory[], terms: string[]): RecallHit[] {\n if (memories.length === 0) return [];\n const candidates: Candidate[] = memories.map((memory) => {\n const tokens = documentTerms(`${memory.content} ${memory.tags.join(\" \")}`);\n const counts = new Map<string, number>();\n for (const token of tokens) counts.set(token, (counts.get(token) ?? 0) + 1);\n return { memory, terms: counts, length: tokens.length };\n });\n\n const avgLength = candidates.reduce((sum, c) => sum + c.length, 0) / candidates.length || 1;\n const n = candidates.length;\n\n // Frequency of each query term per candidate: exact matches count fully, prefix matches partially.\n const frequencies = terms.map((term) =>\n candidates.map((c) => {\n let tf = c.terms.get(term) ?? 0;\n if (term.length >= MIN_PREFIX_LENGTH) {\n for (const [docTerm, count] of c.terms) {\n if (docTerm !== term && docTerm.startsWith(term)) tf += count * PREFIX_WEIGHT;\n }\n }\n return tf;\n })\n );\n\n const hits: RecallHit[] = [];\n candidates.forEach((c, i) => {\n let score = 0;\n frequencies.forEach((perCandidate) => {\n const tf = perCandidate[i];\n if (tf === 0) return;\n const df = perCandidate.filter((f) => f > 0).length;\n const idf = Math.log(1 + (n - df + 0.5) / (df + 0.5));\n score += idf * ((tf * (K1 + 1)) / (tf + K1 * (1 - B + (B * c.length) / avgLength)));\n });\n if (score > 0) hits.push({ memory: c.memory, score });\n });\n\n return hits.sort((a, b) => b.score - a.score || byImportanceThenRecency(a.memory, b.memory));\n}\n\nfunction byImportanceThenRecency(a: Memory, b: Memory): number {\n return b.importance - a.importance || b.createdAt.getTime() - a.createdAt.getTime();\n}\n\nfunction withinBudget(ranked: RecallHit[], limit: number, maxChars: number): RecallHit[] {\n const hits: RecallHit[] = [];\n let chars = 0;\n for (const hit of ranked) {\n if (hits.length >= limit) break;\n const size = hit.memory.content.length;\n if (hits.length > 0 && chars + size > maxChars) continue;\n hits.push(hit);\n chars += size;\n }\n return hits;\n}\n","// Namespace values for harness memory, stored in `actorId`.\n// `global`, `project:`, and `session:` are reserved actorId values.\n\nexport const GLOBAL_NAMESPACE = \"global\";\n\nexport function projectNamespace(projectId: string): string {\n if (!projectId) throw new Error(\"projectId is required\");\n return `project:${projectId}`;\n}\n\nexport function sessionNamespace(projectId: string, sessionId: string): string {\n if (!projectId || !sessionId) throw new Error(\"projectId and sessionId are required\");\n return `session:${projectId}:${sessionId}`;\n}\n\n/** Namespaces a harness recalls from by default: the project, then global. */\nexport function defaultRecallNamespaces(projectId: string): string[] {\n return [projectNamespace(projectId), GLOBAL_NAMESPACE];\n}\n","import type { Memory, MemorySource, MemoryType } from \"../types.js\";\nimport type { LLMProvider, StorageProvider } from \"../interfaces.js\";\nimport { LexicalRetriever } from \"../retrieval/LexicalRetriever.js\";\nimport type { RecallResult } from \"../retrieval/LexicalRetriever.js\";\nimport { ENRICHMENT_MAX_TOKENS, parseTags } from \"../enrichment.js\";\nimport { MemStackError, notFound, validationError } from \"../errors.js\";\nimport { projectNamespace } from \"./namespaces.js\";\n\nexport interface HarnessMemoryConfig {\n storage: StorageProvider;\n llm: LLMProvider;\n /** Ask the LLM for topic tags on every write. Default true. */\n autoTags?: boolean;\n /** Give up on tagging after this long and store the memory untagged. Default 10000. */\n tagTimeoutMs?: number;\n /** Longest content accepted by `remember`. Default 8000 characters. */\n maxContentChars?: number;\n /** Memories ranked per namespace on recall. Default 2000. */\n candidateLimit?: number;\n /** Called when tagging fails; the memory is still stored. */\n onError?: (error: Error, context: string) => void;\n}\n\nexport interface RememberInput {\n /** Namespace to write to, used as `actorId`, e.g. `project:<id>` or `global`. */\n namespace: string;\n content: string;\n kind?: MemoryType;\n importance?: number;\n tags?: string[];\n source: MemorySource;\n}\n\nexport interface HarnessRecallInput {\n /** Namespaces to search together, e.g. `[\"project:<id>\", \"global\"]`. */\n namespaces: string[];\n query?: string;\n kinds?: MemoryType[];\n limit?: number;\n maxChars?: number;\n}\n\nconst MAX_TAGS = 8;\n\nconst TAG_PROMPT =\n \"You tag memories so they can be found later by keyword search. Return 3-5 lowercase, \" +\n \"single-word topic tags as a JSON array of strings, and nothing else. Include broader \" +\n \"category words a person might search for, not only words already in the text. \" +\n 'Example: for \"This project uses Hono\" return [\"framework\", \"backend\", \"web\", \"server\", \"hono\"].';\n\n/**\n * Memory operations for agent harnesses such as Claude Code and Codex.\n * Works on any storage adapter. Every read and delete is limited to the\n * namespaces the caller passes, so one project cannot see another's memories.\n * Recall never calls the LLM; only `remember` does, for tagging.\n */\nexport class HarnessMemory {\n private storage: StorageProvider;\n private llm: LLMProvider;\n private retriever: LexicalRetriever;\n private autoTags: boolean;\n private tagTimeoutMs: number;\n private maxContentChars: number;\n private onError?: (error: Error, context: string) => void;\n private initialized?: Promise<void>;\n\n constructor(config: HarnessMemoryConfig) {\n this.storage = config.storage;\n this.llm = config.llm;\n this.retriever = new LexicalRetriever(config.storage, { candidateLimit: config.candidateLimit });\n this.autoTags = config.autoTags ?? true;\n this.tagTimeoutMs = config.tagTimeoutMs ?? 10_000;\n this.maxContentChars = config.maxContentChars ?? 8000;\n this.onError = config.onError;\n }\n\n async remember(input: RememberInput): Promise<Memory> {\n const content = input.content.trim();\n if (!content) throw validationError(\"Memory content is empty\");\n if (content.length > this.maxContentChars) {\n throw validationError(`Memory content is longer than ${this.maxContentChars} characters`, {\n length: content.length,\n });\n }\n if (!input.namespace) throw validationError(\"Namespace is required\");\n if (input.importance !== undefined && !(input.importance >= 0 && input.importance <= 1)) {\n throw validationError(\"Importance must be between 0 and 1\", { importance: input.importance });\n }\n\n await this.ensureInit();\n const llmTags = this.autoTags ? await this.suggestTags(content) : [];\n const tags = [...new Set([...(input.tags ?? []), ...llmTags].map((t) => t.toLowerCase().trim()).filter(Boolean))];\n\n return this.storage.store({\n actorId: input.namespace,\n content,\n memoryType: input.kind ?? \"observation\",\n importance: input.importance ?? 0.5,\n tags: tags.slice(0, MAX_TAGS),\n metadata: { source: input.source },\n });\n }\n\n async recall(input: HarnessRecallInput): Promise<RecallResult> {\n await this.ensureInit();\n return this.retriever.recall({\n actorIds: input.namespaces,\n query: input.query,\n memoryTypes: input.kinds,\n limit: input.limit,\n maxChars: input.maxChars,\n });\n }\n\n /** The memory with this ID, or null when it does not exist or is outside `namespaces`. */\n async get(id: string, namespaces: string[]): Promise<Memory | null> {\n await this.ensureInit();\n const memory = await this.storage.get(id);\n return memory && namespaces.includes(memory.actorId) ? memory : null;\n }\n\n /** Delete a memory. Memories outside `namespaces` are reported as not found. */\n async forget(id: string, namespaces: string[]): Promise<void> {\n const memory = await this.get(id, namespaces);\n if (!memory) throw notFound(\"Memory\", id);\n await this.storage.delete(id);\n }\n\n /** Number of memories in each namespace. */\n async stats(namespaces: string[]): Promise<Record<string, number>> {\n await this.ensureInit();\n const counts: Record<string, number> = {};\n for (const namespace of new Set(namespaces)) {\n counts[namespace] = await this.storage.count({ actorId: namespace });\n }\n return counts;\n }\n\n /**\n * Moves every memory from one namespace to another, keeping content,\n * kind, importance, tags, provenance, and creation time. Memories get new\n * IDs. Used when a project's ID changes, e.g. after its first commit.\n * Safe to run from two processes at once: a copy whose original was\n * already moved by the other process is removed again.\n */\n async moveNamespace(from: string, to: string): Promise<number> {\n if (!from || !to) throw validationError(\"Both namespaces are required\");\n if (from === to) return 0;\n await this.ensureInit();\n let moved = 0;\n for (;;) {\n const batch = await this.storage.retrieve({ actorId: from, limit: 500, strategy: \"recent\", touch: false });\n if (batch.length === 0) return moved;\n let progressed = false;\n for (const memory of batch) {\n const copy = await this.storage.store({\n actorId: to,\n content: memory.content,\n memoryType: memory.memoryType,\n importance: memory.importance,\n emotionalValence: memory.emotionalValence,\n tags: memory.tags,\n metadata: memory.metadata,\n createdAt: memory.createdAt,\n expiresAt: memory.expiresAt,\n });\n try {\n await this.storage.delete(memory.id);\n moved++;\n progressed = true;\n } catch (error) {\n await this.storage.delete(copy.id);\n if (!(error instanceof MemStackError && error.code === \"NOT_FOUND\")) throw error;\n }\n }\n if (!progressed) return moved;\n }\n }\n\n /**\n * Adopts memories a project stored under IDs it had before, such as\n * before its first commit. Costs one count per previous ID when there is\n * nothing to move. Returns the number of memories moved.\n */\n async adoptProjects(previousIds: string[], projectId: string): Promise<number> {\n const target = projectNamespace(projectId);\n let moved = 0;\n for (const id of new Set(previousIds)) {\n const from = projectNamespace(id);\n if (from === target) continue;\n await this.ensureInit();\n if ((await this.storage.count({ actorId: from })) === 0) continue;\n moved += await this.moveNamespace(from, target);\n }\n return moved;\n }\n\n private ensureInit(): Promise<void> {\n this.initialized ??= this.storage.initialize().catch((error) => {\n this.initialized = undefined;\n throw error;\n });\n return this.initialized;\n }\n\n private async suggestTags(content: string): Promise<string[]> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(`Tagging timed out after ${this.tagTimeoutMs} ms`)), this.tagTimeoutMs);\n });\n const result = await Promise.race([\n this.llm.complete({ system: TAG_PROMPT, user: content, maxTokens: ENRICHMENT_MAX_TOKENS, temperature: 0 }),\n timeout,\n ]);\n if (!result.text.trim()) throw new Error(\"Tagging returned an empty reply\");\n return parseTags(result.text).filter((t) => /^[\\p{L}\\p{N}-]+$/u.test(t));\n } catch (error) {\n this.onError?.(error instanceof Error ? error : new Error(String(error)), \"harness-tagging\");\n return [];\n } finally {\n clearTimeout(timer);\n }\n }\n}\n","import { mkdir, readFile, writeFile, readdir, open, unlink, rename, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter, StorageCapabilities } from \"../../interfaces.js\";\nimport { storageError, notFound } from \"../../errors.js\";\n\ninterface MemoryRecord extends Memory {\n _touchedAt: string;\n}\n\nexport interface DiskStorageConfig {\n /** Directory to store memory files. Default: \"./memstack-data\" */\n storageDir?: string;\n}\n\nexport class DiskStorageAdapter implements StorageProvider {\n readonly capabilities: StorageCapabilities = { multiProcess: false };\n private dir: string;\n private _writeLocks = new Map<string, Promise<void>>();\n private _idIndex = new Map<string, string>();\n\n constructor(config: DiskStorageConfig = {}) {\n this.dir = config.storageDir ?? \"./memstack-data\";\n }\n\n async initialize(): Promise<void> {\n await mkdir(this.dir, { recursive: true });\n await this._buildIndex();\n }\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date();\n const memory: MemoryRecord = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? now,\n _touchedAt: now.toISOString(),\n };\n\n await this._withWriteLock(input.actorId, async () => {\n const records = await this._readFile(input.actorId);\n const existingIdx = records.findIndex((r) => r.id === memory.id);\n if (existingIdx !== -1) {\n records[existingIdx] = memory;\n } else {\n records.push(memory);\n }\n this._idIndex.set(memory.id, input.actorId);\n await this._writeFile(input.actorId, records);\n });\n\n return this._toExternal(memory);\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const byActor = new Map<string, MemoryRecord[]>();\n const now = new Date();\n const all: MemoryRecord[] = [];\n\n for (const input of inputs) {\n const memory: MemoryRecord = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? now,\n _touchedAt: now.toISOString(),\n };\n all.push(memory);\n const group = byActor.get(input.actorId) ?? [];\n group.push(memory);\n byActor.set(input.actorId, group);\n }\n\n for (const [actorId, group] of byActor) {\n await this._withWriteLock(actorId, async () => {\n const existing = await this._readFile(actorId);\n for (const mem of group) {\n const existingIdx = existing.findIndex((r) => r.id === mem.id);\n if (existingIdx !== -1) {\n existing[existingIdx] = mem;\n } else {\n existing.push(mem);\n }\n this._idIndex.set(mem.id, actorId);\n }\n await this._writeFile(actorId, existing);\n });\n }\n\n return all.map((m) => this._toExternal(m));\n }\n\n async get(id: string): Promise<Memory | null> {\n const actorId = this._idIndex.get(id);\n if (actorId) {\n const records = await this._readFile(actorId);\n const record = records.find((r) => r.id === id);\n if (record) {\n if (record.expiresAt && new Date(record.expiresAt) <= new Date()) return null;\n return this._toExternal(record);\n }\n }\n const actorIds = await this._listActors();\n for (const aid of actorIds) {\n const records = await this._readFile(aid);\n const record = records.find((r) => r.id === id);\n if (record) {\n this._idIndex.set(id, aid);\n if (record.expiresAt && new Date(record.expiresAt) <= new Date()) return null;\n return this._toExternal(record);\n }\n }\n return null;\n }\n\n async delete(id: string): Promise<void> {\n let actorId = this._idIndex.get(id);\n if (!actorId) {\n const actorIds = await this._listActors();\n for (const aid of actorIds) {\n const records = await this._readFile(aid);\n if (records.some((r) => r.id === id)) { actorId = aid; break; }\n }\n }\n if (!actorId) throw notFound(\"Memory\", id);\n\n let deleted = false;\n await this._withWriteLock(actorId, async () => {\n const fresh = await this._readFile(actorId);\n const i = fresh.findIndex((r) => r.id === id);\n if (i !== -1) {\n fresh.splice(i, 1);\n this._idIndex.delete(id);\n await this._writeFile(actorId, fresh);\n deleted = true;\n }\n });\n\n if (!deleted) throw notFound(\"Memory\", id);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n const idSet = new Set(ids);\n let count = 0;\n const actorIds = await this._listActors();\n\n for (const actorId of actorIds) {\n await this._withWriteLock(actorId, async () => {\n const records = await this._readFile(actorId);\n const before = records.length;\n const filtered = records.filter((r) => !idSet.has(r.id));\n count += before - filtered.length;\n if (before !== filtered.length) {\n for (const r of records) {\n if (idSet.has(r.id)) this._idIndex.delete(r.id);\n }\n await this._writeFile(actorId, filtered);\n }\n });\n }\n\n return count;\n }\n\n async retrieve(query: MemoryRetrieveQuery, _embedding?: number[]): Promise<Memory[]> {\n const actorIds = query.actorId ? [query.actorId] : await this._listActors();\n let results: MemoryRecord[] = [];\n\n for (const actorId of actorIds) {\n let records = await this._readFile(actorId);\n const now = new Date();\n records = records.filter((r) => !r.expiresAt || new Date(r.expiresAt) > now);\n\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n records = records.filter((r) => query.memoryTypes!.includes(r.memoryType));\n }\n if (query.tags && query.tags.length > 0) {\n records = records.filter((r) => r.tags?.some((t) => query.tags!.includes(t)));\n }\n if (query.query) {\n const terms = query.query.toLowerCase().split(/\\s+/).filter(Boolean);\n records = records.filter((r) => {\n const content = r.content.toLowerCase();\n return terms.some((t) => content.includes(t));\n });\n }\n\n results.push(...records);\n }\n\n switch (query.strategy) {\n case \"recent\":\n results.sort((a, b) => new Date(b._touchedAt).getTime() - new Date(a._touchedAt).getTime());\n break;\n case \"important\":\n results.sort((a, b) => b.importance - a.importance);\n break;\n case \"hybrid\":\n case \"semantic\":\n default:\n results.sort(\n (a, b) =>\n b.importance - a.importance || new Date(b._touchedAt).getTime() - new Date(a._touchedAt).getTime()\n );\n break;\n }\n\n if (query.touch !== false) {\n // Touch records on retrieval\n const nowStr = new Date().toISOString();\n const toTouch = results.slice(0, query.limit ?? 10);\n const touchedActors = new Set<string>();\n for (const r of toTouch) {\n r._touchedAt = nowStr;\n touchedActors.add(r.actorId);\n }\n // Persist touches back to disk\n for (const actorId of touchedActors) {\n await this._withWriteLock(actorId, async () => {\n const records = await this._readFile(actorId);\n let changed = false;\n for (const r of records) {\n const touched = toTouch.find((t) => t.id === r.id);\n if (touched) { r._touchedAt = nowStr; changed = true; }\n }\n if (changed) await this._writeFile(actorId, records);\n });\n }\n }\n\n const limit = query.limit ?? 10;\n return results.slice(0, limit).map((r) => this._toExternal(r));\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n const actorIds = filter?.actorId ? [filter.actorId] : await this._listActors();\n let total = 0;\n const now = new Date();\n\n for (const actorId of actorIds) {\n let records = await this._readFile(actorId);\n records = records.filter((r) => !r.expiresAt || new Date(r.expiresAt) > now);\n\n if (filter?.memoryType) {\n records = records.filter((r) => r.memoryType === filter.memoryType);\n }\n if (filter?.minImportance !== undefined) {\n records = records.filter((r) => r.importance >= filter.minImportance!);\n }\n total += records.length;\n }\n\n return total;\n }\n\n async touch(id: string): Promise<void> {\n const actorId = this._idIndex.get(id);\n if (!actorId) throw notFound(\"Memory\", id);\n\n const nowStr = new Date().toISOString();\n await this._withWriteLock(actorId, async () => {\n const fresh = await this._readFile(actorId);\n const match = fresh.find((r) => r.id === id);\n if (!match) throw notFound(\"Memory\", id);\n match._touchedAt = nowStr;\n await this._writeFile(actorId, fresh);\n });\n }\n\n async close(): Promise<void> {\n this._writeLocks.clear();\n }\n\n // ── Internal ──\n\n private _filePath(actorId: string): string {\n const safe = actorId.replace(/[^a-zA-Z0-9_\\-.,@]/g, \"_\");\n return join(this.dir, `${safe}.json`);\n }\n\n private async _readFile(actorId: string): Promise<MemoryRecord[]> {\n try {\n const raw = await readFile(this._filePath(actorId), \"utf-8\");\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as MemoryRecord[]) : [];\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw storageError(`Failed to read memories for actor ${actorId}: ${(err as Error).message}`);\n }\n }\n\n private async _writeFile(actorId: string, records: MemoryRecord[]): Promise<void> {\n const filePath = this._filePath(actorId);\n // Write-then-rename instead of an in-place write: `rename` is atomic on\n // POSIX filesystems, so a concurrent reader (get/retrieve, which don't\n // take the write lock) never observes a partially-written file.\n const tmpPath = `${filePath}.${process.pid}.${Date.now().toString(36)}.tmp`;\n try {\n await writeFile(tmpPath, JSON.stringify(records, null, 2), \"utf-8\");\n await rename(tmpPath, filePath);\n } catch (err) {\n await unlink(tmpPath).catch(() => {});\n throw storageError(`Failed to write memories for actor ${actorId}: ${(err as Error).message}`);\n }\n }\n\n private async _withWriteLock(actorId: string, fn: () => Promise<void>): Promise<void> {\n // In-process serialization: cheap, and avoids every same-process caller\n // hitting the cross-process lockfile's retry loop for no reason.\n const prev = this._writeLocks.get(actorId) ?? Promise.resolve();\n let resolve!: () => void;\n const next = new Promise<void>((r) => { resolve = r; });\n this._writeLocks.set(actorId, next);\n await prev;\n // Cross-process serialization: the in-process chain above only protects\n // callers sharing this adapter instance. Separate OS processes (e.g. two\n // `memstack` CLI invocations, or multiple server workers) each have their\n // own instance and their own copy of `_writeLocks`, so without this an\n // interleaved read-modify-write across processes silently loses updates.\n const releaseFileLock = await this._acquireFileLock(actorId);\n try {\n await fn();\n } finally {\n await releaseFileLock();\n resolve();\n // Clean up: only remove this entry if it hasn't been replaced by a newer lock\n if (this._writeLocks.get(actorId) === next) {\n this._writeLocks.delete(actorId);\n }\n }\n }\n\n /**\n * Acquires an exclusive cross-process lock for `actorId` via `open(path, \"wx\")`\n * (atomic create-if-absent). Retries with jittered backoff while the lock is\n * held elsewhere, and steals locks left behind by a crashed process once\n * they're older than `staleMs`.\n */\n private async _acquireFileLock(actorId: string): Promise<() => Promise<void>> {\n const lockPath = `${this._filePath(actorId)}.lock`;\n const staleMs = 10_000;\n const timeoutMs = 30_000;\n const start = Date.now();\n\n while (true) {\n try {\n const handle = await open(lockPath, \"wx\");\n await handle.close();\n return async () => {\n await unlink(lockPath).catch(() => {});\n };\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw storageError(`Failed to acquire lock for actor ${actorId}: ${(err as Error).message}`);\n }\n try {\n const st = await stat(lockPath);\n if (Date.now() - st.mtimeMs > staleMs) {\n await unlink(lockPath).catch(() => {});\n continue;\n }\n } catch {\n continue; // lock file disappeared between EEXIST and stat — retry immediately\n }\n if (Date.now() - start > timeoutMs) {\n throw storageError(`Timed out waiting for disk storage lock: ${lockPath}`);\n }\n await new Promise((r) => setTimeout(r, 15 + Math.random() * 35));\n }\n }\n }\n\n private async _listActors(): Promise<string[]> {\n try {\n const entries = await readdir(this.dir);\n return entries.filter((e) => e.endsWith(\".json\")).map((e) => e.slice(0, -5));\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw storageError(`Failed to list actors: ${(err as Error).message}`);\n }\n }\n\n private async _buildIndex(): Promise<void> {\n const actorIds = await this._listActors();\n for (const actorId of actorIds) {\n const records = await this._readFile(actorId);\n for (const r of records) {\n this._idIndex.set(r.id, actorId);\n }\n }\n }\n\n private _toExternal(record: MemoryRecord): Memory {\n const { _touchedAt: _, ...rest } = record;\n return {\n ...rest,\n createdAt: new Date(record.createdAt),\n expiresAt: record.expiresAt ? new Date(record.expiresAt) : undefined,\n };\n }\n}\n","import { mkdir, readFile, writeFile, appendFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter, StorageCapabilities } from \"../../interfaces.js\";\nimport { storageError, notFound } from \"../../errors.js\";\n\nexport interface MarkdownStorageConfig {\n dir: string;\n oneFilePerActor?: boolean;\n}\n\nexport class MarkdownStorageAdapter implements StorageProvider {\n readonly capabilities: StorageCapabilities = { multiProcess: false };\n private dir: string;\n private oneFilePerActor: boolean;\n private _cache: Map<string, Memory> | null = null;\n private _deletedIds: Set<string> = new Set();\n private _cacheDirty: boolean = true;\n\n constructor(config: MarkdownStorageConfig) {\n this.dir = config.dir;\n this.oneFilePerActor = config.oneFilePerActor ?? true;\n }\n\n async initialize(): Promise<void> {\n await mkdir(this.dir, { recursive: true });\n }\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date();\n const memory: Memory = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? now,\n };\n\n const filePath = this._filePath(input.actorId);\n const block = this._formatBlock(memory);\n await appendFile(filePath, block, \"utf-8\");\n this._cacheDirty = true;\n return memory;\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const results: Memory[] = [];\n for (const input of inputs) {\n results.push(await this.store(input));\n }\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n await this._ensureCache();\n const memory = this._cache!.get(id);\n if (!memory) return null;\n if (memory.expiresAt && memory.expiresAt <= new Date()) return null;\n if (this._deletedIds.has(id)) return null;\n return memory;\n }\n\n async delete(id: string): Promise<void> {\n await this._ensureCache();\n const memory = this._cache!.get(id);\n if (!memory || this._deletedIds.has(id)) {\n throw notFound(\"Memory\", id);\n }\n if (memory.expiresAt && memory.expiresAt <= new Date()) {\n throw notFound(\"Memory\", id);\n }\n\n const filePath = this._filePath(memory.actorId);\n const tombstone = this._formatTombstone(id);\n await appendFile(filePath, tombstone, \"utf-8\");\n this._cacheDirty = true;\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n await this._ensureCache();\n const idSet = new Set(ids);\n \n const toDelete: { id: string; actorId: string }[] = [];\n for (const id of ids) {\n const memory = this._cache!.get(id);\n if (memory && !this._deletedIds.has(id)) {\n if (!memory.expiresAt || memory.expiresAt > new Date()) {\n toDelete.push({ id, actorId: memory.actorId });\n }\n }\n }\n\n const byActor = new Map<string, string[]>();\n for (const { id, actorId } of toDelete) {\n const group = byActor.get(actorId) ?? [];\n group.push(id);\n byActor.set(actorId, group);\n }\n\n for (const [actorId, groupIds] of byActor) {\n const filePath = this._filePath(actorId);\n const blocks = groupIds.map((gid) => this._formatTombstone(gid)).join(\"\");\n await appendFile(filePath, blocks, \"utf-8\");\n }\n\n this._cacheDirty = true;\n return toDelete.length;\n }\n\n async retrieve(query: MemoryRetrieveQuery, _embedding?: number[]): Promise<Memory[]> {\n await this._ensureCache();\n const now = new Date();\n let results = Array.from(this._cache!.values())\n .filter((m) => !this._deletedIds.has(m.id))\n .filter((m) => !m.expiresAt || m.expiresAt > now);\n\n if (query.actorId) {\n results = results.filter((m) => m.actorId === query.actorId);\n }\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n results = results.filter((m) => query.memoryTypes!.includes(m.memoryType));\n }\n if (query.tags && query.tags.length > 0) {\n results = results.filter((m) => m.tags?.some((t) => query.tags!.includes(t)));\n }\n if (query.query) {\n const terms = query.query.toLowerCase().split(/\\s+/).filter(Boolean);\n results = results.filter((m) => {\n const content = m.content.toLowerCase();\n return terms.some((t) => content.includes(t));\n });\n }\n\n switch (query.strategy) {\n case \"recent\":\n results.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());\n break;\n case \"important\":\n results.sort((a, b) => b.importance - a.importance);\n break;\n case \"hybrid\":\n case \"semantic\":\n default:\n results.sort(\n (a, b) => b.importance - a.importance || b.createdAt.getTime() - a.createdAt.getTime()\n );\n break;\n }\n\n const limit = query.limit ?? 10;\n return results.slice(0, limit);\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n await this._ensureCache();\n const now = new Date();\n let results = Array.from(this._cache!.values())\n .filter((m) => !this._deletedIds.has(m.id))\n .filter((m) => !m.expiresAt || m.expiresAt > now);\n\n if (filter?.actorId) {\n results = results.filter((m) => m.actorId === filter.actorId);\n }\n if (filter?.memoryType) {\n results = results.filter((m) => m.memoryType === filter.memoryType);\n }\n if (filter?.minImportance !== undefined) {\n results = results.filter((m) => m.importance >= filter.minImportance!);\n }\n return results.length;\n }\n\n async close(): Promise<void> {\n this._cache = null;\n this._deletedIds.clear();\n this._cacheDirty = true;\n }\n\n async vacuum(): Promise<void> {\n if (this.oneFilePerActor) {\n const actorIds = await this._listActors();\n for (const actorId of actorIds) {\n await this._vacuumFile(this._filePath(actorId));\n }\n } else {\n await this._vacuumFile(this._filePath(\"\"));\n }\n this._cacheDirty = true;\n }\n\n // ── Internal ──\n\n private _filePath(actorId: string): string {\n if (!this.oneFilePerActor) {\n return join(this.dir, \"memories.md\");\n }\n const safe = actorId.replace(/[^a-zA-Z0-9_\\-.,@]/g, \"_\");\n return join(this.dir, `${safe}.md`);\n }\n\n private _formatBlock(memory: Memory): string {\n const iso = memory.createdAt.toISOString();\n const meta = JSON.stringify({\n id: memory.id,\n actorId: memory.actorId,\n memoryType: memory.memoryType,\n importance: memory.importance,\n emotionalValence: memory.emotionalValence,\n tags: memory.tags,\n embedding: memory.embedding,\n sourceId: memory.sourceId ?? null,\n metadata: memory.metadata ?? {},\n createdAt: memory.createdAt.toISOString(),\n expiresAt: memory.expiresAt?.toISOString() ?? null,\n });\n return `## ${iso}\\n\\n~~~json\\n${meta}\\n~~~\\n\\n${memory.content}\\n\\n---\\n`;\n }\n\n private _formatTombstone(id: string): string {\n const iso = new Date().toISOString();\n return `## ${iso}\\n\\n<!-- deleted: ${id} -->\\n\\n---\\n`;\n }\n\n private async _ensureCache(): Promise<void> {\n if (!this._cacheDirty) return;\n\n const allMemories = new Map<string, Memory>();\n const allDeletedIds = new Set<string>();\n\n if (this.oneFilePerActor) {\n const actorIds = await this._listActors();\n for (const actorId of actorIds) {\n const { memories, deletedIds } = await this._parseFile(this._filePath(actorId));\n for (const mem of memories) {\n allMemories.set(mem.id, mem);\n }\n for (const did of deletedIds) {\n allDeletedIds.add(did);\n }\n }\n } else {\n const { memories, deletedIds } = await this._parseFile(this._filePath(\"\"));\n for (const mem of memories) {\n allMemories.set(mem.id, mem);\n }\n for (const did of deletedIds) {\n allDeletedIds.add(did);\n }\n }\n\n this._cache = allMemories;\n this._deletedIds = allDeletedIds;\n this._cacheDirty = false;\n }\n\n private async _parseFile(filePath: string): Promise<{ memories: Memory[]; deletedIds: string[] }> {\n let raw: string;\n try {\n raw = await readFile(filePath, \"utf-8\");\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { memories: [], deletedIds: [] };\n }\n throw storageError(`Failed to read file ${filePath}: ${(err as Error).message}`);\n }\n\n const memories: Memory[] = [];\n const deletedIds: string[] = [];\n\n const sections = raw.split(\"\\n---\\n\");\n\n for (const section of sections) {\n const trimmed = section.trim();\n if (!trimmed) continue;\n\n const cleanBlock = trimmed.replace(/\\n---$/, \"\");\n const lines = cleanBlock.split(\"\\n\");\n let i = 0;\n\n if (!lines[i]?.startsWith(\"## \")) continue;\n i++;\n\n while (i < lines.length && lines[i].trim() === \"\") i++;\n if (i >= lines.length) continue;\n\n const tombstoneMatch = lines[i].trim().match(/^<!-- deleted:\\s*(\\S+)\\s*-->/);\n if (tombstoneMatch) {\n deletedIds.push(tombstoneMatch[1]);\n continue;\n }\n\n if (lines[i].trim() !== \"~~~json\") continue;\n i++;\n\n const jsonLines: string[] = [];\n while (i < lines.length && lines[i].trim() !== \"~~~\") {\n jsonLines.push(lines[i]);\n i++;\n }\n i++;\n\n let metadata: Record<string, unknown> | null = null;\n try {\n metadata = JSON.parse(jsonLines.join(\"\\n\"));\n } catch {\n continue;\n }\n\n while (i < lines.length && lines[i].trim() === \"\") i++;\n\n const contentLines: string[] = [];\n while (i < lines.length) {\n contentLines.push(lines[i]);\n i++;\n }\n const content = contentLines.join(\"\\n\").trim();\n\n if (metadata && typeof metadata.id === \"string\") {\n memories.push({\n id: metadata.id,\n actorId: metadata.actorId as string,\n memoryType: (metadata.memoryType as MemoryType) ?? \"interaction\",\n content,\n importance: (metadata.importance as number) ?? 0.5,\n emotionalValence: (metadata.emotionalValence as number) ?? 0,\n tags: (metadata.tags as string[]) ?? [],\n embedding: metadata.embedding as number[] | undefined,\n sourceId: (metadata.sourceId as string | undefined) ?? undefined,\n metadata: (metadata.metadata as Record<string, unknown>) ?? {},\n createdAt: new Date(metadata.createdAt as string),\n expiresAt: metadata.expiresAt ? new Date(metadata.expiresAt as string) : undefined,\n });\n }\n }\n\n return { memories, deletedIds };\n }\n\n private async _vacuumFile(filePath: string): Promise<void> {\n await this._ensureCache();\n\n let raw: string;\n try {\n raw = await readFile(filePath, \"utf-8\");\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return;\n throw storageError(`Failed to read file for vacuum: ${(err as Error).message}`);\n }\n\n const sections = raw.split(\"\\n---\\n\");\n const kept: string[] = [];\n\n for (const section of sections) {\n const trimmed = section.trim();\n if (!trimmed) continue;\n\n const cleanBlock = trimmed.replace(/\\n---$/, \"\");\n const lines = cleanBlock.split(\"\\n\");\n let i = 0;\n\n if (!lines[i]?.startsWith(\"## \")) {\n kept.push(trimmed);\n continue;\n }\n i++;\n\n while (i < lines.length && lines[i].trim() === \"\") i++;\n if (i >= lines.length) {\n kept.push(trimmed);\n continue;\n }\n\n const tombstoneMatch = lines[i].trim().match(/^<!-- deleted:\\s*(\\S+)\\s*-->/);\n if (tombstoneMatch) continue;\n\n if (lines[i].trim() !== \"~~~json\") {\n kept.push(trimmed);\n continue;\n }\n i++;\n\n while (i < lines.length && lines[i].trim() !== \"~~~\") i++;\n i++;\n\n while (i < lines.length && lines[i].trim() === \"\") i++;\n\n const contentLines: string[] = [];\n while (i < lines.length) {\n contentLines.push(lines[i]);\n i++;\n }\n\n try {\n const jsonStartIdx = lines.findIndex((l) => l.trim() === \"~~~json\");\n const jsonEndIdx = lines.findIndex((l, idx) => idx > jsonStartIdx && l.trim() === \"~~~\");\n const jsonText = lines.slice(jsonStartIdx + 1, jsonEndIdx).join(\"\\n\");\n const meta = JSON.parse(jsonText);\n if (this._deletedIds.has(meta.id)) continue;\n } catch {\n // Keep block if we can't parse its metadata\n }\n\n const content = contentLines.join(\"\\n\").trim();\n if (content || trimmed.includes(\"~~~json\")) {\n kept.push(trimmed);\n }\n }\n\n const output = kept.length > 0 ? kept.join(\"\\n---\\n\") + \"\\n---\\n\" : \"\";\n await writeFile(filePath, output, \"utf-8\");\n }\n\n private async _listActors(): Promise<string[]> {\n try {\n const entries = await readdir(this.dir);\n return entries.filter((e) => e.endsWith(\".md\")).map((e) => e.slice(0, -3));\n } catch (err: unknown) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n throw storageError(`Failed to list actors: ${(err as Error).message}`);\n }\n }\n}\n","import type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter } from \"../../interfaces.js\";\nimport type { Memory } from \"../../types.js\";\nexport interface HybridStorageConfig {\n cache: StorageProvider;\n durable: StorageProvider;\n writeBoth?: boolean;\n readFromCache?: boolean;\n syncOnInit?: boolean;\n}\n\nexport class HybridStorageAdapter implements StorageProvider {\n private cache: StorageProvider;\n private durable: StorageProvider;\n private writeBoth: boolean;\n private readFromCache: boolean;\n private syncOnInit: boolean;\n\n constructor(config: HybridStorageConfig) {\n this.cache = config.cache;\n this.durable = config.durable;\n this.writeBoth = config.writeBoth ?? true;\n this.readFromCache = config.readFromCache ?? true;\n this.syncOnInit = config.syncOnInit ?? false;\n }\n\n async initialize(): Promise<void> {\n await Promise.all([this.cache.initialize(), this.durable.initialize()]);\n\n if (this.syncOnInit) {\n const results = await this.durable.retrieve({ limit: 100000 });\n if (results.length > 0) {\n await this.cache.storeBatch(results.map((m) => ({\n actorId: m.actorId,\n content: m.content,\n memoryType: m.memoryType,\n importance: m.importance,\n emotionalValence: m.emotionalValence,\n tags: m.tags,\n embedding: m.embedding,\n sourceId: m.sourceId,\n metadata: m.metadata,\n expiresAt: m.expiresAt,\n id: m.id,\n }))).catch(() => {});\n }\n }\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const result = await this.durable.store(input);\n\n if (this.writeBoth) {\n try {\n await this.cache.store({ ...input, id: result.id });\n } catch {}\n }\n\n return result;\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const results = await this.durable.storeBatch(inputs);\n\n if (this.writeBoth) {\n const cacheInputs: MemoryStoreInput[] = results.map((r, i) => ({\n ...inputs[i],\n id: r.id,\n }));\n try {\n await this.cache.storeBatch(cacheInputs);\n } catch {}\n }\n\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n if (this.readFromCache) {\n const cached = await this.cache.get(id);\n if (cached) return cached;\n\n const result = await this.durable.get(id);\n if (result) {\n try { await this.cache.store({\n actorId: result.actorId,\n content: result.content,\n memoryType: result.memoryType,\n importance: result.importance,\n emotionalValence: result.emotionalValence,\n tags: result.tags,\n embedding: result.embedding,\n sourceId: result.sourceId,\n metadata: result.metadata,\n expiresAt: result.expiresAt,\n id: result.id,\n }); } catch {}\n }\n return result;\n }\n\n return this.durable.get(id);\n }\n\n async retrieve(query: MemoryRetrieveQuery, embedding?: number[]): Promise<Memory[]> {\n if (this.readFromCache) {\n const cached = await this.cache.retrieve(query, embedding);\n if (cached.length > 0) return cached;\n\n const results = await this.durable.retrieve(query, embedding);\n if (results.length > 0) {\n const inputs: MemoryStoreInput[] = results.map((r) => ({\n actorId: r.actorId,\n content: r.content,\n memoryType: r.memoryType,\n importance: r.importance,\n emotionalValence: r.emotionalValence,\n tags: r.tags,\n embedding: r.embedding,\n sourceId: r.sourceId,\n metadata: r.metadata,\n expiresAt: r.expiresAt,\n id: r.id,\n }));\n try { await this.cache.storeBatch(inputs); } catch {}\n }\n return results;\n }\n\n return this.durable.retrieve(query, embedding);\n }\n\n async delete(id: string): Promise<void> {\n const results = await Promise.allSettled([\n this.cache.delete(id),\n this.durable.delete(id),\n ]);\n\n const durableResult = results[1];\n if (durableResult.status === \"rejected\") {\n throw durableResult.reason;\n }\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n const [cacheResult, durableCount] = await Promise.all([\n this.cache.deleteMany(ids).catch(() => 0),\n this.durable.deleteMany(ids),\n ]);\n\n return durableCount;\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n return this.durable.count(filter);\n }\n\n async touch(id: string): Promise<void> {\n if (this.durable.touch) {\n await this.durable.touch(id);\n }\n }\n\n async close(): Promise<void> {\n await Promise.all([this.cache.close(), this.durable.close()]);\n }\n}\n","import type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter, StorageCapabilities } from \"../../interfaces.js\";\nimport { notFound, configError } from \"../../errors.js\";\n\ntype PgPool = {\n query(text: string, params?: unknown[]): Promise<{ rows: unknown[] }>;\n end?: () => Promise<void>;\n};\n\ninterface PgMemoryRow {\n id: string;\n actor_id: string;\n memory_type: string;\n content: string;\n importance: number;\n emotional_valence: number;\n tags: string[];\n embedding: number[] | null;\n source_id: string | null;\n metadata: Record<string, unknown>;\n expires_at: string | null;\n created_at: string;\n touched_at: string;\n}\n\nexport interface PostgresStorageConfig {\n pool?: PgPool;\n connectionString?: string;\n host?: string; port?: number; database?: string; user?: string; password?: string;\n tableName?: string;\n vectorDimensions?: number;\n ssl?: boolean | object;\n}\n\nexport class PostgresStorageAdapter implements StorageProvider {\n readonly capabilities: StorageCapabilities = { multiProcess: true };\n private pool!: PgPool;\n private table: string;\n private vectorDimensions: number;\n private _ownsPool = false;\n\n constructor(config: PostgresStorageConfig) {\n this.table = config.tableName ?? \"memstack_memories\";\n if (!/^[a-zA-Z0-9_]+$/.test(this.table)) {\n throw configError(`Invalid table name: \"${this.table}\". Use only alphanumeric characters and underscores.`);\n }\n this.vectorDimensions = config.vectorDimensions ?? 1536;\n\n if (config.pool) {\n this.pool = config.pool;\n } else if (config.connectionString) {\n this._connectionString = config.connectionString;\n this._ssl = config.ssl;\n } else if (config.host || config.database || config.user) {\n this._connParts = { host: config.host, port: config.port, database: config.database, user: config.user, password: config.password, ssl: config.ssl };\n } else {\n throw configError(\"PostgresStorageAdapter requires a pool, connectionString, or connection details\");\n }\n }\n\n private _connectionString?: string;\n private _connParts?: { host?: string; port?: number; database?: string; user?: string; password?: string; ssl?: boolean | object };\n private _ssl?: boolean | object;\n\n async initialize(): Promise<void> {\n if (this._connectionString || this._connParts) {\n this.pool = await this._createPool();\n this._ownsPool = true;\n }\n\n await this._runMigration();\n }\n\n private async _createPool(): Promise<PgPool> {\n const connStr = this._connectionString ?? this._buildConnString();\n\n try {\n const { default: createPostgres } = await import(\"postgres\");\n // postgres.js logs server notices with console.log by default, which\n // corrupts stdout-based protocols such as MCP stdio.\n const options: Record<string, unknown> = { onnotice: () => {} };\n if (this._ssl) {\n options.ssl = typeof this._ssl === \"object\" ? this._ssl : \"require\";\n }\n const sql = createPostgres(connStr, options) as { unsafe: (t: string, p: unknown[]) => Promise<unknown[]>; end: () => Promise<void> };\n return {\n query: (text: string, params?: unknown[]) =>\n sql.unsafe(text, params as never[]).then((r: unknown[]) => ({ rows: r })),\n end: () => sql.end(),\n };\n } catch {\n try {\n // @ts-expect-error — optional peer dep without bundled declarations\n const { Pool } = await import(\"pg\");\n const pool = new Pool({ connectionString: connStr, ssl: this._ssl }) as PgPool & { end: () => Promise<void> };\n return { query: (text: string, params?: unknown[]) => pool.query(text, params), end: () => pool.end() };\n } catch {\n throw configError(\"connectionString requires 'postgres' (postgres.js) or 'pg' (node-postgres) to be installed\");\n }\n }\n }\n\n private _buildConnString(): string {\n const p = this._connParts!;\n const host = p.host ?? \"localhost\";\n const port = p.port ?? 5432;\n const db = p.database ?? \"postgres\";\n const user = encodeURIComponent(p.user ?? \"postgres\");\n const pw = p.password ? `:${encodeURIComponent(p.password)}` : \"\";\n let connStr = `postgres://${user}${pw}@${host}:${port}/${db}`;\n if (this._ssl) {\n const sslmode = typeof this._ssl === \"object\" ? \"no-verify\" : \"require\";\n connStr += `?sslmode=${sslmode}`;\n }\n return connStr;\n }\n\n // One DO block, so it runs in a single transaction on one connection: the\n // advisory lock makes processes that start together (Claude Code and Codex)\n // migrate one at a time instead of racing on CREATE ... IF NOT EXISTS,\n // which Postgres reports as a duplicate key in pg_type.\n private async _runMigration(): Promise<void> {\n await this.pool.query(`\n DO $memstack$\n BEGIN\n PERFORM pg_advisory_xact_lock(hashtext('memstack:migrate:${this.table}'));\n BEGIN\n CREATE EXTENSION IF NOT EXISTS vector;\n EXCEPTION WHEN OTHERS THEN\n NULL; -- pgvector may not be available\n END;\n CREATE TABLE IF NOT EXISTS ${this.table} (\n id TEXT PRIMARY KEY,\n actor_id TEXT NOT NULL,\n memory_type TEXT NOT NULL DEFAULT 'interaction',\n content TEXT NOT NULL,\n importance REAL NOT NULL DEFAULT 0.5,\n emotional_valence REAL NOT NULL DEFAULT 0,\n tags JSONB NOT NULL DEFAULT '[]',\n embedding vector(${this.vectorDimensions}),\n source_id TEXT,\n metadata JSONB NOT NULL DEFAULT '{}',\n expires_at TIMESTAMPTZ,\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n touched_at TIMESTAMPTZ NOT NULL DEFAULT NOW()\n );\n BEGIN\n CREATE INDEX IF NOT EXISTS idx_${this.table}_actor ON ${this.table} (actor_id);\n CREATE INDEX IF NOT EXISTS idx_${this.table}_created ON ${this.table} (created_at DESC);\n CREATE INDEX IF NOT EXISTS idx_${this.table}_importance ON ${this.table} (importance DESC);\n EXCEPTION WHEN OTHERS THEN\n NULL; -- index creation may fail; non-critical\n END;\n BEGIN\n CREATE INDEX IF NOT EXISTS idx_${this.table}_embedding ON ${this.table} USING hnsw (embedding vector_cosine_ops) WITH (m = 16, ef_construction = 64);\n EXCEPTION WHEN OTHERS THEN\n NULL; -- index creation may fail; non-critical\n END;\n END\n $memstack$\n `);\n }\n\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date().toISOString();\n const id = input.id ?? this.generateId();\n\n await this.pool.query(\n `INSERT INTO ${this.table} (id, actor_id, memory_type, content, importance, emotional_valence, tags, embedding, source_id, metadata, expires_at, created_at, touched_at)\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8::float8[]::vector, $9, $10, $11, $12, $13)\n ON CONFLICT (id) DO UPDATE SET\n content = EXCLUDED.content,\n importance = EXCLUDED.importance,\n emotional_valence = EXCLUDED.emotional_valence,\n tags = EXCLUDED.tags,\n embedding = EXCLUDED.embedding,\n source_id = EXCLUDED.source_id,\n metadata = EXCLUDED.metadata,\n expires_at = EXCLUDED.expires_at,\n touched_at = EXCLUDED.touched_at`,\n [\n id,\n input.actorId,\n input.memoryType ?? \"interaction\",\n input.content,\n input.importance ?? 0.5,\n input.emotionalValence ?? 0,\n JSON.stringify(input.tags ?? []),\n input.embedding ? `{${input.embedding.join(\",\")}}` : null,\n input.sourceId ?? null,\n JSON.stringify(input.metadata ?? {}),\n input.expiresAt?.toISOString() ?? null,\n now,\n now,\n ]\n );\n\n return {\n id,\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? new Date(now),\n };\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const results: Memory[] = [];\n for (const input of inputs) {\n results.push(await this.store(input));\n }\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n const { rows } = await this.pool.query(\n `SELECT * FROM ${this.table} WHERE id = $1 AND (expires_at IS NULL OR expires_at > NOW())`,\n [id]\n );\n if (rows.length === 0) return null;\n return this._rowToMemory(rows[0] as PgMemoryRow);\n }\n\n async delete(id: string): Promise<void> {\n const { rows } = await this.pool.query(`SELECT id FROM ${this.table} WHERE id = $1`, [id]);\n if (rows.length === 0) throw notFound(\"Memory\", id);\n await this.pool.query(`DELETE FROM ${this.table} WHERE id = $1`, [id]);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n const placeholders = ids.map((_, i) => `$${i + 1}`).join(\", \");\n const { rows } = await this.pool.query(\n `DELETE FROM ${this.table} WHERE id IN (${placeholders}) RETURNING id`,\n ids\n );\n return rows.length;\n }\n\n async touch(id: string): Promise<void> {\n const { rows } = await this.pool.query(`SELECT id FROM ${this.table} WHERE id = $1`, [id]);\n if (rows.length === 0) throw notFound(\"Memory\", id);\n await this.pool.query(`UPDATE ${this.table} SET touched_at = NOW() WHERE id = $1`, [id]);\n }\n\n async retrieve(query: MemoryRetrieveQuery, embedding?: number[]): Promise<Memory[]> {\n const conditions: string[] = [\"(expires_at IS NULL OR expires_at > NOW())\"];\n const params: unknown[] = [];\n let paramIdx = 1;\n\n if (query.actorId) {\n conditions.push(`actor_id = $${paramIdx++}`);\n params.push(query.actorId);\n }\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n conditions.push(`memory_type = ANY($${paramIdx++})`);\n params.push(query.memoryTypes);\n }\n if (query.tags && query.tags.length > 0) {\n conditions.push(`tags ?| $${paramIdx++}`);\n params.push(query.tags);\n }\n if (query.query) {\n conditions.push(`content ILIKE $${paramIdx++}`);\n params.push(`%${query.query}%`);\n }\n if (query.createdAfter) {\n conditions.push(`created_at >= $${paramIdx++}`);\n params.push(query.createdAfter.toISOString());\n }\n if (query.createdBefore) {\n conditions.push(`created_at <= $${paramIdx++}`);\n params.push(query.createdBefore.toISOString());\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(\" AND \")}` : \"\";\n\n let orderBy: string;\n switch (query.strategy) {\n case \"recent\":\n orderBy = \"touched_at DESC\";\n break;\n case \"important\":\n orderBy = \"importance DESC\";\n break;\n case \"hybrid\":\n case \"semantic\":\n default:\n if (embedding) {\n return this._semanticRetrieve(embedding, query, params, where, paramIdx);\n }\n orderBy = \"importance DESC, touched_at DESC\";\n break;\n }\n\n const limit = query.limit ?? 10;\n const sql = `SELECT * FROM ${this.table} ${where} ORDER BY ${orderBy} LIMIT $${paramIdx}`;\n params.push(limit);\n\n const { rows } = await this.pool.query(sql, params);\n\n if (query.touch !== false) {\n for (const row of rows.slice(0, limit)) {\n const r = row as PgMemoryRow;\n await this.pool.query(`UPDATE ${this.table} SET touched_at = NOW() WHERE id = $1`, [r.id]);\n }\n }\n\n return (rows as PgMemoryRow[]).map((r) => this._rowToMemory(r));\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n const conditions: string[] = [\"(expires_at IS NULL OR expires_at > NOW())\"];\n const params: unknown[] = [];\n let paramIdx = 1;\n\n if (filter?.actorId) {\n conditions.push(`actor_id = $${paramIdx++}`);\n params.push(filter.actorId);\n }\n if (filter?.memoryType) {\n conditions.push(`memory_type = $${paramIdx++}`);\n params.push(filter.memoryType);\n }\n if (filter?.minImportance !== undefined) {\n conditions.push(`importance >= $${paramIdx++}`);\n params.push(filter.minImportance);\n }\n if (filter?.createdAfter) {\n conditions.push(`created_at >= $${paramIdx++}`);\n params.push(filter.createdAfter.toISOString());\n }\n if (filter?.createdBefore) {\n conditions.push(`created_at <= $${paramIdx++}`);\n params.push(filter.createdBefore.toISOString());\n }\n\n const where = conditions.join(\" AND \");\n const { rows } = await this.pool.query(\n `SELECT COUNT(*) as count FROM ${this.table} WHERE ${where}`,\n params\n );\n return Number((rows[0] as { count: string }).count);\n }\n\n async close(): Promise<void> {\n if (this._ownsPool && this.pool?.end) {\n await this.pool.end();\n }\n }\n\n private async _semanticRetrieve(\n embedding: number[],\n query: MemoryRetrieveQuery,\n params: unknown[],\n baseWhere: string,\n paramIdx: number\n ): Promise<Memory[]> {\n const limit = query.limit ?? 10;\n const conditions = baseWhere.replace(/^WHERE\\s+/i, \"\");\n const whereClause = conditions\n ? `WHERE ${conditions} AND embedding IS NOT NULL`\n : `WHERE embedding IS NOT NULL`;\n const isHybrid = query.strategy === \"hybrid\";\n const sql = isHybrid ? `\n SELECT *,\n (embedding <-> $${paramIdx}::float8[]::vector) AS distance,\n (1.0 - (embedding <-> $${paramIdx}::float8[]::vector) / 2.0 + importance) AS score\n FROM ${this.table}\n ${whereClause}\n ORDER BY score DESC\n LIMIT $${paramIdx + 1}\n ` : `\n SELECT *,\n (embedding <-> $${paramIdx}::float8[]::vector) AS distance\n FROM ${this.table}\n ${whereClause}\n ORDER BY distance ASC\n LIMIT $${paramIdx + 1}\n `;\n params.push(embedding);\n params.push(limit);\n\n const { rows } = await this.pool.query(sql, params);\n\n if (query.touch !== false) {\n for (const row of rows.slice(0, limit)) {\n const r = row as PgMemoryRow;\n await this.pool.query(`UPDATE ${this.table} SET touched_at = NOW() WHERE id = $1`, [r.id]);\n }\n }\n\n return (rows as PgMemoryRow[]).map((r) => this._rowToMemory(r));\n }\n\n private _rowToMemory(row: PgMemoryRow): Memory {\n return {\n id: row.id,\n actorId: row.actor_id,\n memoryType: row.memory_type as MemoryType,\n content: row.content,\n importance: row.importance,\n emotionalValence: row.emotional_valence,\n tags: Array.isArray(row.tags) ? row.tags : [],\n embedding: row.embedding ?? undefined,\n sourceId: row.source_id ?? undefined,\n metadata: row.metadata ?? {},\n expiresAt: row.expires_at ? new Date(row.expires_at) : undefined,\n createdAt: new Date(row.created_at),\n };\n }\n}\n","import type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter, StorageCapabilities } from \"../../interfaces.js\";\nimport { notFound } from \"../../errors.js\";\n\ntype RedisClient = {\n set(key: string, value: string): Promise<unknown>;\n get(key: string): Promise<string | null>;\n del(key: string | string[]): Promise<number>;\n sadd(key: string, ...members: string[]): Promise<number>;\n srem(key: string, ...members: string[]): Promise<number>;\n smembers(key: string): Promise<string[]>;\n mget(...keys: string[]): Promise<(string | null)[]>;\n};\n\ninterface MemoryRecord extends Memory {\n _touchedAt: string;\n}\n\nexport interface RedisStorageConfig {\n redis: RedisClient;\n keyPrefix?: string;\n}\n\nexport class RedisStorageAdapter implements StorageProvider {\n readonly capabilities: StorageCapabilities = { multiProcess: true };\n private redis: RedisClient;\n private prefix: string;\n constructor(config: RedisStorageConfig) {\n this.redis = config.redis;\n this.prefix = config.keyPrefix ?? \"memstack\";\n }\n\n async initialize(): Promise<void> {\n // Connection is user-managed; no-op\n }\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date();\n const memory: MemoryRecord = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? now,\n _touchedAt: now.toISOString(),\n };\n\n await this.redis.set(this._memKey(memory.id), JSON.stringify(memory));\n await this.redis.sadd(this._actorKey(memory.actorId), memory.id);\n await this.redis.sadd(this._actorsSetKey(), memory.actorId);\n\n return this._toExternal(memory);\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const results: Memory[] = [];\n const now = new Date();\n\n for (const input of inputs) {\n const memory: MemoryRecord = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? now,\n _touchedAt: now.toISOString(),\n };\n\n await this.redis.set(this._memKey(memory.id), JSON.stringify(memory));\n await this.redis.sadd(this._actorKey(memory.actorId), memory.id);\n await this.redis.sadd(this._actorsSetKey(), memory.actorId);\n results.push(this._toExternal(memory));\n }\n\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n const raw = await this.redis.get(this._memKey(id));\n if (!raw) return null;\n\n const record = JSON.parse(raw) as MemoryRecord;\n if (record.expiresAt && new Date(record.expiresAt) <= new Date()) return null;\n return this._toExternal(record);\n }\n\n async delete(id: string): Promise<void> {\n const raw = await this.redis.get(this._memKey(id));\n if (!raw) throw notFound(\"Memory\", id);\n\n const record = JSON.parse(raw) as MemoryRecord;\n await this.redis.del(this._memKey(id));\n await this.redis.srem(this._actorKey(record.actorId), id);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n let count = 0;\n const byActor = new Map<string, string[]>();\n\n for (const id of ids) {\n const raw = await this.redis.get(this._memKey(id));\n if (raw) {\n const record = JSON.parse(raw) as MemoryRecord;\n const list = byActor.get(record.actorId) ?? [];\n list.push(id);\n byActor.set(record.actorId, list);\n }\n }\n\n for (const [actorId, memIds] of byActor) {\n await this.redis.del(memIds.map((id) => this._memKey(id)));\n await this.redis.srem(this._actorKey(actorId), ...memIds);\n count += memIds.length;\n }\n\n return count;\n }\n\n async touch(id: string): Promise<void> {\n const raw = await this.redis.get(this._memKey(id));\n if (!raw) throw notFound(\"Memory\", id);\n\n const record = JSON.parse(raw) as MemoryRecord;\n record._touchedAt = new Date().toISOString();\n await this.redis.set(this._memKey(id), JSON.stringify(record));\n }\n\n async retrieve(query: MemoryRetrieveQuery, _embedding?: number[]): Promise<Memory[]> {\n let allRecords: MemoryRecord[] = [];\n\n if (query.actorId) {\n allRecords = await this._getActorRecords(query.actorId);\n } else {\n const actorIds = await this._listActors();\n for (const actorId of actorIds) {\n const records = await this._getActorRecords(actorId);\n allRecords.push(...records);\n }\n }\n\n const now = new Date();\n let results = allRecords.filter((r) => !r.expiresAt || new Date(r.expiresAt) > now);\n\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n results = results.filter((r) => query.memoryTypes!.includes(r.memoryType));\n }\n if (query.tags && query.tags.length > 0) {\n results = results.filter((r) => r.tags?.some((t) => query.tags!.includes(t)));\n }\n if (query.query) {\n const q = query.query.toLowerCase();\n results = results.filter((r) => r.content.toLowerCase().includes(q));\n }\n\n switch (query.strategy) {\n case \"recent\":\n results.sort((a, b) => new Date(b._touchedAt).getTime() - new Date(a._touchedAt).getTime());\n break;\n case \"important\":\n results.sort((a, b) => b.importance - a.importance);\n break;\n case \"hybrid\":\n case \"semantic\":\n default:\n results.sort(\n (a, b) =>\n b.importance - a.importance || new Date(b._touchedAt).getTime() - new Date(a._touchedAt).getTime()\n );\n break;\n }\n\n if (query.touch !== false) {\n const nowStr = new Date().toISOString();\n const toTouch = results.slice(0, query.limit ?? 10);\n for (const r of toTouch) {\n r._touchedAt = nowStr;\n await this.redis.set(this._memKey(r.id), JSON.stringify(r));\n }\n }\n\n const limit = query.limit ?? 10;\n return results.slice(0, limit).map((r) => this._toExternal(r));\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n let allRecords: MemoryRecord[] = [];\n\n if (filter?.actorId) {\n allRecords = await this._getActorRecords(filter.actorId);\n } else {\n const actorIds = await this._listActors();\n for (const actorId of actorIds) {\n const records = await this._getActorRecords(actorId);\n allRecords.push(...records);\n }\n }\n\n const now = new Date();\n let results = allRecords.filter((r) => !r.expiresAt || new Date(r.expiresAt) > now);\n\n if (filter?.memoryType) {\n results = results.filter((r) => r.memoryType === filter.memoryType);\n }\n if (filter?.minImportance !== undefined) {\n results = results.filter((r) => r.importance >= filter.minImportance!);\n }\n\n return results.length;\n }\n\n async close(): Promise<void> {\n }\n\n private _actorsSetKey(): string {\n return `${this.prefix}:actors`;\n }\n\n private _actorKey(actorId: string): string {\n const safe = actorId.replace(/[^a-zA-Z0-9_\\-.,@]/g, \"_\");\n return `${this.prefix}:a:${safe}`;\n }\n\n private _memKey(id: string): string {\n return `${this.prefix}:m:${id}`;\n }\n\n private async _getActorRecords(actorId: string): Promise<MemoryRecord[]> {\n const ids = await this.redis.smembers(this._actorKey(actorId));\n if (ids.length === 0) return [];\n\n const keys = ids.map((id) => this._memKey(id));\n const raws = await this.redis.mget(...keys);\n\n const records: MemoryRecord[] = [];\n for (const raw of raws) {\n if (raw) {\n try {\n records.push(JSON.parse(raw) as MemoryRecord);\n } catch {\n // Skip corrupted records\n }\n }\n }\n\n return records;\n }\n\n private async _listActors(): Promise<string[]> {\n return this.redis.smembers(this._actorsSetKey());\n }\n\n private _toExternal(record: MemoryRecord): Memory {\n const { _touchedAt: _, ...rest } = record;\n return {\n ...rest,\n createdAt: new Date(record.createdAt),\n expiresAt: record.expiresAt ? new Date(record.expiresAt) : undefined,\n };\n }\n}\n","import type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter } from \"../../interfaces.js\";\nimport { storageError, notFound } from \"../../errors.js\";\n\ntype QdrantClient = {\n createCollection(name: string, config: { vectors: { size: number; distance: string } }): Promise<unknown>;\n getCollection(name: string): Promise<unknown>;\n upsert(name: string, opts: { points: { id: string; vector: number[]; payload: Record<string, unknown> }[] }): Promise<unknown>;\n retrieve(name: string, opts: { ids: string[] }): Promise<unknown[]>;\n search(name: string, opts: { vector: number[]; limit: number; filter?: { must: unknown[] } }): Promise<unknown[]>;\n delete(name: string, opts: { points: string[] }): Promise<unknown>;\n count(name: string, opts?: { filter?: { must: unknown[] } }): Promise<{ count: number }>;\n scroll(name: string, opts?: { filter?: { must: unknown[] }; limit?: number }): Promise<{ points: unknown[] }>;\n};\n\nexport interface QdrantStorageConfig {\n client: QdrantClient;\n collectionName?: string;\n vectorSize?: number;\n}\n\ninterface QdrantPoint {\n id: string;\n payload: Record<string, unknown>;\n vector?: number[];\n}\n\nexport class QdrantStorageAdapter implements StorageProvider {\n private client: QdrantClient;\n private collectionName: string;\n private vectorSize: number;\n private _idToQdrant = new Map<string, string>();\n\n constructor(config: QdrantStorageConfig) {\n this.client = config.client;\n this.collectionName = config.collectionName ?? \"memstack\";\n this.vectorSize = config.vectorSize ?? 1536;\n }\n\n async initialize(): Promise<void> {\n try {\n await this.client.getCollection(this.collectionName);\n } catch {\n await this.client.createCollection(this.collectionName, {\n vectors: { size: this.vectorSize, distance: \"Cosine\" },\n });\n }\n }\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date();\n const memory: Memory = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? now,\n };\n\n const qdrantId = crypto.randomUUID();\n await this.client.upsert(this.collectionName, {\n points: [\n {\n id: qdrantId,\n vector: input.embedding ?? new Array(this.vectorSize).fill(0),\n payload: this._toPayload(memory),\n },\n ],\n });\n\n this._idToQdrant.set(memory.id, qdrantId);\n return memory;\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const results: Memory[] = [];\n const now = new Date();\n const points: { id: string; vector: number[]; payload: Record<string, unknown> }[] = [];\n\n for (const input of inputs) {\n const memory: Memory = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? now,\n };\n results.push(memory);\n const qid = crypto.randomUUID();\n points.push({\n id: qid,\n vector: input.embedding ?? new Array(this.vectorSize).fill(0),\n payload: this._toPayload(memory),\n });\n this._idToQdrant.set(memory.id, qid);\n }\n\n await this.client.upsert(this.collectionName, { points });\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n const qdrantId = this._idToQdrant.get(id);\n if (qdrantId) {\n const points = await this.client.retrieve(this.collectionName, { ids: [qdrantId] });\n if (points && points.length > 0) {\n const point = points[0] as QdrantPoint;\n if (point.payload.expiresAt && new Date(point.payload.expiresAt as string) <= new Date()) return null;\n return this._fromPoint(point);\n }\n }\n return null;\n }\n\n async delete(id: string): Promise<void> {\n const qdrantId = this._idToQdrant.get(id);\n if (!qdrantId) throw notFound(\"Memory\", id);\n await this.client.delete(this.collectionName, { points: [qdrantId] });\n this._idToQdrant.delete(id);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n const qdrantIds: string[] = [];\n for (const id of ids) {\n const qid = this._idToQdrant.get(id);\n if (qid) { qdrantIds.push(qid); this._idToQdrant.delete(id); }\n }\n if (qdrantIds.length === 0) return 0;\n await this.client.delete(this.collectionName, { points: qdrantIds });\n return qdrantIds.length;\n }\n\n async retrieve(query: MemoryRetrieveQuery, embedding?: number[]): Promise<Memory[]> {\n const must: unknown[] = [];\n\n if (query.actorId) {\n must.push({ key: \"actorId\", match: { value: query.actorId } });\n }\n\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n must.push({ key: \"memoryType\", match: { any: query.memoryTypes } });\n }\n\n if (query.tags && query.tags.length > 0) {\n must.push({ key: \"tags\", match: { any: query.tags } });\n }\n\n const filter = must.length > 0 ? { must } : undefined;\n const limit = query.limit ?? 10;\n\n if (query.strategy === \"semantic\" || query.strategy === \"hybrid\") {\n const vector = embedding ?? new Array(this.vectorSize).fill(0);\n const results = await this.client.search(this.collectionName, {\n vector,\n limit,\n filter: filter as { must: unknown[] } | undefined,\n });\n const points = results as QdrantPoint[];\n return points.map((p) => this._fromPoint(p));\n }\n\n const vector = new Array(this.vectorSize).fill(0);\n const results = await this.client.search(this.collectionName, {\n vector,\n limit: 10000,\n filter: filter as { must: unknown[] } | undefined,\n });\n let points = results as QdrantPoint[];\n\n switch (query.strategy) {\n case \"recent\":\n points.sort((a, b) => {\n const aTime = new Date(a.payload.createdAt as string).getTime();\n const bTime = new Date(b.payload.createdAt as string).getTime();\n return bTime - aTime;\n });\n break;\n case \"important\":\n points.sort((a, b) => (b.payload.importance as number) - (a.payload.importance as number));\n break;\n }\n\n return points.slice(0, limit).map((p) => this._fromPoint(p));\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n const must: unknown[] = [];\n\n if (filter?.actorId) {\n must.push({ key: \"actorId\", match: { value: filter.actorId } });\n }\n\n if (filter?.memoryType) {\n must.push({ key: \"memoryType\", match: { value: filter.memoryType } });\n }\n\n if (filter?.minImportance !== undefined) {\n must.push({ key: \"importance\", range: { gte: filter.minImportance } });\n }\n\n const filterObj = must.length > 0 ? { must } : undefined;\n const result = await this.client.count(this.collectionName, filterObj ? { filter: filterObj } : undefined);\n return result.count;\n }\n\n async close(): Promise<void> {}\n\n private _toPayload(memory: Memory): Record<string, unknown> {\n return {\n _id: memory.id,\n actorId: memory.actorId,\n memoryType: memory.memoryType,\n importance: memory.importance,\n emotionalValence: memory.emotionalValence,\n tags: memory.tags,\n content: memory.content,\n metadata: memory.metadata ?? {},\n createdAt: memory.createdAt.toISOString(),\n sourceId: memory.sourceId ?? null,\n expiresAt: memory.expiresAt?.toISOString() ?? null,\n };\n }\n\n private _fromPoint(point: QdrantPoint): Memory {\n const p = point.payload;\n return {\n id: (p._id as string) ?? point.id,\n actorId: p.actorId as string,\n memoryType: p.memoryType as MemoryType,\n content: p.content as string,\n importance: p.importance as number,\n emotionalValence: (p.emotionalValence as number) ?? 0,\n tags: (p.tags as string[]) ?? [],\n embedding: point.vector as number[] | undefined,\n sourceId: (p.sourceId as string | undefined) ?? undefined,\n metadata: (p.metadata as Record<string, unknown>) ?? {},\n expiresAt: p.expiresAt ? new Date(p.expiresAt as string) : undefined,\n createdAt: new Date(p.createdAt as string),\n };\n }\n}\n","import type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter } from \"../../interfaces.js\";\nimport { storageError, notFound } from \"../../errors.js\";\n\ntype Neo4jDriver = {\n session(opts?: { database?: string }): Neo4jSession;\n close(): Promise<void>;\n};\n\ntype Neo4jSession = {\n run(query: string, params?: Record<string, unknown>): Promise<{ records: { get(key: string): unknown; toObject(): Record<string, unknown> }[] }>;\n close(): Promise<void>;\n};\n\ninterface Neo4jMemoryNode {\n id: string;\n actorId: string;\n memoryType: string;\n content: string;\n importance: number;\n emotionalValence: number;\n tags: string[];\n sourceId: string | null;\n metadata: string;\n expiresAt: string | null;\n createdAt: string;\n embedding: number[] | null;\n}\n\nexport interface Neo4jStorageConfig {\n driver: Neo4jDriver;\n database?: string;\n}\n\nexport class Neo4jStorageAdapter implements StorageProvider {\n private driver: Neo4jDriver;\n private database: string;\n\n constructor(config: Neo4jStorageConfig) {\n this.driver = config.driver;\n this.database = config.database ?? \"neo4j\";\n }\n\n async initialize(): Promise<void> {\n const session = this.driver.session({ database: this.database });\n try {\n await session.run(\n \"CREATE CONSTRAINT memory_id IF NOT EXISTS FOR (m:Memory) REQUIRE m.id IS UNIQUE\"\n );\n await session.run(\n `CREATE VECTOR INDEX memory_embedding IF NOT EXISTS FOR (m:Memory) ON m.embedding\n OPTIONS { indexConfig: { \\`vector.dimensions\\`: 1536, \\`vector.similarity_function\\`: \"cosine\" } }`\n );\n } finally {\n await session.close();\n }\n }\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date().toISOString();\n const id = input.id ?? this.generateId();\n\n const props: Record<string, unknown> = {\n actorId: input.actorId,\n memoryType: input.memoryType ?? \"interaction\",\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n sourceId: input.sourceId ?? null,\n metadata: JSON.stringify(input.metadata ?? {}),\n expiresAt: input.expiresAt?.toISOString() ?? null,\n createdAt: input.createdAt?.toISOString() ?? now,\n embedding: input.embedding ?? null,\n };\n\n const updateProps = { ...props };\n if (!input.createdAt) {\n delete updateProps.createdAt;\n }\n\n const session = this.driver.session({ database: this.database });\n try {\n await session.run(\n \"MERGE (m:Memory {id: $id}) ON CREATE SET m += $props ON MATCH SET m += $updateProps\",\n { id, props, updateProps }\n );\n } finally {\n await session.close();\n }\n\n return {\n id,\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? new Date(now),\n };\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const results: Memory[] = [];\n for (const input of inputs) {\n results.push(await this.store(input));\n }\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n const session = this.driver.session({ database: this.database });\n try {\n const result = await session.run(\n \"MATCH (m:Memory {id: $id}) WHERE m.expiresAt IS NULL OR m.expiresAt > datetime() RETURN m\",\n { id }\n );\n if (result.records.length === 0) return null;\n const raw = result.records[0].get(\"m\") as Record<string, unknown>;\n const node = (raw.properties ?? raw) as Neo4jMemoryNode;\n return this._nodeToMemory(node);\n } finally {\n await session.close();\n }\n }\n\n async delete(id: string): Promise<void> {\n const session = this.driver.session({ database: this.database });\n try {\n const check = await session.run(\"MATCH (m:Memory {id: $id}) RETURN m.id as id\", { id });\n if (check.records.length === 0) throw notFound(\"Memory\", id);\n await session.run(\"MATCH (m:Memory {id: $id}) DETACH DELETE m\", { id });\n } finally {\n await session.close();\n }\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n const session = this.driver.session({ database: this.database });\n try {\n const result = await session.run(\n \"UNWIND $ids AS mid MATCH (m:Memory {id: mid}) DETACH DELETE m RETURN count(m) as deleted\",\n { ids }\n );\n const record = result.records[0];\n if (!record) return 0;\n return record.get(\"deleted\") as number;\n } finally {\n await session.close();\n }\n }\n\n async retrieve(query: MemoryRetrieveQuery, embedding?: number[]): Promise<Memory[]> {\n const session = this.driver.session({ database: this.database });\n try {\n const limit = Math.floor(query.limit ?? 10);\n const strategy = query.strategy ?? \"hybrid\";\n\n if (strategy === \"semantic\" && embedding) {\n return this._semanticRetrieve(session, embedding, query, limit);\n }\n\n const strLimit = String(limit);\n let cypher: string;\n const params: Record<string, unknown> = {};\n\n const hasActor = query.actorId !== undefined;\n\n switch (strategy) {\n case \"recent\":\n if (hasActor) {\n cypher = \"MATCH (m:Memory) WHERE m.actorId = $actorId RETURN m ORDER BY m.createdAt DESC LIMIT \" + strLimit;\n params.actorId = query.actorId;\n } else {\n cypher = \"MATCH (m:Memory) RETURN m ORDER BY m.createdAt DESC LIMIT \" + strLimit;\n }\n break;\n case \"important\":\n if (hasActor) {\n cypher = \"MATCH (m:Memory) WHERE m.actorId = $actorId RETURN m ORDER BY m.importance DESC LIMIT \" + strLimit;\n params.actorId = query.actorId;\n } else {\n cypher = \"MATCH (m:Memory) RETURN m ORDER BY m.importance DESC LIMIT \" + strLimit;\n }\n break;\n case \"hybrid\":\n default:\n if (embedding) {\n return this._semanticRetrieve(session, embedding, query, limit);\n }\n if (hasActor) {\n cypher = \"MATCH (m:Memory) WHERE m.actorId = $actorId RETURN m ORDER BY m.importance DESC, m.createdAt DESC LIMIT \" + strLimit;\n params.actorId = query.actorId;\n } else {\n cypher = \"MATCH (m:Memory) RETURN m ORDER BY m.importance DESC, m.createdAt DESC LIMIT \" + strLimit;\n }\n break;\n }\n\n const result = await session.run(cypher, params);\n const memories = result.records.map((r) => {\n const raw = r.get(\"m\") as Record<string, unknown>;\n const node = (raw.properties ?? raw) as Neo4jMemoryNode;\n return this._nodeToMemory(node);\n });\n\n return this._postFilter(memories, query);\n } finally {\n await session.close();\n }\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n const session = this.driver.session({ database: this.database });\n try {\n const conditions: string[] = [];\n const params: Record<string, unknown> = {};\n\n if (filter?.actorId) {\n conditions.push(\"m.actorId = $actorId\");\n params.actorId = filter.actorId;\n }\n if (filter?.memoryType) {\n conditions.push(\"m.memoryType = $memoryType\");\n params.memoryType = filter.memoryType;\n }\n if (filter?.minImportance !== undefined) {\n conditions.push(\"m.importance >= $minImportance\");\n params.minImportance = filter.minImportance;\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(\" AND \")}` : \"\";\n const result = await session.run(\n `MATCH (m:Memory) ${where} RETURN count(m) as count`,\n params\n );\n const rawCount = result.records[0].get(\"count\");\n return typeof rawCount === \"number\" ? rawCount : Number(rawCount);\n } finally {\n await session.close();\n }\n }\n\n async graphQuery(cypher: string, params?: Record<string, unknown>): Promise<Memory[]> {\n const session = this.driver.session({ database: this.database });\n try {\n const result = await session.run(cypher, params);\n return result.records.map((r) => {\n const obj = r.toObject();\n const mKey = Object.keys(obj).find((k) => obj[k] && typeof obj[k] === \"object\" && \"properties\" in (obj[k] as object));\n if (mKey) {\n const raw = obj[mKey] as Record<string, unknown>;\n const node = (raw.properties ?? raw) as Neo4jMemoryNode;\n return this._nodeToMemory(node);\n }\n return this._nodeToMemory(obj as unknown as Neo4jMemoryNode);\n });\n } finally {\n await session.close();\n }\n }\n\n async close(): Promise<void> {\n await this.driver.close();\n }\n\n private async _semanticRetrieve(\n session: Neo4jSession,\n embedding: number[],\n query: MemoryRetrieveQuery,\n limit: number\n ): Promise<Memory[]> {\n const hasActor = query.actorId !== undefined;\n const strLimit = String(limit);\n const cypher = hasActor\n ? `CALL db.index.vector.queryNodes('memory_embedding', ${strLimit}, $embedding) YIELD node, score\n MATCH (node) WHERE node.actorId = $actorId\n RETURN node ORDER BY score LIMIT ${strLimit}`\n : `CALL db.index.vector.queryNodes('memory_embedding', ${strLimit}, $embedding) YIELD node, score\n RETURN node ORDER BY score LIMIT ${strLimit}`;\n const params: Record<string, unknown> = { embedding };\n if (hasActor) params.actorId = query.actorId;\n\n const result = await session.run(cypher, params);\n const memories = result.records.map((r) => {\n const raw = r.get(\"node\") as Record<string, unknown>;\n const node = (raw.properties ?? raw) as Neo4jMemoryNode;\n return this._nodeToMemory(node);\n });\n\n return this._postFilter(memories, query);\n }\n\n private _postFilter(memories: Memory[], query: MemoryRetrieveQuery): Memory[] {\n const now = new Date();\n let results = memories.filter((m) => !m.expiresAt || m.expiresAt > now);\n\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n results = results.filter((m) => query.memoryTypes!.includes(m.memoryType));\n }\n if (query.tags && query.tags.length > 0) {\n results = results.filter((m) => m.tags?.some((t) => query.tags!.includes(t)));\n }\n if (query.query) {\n const q = query.query.toLowerCase();\n results = results.filter((m) => m.content.toLowerCase().includes(q));\n }\n\n return results;\n }\n\n private _nodeToMemory(node: Neo4jMemoryNode): Memory {\n return {\n id: node.id,\n actorId: node.actorId,\n memoryType: (node.memoryType ?? \"interaction\") as MemoryType,\n content: node.content,\n importance: node.importance ?? 0.5,\n emotionalValence: node.emotionalValence ?? 0,\n tags: Array.isArray(node.tags) ? node.tags : [],\n embedding: node.embedding ?? undefined,\n sourceId: node.sourceId ?? undefined,\n metadata: typeof node.metadata === \"string\" ? JSON.parse(node.metadata) : (node.metadata ?? {}),\n expiresAt: node.expiresAt ? new Date(node.expiresAt) : undefined,\n createdAt: new Date(node.createdAt),\n };\n }\n}\n","import type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter } from \"../../interfaces.js\";\nimport { notFound } from \"../../errors.js\";\n\ntype WeaviateClient = {\n collections: {\n create(opts: { name: string; properties: { name: string; dataType: string }[]; vectorizers?: unknown }): Promise<unknown>;\n get(name: string): WeaviateCollection;\n delete(name: string): Promise<void>;\n exists(name: string): Promise<boolean>;\n listAll(): Promise<string[]>;\n };\n};\n\ntype WeaviateCollection = {\n data: {\n insert(opts: { properties: Record<string, unknown>; vectors: number[]; id?: string }): Promise<string>;\n deleteById(id: string): Promise<void>;\n };\n query: {\n fetchObjectById(id: string, opts?: { includeVector?: boolean }): Promise<{ properties: Record<string, unknown>; vectors?: { default?: number[] } } | null>;\n fetchObjects(opts: { limit: number; filters?: unknown; includeVector?: boolean }): Promise<{ objects: { uuid: string; properties: Record<string, unknown>; vectors?: { default?: number[] }; metadata?: { creationTimeUnix: number } }[] }>;\n nearVector(vector: number[], opts: { limit: number; returnProperties?: string[]; returnMetadata?: string[]; filters?: unknown; includeVector?: boolean }): Promise<{ objects: { uuid: string; properties: Record<string, unknown>; vectors?: { default?: number[] }; metadata?: { creationTimeUnix: number } }[] }>;\n };\n config: {\n get(): Promise<{ name: string }>;\n update(opts: { vectorIndexConfig: Record<string, unknown> }): Promise<void>;\n };\n};\n\nexport interface WeaviateStorageConfig {\n client: WeaviateClient;\n className?: string;\n}\n\nexport class WeaviateStorageAdapter implements StorageProvider {\n private client: WeaviateClient;\n private className: string;\n private _collection: WeaviateCollection | null = null;\n private _idToWv = new Map<string, string>();\n\n constructor(config: WeaviateStorageConfig) {\n this.client = config.client;\n this.className = config.className ?? \"MemstackMemory\";\n }\n\n async initialize(): Promise<void> {\n this._collection = this.client.collections.get(this.className);\n }\n\n private collection(): WeaviateCollection {\n if (!this._collection) {\n this._collection = this.client.collections.get(this.className);\n }\n return this._collection;\n }\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date();\n const memory: Memory = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? now,\n };\n\n const wvId = await this.collection().data.insert({\n id: crypto.randomUUID(),\n properties: this._toProperties(memory),\n vectors: input.embedding ?? new Array(1536).fill(0),\n });\n this._idToWv.set(memory.id, wvId);\n\n return memory;\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const results: Memory[] = [];\n for (const input of inputs) {\n results.push(await this.store(input));\n }\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n const wvId = this._idToWv.get(id);\n if (!wvId) return null;\n\n const obj = await this.collection().query.fetchObjectById(wvId, { includeVector: true });\n if (!obj) return null;\n\n const memory = this._fromProperties(obj.properties, obj.vectors?.default ?? undefined);\n if (memory.expiresAt && memory.expiresAt <= new Date()) return null;\n return memory;\n }\n\n async delete(id: string): Promise<void> {\n const wvId = this._idToWv.get(id);\n if (!wvId) throw notFound(\"Memory\", id);\n await this.collection().data.deleteById(wvId);\n this._idToWv.delete(id);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n let count = 0;\n for (const id of ids) {\n try {\n await this.delete(id);\n count++;\n } catch {\n //\n }\n }\n return count;\n }\n\n async retrieve(query: MemoryRetrieveQuery, embedding?: number[]): Promise<Memory[]> {\n const strategy = query.strategy ?? \"recent\";\n const limit = query.limit ?? 10;\n\n if ((strategy === \"semantic\" || strategy === \"hybrid\") && embedding) {\n const filters = this._buildFilter(query);\n const result = await this.collection().query.nearVector(embedding, {\n limit: 100,\n filters,\n includeVector: true,\n });\n\n let objects = result.objects.map((o) => ({\n ...this._fromProperties(o.properties, o.vectors?.default),\n _score: o.metadata?.creationTimeUnix ?? 0,\n }));\n\n objects = objects.filter((o) => !o.expiresAt || o.expiresAt > new Date());\n\n if (query.actorId) {\n objects = objects.filter((o) => o.actorId === query.actorId);\n }\n\n if (strategy === \"hybrid\") {\n objects.sort((a, b) => (b._score + b.importance) - (a._score + a.importance));\n }\n\n return objects.slice(0, limit);\n }\n\n const filters = this._buildFilter(query);\n const result = await this.collection().query.fetchObjects({\n limit: 10000,\n filters,\n });\n\n let objects = result.objects.map((o) => ({\n ...this._fromProperties(o.properties, o.vectors?.default),\n _createdAt: o.properties.createdAt as string,\n _importance: (o.properties.importance as number) ?? 0.5,\n }));\n\n objects = objects.filter((o) => !o.expiresAt || o.expiresAt > new Date());\n\n if (query.actorId) {\n objects = objects.filter((o) => o.actorId === query.actorId);\n }\n\n switch (strategy) {\n case \"recent\":\n objects.sort((a, b) => new Date(b._createdAt).getTime() - new Date(a._createdAt).getTime());\n break;\n case \"important\":\n objects.sort((a, b) => b._importance - a._importance);\n break;\n case \"hybrid\":\n case \"semantic\":\n default:\n objects.sort((a, b) => b._importance - a._importance || new Date(b._createdAt).getTime() - new Date(a._createdAt).getTime());\n break;\n }\n\n return objects.slice(0, limit);\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n const and: unknown[] = [];\n if (filter?.actorId) {\n and.push({ operator: \"Equal\", target: { property: \"actorId\" }, value: filter.actorId });\n }\n if (filter?.memoryType) {\n and.push({ operator: \"Equal\", target: { property: \"memoryType\" }, value: filter.memoryType });\n }\n if (filter?.minImportance !== undefined) {\n and.push({ operator: \"GreaterThanEqual\", target: { property: \"importance\" }, value: filter.minImportance });\n }\n\n const finalFilter = and.length === 0 ? undefined : and.length === 1 ? and[0] : { operator: \"And\", filters: and };\n const result = await this.collection().query.fetchObjects({\n limit: 10000,\n filters: finalFilter,\n });\n return result.objects.length;\n }\n\n async close(): Promise<void> {\n //\n }\n\n private _buildFilter(query: MemoryRetrieveQuery): unknown {\n const and: unknown[] = [];\n\n if (query.actorId) {\n and.push({ operator: \"Equal\", target: { property: \"actorId\" }, value: query.actorId });\n }\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n if (query.memoryTypes.length === 1) {\n and.push({ operator: \"Equal\", target: { property: \"memoryType\" }, value: query.memoryTypes[0] });\n } else {\n and.push({\n operator: \"Or\",\n filters: query.memoryTypes.map((t) => ({ operator: \"Equal\", target: { property: \"memoryType\" }, value: t })),\n });\n }\n }\n if (query.tags && query.tags.length > 0) {\n if (query.tags.length === 1) {\n and.push({ operator: \"ContainsAny\", target: { property: \"tags\" }, values: query.tags });\n } else {\n and.push({\n operator: \"Or\",\n filters: query.tags.map((t) => ({ operator: \"ContainsAny\", target: { property: \"tags\" }, values: [t] })),\n });\n }\n }\n if (query.query) {\n and.push({ operator: \"Like\", target: { property: \"content\" }, value: `*${query.query}*` });\n }\n\n return and.length === 0 ? undefined : and.length === 1 ? and[0] : { operator: \"And\", filters: and };\n }\n\n private _toProperties(memory: Memory): Record<string, unknown> {\n return {\n _memstackId: memory.id,\n actorId: memory.actorId,\n memoryType: memory.memoryType,\n content: memory.content,\n importance: memory.importance,\n emotionalValence: memory.emotionalValence,\n tags: memory.tags,\n metadata: JSON.stringify(memory.metadata ?? {}),\n sourceId: memory.sourceId ?? null,\n expiresAt: memory.expiresAt?.toISOString() ?? null,\n createdAt: memory.createdAt.toISOString(),\n };\n }\n\n private _fromProperties(props: Record<string, unknown>, vectors?: number[]): Memory {\n return {\n id: (props._memstackId as string) ?? \"\",\n actorId: (props.actorId as string) ?? \"\",\n memoryType: (props.memoryType as MemoryType) ?? \"interaction\",\n content: (props.content as string) ?? \"\",\n importance: (props.importance as number) ?? 0.5,\n emotionalValence: (props.emotionalValence as number) ?? 0,\n tags: Array.isArray(props.tags) ? (props.tags as string[]) : [],\n embedding: vectors,\n sourceId: (props.sourceId as string) ?? undefined,\n metadata: typeof props.metadata === \"string\" ? JSON.parse(props.metadata as string) : (props.metadata ?? {}),\n expiresAt: props.expiresAt ? new Date(props.expiresAt as string) : undefined,\n createdAt: new Date((props.createdAt as string) ?? new Date().toISOString()),\n };\n }\n}\n","import type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter } from \"../../interfaces.js\";\nimport { storageError, notFound, configError } from \"../../errors.js\";\n\ntype LanceDBConnection = {\n createTable(name: string, data: { id: string; vector: number[]; actor_id: string; memory_type: string; content: string; importance: number; emotional_valence: number; tags: string; source_id: string; metadata: string; expires_at: string; created_at: string }[]): Promise<LanceDBTable>;\n openTable(name: string): Promise<LanceDBTable>;\n tableNames(): Promise<string[]>;\n};\n\ntype LanceDBTable = {\n add(data: { id: string; vector: number[]; actor_id: string; memory_type: string; content: string; importance: number; emotional_valence: number; tags: string; source_id: string; metadata: string; expires_at: string; created_at: string }[]): Promise<void>;\n search(vector: number[]): { limit(n: number): { where(predicate: string): { execute(): Promise<LanceDBMemoryRow[]>; prefilter(value: boolean): { execute(): Promise<LanceDBMemoryRow[]> } } } };\n delete(predicate: string): Promise<void>;\n countRows(predicate?: string): Promise<number>;\n};\n\nexport interface LanceDBStorageConfig {\n connection: LanceDBConnection;\n tableName?: string;\n}\n\ninterface LanceDBMemoryRow {\n id: string;\n vector: number[];\n actor_id: string;\n memory_type: string;\n content: string;\n importance: number;\n emotional_valence: number;\n tags: string;\n source_id: string;\n metadata: string;\n expires_at: string;\n created_at: string;\n _distance?: number;\n}\n\nexport class LanceDBStorageAdapter implements StorageProvider {\n private connection: LanceDBConnection;\n private table!: LanceDBTable;\n private tableName: string;\n private _zeroVector: number[];\n\n constructor(config: LanceDBStorageConfig) {\n if (!config.connection) {\n throw configError(\"LanceDBStorageAdapter requires a LanceDB connection instance\");\n }\n this.connection = config.connection;\n this.tableName = config.tableName ?? \"memstack\";\n this._zeroVector = new Array(1536).fill(0);\n }\n\n async initialize(): Promise<void> {\n const tables = await this.connection.tableNames();\n if (!tables.includes(this.tableName)) {\n this.table = await this.connection.createTable(this.tableName, []);\n } else {\n this.table = await this.connection.openTable(this.tableName);\n }\n }\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date();\n const id = input.id ?? this.generateId();\n\n const row = {\n id,\n vector: input.embedding ?? this._zeroVector,\n actor_id: input.actorId,\n memory_type: input.memoryType ?? \"interaction\",\n content: input.content,\n importance: input.importance ?? 0.5,\n emotional_valence: input.emotionalValence ?? 0,\n tags: JSON.stringify(input.tags ?? []),\n source_id: input.sourceId ?? \"\",\n metadata: JSON.stringify(input.metadata ?? {}),\n expires_at: input.expiresAt?.toISOString() ?? \"\",\n created_at: now.toISOString(),\n };\n\n await this.table.add([row]);\n\n return {\n id,\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? now,\n };\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const results: Memory[] = [];\n for (const input of inputs) {\n results.push(await this.store(input));\n }\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n const results = await this.table.search(this._zeroVector).limit(1).where(`id = \"${id}\"`).prefilter(true).execute();\n if (results.length === 0) return null;\n\n const row = results[0];\n if (row.expires_at) {\n const expiresAt = new Date(row.expires_at);\n if (expiresAt <= new Date()) {\n await this.table.delete(`id = \"${id}\"`);\n return null;\n }\n }\n\n return this._rowToMemory(row);\n }\n\n async delete(id: string): Promise<void> {\n const existing = await this.get(id);\n if (!existing) throw notFound(\"Memory\", id);\n await this.table.delete(`id = \"${id}\"`);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n const before = await this.table.countRows();\n const inClause = ids.map((id) => `\"${id}\"`).join(\", \");\n await this.table.delete(`id IN (${inClause})`);\n const after = await this.table.countRows();\n return before - after;\n }\n\n async retrieve(query: MemoryRetrieveQuery, embedding?: number[]): Promise<Memory[]> {\n const conditions: string[] = [];\n if (query.actorId) {\n conditions.push(`actor_id = \"${query.actorId}\"`);\n }\n\n const where = conditions.length > 0 ? conditions.join(\" AND \") : \"\";\n\n const isSemantic = (query.strategy === \"semantic\" || query.strategy === \"hybrid\") && embedding && embedding.length > 0;\n const searchVec = isSemantic ? embedding! : this._zeroVector;\n const scanLimit = isSemantic ? (query.limit ?? 10) : 10000;\n\n const results = await this.table\n .search(searchVec)\n .limit(scanLimit)\n .where(where)\n .execute();\n\n let rows = results as LanceDBMemoryRow[];\n\n const now = new Date();\n rows = rows.filter((r) => !r.expires_at || new Date(r.expires_at) > now);\n\n if (query.actorId) {\n rows = rows.filter((r) => r.actor_id === query.actorId);\n }\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n rows = rows.filter((r) => query.memoryTypes!.includes(r.memory_type as MemoryType));\n }\n if (query.tags && query.tags.length > 0) {\n rows = rows.filter((r) => {\n const tags: string[] = JSON.parse(r.tags);\n return tags.some((t) => query.tags!.includes(t));\n });\n }\n if (query.query) {\n const q = query.query.toLowerCase();\n rows = rows.filter((r) => r.content.toLowerCase().includes(q));\n }\n\n const limit = query.limit ?? 10;\n\n if (isSemantic && query.strategy === \"hybrid\") {\n rows.sort((a, b) => {\n const scoreA = (a._distance ?? 0) + a.importance;\n const scoreB = (b._distance ?? 0) + b.importance;\n return scoreB - scoreA;\n });\n } else if (query.strategy === \"recent\") {\n rows.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());\n } else if (query.strategy === \"important\") {\n rows.sort((a, b) => b.importance - a.importance);\n } else if (!isSemantic) {\n rows.sort((a, b) => b.importance - a.importance || new Date(b.created_at).getTime() - new Date(a.created_at).getTime());\n }\n\n return rows.slice(0, limit).map((r) => this._rowToMemory(r));\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n const conditions: string[] = [];\n if (filter?.actorId) {\n conditions.push(`actor_id = \"${filter.actorId}\"`);\n }\n\n const where = conditions.length > 0 ? conditions.join(\" AND \") : \"\";\n\n const results = await this.table\n .search(this._zeroVector)\n .limit(10000)\n .where(where)\n .execute();\n\n const now = new Date();\n let rows = results.filter((r) => !r.expires_at || new Date(r.expires_at) > now);\n\n if (filter?.actorId) {\n rows = rows.filter((r) => r.actor_id === filter.actorId);\n }\n if (filter?.memoryType) {\n rows = rows.filter((r) => r.memory_type === filter.memoryType);\n }\n if (filter?.minImportance !== undefined) {\n rows = rows.filter((r) => r.importance >= filter.minImportance!);\n }\n\n return rows.length;\n }\n\n async close(): Promise<void> {\n }\n\n private _rowToMemory(row: LanceDBMemoryRow): Memory {\n return {\n id: row.id,\n actorId: row.actor_id,\n memoryType: row.memory_type as MemoryType,\n content: row.content,\n importance: row.importance,\n emotionalValence: row.emotional_valence,\n tags: row.tags ? JSON.parse(row.tags) : [],\n embedding: row.vector && row.vector.length > 0 ? row.vector : undefined,\n sourceId: row.source_id || undefined,\n metadata: row.metadata ? JSON.parse(row.metadata) : {},\n expiresAt: row.expires_at ? new Date(row.expires_at) : undefined,\n createdAt: new Date(row.created_at),\n };\n }\n}\n","import type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter, StorageCapabilities } from \"../../interfaces.js\";\nimport { storageError, notFound } from \"../../errors.js\";\n\ntype MongoCollection = {\n insertOne(doc: Record<string, unknown>): Promise<{ insertedId: string }>;\n findOne(filter: Record<string, unknown>): Promise<Record<string, unknown> | null>;\n updateOne(filter: Record<string, unknown>, update: Record<string, unknown>, opts?: { upsert?: boolean }): Promise<{ upsertedId?: string }>;\n deleteOne(filter: Record<string, unknown>): Promise<{ deletedCount: number }>;\n deleteMany(filter: Record<string, unknown>): Promise<{ deletedCount: number }>;\n find(filter: Record<string, unknown>): { sort(sort: Record<string, number>): { limit(n: number): { toArray(): Promise<Record<string, unknown>[]> } } };\n countDocuments(filter?: Record<string, unknown>): Promise<number>;\n aggregate(pipeline: Record<string, unknown>[]): { toArray(): Promise<Record<string, unknown>[]> };\n};\n\nexport interface MongoDBStorageConfig {\n collection: MongoCollection;\n vectorDimensions?: number;\n}\n\ninterface MongoDoc {\n _id: string;\n actorId: string;\n memoryType: MemoryType;\n content: string;\n importance: number;\n emotionalValence: number;\n tags: string[];\n embedding?: number[];\n sourceId?: string;\n metadata?: Record<string, unknown>;\n expiresAt?: Date;\n createdAt: Date;\n}\n\nexport class MongoDBStorageAdapter implements StorageProvider {\n readonly capabilities: StorageCapabilities = { multiProcess: true };\n private collection: MongoCollection;\n private vectorDimensions: number;\n\n constructor(config: MongoDBStorageConfig) {\n this.collection = config.collection;\n this.vectorDimensions = config.vectorDimensions ?? 1536;\n }\n\n async initialize(): Promise<void> {\n try {\n const col = this.collection as MongoCollection & { createSearchIndex?: (def: Record<string, unknown>) => Promise<unknown> };\n if (col.createSearchIndex) {\n await col.createSearchIndex({\n name: \"memstack_vector\",\n definition: {\n mappings: {\n dynamic: false,\n fields: {\n embedding: {\n type: \"knnVector\",\n dimensions: this.vectorDimensions,\n similarity: \"cosine\",\n },\n },\n },\n },\n });\n }\n } catch {}\n }\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n const now = new Date();\n const memory: Memory = {\n id: input.id ?? this.generateId(),\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? now,\n };\n if (input.id) {\n // Upsert like the other adapters: an existing memory keeps its actor, type, and creation time.\n const { _id, actorId, memoryType, createdAt, ...fields } = this.toDoc(memory);\n await this.collection.updateOne(\n { _id },\n { $set: fields, $setOnInsert: { actorId, memoryType, createdAt } },\n { upsert: true },\n );\n } else {\n await this.collection.insertOne(this.toDoc(memory) as unknown as Record<string, unknown>);\n }\n return memory;\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n const results: Memory[] = [];\n for (const input of inputs) {\n results.push(await this.store(input));\n }\n return results;\n }\n\n async get(id: string): Promise<Memory | null> {\n const doc = await this.collection.findOne({ _id: id });\n if (!doc) return null;\n const memory = this.toMemory(doc as unknown as MongoDoc);\n if (memory.expiresAt && memory.expiresAt <= new Date()) return null;\n return memory;\n }\n\n async delete(id: string): Promise<void> {\n const result = await this.collection.deleteOne({ _id: id });\n if (result.deletedCount === 0) throw notFound(\"Memory\", id);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n const result = await this.collection.deleteMany({ _id: { $in: ids } });\n return result.deletedCount;\n }\n\n async retrieve(query: MemoryRetrieveQuery, embedding?: number[]): Promise<Memory[]> {\n if (query.strategy === \"semantic\" && embedding) {\n return this.retrieveSemantic(query, embedding);\n }\n return this.retrieveStandard(query);\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n const mongoFilter: Record<string, unknown> = {};\n if (filter?.actorId) mongoFilter.actorId = filter.actorId;\n if (filter?.memoryType) mongoFilter.memoryType = filter.memoryType;\n if (filter?.minImportance !== undefined) {\n mongoFilter.importance = { $gte: filter.minImportance };\n }\n return this.collection.countDocuments(mongoFilter);\n }\n\n async close(): Promise<void> {}\n\n private async retrieveStandard(query: MemoryRetrieveQuery): Promise<Memory[]> {\n const filter: Record<string, unknown> = {};\n if (query.actorId) filter.actorId = query.actorId;\n\n if (query.tags && query.tags.length > 0) {\n filter.tags = { $in: query.tags };\n }\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n filter.memoryType = { $in: query.memoryTypes };\n }\n\n let sortObj: Record<string, number>;\n switch (query.strategy) {\n case \"recent\":\n sortObj = { createdAt: -1 };\n break;\n case \"important\":\n sortObj = { importance: -1 };\n break;\n default:\n sortObj = { importance: -1, createdAt: -1 };\n break;\n }\n\n const docs = await this.collection\n .find(filter)\n .sort(sortObj)\n .limit(10000)\n .toArray();\n\n const now = new Date();\n let results = docs\n .map((doc) => this.toMemory(doc as unknown as MongoDoc))\n .filter((m) => !m.expiresAt || m.expiresAt > now);\n\n if (query.query) {\n const q = query.query.toLowerCase();\n results = results.filter((m) => m.content.toLowerCase().includes(q));\n }\n\n return results.slice(0, query.limit ?? 10);\n }\n\n private async retrieveSemantic(query: MemoryRetrieveQuery, embedding: number[]): Promise<Memory[]> {\n try {\n const filter: Record<string, unknown> = {};\n if (query.actorId) filter.actorId = query.actorId;\n\n const pipeline: Record<string, unknown>[] = [\n {\n $vectorSearch: {\n index: \"memstack_vector\",\n path: \"embedding\",\n queryVector: embedding,\n numCandidates: 100,\n limit: query.limit ?? 10,\n filter: filter,\n },\n },\n ];\n\n const docs = await this.collection.aggregate(pipeline).toArray();\n const now = new Date();\n return docs\n .map((doc) => this.toMemory(doc as unknown as MongoDoc))\n .filter((m) => !m.expiresAt || m.expiresAt > now);\n } catch {\n return this.retrieveStandard(query);\n }\n }\n\n private toMemory(doc: MongoDoc): Memory {\n return {\n id: doc._id,\n actorId: doc.actorId,\n memoryType: doc.memoryType,\n content: doc.content,\n importance: doc.importance,\n emotionalValence: doc.emotionalValence,\n tags: doc.tags,\n embedding: doc.embedding,\n sourceId: doc.sourceId,\n metadata: doc.metadata,\n expiresAt: doc.expiresAt,\n createdAt: doc.createdAt,\n };\n }\n\n private toDoc(memory: Memory): MongoDoc {\n return {\n _id: memory.id,\n actorId: memory.actorId,\n memoryType: memory.memoryType,\n content: memory.content,\n importance: memory.importance,\n emotionalValence: memory.emotionalValence,\n tags: memory.tags,\n embedding: memory.embedding,\n sourceId: memory.sourceId,\n metadata: memory.metadata,\n expiresAt: memory.expiresAt,\n createdAt: memory.createdAt,\n };\n }\n}\n","import type { Memory, MemoryType } from \"../../types.js\";\nimport type { StorageProvider, MemoryStoreInput, MemoryRetrieveQuery, MemoryCountFilter, StorageCapabilities } from \"../../interfaces.js\";\nimport { notFound, configError } from \"../../errors.js\";\n\ntype BetterSqlite3Db = {\n exec(sql: string): void;\n prepare(sql: string): {\n run(...params: unknown[]): { changes: number; lastInsertRowid: number | bigint };\n get(...params: unknown[]): unknown | undefined;\n all(...params: unknown[]): unknown[];\n };\n close(): void;\n inTransaction?: boolean;\n};\n\ninterface SqliteMemoryRow {\n id: string;\n actor_id: string;\n memory_type: string;\n content: string;\n importance: number;\n emotional_valence: number;\n tags: string;\n embedding: string | null;\n source_id: string | null;\n metadata: string;\n expires_at: string | null;\n created_at: string;\n touched_at: string;\n}\n\nexport interface SQLiteStorageConfig {\n db: BetterSqlite3Db;\n tableName?: string;\n vectorDimensions?: number;\n /** How long a write waits for another connection's lock before failing. Default 5000. */\n busyTimeoutMs?: number;\n /** Use write-ahead logging so readers never block and writers queue. Default true. */\n walMode?: boolean;\n}\n\nconst MIGRATIONS_TABLE = \"memstack_schema_migrations\";\n\ninterface Migration {\n version: number;\n sql(table: string): string;\n}\n\n// Append-only: never edit a released migration, add a new version instead.\nconst MIGRATIONS: Migration[] = [\n {\n version: 1,\n sql: (t) => `\n CREATE TABLE IF NOT EXISTS ${t} (\n id TEXT PRIMARY KEY,\n actor_id TEXT NOT NULL,\n memory_type TEXT NOT NULL DEFAULT 'interaction',\n content TEXT NOT NULL,\n importance REAL NOT NULL DEFAULT 0.5,\n emotional_valence REAL NOT NULL DEFAULT 0,\n tags TEXT NOT NULL DEFAULT '[]',\n embedding TEXT,\n source_id TEXT,\n metadata TEXT NOT NULL DEFAULT '{}',\n expires_at TEXT,\n created_at TEXT NOT NULL,\n touched_at TEXT NOT NULL\n );\n CREATE INDEX IF NOT EXISTS idx_${t}_actor ON ${t}(actor_id);\n CREATE INDEX IF NOT EXISTS idx_${t}_created ON ${t}(created_at DESC);\n CREATE INDEX IF NOT EXISTS idx_${t}_importance ON ${t}(importance DESC);\n `,\n },\n];\n\nexport const SQLITE_SCHEMA_VERSION = MIGRATIONS[MIGRATIONS.length - 1].version;\n\nfunction cosineSimilarity(a: number[], b: number[]): number {\n if (a.length === 0 || b.length === 0) return 0;\n const dims = Math.min(a.length, b.length);\n let dot = 0;\n let magA = 0;\n let magB = 0;\n for (let i = 0; i < dims; i++) {\n dot += a[i] * b[i];\n magA += a[i] * a[i];\n magB += b[i] * b[i];\n }\n const mag = Math.sqrt(magA) * Math.sqrt(magB);\n return mag === 0 ? 0 : dot / mag;\n}\n\nexport class SQLiteStorageAdapter implements StorageProvider {\n readonly capabilities: StorageCapabilities = { multiProcess: true };\n private db: BetterSqlite3Db;\n private table: string;\n private vectorDimensions: number;\n private busyTimeoutMs: number;\n private walMode: boolean;\n\n constructor(config: SQLiteStorageConfig) {\n if (!config.db) {\n throw configError(\"SQLiteStorageAdapter requires a better-sqlite3 database instance\");\n }\n this.db = config.db;\n this.table = config.tableName ?? \"memstack_memories\";\n if (!/^[a-zA-Z0-9_]+$/.test(this.table)) {\n throw configError(`Invalid table name: \"${this.table}\". Use only alphanumeric characters and underscores.`);\n }\n this.vectorDimensions = config.vectorDimensions ?? 1536;\n this.busyTimeoutMs = config.busyTimeoutMs ?? 5000;\n if (!Number.isInteger(this.busyTimeoutMs) || this.busyTimeoutMs < 0) {\n throw configError(`Invalid busyTimeoutMs: ${config.busyTimeoutMs}. Use a non-negative integer.`);\n }\n this.walMode = config.walMode ?? true;\n }\n\n async initialize(): Promise<void> {\n // Set the timeout first so switching to WAL also waits for other connections.\n this.db.exec(`PRAGMA busy_timeout = ${this.busyTimeoutMs}`);\n if (this.walMode) this.db.exec(\"PRAGMA journal_mode = WAL\");\n this.migrate();\n }\n\n /** Schema version applied to this adapter's table, 0 if none. */\n schemaVersion(): number {\n const row = this.db.prepare(\n `SELECT version FROM ${MIGRATIONS_TABLE} WHERE table_name = ?`\n ).get(this.table) as { version: number } | undefined;\n return row?.version ?? 0;\n }\n\n // Versions are tracked per table rather than with PRAGMA user_version,\n // so adapters with different table names can share one database file.\n private migrate(): void {\n for (const migration of MIGRATIONS) {\n this.transaction(() => {\n this.db.exec(\n `CREATE TABLE IF NOT EXISTS ${MIGRATIONS_TABLE} (table_name TEXT PRIMARY KEY, version INTEGER NOT NULL)`\n );\n // Re-read inside the write lock: another process may have just applied it.\n if (this.schemaVersion() >= migration.version) return;\n this.db.exec(migration.sql(this.table));\n this.db.prepare(\n `INSERT INTO ${MIGRATIONS_TABLE} (table_name, version) VALUES (?, ?)\n ON CONFLICT(table_name) DO UPDATE SET version = excluded.version`\n ).run(this.table, migration.version);\n });\n }\n }\n\n // BEGIN IMMEDIATE takes the write lock up front, so a concurrent writer\n // waits on busy_timeout instead of failing when it upgrades a read lock.\n private transaction<T>(fn: () => T): T {\n if (this.db.inTransaction) return fn();\n this.db.exec(\"BEGIN IMMEDIATE\");\n try {\n const result = fn();\n this.db.exec(\"COMMIT\");\n return result;\n } catch (error) {\n if (this.db.inTransaction !== false) {\n try {\n this.db.exec(\"ROLLBACK\");\n } catch {\n // SQLite already rolled back; surface the original error.\n }\n }\n throw error;\n }\n }\n\n generateId(): string {\n return `mem_${Date.now().toString(36)}_${crypto.randomUUID().slice(0, 8)}`;\n }\n\n async store(input: MemoryStoreInput): Promise<Memory> {\n return this.insert(input);\n }\n\n private insert(input: MemoryStoreInput): Memory {\n const now = new Date().toISOString();\n const id = input.id ?? this.generateId();\n\n this.db.prepare(\n `INSERT INTO ${this.table} (id, actor_id, memory_type, content, importance, emotional_valence, tags, embedding, source_id, metadata, expires_at, created_at, touched_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n content = excluded.content,\n importance = excluded.importance,\n emotional_valence = excluded.emotional_valence,\n tags = excluded.tags,\n embedding = excluded.embedding,\n source_id = excluded.source_id,\n metadata = excluded.metadata,\n expires_at = excluded.expires_at,\n touched_at = excluded.touched_at`\n ).run(\n id,\n input.actorId,\n input.memoryType ?? \"interaction\",\n input.content,\n input.importance ?? 0.5,\n input.emotionalValence ?? 0,\n JSON.stringify(input.tags ?? []),\n input.embedding ? JSON.stringify(input.embedding) : null,\n input.sourceId ?? null,\n JSON.stringify(input.metadata ?? {}),\n input.expiresAt?.toISOString() ?? null,\n now,\n now\n );\n\n return {\n id,\n actorId: input.actorId,\n memoryType: (input.memoryType ?? \"interaction\") as MemoryType,\n content: input.content,\n importance: input.importance ?? 0.5,\n emotionalValence: input.emotionalValence ?? 0,\n tags: input.tags ?? [],\n embedding: input.embedding,\n sourceId: input.sourceId,\n metadata: input.metadata ?? {},\n expiresAt: input.expiresAt,\n createdAt: input.createdAt ?? new Date(now),\n };\n }\n\n async storeBatch(inputs: MemoryStoreInput[]): Promise<Memory[]> {\n return this.transaction(() => inputs.map((input) => this.insert(input)));\n }\n\n async get(id: string): Promise<Memory | null> {\n const row = this.db.prepare(\n `SELECT * FROM ${this.table} WHERE id = ? AND (expires_at IS NULL OR expires_at > ?)`\n ).get(id, new Date().toISOString()) as SqliteMemoryRow | undefined;\n\n if (!row) return null;\n return this._rowToMemory(row);\n }\n\n async delete(id: string): Promise<void> {\n const row = this.db.prepare(`SELECT id FROM ${this.table} WHERE id = ?`).get(id) as { id: string } | undefined;\n if (!row) throw notFound(\"Memory\", id);\n this.db.prepare(`DELETE FROM ${this.table} WHERE id = ?`).run(id);\n }\n\n async deleteMany(ids: string[]): Promise<number> {\n const placeholders = ids.map(() => \"?\").join(\", \");\n const result = this.db.prepare(\n `DELETE FROM ${this.table} WHERE id IN (${placeholders})`\n ).run(...ids);\n return result.changes;\n }\n\n async touch(id: string): Promise<void> {\n const row = this.db.prepare(`SELECT id FROM ${this.table} WHERE id = ?`).get(id) as { id: string } | undefined;\n if (!row) throw notFound(\"Memory\", id);\n this.db.prepare(`UPDATE ${this.table} SET touched_at = ? WHERE id = ?`).run(new Date().toISOString(), id);\n }\n\n async retrieve(query: MemoryRetrieveQuery, embedding?: number[]): Promise<Memory[]> {\n const conditions: string[] = [\"(expires_at IS NULL OR expires_at > ?)\"];\n const params: unknown[] = [new Date().toISOString()];\n\n if (query.actorId) {\n conditions.push(\"actor_id = ?\");\n params.push(query.actorId);\n }\n if (query.memoryTypes && query.memoryTypes.length > 0) {\n const placeholders = query.memoryTypes.map(() => \"?\").join(\", \");\n conditions.push(`memory_type IN (${placeholders})`);\n params.push(...query.memoryTypes);\n }\n if (query.createdAfter) {\n conditions.push(\"created_at >= ?\");\n params.push(query.createdAfter.toISOString());\n }\n if (query.createdBefore) {\n conditions.push(\"created_at <= ?\");\n params.push(query.createdBefore.toISOString());\n }\n\n const hasSemantic = (query.strategy === \"semantic\" || query.strategy === \"hybrid\") && embedding && embedding.length > 0;\n\n let orderBy: string;\n switch (query.strategy) {\n case \"recent\":\n orderBy = \"touched_at DESC\";\n break;\n case \"important\":\n orderBy = \"importance DESC\";\n break;\n case \"hybrid\":\n case \"semantic\":\n default:\n if (hasSemantic) {\n orderBy = \"touched_at DESC\";\n } else {\n orderBy = \"importance DESC, touched_at DESC\";\n }\n break;\n }\n\n const limit = query.limit ?? 10;\n const sql = `SELECT * FROM ${this.table} WHERE ${conditions.join(\" AND \")} ORDER BY ${orderBy}`;\n let results = this.db.prepare(sql).all(...params) as SqliteMemoryRow[];\n\n if (query.query) {\n const q = query.query.toLowerCase();\n results = results.filter((r) => r.content.toLowerCase().includes(q));\n }\n\n if (query.tags && query.tags.length > 0) {\n results = results.filter((r) => {\n const tags: string[] = JSON.parse(r.tags);\n return tags.some((t) => query.tags!.includes(t));\n });\n }\n\n if (hasSemantic && embedding) {\n const scored = results\n .filter((r) => r.embedding !== null)\n .map((r) => {\n const emb: number[] = JSON.parse(r.embedding!);\n const score = cosineSimilarity(embedding, emb);\n return { row: r, score };\n })\n .sort((a, b) => b.score - a.score);\n\n if (query.strategy === \"hybrid\") {\n scored.sort((a, b) => (b.score + b.row.importance) - (a.score + a.row.importance));\n }\n\n const topK = scored.slice(0, limit).map(({ row }) => row);\n this.touchRows(topK, query.touch);\n return topK.map((row) => this._rowToMemory(row));\n }\n\n const limited = results.slice(0, limit);\n this.touchRows(limited, query.touch);\n return limited.map((r) => this._rowToMemory(r));\n }\n\n async count(filter?: MemoryCountFilter): Promise<number> {\n const conditions: string[] = [\"(expires_at IS NULL OR expires_at > ?)\"];\n const params: unknown[] = [new Date().toISOString()];\n\n if (filter?.actorId) {\n conditions.push(\"actor_id = ?\");\n params.push(filter.actorId);\n }\n if (filter?.memoryType) {\n conditions.push(\"memory_type = ?\");\n params.push(filter.memoryType);\n }\n if (filter?.minImportance !== undefined) {\n conditions.push(\"importance >= ?\");\n params.push(filter.minImportance);\n }\n if (filter?.createdAfter) {\n conditions.push(\"created_at >= ?\");\n params.push(filter.createdAfter.toISOString());\n }\n if (filter?.createdBefore) {\n conditions.push(\"created_at <= ?\");\n params.push(filter.createdBefore.toISOString());\n }\n\n const where = conditions.join(\" AND \");\n const row = this.db.prepare(\n `SELECT COUNT(*) as count FROM ${this.table} WHERE ${where}`\n ).get(...params) as { count: number } | undefined;\n\n return row?.count ?? 0;\n }\n\n async close(): Promise<void> {\n this.db.close();\n }\n\n private touchRows(rows: SqliteMemoryRow[], touch: boolean | undefined): void {\n if (touch === false || rows.length === 0) return;\n const now = new Date().toISOString();\n const stmt = this.db.prepare(`UPDATE ${this.table} SET touched_at = ? WHERE id = ?`);\n this.transaction(() => {\n for (const row of rows) stmt.run(now, row.id);\n });\n }\n\n private _rowToMemory(row: SqliteMemoryRow): Memory {\n return {\n id: row.id,\n actorId: row.actor_id,\n memoryType: row.memory_type as MemoryType,\n content: row.content,\n importance: row.importance,\n emotionalValence: row.emotional_valence,\n tags: JSON.parse(row.tags),\n embedding: row.embedding ? JSON.parse(row.embedding) : undefined,\n sourceId: row.source_id ?? undefined,\n metadata: JSON.parse(row.metadata),\n expiresAt: row.expires_at ? new Date(row.expires_at) : undefined,\n createdAt: new Date(row.created_at),\n };\n }\n}\n","import type { LLMProvider } from \"../../interfaces.js\";\nimport { MemStackError } from \"../../errors.js\";\n\nexport interface OpenAILLMConfig {\n apiKey: string;\n baseURL?: string;\n defaultModel?: string;\n defaultTemperature?: number;\n defaultMaxTokens?: number;\n}\n\nexport class OpenAILLMAdapter implements LLMProvider {\n private apiKey: string;\n private baseURL: string;\n private defaultModel: string;\n private defaultTemperature: number;\n private defaultMaxTokens: number;\n\n constructor(config: OpenAILLMConfig) {\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL ?? \"https://api.openai.com/v1\";\n this.defaultModel = config.defaultModel ?? \"gpt-4o-mini\";\n this.defaultTemperature = config.defaultTemperature ?? 0.7;\n this.defaultMaxTokens = config.defaultMaxTokens ?? 1024;\n }\n\n async complete(request: {\n system: string;\n user: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n }): Promise<{ text: string; tokens: { prompt: number; completion: number; total: number } }> {\n const model = request.model ?? this.defaultModel;\n const temperature = request.temperature ?? this.defaultTemperature;\n const maxTokens = request.maxTokens ?? this.defaultMaxTokens;\n\n try {\n const response = await fetch(`${this.baseURL}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages: [\n { role: \"system\", content: request.system },\n { role: \"user\", content: request.user },\n ],\n temperature,\n max_tokens: maxTokens,\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new MemStackError(\"LLM_ERROR\", `OpenAI API error: ${response.status} ${err}`, {\n retryable: response.status >= 500,\n });\n }\n\n const data = (await response.json()) as {\n choices: { message: { content: string } }[];\n usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n };\n\n return {\n text: data.choices[0]?.message?.content ?? \"\",\n tokens: {\n prompt: data.usage?.prompt_tokens ?? 0,\n completion: data.usage?.completion_tokens ?? 0,\n total: data.usage?.total_tokens ?? 0,\n },\n };\n } catch (err) {\n if (err instanceof MemStackError) throw err;\n throw new MemStackError(\"LLM_ERROR\", `LLM request failed: ${err instanceof Error ? err.message : String(err)}`, {\n retryable: true,\n });\n }\n }\n\n async *completeStream(request: {\n system: string;\n user: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n }): AsyncIterable<{ text: string; tokens: { prompt: number; completion: number; total: number } }> {\n const model = request.model ?? this.defaultModel;\n const temperature = request.temperature ?? this.defaultTemperature;\n const maxTokens = request.maxTokens ?? this.defaultMaxTokens;\n\n let response: Response;\n try {\n response = await fetch(`${this.baseURL}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages: [\n { role: \"system\", content: request.system },\n { role: \"user\", content: request.user },\n ],\n temperature,\n max_tokens: maxTokens,\n stream: true,\n stream_options: { include_usage: true },\n }),\n });\n } catch (err) {\n throw new MemStackError(\"LLM_ERROR\", `OpenAI streaming request failed: ${err instanceof Error ? err.message : String(err)}`, {\n retryable: true,\n });\n }\n\n if (!response.ok) {\n const err = await response.text();\n throw new MemStackError(\"LLM_ERROR\", `OpenAI streaming error: ${response.status} ${err}`, {\n retryable: response.status >= 500,\n });\n }\n\n const reader = response.body?.getReader();\n if (!reader) throw new MemStackError(\"LLM_ERROR\", \"No response body for streaming\");\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let promptTokens = 0;\n let completionTokens = 0;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || !trimmed.startsWith(\"data: \")) continue;\n const data = trimmed.slice(6);\n if (data === \"[DONE]\") continue;\n\n try {\n const parsed = JSON.parse(data) as {\n choices?: { delta?: { content?: string } }[];\n usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n };\n\n const content = parsed.choices?.[0]?.delta?.content ?? \"\";\n const usage = parsed.usage;\n if (usage) {\n promptTokens = usage.prompt_tokens;\n completionTokens = usage.completion_tokens;\n }\n\n if (content || usage) {\n yield {\n text: content,\n tokens: { prompt: promptTokens, completion: completionTokens, total: promptTokens + completionTokens },\n };\n }\n } catch {\n // Skip unparseable chunks\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n","import type { LLMProvider } from \"../../interfaces.js\";\nimport { MemStackError } from \"../../errors.js\";\n\ninterface AnthropicSDK {\n messages: {\n create(params: {\n model: string;\n max_tokens: number;\n temperature?: number;\n system: string;\n messages: { role: string; content: string }[];\n }): Promise<{ content: { text: string }[]; usage?: { input_tokens: number; output_tokens: number } }>;\n };\n}\n\nexport interface AnthropicLLMConfig {\n apiKey: string;\n baseURL?: string;\n defaultModel?: string;\n defaultMaxTokens?: number;\n}\n\nexport class AnthropicLLMAdapter implements LLMProvider {\n private apiKey: string;\n private baseURL: string;\n private defaultModel: string;\n private defaultMaxTokens: number;\n private sdk?: AnthropicSDK;\n\n constructor(config: AnthropicLLMConfig) {\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL ?? \"https://api.anthropic.com\";\n this.defaultModel = config.defaultModel ?? \"claude-sonnet-4-5-20250929\";\n this.defaultMaxTokens = config.defaultMaxTokens ?? 1024;\n }\n\n async complete(request: {\n system: string;\n user: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n }): Promise<{ text: string; tokens: { prompt: number; completion: number; total: number } }> {\n const model = request.model ?? this.defaultModel;\n const maxTokens = request.maxTokens ?? this.defaultMaxTokens;\n\n try {\n if (!this.sdk) {\n // @ts-expect-error — optional peer dep\n const { default: Anthropic } = await import(\"@anthropic-ai/sdk\");\n this.sdk = new Anthropic({ apiKey: this.apiKey, baseURL: this.baseURL }) as AnthropicSDK;\n }\n\n const sdk = this.sdk;\n const response = await sdk.messages.create({\n model,\n system: request.system,\n messages: [{ role: \"user\", content: request.user }],\n max_tokens: maxTokens,\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\n });\n\n const text = response.content.length > 0 && \"text\" in response.content[0]\n ? (response.content[0] as { text: string }).text\n : \"\";\n\n return {\n text,\n tokens: {\n prompt: response.usage?.input_tokens ?? 0,\n completion: response.usage?.output_tokens ?? 0,\n total: (response.usage?.input_tokens ?? 0) + (response.usage?.output_tokens ?? 0),\n },\n };\n } catch (err) {\n if (err instanceof MemStackError) throw err;\n const msg = err instanceof Error ? err.message : String(err);\n // Node's ERR_MODULE_NOT_FOUND/MODULE_NOT_FOUND codes are the stable\n // signal for a real \"package isn't installed\" failure; the message-text\n // fallback covers bundler/dev-server module loaders (e.g. Vite, used\n // under this project's own test runner) that don't set `code` at all.\n // Either way, requiring the package name in the message keeps this\n // from misattributing an unrelated failure to a missing SDK.\n const code = (err as { code?: string } | undefined)?.code;\n const isMissingSdk =\n msg.includes(\"@anthropic-ai/sdk\") &&\n (code === \"ERR_MODULE_NOT_FOUND\" ||\n code === \"MODULE_NOT_FOUND\" ||\n /cannot find (package|module)/i.test(msg) ||\n /failed to (load|resolve)/i.test(msg));\n if (isMissingSdk) {\n throw new MemStackError(\"LLM_ERROR\", \"Anthropic adapter requires @anthropic-ai/sdk. Install it: npm install @anthropic-ai/sdk\", {\n retryable: false,\n });\n }\n throw new MemStackError(\"LLM_ERROR\", `Anthropic request failed: ${msg}`, {\n retryable: true,\n });\n }\n }\n}\n","import type { EmbeddingProvider } from \"../../interfaces.js\";\nimport { MemStackError } from \"../../errors.js\";\n\nexport interface OpenAIEmbeddingConfig {\n apiKey: string;\n baseURL?: string;\n model?: string;\n}\n\nexport class OpenAIEmbeddingAdapter implements EmbeddingProvider {\n private apiKey: string;\n private baseURL: string;\n private model: string;\n readonly dimensions: number;\n readonly maxBatchSize = 2048;\n\n constructor(config: OpenAIEmbeddingConfig) {\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL ?? \"https://api.openai.com/v1\";\n this.model = config.model ?? \"text-embedding-3-small\";\n this.dimensions = this.model === \"text-embedding-3-large\" ? 3072 : 1536;\n }\n\n async embed(texts: string[]): Promise<number[][]> {\n if (texts.length === 0) return [];\n if (texts.length > this.maxBatchSize) {\n throw new MemStackError(\"VALIDATION_ERROR\", `Max ${this.maxBatchSize} texts per batch, got ${texts.length}`);\n }\n\n try {\n const response = await fetch(`${this.baseURL}/embeddings`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model: this.model,\n input: texts,\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new MemStackError(\"EMBEDDING_ERROR\", `OpenAI Embedding error: ${response.status} ${err}`, {\n retryable: response.status >= 500,\n });\n }\n\n const data = (await response.json()) as {\n data: { embedding: number[]; index: number }[];\n };\n\n return data.data\n .sort((a, b) => a.index - b.index)\n .map((item) => item.embedding);\n } catch (err) {\n if (err instanceof MemStackError) throw err;\n throw new MemStackError(\n \"EMBEDDING_ERROR\",\n `Embedding request failed: ${err instanceof Error ? err.message : String(err)}`,\n { retryable: true }\n );\n }\n }\n}\n","import type { EmbeddingProvider } from \"../../interfaces.js\";\nimport { MemStackError } from \"../../errors.js\";\n\nexport interface CohereEmbeddingConfig {\n /** Cohere API key */\n apiKey: string;\n /** Model name. Default: \"embed-english-v3.0\" (1024 dims) */\n model?: string;\n /** Base URL. Default: \"https://api.cohere.ai/v1\" */\n baseURL?: string;\n}\n\nconst DIMENSIONS: Record<string, number> = {\n \"embed-english-v3.0\": 1024,\n \"embed-multilingual-v3.0\": 1024,\n \"embed-english-light-v3.0\": 384,\n \"embed-multilingual-light-v3.0\": 384,\n \"embed-english-v2.0\": 4096,\n \"embed-multilingual-v2.0\": 768,\n};\n\nexport class CohereEmbeddingAdapter implements EmbeddingProvider {\n private apiKey: string;\n private baseURL: string;\n private model: string;\n readonly dimensions: number;\n readonly maxBatchSize = 96;\n\n constructor(config: CohereEmbeddingConfig) {\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL ?? \"https://api.cohere.ai/v1\";\n this.model = config.model ?? \"embed-english-v3.0\";\n this.dimensions = DIMENSIONS[this.model] ?? 1024;\n }\n\n async embed(texts: string[]): Promise<number[][]> {\n if (texts.length === 0) return [];\n if (texts.length > this.maxBatchSize) {\n throw new MemStackError(\"VALIDATION_ERROR\", `Cohere max ${this.maxBatchSize} texts per batch, got ${texts.length}`);\n }\n\n try {\n const response = await fetch(`${this.baseURL}/embed`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model: this.model,\n texts,\n input_type: \"search_document\",\n embedding_types: [\"float\"],\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new MemStackError(\"EMBEDDING_ERROR\", `Cohere Embedding error: ${response.status} ${err}`, {\n retryable: response.status >= 500,\n });\n }\n\n const data = (await response.json()) as {\n embeddings: { float?: number[][] };\n };\n\n return data.embeddings?.float ?? [];\n } catch (err) {\n if (err instanceof MemStackError) throw err;\n throw new MemStackError(\n \"EMBEDDING_ERROR\",\n `Cohere embedding request failed: ${err instanceof Error ? err.message : String(err)}`,\n { retryable: true }\n );\n }\n }\n}\n","import type { LLMProvider } from \"../../interfaces.js\";\nimport { MemStackError } from \"../../errors.js\";\n\nexport interface OllamaLLMConfig {\n /** Ollama server URL. Default: \"http://localhost:11434\" */\n baseURL?: string;\n /** Default model name. Default: \"llama3.2\" */\n defaultModel?: string;\n /** Default temperature. Default: 0.7 */\n defaultTemperature?: number;\n /** Default max tokens. Default: 1024 */\n defaultMaxTokens?: number;\n}\n\nexport class OllamaLLMAdapter implements LLMProvider {\n private baseURL: string;\n private defaultModel: string;\n private defaultTemperature: number;\n private defaultMaxTokens: number;\n\n constructor(config: OllamaLLMConfig = {}) {\n this.baseURL = config.baseURL ?? \"http://localhost:11434\";\n this.defaultModel = config.defaultModel ?? \"llama3.2\";\n this.defaultTemperature = config.defaultTemperature ?? 0.7;\n this.defaultMaxTokens = config.defaultMaxTokens ?? 1024;\n }\n\n async complete(request: {\n system: string;\n user: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n }): Promise<{ text: string; tokens: { prompt: number; completion: number; total: number } }> {\n const model = request.model ?? this.defaultModel;\n const temperature = request.temperature ?? this.defaultTemperature;\n const maxTokens = request.maxTokens ?? this.defaultMaxTokens;\n\n try {\n const response = await fetch(`${this.baseURL}/api/chat`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n model,\n messages: [\n { role: \"system\", content: request.system },\n { role: \"user\", content: request.user },\n ],\n options: { temperature, num_predict: maxTokens },\n stream: false,\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new MemStackError(\"LLM_ERROR\", `Ollama API error: ${response.status} ${err}`, {\n retryable: response.status >= 500,\n });\n }\n\n const data = (await response.json()) as {\n message?: { content: string };\n prompt_eval_count?: number;\n eval_count?: number;\n };\n\n const promptTokens = data.prompt_eval_count ?? 0;\n const completionTokens = data.eval_count ?? 0;\n\n return {\n text: data.message?.content ?? \"\",\n tokens: {\n prompt: promptTokens,\n completion: completionTokens,\n total: promptTokens + completionTokens,\n },\n };\n } catch (err) {\n if (err instanceof MemStackError) throw err;\n throw new MemStackError(\"LLM_ERROR\", `Ollama request failed: ${err instanceof Error ? err.message : String(err)}`, {\n retryable: true,\n });\n }\n }\n}\n","import type { LLMProvider } from \"../../interfaces.js\";\nimport { MemStackError } from \"../../errors.js\";\n\nexport interface GroqLLMConfig {\n /** Groq API key */\n apiKey: string;\n /** Base URL. Default: \"https://api.groq.com/openai/v1\" */\n baseURL?: string;\n /** Default model. Default: \"llama-3.3-70b-versatile\" */\n defaultModel?: string;\n /** Default temperature. Default: 0.7 */\n defaultTemperature?: number;\n /** Default max tokens. Default: 1024 */\n defaultMaxTokens?: number;\n}\n\nexport class GroqLLMAdapter implements LLMProvider {\n private apiKey: string;\n private baseURL: string;\n private defaultModel: string;\n private defaultTemperature: number;\n private defaultMaxTokens: number;\n\n constructor(config: GroqLLMConfig) {\n this.apiKey = config.apiKey;\n this.baseURL = config.baseURL ?? \"https://api.groq.com/openai/v1\";\n this.defaultModel = config.defaultModel ?? \"llama-3.3-70b-versatile\";\n this.defaultTemperature = config.defaultTemperature ?? 0.7;\n this.defaultMaxTokens = config.defaultMaxTokens ?? 1024;\n }\n\n async complete(request: {\n system: string;\n user: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n }): Promise<{ text: string; tokens: { prompt: number; completion: number; total: number } }> {\n const model = request.model ?? this.defaultModel;\n const temperature = request.temperature ?? this.defaultTemperature;\n const maxTokens = request.maxTokens ?? this.defaultMaxTokens;\n\n try {\n const response = await fetch(`${this.baseURL}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages: [\n { role: \"system\", content: request.system },\n { role: \"user\", content: request.user },\n ],\n temperature,\n max_tokens: maxTokens,\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new MemStackError(\"LLM_ERROR\", `Groq API error: ${response.status} ${err}`, {\n retryable: response.status >= 500,\n });\n }\n\n const data = (await response.json()) as {\n choices: { message: { content: string } }[];\n usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n };\n\n return {\n text: data.choices[0]?.message?.content ?? \"\",\n tokens: {\n prompt: data.usage?.prompt_tokens ?? 0,\n completion: data.usage?.completion_tokens ?? 0,\n total: data.usage?.total_tokens ?? 0,\n },\n };\n } catch (err) {\n if (err instanceof MemStackError) throw err;\n throw new MemStackError(\"LLM_ERROR\", `Groq request failed: ${err instanceof Error ? err.message : String(err)}`, {\n retryable: true,\n });\n }\n }\n\n async *completeStream(request: {\n system: string;\n user: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n }): AsyncIterable<{ text: string; tokens: { prompt: number; completion: number; total: number } }> {\n const model = request.model ?? this.defaultModel;\n const temperature = request.temperature ?? this.defaultTemperature;\n const maxTokens = request.maxTokens ?? this.defaultMaxTokens;\n\n let response: Response;\n try {\n response = await fetch(`${this.baseURL}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model,\n messages: [\n { role: \"system\", content: request.system },\n { role: \"user\", content: request.user },\n ],\n temperature,\n max_tokens: maxTokens,\n stream: true,\n stream_options: { include_usage: true },\n }),\n });\n } catch (err) {\n throw new MemStackError(\"LLM_ERROR\", `Groq streaming request failed: ${err instanceof Error ? err.message : String(err)}`, {\n retryable: true,\n });\n }\n\n if (!response.ok) {\n const err = await response.text();\n throw new MemStackError(\"LLM_ERROR\", `Groq streaming error: ${response.status} ${err}`, {\n retryable: response.status >= 500,\n });\n }\n\n const reader = response.body?.getReader();\n if (!reader) throw new MemStackError(\"LLM_ERROR\", \"No response body for streaming\");\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let promptTokens = 0;\n let completionTokens = 0;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || !trimmed.startsWith(\"data: \")) continue;\n const data = trimmed.slice(6);\n if (data === \"[DONE]\") continue;\n\n try {\n const parsed = JSON.parse(data) as {\n choices?: { delta?: { content?: string } }[];\n usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n x_groq?: { usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number } };\n };\n\n const content = parsed.choices?.[0]?.delta?.content ?? \"\";\n const usage = parsed.usage ?? parsed.x_groq?.usage;\n if (usage) {\n promptTokens = usage.prompt_tokens;\n completionTokens = usage.completion_tokens;\n }\n\n if (content || usage) {\n yield {\n text: content,\n tokens: { prompt: promptTokens, completion: completionTokens, total: promptTokens + completionTokens },\n };\n }\n } catch {\n // Skip unparseable chunks\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n"]}
|