claude-memory-layer 1.0.2 → 1.0.4
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/.claude/settings.local.json +3 -1
- package/.history/package_20260201133143.json +45 -0
- package/CLAUDE.md +14 -0
- package/dist/cli/index.js +836 -9
- package/dist/cli/index.js.map +4 -4
- package/dist/core/index.js +782 -3
- package/dist/core/index.js.map +4 -4
- package/dist/hooks/session-end.js +836 -9
- package/dist/hooks/session-end.js.map +4 -4
- package/dist/hooks/session-start.js +836 -9
- package/dist/hooks/session-start.js.map +4 -4
- package/dist/hooks/stop.js +836 -9
- package/dist/hooks/stop.js.map +4 -4
- package/dist/hooks/user-prompt-submit.js +839 -10
- package/dist/hooks/user-prompt-submit.js.map +4 -4
- package/dist/services/memory-service.js +836 -9
- package/dist/services/memory-service.js.map +4 -4
- package/package.json +1 -1
- package/src/core/index.ts +6 -0
- package/src/core/retriever.ts +118 -2
- package/src/core/shared-event-store.ts +114 -0
- package/src/core/shared-promoter.ts +249 -0
- package/src/core/shared-store.ts +289 -0
- package/src/core/shared-vector-store.ts +203 -0
- package/src/core/types.ts +69 -2
- package/src/hooks/user-prompt-submit.ts +6 -2
- package/src/services/memory-service.ts +145 -6
package/dist/core/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/core/types.ts", "../../src/core/canonical-key.ts", "../../src/core/event-store.ts", "../../src/core/db-wrapper.ts", "../../src/core/entity-repo.ts", "../../src/core/edge-repo.ts", "../../src/core/vector-store.ts", "../../src/core/embedder.ts", "../../src/core/vector-outbox.ts", "../../src/core/vector-worker.ts", "../../src/core/matcher.ts", "../../src/core/evidence-aligner.ts", "../../src/core/retriever.ts", "../../src/core/graduation.ts", "../../src/core/task/task-matcher.ts", "../../src/core/task/blocker-resolver.ts", "../../src/core/task/task-resolver.ts", "../../src/core/task/task-projector.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Core types for code-memory plugin\n * Idris2 inspired: Complete, immutable type definitions with Zod validation\n */\n\nimport { z } from 'zod';\n\n// ============================================================\n// Event Types\n// ============================================================\n\nexport const EventTypeSchema = z.enum([\n 'user_prompt',\n 'agent_response',\n 'session_summary',\n 'tool_observation'\n]);\nexport type EventType = z.infer<typeof EventTypeSchema>;\n\n// ============================================================\n// Memory Event (L0 EventStore)\n// ============================================================\n\nexport const MemoryEventSchema = z.object({\n id: z.string().uuid(),\n eventType: EventTypeSchema,\n sessionId: z.string(),\n timestamp: z.date(),\n content: z.string(),\n canonicalKey: z.string(),\n dedupeKey: z.string(),\n metadata: z.record(z.unknown()).optional()\n});\nexport type MemoryEvent = z.infer<typeof MemoryEventSchema>;\n\n// Input for creating new events (id, dedupeKey generated automatically)\nexport const MemoryEventInputSchema = MemoryEventSchema.omit({\n id: true,\n dedupeKey: true,\n canonicalKey: true\n});\nexport type MemoryEventInput = z.infer<typeof MemoryEventInputSchema>;\n\n// ============================================================\n// Session\n// ============================================================\n\nexport const SessionSchema = z.object({\n id: z.string(),\n startedAt: z.date(),\n endedAt: z.date().optional(),\n projectPath: z.string().optional(),\n summary: z.string().optional(),\n tags: z.array(z.string()).optional()\n});\nexport type Session = z.infer<typeof SessionSchema>;\n\n// ============================================================\n// Insight (L1 Structured)\n// ============================================================\n\nexport const InsightTypeSchema = z.enum([\n 'preference',\n 'pattern',\n 'expertise'\n]);\nexport type InsightType = z.infer<typeof InsightTypeSchema>;\n\nexport const InsightSchema = z.object({\n id: z.string().uuid(),\n insightType: InsightTypeSchema,\n content: z.string(),\n canonicalKey: z.string(),\n confidence: z.number().min(0).max(1),\n sourceEvents: z.array(z.string().uuid()),\n createdAt: z.date(),\n lastUpdated: z.date()\n});\nexport type Insight = z.infer<typeof InsightSchema>;\n\n// ============================================================\n// Memory Match (Search Result)\n// ============================================================\n\nexport const MemoryMatchSchema = z.object({\n event: MemoryEventSchema,\n score: z.number().min(0).max(1),\n relevanceReason: z.string().optional()\n});\nexport type MemoryMatch = z.infer<typeof MemoryMatchSchema>;\n\n// ============================================================\n// Match Confidence (AXIOMMIND)\n// ============================================================\n\nexport const MatchConfidenceSchema = z.enum(['high', 'suggested', 'none']);\nexport type MatchConfidence = z.infer<typeof MatchConfidenceSchema>;\n\nexport const MatchResultSchema = z.object({\n match: MemoryMatchSchema.nullable(),\n confidence: MatchConfidenceSchema,\n gap: z.number().optional(),\n alternatives: z.array(MemoryMatchSchema).optional()\n});\nexport type MatchResult = z.infer<typeof MatchResultSchema>;\n\n// AXIOMMIND Matching Thresholds\nexport const MATCH_THRESHOLDS = {\n minCombinedScore: 0.92,\n minGap: 0.03,\n suggestionThreshold: 0.75\n} as const;\n\n// ============================================================\n// Memory Level (Graduation Pipeline)\n// ============================================================\n\nexport const MemoryLevelSchema = z.enum(['L0', 'L1', 'L2', 'L3', 'L4']);\nexport type MemoryLevel = z.infer<typeof MemoryLevelSchema>;\n\nexport const GraduationResultSchema = z.object({\n eventId: z.string().uuid(),\n fromLevel: MemoryLevelSchema,\n toLevel: MemoryLevelSchema,\n success: z.boolean(),\n reason: z.string().optional()\n});\nexport type GraduationResult = z.infer<typeof GraduationResultSchema>;\n\n// ============================================================\n// Evidence Span (AXIOMMIND Principle 4)\n// ============================================================\n\nexport const EvidenceSpanSchema = z.object({\n start: z.number().int().nonnegative(),\n end: z.number().int().positive(),\n confidence: z.number().min(0).max(1),\n matchType: z.enum(['exact', 'fuzzy', 'none']),\n originalQuote: z.string(),\n alignedText: z.string()\n});\nexport type EvidenceSpan = z.infer<typeof EvidenceSpanSchema>;\n\n// ============================================================\n// Configuration\n// ============================================================\n\nexport const ConfigSchema = z.object({\n storage: z.object({\n path: z.string().default('~/.claude-code/memory'),\n maxSizeMB: z.number().default(500)\n }).default({}),\n embedding: z.object({\n provider: z.enum(['local', 'openai']).default('local'),\n model: z.string().default('Xenova/all-MiniLM-L6-v2'),\n openaiModel: z.string().default('text-embedding-3-small'),\n batchSize: z.number().default(32)\n }).default({}),\n retrieval: z.object({\n topK: z.number().default(5),\n minScore: z.number().default(0.7),\n maxTokens: z.number().default(2000)\n }).default({}),\n matching: z.object({\n minCombinedScore: z.number().default(0.92),\n minGap: z.number().default(0.03),\n suggestionThreshold: z.number().default(0.75),\n weights: z.object({\n semanticSimilarity: z.number().default(0.4),\n ftsScore: z.number().default(0.25),\n recencyBonus: z.number().default(0.2),\n statusWeight: z.number().default(0.15)\n }).default({})\n }).default({}),\n privacy: z.object({\n excludePatterns: z.array(z.string()).default(['password', 'secret', 'api_key', 'token', 'bearer']),\n anonymize: z.boolean().default(false),\n privateTags: z.object({\n enabled: z.boolean().default(true),\n marker: z.enum(['[PRIVATE]', '[REDACTED]', '']).default('[PRIVATE]'),\n preserveLineCount: z.boolean().default(false),\n supportedFormats: z.array(z.enum(['xml', 'bracket', 'comment'])).default(['xml'])\n }).default({})\n }).default({}),\n toolObservation: z.object({\n enabled: z.boolean().default(true),\n excludedTools: z.array(z.string()).default(['TodoWrite', 'TodoRead']),\n maxOutputLength: z.number().default(10000),\n maxOutputLines: z.number().default(100),\n storeOnlyOnSuccess: z.boolean().default(false)\n }).default({}),\n features: z.object({\n autoSave: z.boolean().default(true),\n sessionSummary: z.boolean().default(true),\n insightExtraction: z.boolean().default(true),\n crossProjectLearning: z.boolean().default(false),\n singleWriterMode: z.boolean().default(true)\n }).default({}),\n mode: z.enum(['session', 'endless']).default('session'),\n endless: z.object({\n enabled: z.boolean().default(false),\n workingSet: z.object({\n maxEvents: z.number().default(100),\n timeWindowHours: z.number().default(24),\n minRelevanceScore: z.number().default(0.5)\n }).default({}),\n consolidation: z.object({\n triggerIntervalMs: z.number().default(3600000),\n triggerEventCount: z.number().default(100),\n triggerIdleMs: z.number().default(1800000),\n useLLMSummarization: z.boolean().default(false)\n }).default({}),\n continuity: z.object({\n minScoreForSeamless: z.number().default(0.7),\n topicDecayHours: z.number().default(48)\n }).default({})\n }).optional()\n});\nexport type Config = z.infer<typeof ConfigSchema>;\n\n// ============================================================\n// Append Result (AXIOMMIND Principle 2: Append-only)\n// ============================================================\n\nexport type AppendResult =\n | { success: true; eventId: string; isDuplicate: false }\n | { success: true; eventId: string; isDuplicate: true }\n | { success: false; error: string };\n\n// ============================================================\n// Hook Input/Output Types\n// ============================================================\n\nexport interface SessionStartInput {\n session_id: string;\n cwd: string;\n}\n\nexport interface SessionStartOutput {\n context?: string;\n}\n\nexport interface UserPromptSubmitInput {\n session_id: string;\n prompt: string;\n}\n\nexport interface UserPromptSubmitOutput {\n context?: string;\n}\n\nexport interface StopInput {\n session_id: string;\n stop_reason: string;\n messages: Array<{ role: string; content: string }>;\n}\n\nexport interface SessionEndInput {\n session_id: string;\n}\n\n// PostToolUse Hook Input\nexport interface PostToolUseInput {\n tool_name: string;\n tool_input: Record<string, unknown>;\n tool_output: string;\n tool_error?: string;\n session_id: string;\n started_at: string;\n ended_at: string;\n}\n\n// ============================================================\n// Tool Observation Types\n// ============================================================\n\nexport const ToolMetadataSchema = z.object({\n filePath: z.string().optional(),\n fileType: z.string().optional(),\n lineCount: z.number().optional(),\n command: z.string().optional(),\n exitCode: z.number().optional(),\n pattern: z.string().optional(),\n matchCount: z.number().optional(),\n url: z.string().optional(),\n statusCode: z.number().optional()\n});\nexport type ToolMetadata = z.infer<typeof ToolMetadataSchema>;\n\nexport const ToolObservationPayloadSchema = z.object({\n toolName: z.string(),\n toolInput: z.record(z.unknown()),\n toolOutput: z.string(),\n durationMs: z.number(),\n success: z.boolean(),\n errorMessage: z.string().optional(),\n metadata: ToolMetadataSchema.optional()\n});\nexport type ToolObservationPayload = z.infer<typeof ToolObservationPayloadSchema>;\n\n// ============================================================\n// Vector Record\n// ============================================================\n\nexport interface VectorRecord {\n id: string;\n eventId: string;\n sessionId: string;\n eventType: string;\n content: string;\n vector: number[];\n timestamp: string;\n metadata?: Record<string, unknown>;\n}\n\n// ============================================================\n// Outbox Item (Single-Writer Pattern)\n// ============================================================\n\nexport interface OutboxItem {\n id: string;\n eventId: string;\n content: string;\n status: 'pending' | 'processing' | 'done' | 'failed';\n retryCount: number;\n createdAt: Date;\n errorMessage?: string;\n}\n\n// ============================================================\n// Entity Types (Task, Condition, Artifact)\n// ============================================================\n\nexport const EntityTypeSchema = z.enum(['task', 'condition', 'artifact']);\nexport type EntityType = z.infer<typeof EntityTypeSchema>;\n\nexport const TaskStatusSchema = z.enum([\n 'pending',\n 'in_progress',\n 'blocked',\n 'done',\n 'cancelled'\n]);\nexport type TaskStatus = z.infer<typeof TaskStatusSchema>;\n\nexport const TaskPrioritySchema = z.enum(['low', 'medium', 'high', 'critical']);\nexport type TaskPriority = z.infer<typeof TaskPrioritySchema>;\n\nexport const EntityStageSchema = z.enum([\n 'raw',\n 'working',\n 'candidate',\n 'verified',\n 'certified'\n]);\nexport type EntityStage = z.infer<typeof EntityStageSchema>;\n\nexport const EntityStatusSchema = z.enum([\n 'active',\n 'contested',\n 'deprecated',\n 'superseded'\n]);\nexport type EntityStatus = z.infer<typeof EntityStatusSchema>;\n\n// Base Entity schema\nexport const EntitySchema = z.object({\n entityId: z.string(),\n entityType: EntityTypeSchema,\n canonicalKey: z.string(),\n title: z.string(),\n stage: EntityStageSchema,\n status: EntityStatusSchema,\n currentJson: z.record(z.unknown()),\n titleNorm: z.string().optional(),\n searchText: z.string().optional(),\n createdAt: z.date(),\n updatedAt: z.date()\n});\nexport type Entity = z.infer<typeof EntitySchema>;\n\n// Task-specific current_json structure\nexport const TaskCurrentJsonSchema = z.object({\n status: TaskStatusSchema,\n priority: TaskPrioritySchema.optional(),\n blockers: z.array(z.string()).optional(),\n blockerSuggestions: z.array(z.string()).optional(),\n description: z.string().optional(),\n project: z.string().optional()\n});\nexport type TaskCurrentJson = z.infer<typeof TaskCurrentJsonSchema>;\n\n// Entity alias for canonical key lookup\nexport const EntityAliasSchema = z.object({\n entityType: EntityTypeSchema,\n canonicalKey: z.string(),\n entityId: z.string(),\n isPrimary: z.boolean()\n});\nexport type EntityAlias = z.infer<typeof EntityAliasSchema>;\n\n// ============================================================\n// Edge Types (Relationships)\n// ============================================================\n\nexport const NodeTypeSchema = z.enum(['entry', 'entity', 'event']);\nexport type NodeType = z.infer<typeof NodeTypeSchema>;\n\nexport const RelationTypeSchema = z.enum([\n 'evidence_of',\n 'blocked_by',\n 'blocked_by_suggested',\n 'resolves_to',\n 'derived_from',\n 'supersedes',\n 'source_of'\n]);\nexport type RelationType = z.infer<typeof RelationTypeSchema>;\n\nexport const EdgeSchema = z.object({\n edgeId: z.string(),\n srcType: NodeTypeSchema,\n srcId: z.string(),\n relType: RelationTypeSchema,\n dstType: NodeTypeSchema,\n dstId: z.string(),\n metaJson: z.record(z.unknown()).optional(),\n createdAt: z.date()\n});\nexport type Edge = z.infer<typeof EdgeSchema>;\n\n// ============================================================\n// Task Event Types (SoT for Task Entity)\n// ============================================================\n\nexport const TaskEventTypeSchema = z.enum([\n 'task_created',\n 'task_status_changed',\n 'task_priority_changed',\n 'task_blockers_set',\n 'task_transition_rejected',\n 'condition_declared',\n 'artifact_declared',\n 'condition_resolved_to'\n]);\nexport type TaskEventType = z.infer<typeof TaskEventTypeSchema>;\n\nexport const BlockerModeSchema = z.enum(['replace', 'suggest']);\nexport type BlockerMode = z.infer<typeof BlockerModeSchema>;\n\nexport const BlockerKindSchema = z.enum(['task', 'condition', 'artifact']);\nexport type BlockerKind = z.infer<typeof BlockerKindSchema>;\n\nexport const BlockerRefSchema = z.object({\n kind: BlockerKindSchema,\n entityId: z.string(),\n rawText: z.string().optional(),\n confidence: z.number().min(0).max(1).optional(),\n candidates: z.array(z.string()).optional()\n});\nexport type BlockerRef = z.infer<typeof BlockerRefSchema>;\n\n// Task event payloads\nexport const TaskCreatedPayloadSchema = z.object({\n taskId: z.string(),\n title: z.string(),\n canonicalKey: z.string(),\n initialStatus: TaskStatusSchema,\n priority: TaskPrioritySchema.optional(),\n description: z.string().optional(),\n project: z.string().optional()\n});\nexport type TaskCreatedPayload = z.infer<typeof TaskCreatedPayloadSchema>;\n\nexport const TaskStatusChangedPayloadSchema = z.object({\n taskId: z.string(),\n fromStatus: TaskStatusSchema,\n toStatus: TaskStatusSchema,\n reason: z.string().optional()\n});\nexport type TaskStatusChangedPayload = z.infer<typeof TaskStatusChangedPayloadSchema>;\n\nexport const TaskBlockersSetPayloadSchema = z.object({\n taskId: z.string(),\n mode: BlockerModeSchema,\n blockers: z.array(BlockerRefSchema),\n sourceEntryId: z.string().optional()\n});\nexport type TaskBlockersSetPayload = z.infer<typeof TaskBlockersSetPayloadSchema>;\n\n// ============================================================\n// Entry Types (Immutable memory units)\n// ============================================================\n\nexport const EntryTypeSchema = z.enum([\n 'fact',\n 'decision',\n 'insight',\n 'task_note',\n 'reference',\n 'preference',\n 'pattern'\n]);\nexport type EntryType = z.infer<typeof EntryTypeSchema>;\n\nexport const EntrySchema = z.object({\n entryId: z.string(),\n createdTs: z.date(),\n entryType: EntryTypeSchema,\n title: z.string(),\n contentJson: z.record(z.unknown()),\n stage: EntityStageSchema,\n status: EntityStatusSchema,\n supersededBy: z.string().optional(),\n buildId: z.string().optional(),\n evidenceJson: z.record(z.unknown()).optional(),\n canonicalKey: z.string()\n});\nexport type Entry = z.infer<typeof EntrySchema>;\n\n// ============================================================\n// Evidence Aligner V2 Types\n// ============================================================\n\nexport const ExtractedEvidenceSchema = z.object({\n messageIndex: z.number().int().nonnegative(),\n quote: z.string()\n});\nexport type ExtractedEvidence = z.infer<typeof ExtractedEvidenceSchema>;\n\nexport const AlignedEvidenceSchema = z.object({\n messageIndex: z.number().int().nonnegative(),\n quote: z.string(),\n spanStart: z.number().int().nonnegative(),\n spanEnd: z.number().int().positive(),\n quoteHash: z.string(),\n confidence: z.number().min(0).max(1),\n matchMethod: z.enum(['exact', 'normalized', 'fuzzy'])\n});\nexport type AlignedEvidence = z.infer<typeof AlignedEvidenceSchema>;\n\nexport const FailedEvidenceSchema = z.object({\n messageIndex: z.number().int().nonnegative(),\n quote: z.string(),\n failureReason: z.enum(['not_found', 'below_threshold', 'ambiguous', 'empty_quote', 'invalid_index'])\n});\nexport type FailedEvidence = z.infer<typeof FailedEvidenceSchema>;\n\nexport const EvidenceAlignResultSchema = z.discriminatedUnion('aligned', [\n z.object({ aligned: z.literal(true), evidence: AlignedEvidenceSchema }),\n z.object({ aligned: z.literal(false), evidence: FailedEvidenceSchema })\n]);\nexport type EvidenceAlignResult = z.infer<typeof EvidenceAlignResultSchema>;\n\n// ============================================================\n// Vector Outbox V2 Types\n// ============================================================\n\nexport const OutboxStatusSchema = z.enum(['pending', 'processing', 'done', 'failed']);\nexport type OutboxStatus = z.infer<typeof OutboxStatusSchema>;\n\nexport const OutboxItemKindSchema = z.enum(['entry', 'task_title', 'event']);\nexport type OutboxItemKind = z.infer<typeof OutboxItemKindSchema>;\n\nexport const OutboxJobSchema = z.object({\n jobId: z.string(),\n itemKind: OutboxItemKindSchema,\n itemId: z.string(),\n embeddingVersion: z.string(),\n status: OutboxStatusSchema,\n retryCount: z.number().int().nonnegative(),\n error: z.string().optional(),\n createdAt: z.date(),\n updatedAt: z.date()\n});\nexport type OutboxJob = z.infer<typeof OutboxJobSchema>;\n\n// Valid state transitions for outbox\nexport const VALID_OUTBOX_TRANSITIONS: Array<{ from: OutboxStatus; to: OutboxStatus }> = [\n { from: 'pending', to: 'processing' },\n { from: 'processing', to: 'done' },\n { from: 'processing', to: 'failed' },\n { from: 'failed', to: 'pending' }\n];\n\n// ============================================================\n// Build Runs (Pipeline metadata)\n// ============================================================\n\nexport const BuildRunSchema = z.object({\n buildId: z.string(),\n startedAt: z.date(),\n finishedAt: z.date().optional(),\n extractorModel: z.string(),\n extractorPromptHash: z.string(),\n embedderModel: z.string(),\n embeddingVersion: z.string(),\n idrisVersion: z.string(),\n schemaVersion: z.string(),\n status: z.enum(['running', 'success', 'failed']),\n error: z.string().optional()\n});\nexport type BuildRun = z.infer<typeof BuildRunSchema>;\n\n// ============================================================\n// Pipeline Metrics\n// ============================================================\n\nexport const PipelineMetricSchema = z.object({\n id: z.string(),\n ts: z.date(),\n stage: z.string(),\n latencyMs: z.number(),\n success: z.boolean(),\n error: z.string().optional(),\n sessionId: z.string().optional()\n});\nexport type PipelineMetric = z.infer<typeof PipelineMetricSchema>;\n\n// ============================================================\n// Progressive Disclosure Types\n// ============================================================\n\n// Layer 1: Search Index (lightweight)\nexport const SearchIndexItemSchema = z.object({\n id: z.string(),\n summary: z.string().max(100),\n score: z.number(),\n type: z.enum(['user_prompt', 'agent_response', 'session_summary', 'tool_observation']),\n timestamp: z.date(),\n sessionId: z.string()\n});\nexport type SearchIndexItem = z.infer<typeof SearchIndexItemSchema>;\n\n// Layer 2: Timeline\nexport const TimelineItemSchema = z.object({\n id: z.string(),\n timestamp: z.date(),\n type: z.enum(['user_prompt', 'agent_response', 'session_summary', 'tool_observation']),\n preview: z.string().max(200),\n isTarget: z.boolean()\n});\nexport type TimelineItem = z.infer<typeof TimelineItemSchema>;\n\n// Layer 3: Full Detail\nexport const FullDetailSchema = z.object({\n id: z.string(),\n content: z.string(),\n type: z.enum(['user_prompt', 'agent_response', 'session_summary', 'tool_observation']),\n timestamp: z.date(),\n sessionId: z.string(),\n citationId: z.string().optional(),\n metadata: z.object({\n tokenCount: z.number(),\n hasCode: z.boolean(),\n files: z.array(z.string()).optional(),\n tools: z.array(z.string()).optional()\n })\n});\nexport type FullDetail = z.infer<typeof FullDetailSchema>;\n\n// Progressive Search Result\nexport const ProgressiveSearchResultSchema = z.object({\n index: z.array(SearchIndexItemSchema),\n timeline: z.array(TimelineItemSchema).optional(),\n details: z.array(FullDetailSchema).optional(),\n meta: z.object({\n totalMatches: z.number(),\n expandedCount: z.number(),\n estimatedTokens: z.number(),\n expansionReason: z.string().optional()\n })\n});\nexport type ProgressiveSearchResult = z.infer<typeof ProgressiveSearchResultSchema>;\n\n// Progressive Disclosure Config\nexport const ProgressiveDisclosureConfigSchema = z.object({\n enabled: z.boolean().default(true),\n layer1: z.object({\n topK: z.number().default(10),\n minScore: z.number().default(0.7)\n }).default({}),\n autoExpand: z.object({\n enabled: z.boolean().default(true),\n highConfidenceThreshold: z.number().default(0.92),\n scoreGapThreshold: z.number().default(0.1),\n maxAutoExpandCount: z.number().default(3)\n }).default({}),\n tokenBudget: z.object({\n maxTotalTokens: z.number().default(2000),\n layer1PerItem: z.number().default(50),\n layer2PerItem: z.number().default(40),\n layer3PerItem: z.number().default(500)\n }).default({})\n});\nexport type ProgressiveDisclosureConfig = z.infer<typeof ProgressiveDisclosureConfigSchema>;\n\n// ============================================================\n// Citation Types\n// ============================================================\n\nexport const CitationSchema = z.object({\n citationId: z.string().length(6),\n eventId: z.string(),\n createdAt: z.date()\n});\nexport type Citation = z.infer<typeof CitationSchema>;\n\nexport const CitationUsageSchema = z.object({\n usageId: z.string(),\n citationId: z.string(),\n sessionId: z.string(),\n usedAt: z.date(),\n context: z.string().optional()\n});\nexport type CitationUsage = z.infer<typeof CitationUsageSchema>;\n\nexport interface CitedSearchResult {\n event: MemoryEvent;\n citation: Citation;\n score: number;\n}\n\nexport interface CitationStats {\n usageCount: number;\n lastUsed: Date | null;\n}\n\n// ============================================================\n// Endless Mode Types\n// ============================================================\n\nexport const MemoryModeSchema = z.enum(['session', 'endless']);\nexport type MemoryMode = z.infer<typeof MemoryModeSchema>;\n\nexport const EndlessModeConfigSchema = z.object({\n enabled: z.boolean().default(false),\n\n workingSet: z.object({\n maxEvents: z.number().default(100),\n timeWindowHours: z.number().default(24),\n minRelevanceScore: z.number().default(0.5)\n }).default({}),\n\n consolidation: z.object({\n triggerIntervalMs: z.number().default(3600000), // 1 hour\n triggerEventCount: z.number().default(100),\n triggerIdleMs: z.number().default(1800000), // 30 minutes\n useLLMSummarization: z.boolean().default(false)\n }).default({}),\n\n continuity: z.object({\n minScoreForSeamless: z.number().default(0.7),\n topicDecayHours: z.number().default(48)\n }).default({})\n});\nexport type EndlessModeConfig = z.infer<typeof EndlessModeConfigSchema>;\n\n// Working Set Item\nexport const WorkingSetItemSchema = z.object({\n id: z.string(),\n eventId: z.string(),\n addedAt: z.date(),\n relevanceScore: z.number(),\n topics: z.array(z.string()).optional(),\n expiresAt: z.date()\n});\nexport type WorkingSetItem = z.infer<typeof WorkingSetItemSchema>;\n\n// Working Set\nexport interface WorkingSet {\n recentEvents: MemoryEvent[];\n lastActivity: Date;\n continuityScore: number;\n}\n\n// Consolidated Memory\nexport const ConsolidatedMemorySchema = z.object({\n memoryId: z.string(),\n summary: z.string(),\n topics: z.array(z.string()),\n sourceEvents: z.array(z.string()),\n confidence: z.number(),\n createdAt: z.date(),\n accessedAt: z.date().optional(),\n accessCount: z.number().default(0)\n});\nexport type ConsolidatedMemory = z.infer<typeof ConsolidatedMemorySchema>;\n\n// Consolidated Memory Input (for creation)\nexport interface ConsolidatedMemoryInput {\n summary: string;\n topics: string[];\n sourceEvents: string[];\n confidence: number;\n}\n\n// Event Group (for consolidation)\nexport interface EventGroup {\n topics: string[];\n events: MemoryEvent[];\n}\n\n// Context Snapshot (for continuity calculation)\nexport interface ContextSnapshot {\n id: string;\n timestamp: number;\n topics: string[];\n files: string[];\n entities: string[];\n}\n\n// Transition Type\nexport const TransitionTypeSchema = z.enum(['seamless', 'topic_shift', 'break']);\nexport type TransitionType = z.infer<typeof TransitionTypeSchema>;\n\n// Continuity Score Result\nexport interface ContinuityScore {\n score: number;\n transitionType: TransitionType;\n}\n\n// Continuity Log\nexport const ContinuityLogSchema = z.object({\n logId: z.string(),\n fromContextId: z.string().optional(),\n toContextId: z.string().optional(),\n continuityScore: z.number(),\n transitionType: TransitionTypeSchema,\n createdAt: z.date()\n});\nexport type ContinuityLog = z.infer<typeof ContinuityLogSchema>;\n\n// Endless Mode Status\nexport interface EndlessModeStatus {\n mode: MemoryMode;\n workingSetSize: number;\n continuityScore: number;\n consolidatedCount: number;\n lastConsolidation: Date | null;\n}\n", "/**\n * AXIOMMIND canonical_key.py port\n * Deterministic normalization ensuring identical titles always map to same keys\n */\n\nimport { createHash } from 'crypto';\n\nconst MAX_KEY_LENGTH = 200;\n\n/**\n * Convert text to a normalized canonical key\n *\n * Normalization steps:\n * 1. NFKC unicode normalization\n * 2. Lowercase conversion\n * 3. Punctuation removal\n * 4. Consecutive whitespace cleanup\n * 5. Context addition (optional)\n * 6. Long key truncation with MD5\n */\nexport function makeCanonicalKey(\n title: string,\n context?: { project?: string; sessionId?: string }\n): string {\n // Step 1: NFKC normalization\n let normalized = title.normalize('NFKC');\n\n // Step 2: Lowercase conversion\n normalized = normalized.toLowerCase();\n\n // Step 3: Punctuation removal (unicode compatible)\n normalized = normalized.replace(/[^\\p{L}\\p{N}\\s]/gu, '');\n\n // Step 4: Consecutive whitespace cleanup\n normalized = normalized.replace(/\\s+/g, ' ').trim();\n\n // Step 5: Context addition\n let key = normalized;\n if (context?.project) {\n key = `${context.project}::${key}`;\n }\n\n // Step 6: Long key handling\n if (key.length > MAX_KEY_LENGTH) {\n const hashSuffix = createHash('md5').update(key).digest('hex').slice(0, 8);\n key = key.slice(0, MAX_KEY_LENGTH - 9) + '_' + hashSuffix;\n }\n\n return key;\n}\n\n/**\n * Check if two texts have the same canonical key\n */\nexport function isSameCanonicalKey(a: string, b: string): boolean {\n return makeCanonicalKey(a) === makeCanonicalKey(b);\n}\n\n/**\n * Generate dedupe key (content + session for uniqueness)\n * AXIOMMIND Principle 3: Idempotency guarantee\n */\nexport function makeDedupeKey(content: string, sessionId: string): string {\n const contentHash = createHash('sha256').update(content).digest('hex');\n return `${sessionId}:${contentHash}`;\n}\n\n/**\n * Generate content hash for deduplication\n */\nexport function hashContent(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n}\n\n// ============================================================\n// Entity Canonical Keys (Task Entity System)\n// ============================================================\n\nexport type EntityKeyType = 'task' | 'condition' | 'artifact';\n\n/**\n * Normalize text for entity key generation\n */\nfunction normalizeForKey(text: string): string {\n return text\n .normalize('NFKC')\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s]/gu, '')\n .replace(/\\s+/g, '_')\n .trim();\n}\n\n/**\n * Generate canonical key for entities\n * Format: {type}:{project}:{normalized_identifier}\n */\nexport function makeEntityCanonicalKey(\n entityType: EntityKeyType,\n identifier: string,\n context?: { project?: string }\n): string {\n const project = context?.project ?? 'default';\n\n switch (entityType) {\n case 'task':\n return `task:${project}:${normalizeForKey(identifier)}`;\n case 'condition':\n return `cond:${project}:${normalizeForKey(identifier)}`;\n case 'artifact':\n return makeArtifactKey(identifier);\n }\n}\n\n/**\n * Generate canonical key for artifacts based on identifier pattern\n * - URL: art:url:{sha1(url)}\n * - JIRA key: art:jira:{key}\n * - GitHub issue: art:gh_issue:{repo}:{num}\n * - Generic: art:generic:{sha1(identifier)}\n */\nexport function makeArtifactKey(identifier: string): string {\n // URL pattern\n if (/^https?:\\/\\//.test(identifier)) {\n const hash = createHash('sha1').update(identifier).digest('hex').slice(0, 12);\n return `art:url:${hash}`;\n }\n\n // JIRA key pattern (e.g., PROJ-123)\n const jiraMatch = identifier.match(/^([A-Z]+-\\d+)$/);\n if (jiraMatch) {\n return `art:jira:${jiraMatch[1].toLowerCase()}`;\n }\n\n // GitHub issue pattern (e.g., owner/repo#123)\n const ghMatch = identifier.match(/^([^\\/]+\\/[^#]+)#(\\d+)$/);\n if (ghMatch) {\n return `art:gh_issue:${ghMatch[1]}:${ghMatch[2]}`;\n }\n\n // Generic identifier\n const hash = createHash('sha1').update(identifier).digest('hex').slice(0, 12);\n return `art:generic:${hash}`;\n}\n\n/**\n * Generate dedupe key for task events\n */\nexport function makeTaskEventDedupeKey(\n eventType: string,\n taskId: string,\n sessionId: string,\n additionalContext?: string\n): string {\n const parts = [eventType, taskId, sessionId];\n if (additionalContext) {\n parts.push(additionalContext);\n }\n const combined = parts.join(':');\n return createHash('sha256').update(combined).digest('hex');\n}\n\n/**\n * Parse entity canonical key to extract type and identifier\n */\nexport function parseEntityCanonicalKey(canonicalKey: string): {\n entityType: EntityKeyType;\n project?: string;\n identifier: string;\n} | null {\n const taskMatch = canonicalKey.match(/^task:([^:]+):(.+)$/);\n if (taskMatch) {\n return { entityType: 'task', project: taskMatch[1], identifier: taskMatch[2] };\n }\n\n const condMatch = canonicalKey.match(/^cond:([^:]+):(.+)$/);\n if (condMatch) {\n return { entityType: 'condition', project: condMatch[1], identifier: condMatch[2] };\n }\n\n const artMatch = canonicalKey.match(/^art:([^:]+):(.+)$/);\n if (artMatch) {\n return { entityType: 'artifact', identifier: artMatch[2] };\n }\n\n return null;\n}\n", "/**\n * AXIOMMIND EventStore implementation\n * Principles: Append-only, Single Source of Truth, Idempotency\n */\n\nimport { randomUUID } from 'crypto';\nimport {\n MemoryEvent,\n MemoryEventInput,\n Session,\n AppendResult,\n OutboxItem\n} from './types.js';\nimport { makeCanonicalKey, makeDedupeKey } from './canonical-key.js';\nimport { createDatabase, dbRun, dbAll, dbClose, toDate, type Database } from './db-wrapper.js';\n\nexport class EventStore {\n private db: Database;\n private initialized = false;\n\n constructor(private dbPath: string) {\n this.db = createDatabase(dbPath);\n }\n\n /**\n * Initialize database schema\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // L0 EventStore: Single Source of Truth (immutable, append-only)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS events (\n id VARCHAR PRIMARY KEY,\n event_type VARCHAR NOT NULL,\n session_id VARCHAR NOT NULL,\n timestamp TIMESTAMP NOT NULL,\n content TEXT NOT NULL,\n canonical_key VARCHAR NOT NULL,\n dedupe_key VARCHAR UNIQUE,\n metadata JSON\n )\n `);\n\n // Dedup table for idempotency\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS event_dedup (\n dedupe_key VARCHAR PRIMARY KEY,\n event_id VARCHAR NOT NULL,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // Session metadata\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS sessions (\n id VARCHAR PRIMARY KEY,\n started_at TIMESTAMP NOT NULL,\n ended_at TIMESTAMP,\n project_path VARCHAR,\n summary TEXT,\n tags JSON\n )\n `);\n\n // Insights (derived data, rebuildable)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS insights (\n id VARCHAR PRIMARY KEY,\n insight_type VARCHAR NOT NULL,\n content TEXT NOT NULL,\n canonical_key VARCHAR NOT NULL,\n confidence FLOAT,\n source_events JSON,\n created_at TIMESTAMP,\n last_updated TIMESTAMP\n )\n `);\n\n // Embedding Outbox (Single-Writer Pattern)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS embedding_outbox (\n id VARCHAR PRIMARY KEY,\n event_id VARCHAR NOT NULL,\n content TEXT NOT NULL,\n status VARCHAR DEFAULT 'pending',\n retry_count INT DEFAULT 0,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n processed_at TIMESTAMP,\n error_message TEXT\n )\n `);\n\n // Projection offset tracking\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS projection_offsets (\n projection_name VARCHAR PRIMARY KEY,\n last_event_id VARCHAR,\n last_timestamp TIMESTAMP,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // Memory level tracking\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS memory_levels (\n event_id VARCHAR PRIMARY KEY,\n level VARCHAR NOT NULL DEFAULT 'L0',\n promoted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // ============================================================\n // Entity-Edge Model Tables\n // ============================================================\n\n // Entries (immutable memory units)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS entries (\n entry_id VARCHAR PRIMARY KEY,\n created_ts TIMESTAMP NOT NULL,\n entry_type VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n content_json JSON NOT NULL,\n stage VARCHAR NOT NULL DEFAULT 'raw',\n status VARCHAR DEFAULT 'active',\n superseded_by VARCHAR,\n build_id VARCHAR,\n evidence_json JSON,\n canonical_key VARCHAR,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // Entities (task/condition/artifact)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS entities (\n entity_id VARCHAR PRIMARY KEY,\n entity_type VARCHAR NOT NULL,\n canonical_key VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n stage VARCHAR NOT NULL DEFAULT 'raw',\n status VARCHAR NOT NULL DEFAULT 'active',\n current_json JSON NOT NULL,\n title_norm VARCHAR,\n search_text VARCHAR,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // Entity aliases for canonical key lookup\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS entity_aliases (\n entity_type VARCHAR NOT NULL,\n canonical_key VARCHAR NOT NULL,\n entity_id VARCHAR NOT NULL,\n is_primary BOOLEAN DEFAULT FALSE,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n PRIMARY KEY(entity_type, canonical_key)\n )\n `);\n\n // Edges (relationships between entries/entities)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS edges (\n edge_id VARCHAR PRIMARY KEY,\n src_type VARCHAR NOT NULL,\n src_id VARCHAR NOT NULL,\n rel_type VARCHAR NOT NULL,\n dst_type VARCHAR NOT NULL,\n dst_id VARCHAR NOT NULL,\n meta_json JSON,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // ============================================================\n // Vector Outbox V2 Table\n // ============================================================\n\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS vector_outbox (\n job_id VARCHAR PRIMARY KEY,\n item_kind VARCHAR NOT NULL,\n item_id VARCHAR NOT NULL,\n embedding_version VARCHAR NOT NULL,\n status VARCHAR NOT NULL DEFAULT 'pending',\n retry_count INT DEFAULT 0,\n error VARCHAR,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(item_kind, item_id, embedding_version)\n )\n `);\n\n // ============================================================\n // Build Runs & Metrics Tables\n // ============================================================\n\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS build_runs (\n build_id VARCHAR PRIMARY KEY,\n started_at TIMESTAMP NOT NULL,\n finished_at TIMESTAMP,\n extractor_model VARCHAR NOT NULL,\n extractor_prompt_hash VARCHAR NOT NULL,\n embedder_model VARCHAR NOT NULL,\n embedding_version VARCHAR NOT NULL,\n idris_version VARCHAR NOT NULL,\n schema_version VARCHAR NOT NULL,\n status VARCHAR NOT NULL DEFAULT 'running',\n error VARCHAR\n )\n `);\n\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS pipeline_metrics (\n id VARCHAR PRIMARY KEY,\n ts TIMESTAMP NOT NULL,\n stage VARCHAR NOT NULL,\n latency_ms DOUBLE NOT NULL,\n success BOOLEAN NOT NULL,\n error VARCHAR,\n session_id VARCHAR\n )\n `);\n\n // ============================================================\n // Endless Mode Tables\n // ============================================================\n\n // Working Set table (active memory window)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS working_set (\n id VARCHAR PRIMARY KEY,\n event_id VARCHAR NOT NULL,\n added_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n relevance_score FLOAT DEFAULT 1.0,\n topics JSON,\n expires_at TIMESTAMP\n )\n `);\n\n // Consolidated Memories table (long-term integrated memories)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS consolidated_memories (\n memory_id VARCHAR PRIMARY KEY,\n summary TEXT NOT NULL,\n topics JSON,\n source_events JSON,\n confidence FLOAT DEFAULT 0.5,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n accessed_at TIMESTAMP,\n access_count INTEGER DEFAULT 0\n )\n `);\n\n // Continuity Log table (tracks context transitions)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS continuity_log (\n log_id VARCHAR PRIMARY KEY,\n from_context_id VARCHAR,\n to_context_id VARCHAR,\n continuity_score FLOAT,\n transition_type VARCHAR,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // Endless Mode Config table\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS endless_config (\n key VARCHAR PRIMARY KEY,\n value JSON,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // ============================================================\n // Create Indexes\n // ============================================================\n\n // Entry indexes\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_entries_type ON entries(entry_type)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_entries_stage ON entries(stage)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_entries_canonical ON entries(canonical_key)`);\n\n // Entity indexes\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_entities_type_key ON entities(entity_type, canonical_key)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_entities_status ON entities(status)`);\n\n // Edge indexes\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_edges_src ON edges(src_id, rel_type)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_edges_dst ON edges(dst_id, rel_type)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_edges_rel ON edges(rel_type)`);\n\n // Outbox indexes\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_outbox_status ON vector_outbox(status)`);\n\n // Endless Mode indexes\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_working_set_expires ON working_set(expires_at)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_working_set_relevance ON working_set(relevance_score DESC)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_consolidated_confidence ON consolidated_memories(confidence DESC)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_continuity_created ON continuity_log(created_at)`);\n\n this.initialized = true;\n }\n\n /**\n * Append event to store (AXIOMMIND Principle 2: Append-only)\n * Returns existing event ID if duplicate (Principle 3: Idempotency)\n */\n async append(input: MemoryEventInput): Promise<AppendResult> {\n await this.initialize();\n\n const canonicalKey = makeCanonicalKey(input.content);\n const dedupeKey = makeDedupeKey(input.content, input.sessionId);\n\n // Check for duplicate\n const existing = await dbAll<{ event_id: string }>(\n this.db,\n `SELECT event_id FROM event_dedup WHERE dedupe_key = ?`,\n [dedupeKey]\n );\n\n if (existing.length > 0) {\n return {\n success: true,\n eventId: existing[0].event_id,\n isDuplicate: true\n };\n }\n\n const id = randomUUID();\n const timestamp = input.timestamp.toISOString();\n\n try {\n await dbRun(\n this.db,\n `INSERT INTO events (id, event_type, session_id, timestamp, content, canonical_key, dedupe_key, metadata)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n id,\n input.eventType,\n input.sessionId,\n timestamp,\n input.content,\n canonicalKey,\n dedupeKey,\n JSON.stringify(input.metadata || {})\n ]\n );\n\n await dbRun(\n this.db,\n `INSERT INTO event_dedup (dedupe_key, event_id) VALUES (?, ?)`,\n [dedupeKey, id]\n );\n\n // Initialize at L0\n await dbRun(\n this.db,\n `INSERT INTO memory_levels (event_id, level) VALUES (?, 'L0')`,\n [id]\n );\n\n return { success: true, eventId: id, isDuplicate: false };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * Get events by session ID\n */\n async getSessionEvents(sessionId: string): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE session_id = ? ORDER BY timestamp ASC`,\n [sessionId]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Get recent events\n */\n async getRecentEvents(limit: number = 100): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events ORDER BY timestamp DESC LIMIT ?`,\n [limit]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Get event by ID\n */\n async getEvent(id: string): Promise<MemoryEvent | null> {\n await this.initialize();\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE id = ?`,\n [id]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEvent(rows[0]);\n }\n\n /**\n * Create or update session\n */\n async upsertSession(session: Partial<Session> & { id: string }): Promise<void> {\n await this.initialize();\n\n const existing = await dbAll<{ id: string }>(\n this.db,\n `SELECT id FROM sessions WHERE id = ?`,\n [session.id]\n );\n\n if (existing.length === 0) {\n await dbRun(\n this.db,\n `INSERT INTO sessions (id, started_at, project_path, tags)\n VALUES (?, ?, ?, ?)`,\n [\n session.id,\n (session.startedAt || new Date()).toISOString(),\n session.projectPath || null,\n JSON.stringify(session.tags || [])\n ]\n );\n } else {\n const updates: string[] = [];\n const values: unknown[] = [];\n\n if (session.endedAt) {\n updates.push('ended_at = ?');\n values.push(session.endedAt.toISOString());\n }\n if (session.summary) {\n updates.push('summary = ?');\n values.push(session.summary);\n }\n if (session.tags) {\n updates.push('tags = ?');\n values.push(JSON.stringify(session.tags));\n }\n\n if (updates.length > 0) {\n values.push(session.id);\n await dbRun(\n this.db,\n `UPDATE sessions SET ${updates.join(', ')} WHERE id = ?`,\n values\n );\n }\n }\n }\n\n /**\n * Get session by ID\n */\n async getSession(id: string): Promise<Session | null> {\n await this.initialize();\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM sessions WHERE id = ?`,\n [id]\n );\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n return {\n id: row.id as string,\n startedAt: toDate(row.started_at),\n endedAt: row.ended_at ? toDate(row.ended_at) : undefined,\n projectPath: row.project_path as string | undefined,\n summary: row.summary as string | undefined,\n tags: row.tags ? JSON.parse(row.tags as string) : undefined\n };\n }\n\n /**\n * Add to embedding outbox (Single-Writer Pattern)\n */\n async enqueueForEmbedding(eventId: string, content: string): Promise<string> {\n await this.initialize();\n\n const id = randomUUID();\n await dbRun(\n this.db,\n `INSERT INTO embedding_outbox (id, event_id, content, status, retry_count)\n VALUES (?, ?, ?, 'pending', 0)`,\n [id, eventId, content]\n );\n\n return id;\n }\n\n /**\n * Get pending outbox items\n */\n async getPendingOutboxItems(limit: number = 32): Promise<OutboxItem[]> {\n await this.initialize();\n\n // First, get pending items\n const pending = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM embedding_outbox\n WHERE status = 'pending'\n ORDER BY created_at\n LIMIT ?`,\n [limit]\n );\n\n if (pending.length === 0) return [];\n\n // Update status to processing\n const ids = pending.map(r => r.id as string);\n const placeholders = ids.map(() => '?').join(',');\n await dbRun(\n this.db,\n `UPDATE embedding_outbox SET status = 'processing' WHERE id IN (${placeholders})`,\n ids\n );\n\n return pending.map(row => ({\n id: row.id as string,\n eventId: row.event_id as string,\n content: row.content as string,\n status: 'processing' as const,\n retryCount: row.retry_count as number,\n createdAt: toDate(row.created_at),\n errorMessage: row.error_message as string | undefined\n }));\n }\n\n /**\n * Mark outbox items as done\n */\n async completeOutboxItems(ids: string[]): Promise<void> {\n if (ids.length === 0) return;\n\n const placeholders = ids.map(() => '?').join(',');\n await dbRun(\n this.db,\n `DELETE FROM embedding_outbox WHERE id IN (${placeholders})`,\n ids\n );\n }\n\n /**\n * Mark outbox items as failed\n */\n async failOutboxItems(ids: string[], error: string): Promise<void> {\n if (ids.length === 0) return;\n\n const placeholders = ids.map(() => '?').join(',');\n await dbRun(\n this.db,\n `UPDATE embedding_outbox\n SET status = CASE WHEN retry_count >= 3 THEN 'failed' ELSE 'pending' END,\n retry_count = retry_count + 1,\n error_message = ?\n WHERE id IN (${placeholders})`,\n [error, ...ids]\n );\n }\n\n /**\n * Update memory level\n */\n async updateMemoryLevel(eventId: string, level: string): Promise<void> {\n await this.initialize();\n\n await dbRun(\n this.db,\n `UPDATE memory_levels SET level = ?, promoted_at = CURRENT_TIMESTAMP WHERE event_id = ?`,\n [level, eventId]\n );\n }\n\n /**\n * Get memory level statistics\n */\n async getLevelStats(): Promise<Array<{ level: string; count: number }>> {\n await this.initialize();\n\n const rows = await dbAll<{ level: string; count: number }>(\n this.db,\n `SELECT level, COUNT(*) as count FROM memory_levels GROUP BY level`\n );\n\n return rows;\n }\n\n // ============================================================\n // Endless Mode Helper Methods\n // ============================================================\n\n /**\n * Get database instance for Endless Mode stores\n */\n getDatabase(): Database {\n return this.db;\n }\n\n /**\n * Get config value for endless mode\n */\n async getEndlessConfig(key: string): Promise<unknown | null> {\n await this.initialize();\n\n const rows = await dbAll<{ value: string }>(\n this.db,\n `SELECT value FROM endless_config WHERE key = ?`,\n [key]\n );\n\n if (rows.length === 0) return null;\n return JSON.parse(rows[0].value);\n }\n\n /**\n * Set config value for endless mode\n */\n async setEndlessConfig(key: string, value: unknown): Promise<void> {\n await this.initialize();\n\n await dbRun(\n this.db,\n `INSERT OR REPLACE INTO endless_config (key, value, updated_at)\n VALUES (?, ?, CURRENT_TIMESTAMP)`,\n [key, JSON.stringify(value)]\n );\n }\n\n /**\n * Get all sessions\n */\n async getAllSessions(): Promise<Session[]> {\n await this.initialize();\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM sessions ORDER BY started_at DESC`\n );\n\n return rows.map(row => ({\n id: row.id as string,\n startedAt: toDate(row.started_at),\n endedAt: row.ended_at ? toDate(row.ended_at) : undefined,\n projectPath: row.project_path as string | undefined,\n summary: row.summary as string | undefined,\n tags: row.tags ? JSON.parse(row.tags as string) : undefined\n }));\n }\n\n /**\n * Close database connection\n */\n async close(): Promise<void> {\n await dbClose(this.db);\n }\n\n /**\n * Convert database row to MemoryEvent\n */\n private rowToEvent(row: Record<string, unknown>): MemoryEvent {\n return {\n id: row.id as string,\n eventType: row.event_type as 'user_prompt' | 'agent_response' | 'session_summary',\n sessionId: row.session_id as string,\n timestamp: toDate(row.timestamp),\n content: row.content as string,\n canonicalKey: row.canonical_key as string,\n dedupeKey: row.dedupe_key as string,\n metadata: row.metadata ? JSON.parse(row.metadata as string) : undefined\n };\n }\n}\n", "/**\n * DuckDB Promise Wrapper\n * Wraps the callback-based DuckDB API with Promise-based async/await interface\n */\n\nimport duckdb from 'duckdb';\n\nexport type Database = duckdb.Database;\n\n/**\n * Converts BigInt values to Number in an object\n * DuckDB returns BigInt for COUNT(*) and other aggregate functions\n */\nfunction convertBigInts<T>(obj: T): T {\n if (obj === null || obj === undefined) return obj;\n if (typeof obj === 'bigint') return Number(obj) as unknown as T;\n if (obj instanceof Date) return obj; // Preserve Date objects\n if (Array.isArray(obj)) return obj.map(convertBigInts) as unknown as T;\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n result[key] = convertBigInts(value);\n }\n return result as T;\n }\n return obj;\n}\n\n/**\n * Safely converts a value to a Date object\n * Handles both Date objects and string timestamps from DuckDB\n */\nexport function toDate(value: unknown): Date {\n if (value instanceof Date) return value;\n if (typeof value === 'string') return new Date(value);\n if (typeof value === 'number') return new Date(value);\n return new Date(String(value));\n}\n\n/**\n * Creates a new DuckDB database with Promise-based API\n */\nexport function createDatabase(path: string): Database {\n return new duckdb.Database(path);\n}\n\n/**\n * Promisified db.run() - executes a statement that doesn't return rows\n */\nexport function dbRun(db: Database, sql: string, params: unknown[] = []): Promise<void> {\n return new Promise((resolve, reject) => {\n if (params.length === 0) {\n db.run(sql, (err: Error | null) => {\n if (err) reject(err);\n else resolve();\n });\n } else {\n db.run(sql, ...params, (err: Error | null) => {\n if (err) reject(err);\n else resolve();\n });\n }\n });\n}\n\n/**\n * Promisified db.all() - executes a query and returns all rows\n * Automatically converts BigInt values to Number\n */\nexport function dbAll<T = Record<string, unknown>>(\n db: Database,\n sql: string,\n params: unknown[] = []\n): Promise<T[]> {\n return new Promise((resolve, reject) => {\n if (params.length === 0) {\n db.all(sql, (err: Error | null, rows: T[]) => {\n if (err) reject(err);\n else resolve(convertBigInts(rows || []));\n });\n } else {\n db.all(sql, ...params, (err: Error | null, rows: T[]) => {\n if (err) reject(err);\n else resolve(convertBigInts(rows || []));\n });\n }\n });\n}\n\n/**\n * Promisified db.close() - closes the database connection\n */\nexport function dbClose(db: Database): Promise<void> {\n return new Promise((resolve, reject) => {\n db.close((err: Error | null) => {\n if (err) reject(err);\n else resolve();\n });\n });\n}\n\n/**\n * Promisified db.exec() - executes multiple statements\n */\nexport function dbExec(db: Database, sql: string): Promise<void> {\n return new Promise((resolve, reject) => {\n db.exec(sql, (err: Error | null) => {\n if (err) reject(err);\n else resolve();\n });\n });\n}\n", "/**\n * Entity Repository - CRUD operations for Task/Condition/Artifact entities\n * AXIOMMIND Principle 5: Task is Entity\n */\n\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport { randomUUID } from 'crypto';\nimport type {\n Entity,\n EntityType,\n EntityStage,\n EntityStatus,\n EntityAlias,\n TaskCurrentJson\n} from './types.js';\nimport { makeEntityCanonicalKey } from './canonical-key.js';\n\nexport interface CreateEntityInput {\n entityType: EntityType;\n title: string;\n currentJson: Record<string, unknown>;\n project?: string;\n stage?: EntityStage;\n status?: EntityStatus;\n}\n\nexport interface UpdateEntityInput {\n currentJson?: Record<string, unknown>;\n stage?: EntityStage;\n status?: EntityStatus;\n searchText?: string;\n}\n\nexport class EntityRepo {\n constructor(private db: Database) {}\n\n /**\n * Create a new entity\n */\n async create(input: CreateEntityInput): Promise<Entity> {\n const entityId = randomUUID();\n const canonicalKey = makeEntityCanonicalKey(input.entityType, input.title, {\n project: input.project\n });\n\n const titleNorm = input.title.toLowerCase().trim();\n const searchText = `${input.title} ${JSON.stringify(input.currentJson)}`;\n\n const now = new Date();\n\n await dbRun(\n this.db,\n `INSERT INTO entities (\n entity_id, entity_type, canonical_key, title, stage, status,\n current_json, title_norm, search_text, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n entityId,\n input.entityType,\n canonicalKey,\n input.title,\n input.stage ?? 'raw',\n input.status ?? 'active',\n JSON.stringify(input.currentJson),\n titleNorm,\n searchText,\n now.toISOString(),\n now.toISOString()\n ]\n );\n\n // Create primary alias\n await dbRun(\n this.db,\n `INSERT INTO entity_aliases (entity_type, canonical_key, entity_id, is_primary)\n VALUES (?, ?, ?, TRUE)\n ON CONFLICT (entity_type, canonical_key) DO NOTHING`,\n [input.entityType, canonicalKey, entityId]\n );\n\n return {\n entityId,\n entityType: input.entityType,\n canonicalKey,\n title: input.title,\n stage: input.stage ?? 'raw',\n status: input.status ?? 'active',\n currentJson: input.currentJson,\n titleNorm,\n searchText,\n createdAt: now,\n updatedAt: now\n };\n }\n\n /**\n * Find entity by ID\n */\n async findById(entityId: string): Promise<Entity | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM entities WHERE entity_id = ?`,\n [entityId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEntity(rows[0]);\n }\n\n /**\n * Find entity by canonical key\n */\n async findByCanonicalKey(\n entityType: EntityType,\n canonicalKey: string\n ): Promise<Entity | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM entities\n WHERE entity_type = ? AND canonical_key = ?`,\n [entityType, canonicalKey]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEntity(rows[0]);\n }\n\n /**\n * Find or create entity by title (idempotent)\n */\n async findOrCreate(input: CreateEntityInput): Promise<{ entity: Entity; created: boolean }> {\n const canonicalKey = makeEntityCanonicalKey(input.entityType, input.title, {\n project: input.project\n });\n\n const existing = await this.findByCanonicalKey(input.entityType, canonicalKey);\n if (existing) {\n return { entity: existing, created: false };\n }\n\n const entity = await this.create(input);\n return { entity, created: true };\n }\n\n /**\n * Update entity\n */\n async update(entityId: string, input: UpdateEntityInput): Promise<Entity | null> {\n const existing = await this.findById(entityId);\n if (!existing) return null;\n\n const updates: string[] = [];\n const values: unknown[] = [];\n\n if (input.currentJson !== undefined) {\n updates.push('current_json = ?');\n values.push(JSON.stringify(input.currentJson));\n }\n if (input.stage !== undefined) {\n updates.push('stage = ?');\n values.push(input.stage);\n }\n if (input.status !== undefined) {\n updates.push('status = ?');\n values.push(input.status);\n }\n if (input.searchText !== undefined) {\n updates.push('search_text = ?');\n values.push(input.searchText);\n }\n\n updates.push('updated_at = ?');\n values.push(new Date().toISOString());\n\n values.push(entityId);\n\n await dbRun(\n this.db,\n `UPDATE entities SET ${updates.join(', ')} WHERE entity_id = ?`,\n values\n );\n\n return this.findById(entityId);\n }\n\n /**\n * List entities by type\n */\n async listByType(\n entityType: EntityType,\n options?: { status?: EntityStatus; limit?: number; offset?: number }\n ): Promise<Entity[]> {\n let query = `SELECT * FROM entities WHERE entity_type = ?`;\n const params: unknown[] = [entityType];\n\n if (options?.status) {\n query += ` AND status = ?`;\n params.push(options.status);\n }\n\n query += ` ORDER BY updated_at DESC`;\n\n if (options?.limit) {\n query += ` LIMIT ?`;\n params.push(options.limit);\n }\n if (options?.offset) {\n query += ` OFFSET ?`;\n params.push(options.offset);\n }\n\n const rows = await dbAll<Record<string, unknown>>(this.db, query, params);\n return rows.map(row => this.rowToEntity(row));\n }\n\n /**\n * Search entities by text\n */\n async search(\n query: string,\n options?: { entityType?: EntityType; limit?: number }\n ): Promise<Entity[]> {\n const searchPattern = `%${query.toLowerCase()}%`;\n\n let sql = `SELECT * FROM entities WHERE (title_norm LIKE ? OR search_text LIKE ?)`;\n const params: unknown[] = [searchPattern, searchPattern];\n\n if (options?.entityType) {\n sql += ` AND entity_type = ?`;\n params.push(options.entityType);\n }\n\n sql += ` AND status = 'active' ORDER BY updated_at DESC`;\n\n if (options?.limit) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n\n const rows = await dbAll<Record<string, unknown>>(this.db, sql, params);\n return rows.map(row => this.rowToEntity(row));\n }\n\n /**\n * Get tasks by status\n */\n async getTasksByStatus(status: string): Promise<Entity[]> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM entities\n WHERE entity_type = 'task'\n AND json_extract(current_json, '$.status') = ?\n AND status = 'active'\n ORDER BY updated_at DESC`,\n [status]\n );\n\n return rows.map(row => this.rowToEntity(row));\n }\n\n /**\n * Get blocked tasks with their blockers\n */\n async getBlockedTasksWithBlockers(): Promise<Array<{\n task: Entity;\n blockers: Array<{ entityId: string; entityType: string; title: string }>;\n }>> {\n const tasks = await this.getTasksByStatus('blocked');\n\n const results: Array<{\n task: Entity;\n blockers: Array<{ entityId: string; entityType: string; title: string }>;\n }> = [];\n\n for (const task of tasks) {\n const blockerEdges = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT e.dst_id, ent.entity_type, ent.title\n FROM edges e\n JOIN entities ent ON ent.entity_id = e.dst_id\n WHERE e.src_id = ? AND e.rel_type = 'blocked_by'`,\n [task.entityId]\n );\n\n results.push({\n task,\n blockers: blockerEdges.map(row => ({\n entityId: row.dst_id as string,\n entityType: row.entity_type as string,\n title: row.title as string\n }))\n });\n }\n\n return results;\n }\n\n /**\n * Add alias for entity\n */\n async addAlias(\n entityType: EntityType,\n canonicalKey: string,\n entityId: string\n ): Promise<void> {\n await dbRun(\n this.db,\n `INSERT INTO entity_aliases (entity_type, canonical_key, entity_id, is_primary)\n VALUES (?, ?, ?, FALSE)\n ON CONFLICT (entity_type, canonical_key) DO NOTHING`,\n [entityType, canonicalKey, entityId]\n );\n }\n\n /**\n * Find entity by alias\n */\n async findByAlias(entityType: EntityType, canonicalKey: string): Promise<Entity | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT e.* FROM entities e\n JOIN entity_aliases a ON e.entity_id = a.entity_id\n WHERE a.entity_type = ? AND a.canonical_key = ?`,\n [entityType, canonicalKey]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEntity(rows[0]);\n }\n\n /**\n * Convert database row to Entity\n */\n private rowToEntity(row: Record<string, unknown>): Entity {\n return {\n entityId: row.entity_id as string,\n entityType: row.entity_type as EntityType,\n canonicalKey: row.canonical_key as string,\n title: row.title as string,\n stage: row.stage as EntityStage,\n status: row.status as EntityStatus,\n currentJson: typeof row.current_json === 'string'\n ? JSON.parse(row.current_json)\n : row.current_json as Record<string, unknown>,\n titleNorm: row.title_norm as string | undefined,\n searchText: row.search_text as string | undefined,\n createdAt: toDate(row.created_at),\n updatedAt: toDate(row.updated_at)\n };\n }\n}\n", "/**\n * Edge Repository - CRUD operations for entity/entry relationships\n * AXIOMMIND Entity-Edge Model\n */\n\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport { randomUUID } from 'crypto';\nimport type { Edge, NodeType, RelationType } from './types.js';\n\nexport interface CreateEdgeInput {\n srcType: NodeType;\n srcId: string;\n relType: RelationType;\n dstType: NodeType;\n dstId: string;\n metaJson?: Record<string, unknown>;\n}\n\nexport class EdgeRepo {\n constructor(private db: Database) {}\n\n /**\n * Create a new edge (idempotent - ignores duplicates)\n */\n async create(input: CreateEdgeInput): Promise<Edge> {\n const edgeId = randomUUID();\n const now = new Date();\n\n await dbRun(\n this.db,\n `INSERT INTO edges (edge_id, src_type, src_id, rel_type, dst_type, dst_id, meta_json, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT DO NOTHING`,\n [\n edgeId,\n input.srcType,\n input.srcId,\n input.relType,\n input.dstType,\n input.dstId,\n JSON.stringify(input.metaJson ?? {}),\n now.toISOString()\n ]\n );\n\n return {\n edgeId,\n srcType: input.srcType,\n srcId: input.srcId,\n relType: input.relType,\n dstType: input.dstType,\n dstId: input.dstId,\n metaJson: input.metaJson,\n createdAt: now\n };\n }\n\n /**\n * Create or update edge\n */\n async upsert(input: CreateEdgeInput): Promise<Edge> {\n // Check for existing edge\n const existing = await this.findByEndpoints(\n input.srcType,\n input.srcId,\n input.relType,\n input.dstType,\n input.dstId\n );\n\n if (existing) {\n // Update meta_json\n await dbRun(\n this.db,\n `UPDATE edges SET meta_json = ? WHERE edge_id = ?`,\n [JSON.stringify(input.metaJson ?? {}), existing.edgeId]\n );\n return { ...existing, metaJson: input.metaJson };\n }\n\n return this.create(input);\n }\n\n /**\n * Find edge by endpoints\n */\n async findByEndpoints(\n srcType: NodeType,\n srcId: string,\n relType: RelationType,\n dstType: NodeType,\n dstId: string\n ): Promise<Edge | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM edges\n WHERE src_type = ? AND src_id = ? AND rel_type = ?\n AND dst_type = ? AND dst_id = ?`,\n [srcType, srcId, relType, dstType, dstId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEdge(rows[0]);\n }\n\n /**\n * Find edges by source\n */\n async findBySrc(\n srcId: string,\n relType?: RelationType\n ): Promise<Edge[]> {\n let query = `SELECT * FROM edges WHERE src_id = ?`;\n const params: unknown[] = [srcId];\n\n if (relType) {\n query += ` AND rel_type = ?`;\n params.push(relType);\n }\n\n query += ` ORDER BY created_at DESC`;\n\n const rows = await dbAll<Record<string, unknown>>(this.db, query, params);\n return rows.map(row => this.rowToEdge(row));\n }\n\n /**\n * Find edges by destination\n */\n async findByDst(\n dstId: string,\n relType?: RelationType\n ): Promise<Edge[]> {\n let query = `SELECT * FROM edges WHERE dst_id = ?`;\n const params: unknown[] = [dstId];\n\n if (relType) {\n query += ` AND rel_type = ?`;\n params.push(relType);\n }\n\n query += ` ORDER BY created_at DESC`;\n\n const rows = await dbAll<Record<string, unknown>>(this.db, query, params);\n return rows.map(row => this.rowToEdge(row));\n }\n\n /**\n * Find all edges for a node (both directions)\n */\n async findByNode(nodeId: string): Promise<{ outgoing: Edge[]; incoming: Edge[] }> {\n const outgoing = await this.findBySrc(nodeId);\n const incoming = await this.findByDst(nodeId);\n return { outgoing, incoming };\n }\n\n /**\n * Delete edge by ID\n */\n async delete(edgeId: string): Promise<boolean> {\n await dbRun(\n this.db,\n `DELETE FROM edges WHERE edge_id = ?`,\n [edgeId]\n );\n return true; // DuckDB doesn't return affected rows easily\n }\n\n /**\n * Delete edges by source and relation type\n */\n async deleteBySrcAndRel(srcId: string, relType: RelationType): Promise<number> {\n await dbRun(\n this.db,\n `DELETE FROM edges WHERE src_id = ? AND rel_type = ?`,\n [srcId, relType]\n );\n return 0; // DuckDB doesn't return affected rows easily\n }\n\n /**\n * Delete edges by destination and relation type\n */\n async deleteByDstAndRel(dstId: string, relType: RelationType): Promise<number> {\n await dbRun(\n this.db,\n `DELETE FROM edges WHERE dst_id = ? AND rel_type = ?`,\n [dstId, relType]\n );\n return 0;\n }\n\n /**\n * Replace edges for a source and relation type\n * Used for mode=replace in task_blockers_set\n */\n async replaceEdges(\n srcId: string,\n relType: RelationType,\n newEdges: Omit<CreateEdgeInput, 'srcId' | 'relType'>[]\n ): Promise<Edge[]> {\n // Delete existing edges\n await this.deleteBySrcAndRel(srcId, relType);\n\n // Create new edges\n const created: Edge[] = [];\n for (const edge of newEdges) {\n const newEdge = await this.create({\n srcType: edge.srcType,\n srcId,\n relType,\n dstType: edge.dstType,\n dstId: edge.dstId,\n metaJson: edge.metaJson\n });\n created.push(newEdge);\n }\n\n return created;\n }\n\n /**\n * Get effective blockers (resolving condition \u2192 task)\n * Returns resolved blocker if condition has resolves_to edge\n */\n async getEffectiveBlockers(taskId: string): Promise<Array<{\n originalId: string;\n effectiveId: string;\n isResolved: boolean;\n }>> {\n const blockerEdges = await this.findBySrc(taskId, 'blocked_by');\n const results: Array<{\n originalId: string;\n effectiveId: string;\n isResolved: boolean;\n }> = [];\n\n for (const edge of blockerEdges) {\n // Check if blocker has resolves_to edge\n const resolvesTo = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT dst_id FROM edges\n WHERE src_id = ? AND rel_type = 'resolves_to'\n LIMIT 1`,\n [edge.dstId]\n );\n\n if (resolvesTo.length > 0) {\n results.push({\n originalId: edge.dstId,\n effectiveId: resolvesTo[0].dst_id as string,\n isResolved: true\n });\n } else {\n results.push({\n originalId: edge.dstId,\n effectiveId: edge.dstId,\n isResolved: false\n });\n }\n }\n\n return results;\n }\n\n /**\n * Find 2-hop related entries (Entry \u2192 Entity \u2192 Entry)\n */\n async findRelatedEntries(entryId: string): Promise<Array<{\n entryId: string;\n viaEntityId: string;\n relationPath: string;\n }>> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `WITH first_hop AS (\n SELECT e1.dst_id AS entity_id\n FROM edges e1\n WHERE e1.src_type = 'entry'\n AND e1.rel_type = 'evidence_of'\n AND e1.src_id = ?\n )\n SELECT\n e2.src_id AS entry_id,\n f.entity_id AS via_entity_id,\n 'evidence_of\u2192evidence_of' AS relation_path\n FROM first_hop f\n JOIN edges e2 ON e2.dst_id = f.entity_id\n AND e2.rel_type = 'evidence_of'\n AND e2.src_type = 'entry'\n WHERE e2.src_id != ?`,\n [entryId, entryId]\n );\n\n return rows.map(row => ({\n entryId: row.entry_id as string,\n viaEntityId: row.via_entity_id as string,\n relationPath: row.relation_path as string\n }));\n }\n\n /**\n * Count edges by relation type\n */\n async countByRelType(): Promise<Array<{ relType: string; count: number }>> {\n const rows = await dbAll<{ rel_type: string; count: number }>(\n this.db,\n `SELECT rel_type, COUNT(*) as count FROM edges GROUP BY rel_type`\n );\n return rows.map(row => ({\n relType: row.rel_type,\n count: Number(row.count)\n }));\n }\n\n /**\n * Convert database row to Edge\n */\n private rowToEdge(row: Record<string, unknown>): Edge {\n return {\n edgeId: row.edge_id as string,\n srcType: row.src_type as NodeType,\n srcId: row.src_id as string,\n relType: row.rel_type as RelationType,\n dstType: row.dst_type as NodeType,\n dstId: row.dst_id as string,\n metaJson: typeof row.meta_json === 'string'\n ? JSON.parse(row.meta_json)\n : row.meta_json as Record<string, unknown> | undefined,\n createdAt: toDate(row.created_at)\n };\n }\n}\n", "/**\n * LanceDB Vector Store for semantic search\n * AXIOMMIND Principle 6: Vector store consistency (DuckDB \u2192 outbox \u2192 LanceDB unidirectional)\n */\n\nimport * as lancedb from '@lancedb/lancedb';\nimport type { VectorRecord } from './types.js';\n\nexport interface SearchResult {\n id: string;\n eventId: string;\n content: string;\n score: number;\n sessionId: string;\n eventType: string;\n timestamp: string;\n}\n\nexport class VectorStore {\n private db: lancedb.Connection | null = null;\n private table: lancedb.Table | null = null;\n private readonly tableName = 'conversations';\n\n constructor(private dbPath: string) {}\n\n /**\n * Initialize LanceDB connection\n */\n async initialize(): Promise<void> {\n if (this.db) return;\n\n this.db = await lancedb.connect(this.dbPath);\n\n // Try to open existing table\n try {\n const tables = await this.db.tableNames();\n if (tables.includes(this.tableName)) {\n this.table = await this.db.openTable(this.tableName);\n }\n } catch {\n // Table doesn't exist yet, will be created on first insert\n this.table = null;\n }\n }\n\n /**\n * Add or update vector record\n */\n async upsert(record: VectorRecord): Promise<void> {\n await this.initialize();\n\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const data = {\n id: record.id,\n eventId: record.eventId,\n sessionId: record.sessionId,\n eventType: record.eventType,\n content: record.content,\n vector: record.vector,\n timestamp: record.timestamp,\n metadata: JSON.stringify(record.metadata || {})\n };\n\n if (!this.table) {\n // Create table with first record\n this.table = await this.db.createTable(this.tableName, [data]);\n } else {\n await this.table.add([data]);\n }\n }\n\n /**\n * Add multiple vector records in batch\n */\n async upsertBatch(records: VectorRecord[]): Promise<void> {\n if (records.length === 0) return;\n\n await this.initialize();\n\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const data = records.map(record => ({\n id: record.id,\n eventId: record.eventId,\n sessionId: record.sessionId,\n eventType: record.eventType,\n content: record.content,\n vector: record.vector,\n timestamp: record.timestamp,\n metadata: JSON.stringify(record.metadata || {})\n }));\n\n if (!this.table) {\n this.table = await this.db.createTable(this.tableName, data);\n } else {\n await this.table.add(data);\n }\n }\n\n /**\n * Search for similar vectors\n */\n async search(\n queryVector: number[],\n options: {\n limit?: number;\n minScore?: number;\n sessionId?: string;\n } = {}\n ): Promise<SearchResult[]> {\n await this.initialize();\n\n if (!this.table) {\n return [];\n }\n\n const { limit = 5, minScore = 0.7, sessionId } = options;\n\n // Use cosine distance for semantic similarity\n let query = this.table\n .search(queryVector)\n .distanceType('cosine')\n .limit(limit * 2); // Get more for filtering\n\n // Apply session filter if specified\n if (sessionId) {\n query = query.where(`sessionId = '${sessionId}'`);\n }\n\n const results = await query.toArray();\n\n return results\n .filter(r => {\n // Convert cosine distance to similarity score\n // Cosine distance ranges from 0 (identical) to 2 (opposite)\n // Score = 1 - (distance / 2) gives range [0, 1]\n const distance = r._distance || 0;\n const score = 1 - (distance / 2);\n return score >= minScore;\n })\n .slice(0, limit)\n .map(r => {\n const distance = r._distance || 0;\n const score = 1 - (distance / 2);\n return {\n id: r.id as string,\n eventId: r.eventId as string,\n content: r.content as string,\n score,\n sessionId: r.sessionId as string,\n eventType: r.eventType as string,\n timestamp: r.timestamp as string\n };\n });\n }\n\n /**\n * Delete vector by event ID\n */\n async delete(eventId: string): Promise<void> {\n if (!this.table) return;\n await this.table.delete(`eventId = '${eventId}'`);\n }\n\n /**\n * Get total count of vectors\n */\n async count(): Promise<number> {\n if (!this.table) return 0;\n const result = await this.table.countRows();\n return result;\n }\n\n /**\n * Check if vector exists for event\n */\n async exists(eventId: string): Promise<boolean> {\n if (!this.table) return false;\n\n const results = await this.table\n .search([])\n .where(`eventId = '${eventId}'`)\n .limit(1)\n .toArray();\n\n return results.length > 0;\n }\n}\n", "/**\n * Local Embedding Generator using @xenova/transformers\n * AXIOMMIND Principle 7: Standard JSON format for vectors\n */\n\nimport { pipeline, Pipeline } from '@xenova/transformers';\n\nexport interface EmbeddingResult {\n vector: number[];\n model: string;\n dimensions: number;\n}\n\nexport class Embedder {\n private pipeline: Pipeline | null = null;\n private readonly modelName: string;\n private initialized = false;\n\n constructor(modelName: string = 'Xenova/all-MiniLM-L6-v2') {\n this.modelName = modelName;\n }\n\n /**\n * Initialize the embedding pipeline\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n this.pipeline = await pipeline('feature-extraction', this.modelName);\n this.initialized = true;\n }\n\n /**\n * Generate embedding for a single text\n */\n async embed(text: string): Promise<EmbeddingResult> {\n await this.initialize();\n\n if (!this.pipeline) {\n throw new Error('Embedding pipeline not initialized');\n }\n\n const output = await this.pipeline(text, {\n pooling: 'mean',\n normalize: true\n });\n\n const vector = Array.from(output.data as Float32Array);\n\n return {\n vector,\n model: this.modelName,\n dimensions: vector.length\n };\n }\n\n /**\n * Generate embeddings for multiple texts in batch\n */\n async embedBatch(texts: string[]): Promise<EmbeddingResult[]> {\n await this.initialize();\n\n if (!this.pipeline) {\n throw new Error('Embedding pipeline not initialized');\n }\n\n const results: EmbeddingResult[] = [];\n\n // Process in batches of 32 for memory efficiency\n const batchSize = 32;\n for (let i = 0; i < texts.length; i += batchSize) {\n const batch = texts.slice(i, i + batchSize);\n\n for (const text of batch) {\n const output = await this.pipeline(text, {\n pooling: 'mean',\n normalize: true\n });\n\n const vector = Array.from(output.data as Float32Array);\n\n results.push({\n vector,\n model: this.modelName,\n dimensions: vector.length\n });\n }\n }\n\n return results;\n }\n\n /**\n * Get embedding dimensions for the current model\n */\n async getDimensions(): Promise<number> {\n const result = await this.embed('test');\n return result.dimensions;\n }\n\n /**\n * Check if embedder is ready\n */\n isReady(): boolean {\n return this.initialized && this.pipeline !== null;\n }\n\n /**\n * Get model name\n */\n getModelName(): string {\n return this.modelName;\n }\n}\n\n// Singleton instance for reuse\nlet defaultEmbedder: Embedder | null = null;\n\nexport function getDefaultEmbedder(): Embedder {\n if (!defaultEmbedder) {\n defaultEmbedder = new Embedder();\n }\n return defaultEmbedder;\n}\n", "/**\n * Vector Outbox V2 - Transactional Outbox Pattern\n * AXIOMMIND Principle 6: DuckDB \u2192 outbox \u2192 LanceDB unidirectional flow\n */\n\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport { randomUUID } from 'crypto';\nimport type {\n OutboxJob,\n OutboxStatus,\n OutboxItemKind,\n VALID_OUTBOX_TRANSITIONS\n} from './types.js';\n\nexport interface OutboxConfig {\n embeddingVersion: string;\n maxRetries: number;\n stuckThresholdMs: number;\n cleanupDays: number;\n}\n\nconst DEFAULT_CONFIG: OutboxConfig = {\n embeddingVersion: 'v1',\n maxRetries: 3,\n stuckThresholdMs: 5 * 60 * 1000, // 5 minutes\n cleanupDays: 7\n};\n\nexport interface OutboxMetrics {\n pendingCount: number;\n processingCount: number;\n doneCount: number;\n failedCount: number;\n oldestPendingAge: number | null;\n}\n\nexport class VectorOutbox {\n private config: OutboxConfig;\n\n constructor(\n private db: Database,\n config?: Partial<OutboxConfig>\n ) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Enqueue item for vectorization (idempotent)\n */\n async enqueue(\n itemKind: OutboxItemKind,\n itemId: string,\n embeddingVersion?: string\n ): Promise<string> {\n const version = embeddingVersion ?? this.config.embeddingVersion;\n const jobId = randomUUID();\n const now = new Date().toISOString();\n\n await dbRun(\n this.db,\n `INSERT INTO vector_outbox (\n job_id, item_kind, item_id, embedding_version, status, retry_count, created_at, updated_at\n ) VALUES (?, ?, ?, ?, 'pending', 0, ?, ?)\n ON CONFLICT (item_kind, item_id, embedding_version) DO NOTHING`,\n [jobId, itemKind, itemId, version, now, now]\n );\n\n return jobId;\n }\n\n /**\n * Claim pending jobs for processing\n */\n async claimJobs(limit: number = 32): Promise<OutboxJob[]> {\n const now = new Date().toISOString();\n\n // Atomic claim using UPDATE RETURNING\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `UPDATE vector_outbox\n SET status = 'processing', updated_at = ?\n WHERE job_id IN (\n SELECT job_id FROM vector_outbox\n WHERE status = 'pending'\n ORDER BY created_at ASC\n LIMIT ?\n )\n RETURNING *`,\n [now, limit]\n );\n\n return rows.map(row => this.rowToJob(row));\n }\n\n /**\n * Mark job as done\n */\n async markDone(jobId: string): Promise<void> {\n await dbRun(\n this.db,\n `UPDATE vector_outbox\n SET status = 'done', updated_at = ?\n WHERE job_id = ?`,\n [new Date().toISOString(), jobId]\n );\n }\n\n /**\n * Mark job as failed\n */\n async markFailed(jobId: string, error: string): Promise<void> {\n const now = new Date().toISOString();\n\n // Check retry count\n const rows = await dbAll<{ retry_count: number }>(\n this.db,\n `SELECT retry_count FROM vector_outbox WHERE job_id = ?`,\n [jobId]\n );\n\n if (rows.length === 0) return;\n\n const retryCount = rows[0].retry_count;\n const newStatus: OutboxStatus = retryCount >= this.config.maxRetries - 1\n ? 'failed'\n : 'pending'; // Will retry\n\n await dbRun(\n this.db,\n `UPDATE vector_outbox\n SET status = ?, error = ?, retry_count = retry_count + 1, updated_at = ?\n WHERE job_id = ?`,\n [newStatus, error, now, jobId]\n );\n }\n\n /**\n * Get job by ID\n */\n async getJob(jobId: string): Promise<OutboxJob | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM vector_outbox WHERE job_id = ?`,\n [jobId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToJob(rows[0]);\n }\n\n /**\n * Get jobs by status\n */\n async getJobsByStatus(status: OutboxStatus, limit: number = 100): Promise<OutboxJob[]> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM vector_outbox\n WHERE status = ?\n ORDER BY created_at ASC\n LIMIT ?`,\n [status, limit]\n );\n\n return rows.map(row => this.rowToJob(row));\n }\n\n /**\n * Reconcile: recover stuck and retry failed jobs\n */\n async reconcile(): Promise<{ recovered: number; retried: number }> {\n const now = new Date();\n const stuckThreshold = new Date(now.getTime() - this.config.stuckThresholdMs);\n\n // Recover stuck processing jobs\n await dbRun(\n this.db,\n `UPDATE vector_outbox\n SET status = 'pending', updated_at = ?\n WHERE status = 'processing'\n AND updated_at < ?`,\n [now.toISOString(), stuckThreshold.toISOString()]\n );\n\n // Retry failed jobs that haven't exceeded max retries\n await dbRun(\n this.db,\n `UPDATE vector_outbox\n SET status = 'pending', updated_at = ?\n WHERE status = 'failed'\n AND retry_count < ?`,\n [now.toISOString(), this.config.maxRetries]\n );\n\n // Get counts (DuckDB doesn't return affected rows easily)\n const recoveredRows = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM vector_outbox\n WHERE status = 'pending' AND updated_at = ?`,\n [now.toISOString()]\n );\n\n return {\n recovered: 0, // Approximate\n retried: 0 // Approximate\n };\n }\n\n /**\n * Cleanup old done jobs\n */\n async cleanup(): Promise<number> {\n const threshold = new Date();\n threshold.setDate(threshold.getDate() - this.config.cleanupDays);\n\n await dbRun(\n this.db,\n `DELETE FROM vector_outbox\n WHERE status = 'done'\n AND updated_at < ?`,\n [threshold.toISOString()]\n );\n\n return 0; // DuckDB doesn't return affected rows easily\n }\n\n /**\n * Get metrics\n */\n async getMetrics(): Promise<OutboxMetrics> {\n const statusCounts = await dbAll<{ status: string; count: number }>(\n this.db,\n `SELECT status, COUNT(*) as count\n FROM vector_outbox\n GROUP BY status`\n );\n\n const oldestPending = await dbAll<{ created_at: string }>(\n this.db,\n `SELECT created_at FROM vector_outbox\n WHERE status = 'pending'\n ORDER BY created_at ASC\n LIMIT 1`\n );\n\n const metrics: OutboxMetrics = {\n pendingCount: 0,\n processingCount: 0,\n doneCount: 0,\n failedCount: 0,\n oldestPendingAge: null\n };\n\n for (const row of statusCounts) {\n switch (row.status) {\n case 'pending':\n metrics.pendingCount = Number(row.count);\n break;\n case 'processing':\n metrics.processingCount = Number(row.count);\n break;\n case 'done':\n metrics.doneCount = Number(row.count);\n break;\n case 'failed':\n metrics.failedCount = Number(row.count);\n break;\n }\n }\n\n if (oldestPending.length > 0) {\n const oldestDate = new Date(oldestPending[0].created_at);\n metrics.oldestPendingAge = Date.now() - oldestDate.getTime();\n }\n\n return metrics;\n }\n\n /**\n * Validate state transition\n */\n isValidTransition(from: OutboxStatus, to: OutboxStatus): boolean {\n const validTransitions = [\n { from: 'pending', to: 'processing' },\n { from: 'processing', to: 'done' },\n { from: 'processing', to: 'failed' },\n { from: 'failed', to: 'pending' }\n ];\n\n return validTransitions.some(t => t.from === from && t.to === to);\n }\n\n /**\n * Convert database row to OutboxJob\n */\n private rowToJob(row: Record<string, unknown>): OutboxJob {\n return {\n jobId: row.job_id as string,\n itemKind: row.item_kind as OutboxItemKind,\n itemId: row.item_id as string,\n embeddingVersion: row.embedding_version as string,\n status: row.status as OutboxStatus,\n retryCount: row.retry_count as number,\n error: row.error as string | undefined,\n createdAt: toDate(row.created_at),\n updatedAt: toDate(row.updated_at)\n };\n }\n}\n", "/**\n * Vector Worker - Single-Writer Pattern Implementation\n * AXIOMMIND Principle 6: DuckDB \u2192 outbox \u2192 LanceDB unidirectional flow\n */\n\nimport { EventStore } from './event-store.js';\nimport { VectorStore } from './vector-store.js';\nimport { Embedder } from './embedder.js';\nimport type { OutboxItem, VectorRecord } from './types.js';\n\nexport interface WorkerConfig {\n batchSize: number;\n pollIntervalMs: number;\n maxRetries: number;\n}\n\nconst DEFAULT_CONFIG: WorkerConfig = {\n batchSize: 32,\n pollIntervalMs: 1000,\n maxRetries: 3\n};\n\nexport class VectorWorker {\n private readonly eventStore: EventStore;\n private readonly vectorStore: VectorStore;\n private readonly embedder: Embedder;\n private readonly config: WorkerConfig;\n private running = false;\n private pollTimeout: NodeJS.Timeout | null = null;\n\n constructor(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n config: Partial<WorkerConfig> = {}\n ) {\n this.eventStore = eventStore;\n this.vectorStore = vectorStore;\n this.embedder = embedder;\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Start the worker polling loop\n */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.poll();\n }\n\n /**\n * Stop the worker\n */\n stop(): void {\n this.running = false;\n if (this.pollTimeout) {\n clearTimeout(this.pollTimeout);\n this.pollTimeout = null;\n }\n }\n\n /**\n * Process a single batch of outbox items\n */\n async processBatch(): Promise<number> {\n const items = await this.eventStore.getPendingOutboxItems(this.config.batchSize);\n\n if (items.length === 0) {\n return 0;\n }\n\n const successful: string[] = [];\n const failed: string[] = [];\n\n try {\n // Generate embeddings for all items\n const embeddings = await this.embedder.embedBatch(items.map(i => i.content));\n\n // Prepare vector records\n const records: VectorRecord[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const embedding = embeddings[i];\n\n // Get event details\n const event = await this.eventStore.getEvent(item.eventId);\n if (!event) {\n failed.push(item.id);\n continue;\n }\n\n records.push({\n id: `vec_${item.id}`,\n eventId: item.eventId,\n sessionId: event.sessionId,\n eventType: event.eventType,\n content: item.content,\n vector: embedding.vector,\n timestamp: event.timestamp.toISOString(),\n metadata: event.metadata\n });\n\n successful.push(item.id);\n }\n\n // Batch insert to vector store\n if (records.length > 0) {\n await this.vectorStore.upsertBatch(records);\n }\n\n // Mark successful items as done\n if (successful.length > 0) {\n await this.eventStore.completeOutboxItems(successful);\n }\n\n // Mark failed items\n if (failed.length > 0) {\n await this.eventStore.failOutboxItems(failed, 'Event not found');\n }\n\n return successful.length;\n } catch (error) {\n // Mark all items as failed\n const allIds = items.map(i => i.id);\n const errorMessage = error instanceof Error ? error.message : String(error);\n await this.eventStore.failOutboxItems(allIds, errorMessage);\n throw error;\n }\n }\n\n /**\n * Poll for new items\n */\n private async poll(): Promise<void> {\n if (!this.running) return;\n\n try {\n await this.processBatch();\n } catch (error) {\n console.error('Vector worker error:', error);\n }\n\n // Schedule next poll\n this.pollTimeout = setTimeout(() => this.poll(), this.config.pollIntervalMs);\n }\n\n /**\n * Process all pending items (blocking)\n */\n async processAll(): Promise<number> {\n let totalProcessed = 0;\n let processed: number;\n\n do {\n processed = await this.processBatch();\n totalProcessed += processed;\n } while (processed > 0);\n\n return totalProcessed;\n }\n\n /**\n * Check if worker is running\n */\n isRunning(): boolean {\n return this.running;\n }\n}\n\n/**\n * Create and start a vector worker\n */\nexport function createVectorWorker(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n config?: Partial<WorkerConfig>\n): VectorWorker {\n const worker = new VectorWorker(eventStore, vectorStore, embedder, config);\n return worker;\n}\n\n// ============================================================\n// Vector Worker V2 - Extended for Task Entity System\n// ============================================================\n\nimport { dbAll, type Database } from './db-wrapper.js';\nimport { VectorOutbox } from './vector-outbox.js';\nimport type { OutboxJob, OutboxItemKind } from './types.js';\n\nexport interface WorkerConfigV2 {\n batchSize: number;\n pollIntervalMs: number;\n maxRetries: number;\n embeddingVersion: string;\n}\n\nconst DEFAULT_CONFIG_V2: WorkerConfigV2 = {\n batchSize: 32,\n pollIntervalMs: 1000,\n maxRetries: 3,\n embeddingVersion: 'v1'\n};\n\n/**\n * Content provider interface for different item kinds\n */\nexport interface ContentProvider {\n getContent(itemKind: OutboxItemKind, itemId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null>;\n}\n\n/**\n * Default content provider using database\n */\nexport class DefaultContentProvider implements ContentProvider {\n constructor(private db: Database) {}\n\n async getContent(itemKind: OutboxItemKind, itemId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n switch (itemKind) {\n case 'entry':\n return this.getEntryContent(itemId);\n case 'task_title':\n return this.getTaskTitleContent(itemId);\n case 'event':\n return this.getEventContent(itemId);\n default:\n return null;\n }\n }\n\n private async getEntryContent(entryId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT title, content_json, entry_type FROM entries WHERE entry_id = ?`,\n [entryId]\n );\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n const contentJson = typeof row.content_json === 'string'\n ? JSON.parse(row.content_json)\n : row.content_json;\n\n return {\n content: `${row.title}\\n${JSON.stringify(contentJson)}`,\n metadata: {\n itemKind: 'entry',\n entryType: row.entry_type\n }\n };\n }\n\n private async getTaskTitleContent(taskId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT title, search_text, current_json FROM entities\n WHERE entity_id = ? AND entity_type = 'task'`,\n [taskId]\n );\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n return {\n content: row.search_text as string || row.title as string,\n metadata: {\n itemKind: 'task_title',\n entityType: 'task'\n }\n };\n }\n\n private async getEventContent(eventId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT content, event_type, session_id FROM events WHERE id = ?`,\n [eventId]\n );\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n return {\n content: row.content as string,\n metadata: {\n itemKind: 'event',\n eventType: row.event_type,\n sessionId: row.session_id\n }\n };\n }\n}\n\n/**\n * Vector Worker V2 - Supports multiple item kinds\n */\nexport class VectorWorkerV2 {\n private readonly outbox: VectorOutbox;\n private readonly vectorStore: VectorStore;\n private readonly embedder: Embedder;\n private readonly contentProvider: ContentProvider;\n private readonly config: WorkerConfigV2;\n private running = false;\n private pollTimeout: NodeJS.Timeout | null = null;\n\n constructor(\n db: Database,\n vectorStore: VectorStore,\n embedder: Embedder,\n config: Partial<WorkerConfigV2> = {},\n contentProvider?: ContentProvider\n ) {\n this.outbox = new VectorOutbox(db, {\n embeddingVersion: config.embeddingVersion ?? DEFAULT_CONFIG_V2.embeddingVersion,\n maxRetries: config.maxRetries ?? DEFAULT_CONFIG_V2.maxRetries\n });\n this.vectorStore = vectorStore;\n this.embedder = embedder;\n this.config = { ...DEFAULT_CONFIG_V2, ...config };\n this.contentProvider = contentProvider ?? new DefaultContentProvider(db);\n }\n\n /**\n * Start the worker polling loop\n */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.poll();\n }\n\n /**\n * Stop the worker\n */\n stop(): void {\n this.running = false;\n if (this.pollTimeout) {\n clearTimeout(this.pollTimeout);\n this.pollTimeout = null;\n }\n }\n\n /**\n * Process a single batch of outbox jobs\n */\n async processBatch(): Promise<number> {\n const jobs = await this.outbox.claimJobs(this.config.batchSize);\n\n if (jobs.length === 0) {\n return 0;\n }\n\n let successCount = 0;\n\n for (const job of jobs) {\n try {\n await this.processJob(job);\n await this.outbox.markDone(job.jobId);\n successCount++;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n await this.outbox.markFailed(job.jobId, errorMessage);\n }\n }\n\n return successCount;\n }\n\n /**\n * Process a single job\n */\n private async processJob(job: OutboxJob): Promise<void> {\n // Get content\n const contentData = await this.contentProvider.getContent(job.itemKind, job.itemId);\n\n if (!contentData) {\n // Item not found, mark as done (skip)\n return;\n }\n\n // Generate embedding\n const embedding = await this.embedder.embed(contentData.content);\n\n // Upsert to vector store\n const record: VectorRecord = {\n id: `${job.itemKind}_${job.itemId}_${job.embeddingVersion}`,\n eventId: job.itemKind === 'event' ? job.itemId : '',\n sessionId: (contentData.metadata.sessionId as string) ?? '',\n eventType: (contentData.metadata.eventType as string) ?? job.itemKind,\n content: contentData.content,\n vector: embedding.vector,\n timestamp: new Date().toISOString(),\n metadata: {\n ...contentData.metadata,\n embeddingVersion: job.embeddingVersion\n }\n };\n\n // Use idempotent upsert (delete + add)\n await this.vectorStore.upsertBatch([record]);\n }\n\n /**\n * Poll for new jobs\n */\n private async poll(): Promise<void> {\n if (!this.running) return;\n\n try {\n await this.processBatch();\n } catch (error) {\n console.error('Vector worker V2 error:', error);\n }\n\n // Schedule next poll\n this.pollTimeout = setTimeout(() => this.poll(), this.config.pollIntervalMs);\n }\n\n /**\n * Process all pending jobs (blocking)\n */\n async processAll(): Promise<number> {\n let totalProcessed = 0;\n let processed: number;\n\n do {\n processed = await this.processBatch();\n totalProcessed += processed;\n } while (processed > 0);\n\n return totalProcessed;\n }\n\n /**\n * Run reconciliation\n */\n async reconcile(): Promise<{ recovered: number; retried: number }> {\n return this.outbox.reconcile();\n }\n\n /**\n * Get metrics\n */\n async getMetrics() {\n return this.outbox.getMetrics();\n }\n\n /**\n * Check if worker is running\n */\n isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Get the outbox instance for direct access\n */\n getOutbox(): VectorOutbox {\n return this.outbox;\n }\n}\n\n/**\n * Create a Vector Worker V2 instance\n */\nexport function createVectorWorkerV2(\n db: Database,\n vectorStore: VectorStore,\n embedder: Embedder,\n config?: Partial<WorkerConfigV2>\n): VectorWorkerV2 {\n return new VectorWorkerV2(db, vectorStore, embedder, config);\n}\n", "/**\n * AXIOMMIND Matcher - Weighted scoring with confidence classification\n * Implements matching thresholds: high (\u22650.92), suggested (\u22650.75), none (<0.75)\n */\n\nimport type {\n MemoryEvent,\n MemoryMatch,\n MatchResult,\n MatchConfidence,\n MATCH_THRESHOLDS\n} from './types.js';\nimport { SearchResult } from './vector-store.js';\n\nexport interface MatchWeights {\n semanticSimilarity: number;\n ftsScore: number;\n recencyBonus: number;\n statusWeight: number;\n}\n\nexport interface MatcherConfig {\n weights: MatchWeights;\n minCombinedScore: number;\n minGap: number;\n suggestionThreshold: number;\n}\n\nconst DEFAULT_CONFIG: MatcherConfig = {\n weights: {\n semanticSimilarity: 0.4,\n ftsScore: 0.25,\n recencyBonus: 0.2,\n statusWeight: 0.15\n },\n minCombinedScore: 0.92,\n minGap: 0.03,\n suggestionThreshold: 0.75\n};\n\nexport class Matcher {\n private readonly config: MatcherConfig;\n\n constructor(config: Partial<MatcherConfig> = {}) {\n this.config = {\n ...DEFAULT_CONFIG,\n ...config,\n weights: { ...DEFAULT_CONFIG.weights, ...config.weights }\n };\n }\n\n /**\n * Calculate combined score using AXIOMMIND weighted formula\n */\n calculateCombinedScore(\n semanticScore: number,\n ftsScore: number = 0,\n recencyDays: number = 0,\n isActive: boolean = true\n ): number {\n const { weights } = this.config;\n\n // Recency bonus: decays over 30 days\n const recencyBonus = Math.max(0, 1 - recencyDays / 30);\n\n // Status weight: active events get full weight\n const statusMultiplier = isActive ? 1.0 : 0.7;\n\n const combinedScore =\n weights.semanticSimilarity * semanticScore +\n weights.ftsScore * ftsScore +\n weights.recencyBonus * recencyBonus +\n weights.statusWeight * statusMultiplier;\n\n return Math.min(1.0, combinedScore);\n }\n\n /**\n * Classify match confidence based on AXIOMMIND thresholds\n */\n classifyConfidence(\n topScore: number,\n secondScore: number | null\n ): MatchConfidence {\n const { minCombinedScore, minGap, suggestionThreshold } = this.config;\n\n // Calculate gap (infinity if no second match)\n const gap = secondScore !== null ? topScore - secondScore : Infinity;\n\n // High confidence: score \u2265 0.92 AND gap \u2265 0.03\n if (topScore >= minCombinedScore && gap >= minGap) {\n return 'high';\n }\n\n // Suggested: score \u2265 0.75\n if (topScore >= suggestionThreshold) {\n return 'suggested';\n }\n\n // No match\n return 'none';\n }\n\n /**\n * Match search results to find best memory\n */\n matchSearchResults(\n results: SearchResult[],\n getEventAge: (eventId: string) => number\n ): MatchResult {\n if (results.length === 0) {\n return {\n match: null,\n confidence: 'none'\n };\n }\n\n // Calculate combined scores\n const scoredResults = results.map(result => {\n const ageDays = getEventAge(result.eventId);\n const combinedScore = this.calculateCombinedScore(\n result.score,\n 0, // FTS score - would need to be passed in\n ageDays,\n true // Assume active\n );\n\n return {\n result,\n combinedScore\n };\n });\n\n // Sort by combined score\n scoredResults.sort((a, b) => b.combinedScore - a.combinedScore);\n\n const topResult = scoredResults[0];\n const secondScore = scoredResults.length > 1 ? scoredResults[1].combinedScore : null;\n\n // Classify confidence\n const confidence = this.classifyConfidence(topResult.combinedScore, secondScore);\n\n // Build match result\n const match: MemoryMatch = {\n event: {\n id: topResult.result.eventId,\n eventType: topResult.result.eventType as 'user_prompt' | 'agent_response' | 'session_summary',\n sessionId: topResult.result.sessionId,\n timestamp: new Date(topResult.result.timestamp),\n content: topResult.result.content,\n canonicalKey: '', // Would need to be fetched\n dedupeKey: '' // Would need to be fetched\n },\n score: topResult.combinedScore\n };\n\n const gap = secondScore !== null ? topResult.combinedScore - secondScore : undefined;\n\n // Build alternatives for suggested matches\n const alternatives = confidence === 'suggested'\n ? scoredResults.slice(1, 4).map(sr => ({\n event: {\n id: sr.result.eventId,\n eventType: sr.result.eventType as 'user_prompt' | 'agent_response' | 'session_summary',\n sessionId: sr.result.sessionId,\n timestamp: new Date(sr.result.timestamp),\n content: sr.result.content,\n canonicalKey: '',\n dedupeKey: ''\n },\n score: sr.combinedScore\n }))\n : undefined;\n\n return {\n match: confidence !== 'none' ? match : null,\n confidence,\n gap,\n alternatives\n };\n }\n\n /**\n * Calculate days between two dates\n */\n static calculateAgeDays(timestamp: Date): number {\n const now = new Date();\n const diffMs = now.getTime() - timestamp.getTime();\n return diffMs / (1000 * 60 * 60 * 24);\n }\n\n /**\n * Get current configuration\n */\n getConfig(): Readonly<MatcherConfig> {\n return { ...this.config };\n }\n}\n\n/**\n * Default matcher instance\n */\nlet defaultMatcher: Matcher | null = null;\n\nexport function getDefaultMatcher(): Matcher {\n if (!defaultMatcher) {\n defaultMatcher = new Matcher();\n }\n return defaultMatcher;\n}\n", "/**\n * Evidence Aligner V2 - AXIOMMIND Principle 4\n * Quote-only approach: LLM provides quote, pipeline calculates span\n * 3-step alignment: exact \u2192 normalized \u2192 fuzzy\n */\n\nimport { createHash } from 'crypto';\nimport type {\n EvidenceSpan,\n ExtractedEvidence,\n AlignedEvidence,\n FailedEvidence,\n EvidenceAlignResult\n} from './types.js';\n\nexport interface AlignmentResult {\n isAligned: boolean;\n confidence: number;\n spans: EvidenceSpan[];\n missingClaims: string[];\n}\n\nexport interface AlignmentOptions {\n minMatchLength: number;\n fuzzyThreshold: number;\n maxMissingClaims: number;\n}\n\n// V2 Options\nexport interface AlignmentOptionsV2 {\n minMatchLength: number;\n exactMatchBonus: number;\n normalizedThreshold: number;\n fuzzyThreshold: number;\n maxMissingRatio: number;\n}\n\nconst DEFAULT_OPTIONS: AlignmentOptions = {\n minMatchLength: 10,\n fuzzyThreshold: 0.8,\n maxMissingClaims: 2\n};\n\nconst DEFAULT_OPTIONS_V2: AlignmentOptionsV2 = {\n minMatchLength: 5,\n exactMatchBonus: 1.0,\n normalizedThreshold: 0.95,\n fuzzyThreshold: 0.85,\n maxMissingRatio: 0.2\n};\n\n// V2 Alignment result for entries\nexport interface AlignResultV2 {\n evidenceAligned: boolean;\n alignedCount: number;\n failedCount: number;\n results: EvidenceAlignResult[];\n overallConfidence: number;\n}\n\nexport class EvidenceAligner {\n private readonly options: AlignmentOptions;\n\n constructor(options: Partial<AlignmentOptions> = {}) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n /**\n * Align claims against source content\n * Returns evidence spans showing where claims are supported\n */\n align(claims: string[], sourceContent: string): AlignmentResult {\n const spans: EvidenceSpan[] = [];\n const missingClaims: string[] = [];\n const normalizedSource = this.normalize(sourceContent);\n\n for (const claim of claims) {\n const normalizedClaim = this.normalize(claim);\n\n // Skip very short claims\n if (normalizedClaim.length < this.options.minMatchLength) {\n continue;\n }\n\n // Try exact match first\n const exactSpan = this.findExactMatch(normalizedClaim, normalizedSource, sourceContent);\n if (exactSpan) {\n spans.push(exactSpan);\n continue;\n }\n\n // Try fuzzy match\n const fuzzySpan = this.findFuzzyMatch(normalizedClaim, normalizedSource, sourceContent);\n if (fuzzySpan && fuzzySpan.confidence >= this.options.fuzzyThreshold) {\n spans.push(fuzzySpan);\n continue;\n }\n\n // Claim not found in source\n missingClaims.push(claim);\n }\n\n // Calculate overall alignment confidence\n const totalClaims = claims.length;\n const alignedClaims = spans.length;\n const confidence = totalClaims > 0 ? alignedClaims / totalClaims : 1.0;\n\n // Alignment is valid if missing claims are within threshold\n const isAligned = missingClaims.length <= this.options.maxMissingClaims;\n\n return {\n isAligned,\n confidence,\n spans,\n missingClaims\n };\n }\n\n /**\n * Find exact substring match\n */\n private findExactMatch(\n normalizedClaim: string,\n normalizedSource: string,\n originalSource: string\n ): EvidenceSpan | null {\n const index = normalizedSource.indexOf(normalizedClaim);\n\n if (index === -1) {\n return null;\n }\n\n return {\n start: index,\n end: index + normalizedClaim.length,\n confidence: 1.0,\n matchType: 'exact',\n originalQuote: originalSource.slice(index, index + normalizedClaim.length),\n alignedText: normalizedClaim\n };\n }\n\n /**\n * Find fuzzy match using sliding window\n */\n private findFuzzyMatch(\n normalizedClaim: string,\n normalizedSource: string,\n originalSource: string\n ): EvidenceSpan | null {\n const windowSize = normalizedClaim.length;\n let bestMatch: { index: number; similarity: number } | null = null;\n\n // Slide window across source\n for (let i = 0; i <= normalizedSource.length - windowSize; i++) {\n const window = normalizedSource.slice(i, i + windowSize);\n const similarity = this.calculateSimilarity(normalizedClaim, window);\n\n if (!bestMatch || similarity > bestMatch.similarity) {\n bestMatch = { index: i, similarity };\n }\n }\n\n if (!bestMatch || bestMatch.similarity < this.options.fuzzyThreshold) {\n return null;\n }\n\n return {\n start: bestMatch.index,\n end: bestMatch.index + windowSize,\n confidence: bestMatch.similarity,\n matchType: 'fuzzy',\n originalQuote: originalSource.slice(bestMatch.index, bestMatch.index + windowSize),\n alignedText: normalizedClaim\n };\n }\n\n /**\n * Calculate similarity between two strings using Jaccard coefficient\n */\n private calculateSimilarity(a: string, b: string): number {\n const setA = new Set(this.tokenize(a));\n const setB = new Set(this.tokenize(b));\n\n const intersection = new Set([...setA].filter(x => setB.has(x)));\n const union = new Set([...setA, ...setB]);\n\n return intersection.size / union.size;\n }\n\n /**\n * Tokenize text into words\n */\n private tokenize(text: string): string[] {\n return text.toLowerCase().split(/\\s+/).filter(t => t.length > 0);\n }\n\n /**\n * Normalize text for comparison\n */\n private normalize(text: string): string {\n return text\n .normalize('NFKC')\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s]/gu, '')\n .replace(/\\s+/g, ' ')\n .trim();\n }\n\n /**\n * Extract claims from a response text\n * Splits on sentence boundaries and filters short sentences\n */\n extractClaims(text: string): string[] {\n // Split on sentence boundaries\n const sentences = text.split(/[.!?]+/).map(s => s.trim()).filter(s => s.length > 0);\n\n // Filter out very short sentences and questions\n return sentences.filter(s => {\n return s.length >= this.options.minMatchLength && !s.endsWith('?');\n });\n }\n\n /**\n * Verify that a response is grounded in the provided context\n */\n verifyGrounding(response: string, context: string[]): AlignmentResult {\n const claims = this.extractClaims(response);\n const combinedContext = context.join(' ');\n\n return this.align(claims, combinedContext);\n }\n\n // ============================================================\n // V2 Methods: Quote-only alignment\n // ============================================================\n\n private optionsV2: AlignmentOptionsV2 = DEFAULT_OPTIONS_V2;\n\n /**\n * Configure V2 options\n */\n configureV2(options: Partial<AlignmentOptionsV2>): void {\n this.optionsV2 = { ...DEFAULT_OPTIONS_V2, ...options };\n }\n\n /**\n * Align V2: Process extracted evidence with messageIndex and quote\n * @param sessionMessages - Array of session messages (original text)\n * @param evidence - Array of extracted evidence (messageIndex + quote)\n */\n alignV2(\n sessionMessages: string[],\n evidence: ExtractedEvidence[]\n ): AlignResultV2 {\n const results: EvidenceAlignResult[] = [];\n let alignedCount = 0;\n let totalConfidence = 0;\n\n for (const ev of evidence) {\n const result = this.alignSingleEvidence(sessionMessages, ev);\n results.push(result);\n\n if (result.aligned) {\n alignedCount++;\n totalConfidence += result.evidence.confidence;\n }\n }\n\n const failedCount = evidence.length - alignedCount;\n const maxMissing = Math.floor(evidence.length * this.optionsV2.maxMissingRatio);\n const evidenceAligned = failedCount <= maxMissing;\n const overallConfidence = evidence.length > 0\n ? totalConfidence / evidence.length\n : 1.0;\n\n return {\n evidenceAligned,\n alignedCount,\n failedCount,\n results,\n overallConfidence\n };\n }\n\n /**\n * Align a single evidence item\n */\n private alignSingleEvidence(\n sessionMessages: string[],\n evidence: ExtractedEvidence\n ): EvidenceAlignResult {\n const { messageIndex, quote } = evidence;\n\n // Validate messageIndex\n if (messageIndex < 0 || messageIndex >= sessionMessages.length) {\n return {\n aligned: false,\n evidence: {\n messageIndex,\n quote,\n failureReason: 'invalid_index'\n }\n };\n }\n\n // Validate quote\n if (!quote || quote.trim().length === 0) {\n return {\n aligned: false,\n evidence: {\n messageIndex,\n quote,\n failureReason: 'empty_quote'\n }\n };\n }\n\n const sourceMessage = sessionMessages[messageIndex];\n\n // Step 1: Try exact match\n const exactResult = this.tryExactMatchV2(quote, sourceMessage, messageIndex);\n if (exactResult) {\n return exactResult;\n }\n\n // Step 2: Try normalized match\n const normalizedResult = this.tryNormalizedMatchV2(quote, sourceMessage, messageIndex);\n if (normalizedResult) {\n return normalizedResult;\n }\n\n // Step 3: Try fuzzy match\n const fuzzyResult = this.tryFuzzyMatchV2(quote, sourceMessage, messageIndex);\n if (fuzzyResult) {\n return fuzzyResult;\n }\n\n // No match found\n return {\n aligned: false,\n evidence: {\n messageIndex,\n quote,\n failureReason: 'not_found'\n }\n };\n }\n\n /**\n * Try exact substring match\n */\n private tryExactMatchV2(\n quote: string,\n source: string,\n messageIndex: number\n ): EvidenceAlignResult | null {\n const index = source.indexOf(quote);\n\n if (index === -1) {\n return null;\n }\n\n return {\n aligned: true,\n evidence: {\n messageIndex,\n quote,\n spanStart: index,\n spanEnd: index + quote.length,\n quoteHash: this.hashQuote(quote),\n confidence: 1.0,\n matchMethod: 'exact'\n }\n };\n }\n\n /**\n * Try normalized match (whitespace collapsed)\n */\n private tryNormalizedMatchV2(\n quote: string,\n source: string,\n messageIndex: number\n ): EvidenceAlignResult | null {\n const normalizedQuote = this.normalizeWhitespace(quote);\n const normalizedSource = this.normalizeWhitespace(source);\n\n const normalizedIndex = normalizedSource.indexOf(normalizedQuote);\n if (normalizedIndex === -1) {\n return null;\n }\n\n // Map back to original positions\n const originalSpan = this.mapToOriginalPositions(\n source,\n normalizedSource,\n normalizedIndex,\n normalizedIndex + normalizedQuote.length\n );\n\n if (!originalSpan) {\n return null;\n }\n\n return {\n aligned: true,\n evidence: {\n messageIndex,\n quote,\n spanStart: originalSpan.start,\n spanEnd: originalSpan.end,\n quoteHash: this.hashQuote(quote),\n confidence: 0.95,\n matchMethod: 'normalized'\n }\n };\n }\n\n /**\n * Try fuzzy match using sliding window\n */\n private tryFuzzyMatchV2(\n quote: string,\n source: string,\n messageIndex: number\n ): EvidenceAlignResult | null {\n const normalizedQuote = this.normalize(quote);\n const normalizedSource = this.normalize(source);\n\n if (normalizedQuote.length < this.optionsV2.minMatchLength) {\n return null;\n }\n\n // Try different window sizes\n const windowSizes = [\n normalizedQuote.length,\n Math.floor(normalizedQuote.length * 1.1),\n Math.floor(normalizedQuote.length * 1.2)\n ];\n\n let bestMatch: {\n index: number;\n windowSize: number;\n similarity: number;\n } | null = null;\n\n for (const windowSize of windowSizes) {\n for (let i = 0; i <= normalizedSource.length - windowSize; i++) {\n const window = normalizedSource.slice(i, i + windowSize);\n const similarity = this.calculateLevenshteinSimilarity(normalizedQuote, window);\n\n if (similarity >= this.optionsV2.fuzzyThreshold) {\n if (!bestMatch || similarity > bestMatch.similarity) {\n bestMatch = { index: i, windowSize, similarity };\n }\n }\n }\n }\n\n if (!bestMatch) {\n return null;\n }\n\n // Map back to original positions (approximate)\n const originalSpan = this.mapToOriginalPositions(\n source,\n normalizedSource,\n bestMatch.index,\n bestMatch.index + bestMatch.windowSize\n );\n\n if (!originalSpan) {\n return null;\n }\n\n return {\n aligned: true,\n evidence: {\n messageIndex,\n quote,\n spanStart: originalSpan.start,\n spanEnd: originalSpan.end,\n quoteHash: this.hashQuote(quote),\n confidence: bestMatch.similarity,\n matchMethod: 'fuzzy'\n }\n };\n }\n\n /**\n * Normalize whitespace only (preserve other characters)\n */\n private normalizeWhitespace(text: string): string {\n return text\n .replace(/[\\t\\r]/g, ' ')\n .replace(/\\n+/g, ' ')\n .replace(/ +/g, ' ')\n .trim();\n }\n\n /**\n * Map normalized positions back to original\n */\n private mapToOriginalPositions(\n original: string,\n normalized: string,\n normalizedStart: number,\n normalizedEnd: number\n ): { start: number; end: number } | null {\n // Build position map\n const normalizedToOriginal: Map<number, number> = new Map();\n let normalizedPos = 0;\n\n for (let origPos = 0; origPos < original.length; origPos++) {\n const char = original[origPos];\n\n // Skip extra whitespace in original\n if (/\\s/.test(char)) {\n // Check if this whitespace contributes to normalized\n if (normalizedPos < normalized.length && /\\s/.test(normalized[normalizedPos])) {\n normalizedToOriginal.set(normalizedPos, origPos);\n normalizedPos++;\n\n // Skip consecutive whitespace in original\n while (origPos + 1 < original.length && /\\s/.test(original[origPos + 1])) {\n origPos++;\n }\n }\n } else {\n normalizedToOriginal.set(normalizedPos, origPos);\n normalizedPos++;\n }\n }\n\n const startOrig = normalizedToOriginal.get(normalizedStart);\n let endOrig = normalizedToOriginal.get(normalizedEnd - 1);\n\n if (startOrig === undefined) {\n return null;\n }\n\n if (endOrig === undefined) {\n // Use end of string\n endOrig = original.length - 1;\n }\n\n return {\n start: startOrig,\n end: endOrig + 1\n };\n }\n\n /**\n * Calculate Levenshtein distance similarity\n */\n private calculateLevenshteinSimilarity(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n\n if (m === 0) return n === 0 ? 1 : 0;\n if (n === 0) return 0;\n\n const dp: number[][] = Array(m + 1).fill(null).map(() => Array(n + 1).fill(0));\n\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n dp[i][j] = Math.min(\n dp[i - 1][j] + 1, // deletion\n dp[i][j - 1] + 1, // insertion\n dp[i - 1][j - 1] + cost // substitution\n );\n }\n }\n\n const distance = dp[m][n];\n const maxLen = Math.max(m, n);\n return 1 - distance / maxLen;\n }\n\n /**\n * Hash quote for deduplication\n */\n private hashQuote(quote: string): string {\n return createHash('sha256').update(quote).digest('hex').slice(0, 16);\n }\n\n /**\n * Convert V2 result to V1 format for backwards compatibility\n */\n convertToV1Result(v2Result: AlignResultV2): AlignmentResult {\n const spans: EvidenceSpan[] = [];\n const missingClaims: string[] = [];\n\n for (const result of v2Result.results) {\n if (result.aligned) {\n const ev = result.evidence as AlignedEvidence;\n spans.push({\n start: ev.spanStart,\n end: ev.spanEnd,\n confidence: ev.confidence,\n matchType: ev.matchMethod === 'exact' ? 'exact' : 'fuzzy',\n originalQuote: ev.quote,\n alignedText: ev.quote\n });\n } else {\n const ev = result.evidence as FailedEvidence;\n missingClaims.push(ev.quote);\n }\n }\n\n return {\n isAligned: v2Result.evidenceAligned,\n confidence: v2Result.overallConfidence,\n spans,\n missingClaims\n };\n }\n}\n\n/**\n * Default evidence aligner instance\n */\nlet defaultAligner: EvidenceAligner | null = null;\n\nexport function getDefaultAligner(): EvidenceAligner {\n if (!defaultAligner) {\n defaultAligner = new EvidenceAligner();\n }\n return defaultAligner;\n}\n", "/**\n * Memory Retriever - Unified retrieval interface\n * Combines vector search, event store lookups, and matching\n */\n\nimport { EventStore } from './event-store.js';\nimport { VectorStore, SearchResult } from './vector-store.js';\nimport { Embedder } from './embedder.js';\nimport { Matcher } from './matcher.js';\nimport type { MemoryEvent, MatchResult, Config } from './types.js';\n\nexport interface RetrievalOptions {\n topK: number;\n minScore: number;\n sessionId?: string;\n maxTokens: number;\n includeSessionContext: boolean;\n}\n\nexport interface RetrievalResult {\n memories: MemoryWithContext[];\n matchResult: MatchResult;\n totalTokens: number;\n context: string;\n}\n\nexport interface MemoryWithContext {\n event: MemoryEvent;\n score: number;\n sessionContext?: string;\n}\n\nconst DEFAULT_OPTIONS: RetrievalOptions = {\n topK: 5,\n minScore: 0.7,\n maxTokens: 2000,\n includeSessionContext: true\n};\n\nexport class Retriever {\n private readonly eventStore: EventStore;\n private readonly vectorStore: VectorStore;\n private readonly embedder: Embedder;\n private readonly matcher: Matcher;\n\n constructor(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher\n ) {\n this.eventStore = eventStore;\n this.vectorStore = vectorStore;\n this.embedder = embedder;\n this.matcher = matcher;\n }\n\n /**\n * Retrieve relevant memories for a query\n */\n async retrieve(\n query: string,\n options: Partial<RetrievalOptions> = {}\n ): Promise<RetrievalResult> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n // Generate query embedding\n const queryEmbedding = await this.embedder.embed(query);\n\n // Search vector store\n const searchResults = await this.vectorStore.search(queryEmbedding.vector, {\n limit: opts.topK * 2, // Get extra for filtering\n minScore: opts.minScore,\n sessionId: opts.sessionId\n });\n\n // Get match result using AXIOMMIND matcher\n const matchResult = this.matcher.matchSearchResults(\n searchResults,\n (eventId) => this.getEventAgeDays(eventId)\n );\n\n // Enrich results with full event data and session context\n const memories = await this.enrichResults(searchResults.slice(0, opts.topK), opts);\n\n // Build context string\n const context = this.buildContext(memories, opts.maxTokens);\n\n return {\n memories,\n matchResult,\n totalTokens: this.estimateTokens(context),\n context\n };\n }\n\n /**\n * Retrieve memories from a specific session\n */\n async retrieveFromSession(sessionId: string): Promise<MemoryEvent[]> {\n return this.eventStore.getSessionEvents(sessionId);\n }\n\n /**\n * Get recent memories across all sessions\n */\n async retrieveRecent(limit: number = 100): Promise<MemoryEvent[]> {\n return this.eventStore.getRecentEvents(limit);\n }\n\n /**\n * Enrich search results with full event data\n */\n private async enrichResults(\n results: SearchResult[],\n options: RetrievalOptions\n ): Promise<MemoryWithContext[]> {\n const memories: MemoryWithContext[] = [];\n\n for (const result of results) {\n const event = await this.eventStore.getEvent(result.eventId);\n if (!event) continue;\n\n let sessionContext: string | undefined;\n if (options.includeSessionContext) {\n sessionContext = await this.getSessionContext(event.sessionId, event.id);\n }\n\n memories.push({\n event,\n score: result.score,\n sessionContext\n });\n }\n\n return memories;\n }\n\n /**\n * Get surrounding context from the same session\n */\n private async getSessionContext(\n sessionId: string,\n eventId: string\n ): Promise<string | undefined> {\n const sessionEvents = await this.eventStore.getSessionEvents(sessionId);\n\n // Find the event index\n const eventIndex = sessionEvents.findIndex(e => e.id === eventId);\n if (eventIndex === -1) return undefined;\n\n // Get 1 event before and after for context\n const start = Math.max(0, eventIndex - 1);\n const end = Math.min(sessionEvents.length, eventIndex + 2);\n const contextEvents = sessionEvents.slice(start, end);\n\n if (contextEvents.length <= 1) return undefined;\n\n return contextEvents\n .filter(e => e.id !== eventId)\n .map(e => `[${e.eventType}]: ${e.content.slice(0, 200)}...`)\n .join('\\n');\n }\n\n /**\n * Build context string from memories (respecting token limit)\n */\n private buildContext(memories: MemoryWithContext[], maxTokens: number): string {\n const parts: string[] = [];\n let currentTokens = 0;\n\n for (const memory of memories) {\n const memoryText = this.formatMemory(memory);\n const memoryTokens = this.estimateTokens(memoryText);\n\n if (currentTokens + memoryTokens > maxTokens) {\n break;\n }\n\n parts.push(memoryText);\n currentTokens += memoryTokens;\n }\n\n if (parts.length === 0) {\n return '';\n }\n\n return `## Relevant Memories\\n\\n${parts.join('\\n\\n---\\n\\n')}`;\n }\n\n /**\n * Format a single memory for context\n */\n private formatMemory(memory: MemoryWithContext): string {\n const { event, score, sessionContext } = memory;\n const date = event.timestamp.toISOString().split('T')[0];\n\n let text = `**${event.eventType}** (${date}, score: ${score.toFixed(2)})\\n${event.content}`;\n\n if (sessionContext) {\n text += `\\n\\n_Context:_ ${sessionContext}`;\n }\n\n return text;\n }\n\n /**\n * Estimate token count (rough approximation)\n */\n private estimateTokens(text: string): number {\n // Rough estimate: ~4 characters per token\n return Math.ceil(text.length / 4);\n }\n\n /**\n * Get event age in days (for recency scoring)\n */\n private getEventAgeDays(eventId: string): number {\n // This would ideally cache event timestamps\n // For now, return 0 (assume recent)\n return 0;\n }\n}\n\n/**\n * Create a retriever with default components\n */\nexport function createRetriever(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher\n): Retriever {\n return new Retriever(eventStore, vectorStore, embedder, matcher);\n}\n", "/**\n * Memory Graduation Pipeline - AXIOMMIND L0\u2192L1\u2192L2\u2192L3\u2192L4\n *\n * L0: EventStore (raw events, append-only)\n * L1: Structured JSON (session summaries, patterns)\n * L2: Type Candidates (Idris2-inspired, validated schemas)\n * L3: Verified Knowledge (cross-session validated)\n * L4: Active/Searchable (indexed, readily available)\n */\n\nimport { EventStore } from './event-store.js';\nimport type {\n MemoryEvent,\n MemoryLevel,\n GraduationResult,\n Insight,\n InsightType\n} from './types.js';\n\nexport interface GraduationCriteria {\n minAccessCount: number;\n minConfidence: number;\n minCrossSessionRefs: number;\n maxAgeDays: number;\n}\n\nexport interface LevelCriteria {\n L0toL1: GraduationCriteria;\n L1toL2: GraduationCriteria;\n L2toL3: GraduationCriteria;\n L3toL4: GraduationCriteria;\n}\n\nconst DEFAULT_CRITERIA: LevelCriteria = {\n L0toL1: {\n minAccessCount: 1,\n minConfidence: 0.5,\n minCrossSessionRefs: 0,\n maxAgeDays: 30\n },\n L1toL2: {\n minAccessCount: 3,\n minConfidence: 0.7,\n minCrossSessionRefs: 1,\n maxAgeDays: 60\n },\n L2toL3: {\n minAccessCount: 5,\n minConfidence: 0.85,\n minCrossSessionRefs: 2,\n maxAgeDays: 90\n },\n L3toL4: {\n minAccessCount: 10,\n minConfidence: 0.92,\n minCrossSessionRefs: 3,\n maxAgeDays: 180\n }\n};\n\nexport interface EventMetrics {\n eventId: string;\n accessCount: number;\n lastAccessed: Date;\n crossSessionRefs: number;\n confidence: number;\n}\n\nexport class GraduationPipeline {\n private readonly eventStore: EventStore;\n private readonly criteria: LevelCriteria;\n private readonly metrics: Map<string, EventMetrics> = new Map();\n\n constructor(\n eventStore: EventStore,\n criteria: Partial<LevelCriteria> = {}\n ) {\n this.eventStore = eventStore;\n this.criteria = {\n L0toL1: { ...DEFAULT_CRITERIA.L0toL1, ...criteria.L0toL1 },\n L1toL2: { ...DEFAULT_CRITERIA.L1toL2, ...criteria.L1toL2 },\n L2toL3: { ...DEFAULT_CRITERIA.L2toL3, ...criteria.L2toL3 },\n L3toL4: { ...DEFAULT_CRITERIA.L3toL4, ...criteria.L3toL4 }\n };\n }\n\n /**\n * Record an access to an event (used for graduation scoring)\n */\n recordAccess(eventId: string, fromSessionId: string, confidence: number = 1.0): void {\n const existing = this.metrics.get(eventId);\n\n if (existing) {\n existing.accessCount++;\n existing.lastAccessed = new Date();\n existing.confidence = Math.max(existing.confidence, confidence);\n // Track cross-session references\n // This would need more sophisticated tracking in production\n } else {\n this.metrics.set(eventId, {\n eventId,\n accessCount: 1,\n lastAccessed: new Date(),\n crossSessionRefs: 0,\n confidence\n });\n }\n }\n\n /**\n * Evaluate if an event should graduate to the next level\n */\n async evaluateGraduation(eventId: string, currentLevel: MemoryLevel): Promise<GraduationResult> {\n const metrics = this.metrics.get(eventId);\n\n if (!metrics) {\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: currentLevel,\n success: false,\n reason: 'No metrics available for event'\n };\n }\n\n const nextLevel = this.getNextLevel(currentLevel);\n if (!nextLevel) {\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: currentLevel,\n success: false,\n reason: 'Already at maximum level'\n };\n }\n\n const criteria = this.getCriteria(currentLevel, nextLevel);\n const evaluation = this.checkCriteria(metrics, criteria);\n\n if (evaluation.passed) {\n // Update level in event store\n await this.eventStore.updateMemoryLevel(eventId, nextLevel);\n\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: nextLevel,\n success: true\n };\n }\n\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: currentLevel,\n success: false,\n reason: evaluation.reason\n };\n }\n\n /**\n * Run graduation evaluation for all events at a given level\n */\n async graduateBatch(level: MemoryLevel): Promise<GraduationResult[]> {\n const results: GraduationResult[] = [];\n\n for (const [eventId, metrics] of this.metrics) {\n const result = await this.evaluateGraduation(eventId, level);\n results.push(result);\n }\n\n return results;\n }\n\n /**\n * Extract insights from graduated events (L1+)\n */\n extractInsights(events: MemoryEvent[]): Insight[] {\n const insights: Insight[] = [];\n\n // Pattern detection: Look for repeated themes\n const patterns = this.detectPatterns(events);\n for (const pattern of patterns) {\n insights.push({\n id: crypto.randomUUID(),\n insightType: 'pattern',\n content: pattern.description,\n canonicalKey: pattern.key,\n confidence: pattern.confidence,\n sourceEvents: pattern.eventIds,\n createdAt: new Date(),\n lastUpdated: new Date()\n });\n }\n\n // Preference detection: Look for user preferences\n const preferences = this.detectPreferences(events);\n for (const pref of preferences) {\n insights.push({\n id: crypto.randomUUID(),\n insightType: 'preference',\n content: pref.description,\n canonicalKey: pref.key,\n confidence: pref.confidence,\n sourceEvents: pref.eventIds,\n createdAt: new Date(),\n lastUpdated: new Date()\n });\n }\n\n return insights;\n }\n\n /**\n * Get the next level in the graduation pipeline\n */\n private getNextLevel(current: MemoryLevel): MemoryLevel | null {\n const levels: MemoryLevel[] = ['L0', 'L1', 'L2', 'L3', 'L4'];\n const currentIndex = levels.indexOf(current);\n\n if (currentIndex === -1 || currentIndex >= levels.length - 1) {\n return null;\n }\n\n return levels[currentIndex + 1];\n }\n\n /**\n * Get criteria for level transition\n */\n private getCriteria(from: MemoryLevel, to: MemoryLevel): GraduationCriteria {\n const key = `${from}to${to}` as keyof LevelCriteria;\n return this.criteria[key] || DEFAULT_CRITERIA.L0toL1;\n }\n\n /**\n * Check if metrics meet criteria\n */\n private checkCriteria(\n metrics: EventMetrics,\n criteria: GraduationCriteria\n ): { passed: boolean; reason?: string } {\n if (metrics.accessCount < criteria.minAccessCount) {\n return {\n passed: false,\n reason: `Access count ${metrics.accessCount} < ${criteria.minAccessCount}`\n };\n }\n\n if (metrics.confidence < criteria.minConfidence) {\n return {\n passed: false,\n reason: `Confidence ${metrics.confidence} < ${criteria.minConfidence}`\n };\n }\n\n if (metrics.crossSessionRefs < criteria.minCrossSessionRefs) {\n return {\n passed: false,\n reason: `Cross-session refs ${metrics.crossSessionRefs} < ${criteria.minCrossSessionRefs}`\n };\n }\n\n const ageDays = (Date.now() - metrics.lastAccessed.getTime()) / (1000 * 60 * 60 * 24);\n if (ageDays > criteria.maxAgeDays) {\n return {\n passed: false,\n reason: `Event too old: ${ageDays.toFixed(1)} days > ${criteria.maxAgeDays}`\n };\n }\n\n return { passed: true };\n }\n\n /**\n * Detect patterns in events\n */\n private detectPatterns(events: MemoryEvent[]): Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> {\n // Simple pattern detection: group by canonical key and look for repeats\n const keyGroups = new Map<string, MemoryEvent[]>();\n\n for (const event of events) {\n const existing = keyGroups.get(event.canonicalKey) || [];\n existing.push(event);\n keyGroups.set(event.canonicalKey, existing);\n }\n\n const patterns: Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> = [];\n\n for (const [key, groupEvents] of keyGroups) {\n if (groupEvents.length >= 2) {\n patterns.push({\n key,\n description: `Repeated topic: ${key.slice(0, 50)}`,\n confidence: Math.min(1.0, groupEvents.length / 5),\n eventIds: groupEvents.map(e => e.id)\n });\n }\n }\n\n return patterns;\n }\n\n /**\n * Detect user preferences from events\n */\n private detectPreferences(events: MemoryEvent[]): Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> {\n // Simple preference detection: look for keywords\n const preferenceKeywords = ['prefer', 'like', 'want', 'always', 'never', 'favorite'];\n const preferences: Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> = [];\n\n for (const event of events) {\n if (event.eventType !== 'user_prompt') continue;\n\n const lowerContent = event.content.toLowerCase();\n for (const keyword of preferenceKeywords) {\n if (lowerContent.includes(keyword)) {\n preferences.push({\n key: `preference_${keyword}_${event.id.slice(0, 8)}`,\n description: `User preference: ${event.content.slice(0, 100)}`,\n confidence: 0.7,\n eventIds: [event.id]\n });\n break;\n }\n }\n }\n\n return preferences;\n }\n\n /**\n * Get graduation statistics\n */\n async getStats(): Promise<{ level: string; count: number }[]> {\n return this.eventStore.getLevelStats();\n }\n}\n\n/**\n * Create graduation pipeline with default settings\n */\nexport function createGraduationPipeline(eventStore: EventStore): GraduationPipeline {\n return new GraduationPipeline(eventStore);\n}\n", "/**\n * Task Matcher - Find existing tasks by title similarity\n * AXIOMMIND: strict matching (\u22650.92, gap\u22650.03)\n */\n\nimport { dbAll, toDate, type Database } from '../db-wrapper.js';\nimport type { Entity, MatchConfidence } from '../types.js';\nimport { makeEntityCanonicalKey } from '../canonical-key.js';\nimport { MATCH_THRESHOLDS } from '../types.js';\n\nexport interface TaskMatchResult {\n match: Entity | null;\n confidence: MatchConfidence;\n score: number;\n gap?: number;\n candidates?: Entity[];\n}\n\nexport interface TaskMatcherConfig {\n minCombinedScore: number;\n minGap: number;\n suggestionThreshold: number;\n maxCandidates: number;\n}\n\nconst DEFAULT_CONFIG: TaskMatcherConfig = {\n minCombinedScore: MATCH_THRESHOLDS.minCombinedScore,\n minGap: MATCH_THRESHOLDS.minGap,\n suggestionThreshold: MATCH_THRESHOLDS.suggestionThreshold,\n maxCandidates: 5\n};\n\nexport class TaskMatcher {\n private readonly config: TaskMatcherConfig;\n\n constructor(\n private db: Database,\n config?: Partial<TaskMatcherConfig>\n ) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Find task by exact canonical key match\n */\n async findExact(title: string, project?: string): Promise<Entity | null> {\n const canonicalKey = makeEntityCanonicalKey('task', title, { project });\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM entities\n WHERE entity_type = 'task' AND canonical_key = ?\n AND status = 'active'`,\n [canonicalKey]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEntity(rows[0]);\n }\n\n /**\n * Find task by alias\n */\n async findByAlias(title: string, project?: string): Promise<Entity | null> {\n const canonicalKey = makeEntityCanonicalKey('task', title, { project });\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT e.* FROM entities e\n JOIN entity_aliases a ON e.entity_id = a.entity_id\n WHERE a.entity_type = 'task' AND a.canonical_key = ?\n AND e.status = 'active'`,\n [canonicalKey]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEntity(rows[0]);\n }\n\n /**\n * Search tasks by text (FTS-like)\n */\n async searchByText(query: string, project?: string): Promise<Array<{ entity: Entity; score: number }>> {\n const searchPattern = `%${query.toLowerCase()}%`;\n\n let sql = `\n SELECT *,\n CASE\n WHEN title_norm = ? THEN 1.0\n WHEN title_norm LIKE ? THEN 0.9\n ELSE 0.7\n END as match_score\n FROM entities\n WHERE entity_type = 'task'\n AND status = 'active'\n AND (title_norm LIKE ? OR search_text LIKE ?)\n `;\n\n const normalizedQuery = query.toLowerCase().trim();\n const params: unknown[] = [normalizedQuery, `%${normalizedQuery}%`, searchPattern, searchPattern];\n\n if (project) {\n sql += ` AND json_extract(current_json, '$.project') = ?`;\n params.push(project);\n }\n\n sql += ` ORDER BY match_score DESC, updated_at DESC LIMIT ?`;\n params.push(this.config.maxCandidates);\n\n const rows = await dbAll<Record<string, unknown>>(this.db, sql, params);\n\n return rows.map(row => ({\n entity: this.rowToEntity(row),\n score: row.match_score as number\n }));\n }\n\n /**\n * Match task with confidence classification\n * Returns high confidence only if score \u2265 0.92 AND gap \u2265 0.03\n */\n async match(title: string, project?: string): Promise<TaskMatchResult> {\n // Step 1: Try exact match\n const exactMatch = await this.findExact(title, project);\n if (exactMatch) {\n return {\n match: exactMatch,\n confidence: 'high',\n score: 1.0\n };\n }\n\n // Step 2: Try alias match\n const aliasMatch = await this.findByAlias(title, project);\n if (aliasMatch) {\n return {\n match: aliasMatch,\n confidence: 'high',\n score: 0.98\n };\n }\n\n // Step 3: Try text search\n const searchResults = await this.searchByText(title, project);\n if (searchResults.length === 0) {\n return {\n match: null,\n confidence: 'none',\n score: 0\n };\n }\n\n const topResult = searchResults[0];\n const secondScore = searchResults.length > 1 ? searchResults[1].score : null;\n\n // Calculate gap\n const gap = secondScore !== null ? topResult.score - secondScore : Infinity;\n\n // Classify confidence\n const confidence = this.classifyConfidence(topResult.score, gap);\n\n // For strict matching, only return high confidence if criteria met\n if (confidence === 'high') {\n return {\n match: topResult.entity,\n confidence: 'high',\n score: topResult.score,\n gap\n };\n }\n\n // For suggested, return candidates\n if (confidence === 'suggested') {\n return {\n match: null,\n confidence: 'suggested',\n score: topResult.score,\n gap,\n candidates: searchResults.slice(0, this.config.maxCandidates).map(r => r.entity)\n };\n }\n\n return {\n match: null,\n confidence: 'none',\n score: topResult.score\n };\n }\n\n /**\n * Classify confidence based on AXIOMMIND thresholds\n */\n private classifyConfidence(score: number, gap: number): MatchConfidence {\n const { minCombinedScore, minGap, suggestionThreshold } = this.config;\n\n // High confidence: score \u2265 0.92 AND gap \u2265 0.03\n if (score >= minCombinedScore && gap >= minGap) {\n return 'high';\n }\n\n // Suggested: score \u2265 0.75\n if (score >= suggestionThreshold) {\n return 'suggested';\n }\n\n return 'none';\n }\n\n /**\n * Get suggestion candidates (for condition fallback)\n */\n async getSuggestionCandidates(title: string, project?: string): Promise<Entity[]> {\n const searchResults = await this.searchByText(title, project);\n return searchResults\n .filter(r => r.score >= this.config.suggestionThreshold)\n .slice(0, this.config.maxCandidates)\n .map(r => r.entity);\n }\n\n /**\n * Convert database row to Entity\n */\n private rowToEntity(row: Record<string, unknown>): Entity {\n return {\n entityId: row.entity_id as string,\n entityType: row.entity_type as 'task' | 'condition' | 'artifact',\n canonicalKey: row.canonical_key as string,\n title: row.title as string,\n stage: row.stage as 'raw' | 'working' | 'candidate' | 'verified' | 'certified',\n status: row.status as 'active' | 'contested' | 'deprecated' | 'superseded',\n currentJson: typeof row.current_json === 'string'\n ? JSON.parse(row.current_json)\n : row.current_json as Record<string, unknown>,\n titleNorm: row.title_norm as string | undefined,\n searchText: row.search_text as string | undefined,\n createdAt: toDate(row.created_at),\n updatedAt: toDate(row.updated_at)\n };\n }\n}\n", "/**\n * Blocker Resolver - Resolve blocker texts to entity references\n * AXIOMMIND: No stub task creation, fallback to condition\n */\n\nimport { dbRun, dbAll, type Database } from '../db-wrapper.js';\nimport { randomUUID } from 'crypto';\nimport type { BlockerRef, BlockerKind, Entity } from '../types.js';\nimport { makeEntityCanonicalKey, makeArtifactKey } from '../canonical-key.js';\nimport { TaskMatcher } from './task-matcher.js';\n\nexport interface BlockerResolverConfig {\n project?: string;\n}\n\n// Patterns for artifact detection\nconst URL_PATTERN = /^https?:\\/\\/.+/;\nconst JIRA_PATTERN = /^[A-Z]+-\\d+$/;\nconst GITHUB_ISSUE_PATTERN = /^[^\\/]+\\/[^#]+#\\d+$/;\nconst TASK_ID_PATTERN = /^task:[^:]+:[^:]+$/;\n\nexport class BlockerResolver {\n private taskMatcher: TaskMatcher;\n\n constructor(\n private db: Database,\n private config: BlockerResolverConfig = {}\n ) {\n this.taskMatcher = new TaskMatcher(db);\n }\n\n /**\n * Resolve a single blocker text to entity reference\n * Rules:\n * 1. Strong ID/URL/key pattern \u2192 artifact\n * 2. Explicit task_id \u2192 task\n * 3. Task title match (strict only) \u2192 task\n * 4. Fallback \u2192 condition (no stub task creation)\n */\n async resolveBlocker(\n text: string,\n sourceEntryId?: string\n ): Promise<BlockerRef> {\n const trimmedText = text.trim();\n\n // Rule 1: Check for artifact patterns\n const artifactRef = await this.tryResolveAsArtifact(trimmedText);\n if (artifactRef) {\n return artifactRef;\n }\n\n // Rule 2: Check for explicit task_id pattern\n if (TASK_ID_PATTERN.test(trimmedText)) {\n const taskRef = await this.tryResolveAsTaskId(trimmedText);\n if (taskRef) {\n return taskRef;\n }\n // Task ID not found, fall through to condition\n }\n\n // Rule 3: Try task title matching (strict only)\n const taskMatch = await this.taskMatcher.match(trimmedText, this.config.project);\n\n if (taskMatch.confidence === 'high' && taskMatch.match) {\n // Strict match found\n return {\n kind: 'task',\n entityId: taskMatch.match.entityId,\n rawText: trimmedText,\n confidence: taskMatch.score\n };\n }\n\n // Rule 4: Fallback to condition (get-or-create)\n // Also store candidates if any\n const conditionRef = await this.createConditionBlocker(\n trimmedText,\n taskMatch.candidates\n );\n\n return conditionRef;\n }\n\n /**\n * Resolve multiple blocker texts\n */\n async resolveBlockers(\n texts: string[],\n sourceEntryId?: string\n ): Promise<BlockerRef[]> {\n const results: BlockerRef[] = [];\n\n for (const text of texts) {\n const ref = await this.resolveBlocker(text, sourceEntryId);\n results.push(ref);\n }\n\n return results;\n }\n\n /**\n * Try to resolve as artifact (URL, JIRA, GitHub)\n */\n private async tryResolveAsArtifact(text: string): Promise<BlockerRef | null> {\n // Check patterns\n if (!URL_PATTERN.test(text) && !JIRA_PATTERN.test(text) && !GITHUB_ISSUE_PATTERN.test(text)) {\n return null;\n }\n\n const canonicalKey = makeArtifactKey(text);\n\n // Find or create artifact\n const existing = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT entity_id FROM entities\n WHERE entity_type = 'artifact' AND canonical_key = ?`,\n [canonicalKey]\n );\n\n let entityId: string;\n\n if (existing.length > 0) {\n entityId = existing[0].entity_id as string;\n } else {\n // Create artifact entity via event\n entityId = await this.declareArtifact(text, canonicalKey);\n }\n\n return {\n kind: 'artifact',\n entityId,\n rawText: text,\n confidence: 1.0\n };\n }\n\n /**\n * Try to resolve as explicit task ID\n */\n private async tryResolveAsTaskId(taskId: string): Promise<BlockerRef | null> {\n // taskId format: task:project:identifier\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT entity_id FROM entities\n WHERE entity_type = 'task' AND canonical_key = ?\n AND status = 'active'`,\n [taskId]\n );\n\n if (rows.length === 0) {\n return null;\n }\n\n return {\n kind: 'task',\n entityId: rows[0].entity_id as string,\n rawText: taskId,\n confidence: 1.0\n };\n }\n\n /**\n * Create condition blocker (get-or-create)\n */\n private async createConditionBlocker(\n text: string,\n candidates?: Entity[]\n ): Promise<BlockerRef> {\n const canonicalKey = makeEntityCanonicalKey('condition', text, {\n project: this.config.project\n });\n\n // Find existing condition\n const existing = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT entity_id FROM entities\n WHERE entity_type = 'condition' AND canonical_key = ?`,\n [canonicalKey]\n );\n\n let entityId: string;\n\n if (existing.length > 0) {\n entityId = existing[0].entity_id as string;\n } else {\n // Create condition entity via event\n entityId = await this.declareCondition(text, canonicalKey, candidates);\n }\n\n return {\n kind: 'condition',\n entityId,\n rawText: text,\n confidence: 0.5,\n candidates: candidates?.map(c => c.entityId)\n };\n }\n\n /**\n * Declare a new condition entity\n */\n private async declareCondition(\n text: string,\n canonicalKey: string,\n candidates?: Entity[]\n ): Promise<string> {\n const entityId = randomUUID();\n const now = new Date().toISOString();\n\n const currentJson = {\n text,\n resolved: false,\n candidates: candidates?.map(c => ({\n entityId: c.entityId,\n title: c.title\n }))\n };\n\n await dbRun(\n this.db,\n `INSERT INTO entities (\n entity_id, entity_type, canonical_key, title, stage, status,\n current_json, title_norm, search_text, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n entityId,\n 'condition',\n canonicalKey,\n text,\n 'raw',\n 'active',\n JSON.stringify(currentJson),\n text.toLowerCase().trim(),\n text,\n now,\n now\n ]\n );\n\n // Create alias\n await dbRun(\n this.db,\n `INSERT INTO entity_aliases (entity_type, canonical_key, entity_id, is_primary)\n VALUES (?, ?, ?, TRUE)\n ON CONFLICT (entity_type, canonical_key) DO NOTHING`,\n ['condition', canonicalKey, entityId]\n );\n\n return entityId;\n }\n\n /**\n * Declare a new artifact entity\n */\n private async declareArtifact(\n identifier: string,\n canonicalKey: string\n ): Promise<string> {\n const entityId = randomUUID();\n const now = new Date().toISOString();\n\n // Determine artifact type\n let artifactType = 'generic';\n if (URL_PATTERN.test(identifier)) {\n artifactType = 'url';\n } else if (JIRA_PATTERN.test(identifier)) {\n artifactType = 'jira';\n } else if (GITHUB_ISSUE_PATTERN.test(identifier)) {\n artifactType = 'github_issue';\n }\n\n const currentJson = {\n identifier,\n artifactType\n };\n\n await dbRun(\n this.db,\n `INSERT INTO entities (\n entity_id, entity_type, canonical_key, title, stage, status,\n current_json, title_norm, search_text, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n entityId,\n 'artifact',\n canonicalKey,\n identifier,\n 'raw',\n 'active',\n JSON.stringify(currentJson),\n identifier.toLowerCase(),\n identifier,\n now,\n now\n ]\n );\n\n // Create alias\n await dbRun(\n this.db,\n `INSERT INTO entity_aliases (entity_type, canonical_key, entity_id, is_primary)\n VALUES (?, ?, ?, TRUE)\n ON CONFLICT (entity_type, canonical_key) DO NOTHING`,\n ['artifact', canonicalKey, entityId]\n );\n\n return entityId;\n }\n\n /**\n * Create unknown placeholder condition\n * Used when task is blocked but no blocker text provided\n */\n async createUnknownPlaceholder(taskTitle: string): Promise<BlockerRef> {\n const text = `Unknown blocker for: ${taskTitle}`;\n\n const ref = await this.createConditionBlocker(text);\n\n // Mark as auto placeholder\n await dbRun(\n this.db,\n `UPDATE entities\n SET current_json = json_set(current_json, '$.auto_placeholder', true)\n WHERE entity_id = ?`,\n [ref.entityId]\n );\n\n return {\n ...ref,\n confidence: 0.0\n };\n }\n}\n", "/**\n * Task Resolver - Process extracted task entries and emit task events\n * AXIOMMIND: Task state via event fold, no direct updates\n */\n\nimport { dbRun, dbAll, type Database } from '../db-wrapper.js';\nimport { randomUUID } from 'crypto';\nimport type {\n Entity,\n TaskStatus,\n TaskPriority,\n BlockerRef,\n BlockerMode\n} from '../types.js';\nimport { makeEntityCanonicalKey, makeTaskEventDedupeKey } from '../canonical-key.js';\nimport { TaskMatcher } from './task-matcher.js';\nimport { BlockerResolver } from './blocker-resolver.js';\n\nexport interface ExtractedTask {\n title: string;\n status?: TaskStatus;\n priority?: TaskPriority;\n blockedBy?: string[];\n description?: string;\n project?: string;\n}\n\nexport interface TaskResolverConfig {\n sessionId: string;\n project?: string;\n evidenceAligned?: boolean;\n}\n\n// Valid status transitions\nconst VALID_TRANSITIONS: Record<TaskStatus, TaskStatus[]> = {\n pending: ['in_progress', 'cancelled'],\n in_progress: ['blocked', 'done', 'cancelled'],\n blocked: ['in_progress', 'done', 'cancelled'],\n done: [], // Terminal state\n cancelled: [] // Terminal state\n};\n\nexport class TaskResolver {\n private taskMatcher: TaskMatcher;\n private blockerResolver: BlockerResolver;\n\n constructor(\n private db: Database,\n private config: TaskResolverConfig\n ) {\n this.taskMatcher = new TaskMatcher(db);\n this.blockerResolver = new BlockerResolver(db, { project: config.project });\n }\n\n /**\n * Process extracted task entry\n * 1. Find or create task entity\n * 2. Emit status/priority change events if needed\n * 3. Process blockers\n */\n async processTask(extracted: ExtractedTask, sourceEntryId?: string): Promise<{\n taskId: string;\n isNew: boolean;\n events: string[];\n }> {\n const events: string[] = [];\n\n // Step 1: Find existing task or create new\n const { task, isNew, eventId: createEventId } = await this.findOrCreateTask(extracted);\n\n if (isNew && createEventId) {\n events.push(createEventId);\n }\n\n // Step 2: Handle status changes\n if (extracted.status) {\n const statusEvent = await this.handleStatusChange(task, extracted.status);\n if (statusEvent) {\n events.push(statusEvent);\n }\n }\n\n // Step 3: Handle priority changes\n if (extracted.priority) {\n const priorityEvent = await this.handlePriorityChange(task, extracted.priority);\n if (priorityEvent) {\n events.push(priorityEvent);\n }\n }\n\n // Step 4: Handle blockers\n if (extracted.blockedBy && extracted.blockedBy.length > 0) {\n const blockerEvent = await this.handleBlockers(\n task,\n extracted.blockedBy,\n sourceEntryId\n );\n if (blockerEvent) {\n events.push(blockerEvent);\n }\n } else if (extracted.status === 'blocked') {\n // Status is blocked but no blockers provided\n // Create unknown placeholder\n const blockerEvent = await this.handleUnknownBlocker(task);\n if (blockerEvent) {\n events.push(blockerEvent);\n }\n }\n\n return {\n taskId: task.entityId,\n isNew,\n events\n };\n }\n\n /**\n * Find existing task or create new one\n */\n private async findOrCreateTask(extracted: ExtractedTask): Promise<{\n task: Entity;\n isNew: boolean;\n eventId?: string;\n }> {\n // Try to find existing task\n const matchResult = await this.taskMatcher.match(extracted.title, extracted.project);\n\n if (matchResult.confidence === 'high' && matchResult.match) {\n return {\n task: matchResult.match,\n isNew: false\n };\n }\n\n // Create new task\n const taskId = randomUUID();\n const canonicalKey = makeEntityCanonicalKey('task', extracted.title, {\n project: extracted.project\n });\n\n // Correct initial status: never start as 'done'\n let initialStatus = extracted.status ?? 'pending';\n if (initialStatus === 'done') {\n initialStatus = 'in_progress'; // Correct: can't start as done\n }\n\n const now = new Date();\n\n const currentJson = {\n status: initialStatus,\n priority: extracted.priority ?? 'medium',\n description: extracted.description,\n project: extracted.project ?? this.config.project\n };\n\n // Insert entity\n await dbRun(\n this.db,\n `INSERT INTO entities (\n entity_id, entity_type, canonical_key, title, stage, status,\n current_json, title_norm, search_text, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n taskId,\n 'task',\n canonicalKey,\n extracted.title,\n 'raw',\n 'active',\n JSON.stringify(currentJson),\n extracted.title.toLowerCase().trim(),\n `${extracted.title} ${extracted.description ?? ''}`,\n now.toISOString(),\n now.toISOString()\n ]\n );\n\n // Create alias\n await dbRun(\n this.db,\n `INSERT INTO entity_aliases (entity_type, canonical_key, entity_id, is_primary)\n VALUES (?, ?, ?, TRUE)\n ON CONFLICT (entity_type, canonical_key) DO NOTHING`,\n ['task', canonicalKey, taskId]\n );\n\n // Emit task_created event\n const eventId = await this.emitTaskEvent('task_created', {\n taskId,\n title: extracted.title,\n canonicalKey,\n initialStatus,\n priority: extracted.priority ?? 'medium',\n description: extracted.description,\n project: extracted.project ?? this.config.project\n });\n\n // Return created entity\n const task: Entity = {\n entityId: taskId,\n entityType: 'task',\n canonicalKey,\n title: extracted.title,\n stage: 'raw',\n status: 'active',\n currentJson,\n titleNorm: extracted.title.toLowerCase().trim(),\n searchText: `${extracted.title} ${extracted.description ?? ''}`,\n createdAt: now,\n updatedAt: now\n };\n\n return { task, isNew: true, eventId };\n }\n\n /**\n * Handle task status change\n */\n private async handleStatusChange(\n task: Entity,\n newStatus: TaskStatus\n ): Promise<string | null> {\n const currentJson = task.currentJson as { status: TaskStatus };\n const currentStatus = currentJson.status;\n\n if (currentStatus === newStatus) {\n return null; // No change\n }\n\n // Validate transition\n const validNextStates = VALID_TRANSITIONS[currentStatus] ?? [];\n if (!validNextStates.includes(newStatus)) {\n // Invalid transition - emit rejection event\n return this.emitTaskEvent('task_transition_rejected', {\n taskId: task.entityId,\n fromStatus: currentStatus,\n toStatus: newStatus,\n reason: `Invalid transition from ${currentStatus} to ${newStatus}`\n });\n }\n\n // Emit status change event\n const eventId = await this.emitTaskEvent('task_status_changed', {\n taskId: task.entityId,\n fromStatus: currentStatus,\n toStatus: newStatus\n });\n\n // Update entity (projector will do this, but we update for immediate consistency)\n await dbRun(\n this.db,\n `UPDATE entities\n SET current_json = json_set(current_json, '$.status', ?),\n updated_at = ?\n WHERE entity_id = ?`,\n [newStatus, new Date().toISOString(), task.entityId]\n );\n\n return eventId;\n }\n\n /**\n * Handle task priority change\n */\n private async handlePriorityChange(\n task: Entity,\n newPriority: TaskPriority\n ): Promise<string | null> {\n const currentJson = task.currentJson as { priority?: TaskPriority };\n const currentPriority = currentJson.priority ?? 'medium';\n\n if (currentPriority === newPriority) {\n return null; // No change\n }\n\n // Emit priority change event\n const eventId = await this.emitTaskEvent('task_priority_changed', {\n taskId: task.entityId,\n fromPriority: currentPriority,\n toPriority: newPriority\n });\n\n // Update entity\n await dbRun(\n this.db,\n `UPDATE entities\n SET current_json = json_set(current_json, '$.priority', ?),\n updated_at = ?\n WHERE entity_id = ?`,\n [newPriority, new Date().toISOString(), task.entityId]\n );\n\n return eventId;\n }\n\n /**\n * Handle blockers\n */\n private async handleBlockers(\n task: Entity,\n blockedByTexts: string[],\n sourceEntryId?: string\n ): Promise<string | null> {\n // Resolve blocker texts to entity refs\n const blockerRefs = await this.blockerResolver.resolveBlockers(blockedByTexts);\n\n // Determine mode based on evidence alignment\n const mode: BlockerMode = this.config.evidenceAligned ? 'replace' : 'suggest';\n\n // Emit task_blockers_set event\n const eventId = await this.emitTaskEvent('task_blockers_set', {\n taskId: task.entityId,\n mode,\n blockers: blockerRefs,\n sourceEntryId\n });\n\n return eventId;\n }\n\n /**\n * Handle unknown blocker (status=blocked but no blockedBy)\n */\n private async handleUnknownBlocker(task: Entity): Promise<string | null> {\n const placeholderRef = await this.blockerResolver.createUnknownPlaceholder(task.title);\n\n const eventId = await this.emitTaskEvent('task_blockers_set', {\n taskId: task.entityId,\n mode: 'suggest' as BlockerMode,\n blockers: [placeholderRef]\n });\n\n return eventId;\n }\n\n /**\n * Emit task event to events table\n */\n private async emitTaskEvent(\n eventType: string,\n payload: Record<string, unknown>\n ): Promise<string> {\n const eventId = randomUUID();\n const now = new Date();\n\n // Generate dedupe key\n const dedupeKey = makeTaskEventDedupeKey(\n eventType,\n payload.taskId as string,\n this.config.sessionId,\n JSON.stringify(payload)\n );\n\n // Check for duplicate\n const existing = await dbAll<{ event_id: string }>(\n this.db,\n `SELECT event_id FROM event_dedup WHERE dedupe_key = ?`,\n [dedupeKey]\n );\n\n if (existing.length > 0) {\n return existing[0].event_id; // Return existing event ID\n }\n\n // Insert event\n await dbRun(\n this.db,\n `INSERT INTO events (\n id, event_type, session_id, timestamp, content,\n canonical_key, dedupe_key, metadata\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n eventId,\n eventType,\n this.config.sessionId,\n now.toISOString(),\n JSON.stringify(payload),\n `task_event:${eventType}:${payload.taskId}`,\n dedupeKey,\n JSON.stringify({ source: 'task_resolver' })\n ]\n );\n\n // Insert dedup record\n await dbRun(\n this.db,\n `INSERT INTO event_dedup (dedupe_key, event_id)\n VALUES (?, ?)\n ON CONFLICT DO NOTHING`,\n [dedupeKey, eventId]\n );\n\n return eventId;\n }\n\n /**\n * Resolve condition to task (when condition is identified as existing task)\n */\n async resolveConditionToTask(\n conditionId: string,\n taskId: string\n ): Promise<string> {\n const eventId = await this.emitTaskEvent('condition_resolved_to', {\n conditionId,\n resolvedTo: {\n kind: 'task',\n entityId: taskId\n }\n });\n\n // Create resolves_to edge\n await dbRun(\n this.db,\n `INSERT INTO edges (edge_id, src_type, src_id, rel_type, dst_type, dst_id, meta_json)\n VALUES (?, 'entity', ?, 'resolves_to', 'entity', ?, ?)\n ON CONFLICT DO NOTHING`,\n [randomUUID(), conditionId, taskId, JSON.stringify({ resolved_at: new Date().toISOString() })]\n );\n\n return eventId;\n }\n}\n", "/**\n * Task Projector - Project task events to entities/edges\n * AXIOMMIND: Incremental processing with offset tracking\n */\n\nimport { dbRun, dbAll, toDate, type Database } from '../db-wrapper.js';\nimport { randomUUID } from 'crypto';\nimport type { BlockerMode, BlockerRef } from '../types.js';\n\nconst PROJECTOR_NAME = 'task_projector';\nconst TASK_EVENT_TYPES = [\n 'task_created',\n 'task_status_changed',\n 'task_priority_changed',\n 'task_blockers_set',\n 'task_transition_rejected',\n 'condition_resolved_to'\n];\n\ninterface ProjectionOffset {\n lastEventId: string | null;\n lastTimestamp: Date | null;\n}\n\ninterface TaskEvent {\n id: string;\n eventType: string;\n sessionId: string;\n timestamp: Date;\n content: Record<string, unknown>;\n}\n\nexport class TaskProjector {\n constructor(private db: Database) {}\n\n /**\n * Get current projection offset\n */\n async getOffset(): Promise<ProjectionOffset> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT last_event_id, last_timestamp\n FROM projection_offsets\n WHERE projection_name = ?`,\n [PROJECTOR_NAME]\n );\n\n if (rows.length === 0) {\n return { lastEventId: null, lastTimestamp: null };\n }\n\n return {\n lastEventId: rows[0].last_event_id as string | null,\n lastTimestamp: rows[0].last_timestamp\n ? new Date(rows[0].last_timestamp as string)\n : null\n };\n }\n\n /**\n * Update projection offset\n */\n private async updateOffset(eventId: string, timestamp: Date): Promise<void> {\n await dbRun(\n this.db,\n `INSERT INTO projection_offsets (projection_name, last_event_id, last_timestamp, updated_at)\n VALUES (?, ?, ?, CURRENT_TIMESTAMP)\n ON CONFLICT (projection_name) DO UPDATE SET\n last_event_id = excluded.last_event_id,\n last_timestamp = excluded.last_timestamp,\n updated_at = CURRENT_TIMESTAMP`,\n [PROJECTOR_NAME, eventId, timestamp.toISOString()]\n );\n }\n\n /**\n * Fetch events since last offset\n */\n async fetchEventsSince(\n offset: ProjectionOffset,\n limit: number = 100\n ): Promise<TaskEvent[]> {\n let query = `\n SELECT id, event_type, session_id, timestamp, content\n FROM events\n WHERE event_type IN (${TASK_EVENT_TYPES.map(() => '?').join(', ')})\n `;\n const params: unknown[] = [...TASK_EVENT_TYPES];\n\n if (offset.lastTimestamp && offset.lastEventId) {\n query += ` AND (timestamp > ? OR (timestamp = ? AND id > ?))`;\n params.push(\n offset.lastTimestamp.toISOString(),\n offset.lastTimestamp.toISOString(),\n offset.lastEventId\n );\n }\n\n query += ` ORDER BY timestamp ASC, id ASC LIMIT ?`;\n params.push(limit);\n\n const rows = await dbAll<Record<string, unknown>>(this.db, query, params);\n\n return rows.map(row => ({\n id: row.id as string,\n eventType: row.event_type as string,\n sessionId: row.session_id as string,\n timestamp: toDate(row.timestamp),\n content: typeof row.content === 'string'\n ? JSON.parse(row.content)\n : row.content as Record<string, unknown>\n }));\n }\n\n /**\n * Process a batch of events\n */\n async processBatch(batchSize: number = 100): Promise<number> {\n const offset = await this.getOffset();\n const events = await this.fetchEventsSince(offset, batchSize);\n\n if (events.length === 0) {\n return 0;\n }\n\n for (const event of events) {\n await this.processEvent(event);\n await this.updateOffset(event.id, event.timestamp);\n }\n\n return events.length;\n }\n\n /**\n * Process all pending events\n */\n async processAll(): Promise<number> {\n let totalProcessed = 0;\n let processed: number;\n\n do {\n processed = await this.processBatch();\n totalProcessed += processed;\n } while (processed > 0);\n\n return totalProcessed;\n }\n\n /**\n * Process a single event\n */\n private async processEvent(event: TaskEvent): Promise<void> {\n switch (event.eventType) {\n case 'task_created':\n // Entity already created by TaskResolver, just ensure vector outbox entry\n await this.enqueueForVectorization(event.content.taskId as string, 'task_title');\n break;\n\n case 'task_status_changed':\n await this.handleStatusChanged(event);\n break;\n\n case 'task_priority_changed':\n // Priority change doesn't affect edges\n break;\n\n case 'task_blockers_set':\n await this.handleBlockersSet(event);\n break;\n\n case 'condition_resolved_to':\n await this.handleConditionResolved(event);\n break;\n\n case 'task_transition_rejected':\n // Log event, no state change\n break;\n }\n }\n\n /**\n * Handle task_status_changed event\n */\n private async handleStatusChanged(event: TaskEvent): Promise<void> {\n const { taskId, toStatus } = event.content;\n\n // If status changed to 'done', remove all blocked_by edges\n if (toStatus === 'done') {\n await dbRun(\n this.db,\n `DELETE FROM edges\n WHERE src_id = ? AND rel_type IN ('blocked_by', 'blocked_by_suggested')`,\n [taskId]\n );\n\n // Clear blockers cache in entity\n await dbRun(\n this.db,\n `UPDATE entities\n SET current_json = json_remove(json_remove(current_json, '$.blockers'), '$.blockerSuggestions'),\n updated_at = CURRENT_TIMESTAMP\n WHERE entity_id = ?`,\n [taskId]\n );\n }\n }\n\n /**\n * Handle task_blockers_set event\n */\n private async handleBlockersSet(event: TaskEvent): Promise<void> {\n const { taskId, mode, blockers } = event.content as {\n taskId: string;\n mode: BlockerMode;\n blockers: BlockerRef[];\n };\n\n if (mode === 'replace') {\n // Delete existing blocked_by edges\n await dbRun(\n this.db,\n `DELETE FROM edges WHERE src_id = ? AND rel_type = 'blocked_by'`,\n [taskId]\n );\n\n // Create new edges\n for (const blocker of blockers) {\n await this.createBlockerEdge(taskId, blocker, 'blocked_by');\n }\n\n // Update entity cache\n const blockerIds = blockers.map(b => b.entityId);\n await dbRun(\n this.db,\n `UPDATE entities\n SET current_json = json_set(current_json, '$.blockers', ?),\n updated_at = CURRENT_TIMESTAMP\n WHERE entity_id = ?`,\n [JSON.stringify(blockerIds), taskId]\n );\n\n } else {\n // mode === 'suggest'\n // Delete existing suggested edges\n await dbRun(\n this.db,\n `DELETE FROM edges WHERE src_id = ? AND rel_type = 'blocked_by_suggested'`,\n [taskId]\n );\n\n // Create suggested edges\n for (const blocker of blockers) {\n await this.createBlockerEdge(taskId, blocker, 'blocked_by_suggested');\n }\n\n // Update entity cache (suggestions)\n const suggestionIds = blockers.map(b => b.entityId);\n await dbRun(\n this.db,\n `UPDATE entities\n SET current_json = json_set(current_json, '$.blockerSuggestions', ?),\n updated_at = CURRENT_TIMESTAMP\n WHERE entity_id = ?`,\n [JSON.stringify(suggestionIds), taskId]\n );\n }\n }\n\n /**\n * Create blocker edge\n */\n private async createBlockerEdge(\n taskId: string,\n blocker: BlockerRef,\n relType: 'blocked_by' | 'blocked_by_suggested'\n ): Promise<void> {\n const edgeId = randomUUID();\n\n await dbRun(\n this.db,\n `INSERT INTO edges (edge_id, src_type, src_id, rel_type, dst_type, dst_id, meta_json, created_at)\n VALUES (?, 'entity', ?, ?, 'entity', ?, ?, CURRENT_TIMESTAMP)\n ON CONFLICT DO NOTHING`,\n [\n edgeId,\n taskId,\n relType,\n blocker.entityId,\n JSON.stringify({\n kind: blocker.kind,\n rawText: blocker.rawText,\n confidence: blocker.confidence,\n candidates: blocker.candidates\n })\n ]\n );\n }\n\n /**\n * Handle condition_resolved_to event\n */\n private async handleConditionResolved(event: TaskEvent): Promise<void> {\n const { conditionId, resolvedTo } = event.content as {\n conditionId: string;\n resolvedTo: { kind: string; entityId: string };\n };\n\n // Update condition entity\n await dbRun(\n this.db,\n `UPDATE entities\n SET current_json = json_set(json_set(current_json, '$.resolved', true), '$.resolvedTo', ?),\n updated_at = CURRENT_TIMESTAMP\n WHERE entity_id = ?`,\n [JSON.stringify(resolvedTo), conditionId]\n );\n\n // Edge already created by TaskResolver\n }\n\n /**\n * Enqueue entity for vectorization\n */\n private async enqueueForVectorization(itemId: string, itemKind: string): Promise<void> {\n const jobId = randomUUID();\n const embeddingVersion = 'v1'; // Should come from config\n\n await dbRun(\n this.db,\n `INSERT INTO vector_outbox (job_id, item_kind, item_id, embedding_version, status, retry_count)\n VALUES (?, ?, ?, ?, 'pending', 0)\n ON CONFLICT (item_kind, item_id, embedding_version) DO NOTHING`,\n [jobId, itemKind, itemId, embeddingVersion]\n );\n }\n\n /**\n * Rebuild all projections from scratch\n * WARNING: This clears all edges and rebuilds from events\n */\n async rebuild(): Promise<number> {\n // Clear task-related edges\n await dbRun(\n this.db,\n `DELETE FROM edges WHERE rel_type IN ('blocked_by', 'blocked_by_suggested', 'resolves_to')`\n );\n\n // Reset offset\n await dbRun(\n this.db,\n `DELETE FROM projection_offsets WHERE projection_name = ?`,\n [PROJECTOR_NAME]\n );\n\n // Process all events\n return this.processAll();\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;AAKA,SAAS,SAAS;AAMX,IAAM,kBAAkB,EAAE,KAAK;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAOM,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,IAAI,EAAE,OAAO,EAAE,KAAK;AAAA,EACpB,WAAW;AAAA,EACX,WAAW,EAAE,OAAO;AAAA,EACpB,WAAW,EAAE,KAAK;AAAA,EAClB,SAAS,EAAE,OAAO;AAAA,EAClB,cAAc,EAAE,OAAO;AAAA,EACvB,WAAW,EAAE,OAAO;AAAA,EACpB,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAC3C,CAAC;AAIM,IAAM,yBAAyB,kBAAkB,KAAK;AAAA,EAC3D,IAAI;AAAA,EACJ,WAAW;AAAA,EACX,cAAc;AAChB,CAAC;AAOM,IAAM,gBAAgB,EAAE,OAAO;AAAA,EACpC,IAAI,EAAE,OAAO;AAAA,EACb,WAAW,EAAE,KAAK;AAAA,EAClB,SAAS,EAAE,KAAK,EAAE,SAAS;AAAA,EAC3B,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AACrC,CAAC;AAOM,IAAM,oBAAoB,EAAE,KAAK;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,gBAAgB,EAAE,OAAO;AAAA,EACpC,IAAI,EAAE,OAAO,EAAE,KAAK;AAAA,EACpB,aAAa;AAAA,EACb,SAAS,EAAE,OAAO;AAAA,EAClB,cAAc,EAAE,OAAO;AAAA,EACvB,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACnC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;AAAA,EACvC,WAAW,EAAE,KAAK;AAAA,EAClB,aAAa,EAAE,KAAK;AACtB,CAAC;AAOM,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,OAAO;AAAA,EACP,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EAC9B,iBAAiB,EAAE,OAAO,EAAE,SAAS;AACvC,CAAC;AAOM,IAAM,wBAAwB,EAAE,KAAK,CAAC,QAAQ,aAAa,MAAM,CAAC;AAGlE,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,OAAO,kBAAkB,SAAS;AAAA,EAClC,YAAY;AAAA,EACZ,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,EACzB,cAAc,EAAE,MAAM,iBAAiB,EAAE,SAAS;AACpD,CAAC;AAIM,IAAM,mBAAmB;AAAA,EAC9B,kBAAkB;AAAA,EAClB,QAAQ;AAAA,EACR,qBAAqB;AACvB;AAMO,IAAM,oBAAoB,EAAE,KAAK,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI,CAAC;AAG/D,IAAM,yBAAyB,EAAE,OAAO;AAAA,EAC7C,SAAS,EAAE,OAAO,EAAE,KAAK;AAAA,EACzB,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS,EAAE,QAAQ;AAAA,EACnB,QAAQ,EAAE,OAAO,EAAE,SAAS;AAC9B,CAAC;AAOM,IAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACpC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EAC/B,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACnC,WAAW,EAAE,KAAK,CAAC,SAAS,SAAS,MAAM,CAAC;AAAA,EAC5C,eAAe,EAAE,OAAO;AAAA,EACxB,aAAa,EAAE,OAAO;AACxB,CAAC;AAOM,IAAM,eAAe,EAAE,OAAO;AAAA,EACnC,SAAS,EAAE,OAAO;AAAA,IAChB,MAAM,EAAE,OAAO,EAAE,QAAQ,uBAAuB;AAAA,IAChD,WAAW,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,EACnC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,WAAW,EAAE,OAAO;AAAA,IAClB,UAAU,EAAE,KAAK,CAAC,SAAS,QAAQ,CAAC,EAAE,QAAQ,OAAO;AAAA,IACrD,OAAO,EAAE,OAAO,EAAE,QAAQ,yBAAyB;AAAA,IACnD,aAAa,EAAE,OAAO,EAAE,QAAQ,wBAAwB;AAAA,IACxD,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EAClC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,WAAW,EAAE,OAAO;AAAA,IAClB,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,IAC1B,UAAU,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,IAChC,WAAW,EAAE,OAAO,EAAE,QAAQ,GAAI;AAAA,EACpC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,UAAU,EAAE,OAAO;AAAA,IACjB,kBAAkB,EAAE,OAAO,EAAE,QAAQ,IAAI;AAAA,IACzC,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI;AAAA,IAC/B,qBAAqB,EAAE,OAAO,EAAE,QAAQ,IAAI;AAAA,IAC5C,SAAS,EAAE,OAAO;AAAA,MAChB,oBAAoB,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,MAC1C,UAAU,EAAE,OAAO,EAAE,QAAQ,IAAI;AAAA,MACjC,cAAc,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,MACpC,cAAc,EAAE,OAAO,EAAE,QAAQ,IAAI;AAAA,IACvC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACf,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,SAAS,EAAE,OAAO;AAAA,IAChB,iBAAiB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,YAAY,UAAU,WAAW,SAAS,QAAQ,CAAC;AAAA,IACjG,WAAW,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,IACpC,aAAa,EAAE,OAAO;AAAA,MACpB,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,MACjC,QAAQ,EAAE,KAAK,CAAC,aAAa,cAAc,EAAE,CAAC,EAAE,QAAQ,WAAW;AAAA,MACnE,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,MAC5C,kBAAkB,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,WAAW,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;AAAA,IAClF,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACf,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,iBAAiB,EAAE,OAAO;AAAA,IACxB,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IACjC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,aAAa,UAAU,CAAC;AAAA,IACpE,iBAAiB,EAAE,OAAO,EAAE,QAAQ,GAAK;AAAA,IACzC,gBAAgB,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,IACtC,oBAAoB,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAC/C,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,UAAU,EAAE,OAAO;AAAA,IACjB,UAAU,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IAClC,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IACxC,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IAC3C,sBAAsB,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,IAC/C,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAC5C,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,MAAM,EAAE,KAAK,CAAC,WAAW,SAAS,CAAC,EAAE,QAAQ,SAAS;AAAA,EACtD,SAAS,EAAE,OAAO;AAAA,IAChB,SAAS,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,IAClC,YAAY,EAAE,OAAO;AAAA,MACnB,WAAW,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,MACjC,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,MACtC,mBAAmB,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,IAC3C,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,IACb,eAAe,EAAE,OAAO;AAAA,MACtB,mBAAmB,EAAE,OAAO,EAAE,QAAQ,IAAO;AAAA,MAC7C,mBAAmB,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,MACzC,eAAe,EAAE,OAAO,EAAE,QAAQ,IAAO;AAAA,MACzC,qBAAqB,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,IAChD,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,IACb,YAAY,EAAE,OAAO;AAAA,MACnB,qBAAqB,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,MAC3C,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,IACxC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACf,CAAC,EAAE,SAAS;AACd,CAAC;AA2DM,IAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,EACzB,YAAY,EAAE,OAAO,EAAE,SAAS;AAClC,CAAC;AAGM,IAAM,+BAA+B,EAAE,OAAO;AAAA,EACnD,UAAU,EAAE,OAAO;AAAA,EACnB,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAC/B,YAAY,EAAE,OAAO;AAAA,EACrB,YAAY,EAAE,OAAO;AAAA,EACrB,SAAS,EAAE,QAAQ;AAAA,EACnB,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,UAAU,mBAAmB,SAAS;AACxC,CAAC;AAoCM,IAAM,mBAAmB,EAAE,KAAK,CAAC,QAAQ,aAAa,UAAU,CAAC;AAGjE,IAAM,mBAAmB,EAAE,KAAK;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,qBAAqB,EAAE,KAAK,CAAC,OAAO,UAAU,QAAQ,UAAU,CAAC;AAGvE,IAAM,oBAAoB,EAAE,KAAK;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,qBAAqB,EAAE,KAAK;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAIM,IAAM,eAAe,EAAE,OAAO;AAAA,EACnC,UAAU,EAAE,OAAO;AAAA,EACnB,YAAY;AAAA,EACZ,cAAc,EAAE,OAAO;AAAA,EACvB,OAAO,EAAE,OAAO;AAAA,EAChB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,aAAa,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EACjC,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,WAAW,EAAE,KAAK;AAAA,EAClB,WAAW,EAAE,KAAK;AACpB,CAAC;AAIM,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,QAAQ;AAAA,EACR,UAAU,mBAAmB,SAAS;AAAA,EACtC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACvC,oBAAoB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACjD,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,SAAS,EAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;AAIM,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,YAAY;AAAA,EACZ,cAAc,EAAE,OAAO;AAAA,EACvB,UAAU,EAAE,OAAO;AAAA,EACnB,WAAW,EAAE,QAAQ;AACvB,CAAC;AAOM,IAAM,iBAAiB,EAAE,KAAK,CAAC,SAAS,UAAU,OAAO,CAAC;AAG1D,IAAM,qBAAqB,EAAE,KAAK;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,aAAa,EAAE,OAAO;AAAA,EACjC,QAAQ,EAAE,OAAO;AAAA,EACjB,SAAS;AAAA,EACT,OAAO,EAAE,OAAO;AAAA,EAChB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO,EAAE,OAAO;AAAA,EAChB,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACzC,WAAW,EAAE,KAAK;AACpB,CAAC;AAOM,IAAM,sBAAsB,EAAE,KAAK;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,oBAAoB,EAAE,KAAK,CAAC,WAAW,SAAS,CAAC;AAGvD,IAAM,oBAAoB,EAAE,KAAK,CAAC,QAAQ,aAAa,UAAU,CAAC;AAGlE,IAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,MAAM;AAAA,EACN,UAAU,EAAE,OAAO;AAAA,EACnB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC9C,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAC3C,CAAC;AAIM,IAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,QAAQ,EAAE,OAAO;AAAA,EACjB,OAAO,EAAE,OAAO;AAAA,EAChB,cAAc,EAAE,OAAO;AAAA,EACvB,eAAe;AAAA,EACf,UAAU,mBAAmB,SAAS;AAAA,EACtC,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,SAAS,EAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;AAGM,IAAM,iCAAiC,EAAE,OAAO;AAAA,EACrD,QAAQ,EAAE,OAAO;AAAA,EACjB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,QAAQ,EAAE,OAAO,EAAE,SAAS;AAC9B,CAAC;AAGM,IAAM,+BAA+B,EAAE,OAAO;AAAA,EACnD,QAAQ,EAAE,OAAO;AAAA,EACjB,MAAM;AAAA,EACN,UAAU,EAAE,MAAM,gBAAgB;AAAA,EAClC,eAAe,EAAE,OAAO,EAAE,SAAS;AACrC,CAAC;AAOM,IAAM,kBAAkB,EAAE,KAAK;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,cAAc,EAAE,OAAO;AAAA,EAClC,SAAS,EAAE,OAAO;AAAA,EAClB,WAAW,EAAE,KAAK;AAAA,EAClB,WAAW;AAAA,EACX,OAAO,EAAE,OAAO;AAAA,EAChB,aAAa,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EACjC,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,cAAc,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EAC7C,cAAc,EAAE,OAAO;AACzB,CAAC;AAOM,IAAM,0BAA0B,EAAE,OAAO;AAAA,EAC9C,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EAC3C,OAAO,EAAE,OAAO;AAClB,CAAC;AAGM,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EAC3C,OAAO,EAAE,OAAO;AAAA,EAChB,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACxC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACnC,WAAW,EAAE,OAAO;AAAA,EACpB,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACnC,aAAa,EAAE,KAAK,CAAC,SAAS,cAAc,OAAO,CAAC;AACtD,CAAC;AAGM,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EAC3C,OAAO,EAAE,OAAO;AAAA,EAChB,eAAe,EAAE,KAAK,CAAC,aAAa,mBAAmB,aAAa,eAAe,eAAe,CAAC;AACrG,CAAC;AAGM,IAAM,4BAA4B,EAAE,mBAAmB,WAAW;AAAA,EACvE,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,GAAG,UAAU,sBAAsB,CAAC;AAAA,EACtE,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,GAAG,UAAU,qBAAqB,CAAC;AACxE,CAAC;AAOM,IAAM,qBAAqB,EAAE,KAAK,CAAC,WAAW,cAAc,QAAQ,QAAQ,CAAC;AAG7E,IAAM,uBAAuB,EAAE,KAAK,CAAC,SAAS,cAAc,OAAO,CAAC;AAGpE,IAAM,kBAAkB,EAAE,OAAO;AAAA,EACtC,OAAO,EAAE,OAAO;AAAA,EAChB,UAAU;AAAA,EACV,QAAQ,EAAE,OAAO;AAAA,EACjB,kBAAkB,EAAE,OAAO;AAAA,EAC3B,QAAQ;AAAA,EACR,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACzC,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,WAAW,EAAE,KAAK;AAAA,EAClB,WAAW,EAAE,KAAK;AACpB,CAAC;AAIM,IAAM,2BAA4E;AAAA,EACvF,EAAE,MAAM,WAAW,IAAI,aAAa;AAAA,EACpC,EAAE,MAAM,cAAc,IAAI,OAAO;AAAA,EACjC,EAAE,MAAM,cAAc,IAAI,SAAS;AAAA,EACnC,EAAE,MAAM,UAAU,IAAI,UAAU;AAClC;AAMO,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,SAAS,EAAE,OAAO;AAAA,EAClB,WAAW,EAAE,KAAK;AAAA,EAClB,YAAY,EAAE,KAAK,EAAE,SAAS;AAAA,EAC9B,gBAAgB,EAAE,OAAO;AAAA,EACzB,qBAAqB,EAAE,OAAO;AAAA,EAC9B,eAAe,EAAE,OAAO;AAAA,EACxB,kBAAkB,EAAE,OAAO;AAAA,EAC3B,cAAc,EAAE,OAAO;AAAA,EACvB,eAAe,EAAE,OAAO;AAAA,EACxB,QAAQ,EAAE,KAAK,CAAC,WAAW,WAAW,QAAQ,CAAC;AAAA,EAC/C,OAAO,EAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAOM,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,IAAI,EAAE,OAAO;AAAA,EACb,IAAI,EAAE,KAAK;AAAA,EACX,OAAO,EAAE,OAAO;AAAA,EAChB,WAAW,EAAE,OAAO;AAAA,EACpB,SAAS,EAAE,QAAQ;AAAA,EACnB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,WAAW,EAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAQM,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,IAAI,EAAE,OAAO;AAAA,EACb,SAAS,EAAE,OAAO,EAAE,IAAI,GAAG;AAAA,EAC3B,OAAO,EAAE,OAAO;AAAA,EAChB,MAAM,EAAE,KAAK,CAAC,eAAe,kBAAkB,mBAAmB,kBAAkB,CAAC;AAAA,EACrF,WAAW,EAAE,KAAK;AAAA,EAClB,WAAW,EAAE,OAAO;AACtB,CAAC;AAIM,IAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,IAAI,EAAE,OAAO;AAAA,EACb,WAAW,EAAE,KAAK;AAAA,EAClB,MAAM,EAAE,KAAK,CAAC,eAAe,kBAAkB,mBAAmB,kBAAkB,CAAC;AAAA,EACrF,SAAS,EAAE,OAAO,EAAE,IAAI,GAAG;AAAA,EAC3B,UAAU,EAAE,QAAQ;AACtB,CAAC;AAIM,IAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,IAAI,EAAE,OAAO;AAAA,EACb,SAAS,EAAE,OAAO;AAAA,EAClB,MAAM,EAAE,KAAK,CAAC,eAAe,kBAAkB,mBAAmB,kBAAkB,CAAC;AAAA,EACrF,WAAW,EAAE,KAAK;AAAA,EAClB,WAAW,EAAE,OAAO;AAAA,EACpB,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,UAAU,EAAE,OAAO;AAAA,IACjB,YAAY,EAAE,OAAO;AAAA,IACrB,SAAS,EAAE,QAAQ;AAAA,IACnB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IACpC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACtC,CAAC;AACH,CAAC;AAIM,IAAM,gCAAgC,EAAE,OAAO;AAAA,EACpD,OAAO,EAAE,MAAM,qBAAqB;AAAA,EACpC,UAAU,EAAE,MAAM,kBAAkB,EAAE,SAAS;AAAA,EAC/C,SAAS,EAAE,MAAM,gBAAgB,EAAE,SAAS;AAAA,EAC5C,MAAM,EAAE,OAAO;AAAA,IACb,cAAc,EAAE,OAAO;AAAA,IACvB,eAAe,EAAE,OAAO;AAAA,IACxB,iBAAiB,EAAE,OAAO;AAAA,IAC1B,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,CAAC;AACH,CAAC;AAIM,IAAM,oCAAoC,EAAE,OAAO;AAAA,EACxD,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EACjC,QAAQ,EAAE,OAAO;AAAA,IACf,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,IAC3B,UAAU,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,EAClC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,YAAY,EAAE,OAAO;AAAA,IACnB,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IACjC,yBAAyB,EAAE,OAAO,EAAE,QAAQ,IAAI;AAAA,IAChD,mBAAmB,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,IACzC,oBAAoB,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAC1C,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,aAAa,EAAE,OAAO;AAAA,IACpB,gBAAgB,EAAE,OAAO,EAAE,QAAQ,GAAI;AAAA,IACvC,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,IACpC,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,IACpC,eAAe,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,EACvC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACf,CAAC;AAOM,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC;AAAA,EAC/B,SAAS,EAAE,OAAO;AAAA,EAClB,WAAW,EAAE,KAAK;AACpB,CAAC;AAGM,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,SAAS,EAAE,OAAO;AAAA,EAClB,YAAY,EAAE,OAAO;AAAA,EACrB,WAAW,EAAE,OAAO;AAAA,EACpB,QAAQ,EAAE,KAAK;AAAA,EACf,SAAS,EAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;AAkBM,IAAM,mBAAmB,EAAE,KAAK,CAAC,WAAW,SAAS,CAAC;AAGtD,IAAM,0BAA0B,EAAE,OAAO;AAAA,EAC9C,SAAS,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAElC,YAAY,EAAE,OAAO;AAAA,IACnB,WAAW,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,IACjC,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,IACtC,mBAAmB,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,EAC3C,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAEb,eAAe,EAAE,OAAO;AAAA,IACtB,mBAAmB,EAAE,OAAO,EAAE,QAAQ,IAAO;AAAA;AAAA,IAC7C,mBAAmB,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,IACzC,eAAe,EAAE,OAAO,EAAE,QAAQ,IAAO;AAAA;AAAA,IACzC,qBAAqB,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAChD,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAEb,YAAY,EAAE,OAAO;AAAA,IACnB,qBAAqB,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,IAC3C,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EACxC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACf,CAAC;AAIM,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,IAAI,EAAE,OAAO;AAAA,EACb,SAAS,EAAE,OAAO;AAAA,EAClB,SAAS,EAAE,KAAK;AAAA,EAChB,gBAAgB,EAAE,OAAO;AAAA,EACzB,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACrC,WAAW,EAAE,KAAK;AACpB,CAAC;AAWM,IAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,UAAU,EAAE,OAAO;AAAA,EACnB,SAAS,EAAE,OAAO;AAAA,EAClB,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EAC1B,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EAChC,YAAY,EAAE,OAAO;AAAA,EACrB,WAAW,EAAE,KAAK;AAAA,EAClB,YAAY,EAAE,KAAK,EAAE,SAAS;AAAA,EAC9B,aAAa,EAAE,OAAO,EAAE,QAAQ,CAAC;AACnC,CAAC;AA2BM,IAAM,uBAAuB,EAAE,KAAK,CAAC,YAAY,eAAe,OAAO,CAAC;AAUxE,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,OAAO,EAAE,OAAO;AAAA,EAChB,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,iBAAiB,EAAE,OAAO;AAAA,EAC1B,gBAAgB;AAAA,EAChB,WAAW,EAAE,KAAK;AACpB,CAAC;;;ACzzBD,SAAS,kBAAkB;AAE3B,IAAM,iBAAiB;AAahB,SAAS,iBACd,OACA,SACQ;AAER,MAAI,aAAa,MAAM,UAAU,MAAM;AAGvC,eAAa,WAAW,YAAY;AAGpC,eAAa,WAAW,QAAQ,qBAAqB,EAAE;AAGvD,eAAa,WAAW,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAGlD,MAAI,MAAM;AACV,MAAI,SAAS,SAAS;AACpB,UAAM,GAAG,QAAQ,OAAO,KAAK,GAAG;AAAA,EAClC;AAGA,MAAI,IAAI,SAAS,gBAAgB;AAC/B,UAAM,aAAa,WAAW,KAAK,EAAE,OAAO,GAAG,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,CAAC;AACzE,UAAM,IAAI,MAAM,GAAG,iBAAiB,CAAC,IAAI,MAAM;AAAA,EACjD;AAEA,SAAO;AACT;AAKO,SAAS,mBAAmB,GAAW,GAAoB;AAChE,SAAO,iBAAiB,CAAC,MAAM,iBAAiB,CAAC;AACnD;AAMO,SAAS,cAAc,SAAiB,WAA2B;AACxE,QAAM,cAAc,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AACrE,SAAO,GAAG,SAAS,IAAI,WAAW;AACpC;AAKO,SAAS,YAAY,SAAyB;AACnD,SAAO,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAC1D;AAWA,SAAS,gBAAgB,MAAsB;AAC7C,SAAO,KACJ,UAAU,MAAM,EAChB,YAAY,EACZ,QAAQ,qBAAqB,EAAE,EAC/B,QAAQ,QAAQ,GAAG,EACnB,KAAK;AACV;AAMO,SAAS,uBACd,YACA,YACA,SACQ;AACR,QAAM,UAAU,SAAS,WAAW;AAEpC,UAAQ,YAAY;AAAA,IAClB,KAAK;AACH,aAAO,QAAQ,OAAO,IAAI,gBAAgB,UAAU,CAAC;AAAA,IACvD,KAAK;AACH,aAAO,QAAQ,OAAO,IAAI,gBAAgB,UAAU,CAAC;AAAA,IACvD,KAAK;AACH,aAAO,gBAAgB,UAAU;AAAA,EACrC;AACF;AASO,SAAS,gBAAgB,YAA4B;AAE1D,MAAI,eAAe,KAAK,UAAU,GAAG;AACnC,UAAMA,QAAO,WAAW,MAAM,EAAE,OAAO,UAAU,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAC5E,WAAO,WAAWA,KAAI;AAAA,EACxB;AAGA,QAAM,YAAY,WAAW,MAAM,gBAAgB;AACnD,MAAI,WAAW;AACb,WAAO,YAAY,UAAU,CAAC,EAAE,YAAY,CAAC;AAAA,EAC/C;AAGA,QAAM,UAAU,WAAW,MAAM,yBAAyB;AAC1D,MAAI,SAAS;AACX,WAAO,gBAAgB,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC;AAAA,EACjD;AAGA,QAAM,OAAO,WAAW,MAAM,EAAE,OAAO,UAAU,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAC5E,SAAO,eAAe,IAAI;AAC5B;AAKO,SAAS,uBACd,WACA,QACA,WACA,mBACQ;AACR,QAAM,QAAQ,CAAC,WAAW,QAAQ,SAAS;AAC3C,MAAI,mBAAmB;AACrB,UAAM,KAAK,iBAAiB;AAAA,EAC9B;AACA,QAAM,WAAW,MAAM,KAAK,GAAG;AAC/B,SAAO,WAAW,QAAQ,EAAE,OAAO,QAAQ,EAAE,OAAO,KAAK;AAC3D;AAKO,SAAS,wBAAwB,cAI/B;AACP,QAAM,YAAY,aAAa,MAAM,qBAAqB;AAC1D,MAAI,WAAW;AACb,WAAO,EAAE,YAAY,QAAQ,SAAS,UAAU,CAAC,GAAG,YAAY,UAAU,CAAC,EAAE;AAAA,EAC/E;AAEA,QAAM,YAAY,aAAa,MAAM,qBAAqB;AAC1D,MAAI,WAAW;AACb,WAAO,EAAE,YAAY,aAAa,SAAS,UAAU,CAAC,GAAG,YAAY,UAAU,CAAC,EAAE;AAAA,EACpF;AAEA,QAAM,WAAW,aAAa,MAAM,oBAAoB;AACxD,MAAI,UAAU;AACZ,WAAO,EAAE,YAAY,YAAY,YAAY,SAAS,CAAC,EAAE;AAAA,EAC3D;AAEA,SAAO;AACT;;;ACpLA,SAAS,kBAAkB;;;ACA3B,OAAO,YAAY;AAQnB,SAAS,eAAkB,KAAW;AACpC,MAAI,QAAQ,QAAQ,QAAQ;AAAW,WAAO;AAC9C,MAAI,OAAO,QAAQ;AAAU,WAAO,OAAO,GAAG;AAC9C,MAAI,eAAe;AAAM,WAAO;AAChC,MAAI,MAAM,QAAQ,GAAG;AAAG,WAAO,IAAI,IAAI,cAAc;AACrD,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAM,SAAkC,CAAC;AACzC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAA8B,GAAG;AACzE,aAAO,GAAG,IAAI,eAAe,KAAK;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAMO,SAAS,OAAO,OAAsB;AAC3C,MAAI,iBAAiB;AAAM,WAAO;AAClC,MAAI,OAAO,UAAU;AAAU,WAAO,IAAI,KAAK,KAAK;AACpD,MAAI,OAAO,UAAU;AAAU,WAAO,IAAI,KAAK,KAAK;AACpD,SAAO,IAAI,KAAK,OAAO,KAAK,CAAC;AAC/B;AAKO,SAAS,eAAe,MAAwB;AACrD,SAAO,IAAI,OAAO,SAAS,IAAI;AACjC;AAKO,SAAS,MAAM,IAAc,KAAa,SAAoB,CAAC,GAAkB;AACtF,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,OAAO,WAAW,GAAG;AACvB,SAAG,IAAI,KAAK,CAAC,QAAsB;AACjC,YAAI;AAAK,iBAAO,GAAG;AAAA;AACd,kBAAQ;AAAA,MACf,CAAC;AAAA,IACH,OAAO;AACL,SAAG,IAAI,KAAK,GAAG,QAAQ,CAAC,QAAsB;AAC5C,YAAI;AAAK,iBAAO,GAAG;AAAA;AACd,kBAAQ;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAMO,SAAS,MACd,IACA,KACA,SAAoB,CAAC,GACP;AACd,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,OAAO,WAAW,GAAG;AACvB,SAAG,IAAI,KAAK,CAAC,KAAmB,SAAc;AAC5C,YAAI;AAAK,iBAAO,GAAG;AAAA;AACd,kBAAQ,eAAe,QAAQ,CAAC,CAAC,CAAC;AAAA,MACzC,CAAC;AAAA,IACH,OAAO;AACL,SAAG,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAmB,SAAc;AACvD,YAAI;AAAK,iBAAO,GAAG;AAAA;AACd,kBAAQ,eAAe,QAAQ,CAAC,CAAC,CAAC;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAKO,SAAS,QAAQ,IAA6B;AACnD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,OAAG,MAAM,CAAC,QAAsB;AAC9B,UAAI;AAAK,eAAO,GAAG;AAAA;AACd,gBAAQ;AAAA,IACf,CAAC;AAAA,EACH,CAAC;AACH;;;ADnFO,IAAM,aAAN,MAAiB;AAAA,EAItB,YAAoB,QAAgB;AAAhB;AAClB,SAAK,KAAK,eAAe,MAAM;AAAA,EACjC;AAAA,EALQ;AAAA,EACA,cAAc;AAAA;AAAA;AAAA;AAAA,EAStB,MAAM,aAA4B;AAChC,QAAI,KAAK;AAAa;AAGtB,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAWpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAMpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KASpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAWpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAWpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAOpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAMpB;AAOD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAepB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAcpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KASpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAWpB;AAMD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAapB;AAMD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAcpB;AAED,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAUpB;AAOD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KASpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAWpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KASpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAMpB;AAOD,UAAM,MAAM,KAAK,IAAI,oEAAoE;AACzF,UAAM,MAAM,KAAK,IAAI,gEAAgE;AACrF,UAAM,MAAM,KAAK,IAAI,4EAA4E;AAGjG,UAAM,MAAM,KAAK,IAAI,0FAA0F;AAC/G,UAAM,MAAM,KAAK,IAAI,oEAAoE;AAGzF,UAAM,MAAM,KAAK,IAAI,qEAAqE;AAC1F,UAAM,MAAM,KAAK,IAAI,qEAAqE;AAC1F,UAAM,MAAM,KAAK,IAAI,6DAA6D;AAGlF,UAAM,MAAM,KAAK,IAAI,uEAAuE;AAG5F,UAAM,MAAM,KAAK,IAAI,+EAA+E;AACpG,UAAM,MAAM,KAAK,IAAI,2FAA2F;AAChH,UAAM,MAAM,KAAK,IAAI,kGAAkG;AACvH,UAAM,MAAM,KAAK,IAAI,iFAAiF;AAEtG,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAO,OAAgD;AAC3D,UAAM,KAAK,WAAW;AAEtB,UAAM,eAAe,iBAAiB,MAAM,OAAO;AACnD,UAAM,YAAY,cAAc,MAAM,SAAS,MAAM,SAAS;AAG9D,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,SAAS;AAAA,IACZ;AAEA,QAAI,SAAS,SAAS,GAAG;AACvB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,SAAS,CAAC,EAAE;AAAA,QACrB,aAAa;AAAA,MACf;AAAA,IACF;AAEA,UAAM,KAAK,WAAW;AACtB,UAAM,YAAY,MAAM,UAAU,YAAY;AAE9C,QAAI;AACF,YAAM;AAAA,QACJ,KAAK;AAAA,QACL;AAAA;AAAA,QAEA;AAAA,UACE;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,UACN;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,KAAK,UAAU,MAAM,YAAY,CAAC,CAAC;AAAA,QACrC;AAAA,MACF;AAEA,YAAM;AAAA,QACJ,KAAK;AAAA,QACL;AAAA,QACA,CAAC,WAAW,EAAE;AAAA,MAChB;AAGA,YAAM;AAAA,QACJ,KAAK;AAAA,QACL;AAAA,QACA,CAAC,EAAE;AAAA,MACL;AAEA,aAAO,EAAE,SAAS,MAAM,SAAS,IAAI,aAAa,MAAM;AAAA,IAC1D,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,WAA2C;AAChE,UAAM,KAAK,WAAW;AAEtB,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,SAAS;AAAA,IACZ;AAEA,WAAO,KAAK,IAAI,KAAK,UAAU;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,QAAgB,KAA6B;AACjE,UAAM,KAAK,WAAW;AAEtB,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,KAAK;AAAA,IACR;AAEA,WAAO,KAAK,IAAI,KAAK,UAAU;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,IAAyC;AACtD,UAAM,KAAK,WAAW;AAEtB,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,EAAE;AAAA,IACL;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAC9B,WAAO,KAAK,WAAW,KAAK,CAAC,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,SAA2D;AAC7E,UAAM,KAAK,WAAW;AAEtB,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,QAAQ,EAAE;AAAA,IACb;AAEA,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM;AAAA,QACJ,KAAK;AAAA,QACL;AAAA;AAAA,QAEA;AAAA,UACE,QAAQ;AAAA,WACP,QAAQ,aAAa,oBAAI,KAAK,GAAG,YAAY;AAAA,UAC9C,QAAQ,eAAe;AAAA,UACvB,KAAK,UAAU,QAAQ,QAAQ,CAAC,CAAC;AAAA,QACnC;AAAA,MACF;AAAA,IACF,OAAO;AACL,YAAM,UAAoB,CAAC;AAC3B,YAAM,SAAoB,CAAC;AAE3B,UAAI,QAAQ,SAAS;AACnB,gBAAQ,KAAK,cAAc;AAC3B,eAAO,KAAK,QAAQ,QAAQ,YAAY,CAAC;AAAA,MAC3C;AACA,UAAI,QAAQ,SAAS;AACnB,gBAAQ,KAAK,aAAa;AAC1B,eAAO,KAAK,QAAQ,OAAO;AAAA,MAC7B;AACA,UAAI,QAAQ,MAAM;AAChB,gBAAQ,KAAK,UAAU;AACvB,eAAO,KAAK,KAAK,UAAU,QAAQ,IAAI,CAAC;AAAA,MAC1C;AAEA,UAAI,QAAQ,SAAS,GAAG;AACtB,eAAO,KAAK,QAAQ,EAAE;AACtB,cAAM;AAAA,UACJ,KAAK;AAAA,UACL,uBAAuB,QAAQ,KAAK,IAAI,CAAC;AAAA,UACzC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,IAAqC;AACpD,UAAM,KAAK,WAAW;AAEtB,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,EAAE;AAAA,IACL;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAE9B,UAAM,MAAM,KAAK,CAAC;AAClB,WAAO;AAAA,MACL,IAAI,IAAI;AAAA,MACR,WAAW,OAAO,IAAI,UAAU;AAAA,MAChC,SAAS,IAAI,WAAW,OAAO,IAAI,QAAQ,IAAI;AAAA,MAC/C,aAAa,IAAI;AAAA,MACjB,SAAS,IAAI;AAAA,MACb,MAAM,IAAI,OAAO,KAAK,MAAM,IAAI,IAAc,IAAI;AAAA,IACpD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,SAAiB,SAAkC;AAC3E,UAAM,KAAK,WAAW;AAEtB,UAAM,KAAK,WAAW;AACtB,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA,MAEA,CAAC,IAAI,SAAS,OAAO;AAAA,IACvB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAsB,QAAgB,IAA2B;AACrE,UAAM,KAAK,WAAW;AAGtB,UAAM,UAAU,MAAM;AAAA,MACpB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA,CAAC,KAAK;AAAA,IACR;AAEA,QAAI,QAAQ,WAAW;AAAG,aAAO,CAAC;AAGlC,UAAM,MAAM,QAAQ,IAAI,OAAK,EAAE,EAAY;AAC3C,UAAM,eAAe,IAAI,IAAI,MAAM,GAAG,EAAE,KAAK,GAAG;AAChD,UAAM;AAAA,MACJ,KAAK;AAAA,MACL,kEAAkE,YAAY;AAAA,MAC9E;AAAA,IACF;AAEA,WAAO,QAAQ,IAAI,UAAQ;AAAA,MACzB,IAAI,IAAI;AAAA,MACR,SAAS,IAAI;AAAA,MACb,SAAS,IAAI;AAAA,MACb,QAAQ;AAAA,MACR,YAAY,IAAI;AAAA,MAChB,WAAW,OAAO,IAAI,UAAU;AAAA,MAChC,cAAc,IAAI;AAAA,IACpB,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,KAA8B;AACtD,QAAI,IAAI,WAAW;AAAG;AAEtB,UAAM,eAAe,IAAI,IAAI,MAAM,GAAG,EAAE,KAAK,GAAG;AAChD,UAAM;AAAA,MACJ,KAAK;AAAA,MACL,6CAA6C,YAAY;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,KAAe,OAA8B;AACjE,QAAI,IAAI,WAAW;AAAG;AAEtB,UAAM,eAAe,IAAI,IAAI,MAAM,GAAG,EAAE,KAAK,GAAG;AAChD,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,sBAIgB,YAAY;AAAA,MAC5B,CAAC,OAAO,GAAG,GAAG;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,SAAiB,OAA8B;AACrE,UAAM,KAAK,WAAW;AAEtB,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA,MACA,CAAC,OAAO,OAAO;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAkE;AACtE,UAAM,KAAK,WAAW;AAEtB,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,cAAwB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,KAAsC;AAC3D,UAAM,KAAK,WAAW;AAEtB,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,GAAG;AAAA,IACN;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAC9B,WAAO,KAAK,MAAM,KAAK,CAAC,EAAE,KAAK;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,KAAa,OAA+B;AACjE,UAAM,KAAK,WAAW;AAEtB,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA,MAEA,CAAC,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAqC;AACzC,UAAM,KAAK,WAAW;AAEtB,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,IACF;AAEA,WAAO,KAAK,IAAI,UAAQ;AAAA,MACtB,IAAI,IAAI;AAAA,MACR,WAAW,OAAO,IAAI,UAAU;AAAA,MAChC,SAAS,IAAI,WAAW,OAAO,IAAI,QAAQ,IAAI;AAAA,MAC/C,aAAa,IAAI;AAAA,MACjB,SAAS,IAAI;AAAA,MACb,MAAM,IAAI,OAAO,KAAK,MAAM,IAAI,IAAc,IAAI;AAAA,IACpD,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,UAAM,QAAQ,KAAK,EAAE;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,KAA2C;AAC5D,WAAO;AAAA,MACL,IAAI,IAAI;AAAA,MACR,WAAW,IAAI;AAAA,MACf,WAAW,IAAI;AAAA,MACf,WAAW,OAAO,IAAI,SAAS;AAAA,MAC/B,SAAS,IAAI;AAAA,MACb,cAAc,IAAI;AAAA,MAClB,WAAW,IAAI;AAAA,MACf,UAAU,IAAI,WAAW,KAAK,MAAM,IAAI,QAAkB,IAAI;AAAA,IAChE;AAAA,EACF;AACF;;;AEnrBA,SAAS,cAAAC,mBAAkB;AA2BpB,IAAM,aAAN,MAAiB;AAAA,EACtB,YAAoB,IAAc;AAAd;AAAA,EAAe;AAAA;AAAA;AAAA;AAAA,EAKnC,MAAM,OAAO,OAA2C;AACtD,UAAM,WAAWC,YAAW;AAC5B,UAAM,eAAe,uBAAuB,MAAM,YAAY,MAAM,OAAO;AAAA,MACzE,SAAS,MAAM;AAAA,IACjB,CAAC;AAED,UAAM,YAAY,MAAM,MAAM,YAAY,EAAE,KAAK;AACjD,UAAM,aAAa,GAAG,MAAM,KAAK,IAAI,KAAK,UAAU,MAAM,WAAW,CAAC;AAEtE,UAAM,MAAM,oBAAI,KAAK;AAErB,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA;AAAA,QACE;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA,MAAM;AAAA,QACN,MAAM,SAAS;AAAA,QACf,MAAM,UAAU;AAAA,QAChB,KAAK,UAAU,MAAM,WAAW;AAAA,QAChC;AAAA,QACA;AAAA,QACA,IAAI,YAAY;AAAA,QAChB,IAAI,YAAY;AAAA,MAClB;AAAA,IACF;AAGA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,MAAM,YAAY,cAAc,QAAQ;AAAA,IAC3C;AAEA,WAAO;AAAA,MACL;AAAA,MACA,YAAY,MAAM;AAAA,MAClB;AAAA,MACA,OAAO,MAAM;AAAA,MACb,OAAO,MAAM,SAAS;AAAA,MACtB,QAAQ,MAAM,UAAU;AAAA,MACxB,aAAa,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,WAAW;AAAA,IACb;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,UAA0C;AACvD,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,QAAQ;AAAA,IACX;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAC9B,WAAO,KAAK,YAAY,KAAK,CAAC,CAAC;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBACJ,YACA,cACwB;AACxB,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA,MAEA,CAAC,YAAY,YAAY;AAAA,IAC3B;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAC9B,WAAO,KAAK,YAAY,KAAK,CAAC,CAAC;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,OAAyE;AAC1F,UAAM,eAAe,uBAAuB,MAAM,YAAY,MAAM,OAAO;AAAA,MACzE,SAAS,MAAM;AAAA,IACjB,CAAC;AAED,UAAM,WAAW,MAAM,KAAK,mBAAmB,MAAM,YAAY,YAAY;AAC7E,QAAI,UAAU;AACZ,aAAO,EAAE,QAAQ,UAAU,SAAS,MAAM;AAAA,IAC5C;AAEA,UAAM,SAAS,MAAM,KAAK,OAAO,KAAK;AACtC,WAAO,EAAE,QAAQ,SAAS,KAAK;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,UAAkB,OAAkD;AAC/E,UAAM,WAAW,MAAM,KAAK,SAAS,QAAQ;AAC7C,QAAI,CAAC;AAAU,aAAO;AAEtB,UAAM,UAAoB,CAAC;AAC3B,UAAM,SAAoB,CAAC;AAE3B,QAAI,MAAM,gBAAgB,QAAW;AACnC,cAAQ,KAAK,kBAAkB;AAC/B,aAAO,KAAK,KAAK,UAAU,MAAM,WAAW,CAAC;AAAA,IAC/C;AACA,QAAI,MAAM,UAAU,QAAW;AAC7B,cAAQ,KAAK,WAAW;AACxB,aAAO,KAAK,MAAM,KAAK;AAAA,IACzB;AACA,QAAI,MAAM,WAAW,QAAW;AAC9B,cAAQ,KAAK,YAAY;AACzB,aAAO,KAAK,MAAM,MAAM;AAAA,IAC1B;AACA,QAAI,MAAM,eAAe,QAAW;AAClC,cAAQ,KAAK,iBAAiB;AAC9B,aAAO,KAAK,MAAM,UAAU;AAAA,IAC9B;AAEA,YAAQ,KAAK,gBAAgB;AAC7B,WAAO,MAAK,oBAAI,KAAK,GAAE,YAAY,CAAC;AAEpC,WAAO,KAAK,QAAQ;AAEpB,UAAM;AAAA,MACJ,KAAK;AAAA,MACL,uBAAuB,QAAQ,KAAK,IAAI,CAAC;AAAA,MACzC;AAAA,IACF;AAEA,WAAO,KAAK,SAAS,QAAQ;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACJ,YACA,SACmB;AACnB,QAAI,QAAQ;AACZ,UAAM,SAAoB,CAAC,UAAU;AAErC,QAAI,SAAS,QAAQ;AACnB,eAAS;AACT,aAAO,KAAK,QAAQ,MAAM;AAAA,IAC5B;AAEA,aAAS;AAET,QAAI,SAAS,OAAO;AAClB,eAAS;AACT,aAAO,KAAK,QAAQ,KAAK;AAAA,IAC3B;AACA,QAAI,SAAS,QAAQ;AACnB,eAAS;AACT,aAAO,KAAK,QAAQ,MAAM;AAAA,IAC5B;AAEA,UAAM,OAAO,MAAM,MAA+B,KAAK,IAAI,OAAO,MAAM;AACxE,WAAO,KAAK,IAAI,SAAO,KAAK,YAAY,GAAG,CAAC;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OACJ,OACA,SACmB;AACnB,UAAM,gBAAgB,IAAI,MAAM,YAAY,CAAC;AAE7C,QAAI,MAAM;AACV,UAAM,SAAoB,CAAC,eAAe,aAAa;AAEvD,QAAI,SAAS,YAAY;AACvB,aAAO;AACP,aAAO,KAAK,QAAQ,UAAU;AAAA,IAChC;AAEA,WAAO;AAEP,QAAI,SAAS,OAAO;AAClB,aAAO;AACP,aAAO,KAAK,QAAQ,KAAK;AAAA,IAC3B;AAEA,UAAM,OAAO,MAAM,MAA+B,KAAK,IAAI,KAAK,MAAM;AACtE,WAAO,KAAK,IAAI,SAAO,KAAK,YAAY,GAAG,CAAC;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,QAAmC;AACxD,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA;AAAA,MAKA,CAAC,MAAM;AAAA,IACT;AAEA,WAAO,KAAK,IAAI,SAAO,KAAK,YAAY,GAAG,CAAC;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,8BAGF;AACF,UAAM,QAAQ,MAAM,KAAK,iBAAiB,SAAS;AAEnD,UAAM,UAGD,CAAC;AAEN,eAAW,QAAQ,OAAO;AACxB,YAAM,eAAe,MAAM;AAAA,QACzB,KAAK;AAAA,QACL;AAAA;AAAA;AAAA;AAAA,QAIA,CAAC,KAAK,QAAQ;AAAA,MAChB;AAEA,cAAQ,KAAK;AAAA,QACX;AAAA,QACA,UAAU,aAAa,IAAI,UAAQ;AAAA,UACjC,UAAU,IAAI;AAAA,UACd,YAAY,IAAI;AAAA,UAChB,OAAO,IAAI;AAAA,QACb,EAAE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SACJ,YACA,cACA,UACe;AACf,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,YAAY,cAAc,QAAQ;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,YAAwB,cAA8C;AACtF,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,YAAY,YAAY;AAAA,IAC3B;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAC9B,WAAO,KAAK,YAAY,KAAK,CAAC,CAAC;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,KAAsC;AACxD,WAAO;AAAA,MACL,UAAU,IAAI;AAAA,MACd,YAAY,IAAI;AAAA,MAChB,cAAc,IAAI;AAAA,MAClB,OAAO,IAAI;AAAA,MACX,OAAO,IAAI;AAAA,MACX,QAAQ,IAAI;AAAA,MACZ,aAAa,OAAO,IAAI,iBAAiB,WACrC,KAAK,MAAM,IAAI,YAAY,IAC3B,IAAI;AAAA,MACR,WAAW,IAAI;AAAA,MACf,YAAY,IAAI;AAAA,MAChB,WAAW,OAAO,IAAI,UAAU;AAAA,MAChC,WAAW,OAAO,IAAI,UAAU;AAAA,IAClC;AAAA,EACF;AACF;;;ACxVA,SAAS,cAAAC,mBAAkB;AAYpB,IAAM,WAAN,MAAe;AAAA,EACpB,YAAoB,IAAc;AAAd;AAAA,EAAe;AAAA;AAAA;AAAA;AAAA,EAKnC,MAAM,OAAO,OAAuC;AAClD,UAAM,SAASA,YAAW;AAC1B,UAAM,MAAM,oBAAI,KAAK;AAErB,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA;AAAA,QACE;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,KAAK,UAAU,MAAM,YAAY,CAAC,CAAC;AAAA,QACnC,IAAI,YAAY;AAAA,MAClB;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,SAAS,MAAM;AAAA,MACf,OAAO,MAAM;AAAA,MACb,SAAS,MAAM;AAAA,MACf,SAAS,MAAM;AAAA,MACf,OAAO,MAAM;AAAA,MACb,UAAU,MAAM;AAAA,MAChB,WAAW;AAAA,IACb;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,OAAuC;AAElD,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAEA,QAAI,UAAU;AAEZ,YAAM;AAAA,QACJ,KAAK;AAAA,QACL;AAAA,QACA,CAAC,KAAK,UAAU,MAAM,YAAY,CAAC,CAAC,GAAG,SAAS,MAAM;AAAA,MACxD;AACA,aAAO,EAAE,GAAG,UAAU,UAAU,MAAM,SAAS;AAAA,IACjD;AAEA,WAAO,KAAK,OAAO,KAAK;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACJ,SACA,OACA,SACA,SACA,OACsB;AACtB,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,SAAS,OAAO,SAAS,SAAS,KAAK;AAAA,IAC1C;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAC9B,WAAO,KAAK,UAAU,KAAK,CAAC,CAAC;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UACJ,OACA,SACiB;AACjB,QAAI,QAAQ;AACZ,UAAM,SAAoB,CAAC,KAAK;AAEhC,QAAI,SAAS;AACX,eAAS;AACT,aAAO,KAAK,OAAO;AAAA,IACrB;AAEA,aAAS;AAET,UAAM,OAAO,MAAM,MAA+B,KAAK,IAAI,OAAO,MAAM;AACxE,WAAO,KAAK,IAAI,SAAO,KAAK,UAAU,GAAG,CAAC;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UACJ,OACA,SACiB;AACjB,QAAI,QAAQ;AACZ,UAAM,SAAoB,CAAC,KAAK;AAEhC,QAAI,SAAS;AACX,eAAS;AACT,aAAO,KAAK,OAAO;AAAA,IACrB;AAEA,aAAS;AAET,UAAM,OAAO,MAAM,MAA+B,KAAK,IAAI,OAAO,MAAM;AACxE,WAAO,KAAK,IAAI,SAAO,KAAK,UAAU,GAAG,CAAC;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,QAAiE;AAChF,UAAM,WAAW,MAAM,KAAK,UAAU,MAAM;AAC5C,UAAM,WAAW,MAAM,KAAK,UAAU,MAAM;AAC5C,WAAO,EAAE,UAAU,SAAS;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,QAAkC;AAC7C,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA,MACA,CAAC,MAAM;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,OAAe,SAAwC;AAC7E,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA,MACA,CAAC,OAAO,OAAO;AAAA,IACjB;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,OAAe,SAAwC;AAC7E,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA,MACA,CAAC,OAAO,OAAO;AAAA,IACjB;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aACJ,OACA,SACA,UACiB;AAEjB,UAAM,KAAK,kBAAkB,OAAO,OAAO;AAG3C,UAAM,UAAkB,CAAC;AACzB,eAAW,QAAQ,UAAU;AAC3B,YAAM,UAAU,MAAM,KAAK,OAAO;AAAA,QAChC,SAAS,KAAK;AAAA,QACd;AAAA,QACA;AAAA,QACA,SAAS,KAAK;AAAA,QACd,OAAO,KAAK;AAAA,QACZ,UAAU,KAAK;AAAA,MACjB,CAAC;AACD,cAAQ,KAAK,OAAO;AAAA,IACtB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,qBAAqB,QAIvB;AACF,UAAM,eAAe,MAAM,KAAK,UAAU,QAAQ,YAAY;AAC9D,UAAM,UAID,CAAC;AAEN,eAAW,QAAQ,cAAc;AAE/B,YAAM,aAAa,MAAM;AAAA,QACvB,KAAK;AAAA,QACL;AAAA;AAAA;AAAA,QAGA,CAAC,KAAK,KAAK;AAAA,MACb;AAEA,UAAI,WAAW,SAAS,GAAG;AACzB,gBAAQ,KAAK;AAAA,UACX,YAAY,KAAK;AAAA,UACjB,aAAa,WAAW,CAAC,EAAE;AAAA,UAC3B,YAAY;AAAA,QACd,CAAC;AAAA,MACH,OAAO;AACL,gBAAQ,KAAK;AAAA,UACX,YAAY,KAAK;AAAA,UACjB,aAAa,KAAK;AAAA,UAClB,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,SAIrB;AACF,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAgBA,CAAC,SAAS,OAAO;AAAA,IACnB;AAEA,WAAO,KAAK,IAAI,UAAQ;AAAA,MACtB,SAAS,IAAI;AAAA,MACb,aAAa,IAAI;AAAA,MACjB,cAAc,IAAI;AAAA,IACpB,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAqE;AACzE,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,IACF;AACA,WAAO,KAAK,IAAI,UAAQ;AAAA,MACtB,SAAS,IAAI;AAAA,MACb,OAAO,OAAO,IAAI,KAAK;AAAA,IACzB,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,KAAoC;AACpD,WAAO;AAAA,MACL,QAAQ,IAAI;AAAA,MACZ,SAAS,IAAI;AAAA,MACb,OAAO,IAAI;AAAA,MACX,SAAS,IAAI;AAAA,MACb,SAAS,IAAI;AAAA,MACb,OAAO,IAAI;AAAA,MACX,UAAU,OAAO,IAAI,cAAc,WAC/B,KAAK,MAAM,IAAI,SAAS,IACxB,IAAI;AAAA,MACR,WAAW,OAAO,IAAI,UAAU;AAAA,IAClC;AAAA,EACF;AACF;;;ACvUA,YAAY,aAAa;AAalB,IAAM,cAAN,MAAkB;AAAA,EAKvB,YAAoB,QAAgB;AAAhB;AAAA,EAAiB;AAAA,EAJ7B,KAAgC;AAAA,EAChC,QAA8B;AAAA,EACrB,YAAY;AAAA;AAAA;AAAA;AAAA,EAO7B,MAAM,aAA4B;AAChC,QAAI,KAAK;AAAI;AAEb,SAAK,KAAK,MAAc,gBAAQ,KAAK,MAAM;AAG3C,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,GAAG,WAAW;AACxC,UAAI,OAAO,SAAS,KAAK,SAAS,GAAG;AACnC,aAAK,QAAQ,MAAM,KAAK,GAAG,UAAU,KAAK,SAAS;AAAA,MACrD;AAAA,IACF,QAAQ;AAEN,WAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,QAAqC;AAChD,UAAM,KAAK,WAAW;AAEtB,QAAI,CAAC,KAAK,IAAI;AACZ,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC5C;AAEA,UAAM,OAAO;AAAA,MACX,IAAI,OAAO;AAAA,MACX,SAAS,OAAO;AAAA,MAChB,WAAW,OAAO;AAAA,MAClB,WAAW,OAAO;AAAA,MAClB,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO;AAAA,MACf,WAAW,OAAO;AAAA,MAClB,UAAU,KAAK,UAAU,OAAO,YAAY,CAAC,CAAC;AAAA,IAChD;AAEA,QAAI,CAAC,KAAK,OAAO;AAEf,WAAK,QAAQ,MAAM,KAAK,GAAG,YAAY,KAAK,WAAW,CAAC,IAAI,CAAC;AAAA,IAC/D,OAAO;AACL,YAAM,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,SAAwC;AACxD,QAAI,QAAQ,WAAW;AAAG;AAE1B,UAAM,KAAK,WAAW;AAEtB,QAAI,CAAC,KAAK,IAAI;AACZ,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC5C;AAEA,UAAM,OAAO,QAAQ,IAAI,aAAW;AAAA,MAClC,IAAI,OAAO;AAAA,MACX,SAAS,OAAO;AAAA,MAChB,WAAW,OAAO;AAAA,MAClB,WAAW,OAAO;AAAA,MAClB,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO;AAAA,MACf,WAAW,OAAO;AAAA,MAClB,UAAU,KAAK,UAAU,OAAO,YAAY,CAAC,CAAC;AAAA,IAChD,EAAE;AAEF,QAAI,CAAC,KAAK,OAAO;AACf,WAAK,QAAQ,MAAM,KAAK,GAAG,YAAY,KAAK,WAAW,IAAI;AAAA,IAC7D,OAAO;AACL,YAAM,KAAK,MAAM,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OACJ,aACA,UAII,CAAC,GACoB;AACzB,UAAM,KAAK,WAAW;AAEtB,QAAI,CAAC,KAAK,OAAO;AACf,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,EAAE,QAAQ,GAAG,WAAW,KAAK,UAAU,IAAI;AAGjD,QAAI,QAAQ,KAAK,MACd,OAAO,WAAW,EAClB,aAAa,QAAQ,EACrB,MAAM,QAAQ,CAAC;AAGlB,QAAI,WAAW;AACb,cAAQ,MAAM,MAAM,gBAAgB,SAAS,GAAG;AAAA,IAClD;AAEA,UAAM,UAAU,MAAM,MAAM,QAAQ;AAEpC,WAAO,QACJ,OAAO,OAAK;AAIX,YAAM,WAAW,EAAE,aAAa;AAChC,YAAM,QAAQ,IAAK,WAAW;AAC9B,aAAO,SAAS;AAAA,IAClB,CAAC,EACA,MAAM,GAAG,KAAK,EACd,IAAI,OAAK;AACR,YAAM,WAAW,EAAE,aAAa;AAChC,YAAM,QAAQ,IAAK,WAAW;AAC9B,aAAO;AAAA,QACL,IAAI,EAAE;AAAA,QACN,SAAS,EAAE;AAAA,QACX,SAAS,EAAE;AAAA,QACX;AAAA,QACA,WAAW,EAAE;AAAA,QACb,WAAW,EAAE;AAAA,QACb,WAAW,EAAE;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,SAAgC;AAC3C,QAAI,CAAC,KAAK;AAAO;AACjB,UAAM,KAAK,MAAM,OAAO,cAAc,OAAO,GAAG;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAyB;AAC7B,QAAI,CAAC,KAAK;AAAO,aAAO;AACxB,UAAM,SAAS,MAAM,KAAK,MAAM,UAAU;AAC1C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,SAAmC;AAC9C,QAAI,CAAC,KAAK;AAAO,aAAO;AAExB,UAAM,UAAU,MAAM,KAAK,MACxB,OAAO,CAAC,CAAC,EACT,MAAM,cAAc,OAAO,GAAG,EAC9B,MAAM,CAAC,EACP,QAAQ;AAEX,WAAO,QAAQ,SAAS;AAAA,EAC1B;AACF;;;AC3LA,SAAS,gBAA0B;AAQ5B,IAAM,WAAN,MAAe;AAAA,EACZ,WAA4B;AAAA,EACnB;AAAA,EACT,cAAc;AAAA,EAEtB,YAAY,YAAoB,2BAA2B;AACzD,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA4B;AAChC,QAAI,KAAK;AAAa;AAEtB,SAAK,WAAW,MAAM,SAAS,sBAAsB,KAAK,SAAS;AACnE,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,MAAwC;AAClD,UAAM,KAAK,WAAW;AAEtB,QAAI,CAAC,KAAK,UAAU;AAClB,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAEA,UAAM,SAAS,MAAM,KAAK,SAAS,MAAM;AAAA,MACvC,SAAS;AAAA,MACT,WAAW;AAAA,IACb,CAAC;AAED,UAAM,SAAS,MAAM,KAAK,OAAO,IAAoB;AAErD,WAAO;AAAA,MACL;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,YAAY,OAAO;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,OAA6C;AAC5D,UAAM,KAAK,WAAW;AAEtB,QAAI,CAAC,KAAK,UAAU;AAClB,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAEA,UAAM,UAA6B,CAAC;AAGpC,UAAM,YAAY;AAClB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,WAAW;AAChD,YAAM,QAAQ,MAAM,MAAM,GAAG,IAAI,SAAS;AAE1C,iBAAW,QAAQ,OAAO;AACxB,cAAM,SAAS,MAAM,KAAK,SAAS,MAAM;AAAA,UACvC,SAAS;AAAA,UACT,WAAW;AAAA,QACb,CAAC;AAED,cAAM,SAAS,MAAM,KAAK,OAAO,IAAoB;AAErD,gBAAQ,KAAK;AAAA,UACX;AAAA,UACA,OAAO,KAAK;AAAA,UACZ,YAAY,OAAO;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAiC;AACrC,UAAM,SAAS,MAAM,KAAK,MAAM,MAAM;AACtC,WAAO,OAAO;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAmB;AACjB,WAAO,KAAK,eAAe,KAAK,aAAa;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,eAAuB;AACrB,WAAO,KAAK;AAAA,EACd;AACF;AAGA,IAAI,kBAAmC;AAEhC,SAAS,qBAA+B;AAC7C,MAAI,CAAC,iBAAiB;AACpB,sBAAkB,IAAI,SAAS;AAAA,EACjC;AACA,SAAO;AACT;;;ACrHA,SAAS,cAAAC,mBAAkB;AAe3B,IAAM,iBAA+B;AAAA,EACnC,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,kBAAkB,IAAI,KAAK;AAAA;AAAA,EAC3B,aAAa;AACf;AAUO,IAAM,eAAN,MAAmB;AAAA,EAGxB,YACU,IACR,QACA;AAFQ;AAGR,SAAK,SAAS,EAAE,GAAG,gBAAgB,GAAG,OAAO;AAAA,EAC/C;AAAA,EAPQ;AAAA;AAAA;AAAA;AAAA,EAYR,MAAM,QACJ,UACA,QACA,kBACiB;AACjB,UAAM,UAAU,oBAAoB,KAAK,OAAO;AAChD,UAAM,QAAQA,YAAW;AACzB,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAEnC,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA,CAAC,OAAO,UAAU,QAAQ,SAAS,KAAK,GAAG;AAAA,IAC7C;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,QAAgB,IAA0B;AACxD,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAGnC,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,CAAC,KAAK,KAAK;AAAA,IACb;AAEA,WAAO,KAAK,IAAI,SAAO,KAAK,SAAS,GAAG,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,OAA8B;AAC3C,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,EAAC,oBAAI,KAAK,GAAE,YAAY,GAAG,KAAK;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,OAAe,OAA8B;AAC5D,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAGnC,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,KAAK;AAAA,IACR;AAEA,QAAI,KAAK,WAAW;AAAG;AAEvB,UAAM,aAAa,KAAK,CAAC,EAAE;AAC3B,UAAM,YAA0B,cAAc,KAAK,OAAO,aAAa,IACnE,WACA;AAEJ,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,WAAW,OAAO,KAAK,KAAK;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,OAA0C;AACrD,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,KAAK;AAAA,IACR;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAC9B,WAAO,KAAK,SAAS,KAAK,CAAC,CAAC;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,QAAsB,QAAgB,KAA2B;AACrF,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA,CAAC,QAAQ,KAAK;AAAA,IAChB;AAEA,WAAO,KAAK,IAAI,SAAO,KAAK,SAAS,GAAG,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAA6D;AACjE,UAAM,MAAM,oBAAI,KAAK;AACrB,UAAM,iBAAiB,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,OAAO,gBAAgB;AAG5E,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA,CAAC,IAAI,YAAY,GAAG,eAAe,YAAY,CAAC;AAAA,IAClD;AAGA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA,CAAC,IAAI,YAAY,GAAG,KAAK,OAAO,UAAU;AAAA,IAC5C;AAGA,UAAM,gBAAgB,MAAM;AAAA,MAC1B,KAAK;AAAA,MACL;AAAA;AAAA,MAEA,CAAC,IAAI,YAAY,CAAC;AAAA,IACpB;AAEA,WAAO;AAAA,MACL,WAAW;AAAA;AAAA,MACX,SAAS;AAAA;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAA2B;AAC/B,UAAM,YAAY,oBAAI,KAAK;AAC3B,cAAU,QAAQ,UAAU,QAAQ,IAAI,KAAK,OAAO,WAAW;AAE/D,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,UAAU,YAAY,CAAC;AAAA,IAC1B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAqC;AACzC,UAAM,eAAe,MAAM;AAAA,MACzB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,IAGF;AAEA,UAAM,gBAAgB,MAAM;AAAA,MAC1B,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,IAIF;AAEA,UAAM,UAAyB;AAAA,MAC7B,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,aAAa;AAAA,MACb,kBAAkB;AAAA,IACpB;AAEA,eAAW,OAAO,cAAc;AAC9B,cAAQ,IAAI,QAAQ;AAAA,QAClB,KAAK;AACH,kBAAQ,eAAe,OAAO,IAAI,KAAK;AACvC;AAAA,QACF,KAAK;AACH,kBAAQ,kBAAkB,OAAO,IAAI,KAAK;AAC1C;AAAA,QACF,KAAK;AACH,kBAAQ,YAAY,OAAO,IAAI,KAAK;AACpC;AAAA,QACF,KAAK;AACH,kBAAQ,cAAc,OAAO,IAAI,KAAK;AACtC;AAAA,MACJ;AAAA,IACF;AAEA,QAAI,cAAc,SAAS,GAAG;AAC5B,YAAM,aAAa,IAAI,KAAK,cAAc,CAAC,EAAE,UAAU;AACvD,cAAQ,mBAAmB,KAAK,IAAI,IAAI,WAAW,QAAQ;AAAA,IAC7D;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,MAAoB,IAA2B;AAC/D,UAAM,mBAAmB;AAAA,MACvB,EAAE,MAAM,WAAW,IAAI,aAAa;AAAA,MACpC,EAAE,MAAM,cAAc,IAAI,OAAO;AAAA,MACjC,EAAE,MAAM,cAAc,IAAI,SAAS;AAAA,MACnC,EAAE,MAAM,UAAU,IAAI,UAAU;AAAA,IAClC;AAEA,WAAO,iBAAiB,KAAK,OAAK,EAAE,SAAS,QAAQ,EAAE,OAAO,EAAE;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,KAAyC;AACxD,WAAO;AAAA,MACL,OAAO,IAAI;AAAA,MACX,UAAU,IAAI;AAAA,MACd,QAAQ,IAAI;AAAA,MACZ,kBAAkB,IAAI;AAAA,MACtB,QAAQ,IAAI;AAAA,MACZ,YAAY,IAAI;AAAA,MAChB,OAAO,IAAI;AAAA,MACX,WAAW,OAAO,IAAI,UAAU;AAAA,MAChC,WAAW,OAAO,IAAI,UAAU;AAAA,IAClC;AAAA,EACF;AACF;;;ACnSA,IAAMC,kBAA+B;AAAA,EACnC,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,YAAY;AACd;AAEO,IAAM,eAAN,MAAmB;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,UAAU;AAAA,EACV,cAAqC;AAAA,EAE7C,YACE,YACA,aACA,UACA,SAAgC,CAAC,GACjC;AACA,SAAK,aAAa;AAClB,SAAK,cAAc;AACnB,SAAK,WAAW;AAChB,SAAK,SAAS,EAAE,GAAGA,iBAAgB,GAAG,OAAO;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,QAAI,KAAK;AAAS;AAClB,SAAK,UAAU;AACf,SAAK,KAAK;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,OAAa;AACX,SAAK,UAAU;AACf,QAAI,KAAK,aAAa;AACpB,mBAAa,KAAK,WAAW;AAC7B,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAgC;AACpC,UAAM,QAAQ,MAAM,KAAK,WAAW,sBAAsB,KAAK,OAAO,SAAS;AAE/E,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO;AAAA,IACT;AAEA,UAAM,aAAuB,CAAC;AAC9B,UAAM,SAAmB,CAAC;AAE1B,QAAI;AAEF,YAAM,aAAa,MAAM,KAAK,SAAS,WAAW,MAAM,IAAI,OAAK,EAAE,OAAO,CAAC;AAG3E,YAAM,UAA0B,CAAC;AAEjC,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,cAAM,OAAO,MAAM,CAAC;AACpB,cAAM,YAAY,WAAW,CAAC;AAG9B,cAAM,QAAQ,MAAM,KAAK,WAAW,SAAS,KAAK,OAAO;AACzD,YAAI,CAAC,OAAO;AACV,iBAAO,KAAK,KAAK,EAAE;AACnB;AAAA,QACF;AAEA,gBAAQ,KAAK;AAAA,UACX,IAAI,OAAO,KAAK,EAAE;AAAA,UAClB,SAAS,KAAK;AAAA,UACd,WAAW,MAAM;AAAA,UACjB,WAAW,MAAM;AAAA,UACjB,SAAS,KAAK;AAAA,UACd,QAAQ,UAAU;AAAA,UAClB,WAAW,MAAM,UAAU,YAAY;AAAA,UACvC,UAAU,MAAM;AAAA,QAClB,CAAC;AAED,mBAAW,KAAK,KAAK,EAAE;AAAA,MACzB;AAGA,UAAI,QAAQ,SAAS,GAAG;AACtB,cAAM,KAAK,YAAY,YAAY,OAAO;AAAA,MAC5C;AAGA,UAAI,WAAW,SAAS,GAAG;AACzB,cAAM,KAAK,WAAW,oBAAoB,UAAU;AAAA,MACtD;AAGA,UAAI,OAAO,SAAS,GAAG;AACrB,cAAM,KAAK,WAAW,gBAAgB,QAAQ,iBAAiB;AAAA,MACjE;AAEA,aAAO,WAAW;AAAA,IACpB,SAAS,OAAO;AAEd,YAAM,SAAS,MAAM,IAAI,OAAK,EAAE,EAAE;AAClC,YAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,YAAM,KAAK,WAAW,gBAAgB,QAAQ,YAAY;AAC1D,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,OAAsB;AAClC,QAAI,CAAC,KAAK;AAAS;AAEnB,QAAI;AACF,YAAM,KAAK,aAAa;AAAA,IAC1B,SAAS,OAAO;AACd,cAAQ,MAAM,wBAAwB,KAAK;AAAA,IAC7C;AAGA,SAAK,cAAc,WAAW,MAAM,KAAK,KAAK,GAAG,KAAK,OAAO,cAAc;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA8B;AAClC,QAAI,iBAAiB;AACrB,QAAI;AAEJ,OAAG;AACD,kBAAY,MAAM,KAAK,aAAa;AACpC,wBAAkB;AAAA,IACpB,SAAS,YAAY;AAErB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AACF;AAKO,SAAS,mBACd,YACA,aACA,UACA,QACc;AACd,QAAM,SAAS,IAAI,aAAa,YAAY,aAAa,UAAU,MAAM;AACzE,SAAO;AACT;AAiBA,IAAM,oBAAoC;AAAA,EACxC,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,kBAAkB;AACpB;AAeO,IAAM,yBAAN,MAAwD;AAAA,EAC7D,YAAoB,IAAc;AAAd;AAAA,EAAe;AAAA,EAEnC,MAAM,WAAW,UAA0B,QAGjC;AACR,YAAQ,UAAU;AAAA,MAChB,KAAK;AACH,eAAO,KAAK,gBAAgB,MAAM;AAAA,MACpC,KAAK;AACH,eAAO,KAAK,oBAAoB,MAAM;AAAA,MACxC,KAAK;AACH,eAAO,KAAK,gBAAgB,MAAM;AAAA,MACpC;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEA,MAAc,gBAAgB,SAGpB;AACR,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,OAAO;AAAA,IACV;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAE9B,UAAM,MAAM,KAAK,CAAC;AAClB,UAAM,cAAc,OAAO,IAAI,iBAAiB,WAC5C,KAAK,MAAM,IAAI,YAAY,IAC3B,IAAI;AAER,WAAO;AAAA,MACL,SAAS,GAAG,IAAI,KAAK;AAAA,EAAK,KAAK,UAAU,WAAW,CAAC;AAAA,MACrD,UAAU;AAAA,QACR,UAAU;AAAA,QACV,WAAW,IAAI;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,oBAAoB,QAGxB;AACR,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA,MAEA,CAAC,MAAM;AAAA,IACT;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAE9B,UAAM,MAAM,KAAK,CAAC;AAClB,WAAO;AAAA,MACL,SAAS,IAAI,eAAyB,IAAI;AAAA,MAC1C,UAAU;AAAA,QACR,UAAU;AAAA,QACV,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,gBAAgB,SAGpB;AACR,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,OAAO;AAAA,IACV;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAE9B,UAAM,MAAM,KAAK,CAAC;AAClB,WAAO;AAAA,MACL,SAAS,IAAI;AAAA,MACb,UAAU;AAAA,QACR,UAAU;AAAA,QACV,WAAW,IAAI;AAAA,QACf,WAAW,IAAI;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACF;AAKO,IAAM,iBAAN,MAAqB;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,UAAU;AAAA,EACV,cAAqC;AAAA,EAE7C,YACE,IACA,aACA,UACA,SAAkC,CAAC,GACnC,iBACA;AACA,SAAK,SAAS,IAAI,aAAa,IAAI;AAAA,MACjC,kBAAkB,OAAO,oBAAoB,kBAAkB;AAAA,MAC/D,YAAY,OAAO,cAAc,kBAAkB;AAAA,IACrD,CAAC;AACD,SAAK,cAAc;AACnB,SAAK,WAAW;AAChB,SAAK,SAAS,EAAE,GAAG,mBAAmB,GAAG,OAAO;AAChD,SAAK,kBAAkB,mBAAmB,IAAI,uBAAuB,EAAE;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,QAAI,KAAK;AAAS;AAClB,SAAK,UAAU;AACf,SAAK,KAAK;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,OAAa;AACX,SAAK,UAAU;AACf,QAAI,KAAK,aAAa;AACpB,mBAAa,KAAK,WAAW;AAC7B,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAgC;AACpC,UAAM,OAAO,MAAM,KAAK,OAAO,UAAU,KAAK,OAAO,SAAS;AAE9D,QAAI,KAAK,WAAW,GAAG;AACrB,aAAO;AAAA,IACT;AAEA,QAAI,eAAe;AAEnB,eAAW,OAAO,MAAM;AACtB,UAAI;AACF,cAAM,KAAK,WAAW,GAAG;AACzB,cAAM,KAAK,OAAO,SAAS,IAAI,KAAK;AACpC;AAAA,MACF,SAAS,OAAO;AACd,cAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,cAAM,KAAK,OAAO,WAAW,IAAI,OAAO,YAAY;AAAA,MACtD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAW,KAA+B;AAEtD,UAAM,cAAc,MAAM,KAAK,gBAAgB,WAAW,IAAI,UAAU,IAAI,MAAM;AAElF,QAAI,CAAC,aAAa;AAEhB;AAAA,IACF;AAGA,UAAM,YAAY,MAAM,KAAK,SAAS,MAAM,YAAY,OAAO;AAG/D,UAAM,SAAuB;AAAA,MAC3B,IAAI,GAAG,IAAI,QAAQ,IAAI,IAAI,MAAM,IAAI,IAAI,gBAAgB;AAAA,MACzD,SAAS,IAAI,aAAa,UAAU,IAAI,SAAS;AAAA,MACjD,WAAY,YAAY,SAAS,aAAwB;AAAA,MACzD,WAAY,YAAY,SAAS,aAAwB,IAAI;AAAA,MAC7D,SAAS,YAAY;AAAA,MACrB,QAAQ,UAAU;AAAA,MAClB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,UAAU;AAAA,QACR,GAAG,YAAY;AAAA,QACf,kBAAkB,IAAI;AAAA,MACxB;AAAA,IACF;AAGA,UAAM,KAAK,YAAY,YAAY,CAAC,MAAM,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,OAAsB;AAClC,QAAI,CAAC,KAAK;AAAS;AAEnB,QAAI;AACF,YAAM,KAAK,aAAa;AAAA,IAC1B,SAAS,OAAO;AACd,cAAQ,MAAM,2BAA2B,KAAK;AAAA,IAChD;AAGA,SAAK,cAAc,WAAW,MAAM,KAAK,KAAK,GAAG,KAAK,OAAO,cAAc;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA8B;AAClC,QAAI,iBAAiB;AACrB,QAAI;AAEJ,OAAG;AACD,kBAAY,MAAM,KAAK,aAAa;AACpC,wBAAkB;AAAA,IACpB,SAAS,YAAY;AAErB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAA6D;AACjE,WAAO,KAAK,OAAO,UAAU;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa;AACjB,WAAO,KAAK,OAAO,WAAW;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,YAA0B;AACxB,WAAO,KAAK;AAAA,EACd;AACF;AAKO,SAAS,qBACd,IACA,aACA,UACA,QACgB;AAChB,SAAO,IAAI,eAAe,IAAI,aAAa,UAAU,MAAM;AAC7D;;;AC9cA,IAAMC,kBAAgC;AAAA,EACpC,SAAS;AAAA,IACP,oBAAoB;AAAA,IACpB,UAAU;AAAA,IACV,cAAc;AAAA,IACd,cAAc;AAAA,EAChB;AAAA,EACA,kBAAkB;AAAA,EAClB,QAAQ;AAAA,EACR,qBAAqB;AACvB;AAEO,IAAM,UAAN,MAAc;AAAA,EACF;AAAA,EAEjB,YAAY,SAAiC,CAAC,GAAG;AAC/C,SAAK,SAAS;AAAA,MACZ,GAAGA;AAAA,MACH,GAAG;AAAA,MACH,SAAS,EAAE,GAAGA,gBAAe,SAAS,GAAG,OAAO,QAAQ;AAAA,IAC1D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,uBACE,eACA,WAAmB,GACnB,cAAsB,GACtB,WAAoB,MACZ;AACR,UAAM,EAAE,QAAQ,IAAI,KAAK;AAGzB,UAAM,eAAe,KAAK,IAAI,GAAG,IAAI,cAAc,EAAE;AAGrD,UAAM,mBAAmB,WAAW,IAAM;AAE1C,UAAM,gBACJ,QAAQ,qBAAqB,gBAC7B,QAAQ,WAAW,WACnB,QAAQ,eAAe,eACvB,QAAQ,eAAe;AAEzB,WAAO,KAAK,IAAI,GAAK,aAAa;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,mBACE,UACA,aACiB;AACjB,UAAM,EAAE,kBAAkB,QAAQ,oBAAoB,IAAI,KAAK;AAG/D,UAAM,MAAM,gBAAgB,OAAO,WAAW,cAAc;AAG5D,QAAI,YAAY,oBAAoB,OAAO,QAAQ;AACjD,aAAO;AAAA,IACT;AAGA,QAAI,YAAY,qBAAqB;AACnC,aAAO;AAAA,IACT;AAGA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,mBACE,SACA,aACa;AACb,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,MACd;AAAA,IACF;AAGA,UAAM,gBAAgB,QAAQ,IAAI,YAAU;AAC1C,YAAM,UAAU,YAAY,OAAO,OAAO;AAC1C,YAAM,gBAAgB,KAAK;AAAA,QACzB,OAAO;AAAA,QACP;AAAA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,MACF;AAEA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAGD,kBAAc,KAAK,CAAC,GAAG,MAAM,EAAE,gBAAgB,EAAE,aAAa;AAE9D,UAAM,YAAY,cAAc,CAAC;AACjC,UAAM,cAAc,cAAc,SAAS,IAAI,cAAc,CAAC,EAAE,gBAAgB;AAGhF,UAAM,aAAa,KAAK,mBAAmB,UAAU,eAAe,WAAW;AAG/E,UAAM,QAAqB;AAAA,MACzB,OAAO;AAAA,QACL,IAAI,UAAU,OAAO;AAAA,QACrB,WAAW,UAAU,OAAO;AAAA,QAC5B,WAAW,UAAU,OAAO;AAAA,QAC5B,WAAW,IAAI,KAAK,UAAU,OAAO,SAAS;AAAA,QAC9C,SAAS,UAAU,OAAO;AAAA,QAC1B,cAAc;AAAA;AAAA,QACd,WAAW;AAAA;AAAA,MACb;AAAA,MACA,OAAO,UAAU;AAAA,IACnB;AAEA,UAAM,MAAM,gBAAgB,OAAO,UAAU,gBAAgB,cAAc;AAG3E,UAAM,eAAe,eAAe,cAChC,cAAc,MAAM,GAAG,CAAC,EAAE,IAAI,SAAO;AAAA,MACnC,OAAO;AAAA,QACL,IAAI,GAAG,OAAO;AAAA,QACd,WAAW,GAAG,OAAO;AAAA,QACrB,WAAW,GAAG,OAAO;AAAA,QACrB,WAAW,IAAI,KAAK,GAAG,OAAO,SAAS;AAAA,QACvC,SAAS,GAAG,OAAO;AAAA,QACnB,cAAc;AAAA,QACd,WAAW;AAAA,MACb;AAAA,MACA,OAAO,GAAG;AAAA,IACZ,EAAE,IACF;AAEJ,WAAO;AAAA,MACL,OAAO,eAAe,SAAS,QAAQ;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,iBAAiB,WAAyB;AAC/C,UAAM,MAAM,oBAAI,KAAK;AACrB,UAAM,SAAS,IAAI,QAAQ,IAAI,UAAU,QAAQ;AACjD,WAAO,UAAU,MAAO,KAAK,KAAK;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAqC;AACnC,WAAO,EAAE,GAAG,KAAK,OAAO;AAAA,EAC1B;AACF;AAKA,IAAI,iBAAiC;AAE9B,SAAS,oBAA6B;AAC3C,MAAI,CAAC,gBAAgB;AACnB,qBAAiB,IAAI,QAAQ;AAAA,EAC/B;AACA,SAAO;AACT;;;AC3MA,SAAS,cAAAC,mBAAkB;AA+B3B,IAAM,kBAAoC;AAAA,EACxC,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,kBAAkB;AACpB;AAEA,IAAM,qBAAyC;AAAA,EAC7C,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,gBAAgB;AAAA,EAChB,iBAAiB;AACnB;AAWO,IAAM,kBAAN,MAAsB;AAAA,EACV;AAAA,EAEjB,YAAY,UAAqC,CAAC,GAAG;AACnD,SAAK,UAAU,EAAE,GAAG,iBAAiB,GAAG,QAAQ;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAkB,eAAwC;AAC9D,UAAM,QAAwB,CAAC;AAC/B,UAAM,gBAA0B,CAAC;AACjC,UAAM,mBAAmB,KAAK,UAAU,aAAa;AAErD,eAAW,SAAS,QAAQ;AAC1B,YAAM,kBAAkB,KAAK,UAAU,KAAK;AAG5C,UAAI,gBAAgB,SAAS,KAAK,QAAQ,gBAAgB;AACxD;AAAA,MACF;AAGA,YAAM,YAAY,KAAK,eAAe,iBAAiB,kBAAkB,aAAa;AACtF,UAAI,WAAW;AACb,cAAM,KAAK,SAAS;AACpB;AAAA,MACF;AAGA,YAAM,YAAY,KAAK,eAAe,iBAAiB,kBAAkB,aAAa;AACtF,UAAI,aAAa,UAAU,cAAc,KAAK,QAAQ,gBAAgB;AACpE,cAAM,KAAK,SAAS;AACpB;AAAA,MACF;AAGA,oBAAc,KAAK,KAAK;AAAA,IAC1B;AAGA,UAAM,cAAc,OAAO;AAC3B,UAAM,gBAAgB,MAAM;AAC5B,UAAM,aAAa,cAAc,IAAI,gBAAgB,cAAc;AAGnE,UAAM,YAAY,cAAc,UAAU,KAAK,QAAQ;AAEvD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eACN,iBACA,kBACA,gBACqB;AACrB,UAAM,QAAQ,iBAAiB,QAAQ,eAAe;AAEtD,QAAI,UAAU,IAAI;AAChB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,OAAO;AAAA,MACP,KAAK,QAAQ,gBAAgB;AAAA,MAC7B,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,eAAe,eAAe,MAAM,OAAO,QAAQ,gBAAgB,MAAM;AAAA,MACzE,aAAa;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eACN,iBACA,kBACA,gBACqB;AACrB,UAAM,aAAa,gBAAgB;AACnC,QAAI,YAA0D;AAG9D,aAAS,IAAI,GAAG,KAAK,iBAAiB,SAAS,YAAY,KAAK;AAC9D,YAAM,SAAS,iBAAiB,MAAM,GAAG,IAAI,UAAU;AACvD,YAAM,aAAa,KAAK,oBAAoB,iBAAiB,MAAM;AAEnE,UAAI,CAAC,aAAa,aAAa,UAAU,YAAY;AACnD,oBAAY,EAAE,OAAO,GAAG,WAAW;AAAA,MACrC;AAAA,IACF;AAEA,QAAI,CAAC,aAAa,UAAU,aAAa,KAAK,QAAQ,gBAAgB;AACpE,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,OAAO,UAAU;AAAA,MACjB,KAAK,UAAU,QAAQ;AAAA,MACvB,YAAY,UAAU;AAAA,MACtB,WAAW;AAAA,MACX,eAAe,eAAe,MAAM,UAAU,OAAO,UAAU,QAAQ,UAAU;AAAA,MACjF,aAAa;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,GAAW,GAAmB;AACxD,UAAM,OAAO,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC;AACrC,UAAM,OAAO,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC;AAErC,UAAM,eAAe,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,OAAK,KAAK,IAAI,CAAC,CAAC,CAAC;AAC/D,UAAM,QAAQ,oBAAI,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;AAExC,WAAO,aAAa,OAAO,MAAM;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,MAAwB;AACvC,WAAO,KAAK,YAAY,EAAE,MAAM,KAAK,EAAE,OAAO,OAAK,EAAE,SAAS,CAAC;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,MAAsB;AACtC,WAAO,KACJ,UAAU,MAAM,EAChB,YAAY,EACZ,QAAQ,qBAAqB,EAAE,EAC/B,QAAQ,QAAQ,GAAG,EACnB,KAAK;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,MAAwB;AAEpC,UAAM,YAAY,KAAK,MAAM,QAAQ,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAK,EAAE,SAAS,CAAC;AAGlF,WAAO,UAAU,OAAO,OAAK;AAC3B,aAAO,EAAE,UAAU,KAAK,QAAQ,kBAAkB,CAAC,EAAE,SAAS,GAAG;AAAA,IACnE,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,UAAkB,SAAoC;AACpE,UAAM,SAAS,KAAK,cAAc,QAAQ;AAC1C,UAAM,kBAAkB,QAAQ,KAAK,GAAG;AAExC,WAAO,KAAK,MAAM,QAAQ,eAAe;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAMQ,YAAgC;AAAA;AAAA;AAAA;AAAA,EAKxC,YAAY,SAA4C;AACtD,SAAK,YAAY,EAAE,GAAG,oBAAoB,GAAG,QAAQ;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QACE,iBACA,UACe;AACf,UAAM,UAAiC,CAAC;AACxC,QAAI,eAAe;AACnB,QAAI,kBAAkB;AAEtB,eAAW,MAAM,UAAU;AACzB,YAAM,SAAS,KAAK,oBAAoB,iBAAiB,EAAE;AAC3D,cAAQ,KAAK,MAAM;AAEnB,UAAI,OAAO,SAAS;AAClB;AACA,2BAAmB,OAAO,SAAS;AAAA,MACrC;AAAA,IACF;AAEA,UAAM,cAAc,SAAS,SAAS;AACtC,UAAM,aAAa,KAAK,MAAM,SAAS,SAAS,KAAK,UAAU,eAAe;AAC9E,UAAM,kBAAkB,eAAe;AACvC,UAAM,oBAAoB,SAAS,SAAS,IACxC,kBAAkB,SAAS,SAC3B;AAEJ,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBACN,iBACA,UACqB;AACrB,UAAM,EAAE,cAAc,MAAM,IAAI;AAGhC,QAAI,eAAe,KAAK,gBAAgB,gBAAgB,QAAQ;AAC9D,aAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,UACR;AAAA,UACA;AAAA,UACA,eAAe;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,SAAS,MAAM,KAAK,EAAE,WAAW,GAAG;AACvC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,UACR;AAAA,UACA;AAAA,UACA,eAAe;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,gBAAgB,gBAAgB,YAAY;AAGlD,UAAM,cAAc,KAAK,gBAAgB,OAAO,eAAe,YAAY;AAC3E,QAAI,aAAa;AACf,aAAO;AAAA,IACT;AAGA,UAAM,mBAAmB,KAAK,qBAAqB,OAAO,eAAe,YAAY;AACrF,QAAI,kBAAkB;AACpB,aAAO;AAAA,IACT;AAGA,UAAM,cAAc,KAAK,gBAAgB,OAAO,eAAe,YAAY;AAC3E,QAAI,aAAa;AACf,aAAO;AAAA,IACT;AAGA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA,eAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBACN,OACA,QACA,cAC4B;AAC5B,UAAM,QAAQ,OAAO,QAAQ,KAAK;AAElC,QAAI,UAAU,IAAI;AAChB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,SAAS,QAAQ,MAAM;AAAA,QACvB,WAAW,KAAK,UAAU,KAAK;AAAA,QAC/B,YAAY;AAAA,QACZ,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBACN,OACA,QACA,cAC4B;AAC5B,UAAM,kBAAkB,KAAK,oBAAoB,KAAK;AACtD,UAAM,mBAAmB,KAAK,oBAAoB,MAAM;AAExD,UAAM,kBAAkB,iBAAiB,QAAQ,eAAe;AAChE,QAAI,oBAAoB,IAAI;AAC1B,aAAO;AAAA,IACT;AAGA,UAAM,eAAe,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA,kBAAkB,gBAAgB;AAAA,IACpC;AAEA,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA,WAAW,aAAa;AAAA,QACxB,SAAS,aAAa;AAAA,QACtB,WAAW,KAAK,UAAU,KAAK;AAAA,QAC/B,YAAY;AAAA,QACZ,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBACN,OACA,QACA,cAC4B;AAC5B,UAAM,kBAAkB,KAAK,UAAU,KAAK;AAC5C,UAAM,mBAAmB,KAAK,UAAU,MAAM;AAE9C,QAAI,gBAAgB,SAAS,KAAK,UAAU,gBAAgB;AAC1D,aAAO;AAAA,IACT;AAGA,UAAM,cAAc;AAAA,MAClB,gBAAgB;AAAA,MAChB,KAAK,MAAM,gBAAgB,SAAS,GAAG;AAAA,MACvC,KAAK,MAAM,gBAAgB,SAAS,GAAG;AAAA,IACzC;AAEA,QAAI,YAIO;AAEX,eAAW,cAAc,aAAa;AACpC,eAAS,IAAI,GAAG,KAAK,iBAAiB,SAAS,YAAY,KAAK;AAC9D,cAAM,SAAS,iBAAiB,MAAM,GAAG,IAAI,UAAU;AACvD,cAAM,aAAa,KAAK,+BAA+B,iBAAiB,MAAM;AAE9E,YAAI,cAAc,KAAK,UAAU,gBAAgB;AAC/C,cAAI,CAAC,aAAa,aAAa,UAAU,YAAY;AACnD,wBAAY,EAAE,OAAO,GAAG,YAAY,WAAW;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,IACT;AAGA,UAAM,eAAe,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,UAAU,QAAQ,UAAU;AAAA,IAC9B;AAEA,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA,WAAW,aAAa;AAAA,QACxB,SAAS,aAAa;AAAA,QACtB,WAAW,KAAK,UAAU,KAAK;AAAA,QAC/B,YAAY,UAAU;AAAA,QACtB,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,MAAsB;AAChD,WAAO,KACJ,QAAQ,WAAW,GAAG,EACtB,QAAQ,QAAQ,GAAG,EACnB,QAAQ,OAAO,GAAG,EAClB,KAAK;AAAA,EACV;AAAA;AAAA;AAAA;AAAA,EAKQ,uBACN,UACA,YACA,iBACA,eACuC;AAEvC,UAAM,uBAA4C,oBAAI,IAAI;AAC1D,QAAI,gBAAgB;AAEpB,aAAS,UAAU,GAAG,UAAU,SAAS,QAAQ,WAAW;AAC1D,YAAM,OAAO,SAAS,OAAO;AAG7B,UAAI,KAAK,KAAK,IAAI,GAAG;AAEnB,YAAI,gBAAgB,WAAW,UAAU,KAAK,KAAK,WAAW,aAAa,CAAC,GAAG;AAC7E,+BAAqB,IAAI,eAAe,OAAO;AAC/C;AAGA,iBAAO,UAAU,IAAI,SAAS,UAAU,KAAK,KAAK,SAAS,UAAU,CAAC,CAAC,GAAG;AACxE;AAAA,UACF;AAAA,QACF;AAAA,MACF,OAAO;AACL,6BAAqB,IAAI,eAAe,OAAO;AAC/C;AAAA,MACF;AAAA,IACF;AAEA,UAAM,YAAY,qBAAqB,IAAI,eAAe;AAC1D,QAAI,UAAU,qBAAqB,IAAI,gBAAgB,CAAC;AAExD,QAAI,cAAc,QAAW;AAC3B,aAAO;AAAA,IACT;AAEA,QAAI,YAAY,QAAW;AAEzB,gBAAU,SAAS,SAAS;AAAA,IAC9B;AAEA,WAAO;AAAA,MACL,OAAO;AAAA,MACP,KAAK,UAAU;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,+BAA+B,GAAW,GAAmB;AACnE,UAAM,IAAI,EAAE;AACZ,UAAM,IAAI,EAAE;AAEZ,QAAI,MAAM;AAAG,aAAO,MAAM,IAAI,IAAI;AAClC,QAAI,MAAM;AAAG,aAAO;AAEpB,UAAM,KAAiB,MAAM,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE,IAAI,MAAM,MAAM,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AAE7E,aAAS,IAAI,GAAG,KAAK,GAAG;AAAK,SAAG,CAAC,EAAE,CAAC,IAAI;AACxC,aAAS,IAAI,GAAG,KAAK,GAAG;AAAK,SAAG,CAAC,EAAE,CAAC,IAAI;AAExC,aAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,eAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,cAAM,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI;AACzC,WAAG,CAAC,EAAE,CAAC,IAAI,KAAK;AAAA,UACd,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI;AAAA;AAAA,UACf,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI;AAAA;AAAA,UACf,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI;AAAA;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,GAAG,CAAC,EAAE,CAAC;AACxB,UAAM,SAAS,KAAK,IAAI,GAAG,CAAC;AAC5B,WAAO,IAAI,WAAW;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,OAAuB;AACvC,WAAOA,YAAW,QAAQ,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,UAA0C;AAC1D,UAAM,QAAwB,CAAC;AAC/B,UAAM,gBAA0B,CAAC;AAEjC,eAAW,UAAU,SAAS,SAAS;AACrC,UAAI,OAAO,SAAS;AAClB,cAAM,KAAK,OAAO;AAClB,cAAM,KAAK;AAAA,UACT,OAAO,GAAG;AAAA,UACV,KAAK,GAAG;AAAA,UACR,YAAY,GAAG;AAAA,UACf,WAAW,GAAG,gBAAgB,UAAU,UAAU;AAAA,UAClD,eAAe,GAAG;AAAA,UAClB,aAAa,GAAG;AAAA,QAClB,CAAC;AAAA,MACH,OAAO;AACL,cAAM,KAAK,OAAO;AAClB,sBAAc,KAAK,GAAG,KAAK;AAAA,MAC7B;AAAA,IACF;AAEA,WAAO;AAAA,MACL,WAAW,SAAS;AAAA,MACpB,YAAY,SAAS;AAAA,MACrB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAKA,IAAI,iBAAyC;AAEtC,SAAS,oBAAqC;AACnD,MAAI,CAAC,gBAAgB;AACnB,qBAAiB,IAAI,gBAAgB;AAAA,EACvC;AACA,SAAO;AACT;;;AC1lBA,IAAMC,mBAAoC;AAAA,EACxC,MAAM;AAAA,EACN,UAAU;AAAA,EACV,WAAW;AAAA,EACX,uBAAuB;AACzB;AAEO,IAAM,YAAN,MAAgB;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YACE,YACA,aACA,UACA,SACA;AACA,SAAK,aAAa;AAClB,SAAK,cAAc;AACnB,SAAK,WAAW;AAChB,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SACJ,OACA,UAAqC,CAAC,GACZ;AAC1B,UAAM,OAAO,EAAE,GAAGA,kBAAiB,GAAG,QAAQ;AAG9C,UAAM,iBAAiB,MAAM,KAAK,SAAS,MAAM,KAAK;AAGtD,UAAM,gBAAgB,MAAM,KAAK,YAAY,OAAO,eAAe,QAAQ;AAAA,MACzE,OAAO,KAAK,OAAO;AAAA;AAAA,MACnB,UAAU,KAAK;AAAA,MACf,WAAW,KAAK;AAAA,IAClB,CAAC;AAGD,UAAM,cAAc,KAAK,QAAQ;AAAA,MAC/B;AAAA,MACA,CAAC,YAAY,KAAK,gBAAgB,OAAO;AAAA,IAC3C;AAGA,UAAM,WAAW,MAAM,KAAK,cAAc,cAAc,MAAM,GAAG,KAAK,IAAI,GAAG,IAAI;AAGjF,UAAM,UAAU,KAAK,aAAa,UAAU,KAAK,SAAS;AAE1D,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,aAAa,KAAK,eAAe,OAAO;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,WAA2C;AACnE,WAAO,KAAK,WAAW,iBAAiB,SAAS;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,QAAgB,KAA6B;AAChE,WAAO,KAAK,WAAW,gBAAgB,KAAK;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cACZ,SACA,SAC8B;AAC9B,UAAM,WAAgC,CAAC;AAEvC,eAAW,UAAU,SAAS;AAC5B,YAAM,QAAQ,MAAM,KAAK,WAAW,SAAS,OAAO,OAAO;AAC3D,UAAI,CAAC;AAAO;AAEZ,UAAI;AACJ,UAAI,QAAQ,uBAAuB;AACjC,yBAAiB,MAAM,KAAK,kBAAkB,MAAM,WAAW,MAAM,EAAE;AAAA,MACzE;AAEA,eAAS,KAAK;AAAA,QACZ;AAAA,QACA,OAAO,OAAO;AAAA,QACd;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBACZ,WACA,SAC6B;AAC7B,UAAM,gBAAgB,MAAM,KAAK,WAAW,iBAAiB,SAAS;AAGtE,UAAM,aAAa,cAAc,UAAU,OAAK,EAAE,OAAO,OAAO;AAChE,QAAI,eAAe;AAAI,aAAO;AAG9B,UAAM,QAAQ,KAAK,IAAI,GAAG,aAAa,CAAC;AACxC,UAAM,MAAM,KAAK,IAAI,cAAc,QAAQ,aAAa,CAAC;AACzD,UAAM,gBAAgB,cAAc,MAAM,OAAO,GAAG;AAEpD,QAAI,cAAc,UAAU;AAAG,aAAO;AAEtC,WAAO,cACJ,OAAO,OAAK,EAAE,OAAO,OAAO,EAC5B,IAAI,OAAK,IAAI,EAAE,SAAS,MAAM,EAAE,QAAQ,MAAM,GAAG,GAAG,CAAC,KAAK,EAC1D,KAAK,IAAI;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,UAA+B,WAA2B;AAC7E,UAAM,QAAkB,CAAC;AACzB,QAAI,gBAAgB;AAEpB,eAAW,UAAU,UAAU;AAC7B,YAAM,aAAa,KAAK,aAAa,MAAM;AAC3C,YAAM,eAAe,KAAK,eAAe,UAAU;AAEnD,UAAI,gBAAgB,eAAe,WAAW;AAC5C;AAAA,MACF;AAEA,YAAM,KAAK,UAAU;AACrB,uBAAiB;AAAA,IACnB;AAEA,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA;AAAA,EAA2B,MAAM,KAAK,aAAa,CAAC;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,QAAmC;AACtD,UAAM,EAAE,OAAO,OAAO,eAAe,IAAI;AACzC,UAAM,OAAO,MAAM,UAAU,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAEvD,QAAI,OAAO,KAAK,MAAM,SAAS,OAAO,IAAI,YAAY,MAAM,QAAQ,CAAC,CAAC;AAAA,EAAM,MAAM,OAAO;AAEzF,QAAI,gBAAgB;AAClB,cAAQ;AAAA;AAAA,aAAkB,cAAc;AAAA,IAC1C;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,MAAsB;AAE3C,WAAO,KAAK,KAAK,KAAK,SAAS,CAAC;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,SAAyB;AAG/C,WAAO;AAAA,EACT;AACF;AAKO,SAAS,gBACd,YACA,aACA,UACA,SACW;AACX,SAAO,IAAI,UAAU,YAAY,aAAa,UAAU,OAAO;AACjE;;;ACzMA,IAAM,mBAAkC;AAAA,EACtC,QAAQ;AAAA,IACN,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,YAAY;AAAA,EACd;AAAA,EACA,QAAQ;AAAA,IACN,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,YAAY;AAAA,EACd;AAAA,EACA,QAAQ;AAAA,IACN,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,YAAY;AAAA,EACd;AAAA,EACA,QAAQ;AAAA,IACN,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,YAAY;AAAA,EACd;AACF;AAUO,IAAM,qBAAN,MAAyB;AAAA,EACb;AAAA,EACA;AAAA,EACA,UAAqC,oBAAI,IAAI;AAAA,EAE9D,YACE,YACA,WAAmC,CAAC,GACpC;AACA,SAAK,aAAa;AAClB,SAAK,WAAW;AAAA,MACd,QAAQ,EAAE,GAAG,iBAAiB,QAAQ,GAAG,SAAS,OAAO;AAAA,MACzD,QAAQ,EAAE,GAAG,iBAAiB,QAAQ,GAAG,SAAS,OAAO;AAAA,MACzD,QAAQ,EAAE,GAAG,iBAAiB,QAAQ,GAAG,SAAS,OAAO;AAAA,MACzD,QAAQ,EAAE,GAAG,iBAAiB,QAAQ,GAAG,SAAS,OAAO;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,SAAiB,eAAuB,aAAqB,GAAW;AACnF,UAAM,WAAW,KAAK,QAAQ,IAAI,OAAO;AAEzC,QAAI,UAAU;AACZ,eAAS;AACT,eAAS,eAAe,oBAAI,KAAK;AACjC,eAAS,aAAa,KAAK,IAAI,SAAS,YAAY,UAAU;AAAA,IAGhE,OAAO;AACL,WAAK,QAAQ,IAAI,SAAS;AAAA,QACxB;AAAA,QACA,aAAa;AAAA,QACb,cAAc,oBAAI,KAAK;AAAA,QACvB,kBAAkB;AAAA,QAClB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,SAAiB,cAAsD;AAC9F,UAAM,UAAU,KAAK,QAAQ,IAAI,OAAO;AAExC,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,QACL;AAAA,QACA,WAAW;AAAA,QACX,SAAS;AAAA,QACT,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,aAAa,YAAY;AAChD,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,QACL;AAAA,QACA,WAAW;AAAA,QACX,SAAS;AAAA,QACT,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,YAAY,cAAc,SAAS;AACzD,UAAM,aAAa,KAAK,cAAc,SAAS,QAAQ;AAEvD,QAAI,WAAW,QAAQ;AAErB,YAAM,KAAK,WAAW,kBAAkB,SAAS,SAAS;AAE1D,aAAO;AAAA,QACL;AAAA,QACA,WAAW;AAAA,QACX,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,WAAW;AAAA,MACX,SAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,OAAiD;AACnE,UAAM,UAA8B,CAAC;AAErC,eAAW,CAAC,SAAS,OAAO,KAAK,KAAK,SAAS;AAC7C,YAAM,SAAS,MAAM,KAAK,mBAAmB,SAAS,KAAK;AAC3D,cAAQ,KAAK,MAAM;AAAA,IACrB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,QAAkC;AAChD,UAAM,WAAsB,CAAC;AAG7B,UAAM,WAAW,KAAK,eAAe,MAAM;AAC3C,eAAW,WAAW,UAAU;AAC9B,eAAS,KAAK;AAAA,QACZ,IAAI,OAAO,WAAW;AAAA,QACtB,aAAa;AAAA,QACb,SAAS,QAAQ;AAAA,QACjB,cAAc,QAAQ;AAAA,QACtB,YAAY,QAAQ;AAAA,QACpB,cAAc,QAAQ;AAAA,QACtB,WAAW,oBAAI,KAAK;AAAA,QACpB,aAAa,oBAAI,KAAK;AAAA,MACxB,CAAC;AAAA,IACH;AAGA,UAAM,cAAc,KAAK,kBAAkB,MAAM;AACjD,eAAW,QAAQ,aAAa;AAC9B,eAAS,KAAK;AAAA,QACZ,IAAI,OAAO,WAAW;AAAA,QACtB,aAAa;AAAA,QACb,SAAS,KAAK;AAAA,QACd,cAAc,KAAK;AAAA,QACnB,YAAY,KAAK;AAAA,QACjB,cAAc,KAAK;AAAA,QACnB,WAAW,oBAAI,KAAK;AAAA,QACpB,aAAa,oBAAI,KAAK;AAAA,MACxB,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,SAA0C;AAC7D,UAAM,SAAwB,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAC3D,UAAM,eAAe,OAAO,QAAQ,OAAO;AAE3C,QAAI,iBAAiB,MAAM,gBAAgB,OAAO,SAAS,GAAG;AAC5D,aAAO;AAAA,IACT;AAEA,WAAO,OAAO,eAAe,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,MAAmB,IAAqC;AAC1E,UAAM,MAAM,GAAG,IAAI,KAAK,EAAE;AAC1B,WAAO,KAAK,SAAS,GAAG,KAAK,iBAAiB;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKQ,cACN,SACA,UACsC;AACtC,QAAI,QAAQ,cAAc,SAAS,gBAAgB;AACjD,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,gBAAgB,QAAQ,WAAW,MAAM,SAAS,cAAc;AAAA,MAC1E;AAAA,IACF;AAEA,QAAI,QAAQ,aAAa,SAAS,eAAe;AAC/C,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,cAAc,QAAQ,UAAU,MAAM,SAAS,aAAa;AAAA,MACtE;AAAA,IACF;AAEA,QAAI,QAAQ,mBAAmB,SAAS,qBAAqB;AAC3D,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,sBAAsB,QAAQ,gBAAgB,MAAM,SAAS,mBAAmB;AAAA,MAC1F;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,IAAI,IAAI,QAAQ,aAAa,QAAQ,MAAM,MAAO,KAAK,KAAK;AAClF,QAAI,UAAU,SAAS,YAAY;AACjC,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,kBAAkB,QAAQ,QAAQ,CAAC,CAAC,WAAW,SAAS,UAAU;AAAA,MAC5E;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ,KAAK;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,QAKpB;AAED,UAAM,YAAY,oBAAI,IAA2B;AAEjD,eAAW,SAAS,QAAQ;AAC1B,YAAM,WAAW,UAAU,IAAI,MAAM,YAAY,KAAK,CAAC;AACvD,eAAS,KAAK,KAAK;AACnB,gBAAU,IAAI,MAAM,cAAc,QAAQ;AAAA,IAC5C;AAEA,UAAM,WAKD,CAAC;AAEN,eAAW,CAAC,KAAK,WAAW,KAAK,WAAW;AAC1C,UAAI,YAAY,UAAU,GAAG;AAC3B,iBAAS,KAAK;AAAA,UACZ;AAAA,UACA,aAAa,mBAAmB,IAAI,MAAM,GAAG,EAAE,CAAC;AAAA,UAChD,YAAY,KAAK,IAAI,GAAK,YAAY,SAAS,CAAC;AAAA,UAChD,UAAU,YAAY,IAAI,OAAK,EAAE,EAAE;AAAA,QACrC,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,QAKvB;AAED,UAAM,qBAAqB,CAAC,UAAU,QAAQ,QAAQ,UAAU,SAAS,UAAU;AACnF,UAAM,cAKD,CAAC;AAEN,eAAW,SAAS,QAAQ;AAC1B,UAAI,MAAM,cAAc;AAAe;AAEvC,YAAM,eAAe,MAAM,QAAQ,YAAY;AAC/C,iBAAW,WAAW,oBAAoB;AACxC,YAAI,aAAa,SAAS,OAAO,GAAG;AAClC,sBAAY,KAAK;AAAA,YACf,KAAK,cAAc,OAAO,IAAI,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC;AAAA,YAClD,aAAa,oBAAoB,MAAM,QAAQ,MAAM,GAAG,GAAG,CAAC;AAAA,YAC5D,YAAY;AAAA,YACZ,UAAU,CAAC,MAAM,EAAE;AAAA,UACrB,CAAC;AACD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAwD;AAC5D,WAAO,KAAK,WAAW,cAAc;AAAA,EACvC;AACF;AAKO,SAAS,yBAAyB,YAA4C;AACnF,SAAO,IAAI,mBAAmB,UAAU;AAC1C;;;ACnVA,IAAMC,kBAAoC;AAAA,EACxC,kBAAkB,iBAAiB;AAAA,EACnC,QAAQ,iBAAiB;AAAA,EACzB,qBAAqB,iBAAiB;AAAA,EACtC,eAAe;AACjB;AAEO,IAAM,cAAN,MAAkB;AAAA,EAGvB,YACU,IACR,QACA;AAFQ;AAGR,SAAK,SAAS,EAAE,GAAGA,iBAAgB,GAAG,OAAO;AAAA,EAC/C;AAAA,EAPiB;AAAA;AAAA;AAAA;AAAA,EAYjB,MAAM,UAAU,OAAe,SAA0C;AACvE,UAAM,eAAe,uBAAuB,QAAQ,OAAO,EAAE,QAAQ,CAAC;AAEtE,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,YAAY;AAAA,IACf;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAC9B,WAAO,KAAK,YAAY,KAAK,CAAC,CAAC;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,OAAe,SAA0C;AACzE,UAAM,eAAe,uBAAuB,QAAQ,OAAO,EAAE,QAAQ,CAAC;AAEtE,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA,CAAC,YAAY;AAAA,IACf;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAC9B,WAAO,KAAK,YAAY,KAAK,CAAC,CAAC;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,OAAe,SAAqE;AACrG,UAAM,gBAAgB,IAAI,MAAM,YAAY,CAAC;AAE7C,QAAI,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaV,UAAM,kBAAkB,MAAM,YAAY,EAAE,KAAK;AACjD,UAAM,SAAoB,CAAC,iBAAiB,IAAI,eAAe,KAAK,eAAe,aAAa;AAEhG,QAAI,SAAS;AACX,aAAO;AACP,aAAO,KAAK,OAAO;AAAA,IACrB;AAEA,WAAO;AACP,WAAO,KAAK,KAAK,OAAO,aAAa;AAErC,UAAM,OAAO,MAAM,MAA+B,KAAK,IAAI,KAAK,MAAM;AAEtE,WAAO,KAAK,IAAI,UAAQ;AAAA,MACtB,QAAQ,KAAK,YAAY,GAAG;AAAA,MAC5B,OAAO,IAAI;AAAA,IACb,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAM,OAAe,SAA4C;AAErE,UAAM,aAAa,MAAM,KAAK,UAAU,OAAO,OAAO;AACtD,QAAI,YAAY;AACd,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,OAAO;AAAA,MACT;AAAA,IACF;AAGA,UAAM,aAAa,MAAM,KAAK,YAAY,OAAO,OAAO;AACxD,QAAI,YAAY;AACd,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,OAAO;AAAA,MACT;AAAA,IACF;AAGA,UAAM,gBAAgB,MAAM,KAAK,aAAa,OAAO,OAAO;AAC5D,QAAI,cAAc,WAAW,GAAG;AAC9B,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,OAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,YAAY,cAAc,CAAC;AACjC,UAAM,cAAc,cAAc,SAAS,IAAI,cAAc,CAAC,EAAE,QAAQ;AAGxE,UAAM,MAAM,gBAAgB,OAAO,UAAU,QAAQ,cAAc;AAGnE,UAAM,aAAa,KAAK,mBAAmB,UAAU,OAAO,GAAG;AAG/D,QAAI,eAAe,QAAQ;AACzB,aAAO;AAAA,QACL,OAAO,UAAU;AAAA,QACjB,YAAY;AAAA,QACZ,OAAO,UAAU;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAGA,QAAI,eAAe,aAAa;AAC9B,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,OAAO,UAAU;AAAA,QACjB;AAAA,QACA,YAAY,cAAc,MAAM,GAAG,KAAK,OAAO,aAAa,EAAE,IAAI,OAAK,EAAE,MAAM;AAAA,MACjF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,OAAO,UAAU;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,OAAe,KAA8B;AACtE,UAAM,EAAE,kBAAkB,QAAQ,oBAAoB,IAAI,KAAK;AAG/D,QAAI,SAAS,oBAAoB,OAAO,QAAQ;AAC9C,aAAO;AAAA,IACT;AAGA,QAAI,SAAS,qBAAqB;AAChC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAwB,OAAe,SAAqC;AAChF,UAAM,gBAAgB,MAAM,KAAK,aAAa,OAAO,OAAO;AAC5D,WAAO,cACJ,OAAO,OAAK,EAAE,SAAS,KAAK,OAAO,mBAAmB,EACtD,MAAM,GAAG,KAAK,OAAO,aAAa,EAClC,IAAI,OAAK,EAAE,MAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,KAAsC;AACxD,WAAO;AAAA,MACL,UAAU,IAAI;AAAA,MACd,YAAY,IAAI;AAAA,MAChB,cAAc,IAAI;AAAA,MAClB,OAAO,IAAI;AAAA,MACX,OAAO,IAAI;AAAA,MACX,QAAQ,IAAI;AAAA,MACZ,aAAa,OAAO,IAAI,iBAAiB,WACrC,KAAK,MAAM,IAAI,YAAY,IAC3B,IAAI;AAAA,MACR,WAAW,IAAI;AAAA,MACf,YAAY,IAAI;AAAA,MAChB,WAAW,OAAO,IAAI,UAAU;AAAA,MAChC,WAAW,OAAO,IAAI,UAAU;AAAA,IAClC;AAAA,EACF;AACF;;;ACzOA,SAAS,cAAAC,mBAAkB;AAU3B,IAAM,cAAc;AACpB,IAAM,eAAe;AACrB,IAAM,uBAAuB;AAC7B,IAAM,kBAAkB;AAEjB,IAAM,kBAAN,MAAsB;AAAA,EAG3B,YACU,IACA,SAAgC,CAAC,GACzC;AAFQ;AACA;AAER,SAAK,cAAc,IAAI,YAAY,EAAE;AAAA,EACvC;AAAA,EAPQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBR,MAAM,eACJ,MACA,eACqB;AACrB,UAAM,cAAc,KAAK,KAAK;AAG9B,UAAM,cAAc,MAAM,KAAK,qBAAqB,WAAW;AAC/D,QAAI,aAAa;AACf,aAAO;AAAA,IACT;AAGA,QAAI,gBAAgB,KAAK,WAAW,GAAG;AACrC,YAAM,UAAU,MAAM,KAAK,mBAAmB,WAAW;AACzD,UAAI,SAAS;AACX,eAAO;AAAA,MACT;AAAA,IAEF;AAGA,UAAM,YAAY,MAAM,KAAK,YAAY,MAAM,aAAa,KAAK,OAAO,OAAO;AAE/E,QAAI,UAAU,eAAe,UAAU,UAAU,OAAO;AAEtD,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU,UAAU,MAAM;AAAA,QAC1B,SAAS;AAAA,QACT,YAAY,UAAU;AAAA,MACxB;AAAA,IACF;AAIA,UAAM,eAAe,MAAM,KAAK;AAAA,MAC9B;AAAA,MACA,UAAU;AAAA,IACZ;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACJ,OACA,eACuB;AACvB,UAAM,UAAwB,CAAC;AAE/B,eAAW,QAAQ,OAAO;AACxB,YAAM,MAAM,MAAM,KAAK,eAAe,MAAM,aAAa;AACzD,cAAQ,KAAK,GAAG;AAAA,IAClB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAqB,MAA0C;AAE3E,QAAI,CAAC,YAAY,KAAK,IAAI,KAAK,CAAC,aAAa,KAAK,IAAI,KAAK,CAAC,qBAAqB,KAAK,IAAI,GAAG;AAC3F,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,gBAAgB,IAAI;AAGzC,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK;AAAA,MACL;AAAA;AAAA,MAEA,CAAC,YAAY;AAAA,IACf;AAEA,QAAI;AAEJ,QAAI,SAAS,SAAS,GAAG;AACvB,iBAAW,SAAS,CAAC,EAAE;AAAA,IACzB,OAAO;AAEL,iBAAW,MAAM,KAAK,gBAAgB,MAAM,YAAY;AAAA,IAC1D;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBAAmB,QAA4C;AAE3E,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,MAAM;AAAA,IACT;AAEA,QAAI,KAAK,WAAW,GAAG;AACrB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,KAAK,CAAC,EAAE;AAAA,MAClB,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,uBACZ,MACA,YACqB;AACrB,UAAM,eAAe,uBAAuB,aAAa,MAAM;AAAA,MAC7D,SAAS,KAAK,OAAO;AAAA,IACvB,CAAC;AAGD,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK;AAAA,MACL;AAAA;AAAA,MAEA,CAAC,YAAY;AAAA,IACf;AAEA,QAAI;AAEJ,QAAI,SAAS,SAAS,GAAG;AACvB,iBAAW,SAAS,CAAC,EAAE;AAAA,IACzB,OAAO;AAEL,iBAAW,MAAM,KAAK,iBAAiB,MAAM,cAAc,UAAU;AAAA,IACvE;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,YAAY,YAAY,IAAI,OAAK,EAAE,QAAQ;AAAA,IAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBACZ,MACA,cACA,YACiB;AACjB,UAAM,WAAWC,YAAW;AAC5B,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAEnC,UAAM,cAAc;AAAA,MAClB;AAAA,MACA,UAAU;AAAA,MACV,YAAY,YAAY,IAAI,QAAM;AAAA,QAChC,UAAU,EAAE;AAAA,QACZ,OAAO,EAAE;AAAA,MACX,EAAE;AAAA,IACJ;AAEA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK,UAAU,WAAW;AAAA,QAC1B,KAAK,YAAY,EAAE,KAAK;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,aAAa,cAAc,QAAQ;AAAA,IACtC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBACZ,YACA,cACiB;AACjB,UAAM,WAAWA,YAAW;AAC5B,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAGnC,QAAI,eAAe;AACnB,QAAI,YAAY,KAAK,UAAU,GAAG;AAChC,qBAAe;AAAA,IACjB,WAAW,aAAa,KAAK,UAAU,GAAG;AACxC,qBAAe;AAAA,IACjB,WAAW,qBAAqB,KAAK,UAAU,GAAG;AAChD,qBAAe;AAAA,IACjB;AAEA,UAAM,cAAc;AAAA,MAClB;AAAA,MACA;AAAA,IACF;AAEA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK,UAAU,WAAW;AAAA,QAC1B,WAAW,YAAY;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,YAAY,cAAc,QAAQ;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,yBAAyB,WAAwC;AACrE,UAAM,OAAO,wBAAwB,SAAS;AAE9C,UAAM,MAAM,MAAM,KAAK,uBAAuB,IAAI;AAGlD,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,IAAI,QAAQ;AAAA,IACf;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,YAAY;AAAA,IACd;AAAA,EACF;AACF;;;ACtUA,SAAS,cAAAC,mBAAkB;AA4B3B,IAAM,oBAAsD;AAAA,EAC1D,SAAS,CAAC,eAAe,WAAW;AAAA,EACpC,aAAa,CAAC,WAAW,QAAQ,WAAW;AAAA,EAC5C,SAAS,CAAC,eAAe,QAAQ,WAAW;AAAA,EAC5C,MAAM,CAAC;AAAA;AAAA,EACP,WAAW,CAAC;AAAA;AACd;AAEO,IAAM,eAAN,MAAmB;AAAA,EAIxB,YACU,IACA,QACR;AAFQ;AACA;AAER,SAAK,cAAc,IAAI,YAAY,EAAE;AACrC,SAAK,kBAAkB,IAAI,gBAAgB,IAAI,EAAE,SAAS,OAAO,QAAQ,CAAC;AAAA,EAC5E;AAAA,EATQ;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBR,MAAM,YAAY,WAA0B,eAIzC;AACD,UAAM,SAAmB,CAAC;AAG1B,UAAM,EAAE,MAAM,OAAO,SAAS,cAAc,IAAI,MAAM,KAAK,iBAAiB,SAAS;AAErF,QAAI,SAAS,eAAe;AAC1B,aAAO,KAAK,aAAa;AAAA,IAC3B;AAGA,QAAI,UAAU,QAAQ;AACpB,YAAM,cAAc,MAAM,KAAK,mBAAmB,MAAM,UAAU,MAAM;AACxE,UAAI,aAAa;AACf,eAAO,KAAK,WAAW;AAAA,MACzB;AAAA,IACF;AAGA,QAAI,UAAU,UAAU;AACtB,YAAM,gBAAgB,MAAM,KAAK,qBAAqB,MAAM,UAAU,QAAQ;AAC9E,UAAI,eAAe;AACjB,eAAO,KAAK,aAAa;AAAA,MAC3B;AAAA,IACF;AAGA,QAAI,UAAU,aAAa,UAAU,UAAU,SAAS,GAAG;AACzD,YAAM,eAAe,MAAM,KAAK;AAAA,QAC9B;AAAA,QACA,UAAU;AAAA,QACV;AAAA,MACF;AACA,UAAI,cAAc;AAChB,eAAO,KAAK,YAAY;AAAA,MAC1B;AAAA,IACF,WAAW,UAAU,WAAW,WAAW;AAGzC,YAAM,eAAe,MAAM,KAAK,qBAAqB,IAAI;AACzD,UAAI,cAAc;AAChB,eAAO,KAAK,YAAY;AAAA,MAC1B;AAAA,IACF;AAEA,WAAO;AAAA,MACL,QAAQ,KAAK;AAAA,MACb;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAiB,WAI5B;AAED,UAAM,cAAc,MAAM,KAAK,YAAY,MAAM,UAAU,OAAO,UAAU,OAAO;AAEnF,QAAI,YAAY,eAAe,UAAU,YAAY,OAAO;AAC1D,aAAO;AAAA,QACL,MAAM,YAAY;AAAA,QAClB,OAAO;AAAA,MACT;AAAA,IACF;AAGA,UAAM,SAASC,YAAW;AAC1B,UAAM,eAAe,uBAAuB,QAAQ,UAAU,OAAO;AAAA,MACnE,SAAS,UAAU;AAAA,IACrB,CAAC;AAGD,QAAI,gBAAgB,UAAU,UAAU;AACxC,QAAI,kBAAkB,QAAQ;AAC5B,sBAAgB;AAAA,IAClB;AAEA,UAAM,MAAM,oBAAI,KAAK;AAErB,UAAM,cAAc;AAAA,MAClB,QAAQ;AAAA,MACR,UAAU,UAAU,YAAY;AAAA,MAChC,aAAa,UAAU;AAAA,MACvB,SAAS,UAAU,WAAW,KAAK,OAAO;AAAA,IAC5C;AAGA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA,KAAK,UAAU,WAAW;AAAA,QAC1B,UAAU,MAAM,YAAY,EAAE,KAAK;AAAA,QACnC,GAAG,UAAU,KAAK,IAAI,UAAU,eAAe,EAAE;AAAA,QACjD,IAAI,YAAY;AAAA,QAChB,IAAI,YAAY;AAAA,MAClB;AAAA,IACF;AAGA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,QAAQ,cAAc,MAAM;AAAA,IAC/B;AAGA,UAAM,UAAU,MAAM,KAAK,cAAc,gBAAgB;AAAA,MACvD;AAAA,MACA,OAAO,UAAU;AAAA,MACjB;AAAA,MACA;AAAA,MACA,UAAU,UAAU,YAAY;AAAA,MAChC,aAAa,UAAU;AAAA,MACvB,SAAS,UAAU,WAAW,KAAK,OAAO;AAAA,IAC5C,CAAC;AAGD,UAAM,OAAe;AAAA,MACnB,UAAU;AAAA,MACV,YAAY;AAAA,MACZ;AAAA,MACA,OAAO,UAAU;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR;AAAA,MACA,WAAW,UAAU,MAAM,YAAY,EAAE,KAAK;AAAA,MAC9C,YAAY,GAAG,UAAU,KAAK,IAAI,UAAU,eAAe,EAAE;AAAA,MAC7D,WAAW;AAAA,MACX,WAAW;AAAA,IACb;AAEA,WAAO,EAAE,MAAM,OAAO,MAAM,QAAQ;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBACZ,MACA,WACwB;AACxB,UAAM,cAAc,KAAK;AACzB,UAAM,gBAAgB,YAAY;AAElC,QAAI,kBAAkB,WAAW;AAC/B,aAAO;AAAA,IACT;AAGA,UAAM,kBAAkB,kBAAkB,aAAa,KAAK,CAAC;AAC7D,QAAI,CAAC,gBAAgB,SAAS,SAAS,GAAG;AAExC,aAAO,KAAK,cAAc,4BAA4B;AAAA,QACpD,QAAQ,KAAK;AAAA,QACb,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,QAAQ,2BAA2B,aAAa,OAAO,SAAS;AAAA,MAClE,CAAC;AAAA,IACH;AAGA,UAAM,UAAU,MAAM,KAAK,cAAc,uBAAuB;AAAA,MAC9D,QAAQ,KAAK;AAAA,MACb,YAAY;AAAA,MACZ,UAAU;AAAA,IACZ,CAAC;AAGD,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA,CAAC,YAAW,oBAAI,KAAK,GAAE,YAAY,GAAG,KAAK,QAAQ;AAAA,IACrD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBACZ,MACA,aACwB;AACxB,UAAM,cAAc,KAAK;AACzB,UAAM,kBAAkB,YAAY,YAAY;AAEhD,QAAI,oBAAoB,aAAa;AACnC,aAAO;AAAA,IACT;AAGA,UAAM,UAAU,MAAM,KAAK,cAAc,yBAAyB;AAAA,MAChE,QAAQ,KAAK;AAAA,MACb,cAAc;AAAA,MACd,YAAY;AAAA,IACd,CAAC;AAGD,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA,CAAC,cAAa,oBAAI,KAAK,GAAE,YAAY,GAAG,KAAK,QAAQ;AAAA,IACvD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eACZ,MACA,gBACA,eACwB;AAExB,UAAM,cAAc,MAAM,KAAK,gBAAgB,gBAAgB,cAAc;AAG7E,UAAM,OAAoB,KAAK,OAAO,kBAAkB,YAAY;AAGpE,UAAM,UAAU,MAAM,KAAK,cAAc,qBAAqB;AAAA,MAC5D,QAAQ,KAAK;AAAA,MACb;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAqB,MAAsC;AACvE,UAAM,iBAAiB,MAAM,KAAK,gBAAgB,yBAAyB,KAAK,KAAK;AAErF,UAAM,UAAU,MAAM,KAAK,cAAc,qBAAqB;AAAA,MAC5D,QAAQ,KAAK;AAAA,MACb,MAAM;AAAA,MACN,UAAU,CAAC,cAAc;AAAA,IAC3B,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cACZ,WACA,SACiB;AACjB,UAAM,UAAUA,YAAW;AAC3B,UAAM,MAAM,oBAAI,KAAK;AAGrB,UAAM,YAAY;AAAA,MAChB;AAAA,MACA,QAAQ;AAAA,MACR,KAAK,OAAO;AAAA,MACZ,KAAK,UAAU,OAAO;AAAA,IACxB;AAGA,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,SAAS;AAAA,IACZ;AAEA,QAAI,SAAS,SAAS,GAAG;AACvB,aAAO,SAAS,CAAC,EAAE;AAAA,IACrB;AAGA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA;AAAA,QACE;AAAA,QACA;AAAA,QACA,KAAK,OAAO;AAAA,QACZ,IAAI,YAAY;AAAA,QAChB,KAAK,UAAU,OAAO;AAAA,QACtB,cAAc,SAAS,IAAI,QAAQ,MAAM;AAAA,QACzC;AAAA,QACA,KAAK,UAAU,EAAE,QAAQ,gBAAgB,CAAC;AAAA,MAC5C;AAAA,IACF;AAGA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,WAAW,OAAO;AAAA,IACrB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBACJ,aACA,QACiB;AACjB,UAAM,UAAU,MAAM,KAAK,cAAc,yBAAyB;AAAA,MAChE;AAAA,MACA,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,IACF,CAAC;AAGD,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAACA,YAAW,GAAG,aAAa,QAAQ,KAAK,UAAU,EAAE,cAAa,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC,CAAC;AAAA,IAC/F;AAEA,WAAO;AAAA,EACT;AACF;;;AC/ZA,SAAS,cAAAC,mBAAkB;AAG3B,IAAM,iBAAiB;AACvB,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAeO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAAoB,IAAc;AAAd;AAAA,EAAe;AAAA;AAAA;AAAA;AAAA,EAKnC,MAAM,YAAuC;AAC3C,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,cAAc;AAAA,IACjB;AAEA,QAAI,KAAK,WAAW,GAAG;AACrB,aAAO,EAAE,aAAa,MAAM,eAAe,KAAK;AAAA,IAClD;AAEA,WAAO;AAAA,MACL,aAAa,KAAK,CAAC,EAAE;AAAA,MACrB,eAAe,KAAK,CAAC,EAAE,iBACnB,IAAI,KAAK,KAAK,CAAC,EAAE,cAAwB,IACzC;AAAA,IACN;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAa,SAAiB,WAAgC;AAC1E,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,CAAC,gBAAgB,SAAS,UAAU,YAAY,CAAC;AAAA,IACnD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBACJ,QACA,QAAgB,KACM;AACtB,QAAI,QAAQ;AAAA;AAAA;AAAA,6BAGa,iBAAiB,IAAI,MAAM,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA;AAEnE,UAAM,SAAoB,CAAC,GAAG,gBAAgB;AAE9C,QAAI,OAAO,iBAAiB,OAAO,aAAa;AAC9C,eAAS;AACT,aAAO;AAAA,QACL,OAAO,cAAc,YAAY;AAAA,QACjC,OAAO,cAAc,YAAY;AAAA,QACjC,OAAO;AAAA,MACT;AAAA,IACF;AAEA,aAAS;AACT,WAAO,KAAK,KAAK;AAEjB,UAAM,OAAO,MAAM,MAA+B,KAAK,IAAI,OAAO,MAAM;AAExE,WAAO,KAAK,IAAI,UAAQ;AAAA,MACtB,IAAI,IAAI;AAAA,MACR,WAAW,IAAI;AAAA,MACf,WAAW,IAAI;AAAA,MACf,WAAW,OAAO,IAAI,SAAS;AAAA,MAC/B,SAAS,OAAO,IAAI,YAAY,WAC5B,KAAK,MAAM,IAAI,OAAO,IACtB,IAAI;AAAA,IACV,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,YAAoB,KAAsB;AAC3D,UAAM,SAAS,MAAM,KAAK,UAAU;AACpC,UAAM,SAAS,MAAM,KAAK,iBAAiB,QAAQ,SAAS;AAE5D,QAAI,OAAO,WAAW,GAAG;AACvB,aAAO;AAAA,IACT;AAEA,eAAW,SAAS,QAAQ;AAC1B,YAAM,KAAK,aAAa,KAAK;AAC7B,YAAM,KAAK,aAAa,MAAM,IAAI,MAAM,SAAS;AAAA,IACnD;AAEA,WAAO,OAAO;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA8B;AAClC,QAAI,iBAAiB;AACrB,QAAI;AAEJ,OAAG;AACD,kBAAY,MAAM,KAAK,aAAa;AACpC,wBAAkB;AAAA,IACpB,SAAS,YAAY;AAErB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAa,OAAiC;AAC1D,YAAQ,MAAM,WAAW;AAAA,MACvB,KAAK;AAEH,cAAM,KAAK,wBAAwB,MAAM,QAAQ,QAAkB,YAAY;AAC/E;AAAA,MAEF,KAAK;AACH,cAAM,KAAK,oBAAoB,KAAK;AACpC;AAAA,MAEF,KAAK;AAEH;AAAA,MAEF,KAAK;AACH,cAAM,KAAK,kBAAkB,KAAK;AAClC;AAAA,MAEF,KAAK;AACH,cAAM,KAAK,wBAAwB,KAAK;AACxC;AAAA,MAEF,KAAK;AAEH;AAAA,IACJ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,oBAAoB,OAAiC;AACjE,UAAM,EAAE,QAAQ,SAAS,IAAI,MAAM;AAGnC,QAAI,aAAa,QAAQ;AACvB,YAAM;AAAA,QACJ,KAAK;AAAA,QACL;AAAA;AAAA,QAEA,CAAC,MAAM;AAAA,MACT;AAGA,YAAM;AAAA,QACJ,KAAK;AAAA,QACL;AAAA;AAAA;AAAA;AAAA,QAIA,CAAC,MAAM;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBAAkB,OAAiC;AAC/D,UAAM,EAAE,QAAQ,MAAM,SAAS,IAAI,MAAM;AAMzC,QAAI,SAAS,WAAW;AAEtB,YAAM;AAAA,QACJ,KAAK;AAAA,QACL;AAAA,QACA,CAAC,MAAM;AAAA,MACT;AAGA,iBAAW,WAAW,UAAU;AAC9B,cAAM,KAAK,kBAAkB,QAAQ,SAAS,YAAY;AAAA,MAC5D;AAGA,YAAM,aAAa,SAAS,IAAI,OAAK,EAAE,QAAQ;AAC/C,YAAM;AAAA,QACJ,KAAK;AAAA,QACL;AAAA;AAAA;AAAA;AAAA,QAIA,CAAC,KAAK,UAAU,UAAU,GAAG,MAAM;AAAA,MACrC;AAAA,IAEF,OAAO;AAGL,YAAM;AAAA,QACJ,KAAK;AAAA,QACL;AAAA,QACA,CAAC,MAAM;AAAA,MACT;AAGA,iBAAW,WAAW,UAAU;AAC9B,cAAM,KAAK,kBAAkB,QAAQ,SAAS,sBAAsB;AAAA,MACtE;AAGA,YAAM,gBAAgB,SAAS,IAAI,OAAK,EAAE,QAAQ;AAClD,YAAM;AAAA,QACJ,KAAK;AAAA,QACL;AAAA;AAAA;AAAA;AAAA,QAIA,CAAC,KAAK,UAAU,aAAa,GAAG,MAAM;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBACZ,QACA,SACA,SACe;AACf,UAAM,SAASA,YAAW;AAE1B,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,KAAK,UAAU;AAAA,UACb,MAAM,QAAQ;AAAA,UACd,SAAS,QAAQ;AAAA,UACjB,YAAY,QAAQ;AAAA,UACpB,YAAY,QAAQ;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,wBAAwB,OAAiC;AACrE,UAAM,EAAE,aAAa,WAAW,IAAI,MAAM;AAM1C,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA,CAAC,KAAK,UAAU,UAAU,GAAG,WAAW;AAAA,IAC1C;AAAA,EAGF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,wBAAwB,QAAgB,UAAiC;AACrF,UAAM,QAAQA,YAAW;AACzB,UAAM,mBAAmB;AAEzB,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,OAAO,UAAU,QAAQ,gBAAgB;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAA2B;AAE/B,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA,IACF;AAGA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA,MACA,CAAC,cAAc;AAAA,IACjB;AAGA,WAAO,KAAK,WAAW;AAAA,EACzB;AACF;",
|
|
6
|
-
"names": ["hash", "randomUUID", "randomUUID", "randomUUID", "randomUUID", "DEFAULT_CONFIG", "DEFAULT_CONFIG", "createHash", "DEFAULT_OPTIONS", "DEFAULT_CONFIG", "randomUUID", "randomUUID", "randomUUID", "randomUUID", "randomUUID"]
|
|
3
|
+
"sources": ["../../src/core/types.ts", "../../src/core/canonical-key.ts", "../../src/core/event-store.ts", "../../src/core/db-wrapper.ts", "../../src/core/entity-repo.ts", "../../src/core/edge-repo.ts", "../../src/core/vector-store.ts", "../../src/core/embedder.ts", "../../src/core/vector-outbox.ts", "../../src/core/vector-worker.ts", "../../src/core/matcher.ts", "../../src/core/evidence-aligner.ts", "../../src/core/retriever.ts", "../../src/core/graduation.ts", "../../src/core/task/task-matcher.ts", "../../src/core/task/blocker-resolver.ts", "../../src/core/task/task-resolver.ts", "../../src/core/task/task-projector.ts", "../../src/core/shared-event-store.ts", "../../src/core/shared-store.ts", "../../src/core/shared-vector-store.ts", "../../src/core/shared-promoter.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Core types for code-memory plugin\n * Idris2 inspired: Complete, immutable type definitions with Zod validation\n */\n\nimport { z } from 'zod';\n\n// ============================================================\n// Event Types\n// ============================================================\n\nexport const EventTypeSchema = z.enum([\n 'user_prompt',\n 'agent_response',\n 'session_summary',\n 'tool_observation'\n]);\nexport type EventType = z.infer<typeof EventTypeSchema>;\n\n// ============================================================\n// Memory Event (L0 EventStore)\n// ============================================================\n\nexport const MemoryEventSchema = z.object({\n id: z.string().uuid(),\n eventType: EventTypeSchema,\n sessionId: z.string(),\n timestamp: z.date(),\n content: z.string(),\n canonicalKey: z.string(),\n dedupeKey: z.string(),\n metadata: z.record(z.unknown()).optional()\n});\nexport type MemoryEvent = z.infer<typeof MemoryEventSchema>;\n\n// Input for creating new events (id, dedupeKey generated automatically)\nexport const MemoryEventInputSchema = MemoryEventSchema.omit({\n id: true,\n dedupeKey: true,\n canonicalKey: true\n});\nexport type MemoryEventInput = z.infer<typeof MemoryEventInputSchema>;\n\n// ============================================================\n// Session\n// ============================================================\n\nexport const SessionSchema = z.object({\n id: z.string(),\n startedAt: z.date(),\n endedAt: z.date().optional(),\n projectPath: z.string().optional(),\n summary: z.string().optional(),\n tags: z.array(z.string()).optional()\n});\nexport type Session = z.infer<typeof SessionSchema>;\n\n// ============================================================\n// Insight (L1 Structured)\n// ============================================================\n\nexport const InsightTypeSchema = z.enum([\n 'preference',\n 'pattern',\n 'expertise'\n]);\nexport type InsightType = z.infer<typeof InsightTypeSchema>;\n\nexport const InsightSchema = z.object({\n id: z.string().uuid(),\n insightType: InsightTypeSchema,\n content: z.string(),\n canonicalKey: z.string(),\n confidence: z.number().min(0).max(1),\n sourceEvents: z.array(z.string().uuid()),\n createdAt: z.date(),\n lastUpdated: z.date()\n});\nexport type Insight = z.infer<typeof InsightSchema>;\n\n// ============================================================\n// Memory Match (Search Result)\n// ============================================================\n\nexport const MemoryMatchSchema = z.object({\n event: MemoryEventSchema,\n score: z.number().min(0).max(1),\n relevanceReason: z.string().optional()\n});\nexport type MemoryMatch = z.infer<typeof MemoryMatchSchema>;\n\n// ============================================================\n// Match Confidence (AXIOMMIND)\n// ============================================================\n\nexport const MatchConfidenceSchema = z.enum(['high', 'suggested', 'none']);\nexport type MatchConfidence = z.infer<typeof MatchConfidenceSchema>;\n\nexport const MatchResultSchema = z.object({\n match: MemoryMatchSchema.nullable(),\n confidence: MatchConfidenceSchema,\n gap: z.number().optional(),\n alternatives: z.array(MemoryMatchSchema).optional()\n});\nexport type MatchResult = z.infer<typeof MatchResultSchema>;\n\n// AXIOMMIND Matching Thresholds\nexport const MATCH_THRESHOLDS = {\n minCombinedScore: 0.92,\n minGap: 0.03,\n suggestionThreshold: 0.75\n} as const;\n\n// ============================================================\n// Memory Level (Graduation Pipeline)\n// ============================================================\n\nexport const MemoryLevelSchema = z.enum(['L0', 'L1', 'L2', 'L3', 'L4']);\nexport type MemoryLevel = z.infer<typeof MemoryLevelSchema>;\n\nexport const GraduationResultSchema = z.object({\n eventId: z.string().uuid(),\n fromLevel: MemoryLevelSchema,\n toLevel: MemoryLevelSchema,\n success: z.boolean(),\n reason: z.string().optional()\n});\nexport type GraduationResult = z.infer<typeof GraduationResultSchema>;\n\n// ============================================================\n// Evidence Span (AXIOMMIND Principle 4)\n// ============================================================\n\nexport const EvidenceSpanSchema = z.object({\n start: z.number().int().nonnegative(),\n end: z.number().int().positive(),\n confidence: z.number().min(0).max(1),\n matchType: z.enum(['exact', 'fuzzy', 'none']),\n originalQuote: z.string(),\n alignedText: z.string()\n});\nexport type EvidenceSpan = z.infer<typeof EvidenceSpanSchema>;\n\n// ============================================================\n// Configuration\n// ============================================================\n\nexport const ConfigSchema = z.object({\n storage: z.object({\n path: z.string().default('~/.claude-code/memory'),\n maxSizeMB: z.number().default(500)\n }).default({}),\n embedding: z.object({\n provider: z.enum(['local', 'openai']).default('local'),\n model: z.string().default('Xenova/all-MiniLM-L6-v2'),\n openaiModel: z.string().default('text-embedding-3-small'),\n batchSize: z.number().default(32)\n }).default({}),\n retrieval: z.object({\n topK: z.number().default(5),\n minScore: z.number().default(0.7),\n maxTokens: z.number().default(2000)\n }).default({}),\n matching: z.object({\n minCombinedScore: z.number().default(0.92),\n minGap: z.number().default(0.03),\n suggestionThreshold: z.number().default(0.75),\n weights: z.object({\n semanticSimilarity: z.number().default(0.4),\n ftsScore: z.number().default(0.25),\n recencyBonus: z.number().default(0.2),\n statusWeight: z.number().default(0.15)\n }).default({})\n }).default({}),\n privacy: z.object({\n excludePatterns: z.array(z.string()).default(['password', 'secret', 'api_key', 'token', 'bearer']),\n anonymize: z.boolean().default(false),\n privateTags: z.object({\n enabled: z.boolean().default(true),\n marker: z.enum(['[PRIVATE]', '[REDACTED]', '']).default('[PRIVATE]'),\n preserveLineCount: z.boolean().default(false),\n supportedFormats: z.array(z.enum(['xml', 'bracket', 'comment'])).default(['xml'])\n }).default({})\n }).default({}),\n toolObservation: z.object({\n enabled: z.boolean().default(true),\n excludedTools: z.array(z.string()).default(['TodoWrite', 'TodoRead']),\n maxOutputLength: z.number().default(10000),\n maxOutputLines: z.number().default(100),\n storeOnlyOnSuccess: z.boolean().default(false)\n }).default({}),\n features: z.object({\n autoSave: z.boolean().default(true),\n sessionSummary: z.boolean().default(true),\n insightExtraction: z.boolean().default(true),\n crossProjectLearning: z.boolean().default(false),\n singleWriterMode: z.boolean().default(true),\n sharedStore: z.object({\n enabled: z.boolean().default(true),\n autoPromote: z.boolean().default(true),\n searchShared: z.boolean().default(true),\n minConfidenceForPromotion: z.number().default(0.8),\n sharedStoragePath: z.string().default('~/.claude-code/memory/shared')\n }).default({})\n }).default({}),\n mode: z.enum(['session', 'endless']).default('session'),\n endless: z.object({\n enabled: z.boolean().default(false),\n workingSet: z.object({\n maxEvents: z.number().default(100),\n timeWindowHours: z.number().default(24),\n minRelevanceScore: z.number().default(0.5)\n }).default({}),\n consolidation: z.object({\n triggerIntervalMs: z.number().default(3600000),\n triggerEventCount: z.number().default(100),\n triggerIdleMs: z.number().default(1800000),\n useLLMSummarization: z.boolean().default(false)\n }).default({}),\n continuity: z.object({\n minScoreForSeamless: z.number().default(0.7),\n topicDecayHours: z.number().default(48)\n }).default({})\n }).optional()\n});\nexport type Config = z.infer<typeof ConfigSchema>;\n\n// ============================================================\n// Append Result (AXIOMMIND Principle 2: Append-only)\n// ============================================================\n\nexport type AppendResult =\n | { success: true; eventId: string; isDuplicate: false }\n | { success: true; eventId: string; isDuplicate: true }\n | { success: false; error: string };\n\n// ============================================================\n// Hook Input/Output Types\n// ============================================================\n\nexport interface SessionStartInput {\n session_id: string;\n cwd: string;\n}\n\nexport interface SessionStartOutput {\n context?: string;\n}\n\nexport interface UserPromptSubmitInput {\n session_id: string;\n prompt: string;\n}\n\nexport interface UserPromptSubmitOutput {\n context?: string;\n}\n\nexport interface StopInput {\n session_id: string;\n stop_reason: string;\n messages: Array<{ role: string; content: string }>;\n}\n\nexport interface SessionEndInput {\n session_id: string;\n}\n\n// PostToolUse Hook Input\nexport interface PostToolUseInput {\n tool_name: string;\n tool_input: Record<string, unknown>;\n tool_output: string;\n tool_error?: string;\n session_id: string;\n started_at: string;\n ended_at: string;\n}\n\n// ============================================================\n// Tool Observation Types\n// ============================================================\n\nexport const ToolMetadataSchema = z.object({\n filePath: z.string().optional(),\n fileType: z.string().optional(),\n lineCount: z.number().optional(),\n command: z.string().optional(),\n exitCode: z.number().optional(),\n pattern: z.string().optional(),\n matchCount: z.number().optional(),\n url: z.string().optional(),\n statusCode: z.number().optional()\n});\nexport type ToolMetadata = z.infer<typeof ToolMetadataSchema>;\n\nexport const ToolObservationPayloadSchema = z.object({\n toolName: z.string(),\n toolInput: z.record(z.unknown()),\n toolOutput: z.string(),\n durationMs: z.number(),\n success: z.boolean(),\n errorMessage: z.string().optional(),\n metadata: ToolMetadataSchema.optional()\n});\nexport type ToolObservationPayload = z.infer<typeof ToolObservationPayloadSchema>;\n\n// ============================================================\n// Vector Record\n// ============================================================\n\nexport interface VectorRecord {\n id: string;\n eventId: string;\n sessionId: string;\n eventType: string;\n content: string;\n vector: number[];\n timestamp: string;\n metadata?: Record<string, unknown>;\n}\n\n// ============================================================\n// Outbox Item (Single-Writer Pattern)\n// ============================================================\n\nexport interface OutboxItem {\n id: string;\n eventId: string;\n content: string;\n status: 'pending' | 'processing' | 'done' | 'failed';\n retryCount: number;\n createdAt: Date;\n errorMessage?: string;\n}\n\n// ============================================================\n// Entity Types (Task, Condition, Artifact)\n// ============================================================\n\nexport const EntityTypeSchema = z.enum(['task', 'condition', 'artifact']);\nexport type EntityType = z.infer<typeof EntityTypeSchema>;\n\nexport const TaskStatusSchema = z.enum([\n 'pending',\n 'in_progress',\n 'blocked',\n 'done',\n 'cancelled'\n]);\nexport type TaskStatus = z.infer<typeof TaskStatusSchema>;\n\nexport const TaskPrioritySchema = z.enum(['low', 'medium', 'high', 'critical']);\nexport type TaskPriority = z.infer<typeof TaskPrioritySchema>;\n\nexport const EntityStageSchema = z.enum([\n 'raw',\n 'working',\n 'candidate',\n 'verified',\n 'certified'\n]);\nexport type EntityStage = z.infer<typeof EntityStageSchema>;\n\nexport const EntityStatusSchema = z.enum([\n 'active',\n 'contested',\n 'deprecated',\n 'superseded'\n]);\nexport type EntityStatus = z.infer<typeof EntityStatusSchema>;\n\n// Base Entity schema\nexport const EntitySchema = z.object({\n entityId: z.string(),\n entityType: EntityTypeSchema,\n canonicalKey: z.string(),\n title: z.string(),\n stage: EntityStageSchema,\n status: EntityStatusSchema,\n currentJson: z.record(z.unknown()),\n titleNorm: z.string().optional(),\n searchText: z.string().optional(),\n createdAt: z.date(),\n updatedAt: z.date()\n});\nexport type Entity = z.infer<typeof EntitySchema>;\n\n// Task-specific current_json structure\nexport const TaskCurrentJsonSchema = z.object({\n status: TaskStatusSchema,\n priority: TaskPrioritySchema.optional(),\n blockers: z.array(z.string()).optional(),\n blockerSuggestions: z.array(z.string()).optional(),\n description: z.string().optional(),\n project: z.string().optional()\n});\nexport type TaskCurrentJson = z.infer<typeof TaskCurrentJsonSchema>;\n\n// Entity alias for canonical key lookup\nexport const EntityAliasSchema = z.object({\n entityType: EntityTypeSchema,\n canonicalKey: z.string(),\n entityId: z.string(),\n isPrimary: z.boolean()\n});\nexport type EntityAlias = z.infer<typeof EntityAliasSchema>;\n\n// ============================================================\n// Edge Types (Relationships)\n// ============================================================\n\nexport const NodeTypeSchema = z.enum(['entry', 'entity', 'event']);\nexport type NodeType = z.infer<typeof NodeTypeSchema>;\n\nexport const RelationTypeSchema = z.enum([\n 'evidence_of',\n 'blocked_by',\n 'blocked_by_suggested',\n 'resolves_to',\n 'derived_from',\n 'supersedes',\n 'source_of'\n]);\nexport type RelationType = z.infer<typeof RelationTypeSchema>;\n\nexport const EdgeSchema = z.object({\n edgeId: z.string(),\n srcType: NodeTypeSchema,\n srcId: z.string(),\n relType: RelationTypeSchema,\n dstType: NodeTypeSchema,\n dstId: z.string(),\n metaJson: z.record(z.unknown()).optional(),\n createdAt: z.date()\n});\nexport type Edge = z.infer<typeof EdgeSchema>;\n\n// ============================================================\n// Task Event Types (SoT for Task Entity)\n// ============================================================\n\nexport const TaskEventTypeSchema = z.enum([\n 'task_created',\n 'task_status_changed',\n 'task_priority_changed',\n 'task_blockers_set',\n 'task_transition_rejected',\n 'condition_declared',\n 'artifact_declared',\n 'condition_resolved_to'\n]);\nexport type TaskEventType = z.infer<typeof TaskEventTypeSchema>;\n\nexport const BlockerModeSchema = z.enum(['replace', 'suggest']);\nexport type BlockerMode = z.infer<typeof BlockerModeSchema>;\n\nexport const BlockerKindSchema = z.enum(['task', 'condition', 'artifact']);\nexport type BlockerKind = z.infer<typeof BlockerKindSchema>;\n\nexport const BlockerRefSchema = z.object({\n kind: BlockerKindSchema,\n entityId: z.string(),\n rawText: z.string().optional(),\n confidence: z.number().min(0).max(1).optional(),\n candidates: z.array(z.string()).optional()\n});\nexport type BlockerRef = z.infer<typeof BlockerRefSchema>;\n\n// Task event payloads\nexport const TaskCreatedPayloadSchema = z.object({\n taskId: z.string(),\n title: z.string(),\n canonicalKey: z.string(),\n initialStatus: TaskStatusSchema,\n priority: TaskPrioritySchema.optional(),\n description: z.string().optional(),\n project: z.string().optional()\n});\nexport type TaskCreatedPayload = z.infer<typeof TaskCreatedPayloadSchema>;\n\nexport const TaskStatusChangedPayloadSchema = z.object({\n taskId: z.string(),\n fromStatus: TaskStatusSchema,\n toStatus: TaskStatusSchema,\n reason: z.string().optional()\n});\nexport type TaskStatusChangedPayload = z.infer<typeof TaskStatusChangedPayloadSchema>;\n\nexport const TaskBlockersSetPayloadSchema = z.object({\n taskId: z.string(),\n mode: BlockerModeSchema,\n blockers: z.array(BlockerRefSchema),\n sourceEntryId: z.string().optional()\n});\nexport type TaskBlockersSetPayload = z.infer<typeof TaskBlockersSetPayloadSchema>;\n\n// ============================================================\n// Entry Types (Immutable memory units)\n// ============================================================\n\nexport const EntryTypeSchema = z.enum([\n 'fact',\n 'decision',\n 'insight',\n 'task_note',\n 'reference',\n 'preference',\n 'pattern',\n 'troubleshooting'\n]);\nexport type EntryType = z.infer<typeof EntryTypeSchema>;\n\nexport const EntrySchema = z.object({\n entryId: z.string(),\n createdTs: z.date(),\n entryType: EntryTypeSchema,\n title: z.string(),\n contentJson: z.record(z.unknown()),\n stage: EntityStageSchema,\n status: EntityStatusSchema,\n supersededBy: z.string().optional(),\n buildId: z.string().optional(),\n evidenceJson: z.record(z.unknown()).optional(),\n canonicalKey: z.string()\n});\nexport type Entry = z.infer<typeof EntrySchema>;\n\n// ============================================================\n// Evidence Aligner V2 Types\n// ============================================================\n\nexport const ExtractedEvidenceSchema = z.object({\n messageIndex: z.number().int().nonnegative(),\n quote: z.string()\n});\nexport type ExtractedEvidence = z.infer<typeof ExtractedEvidenceSchema>;\n\nexport const AlignedEvidenceSchema = z.object({\n messageIndex: z.number().int().nonnegative(),\n quote: z.string(),\n spanStart: z.number().int().nonnegative(),\n spanEnd: z.number().int().positive(),\n quoteHash: z.string(),\n confidence: z.number().min(0).max(1),\n matchMethod: z.enum(['exact', 'normalized', 'fuzzy'])\n});\nexport type AlignedEvidence = z.infer<typeof AlignedEvidenceSchema>;\n\nexport const FailedEvidenceSchema = z.object({\n messageIndex: z.number().int().nonnegative(),\n quote: z.string(),\n failureReason: z.enum(['not_found', 'below_threshold', 'ambiguous', 'empty_quote', 'invalid_index'])\n});\nexport type FailedEvidence = z.infer<typeof FailedEvidenceSchema>;\n\nexport const EvidenceAlignResultSchema = z.discriminatedUnion('aligned', [\n z.object({ aligned: z.literal(true), evidence: AlignedEvidenceSchema }),\n z.object({ aligned: z.literal(false), evidence: FailedEvidenceSchema })\n]);\nexport type EvidenceAlignResult = z.infer<typeof EvidenceAlignResultSchema>;\n\n// ============================================================\n// Vector Outbox V2 Types\n// ============================================================\n\nexport const OutboxStatusSchema = z.enum(['pending', 'processing', 'done', 'failed']);\nexport type OutboxStatus = z.infer<typeof OutboxStatusSchema>;\n\nexport const OutboxItemKindSchema = z.enum(['entry', 'task_title', 'event']);\nexport type OutboxItemKind = z.infer<typeof OutboxItemKindSchema>;\n\nexport const OutboxJobSchema = z.object({\n jobId: z.string(),\n itemKind: OutboxItemKindSchema,\n itemId: z.string(),\n embeddingVersion: z.string(),\n status: OutboxStatusSchema,\n retryCount: z.number().int().nonnegative(),\n error: z.string().optional(),\n createdAt: z.date(),\n updatedAt: z.date()\n});\nexport type OutboxJob = z.infer<typeof OutboxJobSchema>;\n\n// Valid state transitions for outbox\nexport const VALID_OUTBOX_TRANSITIONS: Array<{ from: OutboxStatus; to: OutboxStatus }> = [\n { from: 'pending', to: 'processing' },\n { from: 'processing', to: 'done' },\n { from: 'processing', to: 'failed' },\n { from: 'failed', to: 'pending' }\n];\n\n// ============================================================\n// Build Runs (Pipeline metadata)\n// ============================================================\n\nexport const BuildRunSchema = z.object({\n buildId: z.string(),\n startedAt: z.date(),\n finishedAt: z.date().optional(),\n extractorModel: z.string(),\n extractorPromptHash: z.string(),\n embedderModel: z.string(),\n embeddingVersion: z.string(),\n idrisVersion: z.string(),\n schemaVersion: z.string(),\n status: z.enum(['running', 'success', 'failed']),\n error: z.string().optional()\n});\nexport type BuildRun = z.infer<typeof BuildRunSchema>;\n\n// ============================================================\n// Pipeline Metrics\n// ============================================================\n\nexport const PipelineMetricSchema = z.object({\n id: z.string(),\n ts: z.date(),\n stage: z.string(),\n latencyMs: z.number(),\n success: z.boolean(),\n error: z.string().optional(),\n sessionId: z.string().optional()\n});\nexport type PipelineMetric = z.infer<typeof PipelineMetricSchema>;\n\n// ============================================================\n// Progressive Disclosure Types\n// ============================================================\n\n// Layer 1: Search Index (lightweight)\nexport const SearchIndexItemSchema = z.object({\n id: z.string(),\n summary: z.string().max(100),\n score: z.number(),\n type: z.enum(['user_prompt', 'agent_response', 'session_summary', 'tool_observation']),\n timestamp: z.date(),\n sessionId: z.string()\n});\nexport type SearchIndexItem = z.infer<typeof SearchIndexItemSchema>;\n\n// Layer 2: Timeline\nexport const TimelineItemSchema = z.object({\n id: z.string(),\n timestamp: z.date(),\n type: z.enum(['user_prompt', 'agent_response', 'session_summary', 'tool_observation']),\n preview: z.string().max(200),\n isTarget: z.boolean()\n});\nexport type TimelineItem = z.infer<typeof TimelineItemSchema>;\n\n// Layer 3: Full Detail\nexport const FullDetailSchema = z.object({\n id: z.string(),\n content: z.string(),\n type: z.enum(['user_prompt', 'agent_response', 'session_summary', 'tool_observation']),\n timestamp: z.date(),\n sessionId: z.string(),\n citationId: z.string().optional(),\n metadata: z.object({\n tokenCount: z.number(),\n hasCode: z.boolean(),\n files: z.array(z.string()).optional(),\n tools: z.array(z.string()).optional()\n })\n});\nexport type FullDetail = z.infer<typeof FullDetailSchema>;\n\n// Progressive Search Result\nexport const ProgressiveSearchResultSchema = z.object({\n index: z.array(SearchIndexItemSchema),\n timeline: z.array(TimelineItemSchema).optional(),\n details: z.array(FullDetailSchema).optional(),\n meta: z.object({\n totalMatches: z.number(),\n expandedCount: z.number(),\n estimatedTokens: z.number(),\n expansionReason: z.string().optional()\n })\n});\nexport type ProgressiveSearchResult = z.infer<typeof ProgressiveSearchResultSchema>;\n\n// Progressive Disclosure Config\nexport const ProgressiveDisclosureConfigSchema = z.object({\n enabled: z.boolean().default(true),\n layer1: z.object({\n topK: z.number().default(10),\n minScore: z.number().default(0.7)\n }).default({}),\n autoExpand: z.object({\n enabled: z.boolean().default(true),\n highConfidenceThreshold: z.number().default(0.92),\n scoreGapThreshold: z.number().default(0.1),\n maxAutoExpandCount: z.number().default(3)\n }).default({}),\n tokenBudget: z.object({\n maxTotalTokens: z.number().default(2000),\n layer1PerItem: z.number().default(50),\n layer2PerItem: z.number().default(40),\n layer3PerItem: z.number().default(500)\n }).default({})\n});\nexport type ProgressiveDisclosureConfig = z.infer<typeof ProgressiveDisclosureConfigSchema>;\n\n// ============================================================\n// Citation Types\n// ============================================================\n\nexport const CitationSchema = z.object({\n citationId: z.string().length(6),\n eventId: z.string(),\n createdAt: z.date()\n});\nexport type Citation = z.infer<typeof CitationSchema>;\n\nexport const CitationUsageSchema = z.object({\n usageId: z.string(),\n citationId: z.string(),\n sessionId: z.string(),\n usedAt: z.date(),\n context: z.string().optional()\n});\nexport type CitationUsage = z.infer<typeof CitationUsageSchema>;\n\nexport interface CitedSearchResult {\n event: MemoryEvent;\n citation: Citation;\n score: number;\n}\n\nexport interface CitationStats {\n usageCount: number;\n lastUsed: Date | null;\n}\n\n// ============================================================\n// Endless Mode Types\n// ============================================================\n\nexport const MemoryModeSchema = z.enum(['session', 'endless']);\nexport type MemoryMode = z.infer<typeof MemoryModeSchema>;\n\nexport const EndlessModeConfigSchema = z.object({\n enabled: z.boolean().default(false),\n\n workingSet: z.object({\n maxEvents: z.number().default(100),\n timeWindowHours: z.number().default(24),\n minRelevanceScore: z.number().default(0.5)\n }).default({}),\n\n consolidation: z.object({\n triggerIntervalMs: z.number().default(3600000), // 1 hour\n triggerEventCount: z.number().default(100),\n triggerIdleMs: z.number().default(1800000), // 30 minutes\n useLLMSummarization: z.boolean().default(false)\n }).default({}),\n\n continuity: z.object({\n minScoreForSeamless: z.number().default(0.7),\n topicDecayHours: z.number().default(48)\n }).default({})\n});\nexport type EndlessModeConfig = z.infer<typeof EndlessModeConfigSchema>;\n\n// Working Set Item\nexport const WorkingSetItemSchema = z.object({\n id: z.string(),\n eventId: z.string(),\n addedAt: z.date(),\n relevanceScore: z.number(),\n topics: z.array(z.string()).optional(),\n expiresAt: z.date()\n});\nexport type WorkingSetItem = z.infer<typeof WorkingSetItemSchema>;\n\n// Working Set\nexport interface WorkingSet {\n recentEvents: MemoryEvent[];\n lastActivity: Date;\n continuityScore: number;\n}\n\n// Consolidated Memory\nexport const ConsolidatedMemorySchema = z.object({\n memoryId: z.string(),\n summary: z.string(),\n topics: z.array(z.string()),\n sourceEvents: z.array(z.string()),\n confidence: z.number(),\n createdAt: z.date(),\n accessedAt: z.date().optional(),\n accessCount: z.number().default(0)\n});\nexport type ConsolidatedMemory = z.infer<typeof ConsolidatedMemorySchema>;\n\n// Consolidated Memory Input (for creation)\nexport interface ConsolidatedMemoryInput {\n summary: string;\n topics: string[];\n sourceEvents: string[];\n confidence: number;\n}\n\n// Event Group (for consolidation)\nexport interface EventGroup {\n topics: string[];\n events: MemoryEvent[];\n}\n\n// Context Snapshot (for continuity calculation)\nexport interface ContextSnapshot {\n id: string;\n timestamp: number;\n topics: string[];\n files: string[];\n entities: string[];\n}\n\n// Transition Type\nexport const TransitionTypeSchema = z.enum(['seamless', 'topic_shift', 'break']);\nexport type TransitionType = z.infer<typeof TransitionTypeSchema>;\n\n// Continuity Score Result\nexport interface ContinuityScore {\n score: number;\n transitionType: TransitionType;\n}\n\n// Continuity Log\nexport const ContinuityLogSchema = z.object({\n logId: z.string(),\n fromContextId: z.string().optional(),\n toContextId: z.string().optional(),\n continuityScore: z.number(),\n transitionType: TransitionTypeSchema,\n createdAt: z.date()\n});\nexport type ContinuityLog = z.infer<typeof ContinuityLogSchema>;\n\n// Endless Mode Status\nexport interface EndlessModeStatus {\n mode: MemoryMode;\n workingSetSize: number;\n continuityScore: number;\n consolidatedCount: number;\n lastConsolidation: Date | null;\n}\n\n// ============================================================\n// Shared Store Types (Cross-Project Knowledge)\n// ============================================================\n\nexport const SharedEntryTypeSchema = z.enum([\n 'troubleshooting',\n 'best_practice',\n 'common_error'\n]);\nexport type SharedEntryType = z.infer<typeof SharedEntryTypeSchema>;\n\nexport const SharedTroubleshootingEntrySchema = z.object({\n entryId: z.string(),\n sourceProjectHash: z.string(),\n sourceEntryId: z.string(),\n title: z.string(),\n symptoms: z.array(z.string()),\n rootCause: z.string(),\n solution: z.string(),\n topics: z.array(z.string()),\n technologies: z.array(z.string()).optional(),\n confidence: z.number().min(0).max(1),\n usageCount: z.number().default(0),\n lastUsedAt: z.date().optional(),\n promotedAt: z.date(),\n createdAt: z.date()\n});\nexport type SharedTroubleshootingEntry = z.infer<typeof SharedTroubleshootingEntrySchema>;\n\nexport interface SharedTroubleshootingInput {\n sourceProjectHash: string;\n sourceEntryId: string;\n title: string;\n symptoms: string[];\n rootCause: string;\n solution: string;\n topics: string[];\n technologies?: string[];\n confidence: number;\n}\n\nexport const SharedStoreConfigSchema = z.object({\n enabled: z.boolean().default(true),\n autoPromote: z.boolean().default(true),\n searchShared: z.boolean().default(true),\n minConfidenceForPromotion: z.number().default(0.8),\n sharedStoragePath: z.string().default('~/.claude-code/memory/shared')\n});\nexport type SharedStoreConfig = z.infer<typeof SharedStoreConfigSchema>;\n\n// Shared search result\nexport interface SharedSearchResult {\n id: string;\n entryId: string;\n content: string;\n score: number;\n entryType: SharedEntryType;\n}\n", "/**\n * AXIOMMIND canonical_key.py port\n * Deterministic normalization ensuring identical titles always map to same keys\n */\n\nimport { createHash } from 'crypto';\n\nconst MAX_KEY_LENGTH = 200;\n\n/**\n * Convert text to a normalized canonical key\n *\n * Normalization steps:\n * 1. NFKC unicode normalization\n * 2. Lowercase conversion\n * 3. Punctuation removal\n * 4. Consecutive whitespace cleanup\n * 5. Context addition (optional)\n * 6. Long key truncation with MD5\n */\nexport function makeCanonicalKey(\n title: string,\n context?: { project?: string; sessionId?: string }\n): string {\n // Step 1: NFKC normalization\n let normalized = title.normalize('NFKC');\n\n // Step 2: Lowercase conversion\n normalized = normalized.toLowerCase();\n\n // Step 3: Punctuation removal (unicode compatible)\n normalized = normalized.replace(/[^\\p{L}\\p{N}\\s]/gu, '');\n\n // Step 4: Consecutive whitespace cleanup\n normalized = normalized.replace(/\\s+/g, ' ').trim();\n\n // Step 5: Context addition\n let key = normalized;\n if (context?.project) {\n key = `${context.project}::${key}`;\n }\n\n // Step 6: Long key handling\n if (key.length > MAX_KEY_LENGTH) {\n const hashSuffix = createHash('md5').update(key).digest('hex').slice(0, 8);\n key = key.slice(0, MAX_KEY_LENGTH - 9) + '_' + hashSuffix;\n }\n\n return key;\n}\n\n/**\n * Check if two texts have the same canonical key\n */\nexport function isSameCanonicalKey(a: string, b: string): boolean {\n return makeCanonicalKey(a) === makeCanonicalKey(b);\n}\n\n/**\n * Generate dedupe key (content + session for uniqueness)\n * AXIOMMIND Principle 3: Idempotency guarantee\n */\nexport function makeDedupeKey(content: string, sessionId: string): string {\n const contentHash = createHash('sha256').update(content).digest('hex');\n return `${sessionId}:${contentHash}`;\n}\n\n/**\n * Generate content hash for deduplication\n */\nexport function hashContent(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n}\n\n// ============================================================\n// Entity Canonical Keys (Task Entity System)\n// ============================================================\n\nexport type EntityKeyType = 'task' | 'condition' | 'artifact';\n\n/**\n * Normalize text for entity key generation\n */\nfunction normalizeForKey(text: string): string {\n return text\n .normalize('NFKC')\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s]/gu, '')\n .replace(/\\s+/g, '_')\n .trim();\n}\n\n/**\n * Generate canonical key for entities\n * Format: {type}:{project}:{normalized_identifier}\n */\nexport function makeEntityCanonicalKey(\n entityType: EntityKeyType,\n identifier: string,\n context?: { project?: string }\n): string {\n const project = context?.project ?? 'default';\n\n switch (entityType) {\n case 'task':\n return `task:${project}:${normalizeForKey(identifier)}`;\n case 'condition':\n return `cond:${project}:${normalizeForKey(identifier)}`;\n case 'artifact':\n return makeArtifactKey(identifier);\n }\n}\n\n/**\n * Generate canonical key for artifacts based on identifier pattern\n * - URL: art:url:{sha1(url)}\n * - JIRA key: art:jira:{key}\n * - GitHub issue: art:gh_issue:{repo}:{num}\n * - Generic: art:generic:{sha1(identifier)}\n */\nexport function makeArtifactKey(identifier: string): string {\n // URL pattern\n if (/^https?:\\/\\//.test(identifier)) {\n const hash = createHash('sha1').update(identifier).digest('hex').slice(0, 12);\n return `art:url:${hash}`;\n }\n\n // JIRA key pattern (e.g., PROJ-123)\n const jiraMatch = identifier.match(/^([A-Z]+-\\d+)$/);\n if (jiraMatch) {\n return `art:jira:${jiraMatch[1].toLowerCase()}`;\n }\n\n // GitHub issue pattern (e.g., owner/repo#123)\n const ghMatch = identifier.match(/^([^\\/]+\\/[^#]+)#(\\d+)$/);\n if (ghMatch) {\n return `art:gh_issue:${ghMatch[1]}:${ghMatch[2]}`;\n }\n\n // Generic identifier\n const hash = createHash('sha1').update(identifier).digest('hex').slice(0, 12);\n return `art:generic:${hash}`;\n}\n\n/**\n * Generate dedupe key for task events\n */\nexport function makeTaskEventDedupeKey(\n eventType: string,\n taskId: string,\n sessionId: string,\n additionalContext?: string\n): string {\n const parts = [eventType, taskId, sessionId];\n if (additionalContext) {\n parts.push(additionalContext);\n }\n const combined = parts.join(':');\n return createHash('sha256').update(combined).digest('hex');\n}\n\n/**\n * Parse entity canonical key to extract type and identifier\n */\nexport function parseEntityCanonicalKey(canonicalKey: string): {\n entityType: EntityKeyType;\n project?: string;\n identifier: string;\n} | null {\n const taskMatch = canonicalKey.match(/^task:([^:]+):(.+)$/);\n if (taskMatch) {\n return { entityType: 'task', project: taskMatch[1], identifier: taskMatch[2] };\n }\n\n const condMatch = canonicalKey.match(/^cond:([^:]+):(.+)$/);\n if (condMatch) {\n return { entityType: 'condition', project: condMatch[1], identifier: condMatch[2] };\n }\n\n const artMatch = canonicalKey.match(/^art:([^:]+):(.+)$/);\n if (artMatch) {\n return { entityType: 'artifact', identifier: artMatch[2] };\n }\n\n return null;\n}\n", "/**\n * AXIOMMIND EventStore implementation\n * Principles: Append-only, Single Source of Truth, Idempotency\n */\n\nimport { randomUUID } from 'crypto';\nimport {\n MemoryEvent,\n MemoryEventInput,\n Session,\n AppendResult,\n OutboxItem\n} from './types.js';\nimport { makeCanonicalKey, makeDedupeKey } from './canonical-key.js';\nimport { createDatabase, dbRun, dbAll, dbClose, toDate, type Database } from './db-wrapper.js';\n\nexport class EventStore {\n private db: Database;\n private initialized = false;\n\n constructor(private dbPath: string) {\n this.db = createDatabase(dbPath);\n }\n\n /**\n * Initialize database schema\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // L0 EventStore: Single Source of Truth (immutable, append-only)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS events (\n id VARCHAR PRIMARY KEY,\n event_type VARCHAR NOT NULL,\n session_id VARCHAR NOT NULL,\n timestamp TIMESTAMP NOT NULL,\n content TEXT NOT NULL,\n canonical_key VARCHAR NOT NULL,\n dedupe_key VARCHAR UNIQUE,\n metadata JSON\n )\n `);\n\n // Dedup table for idempotency\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS event_dedup (\n dedupe_key VARCHAR PRIMARY KEY,\n event_id VARCHAR NOT NULL,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // Session metadata\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS sessions (\n id VARCHAR PRIMARY KEY,\n started_at TIMESTAMP NOT NULL,\n ended_at TIMESTAMP,\n project_path VARCHAR,\n summary TEXT,\n tags JSON\n )\n `);\n\n // Insights (derived data, rebuildable)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS insights (\n id VARCHAR PRIMARY KEY,\n insight_type VARCHAR NOT NULL,\n content TEXT NOT NULL,\n canonical_key VARCHAR NOT NULL,\n confidence FLOAT,\n source_events JSON,\n created_at TIMESTAMP,\n last_updated TIMESTAMP\n )\n `);\n\n // Embedding Outbox (Single-Writer Pattern)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS embedding_outbox (\n id VARCHAR PRIMARY KEY,\n event_id VARCHAR NOT NULL,\n content TEXT NOT NULL,\n status VARCHAR DEFAULT 'pending',\n retry_count INT DEFAULT 0,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n processed_at TIMESTAMP,\n error_message TEXT\n )\n `);\n\n // Projection offset tracking\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS projection_offsets (\n projection_name VARCHAR PRIMARY KEY,\n last_event_id VARCHAR,\n last_timestamp TIMESTAMP,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // Memory level tracking\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS memory_levels (\n event_id VARCHAR PRIMARY KEY,\n level VARCHAR NOT NULL DEFAULT 'L0',\n promoted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // ============================================================\n // Entity-Edge Model Tables\n // ============================================================\n\n // Entries (immutable memory units)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS entries (\n entry_id VARCHAR PRIMARY KEY,\n created_ts TIMESTAMP NOT NULL,\n entry_type VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n content_json JSON NOT NULL,\n stage VARCHAR NOT NULL DEFAULT 'raw',\n status VARCHAR DEFAULT 'active',\n superseded_by VARCHAR,\n build_id VARCHAR,\n evidence_json JSON,\n canonical_key VARCHAR,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // Entities (task/condition/artifact)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS entities (\n entity_id VARCHAR PRIMARY KEY,\n entity_type VARCHAR NOT NULL,\n canonical_key VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n stage VARCHAR NOT NULL DEFAULT 'raw',\n status VARCHAR NOT NULL DEFAULT 'active',\n current_json JSON NOT NULL,\n title_norm VARCHAR,\n search_text VARCHAR,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // Entity aliases for canonical key lookup\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS entity_aliases (\n entity_type VARCHAR NOT NULL,\n canonical_key VARCHAR NOT NULL,\n entity_id VARCHAR NOT NULL,\n is_primary BOOLEAN DEFAULT FALSE,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n PRIMARY KEY(entity_type, canonical_key)\n )\n `);\n\n // Edges (relationships between entries/entities)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS edges (\n edge_id VARCHAR PRIMARY KEY,\n src_type VARCHAR NOT NULL,\n src_id VARCHAR NOT NULL,\n rel_type VARCHAR NOT NULL,\n dst_type VARCHAR NOT NULL,\n dst_id VARCHAR NOT NULL,\n meta_json JSON,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // ============================================================\n // Vector Outbox V2 Table\n // ============================================================\n\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS vector_outbox (\n job_id VARCHAR PRIMARY KEY,\n item_kind VARCHAR NOT NULL,\n item_id VARCHAR NOT NULL,\n embedding_version VARCHAR NOT NULL,\n status VARCHAR NOT NULL DEFAULT 'pending',\n retry_count INT DEFAULT 0,\n error VARCHAR,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(item_kind, item_id, embedding_version)\n )\n `);\n\n // ============================================================\n // Build Runs & Metrics Tables\n // ============================================================\n\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS build_runs (\n build_id VARCHAR PRIMARY KEY,\n started_at TIMESTAMP NOT NULL,\n finished_at TIMESTAMP,\n extractor_model VARCHAR NOT NULL,\n extractor_prompt_hash VARCHAR NOT NULL,\n embedder_model VARCHAR NOT NULL,\n embedding_version VARCHAR NOT NULL,\n idris_version VARCHAR NOT NULL,\n schema_version VARCHAR NOT NULL,\n status VARCHAR NOT NULL DEFAULT 'running',\n error VARCHAR\n )\n `);\n\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS pipeline_metrics (\n id VARCHAR PRIMARY KEY,\n ts TIMESTAMP NOT NULL,\n stage VARCHAR NOT NULL,\n latency_ms DOUBLE NOT NULL,\n success BOOLEAN NOT NULL,\n error VARCHAR,\n session_id VARCHAR\n )\n `);\n\n // ============================================================\n // Endless Mode Tables\n // ============================================================\n\n // Working Set table (active memory window)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS working_set (\n id VARCHAR PRIMARY KEY,\n event_id VARCHAR NOT NULL,\n added_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n relevance_score FLOAT DEFAULT 1.0,\n topics JSON,\n expires_at TIMESTAMP\n )\n `);\n\n // Consolidated Memories table (long-term integrated memories)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS consolidated_memories (\n memory_id VARCHAR PRIMARY KEY,\n summary TEXT NOT NULL,\n topics JSON,\n source_events JSON,\n confidence FLOAT DEFAULT 0.5,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n accessed_at TIMESTAMP,\n access_count INTEGER DEFAULT 0\n )\n `);\n\n // Continuity Log table (tracks context transitions)\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS continuity_log (\n log_id VARCHAR PRIMARY KEY,\n from_context_id VARCHAR,\n to_context_id VARCHAR,\n continuity_score FLOAT,\n transition_type VARCHAR,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // Endless Mode Config table\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS endless_config (\n key VARCHAR PRIMARY KEY,\n value JSON,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )\n `);\n\n // ============================================================\n // Create Indexes\n // ============================================================\n\n // Entry indexes\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_entries_type ON entries(entry_type)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_entries_stage ON entries(stage)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_entries_canonical ON entries(canonical_key)`);\n\n // Entity indexes\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_entities_type_key ON entities(entity_type, canonical_key)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_entities_status ON entities(status)`);\n\n // Edge indexes\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_edges_src ON edges(src_id, rel_type)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_edges_dst ON edges(dst_id, rel_type)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_edges_rel ON edges(rel_type)`);\n\n // Outbox indexes\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_outbox_status ON vector_outbox(status)`);\n\n // Endless Mode indexes\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_working_set_expires ON working_set(expires_at)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_working_set_relevance ON working_set(relevance_score DESC)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_consolidated_confidence ON consolidated_memories(confidence DESC)`);\n await dbRun(this.db, `CREATE INDEX IF NOT EXISTS idx_continuity_created ON continuity_log(created_at)`);\n\n this.initialized = true;\n }\n\n /**\n * Append event to store (AXIOMMIND Principle 2: Append-only)\n * Returns existing event ID if duplicate (Principle 3: Idempotency)\n */\n async append(input: MemoryEventInput): Promise<AppendResult> {\n await this.initialize();\n\n const canonicalKey = makeCanonicalKey(input.content);\n const dedupeKey = makeDedupeKey(input.content, input.sessionId);\n\n // Check for duplicate\n const existing = await dbAll<{ event_id: string }>(\n this.db,\n `SELECT event_id FROM event_dedup WHERE dedupe_key = ?`,\n [dedupeKey]\n );\n\n if (existing.length > 0) {\n return {\n success: true,\n eventId: existing[0].event_id,\n isDuplicate: true\n };\n }\n\n const id = randomUUID();\n const timestamp = input.timestamp.toISOString();\n\n try {\n await dbRun(\n this.db,\n `INSERT INTO events (id, event_type, session_id, timestamp, content, canonical_key, dedupe_key, metadata)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n id,\n input.eventType,\n input.sessionId,\n timestamp,\n input.content,\n canonicalKey,\n dedupeKey,\n JSON.stringify(input.metadata || {})\n ]\n );\n\n await dbRun(\n this.db,\n `INSERT INTO event_dedup (dedupe_key, event_id) VALUES (?, ?)`,\n [dedupeKey, id]\n );\n\n // Initialize at L0\n await dbRun(\n this.db,\n `INSERT INTO memory_levels (event_id, level) VALUES (?, 'L0')`,\n [id]\n );\n\n return { success: true, eventId: id, isDuplicate: false };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * Get events by session ID\n */\n async getSessionEvents(sessionId: string): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE session_id = ? ORDER BY timestamp ASC`,\n [sessionId]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Get recent events\n */\n async getRecentEvents(limit: number = 100): Promise<MemoryEvent[]> {\n await this.initialize();\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events ORDER BY timestamp DESC LIMIT ?`,\n [limit]\n );\n\n return rows.map(this.rowToEvent);\n }\n\n /**\n * Get event by ID\n */\n async getEvent(id: string): Promise<MemoryEvent | null> {\n await this.initialize();\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM events WHERE id = ?`,\n [id]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEvent(rows[0]);\n }\n\n /**\n * Create or update session\n */\n async upsertSession(session: Partial<Session> & { id: string }): Promise<void> {\n await this.initialize();\n\n const existing = await dbAll<{ id: string }>(\n this.db,\n `SELECT id FROM sessions WHERE id = ?`,\n [session.id]\n );\n\n if (existing.length === 0) {\n await dbRun(\n this.db,\n `INSERT INTO sessions (id, started_at, project_path, tags)\n VALUES (?, ?, ?, ?)`,\n [\n session.id,\n (session.startedAt || new Date()).toISOString(),\n session.projectPath || null,\n JSON.stringify(session.tags || [])\n ]\n );\n } else {\n const updates: string[] = [];\n const values: unknown[] = [];\n\n if (session.endedAt) {\n updates.push('ended_at = ?');\n values.push(session.endedAt.toISOString());\n }\n if (session.summary) {\n updates.push('summary = ?');\n values.push(session.summary);\n }\n if (session.tags) {\n updates.push('tags = ?');\n values.push(JSON.stringify(session.tags));\n }\n\n if (updates.length > 0) {\n values.push(session.id);\n await dbRun(\n this.db,\n `UPDATE sessions SET ${updates.join(', ')} WHERE id = ?`,\n values\n );\n }\n }\n }\n\n /**\n * Get session by ID\n */\n async getSession(id: string): Promise<Session | null> {\n await this.initialize();\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM sessions WHERE id = ?`,\n [id]\n );\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n return {\n id: row.id as string,\n startedAt: toDate(row.started_at),\n endedAt: row.ended_at ? toDate(row.ended_at) : undefined,\n projectPath: row.project_path as string | undefined,\n summary: row.summary as string | undefined,\n tags: row.tags ? JSON.parse(row.tags as string) : undefined\n };\n }\n\n /**\n * Add to embedding outbox (Single-Writer Pattern)\n */\n async enqueueForEmbedding(eventId: string, content: string): Promise<string> {\n await this.initialize();\n\n const id = randomUUID();\n await dbRun(\n this.db,\n `INSERT INTO embedding_outbox (id, event_id, content, status, retry_count)\n VALUES (?, ?, ?, 'pending', 0)`,\n [id, eventId, content]\n );\n\n return id;\n }\n\n /**\n * Get pending outbox items\n */\n async getPendingOutboxItems(limit: number = 32): Promise<OutboxItem[]> {\n await this.initialize();\n\n // First, get pending items\n const pending = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM embedding_outbox\n WHERE status = 'pending'\n ORDER BY created_at\n LIMIT ?`,\n [limit]\n );\n\n if (pending.length === 0) return [];\n\n // Update status to processing\n const ids = pending.map(r => r.id as string);\n const placeholders = ids.map(() => '?').join(',');\n await dbRun(\n this.db,\n `UPDATE embedding_outbox SET status = 'processing' WHERE id IN (${placeholders})`,\n ids\n );\n\n return pending.map(row => ({\n id: row.id as string,\n eventId: row.event_id as string,\n content: row.content as string,\n status: 'processing' as const,\n retryCount: row.retry_count as number,\n createdAt: toDate(row.created_at),\n errorMessage: row.error_message as string | undefined\n }));\n }\n\n /**\n * Mark outbox items as done\n */\n async completeOutboxItems(ids: string[]): Promise<void> {\n if (ids.length === 0) return;\n\n const placeholders = ids.map(() => '?').join(',');\n await dbRun(\n this.db,\n `DELETE FROM embedding_outbox WHERE id IN (${placeholders})`,\n ids\n );\n }\n\n /**\n * Mark outbox items as failed\n */\n async failOutboxItems(ids: string[], error: string): Promise<void> {\n if (ids.length === 0) return;\n\n const placeholders = ids.map(() => '?').join(',');\n await dbRun(\n this.db,\n `UPDATE embedding_outbox\n SET status = CASE WHEN retry_count >= 3 THEN 'failed' ELSE 'pending' END,\n retry_count = retry_count + 1,\n error_message = ?\n WHERE id IN (${placeholders})`,\n [error, ...ids]\n );\n }\n\n /**\n * Update memory level\n */\n async updateMemoryLevel(eventId: string, level: string): Promise<void> {\n await this.initialize();\n\n await dbRun(\n this.db,\n `UPDATE memory_levels SET level = ?, promoted_at = CURRENT_TIMESTAMP WHERE event_id = ?`,\n [level, eventId]\n );\n }\n\n /**\n * Get memory level statistics\n */\n async getLevelStats(): Promise<Array<{ level: string; count: number }>> {\n await this.initialize();\n\n const rows = await dbAll<{ level: string; count: number }>(\n this.db,\n `SELECT level, COUNT(*) as count FROM memory_levels GROUP BY level`\n );\n\n return rows;\n }\n\n // ============================================================\n // Endless Mode Helper Methods\n // ============================================================\n\n /**\n * Get database instance for Endless Mode stores\n */\n getDatabase(): Database {\n return this.db;\n }\n\n /**\n * Get config value for endless mode\n */\n async getEndlessConfig(key: string): Promise<unknown | null> {\n await this.initialize();\n\n const rows = await dbAll<{ value: string }>(\n this.db,\n `SELECT value FROM endless_config WHERE key = ?`,\n [key]\n );\n\n if (rows.length === 0) return null;\n return JSON.parse(rows[0].value);\n }\n\n /**\n * Set config value for endless mode\n */\n async setEndlessConfig(key: string, value: unknown): Promise<void> {\n await this.initialize();\n\n await dbRun(\n this.db,\n `INSERT OR REPLACE INTO endless_config (key, value, updated_at)\n VALUES (?, ?, CURRENT_TIMESTAMP)`,\n [key, JSON.stringify(value)]\n );\n }\n\n /**\n * Get all sessions\n */\n async getAllSessions(): Promise<Session[]> {\n await this.initialize();\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM sessions ORDER BY started_at DESC`\n );\n\n return rows.map(row => ({\n id: row.id as string,\n startedAt: toDate(row.started_at),\n endedAt: row.ended_at ? toDate(row.ended_at) : undefined,\n projectPath: row.project_path as string | undefined,\n summary: row.summary as string | undefined,\n tags: row.tags ? JSON.parse(row.tags as string) : undefined\n }));\n }\n\n /**\n * Close database connection\n */\n async close(): Promise<void> {\n await dbClose(this.db);\n }\n\n /**\n * Convert database row to MemoryEvent\n */\n private rowToEvent(row: Record<string, unknown>): MemoryEvent {\n return {\n id: row.id as string,\n eventType: row.event_type as 'user_prompt' | 'agent_response' | 'session_summary',\n sessionId: row.session_id as string,\n timestamp: toDate(row.timestamp),\n content: row.content as string,\n canonicalKey: row.canonical_key as string,\n dedupeKey: row.dedupe_key as string,\n metadata: row.metadata ? JSON.parse(row.metadata as string) : undefined\n };\n }\n}\n", "/**\n * DuckDB Promise Wrapper\n * Wraps the callback-based DuckDB API with Promise-based async/await interface\n */\n\nimport duckdb from 'duckdb';\n\nexport type Database = duckdb.Database;\n\n/**\n * Converts BigInt values to Number in an object\n * DuckDB returns BigInt for COUNT(*) and other aggregate functions\n */\nfunction convertBigInts<T>(obj: T): T {\n if (obj === null || obj === undefined) return obj;\n if (typeof obj === 'bigint') return Number(obj) as unknown as T;\n if (obj instanceof Date) return obj; // Preserve Date objects\n if (Array.isArray(obj)) return obj.map(convertBigInts) as unknown as T;\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n result[key] = convertBigInts(value);\n }\n return result as T;\n }\n return obj;\n}\n\n/**\n * Safely converts a value to a Date object\n * Handles both Date objects and string timestamps from DuckDB\n */\nexport function toDate(value: unknown): Date {\n if (value instanceof Date) return value;\n if (typeof value === 'string') return new Date(value);\n if (typeof value === 'number') return new Date(value);\n return new Date(String(value));\n}\n\n/**\n * Creates a new DuckDB database with Promise-based API\n */\nexport function createDatabase(path: string): Database {\n return new duckdb.Database(path);\n}\n\n/**\n * Promisified db.run() - executes a statement that doesn't return rows\n */\nexport function dbRun(db: Database, sql: string, params: unknown[] = []): Promise<void> {\n return new Promise((resolve, reject) => {\n if (params.length === 0) {\n db.run(sql, (err: Error | null) => {\n if (err) reject(err);\n else resolve();\n });\n } else {\n db.run(sql, ...params, (err: Error | null) => {\n if (err) reject(err);\n else resolve();\n });\n }\n });\n}\n\n/**\n * Promisified db.all() - executes a query and returns all rows\n * Automatically converts BigInt values to Number\n */\nexport function dbAll<T = Record<string, unknown>>(\n db: Database,\n sql: string,\n params: unknown[] = []\n): Promise<T[]> {\n return new Promise((resolve, reject) => {\n if (params.length === 0) {\n db.all(sql, (err: Error | null, rows: T[]) => {\n if (err) reject(err);\n else resolve(convertBigInts(rows || []));\n });\n } else {\n db.all(sql, ...params, (err: Error | null, rows: T[]) => {\n if (err) reject(err);\n else resolve(convertBigInts(rows || []));\n });\n }\n });\n}\n\n/**\n * Promisified db.close() - closes the database connection\n */\nexport function dbClose(db: Database): Promise<void> {\n return new Promise((resolve, reject) => {\n db.close((err: Error | null) => {\n if (err) reject(err);\n else resolve();\n });\n });\n}\n\n/**\n * Promisified db.exec() - executes multiple statements\n */\nexport function dbExec(db: Database, sql: string): Promise<void> {\n return new Promise((resolve, reject) => {\n db.exec(sql, (err: Error | null) => {\n if (err) reject(err);\n else resolve();\n });\n });\n}\n", "/**\n * Entity Repository - CRUD operations for Task/Condition/Artifact entities\n * AXIOMMIND Principle 5: Task is Entity\n */\n\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport { randomUUID } from 'crypto';\nimport type {\n Entity,\n EntityType,\n EntityStage,\n EntityStatus,\n EntityAlias,\n TaskCurrentJson\n} from './types.js';\nimport { makeEntityCanonicalKey } from './canonical-key.js';\n\nexport interface CreateEntityInput {\n entityType: EntityType;\n title: string;\n currentJson: Record<string, unknown>;\n project?: string;\n stage?: EntityStage;\n status?: EntityStatus;\n}\n\nexport interface UpdateEntityInput {\n currentJson?: Record<string, unknown>;\n stage?: EntityStage;\n status?: EntityStatus;\n searchText?: string;\n}\n\nexport class EntityRepo {\n constructor(private db: Database) {}\n\n /**\n * Create a new entity\n */\n async create(input: CreateEntityInput): Promise<Entity> {\n const entityId = randomUUID();\n const canonicalKey = makeEntityCanonicalKey(input.entityType, input.title, {\n project: input.project\n });\n\n const titleNorm = input.title.toLowerCase().trim();\n const searchText = `${input.title} ${JSON.stringify(input.currentJson)}`;\n\n const now = new Date();\n\n await dbRun(\n this.db,\n `INSERT INTO entities (\n entity_id, entity_type, canonical_key, title, stage, status,\n current_json, title_norm, search_text, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n entityId,\n input.entityType,\n canonicalKey,\n input.title,\n input.stage ?? 'raw',\n input.status ?? 'active',\n JSON.stringify(input.currentJson),\n titleNorm,\n searchText,\n now.toISOString(),\n now.toISOString()\n ]\n );\n\n // Create primary alias\n await dbRun(\n this.db,\n `INSERT INTO entity_aliases (entity_type, canonical_key, entity_id, is_primary)\n VALUES (?, ?, ?, TRUE)\n ON CONFLICT (entity_type, canonical_key) DO NOTHING`,\n [input.entityType, canonicalKey, entityId]\n );\n\n return {\n entityId,\n entityType: input.entityType,\n canonicalKey,\n title: input.title,\n stage: input.stage ?? 'raw',\n status: input.status ?? 'active',\n currentJson: input.currentJson,\n titleNorm,\n searchText,\n createdAt: now,\n updatedAt: now\n };\n }\n\n /**\n * Find entity by ID\n */\n async findById(entityId: string): Promise<Entity | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM entities WHERE entity_id = ?`,\n [entityId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEntity(rows[0]);\n }\n\n /**\n * Find entity by canonical key\n */\n async findByCanonicalKey(\n entityType: EntityType,\n canonicalKey: string\n ): Promise<Entity | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM entities\n WHERE entity_type = ? AND canonical_key = ?`,\n [entityType, canonicalKey]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEntity(rows[0]);\n }\n\n /**\n * Find or create entity by title (idempotent)\n */\n async findOrCreate(input: CreateEntityInput): Promise<{ entity: Entity; created: boolean }> {\n const canonicalKey = makeEntityCanonicalKey(input.entityType, input.title, {\n project: input.project\n });\n\n const existing = await this.findByCanonicalKey(input.entityType, canonicalKey);\n if (existing) {\n return { entity: existing, created: false };\n }\n\n const entity = await this.create(input);\n return { entity, created: true };\n }\n\n /**\n * Update entity\n */\n async update(entityId: string, input: UpdateEntityInput): Promise<Entity | null> {\n const existing = await this.findById(entityId);\n if (!existing) return null;\n\n const updates: string[] = [];\n const values: unknown[] = [];\n\n if (input.currentJson !== undefined) {\n updates.push('current_json = ?');\n values.push(JSON.stringify(input.currentJson));\n }\n if (input.stage !== undefined) {\n updates.push('stage = ?');\n values.push(input.stage);\n }\n if (input.status !== undefined) {\n updates.push('status = ?');\n values.push(input.status);\n }\n if (input.searchText !== undefined) {\n updates.push('search_text = ?');\n values.push(input.searchText);\n }\n\n updates.push('updated_at = ?');\n values.push(new Date().toISOString());\n\n values.push(entityId);\n\n await dbRun(\n this.db,\n `UPDATE entities SET ${updates.join(', ')} WHERE entity_id = ?`,\n values\n );\n\n return this.findById(entityId);\n }\n\n /**\n * List entities by type\n */\n async listByType(\n entityType: EntityType,\n options?: { status?: EntityStatus; limit?: number; offset?: number }\n ): Promise<Entity[]> {\n let query = `SELECT * FROM entities WHERE entity_type = ?`;\n const params: unknown[] = [entityType];\n\n if (options?.status) {\n query += ` AND status = ?`;\n params.push(options.status);\n }\n\n query += ` ORDER BY updated_at DESC`;\n\n if (options?.limit) {\n query += ` LIMIT ?`;\n params.push(options.limit);\n }\n if (options?.offset) {\n query += ` OFFSET ?`;\n params.push(options.offset);\n }\n\n const rows = await dbAll<Record<string, unknown>>(this.db, query, params);\n return rows.map(row => this.rowToEntity(row));\n }\n\n /**\n * Search entities by text\n */\n async search(\n query: string,\n options?: { entityType?: EntityType; limit?: number }\n ): Promise<Entity[]> {\n const searchPattern = `%${query.toLowerCase()}%`;\n\n let sql = `SELECT * FROM entities WHERE (title_norm LIKE ? OR search_text LIKE ?)`;\n const params: unknown[] = [searchPattern, searchPattern];\n\n if (options?.entityType) {\n sql += ` AND entity_type = ?`;\n params.push(options.entityType);\n }\n\n sql += ` AND status = 'active' ORDER BY updated_at DESC`;\n\n if (options?.limit) {\n sql += ` LIMIT ?`;\n params.push(options.limit);\n }\n\n const rows = await dbAll<Record<string, unknown>>(this.db, sql, params);\n return rows.map(row => this.rowToEntity(row));\n }\n\n /**\n * Get tasks by status\n */\n async getTasksByStatus(status: string): Promise<Entity[]> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM entities\n WHERE entity_type = 'task'\n AND json_extract(current_json, '$.status') = ?\n AND status = 'active'\n ORDER BY updated_at DESC`,\n [status]\n );\n\n return rows.map(row => this.rowToEntity(row));\n }\n\n /**\n * Get blocked tasks with their blockers\n */\n async getBlockedTasksWithBlockers(): Promise<Array<{\n task: Entity;\n blockers: Array<{ entityId: string; entityType: string; title: string }>;\n }>> {\n const tasks = await this.getTasksByStatus('blocked');\n\n const results: Array<{\n task: Entity;\n blockers: Array<{ entityId: string; entityType: string; title: string }>;\n }> = [];\n\n for (const task of tasks) {\n const blockerEdges = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT e.dst_id, ent.entity_type, ent.title\n FROM edges e\n JOIN entities ent ON ent.entity_id = e.dst_id\n WHERE e.src_id = ? AND e.rel_type = 'blocked_by'`,\n [task.entityId]\n );\n\n results.push({\n task,\n blockers: blockerEdges.map(row => ({\n entityId: row.dst_id as string,\n entityType: row.entity_type as string,\n title: row.title as string\n }))\n });\n }\n\n return results;\n }\n\n /**\n * Add alias for entity\n */\n async addAlias(\n entityType: EntityType,\n canonicalKey: string,\n entityId: string\n ): Promise<void> {\n await dbRun(\n this.db,\n `INSERT INTO entity_aliases (entity_type, canonical_key, entity_id, is_primary)\n VALUES (?, ?, ?, FALSE)\n ON CONFLICT (entity_type, canonical_key) DO NOTHING`,\n [entityType, canonicalKey, entityId]\n );\n }\n\n /**\n * Find entity by alias\n */\n async findByAlias(entityType: EntityType, canonicalKey: string): Promise<Entity | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT e.* FROM entities e\n JOIN entity_aliases a ON e.entity_id = a.entity_id\n WHERE a.entity_type = ? AND a.canonical_key = ?`,\n [entityType, canonicalKey]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEntity(rows[0]);\n }\n\n /**\n * Convert database row to Entity\n */\n private rowToEntity(row: Record<string, unknown>): Entity {\n return {\n entityId: row.entity_id as string,\n entityType: row.entity_type as EntityType,\n canonicalKey: row.canonical_key as string,\n title: row.title as string,\n stage: row.stage as EntityStage,\n status: row.status as EntityStatus,\n currentJson: typeof row.current_json === 'string'\n ? JSON.parse(row.current_json)\n : row.current_json as Record<string, unknown>,\n titleNorm: row.title_norm as string | undefined,\n searchText: row.search_text as string | undefined,\n createdAt: toDate(row.created_at),\n updatedAt: toDate(row.updated_at)\n };\n }\n}\n", "/**\n * Edge Repository - CRUD operations for entity/entry relationships\n * AXIOMMIND Entity-Edge Model\n */\n\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport { randomUUID } from 'crypto';\nimport type { Edge, NodeType, RelationType } from './types.js';\n\nexport interface CreateEdgeInput {\n srcType: NodeType;\n srcId: string;\n relType: RelationType;\n dstType: NodeType;\n dstId: string;\n metaJson?: Record<string, unknown>;\n}\n\nexport class EdgeRepo {\n constructor(private db: Database) {}\n\n /**\n * Create a new edge (idempotent - ignores duplicates)\n */\n async create(input: CreateEdgeInput): Promise<Edge> {\n const edgeId = randomUUID();\n const now = new Date();\n\n await dbRun(\n this.db,\n `INSERT INTO edges (edge_id, src_type, src_id, rel_type, dst_type, dst_id, meta_json, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT DO NOTHING`,\n [\n edgeId,\n input.srcType,\n input.srcId,\n input.relType,\n input.dstType,\n input.dstId,\n JSON.stringify(input.metaJson ?? {}),\n now.toISOString()\n ]\n );\n\n return {\n edgeId,\n srcType: input.srcType,\n srcId: input.srcId,\n relType: input.relType,\n dstType: input.dstType,\n dstId: input.dstId,\n metaJson: input.metaJson,\n createdAt: now\n };\n }\n\n /**\n * Create or update edge\n */\n async upsert(input: CreateEdgeInput): Promise<Edge> {\n // Check for existing edge\n const existing = await this.findByEndpoints(\n input.srcType,\n input.srcId,\n input.relType,\n input.dstType,\n input.dstId\n );\n\n if (existing) {\n // Update meta_json\n await dbRun(\n this.db,\n `UPDATE edges SET meta_json = ? WHERE edge_id = ?`,\n [JSON.stringify(input.metaJson ?? {}), existing.edgeId]\n );\n return { ...existing, metaJson: input.metaJson };\n }\n\n return this.create(input);\n }\n\n /**\n * Find edge by endpoints\n */\n async findByEndpoints(\n srcType: NodeType,\n srcId: string,\n relType: RelationType,\n dstType: NodeType,\n dstId: string\n ): Promise<Edge | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM edges\n WHERE src_type = ? AND src_id = ? AND rel_type = ?\n AND dst_type = ? AND dst_id = ?`,\n [srcType, srcId, relType, dstType, dstId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEdge(rows[0]);\n }\n\n /**\n * Find edges by source\n */\n async findBySrc(\n srcId: string,\n relType?: RelationType\n ): Promise<Edge[]> {\n let query = `SELECT * FROM edges WHERE src_id = ?`;\n const params: unknown[] = [srcId];\n\n if (relType) {\n query += ` AND rel_type = ?`;\n params.push(relType);\n }\n\n query += ` ORDER BY created_at DESC`;\n\n const rows = await dbAll<Record<string, unknown>>(this.db, query, params);\n return rows.map(row => this.rowToEdge(row));\n }\n\n /**\n * Find edges by destination\n */\n async findByDst(\n dstId: string,\n relType?: RelationType\n ): Promise<Edge[]> {\n let query = `SELECT * FROM edges WHERE dst_id = ?`;\n const params: unknown[] = [dstId];\n\n if (relType) {\n query += ` AND rel_type = ?`;\n params.push(relType);\n }\n\n query += ` ORDER BY created_at DESC`;\n\n const rows = await dbAll<Record<string, unknown>>(this.db, query, params);\n return rows.map(row => this.rowToEdge(row));\n }\n\n /**\n * Find all edges for a node (both directions)\n */\n async findByNode(nodeId: string): Promise<{ outgoing: Edge[]; incoming: Edge[] }> {\n const outgoing = await this.findBySrc(nodeId);\n const incoming = await this.findByDst(nodeId);\n return { outgoing, incoming };\n }\n\n /**\n * Delete edge by ID\n */\n async delete(edgeId: string): Promise<boolean> {\n await dbRun(\n this.db,\n `DELETE FROM edges WHERE edge_id = ?`,\n [edgeId]\n );\n return true; // DuckDB doesn't return affected rows easily\n }\n\n /**\n * Delete edges by source and relation type\n */\n async deleteBySrcAndRel(srcId: string, relType: RelationType): Promise<number> {\n await dbRun(\n this.db,\n `DELETE FROM edges WHERE src_id = ? AND rel_type = ?`,\n [srcId, relType]\n );\n return 0; // DuckDB doesn't return affected rows easily\n }\n\n /**\n * Delete edges by destination and relation type\n */\n async deleteByDstAndRel(dstId: string, relType: RelationType): Promise<number> {\n await dbRun(\n this.db,\n `DELETE FROM edges WHERE dst_id = ? AND rel_type = ?`,\n [dstId, relType]\n );\n return 0;\n }\n\n /**\n * Replace edges for a source and relation type\n * Used for mode=replace in task_blockers_set\n */\n async replaceEdges(\n srcId: string,\n relType: RelationType,\n newEdges: Omit<CreateEdgeInput, 'srcId' | 'relType'>[]\n ): Promise<Edge[]> {\n // Delete existing edges\n await this.deleteBySrcAndRel(srcId, relType);\n\n // Create new edges\n const created: Edge[] = [];\n for (const edge of newEdges) {\n const newEdge = await this.create({\n srcType: edge.srcType,\n srcId,\n relType,\n dstType: edge.dstType,\n dstId: edge.dstId,\n metaJson: edge.metaJson\n });\n created.push(newEdge);\n }\n\n return created;\n }\n\n /**\n * Get effective blockers (resolving condition \u2192 task)\n * Returns resolved blocker if condition has resolves_to edge\n */\n async getEffectiveBlockers(taskId: string): Promise<Array<{\n originalId: string;\n effectiveId: string;\n isResolved: boolean;\n }>> {\n const blockerEdges = await this.findBySrc(taskId, 'blocked_by');\n const results: Array<{\n originalId: string;\n effectiveId: string;\n isResolved: boolean;\n }> = [];\n\n for (const edge of blockerEdges) {\n // Check if blocker has resolves_to edge\n const resolvesTo = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT dst_id FROM edges\n WHERE src_id = ? AND rel_type = 'resolves_to'\n LIMIT 1`,\n [edge.dstId]\n );\n\n if (resolvesTo.length > 0) {\n results.push({\n originalId: edge.dstId,\n effectiveId: resolvesTo[0].dst_id as string,\n isResolved: true\n });\n } else {\n results.push({\n originalId: edge.dstId,\n effectiveId: edge.dstId,\n isResolved: false\n });\n }\n }\n\n return results;\n }\n\n /**\n * Find 2-hop related entries (Entry \u2192 Entity \u2192 Entry)\n */\n async findRelatedEntries(entryId: string): Promise<Array<{\n entryId: string;\n viaEntityId: string;\n relationPath: string;\n }>> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `WITH first_hop AS (\n SELECT e1.dst_id AS entity_id\n FROM edges e1\n WHERE e1.src_type = 'entry'\n AND e1.rel_type = 'evidence_of'\n AND e1.src_id = ?\n )\n SELECT\n e2.src_id AS entry_id,\n f.entity_id AS via_entity_id,\n 'evidence_of\u2192evidence_of' AS relation_path\n FROM first_hop f\n JOIN edges e2 ON e2.dst_id = f.entity_id\n AND e2.rel_type = 'evidence_of'\n AND e2.src_type = 'entry'\n WHERE e2.src_id != ?`,\n [entryId, entryId]\n );\n\n return rows.map(row => ({\n entryId: row.entry_id as string,\n viaEntityId: row.via_entity_id as string,\n relationPath: row.relation_path as string\n }));\n }\n\n /**\n * Count edges by relation type\n */\n async countByRelType(): Promise<Array<{ relType: string; count: number }>> {\n const rows = await dbAll<{ rel_type: string; count: number }>(\n this.db,\n `SELECT rel_type, COUNT(*) as count FROM edges GROUP BY rel_type`\n );\n return rows.map(row => ({\n relType: row.rel_type,\n count: Number(row.count)\n }));\n }\n\n /**\n * Convert database row to Edge\n */\n private rowToEdge(row: Record<string, unknown>): Edge {\n return {\n edgeId: row.edge_id as string,\n srcType: row.src_type as NodeType,\n srcId: row.src_id as string,\n relType: row.rel_type as RelationType,\n dstType: row.dst_type as NodeType,\n dstId: row.dst_id as string,\n metaJson: typeof row.meta_json === 'string'\n ? JSON.parse(row.meta_json)\n : row.meta_json as Record<string, unknown> | undefined,\n createdAt: toDate(row.created_at)\n };\n }\n}\n", "/**\n * LanceDB Vector Store for semantic search\n * AXIOMMIND Principle 6: Vector store consistency (DuckDB \u2192 outbox \u2192 LanceDB unidirectional)\n */\n\nimport * as lancedb from '@lancedb/lancedb';\nimport type { VectorRecord } from './types.js';\n\nexport interface SearchResult {\n id: string;\n eventId: string;\n content: string;\n score: number;\n sessionId: string;\n eventType: string;\n timestamp: string;\n}\n\nexport class VectorStore {\n private db: lancedb.Connection | null = null;\n private table: lancedb.Table | null = null;\n private readonly tableName = 'conversations';\n\n constructor(private dbPath: string) {}\n\n /**\n * Initialize LanceDB connection\n */\n async initialize(): Promise<void> {\n if (this.db) return;\n\n this.db = await lancedb.connect(this.dbPath);\n\n // Try to open existing table\n try {\n const tables = await this.db.tableNames();\n if (tables.includes(this.tableName)) {\n this.table = await this.db.openTable(this.tableName);\n }\n } catch {\n // Table doesn't exist yet, will be created on first insert\n this.table = null;\n }\n }\n\n /**\n * Add or update vector record\n */\n async upsert(record: VectorRecord): Promise<void> {\n await this.initialize();\n\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const data = {\n id: record.id,\n eventId: record.eventId,\n sessionId: record.sessionId,\n eventType: record.eventType,\n content: record.content,\n vector: record.vector,\n timestamp: record.timestamp,\n metadata: JSON.stringify(record.metadata || {})\n };\n\n if (!this.table) {\n // Create table with first record\n this.table = await this.db.createTable(this.tableName, [data]);\n } else {\n await this.table.add([data]);\n }\n }\n\n /**\n * Add multiple vector records in batch\n */\n async upsertBatch(records: VectorRecord[]): Promise<void> {\n if (records.length === 0) return;\n\n await this.initialize();\n\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const data = records.map(record => ({\n id: record.id,\n eventId: record.eventId,\n sessionId: record.sessionId,\n eventType: record.eventType,\n content: record.content,\n vector: record.vector,\n timestamp: record.timestamp,\n metadata: JSON.stringify(record.metadata || {})\n }));\n\n if (!this.table) {\n this.table = await this.db.createTable(this.tableName, data);\n } else {\n await this.table.add(data);\n }\n }\n\n /**\n * Search for similar vectors\n */\n async search(\n queryVector: number[],\n options: {\n limit?: number;\n minScore?: number;\n sessionId?: string;\n } = {}\n ): Promise<SearchResult[]> {\n await this.initialize();\n\n if (!this.table) {\n return [];\n }\n\n const { limit = 5, minScore = 0.7, sessionId } = options;\n\n // Use cosine distance for semantic similarity\n let query = this.table\n .search(queryVector)\n .distanceType('cosine')\n .limit(limit * 2); // Get more for filtering\n\n // Apply session filter if specified\n if (sessionId) {\n query = query.where(`sessionId = '${sessionId}'`);\n }\n\n const results = await query.toArray();\n\n return results\n .filter(r => {\n // Convert cosine distance to similarity score\n // Cosine distance ranges from 0 (identical) to 2 (opposite)\n // Score = 1 - (distance / 2) gives range [0, 1]\n const distance = r._distance || 0;\n const score = 1 - (distance / 2);\n return score >= minScore;\n })\n .slice(0, limit)\n .map(r => {\n const distance = r._distance || 0;\n const score = 1 - (distance / 2);\n return {\n id: r.id as string,\n eventId: r.eventId as string,\n content: r.content as string,\n score,\n sessionId: r.sessionId as string,\n eventType: r.eventType as string,\n timestamp: r.timestamp as string\n };\n });\n }\n\n /**\n * Delete vector by event ID\n */\n async delete(eventId: string): Promise<void> {\n if (!this.table) return;\n await this.table.delete(`eventId = '${eventId}'`);\n }\n\n /**\n * Get total count of vectors\n */\n async count(): Promise<number> {\n if (!this.table) return 0;\n const result = await this.table.countRows();\n return result;\n }\n\n /**\n * Check if vector exists for event\n */\n async exists(eventId: string): Promise<boolean> {\n if (!this.table) return false;\n\n const results = await this.table\n .search([])\n .where(`eventId = '${eventId}'`)\n .limit(1)\n .toArray();\n\n return results.length > 0;\n }\n}\n", "/**\n * Local Embedding Generator using @xenova/transformers\n * AXIOMMIND Principle 7: Standard JSON format for vectors\n */\n\nimport { pipeline, Pipeline } from '@xenova/transformers';\n\nexport interface EmbeddingResult {\n vector: number[];\n model: string;\n dimensions: number;\n}\n\nexport class Embedder {\n private pipeline: Pipeline | null = null;\n private readonly modelName: string;\n private initialized = false;\n\n constructor(modelName: string = 'Xenova/all-MiniLM-L6-v2') {\n this.modelName = modelName;\n }\n\n /**\n * Initialize the embedding pipeline\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n this.pipeline = await pipeline('feature-extraction', this.modelName);\n this.initialized = true;\n }\n\n /**\n * Generate embedding for a single text\n */\n async embed(text: string): Promise<EmbeddingResult> {\n await this.initialize();\n\n if (!this.pipeline) {\n throw new Error('Embedding pipeline not initialized');\n }\n\n const output = await this.pipeline(text, {\n pooling: 'mean',\n normalize: true\n });\n\n const vector = Array.from(output.data as Float32Array);\n\n return {\n vector,\n model: this.modelName,\n dimensions: vector.length\n };\n }\n\n /**\n * Generate embeddings for multiple texts in batch\n */\n async embedBatch(texts: string[]): Promise<EmbeddingResult[]> {\n await this.initialize();\n\n if (!this.pipeline) {\n throw new Error('Embedding pipeline not initialized');\n }\n\n const results: EmbeddingResult[] = [];\n\n // Process in batches of 32 for memory efficiency\n const batchSize = 32;\n for (let i = 0; i < texts.length; i += batchSize) {\n const batch = texts.slice(i, i + batchSize);\n\n for (const text of batch) {\n const output = await this.pipeline(text, {\n pooling: 'mean',\n normalize: true\n });\n\n const vector = Array.from(output.data as Float32Array);\n\n results.push({\n vector,\n model: this.modelName,\n dimensions: vector.length\n });\n }\n }\n\n return results;\n }\n\n /**\n * Get embedding dimensions for the current model\n */\n async getDimensions(): Promise<number> {\n const result = await this.embed('test');\n return result.dimensions;\n }\n\n /**\n * Check if embedder is ready\n */\n isReady(): boolean {\n return this.initialized && this.pipeline !== null;\n }\n\n /**\n * Get model name\n */\n getModelName(): string {\n return this.modelName;\n }\n}\n\n// Singleton instance for reuse\nlet defaultEmbedder: Embedder | null = null;\n\nexport function getDefaultEmbedder(): Embedder {\n if (!defaultEmbedder) {\n defaultEmbedder = new Embedder();\n }\n return defaultEmbedder;\n}\n", "/**\n * Vector Outbox V2 - Transactional Outbox Pattern\n * AXIOMMIND Principle 6: DuckDB \u2192 outbox \u2192 LanceDB unidirectional flow\n */\n\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport { randomUUID } from 'crypto';\nimport type {\n OutboxJob,\n OutboxStatus,\n OutboxItemKind,\n VALID_OUTBOX_TRANSITIONS\n} from './types.js';\n\nexport interface OutboxConfig {\n embeddingVersion: string;\n maxRetries: number;\n stuckThresholdMs: number;\n cleanupDays: number;\n}\n\nconst DEFAULT_CONFIG: OutboxConfig = {\n embeddingVersion: 'v1',\n maxRetries: 3,\n stuckThresholdMs: 5 * 60 * 1000, // 5 minutes\n cleanupDays: 7\n};\n\nexport interface OutboxMetrics {\n pendingCount: number;\n processingCount: number;\n doneCount: number;\n failedCount: number;\n oldestPendingAge: number | null;\n}\n\nexport class VectorOutbox {\n private config: OutboxConfig;\n\n constructor(\n private db: Database,\n config?: Partial<OutboxConfig>\n ) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Enqueue item for vectorization (idempotent)\n */\n async enqueue(\n itemKind: OutboxItemKind,\n itemId: string,\n embeddingVersion?: string\n ): Promise<string> {\n const version = embeddingVersion ?? this.config.embeddingVersion;\n const jobId = randomUUID();\n const now = new Date().toISOString();\n\n await dbRun(\n this.db,\n `INSERT INTO vector_outbox (\n job_id, item_kind, item_id, embedding_version, status, retry_count, created_at, updated_at\n ) VALUES (?, ?, ?, ?, 'pending', 0, ?, ?)\n ON CONFLICT (item_kind, item_id, embedding_version) DO NOTHING`,\n [jobId, itemKind, itemId, version, now, now]\n );\n\n return jobId;\n }\n\n /**\n * Claim pending jobs for processing\n */\n async claimJobs(limit: number = 32): Promise<OutboxJob[]> {\n const now = new Date().toISOString();\n\n // Atomic claim using UPDATE RETURNING\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `UPDATE vector_outbox\n SET status = 'processing', updated_at = ?\n WHERE job_id IN (\n SELECT job_id FROM vector_outbox\n WHERE status = 'pending'\n ORDER BY created_at ASC\n LIMIT ?\n )\n RETURNING *`,\n [now, limit]\n );\n\n return rows.map(row => this.rowToJob(row));\n }\n\n /**\n * Mark job as done\n */\n async markDone(jobId: string): Promise<void> {\n await dbRun(\n this.db,\n `UPDATE vector_outbox\n SET status = 'done', updated_at = ?\n WHERE job_id = ?`,\n [new Date().toISOString(), jobId]\n );\n }\n\n /**\n * Mark job as failed\n */\n async markFailed(jobId: string, error: string): Promise<void> {\n const now = new Date().toISOString();\n\n // Check retry count\n const rows = await dbAll<{ retry_count: number }>(\n this.db,\n `SELECT retry_count FROM vector_outbox WHERE job_id = ?`,\n [jobId]\n );\n\n if (rows.length === 0) return;\n\n const retryCount = rows[0].retry_count;\n const newStatus: OutboxStatus = retryCount >= this.config.maxRetries - 1\n ? 'failed'\n : 'pending'; // Will retry\n\n await dbRun(\n this.db,\n `UPDATE vector_outbox\n SET status = ?, error = ?, retry_count = retry_count + 1, updated_at = ?\n WHERE job_id = ?`,\n [newStatus, error, now, jobId]\n );\n }\n\n /**\n * Get job by ID\n */\n async getJob(jobId: string): Promise<OutboxJob | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM vector_outbox WHERE job_id = ?`,\n [jobId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToJob(rows[0]);\n }\n\n /**\n * Get jobs by status\n */\n async getJobsByStatus(status: OutboxStatus, limit: number = 100): Promise<OutboxJob[]> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM vector_outbox\n WHERE status = ?\n ORDER BY created_at ASC\n LIMIT ?`,\n [status, limit]\n );\n\n return rows.map(row => this.rowToJob(row));\n }\n\n /**\n * Reconcile: recover stuck and retry failed jobs\n */\n async reconcile(): Promise<{ recovered: number; retried: number }> {\n const now = new Date();\n const stuckThreshold = new Date(now.getTime() - this.config.stuckThresholdMs);\n\n // Recover stuck processing jobs\n await dbRun(\n this.db,\n `UPDATE vector_outbox\n SET status = 'pending', updated_at = ?\n WHERE status = 'processing'\n AND updated_at < ?`,\n [now.toISOString(), stuckThreshold.toISOString()]\n );\n\n // Retry failed jobs that haven't exceeded max retries\n await dbRun(\n this.db,\n `UPDATE vector_outbox\n SET status = 'pending', updated_at = ?\n WHERE status = 'failed'\n AND retry_count < ?`,\n [now.toISOString(), this.config.maxRetries]\n );\n\n // Get counts (DuckDB doesn't return affected rows easily)\n const recoveredRows = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM vector_outbox\n WHERE status = 'pending' AND updated_at = ?`,\n [now.toISOString()]\n );\n\n return {\n recovered: 0, // Approximate\n retried: 0 // Approximate\n };\n }\n\n /**\n * Cleanup old done jobs\n */\n async cleanup(): Promise<number> {\n const threshold = new Date();\n threshold.setDate(threshold.getDate() - this.config.cleanupDays);\n\n await dbRun(\n this.db,\n `DELETE FROM vector_outbox\n WHERE status = 'done'\n AND updated_at < ?`,\n [threshold.toISOString()]\n );\n\n return 0; // DuckDB doesn't return affected rows easily\n }\n\n /**\n * Get metrics\n */\n async getMetrics(): Promise<OutboxMetrics> {\n const statusCounts = await dbAll<{ status: string; count: number }>(\n this.db,\n `SELECT status, COUNT(*) as count\n FROM vector_outbox\n GROUP BY status`\n );\n\n const oldestPending = await dbAll<{ created_at: string }>(\n this.db,\n `SELECT created_at FROM vector_outbox\n WHERE status = 'pending'\n ORDER BY created_at ASC\n LIMIT 1`\n );\n\n const metrics: OutboxMetrics = {\n pendingCount: 0,\n processingCount: 0,\n doneCount: 0,\n failedCount: 0,\n oldestPendingAge: null\n };\n\n for (const row of statusCounts) {\n switch (row.status) {\n case 'pending':\n metrics.pendingCount = Number(row.count);\n break;\n case 'processing':\n metrics.processingCount = Number(row.count);\n break;\n case 'done':\n metrics.doneCount = Number(row.count);\n break;\n case 'failed':\n metrics.failedCount = Number(row.count);\n break;\n }\n }\n\n if (oldestPending.length > 0) {\n const oldestDate = new Date(oldestPending[0].created_at);\n metrics.oldestPendingAge = Date.now() - oldestDate.getTime();\n }\n\n return metrics;\n }\n\n /**\n * Validate state transition\n */\n isValidTransition(from: OutboxStatus, to: OutboxStatus): boolean {\n const validTransitions = [\n { from: 'pending', to: 'processing' },\n { from: 'processing', to: 'done' },\n { from: 'processing', to: 'failed' },\n { from: 'failed', to: 'pending' }\n ];\n\n return validTransitions.some(t => t.from === from && t.to === to);\n }\n\n /**\n * Convert database row to OutboxJob\n */\n private rowToJob(row: Record<string, unknown>): OutboxJob {\n return {\n jobId: row.job_id as string,\n itemKind: row.item_kind as OutboxItemKind,\n itemId: row.item_id as string,\n embeddingVersion: row.embedding_version as string,\n status: row.status as OutboxStatus,\n retryCount: row.retry_count as number,\n error: row.error as string | undefined,\n createdAt: toDate(row.created_at),\n updatedAt: toDate(row.updated_at)\n };\n }\n}\n", "/**\n * Vector Worker - Single-Writer Pattern Implementation\n * AXIOMMIND Principle 6: DuckDB \u2192 outbox \u2192 LanceDB unidirectional flow\n */\n\nimport { EventStore } from './event-store.js';\nimport { VectorStore } from './vector-store.js';\nimport { Embedder } from './embedder.js';\nimport type { OutboxItem, VectorRecord } from './types.js';\n\nexport interface WorkerConfig {\n batchSize: number;\n pollIntervalMs: number;\n maxRetries: number;\n}\n\nconst DEFAULT_CONFIG: WorkerConfig = {\n batchSize: 32,\n pollIntervalMs: 1000,\n maxRetries: 3\n};\n\nexport class VectorWorker {\n private readonly eventStore: EventStore;\n private readonly vectorStore: VectorStore;\n private readonly embedder: Embedder;\n private readonly config: WorkerConfig;\n private running = false;\n private pollTimeout: NodeJS.Timeout | null = null;\n\n constructor(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n config: Partial<WorkerConfig> = {}\n ) {\n this.eventStore = eventStore;\n this.vectorStore = vectorStore;\n this.embedder = embedder;\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Start the worker polling loop\n */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.poll();\n }\n\n /**\n * Stop the worker\n */\n stop(): void {\n this.running = false;\n if (this.pollTimeout) {\n clearTimeout(this.pollTimeout);\n this.pollTimeout = null;\n }\n }\n\n /**\n * Process a single batch of outbox items\n */\n async processBatch(): Promise<number> {\n const items = await this.eventStore.getPendingOutboxItems(this.config.batchSize);\n\n if (items.length === 0) {\n return 0;\n }\n\n const successful: string[] = [];\n const failed: string[] = [];\n\n try {\n // Generate embeddings for all items\n const embeddings = await this.embedder.embedBatch(items.map(i => i.content));\n\n // Prepare vector records\n const records: VectorRecord[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const embedding = embeddings[i];\n\n // Get event details\n const event = await this.eventStore.getEvent(item.eventId);\n if (!event) {\n failed.push(item.id);\n continue;\n }\n\n records.push({\n id: `vec_${item.id}`,\n eventId: item.eventId,\n sessionId: event.sessionId,\n eventType: event.eventType,\n content: item.content,\n vector: embedding.vector,\n timestamp: event.timestamp.toISOString(),\n metadata: event.metadata\n });\n\n successful.push(item.id);\n }\n\n // Batch insert to vector store\n if (records.length > 0) {\n await this.vectorStore.upsertBatch(records);\n }\n\n // Mark successful items as done\n if (successful.length > 0) {\n await this.eventStore.completeOutboxItems(successful);\n }\n\n // Mark failed items\n if (failed.length > 0) {\n await this.eventStore.failOutboxItems(failed, 'Event not found');\n }\n\n return successful.length;\n } catch (error) {\n // Mark all items as failed\n const allIds = items.map(i => i.id);\n const errorMessage = error instanceof Error ? error.message : String(error);\n await this.eventStore.failOutboxItems(allIds, errorMessage);\n throw error;\n }\n }\n\n /**\n * Poll for new items\n */\n private async poll(): Promise<void> {\n if (!this.running) return;\n\n try {\n await this.processBatch();\n } catch (error) {\n console.error('Vector worker error:', error);\n }\n\n // Schedule next poll\n this.pollTimeout = setTimeout(() => this.poll(), this.config.pollIntervalMs);\n }\n\n /**\n * Process all pending items (blocking)\n */\n async processAll(): Promise<number> {\n let totalProcessed = 0;\n let processed: number;\n\n do {\n processed = await this.processBatch();\n totalProcessed += processed;\n } while (processed > 0);\n\n return totalProcessed;\n }\n\n /**\n * Check if worker is running\n */\n isRunning(): boolean {\n return this.running;\n }\n}\n\n/**\n * Create and start a vector worker\n */\nexport function createVectorWorker(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n config?: Partial<WorkerConfig>\n): VectorWorker {\n const worker = new VectorWorker(eventStore, vectorStore, embedder, config);\n return worker;\n}\n\n// ============================================================\n// Vector Worker V2 - Extended for Task Entity System\n// ============================================================\n\nimport { dbAll, type Database } from './db-wrapper.js';\nimport { VectorOutbox } from './vector-outbox.js';\nimport type { OutboxJob, OutboxItemKind } from './types.js';\n\nexport interface WorkerConfigV2 {\n batchSize: number;\n pollIntervalMs: number;\n maxRetries: number;\n embeddingVersion: string;\n}\n\nconst DEFAULT_CONFIG_V2: WorkerConfigV2 = {\n batchSize: 32,\n pollIntervalMs: 1000,\n maxRetries: 3,\n embeddingVersion: 'v1'\n};\n\n/**\n * Content provider interface for different item kinds\n */\nexport interface ContentProvider {\n getContent(itemKind: OutboxItemKind, itemId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null>;\n}\n\n/**\n * Default content provider using database\n */\nexport class DefaultContentProvider implements ContentProvider {\n constructor(private db: Database) {}\n\n async getContent(itemKind: OutboxItemKind, itemId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n switch (itemKind) {\n case 'entry':\n return this.getEntryContent(itemId);\n case 'task_title':\n return this.getTaskTitleContent(itemId);\n case 'event':\n return this.getEventContent(itemId);\n default:\n return null;\n }\n }\n\n private async getEntryContent(entryId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT title, content_json, entry_type FROM entries WHERE entry_id = ?`,\n [entryId]\n );\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n const contentJson = typeof row.content_json === 'string'\n ? JSON.parse(row.content_json)\n : row.content_json;\n\n return {\n content: `${row.title}\\n${JSON.stringify(contentJson)}`,\n metadata: {\n itemKind: 'entry',\n entryType: row.entry_type\n }\n };\n }\n\n private async getTaskTitleContent(taskId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT title, search_text, current_json FROM entities\n WHERE entity_id = ? AND entity_type = 'task'`,\n [taskId]\n );\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n return {\n content: row.search_text as string || row.title as string,\n metadata: {\n itemKind: 'task_title',\n entityType: 'task'\n }\n };\n }\n\n private async getEventContent(eventId: string): Promise<{\n content: string;\n metadata: Record<string, unknown>;\n } | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT content, event_type, session_id FROM events WHERE id = ?`,\n [eventId]\n );\n\n if (rows.length === 0) return null;\n\n const row = rows[0];\n return {\n content: row.content as string,\n metadata: {\n itemKind: 'event',\n eventType: row.event_type,\n sessionId: row.session_id\n }\n };\n }\n}\n\n/**\n * Vector Worker V2 - Supports multiple item kinds\n */\nexport class VectorWorkerV2 {\n private readonly outbox: VectorOutbox;\n private readonly vectorStore: VectorStore;\n private readonly embedder: Embedder;\n private readonly contentProvider: ContentProvider;\n private readonly config: WorkerConfigV2;\n private running = false;\n private pollTimeout: NodeJS.Timeout | null = null;\n\n constructor(\n db: Database,\n vectorStore: VectorStore,\n embedder: Embedder,\n config: Partial<WorkerConfigV2> = {},\n contentProvider?: ContentProvider\n ) {\n this.outbox = new VectorOutbox(db, {\n embeddingVersion: config.embeddingVersion ?? DEFAULT_CONFIG_V2.embeddingVersion,\n maxRetries: config.maxRetries ?? DEFAULT_CONFIG_V2.maxRetries\n });\n this.vectorStore = vectorStore;\n this.embedder = embedder;\n this.config = { ...DEFAULT_CONFIG_V2, ...config };\n this.contentProvider = contentProvider ?? new DefaultContentProvider(db);\n }\n\n /**\n * Start the worker polling loop\n */\n start(): void {\n if (this.running) return;\n this.running = true;\n this.poll();\n }\n\n /**\n * Stop the worker\n */\n stop(): void {\n this.running = false;\n if (this.pollTimeout) {\n clearTimeout(this.pollTimeout);\n this.pollTimeout = null;\n }\n }\n\n /**\n * Process a single batch of outbox jobs\n */\n async processBatch(): Promise<number> {\n const jobs = await this.outbox.claimJobs(this.config.batchSize);\n\n if (jobs.length === 0) {\n return 0;\n }\n\n let successCount = 0;\n\n for (const job of jobs) {\n try {\n await this.processJob(job);\n await this.outbox.markDone(job.jobId);\n successCount++;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n await this.outbox.markFailed(job.jobId, errorMessage);\n }\n }\n\n return successCount;\n }\n\n /**\n * Process a single job\n */\n private async processJob(job: OutboxJob): Promise<void> {\n // Get content\n const contentData = await this.contentProvider.getContent(job.itemKind, job.itemId);\n\n if (!contentData) {\n // Item not found, mark as done (skip)\n return;\n }\n\n // Generate embedding\n const embedding = await this.embedder.embed(contentData.content);\n\n // Upsert to vector store\n const record: VectorRecord = {\n id: `${job.itemKind}_${job.itemId}_${job.embeddingVersion}`,\n eventId: job.itemKind === 'event' ? job.itemId : '',\n sessionId: (contentData.metadata.sessionId as string) ?? '',\n eventType: (contentData.metadata.eventType as string) ?? job.itemKind,\n content: contentData.content,\n vector: embedding.vector,\n timestamp: new Date().toISOString(),\n metadata: {\n ...contentData.metadata,\n embeddingVersion: job.embeddingVersion\n }\n };\n\n // Use idempotent upsert (delete + add)\n await this.vectorStore.upsertBatch([record]);\n }\n\n /**\n * Poll for new jobs\n */\n private async poll(): Promise<void> {\n if (!this.running) return;\n\n try {\n await this.processBatch();\n } catch (error) {\n console.error('Vector worker V2 error:', error);\n }\n\n // Schedule next poll\n this.pollTimeout = setTimeout(() => this.poll(), this.config.pollIntervalMs);\n }\n\n /**\n * Process all pending jobs (blocking)\n */\n async processAll(): Promise<number> {\n let totalProcessed = 0;\n let processed: number;\n\n do {\n processed = await this.processBatch();\n totalProcessed += processed;\n } while (processed > 0);\n\n return totalProcessed;\n }\n\n /**\n * Run reconciliation\n */\n async reconcile(): Promise<{ recovered: number; retried: number }> {\n return this.outbox.reconcile();\n }\n\n /**\n * Get metrics\n */\n async getMetrics() {\n return this.outbox.getMetrics();\n }\n\n /**\n * Check if worker is running\n */\n isRunning(): boolean {\n return this.running;\n }\n\n /**\n * Get the outbox instance for direct access\n */\n getOutbox(): VectorOutbox {\n return this.outbox;\n }\n}\n\n/**\n * Create a Vector Worker V2 instance\n */\nexport function createVectorWorkerV2(\n db: Database,\n vectorStore: VectorStore,\n embedder: Embedder,\n config?: Partial<WorkerConfigV2>\n): VectorWorkerV2 {\n return new VectorWorkerV2(db, vectorStore, embedder, config);\n}\n", "/**\n * AXIOMMIND Matcher - Weighted scoring with confidence classification\n * Implements matching thresholds: high (\u22650.92), suggested (\u22650.75), none (<0.75)\n */\n\nimport type {\n MemoryEvent,\n MemoryMatch,\n MatchResult,\n MatchConfidence,\n MATCH_THRESHOLDS\n} from './types.js';\nimport { SearchResult } from './vector-store.js';\n\nexport interface MatchWeights {\n semanticSimilarity: number;\n ftsScore: number;\n recencyBonus: number;\n statusWeight: number;\n}\n\nexport interface MatcherConfig {\n weights: MatchWeights;\n minCombinedScore: number;\n minGap: number;\n suggestionThreshold: number;\n}\n\nconst DEFAULT_CONFIG: MatcherConfig = {\n weights: {\n semanticSimilarity: 0.4,\n ftsScore: 0.25,\n recencyBonus: 0.2,\n statusWeight: 0.15\n },\n minCombinedScore: 0.92,\n minGap: 0.03,\n suggestionThreshold: 0.75\n};\n\nexport class Matcher {\n private readonly config: MatcherConfig;\n\n constructor(config: Partial<MatcherConfig> = {}) {\n this.config = {\n ...DEFAULT_CONFIG,\n ...config,\n weights: { ...DEFAULT_CONFIG.weights, ...config.weights }\n };\n }\n\n /**\n * Calculate combined score using AXIOMMIND weighted formula\n */\n calculateCombinedScore(\n semanticScore: number,\n ftsScore: number = 0,\n recencyDays: number = 0,\n isActive: boolean = true\n ): number {\n const { weights } = this.config;\n\n // Recency bonus: decays over 30 days\n const recencyBonus = Math.max(0, 1 - recencyDays / 30);\n\n // Status weight: active events get full weight\n const statusMultiplier = isActive ? 1.0 : 0.7;\n\n const combinedScore =\n weights.semanticSimilarity * semanticScore +\n weights.ftsScore * ftsScore +\n weights.recencyBonus * recencyBonus +\n weights.statusWeight * statusMultiplier;\n\n return Math.min(1.0, combinedScore);\n }\n\n /**\n * Classify match confidence based on AXIOMMIND thresholds\n */\n classifyConfidence(\n topScore: number,\n secondScore: number | null\n ): MatchConfidence {\n const { minCombinedScore, minGap, suggestionThreshold } = this.config;\n\n // Calculate gap (infinity if no second match)\n const gap = secondScore !== null ? topScore - secondScore : Infinity;\n\n // High confidence: score \u2265 0.92 AND gap \u2265 0.03\n if (topScore >= minCombinedScore && gap >= minGap) {\n return 'high';\n }\n\n // Suggested: score \u2265 0.75\n if (topScore >= suggestionThreshold) {\n return 'suggested';\n }\n\n // No match\n return 'none';\n }\n\n /**\n * Match search results to find best memory\n */\n matchSearchResults(\n results: SearchResult[],\n getEventAge: (eventId: string) => number\n ): MatchResult {\n if (results.length === 0) {\n return {\n match: null,\n confidence: 'none'\n };\n }\n\n // Calculate combined scores\n const scoredResults = results.map(result => {\n const ageDays = getEventAge(result.eventId);\n const combinedScore = this.calculateCombinedScore(\n result.score,\n 0, // FTS score - would need to be passed in\n ageDays,\n true // Assume active\n );\n\n return {\n result,\n combinedScore\n };\n });\n\n // Sort by combined score\n scoredResults.sort((a, b) => b.combinedScore - a.combinedScore);\n\n const topResult = scoredResults[0];\n const secondScore = scoredResults.length > 1 ? scoredResults[1].combinedScore : null;\n\n // Classify confidence\n const confidence = this.classifyConfidence(topResult.combinedScore, secondScore);\n\n // Build match result\n const match: MemoryMatch = {\n event: {\n id: topResult.result.eventId,\n eventType: topResult.result.eventType as 'user_prompt' | 'agent_response' | 'session_summary',\n sessionId: topResult.result.sessionId,\n timestamp: new Date(topResult.result.timestamp),\n content: topResult.result.content,\n canonicalKey: '', // Would need to be fetched\n dedupeKey: '' // Would need to be fetched\n },\n score: topResult.combinedScore\n };\n\n const gap = secondScore !== null ? topResult.combinedScore - secondScore : undefined;\n\n // Build alternatives for suggested matches\n const alternatives = confidence === 'suggested'\n ? scoredResults.slice(1, 4).map(sr => ({\n event: {\n id: sr.result.eventId,\n eventType: sr.result.eventType as 'user_prompt' | 'agent_response' | 'session_summary',\n sessionId: sr.result.sessionId,\n timestamp: new Date(sr.result.timestamp),\n content: sr.result.content,\n canonicalKey: '',\n dedupeKey: ''\n },\n score: sr.combinedScore\n }))\n : undefined;\n\n return {\n match: confidence !== 'none' ? match : null,\n confidence,\n gap,\n alternatives\n };\n }\n\n /**\n * Calculate days between two dates\n */\n static calculateAgeDays(timestamp: Date): number {\n const now = new Date();\n const diffMs = now.getTime() - timestamp.getTime();\n return diffMs / (1000 * 60 * 60 * 24);\n }\n\n /**\n * Get current configuration\n */\n getConfig(): Readonly<MatcherConfig> {\n return { ...this.config };\n }\n}\n\n/**\n * Default matcher instance\n */\nlet defaultMatcher: Matcher | null = null;\n\nexport function getDefaultMatcher(): Matcher {\n if (!defaultMatcher) {\n defaultMatcher = new Matcher();\n }\n return defaultMatcher;\n}\n", "/**\n * Evidence Aligner V2 - AXIOMMIND Principle 4\n * Quote-only approach: LLM provides quote, pipeline calculates span\n * 3-step alignment: exact \u2192 normalized \u2192 fuzzy\n */\n\nimport { createHash } from 'crypto';\nimport type {\n EvidenceSpan,\n ExtractedEvidence,\n AlignedEvidence,\n FailedEvidence,\n EvidenceAlignResult\n} from './types.js';\n\nexport interface AlignmentResult {\n isAligned: boolean;\n confidence: number;\n spans: EvidenceSpan[];\n missingClaims: string[];\n}\n\nexport interface AlignmentOptions {\n minMatchLength: number;\n fuzzyThreshold: number;\n maxMissingClaims: number;\n}\n\n// V2 Options\nexport interface AlignmentOptionsV2 {\n minMatchLength: number;\n exactMatchBonus: number;\n normalizedThreshold: number;\n fuzzyThreshold: number;\n maxMissingRatio: number;\n}\n\nconst DEFAULT_OPTIONS: AlignmentOptions = {\n minMatchLength: 10,\n fuzzyThreshold: 0.8,\n maxMissingClaims: 2\n};\n\nconst DEFAULT_OPTIONS_V2: AlignmentOptionsV2 = {\n minMatchLength: 5,\n exactMatchBonus: 1.0,\n normalizedThreshold: 0.95,\n fuzzyThreshold: 0.85,\n maxMissingRatio: 0.2\n};\n\n// V2 Alignment result for entries\nexport interface AlignResultV2 {\n evidenceAligned: boolean;\n alignedCount: number;\n failedCount: number;\n results: EvidenceAlignResult[];\n overallConfidence: number;\n}\n\nexport class EvidenceAligner {\n private readonly options: AlignmentOptions;\n\n constructor(options: Partial<AlignmentOptions> = {}) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n /**\n * Align claims against source content\n * Returns evidence spans showing where claims are supported\n */\n align(claims: string[], sourceContent: string): AlignmentResult {\n const spans: EvidenceSpan[] = [];\n const missingClaims: string[] = [];\n const normalizedSource = this.normalize(sourceContent);\n\n for (const claim of claims) {\n const normalizedClaim = this.normalize(claim);\n\n // Skip very short claims\n if (normalizedClaim.length < this.options.minMatchLength) {\n continue;\n }\n\n // Try exact match first\n const exactSpan = this.findExactMatch(normalizedClaim, normalizedSource, sourceContent);\n if (exactSpan) {\n spans.push(exactSpan);\n continue;\n }\n\n // Try fuzzy match\n const fuzzySpan = this.findFuzzyMatch(normalizedClaim, normalizedSource, sourceContent);\n if (fuzzySpan && fuzzySpan.confidence >= this.options.fuzzyThreshold) {\n spans.push(fuzzySpan);\n continue;\n }\n\n // Claim not found in source\n missingClaims.push(claim);\n }\n\n // Calculate overall alignment confidence\n const totalClaims = claims.length;\n const alignedClaims = spans.length;\n const confidence = totalClaims > 0 ? alignedClaims / totalClaims : 1.0;\n\n // Alignment is valid if missing claims are within threshold\n const isAligned = missingClaims.length <= this.options.maxMissingClaims;\n\n return {\n isAligned,\n confidence,\n spans,\n missingClaims\n };\n }\n\n /**\n * Find exact substring match\n */\n private findExactMatch(\n normalizedClaim: string,\n normalizedSource: string,\n originalSource: string\n ): EvidenceSpan | null {\n const index = normalizedSource.indexOf(normalizedClaim);\n\n if (index === -1) {\n return null;\n }\n\n return {\n start: index,\n end: index + normalizedClaim.length,\n confidence: 1.0,\n matchType: 'exact',\n originalQuote: originalSource.slice(index, index + normalizedClaim.length),\n alignedText: normalizedClaim\n };\n }\n\n /**\n * Find fuzzy match using sliding window\n */\n private findFuzzyMatch(\n normalizedClaim: string,\n normalizedSource: string,\n originalSource: string\n ): EvidenceSpan | null {\n const windowSize = normalizedClaim.length;\n let bestMatch: { index: number; similarity: number } | null = null;\n\n // Slide window across source\n for (let i = 0; i <= normalizedSource.length - windowSize; i++) {\n const window = normalizedSource.slice(i, i + windowSize);\n const similarity = this.calculateSimilarity(normalizedClaim, window);\n\n if (!bestMatch || similarity > bestMatch.similarity) {\n bestMatch = { index: i, similarity };\n }\n }\n\n if (!bestMatch || bestMatch.similarity < this.options.fuzzyThreshold) {\n return null;\n }\n\n return {\n start: bestMatch.index,\n end: bestMatch.index + windowSize,\n confidence: bestMatch.similarity,\n matchType: 'fuzzy',\n originalQuote: originalSource.slice(bestMatch.index, bestMatch.index + windowSize),\n alignedText: normalizedClaim\n };\n }\n\n /**\n * Calculate similarity between two strings using Jaccard coefficient\n */\n private calculateSimilarity(a: string, b: string): number {\n const setA = new Set(this.tokenize(a));\n const setB = new Set(this.tokenize(b));\n\n const intersection = new Set([...setA].filter(x => setB.has(x)));\n const union = new Set([...setA, ...setB]);\n\n return intersection.size / union.size;\n }\n\n /**\n * Tokenize text into words\n */\n private tokenize(text: string): string[] {\n return text.toLowerCase().split(/\\s+/).filter(t => t.length > 0);\n }\n\n /**\n * Normalize text for comparison\n */\n private normalize(text: string): string {\n return text\n .normalize('NFKC')\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s]/gu, '')\n .replace(/\\s+/g, ' ')\n .trim();\n }\n\n /**\n * Extract claims from a response text\n * Splits on sentence boundaries and filters short sentences\n */\n extractClaims(text: string): string[] {\n // Split on sentence boundaries\n const sentences = text.split(/[.!?]+/).map(s => s.trim()).filter(s => s.length > 0);\n\n // Filter out very short sentences and questions\n return sentences.filter(s => {\n return s.length >= this.options.minMatchLength && !s.endsWith('?');\n });\n }\n\n /**\n * Verify that a response is grounded in the provided context\n */\n verifyGrounding(response: string, context: string[]): AlignmentResult {\n const claims = this.extractClaims(response);\n const combinedContext = context.join(' ');\n\n return this.align(claims, combinedContext);\n }\n\n // ============================================================\n // V2 Methods: Quote-only alignment\n // ============================================================\n\n private optionsV2: AlignmentOptionsV2 = DEFAULT_OPTIONS_V2;\n\n /**\n * Configure V2 options\n */\n configureV2(options: Partial<AlignmentOptionsV2>): void {\n this.optionsV2 = { ...DEFAULT_OPTIONS_V2, ...options };\n }\n\n /**\n * Align V2: Process extracted evidence with messageIndex and quote\n * @param sessionMessages - Array of session messages (original text)\n * @param evidence - Array of extracted evidence (messageIndex + quote)\n */\n alignV2(\n sessionMessages: string[],\n evidence: ExtractedEvidence[]\n ): AlignResultV2 {\n const results: EvidenceAlignResult[] = [];\n let alignedCount = 0;\n let totalConfidence = 0;\n\n for (const ev of evidence) {\n const result = this.alignSingleEvidence(sessionMessages, ev);\n results.push(result);\n\n if (result.aligned) {\n alignedCount++;\n totalConfidence += result.evidence.confidence;\n }\n }\n\n const failedCount = evidence.length - alignedCount;\n const maxMissing = Math.floor(evidence.length * this.optionsV2.maxMissingRatio);\n const evidenceAligned = failedCount <= maxMissing;\n const overallConfidence = evidence.length > 0\n ? totalConfidence / evidence.length\n : 1.0;\n\n return {\n evidenceAligned,\n alignedCount,\n failedCount,\n results,\n overallConfidence\n };\n }\n\n /**\n * Align a single evidence item\n */\n private alignSingleEvidence(\n sessionMessages: string[],\n evidence: ExtractedEvidence\n ): EvidenceAlignResult {\n const { messageIndex, quote } = evidence;\n\n // Validate messageIndex\n if (messageIndex < 0 || messageIndex >= sessionMessages.length) {\n return {\n aligned: false,\n evidence: {\n messageIndex,\n quote,\n failureReason: 'invalid_index'\n }\n };\n }\n\n // Validate quote\n if (!quote || quote.trim().length === 0) {\n return {\n aligned: false,\n evidence: {\n messageIndex,\n quote,\n failureReason: 'empty_quote'\n }\n };\n }\n\n const sourceMessage = sessionMessages[messageIndex];\n\n // Step 1: Try exact match\n const exactResult = this.tryExactMatchV2(quote, sourceMessage, messageIndex);\n if (exactResult) {\n return exactResult;\n }\n\n // Step 2: Try normalized match\n const normalizedResult = this.tryNormalizedMatchV2(quote, sourceMessage, messageIndex);\n if (normalizedResult) {\n return normalizedResult;\n }\n\n // Step 3: Try fuzzy match\n const fuzzyResult = this.tryFuzzyMatchV2(quote, sourceMessage, messageIndex);\n if (fuzzyResult) {\n return fuzzyResult;\n }\n\n // No match found\n return {\n aligned: false,\n evidence: {\n messageIndex,\n quote,\n failureReason: 'not_found'\n }\n };\n }\n\n /**\n * Try exact substring match\n */\n private tryExactMatchV2(\n quote: string,\n source: string,\n messageIndex: number\n ): EvidenceAlignResult | null {\n const index = source.indexOf(quote);\n\n if (index === -1) {\n return null;\n }\n\n return {\n aligned: true,\n evidence: {\n messageIndex,\n quote,\n spanStart: index,\n spanEnd: index + quote.length,\n quoteHash: this.hashQuote(quote),\n confidence: 1.0,\n matchMethod: 'exact'\n }\n };\n }\n\n /**\n * Try normalized match (whitespace collapsed)\n */\n private tryNormalizedMatchV2(\n quote: string,\n source: string,\n messageIndex: number\n ): EvidenceAlignResult | null {\n const normalizedQuote = this.normalizeWhitespace(quote);\n const normalizedSource = this.normalizeWhitespace(source);\n\n const normalizedIndex = normalizedSource.indexOf(normalizedQuote);\n if (normalizedIndex === -1) {\n return null;\n }\n\n // Map back to original positions\n const originalSpan = this.mapToOriginalPositions(\n source,\n normalizedSource,\n normalizedIndex,\n normalizedIndex + normalizedQuote.length\n );\n\n if (!originalSpan) {\n return null;\n }\n\n return {\n aligned: true,\n evidence: {\n messageIndex,\n quote,\n spanStart: originalSpan.start,\n spanEnd: originalSpan.end,\n quoteHash: this.hashQuote(quote),\n confidence: 0.95,\n matchMethod: 'normalized'\n }\n };\n }\n\n /**\n * Try fuzzy match using sliding window\n */\n private tryFuzzyMatchV2(\n quote: string,\n source: string,\n messageIndex: number\n ): EvidenceAlignResult | null {\n const normalizedQuote = this.normalize(quote);\n const normalizedSource = this.normalize(source);\n\n if (normalizedQuote.length < this.optionsV2.minMatchLength) {\n return null;\n }\n\n // Try different window sizes\n const windowSizes = [\n normalizedQuote.length,\n Math.floor(normalizedQuote.length * 1.1),\n Math.floor(normalizedQuote.length * 1.2)\n ];\n\n let bestMatch: {\n index: number;\n windowSize: number;\n similarity: number;\n } | null = null;\n\n for (const windowSize of windowSizes) {\n for (let i = 0; i <= normalizedSource.length - windowSize; i++) {\n const window = normalizedSource.slice(i, i + windowSize);\n const similarity = this.calculateLevenshteinSimilarity(normalizedQuote, window);\n\n if (similarity >= this.optionsV2.fuzzyThreshold) {\n if (!bestMatch || similarity > bestMatch.similarity) {\n bestMatch = { index: i, windowSize, similarity };\n }\n }\n }\n }\n\n if (!bestMatch) {\n return null;\n }\n\n // Map back to original positions (approximate)\n const originalSpan = this.mapToOriginalPositions(\n source,\n normalizedSource,\n bestMatch.index,\n bestMatch.index + bestMatch.windowSize\n );\n\n if (!originalSpan) {\n return null;\n }\n\n return {\n aligned: true,\n evidence: {\n messageIndex,\n quote,\n spanStart: originalSpan.start,\n spanEnd: originalSpan.end,\n quoteHash: this.hashQuote(quote),\n confidence: bestMatch.similarity,\n matchMethod: 'fuzzy'\n }\n };\n }\n\n /**\n * Normalize whitespace only (preserve other characters)\n */\n private normalizeWhitespace(text: string): string {\n return text\n .replace(/[\\t\\r]/g, ' ')\n .replace(/\\n+/g, ' ')\n .replace(/ +/g, ' ')\n .trim();\n }\n\n /**\n * Map normalized positions back to original\n */\n private mapToOriginalPositions(\n original: string,\n normalized: string,\n normalizedStart: number,\n normalizedEnd: number\n ): { start: number; end: number } | null {\n // Build position map\n const normalizedToOriginal: Map<number, number> = new Map();\n let normalizedPos = 0;\n\n for (let origPos = 0; origPos < original.length; origPos++) {\n const char = original[origPos];\n\n // Skip extra whitespace in original\n if (/\\s/.test(char)) {\n // Check if this whitespace contributes to normalized\n if (normalizedPos < normalized.length && /\\s/.test(normalized[normalizedPos])) {\n normalizedToOriginal.set(normalizedPos, origPos);\n normalizedPos++;\n\n // Skip consecutive whitespace in original\n while (origPos + 1 < original.length && /\\s/.test(original[origPos + 1])) {\n origPos++;\n }\n }\n } else {\n normalizedToOriginal.set(normalizedPos, origPos);\n normalizedPos++;\n }\n }\n\n const startOrig = normalizedToOriginal.get(normalizedStart);\n let endOrig = normalizedToOriginal.get(normalizedEnd - 1);\n\n if (startOrig === undefined) {\n return null;\n }\n\n if (endOrig === undefined) {\n // Use end of string\n endOrig = original.length - 1;\n }\n\n return {\n start: startOrig,\n end: endOrig + 1\n };\n }\n\n /**\n * Calculate Levenshtein distance similarity\n */\n private calculateLevenshteinSimilarity(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n\n if (m === 0) return n === 0 ? 1 : 0;\n if (n === 0) return 0;\n\n const dp: number[][] = Array(m + 1).fill(null).map(() => Array(n + 1).fill(0));\n\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n dp[i][j] = Math.min(\n dp[i - 1][j] + 1, // deletion\n dp[i][j - 1] + 1, // insertion\n dp[i - 1][j - 1] + cost // substitution\n );\n }\n }\n\n const distance = dp[m][n];\n const maxLen = Math.max(m, n);\n return 1 - distance / maxLen;\n }\n\n /**\n * Hash quote for deduplication\n */\n private hashQuote(quote: string): string {\n return createHash('sha256').update(quote).digest('hex').slice(0, 16);\n }\n\n /**\n * Convert V2 result to V1 format for backwards compatibility\n */\n convertToV1Result(v2Result: AlignResultV2): AlignmentResult {\n const spans: EvidenceSpan[] = [];\n const missingClaims: string[] = [];\n\n for (const result of v2Result.results) {\n if (result.aligned) {\n const ev = result.evidence as AlignedEvidence;\n spans.push({\n start: ev.spanStart,\n end: ev.spanEnd,\n confidence: ev.confidence,\n matchType: ev.matchMethod === 'exact' ? 'exact' : 'fuzzy',\n originalQuote: ev.quote,\n alignedText: ev.quote\n });\n } else {\n const ev = result.evidence as FailedEvidence;\n missingClaims.push(ev.quote);\n }\n }\n\n return {\n isAligned: v2Result.evidenceAligned,\n confidence: v2Result.overallConfidence,\n spans,\n missingClaims\n };\n }\n}\n\n/**\n * Default evidence aligner instance\n */\nlet defaultAligner: EvidenceAligner | null = null;\n\nexport function getDefaultAligner(): EvidenceAligner {\n if (!defaultAligner) {\n defaultAligner = new EvidenceAligner();\n }\n return defaultAligner;\n}\n", "/**\n * Memory Retriever - Unified retrieval interface\n * Combines vector search, event store lookups, and matching\n */\n\nimport { EventStore } from './event-store.js';\nimport { VectorStore, SearchResult } from './vector-store.js';\nimport { Embedder } from './embedder.js';\nimport { Matcher } from './matcher.js';\nimport { SharedStore } from './shared-store.js';\nimport { SharedVectorStore } from './shared-vector-store.js';\nimport type { MemoryEvent, MatchResult, Config, SharedTroubleshootingEntry } from './types.js';\n\nexport interface RetrievalOptions {\n topK: number;\n minScore: number;\n sessionId?: string;\n maxTokens: number;\n includeSessionContext: boolean;\n}\n\nexport interface RetrievalResult {\n memories: MemoryWithContext[];\n matchResult: MatchResult;\n totalTokens: number;\n context: string;\n}\n\nexport interface MemoryWithContext {\n event: MemoryEvent;\n score: number;\n sessionContext?: string;\n}\n\nexport interface UnifiedRetrievalOptions extends RetrievalOptions {\n includeShared?: boolean;\n projectHash?: string;\n}\n\nexport interface UnifiedRetrievalResult extends RetrievalResult {\n sharedMemories?: SharedTroubleshootingEntry[];\n}\n\nconst DEFAULT_OPTIONS: RetrievalOptions = {\n topK: 5,\n minScore: 0.7,\n maxTokens: 2000,\n includeSessionContext: true\n};\n\nexport interface SharedStoreOptions {\n sharedStore?: SharedStore;\n sharedVectorStore?: SharedVectorStore;\n}\n\nexport class Retriever {\n private readonly eventStore: EventStore;\n private readonly vectorStore: VectorStore;\n private readonly embedder: Embedder;\n private readonly matcher: Matcher;\n private sharedStore?: SharedStore;\n private sharedVectorStore?: SharedVectorStore;\n\n constructor(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher,\n sharedOptions?: SharedStoreOptions\n ) {\n this.eventStore = eventStore;\n this.vectorStore = vectorStore;\n this.embedder = embedder;\n this.matcher = matcher;\n this.sharedStore = sharedOptions?.sharedStore;\n this.sharedVectorStore = sharedOptions?.sharedVectorStore;\n }\n\n /**\n * Set shared stores after construction\n */\n setSharedStores(sharedStore: SharedStore, sharedVectorStore: SharedVectorStore): void {\n this.sharedStore = sharedStore;\n this.sharedVectorStore = sharedVectorStore;\n }\n\n /**\n * Retrieve relevant memories for a query\n */\n async retrieve(\n query: string,\n options: Partial<RetrievalOptions> = {}\n ): Promise<RetrievalResult> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n // Generate query embedding\n const queryEmbedding = await this.embedder.embed(query);\n\n // Search vector store\n const searchResults = await this.vectorStore.search(queryEmbedding.vector, {\n limit: opts.topK * 2, // Get extra for filtering\n minScore: opts.minScore,\n sessionId: opts.sessionId\n });\n\n // Get match result using AXIOMMIND matcher\n const matchResult = this.matcher.matchSearchResults(\n searchResults,\n (eventId) => this.getEventAgeDays(eventId)\n );\n\n // Enrich results with full event data and session context\n const memories = await this.enrichResults(searchResults.slice(0, opts.topK), opts);\n\n // Build context string\n const context = this.buildContext(memories, opts.maxTokens);\n\n return {\n memories,\n matchResult,\n totalTokens: this.estimateTokens(context),\n context\n };\n }\n\n /**\n * Retrieve with unified search (project + shared)\n */\n async retrieveUnified(\n query: string,\n options: Partial<UnifiedRetrievalOptions> = {}\n ): Promise<UnifiedRetrievalResult> {\n // Get project-local results first\n const projectResult = await this.retrieve(query, options);\n\n // If shared search is not requested or stores not available, return project results only\n if (!options.includeShared || !this.sharedStore || !this.sharedVectorStore) {\n return projectResult;\n }\n\n try {\n // Generate query embedding (reuse if possible)\n const queryEmbedding = await this.embedder.embed(query);\n\n // Vector search in shared store\n const sharedVectorResults = await this.sharedVectorStore.search(\n queryEmbedding.vector,\n {\n limit: options.topK || 5,\n minScore: options.minScore || 0.7,\n excludeProjectHash: options.projectHash\n }\n );\n\n // Get full entries from shared store\n const sharedMemories: SharedTroubleshootingEntry[] = [];\n for (const result of sharedVectorResults) {\n const entry = await this.sharedStore.get(result.entryId);\n if (entry) {\n // Exclude entries from current project if specified\n if (!options.projectHash || entry.sourceProjectHash !== options.projectHash) {\n sharedMemories.push(entry);\n // Record usage for ranking\n await this.sharedStore.recordUsage(entry.entryId);\n }\n }\n }\n\n // Build unified context\n const unifiedContext = this.buildUnifiedContext(projectResult, sharedMemories);\n\n return {\n ...projectResult,\n context: unifiedContext,\n totalTokens: this.estimateTokens(unifiedContext),\n sharedMemories\n };\n } catch (error) {\n // If shared search fails, return project results only\n console.error('Shared search failed:', error);\n return projectResult;\n }\n }\n\n /**\n * Build unified context combining project and shared memories\n */\n private buildUnifiedContext(\n projectResult: RetrievalResult,\n sharedMemories: SharedTroubleshootingEntry[]\n ): string {\n let context = projectResult.context;\n\n if (sharedMemories.length > 0) {\n context += '\\n\\n## Cross-Project Knowledge\\n\\n';\n for (const memory of sharedMemories.slice(0, 3)) {\n context += `### ${memory.title}\\n`;\n if (memory.symptoms.length > 0) {\n context += `**Symptoms:** ${memory.symptoms.join(', ')}\\n`;\n }\n context += `**Root Cause:** ${memory.rootCause}\\n`;\n context += `**Solution:** ${memory.solution}\\n`;\n if (memory.technologies && memory.technologies.length > 0) {\n context += `**Technologies:** ${memory.technologies.join(', ')}\\n`;\n }\n context += `_Confidence: ${(memory.confidence * 100).toFixed(0)}%_\\n\\n`;\n }\n }\n\n return context;\n }\n\n /**\n * Retrieve memories from a specific session\n */\n async retrieveFromSession(sessionId: string): Promise<MemoryEvent[]> {\n return this.eventStore.getSessionEvents(sessionId);\n }\n\n /**\n * Get recent memories across all sessions\n */\n async retrieveRecent(limit: number = 100): Promise<MemoryEvent[]> {\n return this.eventStore.getRecentEvents(limit);\n }\n\n /**\n * Enrich search results with full event data\n */\n private async enrichResults(\n results: SearchResult[],\n options: RetrievalOptions\n ): Promise<MemoryWithContext[]> {\n const memories: MemoryWithContext[] = [];\n\n for (const result of results) {\n const event = await this.eventStore.getEvent(result.eventId);\n if (!event) continue;\n\n let sessionContext: string | undefined;\n if (options.includeSessionContext) {\n sessionContext = await this.getSessionContext(event.sessionId, event.id);\n }\n\n memories.push({\n event,\n score: result.score,\n sessionContext\n });\n }\n\n return memories;\n }\n\n /**\n * Get surrounding context from the same session\n */\n private async getSessionContext(\n sessionId: string,\n eventId: string\n ): Promise<string | undefined> {\n const sessionEvents = await this.eventStore.getSessionEvents(sessionId);\n\n // Find the event index\n const eventIndex = sessionEvents.findIndex(e => e.id === eventId);\n if (eventIndex === -1) return undefined;\n\n // Get 1 event before and after for context\n const start = Math.max(0, eventIndex - 1);\n const end = Math.min(sessionEvents.length, eventIndex + 2);\n const contextEvents = sessionEvents.slice(start, end);\n\n if (contextEvents.length <= 1) return undefined;\n\n return contextEvents\n .filter(e => e.id !== eventId)\n .map(e => `[${e.eventType}]: ${e.content.slice(0, 200)}...`)\n .join('\\n');\n }\n\n /**\n * Build context string from memories (respecting token limit)\n */\n private buildContext(memories: MemoryWithContext[], maxTokens: number): string {\n const parts: string[] = [];\n let currentTokens = 0;\n\n for (const memory of memories) {\n const memoryText = this.formatMemory(memory);\n const memoryTokens = this.estimateTokens(memoryText);\n\n if (currentTokens + memoryTokens > maxTokens) {\n break;\n }\n\n parts.push(memoryText);\n currentTokens += memoryTokens;\n }\n\n if (parts.length === 0) {\n return '';\n }\n\n return `## Relevant Memories\\n\\n${parts.join('\\n\\n---\\n\\n')}`;\n }\n\n /**\n * Format a single memory for context\n */\n private formatMemory(memory: MemoryWithContext): string {\n const { event, score, sessionContext } = memory;\n const date = event.timestamp.toISOString().split('T')[0];\n\n let text = `**${event.eventType}** (${date}, score: ${score.toFixed(2)})\\n${event.content}`;\n\n if (sessionContext) {\n text += `\\n\\n_Context:_ ${sessionContext}`;\n }\n\n return text;\n }\n\n /**\n * Estimate token count (rough approximation)\n */\n private estimateTokens(text: string): number {\n // Rough estimate: ~4 characters per token\n return Math.ceil(text.length / 4);\n }\n\n /**\n * Get event age in days (for recency scoring)\n */\n private getEventAgeDays(eventId: string): number {\n // This would ideally cache event timestamps\n // For now, return 0 (assume recent)\n return 0;\n }\n}\n\n/**\n * Create a retriever with default components\n */\nexport function createRetriever(\n eventStore: EventStore,\n vectorStore: VectorStore,\n embedder: Embedder,\n matcher: Matcher\n): Retriever {\n return new Retriever(eventStore, vectorStore, embedder, matcher);\n}\n", "/**\n * Memory Graduation Pipeline - AXIOMMIND L0\u2192L1\u2192L2\u2192L3\u2192L4\n *\n * L0: EventStore (raw events, append-only)\n * L1: Structured JSON (session summaries, patterns)\n * L2: Type Candidates (Idris2-inspired, validated schemas)\n * L3: Verified Knowledge (cross-session validated)\n * L4: Active/Searchable (indexed, readily available)\n */\n\nimport { EventStore } from './event-store.js';\nimport type {\n MemoryEvent,\n MemoryLevel,\n GraduationResult,\n Insight,\n InsightType\n} from './types.js';\n\nexport interface GraduationCriteria {\n minAccessCount: number;\n minConfidence: number;\n minCrossSessionRefs: number;\n maxAgeDays: number;\n}\n\nexport interface LevelCriteria {\n L0toL1: GraduationCriteria;\n L1toL2: GraduationCriteria;\n L2toL3: GraduationCriteria;\n L3toL4: GraduationCriteria;\n}\n\nconst DEFAULT_CRITERIA: LevelCriteria = {\n L0toL1: {\n minAccessCount: 1,\n minConfidence: 0.5,\n minCrossSessionRefs: 0,\n maxAgeDays: 30\n },\n L1toL2: {\n minAccessCount: 3,\n minConfidence: 0.7,\n minCrossSessionRefs: 1,\n maxAgeDays: 60\n },\n L2toL3: {\n minAccessCount: 5,\n minConfidence: 0.85,\n minCrossSessionRefs: 2,\n maxAgeDays: 90\n },\n L3toL4: {\n minAccessCount: 10,\n minConfidence: 0.92,\n minCrossSessionRefs: 3,\n maxAgeDays: 180\n }\n};\n\nexport interface EventMetrics {\n eventId: string;\n accessCount: number;\n lastAccessed: Date;\n crossSessionRefs: number;\n confidence: number;\n}\n\nexport class GraduationPipeline {\n private readonly eventStore: EventStore;\n private readonly criteria: LevelCriteria;\n private readonly metrics: Map<string, EventMetrics> = new Map();\n\n constructor(\n eventStore: EventStore,\n criteria: Partial<LevelCriteria> = {}\n ) {\n this.eventStore = eventStore;\n this.criteria = {\n L0toL1: { ...DEFAULT_CRITERIA.L0toL1, ...criteria.L0toL1 },\n L1toL2: { ...DEFAULT_CRITERIA.L1toL2, ...criteria.L1toL2 },\n L2toL3: { ...DEFAULT_CRITERIA.L2toL3, ...criteria.L2toL3 },\n L3toL4: { ...DEFAULT_CRITERIA.L3toL4, ...criteria.L3toL4 }\n };\n }\n\n /**\n * Record an access to an event (used for graduation scoring)\n */\n recordAccess(eventId: string, fromSessionId: string, confidence: number = 1.0): void {\n const existing = this.metrics.get(eventId);\n\n if (existing) {\n existing.accessCount++;\n existing.lastAccessed = new Date();\n existing.confidence = Math.max(existing.confidence, confidence);\n // Track cross-session references\n // This would need more sophisticated tracking in production\n } else {\n this.metrics.set(eventId, {\n eventId,\n accessCount: 1,\n lastAccessed: new Date(),\n crossSessionRefs: 0,\n confidence\n });\n }\n }\n\n /**\n * Evaluate if an event should graduate to the next level\n */\n async evaluateGraduation(eventId: string, currentLevel: MemoryLevel): Promise<GraduationResult> {\n const metrics = this.metrics.get(eventId);\n\n if (!metrics) {\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: currentLevel,\n success: false,\n reason: 'No metrics available for event'\n };\n }\n\n const nextLevel = this.getNextLevel(currentLevel);\n if (!nextLevel) {\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: currentLevel,\n success: false,\n reason: 'Already at maximum level'\n };\n }\n\n const criteria = this.getCriteria(currentLevel, nextLevel);\n const evaluation = this.checkCriteria(metrics, criteria);\n\n if (evaluation.passed) {\n // Update level in event store\n await this.eventStore.updateMemoryLevel(eventId, nextLevel);\n\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: nextLevel,\n success: true\n };\n }\n\n return {\n eventId,\n fromLevel: currentLevel,\n toLevel: currentLevel,\n success: false,\n reason: evaluation.reason\n };\n }\n\n /**\n * Run graduation evaluation for all events at a given level\n */\n async graduateBatch(level: MemoryLevel): Promise<GraduationResult[]> {\n const results: GraduationResult[] = [];\n\n for (const [eventId, metrics] of this.metrics) {\n const result = await this.evaluateGraduation(eventId, level);\n results.push(result);\n }\n\n return results;\n }\n\n /**\n * Extract insights from graduated events (L1+)\n */\n extractInsights(events: MemoryEvent[]): Insight[] {\n const insights: Insight[] = [];\n\n // Pattern detection: Look for repeated themes\n const patterns = this.detectPatterns(events);\n for (const pattern of patterns) {\n insights.push({\n id: crypto.randomUUID(),\n insightType: 'pattern',\n content: pattern.description,\n canonicalKey: pattern.key,\n confidence: pattern.confidence,\n sourceEvents: pattern.eventIds,\n createdAt: new Date(),\n lastUpdated: new Date()\n });\n }\n\n // Preference detection: Look for user preferences\n const preferences = this.detectPreferences(events);\n for (const pref of preferences) {\n insights.push({\n id: crypto.randomUUID(),\n insightType: 'preference',\n content: pref.description,\n canonicalKey: pref.key,\n confidence: pref.confidence,\n sourceEvents: pref.eventIds,\n createdAt: new Date(),\n lastUpdated: new Date()\n });\n }\n\n return insights;\n }\n\n /**\n * Get the next level in the graduation pipeline\n */\n private getNextLevel(current: MemoryLevel): MemoryLevel | null {\n const levels: MemoryLevel[] = ['L0', 'L1', 'L2', 'L3', 'L4'];\n const currentIndex = levels.indexOf(current);\n\n if (currentIndex === -1 || currentIndex >= levels.length - 1) {\n return null;\n }\n\n return levels[currentIndex + 1];\n }\n\n /**\n * Get criteria for level transition\n */\n private getCriteria(from: MemoryLevel, to: MemoryLevel): GraduationCriteria {\n const key = `${from}to${to}` as keyof LevelCriteria;\n return this.criteria[key] || DEFAULT_CRITERIA.L0toL1;\n }\n\n /**\n * Check if metrics meet criteria\n */\n private checkCriteria(\n metrics: EventMetrics,\n criteria: GraduationCriteria\n ): { passed: boolean; reason?: string } {\n if (metrics.accessCount < criteria.minAccessCount) {\n return {\n passed: false,\n reason: `Access count ${metrics.accessCount} < ${criteria.minAccessCount}`\n };\n }\n\n if (metrics.confidence < criteria.minConfidence) {\n return {\n passed: false,\n reason: `Confidence ${metrics.confidence} < ${criteria.minConfidence}`\n };\n }\n\n if (metrics.crossSessionRefs < criteria.minCrossSessionRefs) {\n return {\n passed: false,\n reason: `Cross-session refs ${metrics.crossSessionRefs} < ${criteria.minCrossSessionRefs}`\n };\n }\n\n const ageDays = (Date.now() - metrics.lastAccessed.getTime()) / (1000 * 60 * 60 * 24);\n if (ageDays > criteria.maxAgeDays) {\n return {\n passed: false,\n reason: `Event too old: ${ageDays.toFixed(1)} days > ${criteria.maxAgeDays}`\n };\n }\n\n return { passed: true };\n }\n\n /**\n * Detect patterns in events\n */\n private detectPatterns(events: MemoryEvent[]): Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> {\n // Simple pattern detection: group by canonical key and look for repeats\n const keyGroups = new Map<string, MemoryEvent[]>();\n\n for (const event of events) {\n const existing = keyGroups.get(event.canonicalKey) || [];\n existing.push(event);\n keyGroups.set(event.canonicalKey, existing);\n }\n\n const patterns: Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> = [];\n\n for (const [key, groupEvents] of keyGroups) {\n if (groupEvents.length >= 2) {\n patterns.push({\n key,\n description: `Repeated topic: ${key.slice(0, 50)}`,\n confidence: Math.min(1.0, groupEvents.length / 5),\n eventIds: groupEvents.map(e => e.id)\n });\n }\n }\n\n return patterns;\n }\n\n /**\n * Detect user preferences from events\n */\n private detectPreferences(events: MemoryEvent[]): Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> {\n // Simple preference detection: look for keywords\n const preferenceKeywords = ['prefer', 'like', 'want', 'always', 'never', 'favorite'];\n const preferences: Array<{\n key: string;\n description: string;\n confidence: number;\n eventIds: string[];\n }> = [];\n\n for (const event of events) {\n if (event.eventType !== 'user_prompt') continue;\n\n const lowerContent = event.content.toLowerCase();\n for (const keyword of preferenceKeywords) {\n if (lowerContent.includes(keyword)) {\n preferences.push({\n key: `preference_${keyword}_${event.id.slice(0, 8)}`,\n description: `User preference: ${event.content.slice(0, 100)}`,\n confidence: 0.7,\n eventIds: [event.id]\n });\n break;\n }\n }\n }\n\n return preferences;\n }\n\n /**\n * Get graduation statistics\n */\n async getStats(): Promise<{ level: string; count: number }[]> {\n return this.eventStore.getLevelStats();\n }\n}\n\n/**\n * Create graduation pipeline with default settings\n */\nexport function createGraduationPipeline(eventStore: EventStore): GraduationPipeline {\n return new GraduationPipeline(eventStore);\n}\n", "/**\n * Task Matcher - Find existing tasks by title similarity\n * AXIOMMIND: strict matching (\u22650.92, gap\u22650.03)\n */\n\nimport { dbAll, toDate, type Database } from '../db-wrapper.js';\nimport type { Entity, MatchConfidence } from '../types.js';\nimport { makeEntityCanonicalKey } from '../canonical-key.js';\nimport { MATCH_THRESHOLDS } from '../types.js';\n\nexport interface TaskMatchResult {\n match: Entity | null;\n confidence: MatchConfidence;\n score: number;\n gap?: number;\n candidates?: Entity[];\n}\n\nexport interface TaskMatcherConfig {\n minCombinedScore: number;\n minGap: number;\n suggestionThreshold: number;\n maxCandidates: number;\n}\n\nconst DEFAULT_CONFIG: TaskMatcherConfig = {\n minCombinedScore: MATCH_THRESHOLDS.minCombinedScore,\n minGap: MATCH_THRESHOLDS.minGap,\n suggestionThreshold: MATCH_THRESHOLDS.suggestionThreshold,\n maxCandidates: 5\n};\n\nexport class TaskMatcher {\n private readonly config: TaskMatcherConfig;\n\n constructor(\n private db: Database,\n config?: Partial<TaskMatcherConfig>\n ) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Find task by exact canonical key match\n */\n async findExact(title: string, project?: string): Promise<Entity | null> {\n const canonicalKey = makeEntityCanonicalKey('task', title, { project });\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM entities\n WHERE entity_type = 'task' AND canonical_key = ?\n AND status = 'active'`,\n [canonicalKey]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEntity(rows[0]);\n }\n\n /**\n * Find task by alias\n */\n async findByAlias(title: string, project?: string): Promise<Entity | null> {\n const canonicalKey = makeEntityCanonicalKey('task', title, { project });\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT e.* FROM entities e\n JOIN entity_aliases a ON e.entity_id = a.entity_id\n WHERE a.entity_type = 'task' AND a.canonical_key = ?\n AND e.status = 'active'`,\n [canonicalKey]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEntity(rows[0]);\n }\n\n /**\n * Search tasks by text (FTS-like)\n */\n async searchByText(query: string, project?: string): Promise<Array<{ entity: Entity; score: number }>> {\n const searchPattern = `%${query.toLowerCase()}%`;\n\n let sql = `\n SELECT *,\n CASE\n WHEN title_norm = ? THEN 1.0\n WHEN title_norm LIKE ? THEN 0.9\n ELSE 0.7\n END as match_score\n FROM entities\n WHERE entity_type = 'task'\n AND status = 'active'\n AND (title_norm LIKE ? OR search_text LIKE ?)\n `;\n\n const normalizedQuery = query.toLowerCase().trim();\n const params: unknown[] = [normalizedQuery, `%${normalizedQuery}%`, searchPattern, searchPattern];\n\n if (project) {\n sql += ` AND json_extract(current_json, '$.project') = ?`;\n params.push(project);\n }\n\n sql += ` ORDER BY match_score DESC, updated_at DESC LIMIT ?`;\n params.push(this.config.maxCandidates);\n\n const rows = await dbAll<Record<string, unknown>>(this.db, sql, params);\n\n return rows.map(row => ({\n entity: this.rowToEntity(row),\n score: row.match_score as number\n }));\n }\n\n /**\n * Match task with confidence classification\n * Returns high confidence only if score \u2265 0.92 AND gap \u2265 0.03\n */\n async match(title: string, project?: string): Promise<TaskMatchResult> {\n // Step 1: Try exact match\n const exactMatch = await this.findExact(title, project);\n if (exactMatch) {\n return {\n match: exactMatch,\n confidence: 'high',\n score: 1.0\n };\n }\n\n // Step 2: Try alias match\n const aliasMatch = await this.findByAlias(title, project);\n if (aliasMatch) {\n return {\n match: aliasMatch,\n confidence: 'high',\n score: 0.98\n };\n }\n\n // Step 3: Try text search\n const searchResults = await this.searchByText(title, project);\n if (searchResults.length === 0) {\n return {\n match: null,\n confidence: 'none',\n score: 0\n };\n }\n\n const topResult = searchResults[0];\n const secondScore = searchResults.length > 1 ? searchResults[1].score : null;\n\n // Calculate gap\n const gap = secondScore !== null ? topResult.score - secondScore : Infinity;\n\n // Classify confidence\n const confidence = this.classifyConfidence(topResult.score, gap);\n\n // For strict matching, only return high confidence if criteria met\n if (confidence === 'high') {\n return {\n match: topResult.entity,\n confidence: 'high',\n score: topResult.score,\n gap\n };\n }\n\n // For suggested, return candidates\n if (confidence === 'suggested') {\n return {\n match: null,\n confidence: 'suggested',\n score: topResult.score,\n gap,\n candidates: searchResults.slice(0, this.config.maxCandidates).map(r => r.entity)\n };\n }\n\n return {\n match: null,\n confidence: 'none',\n score: topResult.score\n };\n }\n\n /**\n * Classify confidence based on AXIOMMIND thresholds\n */\n private classifyConfidence(score: number, gap: number): MatchConfidence {\n const { minCombinedScore, minGap, suggestionThreshold } = this.config;\n\n // High confidence: score \u2265 0.92 AND gap \u2265 0.03\n if (score >= minCombinedScore && gap >= minGap) {\n return 'high';\n }\n\n // Suggested: score \u2265 0.75\n if (score >= suggestionThreshold) {\n return 'suggested';\n }\n\n return 'none';\n }\n\n /**\n * Get suggestion candidates (for condition fallback)\n */\n async getSuggestionCandidates(title: string, project?: string): Promise<Entity[]> {\n const searchResults = await this.searchByText(title, project);\n return searchResults\n .filter(r => r.score >= this.config.suggestionThreshold)\n .slice(0, this.config.maxCandidates)\n .map(r => r.entity);\n }\n\n /**\n * Convert database row to Entity\n */\n private rowToEntity(row: Record<string, unknown>): Entity {\n return {\n entityId: row.entity_id as string,\n entityType: row.entity_type as 'task' | 'condition' | 'artifact',\n canonicalKey: row.canonical_key as string,\n title: row.title as string,\n stage: row.stage as 'raw' | 'working' | 'candidate' | 'verified' | 'certified',\n status: row.status as 'active' | 'contested' | 'deprecated' | 'superseded',\n currentJson: typeof row.current_json === 'string'\n ? JSON.parse(row.current_json)\n : row.current_json as Record<string, unknown>,\n titleNorm: row.title_norm as string | undefined,\n searchText: row.search_text as string | undefined,\n createdAt: toDate(row.created_at),\n updatedAt: toDate(row.updated_at)\n };\n }\n}\n", "/**\n * Blocker Resolver - Resolve blocker texts to entity references\n * AXIOMMIND: No stub task creation, fallback to condition\n */\n\nimport { dbRun, dbAll, type Database } from '../db-wrapper.js';\nimport { randomUUID } from 'crypto';\nimport type { BlockerRef, BlockerKind, Entity } from '../types.js';\nimport { makeEntityCanonicalKey, makeArtifactKey } from '../canonical-key.js';\nimport { TaskMatcher } from './task-matcher.js';\n\nexport interface BlockerResolverConfig {\n project?: string;\n}\n\n// Patterns for artifact detection\nconst URL_PATTERN = /^https?:\\/\\/.+/;\nconst JIRA_PATTERN = /^[A-Z]+-\\d+$/;\nconst GITHUB_ISSUE_PATTERN = /^[^\\/]+\\/[^#]+#\\d+$/;\nconst TASK_ID_PATTERN = /^task:[^:]+:[^:]+$/;\n\nexport class BlockerResolver {\n private taskMatcher: TaskMatcher;\n\n constructor(\n private db: Database,\n private config: BlockerResolverConfig = {}\n ) {\n this.taskMatcher = new TaskMatcher(db);\n }\n\n /**\n * Resolve a single blocker text to entity reference\n * Rules:\n * 1. Strong ID/URL/key pattern \u2192 artifact\n * 2. Explicit task_id \u2192 task\n * 3. Task title match (strict only) \u2192 task\n * 4. Fallback \u2192 condition (no stub task creation)\n */\n async resolveBlocker(\n text: string,\n sourceEntryId?: string\n ): Promise<BlockerRef> {\n const trimmedText = text.trim();\n\n // Rule 1: Check for artifact patterns\n const artifactRef = await this.tryResolveAsArtifact(trimmedText);\n if (artifactRef) {\n return artifactRef;\n }\n\n // Rule 2: Check for explicit task_id pattern\n if (TASK_ID_PATTERN.test(trimmedText)) {\n const taskRef = await this.tryResolveAsTaskId(trimmedText);\n if (taskRef) {\n return taskRef;\n }\n // Task ID not found, fall through to condition\n }\n\n // Rule 3: Try task title matching (strict only)\n const taskMatch = await this.taskMatcher.match(trimmedText, this.config.project);\n\n if (taskMatch.confidence === 'high' && taskMatch.match) {\n // Strict match found\n return {\n kind: 'task',\n entityId: taskMatch.match.entityId,\n rawText: trimmedText,\n confidence: taskMatch.score\n };\n }\n\n // Rule 4: Fallback to condition (get-or-create)\n // Also store candidates if any\n const conditionRef = await this.createConditionBlocker(\n trimmedText,\n taskMatch.candidates\n );\n\n return conditionRef;\n }\n\n /**\n * Resolve multiple blocker texts\n */\n async resolveBlockers(\n texts: string[],\n sourceEntryId?: string\n ): Promise<BlockerRef[]> {\n const results: BlockerRef[] = [];\n\n for (const text of texts) {\n const ref = await this.resolveBlocker(text, sourceEntryId);\n results.push(ref);\n }\n\n return results;\n }\n\n /**\n * Try to resolve as artifact (URL, JIRA, GitHub)\n */\n private async tryResolveAsArtifact(text: string): Promise<BlockerRef | null> {\n // Check patterns\n if (!URL_PATTERN.test(text) && !JIRA_PATTERN.test(text) && !GITHUB_ISSUE_PATTERN.test(text)) {\n return null;\n }\n\n const canonicalKey = makeArtifactKey(text);\n\n // Find or create artifact\n const existing = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT entity_id FROM entities\n WHERE entity_type = 'artifact' AND canonical_key = ?`,\n [canonicalKey]\n );\n\n let entityId: string;\n\n if (existing.length > 0) {\n entityId = existing[0].entity_id as string;\n } else {\n // Create artifact entity via event\n entityId = await this.declareArtifact(text, canonicalKey);\n }\n\n return {\n kind: 'artifact',\n entityId,\n rawText: text,\n confidence: 1.0\n };\n }\n\n /**\n * Try to resolve as explicit task ID\n */\n private async tryResolveAsTaskId(taskId: string): Promise<BlockerRef | null> {\n // taskId format: task:project:identifier\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT entity_id FROM entities\n WHERE entity_type = 'task' AND canonical_key = ?\n AND status = 'active'`,\n [taskId]\n );\n\n if (rows.length === 0) {\n return null;\n }\n\n return {\n kind: 'task',\n entityId: rows[0].entity_id as string,\n rawText: taskId,\n confidence: 1.0\n };\n }\n\n /**\n * Create condition blocker (get-or-create)\n */\n private async createConditionBlocker(\n text: string,\n candidates?: Entity[]\n ): Promise<BlockerRef> {\n const canonicalKey = makeEntityCanonicalKey('condition', text, {\n project: this.config.project\n });\n\n // Find existing condition\n const existing = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT entity_id FROM entities\n WHERE entity_type = 'condition' AND canonical_key = ?`,\n [canonicalKey]\n );\n\n let entityId: string;\n\n if (existing.length > 0) {\n entityId = existing[0].entity_id as string;\n } else {\n // Create condition entity via event\n entityId = await this.declareCondition(text, canonicalKey, candidates);\n }\n\n return {\n kind: 'condition',\n entityId,\n rawText: text,\n confidence: 0.5,\n candidates: candidates?.map(c => c.entityId)\n };\n }\n\n /**\n * Declare a new condition entity\n */\n private async declareCondition(\n text: string,\n canonicalKey: string,\n candidates?: Entity[]\n ): Promise<string> {\n const entityId = randomUUID();\n const now = new Date().toISOString();\n\n const currentJson = {\n text,\n resolved: false,\n candidates: candidates?.map(c => ({\n entityId: c.entityId,\n title: c.title\n }))\n };\n\n await dbRun(\n this.db,\n `INSERT INTO entities (\n entity_id, entity_type, canonical_key, title, stage, status,\n current_json, title_norm, search_text, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n entityId,\n 'condition',\n canonicalKey,\n text,\n 'raw',\n 'active',\n JSON.stringify(currentJson),\n text.toLowerCase().trim(),\n text,\n now,\n now\n ]\n );\n\n // Create alias\n await dbRun(\n this.db,\n `INSERT INTO entity_aliases (entity_type, canonical_key, entity_id, is_primary)\n VALUES (?, ?, ?, TRUE)\n ON CONFLICT (entity_type, canonical_key) DO NOTHING`,\n ['condition', canonicalKey, entityId]\n );\n\n return entityId;\n }\n\n /**\n * Declare a new artifact entity\n */\n private async declareArtifact(\n identifier: string,\n canonicalKey: string\n ): Promise<string> {\n const entityId = randomUUID();\n const now = new Date().toISOString();\n\n // Determine artifact type\n let artifactType = 'generic';\n if (URL_PATTERN.test(identifier)) {\n artifactType = 'url';\n } else if (JIRA_PATTERN.test(identifier)) {\n artifactType = 'jira';\n } else if (GITHUB_ISSUE_PATTERN.test(identifier)) {\n artifactType = 'github_issue';\n }\n\n const currentJson = {\n identifier,\n artifactType\n };\n\n await dbRun(\n this.db,\n `INSERT INTO entities (\n entity_id, entity_type, canonical_key, title, stage, status,\n current_json, title_norm, search_text, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n entityId,\n 'artifact',\n canonicalKey,\n identifier,\n 'raw',\n 'active',\n JSON.stringify(currentJson),\n identifier.toLowerCase(),\n identifier,\n now,\n now\n ]\n );\n\n // Create alias\n await dbRun(\n this.db,\n `INSERT INTO entity_aliases (entity_type, canonical_key, entity_id, is_primary)\n VALUES (?, ?, ?, TRUE)\n ON CONFLICT (entity_type, canonical_key) DO NOTHING`,\n ['artifact', canonicalKey, entityId]\n );\n\n return entityId;\n }\n\n /**\n * Create unknown placeholder condition\n * Used when task is blocked but no blocker text provided\n */\n async createUnknownPlaceholder(taskTitle: string): Promise<BlockerRef> {\n const text = `Unknown blocker for: ${taskTitle}`;\n\n const ref = await this.createConditionBlocker(text);\n\n // Mark as auto placeholder\n await dbRun(\n this.db,\n `UPDATE entities\n SET current_json = json_set(current_json, '$.auto_placeholder', true)\n WHERE entity_id = ?`,\n [ref.entityId]\n );\n\n return {\n ...ref,\n confidence: 0.0\n };\n }\n}\n", "/**\n * Task Resolver - Process extracted task entries and emit task events\n * AXIOMMIND: Task state via event fold, no direct updates\n */\n\nimport { dbRun, dbAll, type Database } from '../db-wrapper.js';\nimport { randomUUID } from 'crypto';\nimport type {\n Entity,\n TaskStatus,\n TaskPriority,\n BlockerRef,\n BlockerMode\n} from '../types.js';\nimport { makeEntityCanonicalKey, makeTaskEventDedupeKey } from '../canonical-key.js';\nimport { TaskMatcher } from './task-matcher.js';\nimport { BlockerResolver } from './blocker-resolver.js';\n\nexport interface ExtractedTask {\n title: string;\n status?: TaskStatus;\n priority?: TaskPriority;\n blockedBy?: string[];\n description?: string;\n project?: string;\n}\n\nexport interface TaskResolverConfig {\n sessionId: string;\n project?: string;\n evidenceAligned?: boolean;\n}\n\n// Valid status transitions\nconst VALID_TRANSITIONS: Record<TaskStatus, TaskStatus[]> = {\n pending: ['in_progress', 'cancelled'],\n in_progress: ['blocked', 'done', 'cancelled'],\n blocked: ['in_progress', 'done', 'cancelled'],\n done: [], // Terminal state\n cancelled: [] // Terminal state\n};\n\nexport class TaskResolver {\n private taskMatcher: TaskMatcher;\n private blockerResolver: BlockerResolver;\n\n constructor(\n private db: Database,\n private config: TaskResolverConfig\n ) {\n this.taskMatcher = new TaskMatcher(db);\n this.blockerResolver = new BlockerResolver(db, { project: config.project });\n }\n\n /**\n * Process extracted task entry\n * 1. Find or create task entity\n * 2. Emit status/priority change events if needed\n * 3. Process blockers\n */\n async processTask(extracted: ExtractedTask, sourceEntryId?: string): Promise<{\n taskId: string;\n isNew: boolean;\n events: string[];\n }> {\n const events: string[] = [];\n\n // Step 1: Find existing task or create new\n const { task, isNew, eventId: createEventId } = await this.findOrCreateTask(extracted);\n\n if (isNew && createEventId) {\n events.push(createEventId);\n }\n\n // Step 2: Handle status changes\n if (extracted.status) {\n const statusEvent = await this.handleStatusChange(task, extracted.status);\n if (statusEvent) {\n events.push(statusEvent);\n }\n }\n\n // Step 3: Handle priority changes\n if (extracted.priority) {\n const priorityEvent = await this.handlePriorityChange(task, extracted.priority);\n if (priorityEvent) {\n events.push(priorityEvent);\n }\n }\n\n // Step 4: Handle blockers\n if (extracted.blockedBy && extracted.blockedBy.length > 0) {\n const blockerEvent = await this.handleBlockers(\n task,\n extracted.blockedBy,\n sourceEntryId\n );\n if (blockerEvent) {\n events.push(blockerEvent);\n }\n } else if (extracted.status === 'blocked') {\n // Status is blocked but no blockers provided\n // Create unknown placeholder\n const blockerEvent = await this.handleUnknownBlocker(task);\n if (blockerEvent) {\n events.push(blockerEvent);\n }\n }\n\n return {\n taskId: task.entityId,\n isNew,\n events\n };\n }\n\n /**\n * Find existing task or create new one\n */\n private async findOrCreateTask(extracted: ExtractedTask): Promise<{\n task: Entity;\n isNew: boolean;\n eventId?: string;\n }> {\n // Try to find existing task\n const matchResult = await this.taskMatcher.match(extracted.title, extracted.project);\n\n if (matchResult.confidence === 'high' && matchResult.match) {\n return {\n task: matchResult.match,\n isNew: false\n };\n }\n\n // Create new task\n const taskId = randomUUID();\n const canonicalKey = makeEntityCanonicalKey('task', extracted.title, {\n project: extracted.project\n });\n\n // Correct initial status: never start as 'done'\n let initialStatus = extracted.status ?? 'pending';\n if (initialStatus === 'done') {\n initialStatus = 'in_progress'; // Correct: can't start as done\n }\n\n const now = new Date();\n\n const currentJson = {\n status: initialStatus,\n priority: extracted.priority ?? 'medium',\n description: extracted.description,\n project: extracted.project ?? this.config.project\n };\n\n // Insert entity\n await dbRun(\n this.db,\n `INSERT INTO entities (\n entity_id, entity_type, canonical_key, title, stage, status,\n current_json, title_norm, search_text, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n taskId,\n 'task',\n canonicalKey,\n extracted.title,\n 'raw',\n 'active',\n JSON.stringify(currentJson),\n extracted.title.toLowerCase().trim(),\n `${extracted.title} ${extracted.description ?? ''}`,\n now.toISOString(),\n now.toISOString()\n ]\n );\n\n // Create alias\n await dbRun(\n this.db,\n `INSERT INTO entity_aliases (entity_type, canonical_key, entity_id, is_primary)\n VALUES (?, ?, ?, TRUE)\n ON CONFLICT (entity_type, canonical_key) DO NOTHING`,\n ['task', canonicalKey, taskId]\n );\n\n // Emit task_created event\n const eventId = await this.emitTaskEvent('task_created', {\n taskId,\n title: extracted.title,\n canonicalKey,\n initialStatus,\n priority: extracted.priority ?? 'medium',\n description: extracted.description,\n project: extracted.project ?? this.config.project\n });\n\n // Return created entity\n const task: Entity = {\n entityId: taskId,\n entityType: 'task',\n canonicalKey,\n title: extracted.title,\n stage: 'raw',\n status: 'active',\n currentJson,\n titleNorm: extracted.title.toLowerCase().trim(),\n searchText: `${extracted.title} ${extracted.description ?? ''}`,\n createdAt: now,\n updatedAt: now\n };\n\n return { task, isNew: true, eventId };\n }\n\n /**\n * Handle task status change\n */\n private async handleStatusChange(\n task: Entity,\n newStatus: TaskStatus\n ): Promise<string | null> {\n const currentJson = task.currentJson as { status: TaskStatus };\n const currentStatus = currentJson.status;\n\n if (currentStatus === newStatus) {\n return null; // No change\n }\n\n // Validate transition\n const validNextStates = VALID_TRANSITIONS[currentStatus] ?? [];\n if (!validNextStates.includes(newStatus)) {\n // Invalid transition - emit rejection event\n return this.emitTaskEvent('task_transition_rejected', {\n taskId: task.entityId,\n fromStatus: currentStatus,\n toStatus: newStatus,\n reason: `Invalid transition from ${currentStatus} to ${newStatus}`\n });\n }\n\n // Emit status change event\n const eventId = await this.emitTaskEvent('task_status_changed', {\n taskId: task.entityId,\n fromStatus: currentStatus,\n toStatus: newStatus\n });\n\n // Update entity (projector will do this, but we update for immediate consistency)\n await dbRun(\n this.db,\n `UPDATE entities\n SET current_json = json_set(current_json, '$.status', ?),\n updated_at = ?\n WHERE entity_id = ?`,\n [newStatus, new Date().toISOString(), task.entityId]\n );\n\n return eventId;\n }\n\n /**\n * Handle task priority change\n */\n private async handlePriorityChange(\n task: Entity,\n newPriority: TaskPriority\n ): Promise<string | null> {\n const currentJson = task.currentJson as { priority?: TaskPriority };\n const currentPriority = currentJson.priority ?? 'medium';\n\n if (currentPriority === newPriority) {\n return null; // No change\n }\n\n // Emit priority change event\n const eventId = await this.emitTaskEvent('task_priority_changed', {\n taskId: task.entityId,\n fromPriority: currentPriority,\n toPriority: newPriority\n });\n\n // Update entity\n await dbRun(\n this.db,\n `UPDATE entities\n SET current_json = json_set(current_json, '$.priority', ?),\n updated_at = ?\n WHERE entity_id = ?`,\n [newPriority, new Date().toISOString(), task.entityId]\n );\n\n return eventId;\n }\n\n /**\n * Handle blockers\n */\n private async handleBlockers(\n task: Entity,\n blockedByTexts: string[],\n sourceEntryId?: string\n ): Promise<string | null> {\n // Resolve blocker texts to entity refs\n const blockerRefs = await this.blockerResolver.resolveBlockers(blockedByTexts);\n\n // Determine mode based on evidence alignment\n const mode: BlockerMode = this.config.evidenceAligned ? 'replace' : 'suggest';\n\n // Emit task_blockers_set event\n const eventId = await this.emitTaskEvent('task_blockers_set', {\n taskId: task.entityId,\n mode,\n blockers: blockerRefs,\n sourceEntryId\n });\n\n return eventId;\n }\n\n /**\n * Handle unknown blocker (status=blocked but no blockedBy)\n */\n private async handleUnknownBlocker(task: Entity): Promise<string | null> {\n const placeholderRef = await this.blockerResolver.createUnknownPlaceholder(task.title);\n\n const eventId = await this.emitTaskEvent('task_blockers_set', {\n taskId: task.entityId,\n mode: 'suggest' as BlockerMode,\n blockers: [placeholderRef]\n });\n\n return eventId;\n }\n\n /**\n * Emit task event to events table\n */\n private async emitTaskEvent(\n eventType: string,\n payload: Record<string, unknown>\n ): Promise<string> {\n const eventId = randomUUID();\n const now = new Date();\n\n // Generate dedupe key\n const dedupeKey = makeTaskEventDedupeKey(\n eventType,\n payload.taskId as string,\n this.config.sessionId,\n JSON.stringify(payload)\n );\n\n // Check for duplicate\n const existing = await dbAll<{ event_id: string }>(\n this.db,\n `SELECT event_id FROM event_dedup WHERE dedupe_key = ?`,\n [dedupeKey]\n );\n\n if (existing.length > 0) {\n return existing[0].event_id; // Return existing event ID\n }\n\n // Insert event\n await dbRun(\n this.db,\n `INSERT INTO events (\n id, event_type, session_id, timestamp, content,\n canonical_key, dedupe_key, metadata\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,\n [\n eventId,\n eventType,\n this.config.sessionId,\n now.toISOString(),\n JSON.stringify(payload),\n `task_event:${eventType}:${payload.taskId}`,\n dedupeKey,\n JSON.stringify({ source: 'task_resolver' })\n ]\n );\n\n // Insert dedup record\n await dbRun(\n this.db,\n `INSERT INTO event_dedup (dedupe_key, event_id)\n VALUES (?, ?)\n ON CONFLICT DO NOTHING`,\n [dedupeKey, eventId]\n );\n\n return eventId;\n }\n\n /**\n * Resolve condition to task (when condition is identified as existing task)\n */\n async resolveConditionToTask(\n conditionId: string,\n taskId: string\n ): Promise<string> {\n const eventId = await this.emitTaskEvent('condition_resolved_to', {\n conditionId,\n resolvedTo: {\n kind: 'task',\n entityId: taskId\n }\n });\n\n // Create resolves_to edge\n await dbRun(\n this.db,\n `INSERT INTO edges (edge_id, src_type, src_id, rel_type, dst_type, dst_id, meta_json)\n VALUES (?, 'entity', ?, 'resolves_to', 'entity', ?, ?)\n ON CONFLICT DO NOTHING`,\n [randomUUID(), conditionId, taskId, JSON.stringify({ resolved_at: new Date().toISOString() })]\n );\n\n return eventId;\n }\n}\n", "/**\n * Task Projector - Project task events to entities/edges\n * AXIOMMIND: Incremental processing with offset tracking\n */\n\nimport { dbRun, dbAll, toDate, type Database } from '../db-wrapper.js';\nimport { randomUUID } from 'crypto';\nimport type { BlockerMode, BlockerRef } from '../types.js';\n\nconst PROJECTOR_NAME = 'task_projector';\nconst TASK_EVENT_TYPES = [\n 'task_created',\n 'task_status_changed',\n 'task_priority_changed',\n 'task_blockers_set',\n 'task_transition_rejected',\n 'condition_resolved_to'\n];\n\ninterface ProjectionOffset {\n lastEventId: string | null;\n lastTimestamp: Date | null;\n}\n\ninterface TaskEvent {\n id: string;\n eventType: string;\n sessionId: string;\n timestamp: Date;\n content: Record<string, unknown>;\n}\n\nexport class TaskProjector {\n constructor(private db: Database) {}\n\n /**\n * Get current projection offset\n */\n async getOffset(): Promise<ProjectionOffset> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT last_event_id, last_timestamp\n FROM projection_offsets\n WHERE projection_name = ?`,\n [PROJECTOR_NAME]\n );\n\n if (rows.length === 0) {\n return { lastEventId: null, lastTimestamp: null };\n }\n\n return {\n lastEventId: rows[0].last_event_id as string | null,\n lastTimestamp: rows[0].last_timestamp\n ? new Date(rows[0].last_timestamp as string)\n : null\n };\n }\n\n /**\n * Update projection offset\n */\n private async updateOffset(eventId: string, timestamp: Date): Promise<void> {\n await dbRun(\n this.db,\n `INSERT INTO projection_offsets (projection_name, last_event_id, last_timestamp, updated_at)\n VALUES (?, ?, ?, CURRENT_TIMESTAMP)\n ON CONFLICT (projection_name) DO UPDATE SET\n last_event_id = excluded.last_event_id,\n last_timestamp = excluded.last_timestamp,\n updated_at = CURRENT_TIMESTAMP`,\n [PROJECTOR_NAME, eventId, timestamp.toISOString()]\n );\n }\n\n /**\n * Fetch events since last offset\n */\n async fetchEventsSince(\n offset: ProjectionOffset,\n limit: number = 100\n ): Promise<TaskEvent[]> {\n let query = `\n SELECT id, event_type, session_id, timestamp, content\n FROM events\n WHERE event_type IN (${TASK_EVENT_TYPES.map(() => '?').join(', ')})\n `;\n const params: unknown[] = [...TASK_EVENT_TYPES];\n\n if (offset.lastTimestamp && offset.lastEventId) {\n query += ` AND (timestamp > ? OR (timestamp = ? AND id > ?))`;\n params.push(\n offset.lastTimestamp.toISOString(),\n offset.lastTimestamp.toISOString(),\n offset.lastEventId\n );\n }\n\n query += ` ORDER BY timestamp ASC, id ASC LIMIT ?`;\n params.push(limit);\n\n const rows = await dbAll<Record<string, unknown>>(this.db, query, params);\n\n return rows.map(row => ({\n id: row.id as string,\n eventType: row.event_type as string,\n sessionId: row.session_id as string,\n timestamp: toDate(row.timestamp),\n content: typeof row.content === 'string'\n ? JSON.parse(row.content)\n : row.content as Record<string, unknown>\n }));\n }\n\n /**\n * Process a batch of events\n */\n async processBatch(batchSize: number = 100): Promise<number> {\n const offset = await this.getOffset();\n const events = await this.fetchEventsSince(offset, batchSize);\n\n if (events.length === 0) {\n return 0;\n }\n\n for (const event of events) {\n await this.processEvent(event);\n await this.updateOffset(event.id, event.timestamp);\n }\n\n return events.length;\n }\n\n /**\n * Process all pending events\n */\n async processAll(): Promise<number> {\n let totalProcessed = 0;\n let processed: number;\n\n do {\n processed = await this.processBatch();\n totalProcessed += processed;\n } while (processed > 0);\n\n return totalProcessed;\n }\n\n /**\n * Process a single event\n */\n private async processEvent(event: TaskEvent): Promise<void> {\n switch (event.eventType) {\n case 'task_created':\n // Entity already created by TaskResolver, just ensure vector outbox entry\n await this.enqueueForVectorization(event.content.taskId as string, 'task_title');\n break;\n\n case 'task_status_changed':\n await this.handleStatusChanged(event);\n break;\n\n case 'task_priority_changed':\n // Priority change doesn't affect edges\n break;\n\n case 'task_blockers_set':\n await this.handleBlockersSet(event);\n break;\n\n case 'condition_resolved_to':\n await this.handleConditionResolved(event);\n break;\n\n case 'task_transition_rejected':\n // Log event, no state change\n break;\n }\n }\n\n /**\n * Handle task_status_changed event\n */\n private async handleStatusChanged(event: TaskEvent): Promise<void> {\n const { taskId, toStatus } = event.content;\n\n // If status changed to 'done', remove all blocked_by edges\n if (toStatus === 'done') {\n await dbRun(\n this.db,\n `DELETE FROM edges\n WHERE src_id = ? AND rel_type IN ('blocked_by', 'blocked_by_suggested')`,\n [taskId]\n );\n\n // Clear blockers cache in entity\n await dbRun(\n this.db,\n `UPDATE entities\n SET current_json = json_remove(json_remove(current_json, '$.blockers'), '$.blockerSuggestions'),\n updated_at = CURRENT_TIMESTAMP\n WHERE entity_id = ?`,\n [taskId]\n );\n }\n }\n\n /**\n * Handle task_blockers_set event\n */\n private async handleBlockersSet(event: TaskEvent): Promise<void> {\n const { taskId, mode, blockers } = event.content as {\n taskId: string;\n mode: BlockerMode;\n blockers: BlockerRef[];\n };\n\n if (mode === 'replace') {\n // Delete existing blocked_by edges\n await dbRun(\n this.db,\n `DELETE FROM edges WHERE src_id = ? AND rel_type = 'blocked_by'`,\n [taskId]\n );\n\n // Create new edges\n for (const blocker of blockers) {\n await this.createBlockerEdge(taskId, blocker, 'blocked_by');\n }\n\n // Update entity cache\n const blockerIds = blockers.map(b => b.entityId);\n await dbRun(\n this.db,\n `UPDATE entities\n SET current_json = json_set(current_json, '$.blockers', ?),\n updated_at = CURRENT_TIMESTAMP\n WHERE entity_id = ?`,\n [JSON.stringify(blockerIds), taskId]\n );\n\n } else {\n // mode === 'suggest'\n // Delete existing suggested edges\n await dbRun(\n this.db,\n `DELETE FROM edges WHERE src_id = ? AND rel_type = 'blocked_by_suggested'`,\n [taskId]\n );\n\n // Create suggested edges\n for (const blocker of blockers) {\n await this.createBlockerEdge(taskId, blocker, 'blocked_by_suggested');\n }\n\n // Update entity cache (suggestions)\n const suggestionIds = blockers.map(b => b.entityId);\n await dbRun(\n this.db,\n `UPDATE entities\n SET current_json = json_set(current_json, '$.blockerSuggestions', ?),\n updated_at = CURRENT_TIMESTAMP\n WHERE entity_id = ?`,\n [JSON.stringify(suggestionIds), taskId]\n );\n }\n }\n\n /**\n * Create blocker edge\n */\n private async createBlockerEdge(\n taskId: string,\n blocker: BlockerRef,\n relType: 'blocked_by' | 'blocked_by_suggested'\n ): Promise<void> {\n const edgeId = randomUUID();\n\n await dbRun(\n this.db,\n `INSERT INTO edges (edge_id, src_type, src_id, rel_type, dst_type, dst_id, meta_json, created_at)\n VALUES (?, 'entity', ?, ?, 'entity', ?, ?, CURRENT_TIMESTAMP)\n ON CONFLICT DO NOTHING`,\n [\n edgeId,\n taskId,\n relType,\n blocker.entityId,\n JSON.stringify({\n kind: blocker.kind,\n rawText: blocker.rawText,\n confidence: blocker.confidence,\n candidates: blocker.candidates\n })\n ]\n );\n }\n\n /**\n * Handle condition_resolved_to event\n */\n private async handleConditionResolved(event: TaskEvent): Promise<void> {\n const { conditionId, resolvedTo } = event.content as {\n conditionId: string;\n resolvedTo: { kind: string; entityId: string };\n };\n\n // Update condition entity\n await dbRun(\n this.db,\n `UPDATE entities\n SET current_json = json_set(json_set(current_json, '$.resolved', true), '$.resolvedTo', ?),\n updated_at = CURRENT_TIMESTAMP\n WHERE entity_id = ?`,\n [JSON.stringify(resolvedTo), conditionId]\n );\n\n // Edge already created by TaskResolver\n }\n\n /**\n * Enqueue entity for vectorization\n */\n private async enqueueForVectorization(itemId: string, itemKind: string): Promise<void> {\n const jobId = randomUUID();\n const embeddingVersion = 'v1'; // Should come from config\n\n await dbRun(\n this.db,\n `INSERT INTO vector_outbox (job_id, item_kind, item_id, embedding_version, status, retry_count)\n VALUES (?, ?, ?, ?, 'pending', 0)\n ON CONFLICT (item_kind, item_id, embedding_version) DO NOTHING`,\n [jobId, itemKind, itemId, embeddingVersion]\n );\n }\n\n /**\n * Rebuild all projections from scratch\n * WARNING: This clears all edges and rebuilds from events\n */\n async rebuild(): Promise<number> {\n // Clear task-related edges\n await dbRun(\n this.db,\n `DELETE FROM edges WHERE rel_type IN ('blocked_by', 'blocked_by_suggested', 'resolves_to')`\n );\n\n // Reset offset\n await dbRun(\n this.db,\n `DELETE FROM projection_offsets WHERE projection_name = ?`,\n [PROJECTOR_NAME]\n );\n\n // Process all events\n return this.processAll();\n }\n}\n", "/**\n * SharedEventStore - Global database for cross-project knowledge\n * Location: ~/.claude-code/memory/shared/\n */\n\nimport {\n createDatabase,\n dbRun,\n dbClose,\n type Database\n} from './db-wrapper.js';\n\nexport class SharedEventStore {\n private db: Database;\n private initialized = false;\n\n constructor(private dbPath: string) {\n this.db = createDatabase(dbPath);\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n // Shared troubleshooting entries table\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS shared_troubleshooting (\n entry_id VARCHAR PRIMARY KEY,\n source_project_hash VARCHAR NOT NULL,\n source_entry_id VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n symptoms JSON NOT NULL,\n root_cause TEXT NOT NULL,\n solution TEXT NOT NULL,\n topics JSON NOT NULL,\n technologies JSON,\n confidence REAL NOT NULL DEFAULT 0.8,\n usage_count INTEGER DEFAULT 0,\n last_used_at TIMESTAMP,\n promoted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(source_project_hash, source_entry_id)\n )\n `);\n\n // Future extensibility: best practices table\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS shared_best_practices (\n entry_id VARCHAR PRIMARY KEY,\n source_project_hash VARCHAR NOT NULL,\n source_entry_id VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n content_json JSON NOT NULL,\n topics JSON NOT NULL,\n confidence REAL NOT NULL DEFAULT 0.8,\n usage_count INTEGER DEFAULT 0,\n promoted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(source_project_hash, source_entry_id)\n )\n `);\n\n // Future extensibility: common errors table\n await dbRun(this.db, `\n CREATE TABLE IF NOT EXISTS shared_common_errors (\n entry_id VARCHAR PRIMARY KEY,\n source_project_hash VARCHAR NOT NULL,\n source_entry_id VARCHAR NOT NULL,\n title VARCHAR NOT NULL,\n error_pattern TEXT NOT NULL,\n solution TEXT NOT NULL,\n topics JSON NOT NULL,\n technologies JSON,\n confidence REAL NOT NULL DEFAULT 0.8,\n usage_count INTEGER DEFAULT 0,\n promoted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(source_project_hash, source_entry_id)\n )\n `);\n\n // Indexes for troubleshooting\n await dbRun(this.db, `\n CREATE INDEX IF NOT EXISTS idx_shared_ts_confidence\n ON shared_troubleshooting(confidence DESC)\n `);\n await dbRun(this.db, `\n CREATE INDEX IF NOT EXISTS idx_shared_ts_usage\n ON shared_troubleshooting(usage_count DESC)\n `);\n await dbRun(this.db, `\n CREATE INDEX IF NOT EXISTS idx_shared_ts_source\n ON shared_troubleshooting(source_project_hash)\n `);\n\n this.initialized = true;\n }\n\n getDatabase(): Database {\n return this.db;\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n async close(): Promise<void> {\n await dbClose(this.db);\n this.initialized = false;\n }\n}\n\nexport function createSharedEventStore(dbPath: string): SharedEventStore {\n return new SharedEventStore(dbPath);\n}\n", "/**\n * SharedStore - Cross-project troubleshooting knowledge store\n * Manages promotion from verified entries to shared storage\n */\n\nimport { randomUUID } from 'crypto';\nimport { dbRun, dbAll, toDate, type Database } from './db-wrapper.js';\nimport type {\n SharedTroubleshootingEntry,\n SharedTroubleshootingInput\n} from './types.js';\nimport { SharedEventStore } from './shared-event-store.js';\n\nexport class SharedStore {\n constructor(private sharedEventStore: SharedEventStore) {}\n\n private get db(): Database {\n return this.sharedEventStore.getDatabase();\n }\n\n /**\n * Promote a verified troubleshooting entry to shared storage\n */\n async promoteEntry(\n input: SharedTroubleshootingInput\n ): Promise<string> {\n const entryId = randomUUID();\n\n await dbRun(\n this.db,\n `INSERT INTO shared_troubleshooting (\n entry_id, source_project_hash, source_entry_id,\n title, symptoms, root_cause, solution, topics,\n technologies, confidence, promoted_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)\n ON CONFLICT (source_project_hash, source_entry_id)\n DO UPDATE SET\n title = excluded.title,\n symptoms = excluded.symptoms,\n root_cause = excluded.root_cause,\n solution = excluded.solution,\n topics = excluded.topics,\n technologies = excluded.technologies,\n confidence = CASE\n WHEN excluded.confidence > shared_troubleshooting.confidence\n THEN excluded.confidence\n ELSE shared_troubleshooting.confidence\n END`,\n [\n entryId,\n input.sourceProjectHash,\n input.sourceEntryId,\n input.title,\n JSON.stringify(input.symptoms),\n input.rootCause,\n input.solution,\n JSON.stringify(input.topics),\n JSON.stringify(input.technologies || []),\n input.confidence\n ]\n );\n\n return entryId;\n }\n\n /**\n * Search troubleshooting entries by text query\n */\n async search(\n query: string,\n options?: { topK?: number; minConfidence?: number }\n ): Promise<SharedTroubleshootingEntry[]> {\n const topK = options?.topK || 5;\n const minConfidence = options?.minConfidence || 0.5;\n const searchPattern = `%${query}%`;\n\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM shared_troubleshooting\n WHERE (title LIKE ? OR root_cause LIKE ? OR solution LIKE ?)\n AND confidence >= ?\n ORDER BY confidence DESC, usage_count DESC\n LIMIT ?`,\n [searchPattern, searchPattern, searchPattern, minConfidence, topK]\n );\n\n return rows.map(this.rowToEntry);\n }\n\n /**\n * Search by topics\n */\n async searchByTopics(\n topics: string[],\n options?: { topK?: number; excludeProjectHash?: string }\n ): Promise<SharedTroubleshootingEntry[]> {\n const topK = options?.topK || 5;\n\n if (topics.length === 0) {\n return [];\n }\n\n const topicConditions = topics.map(() => `topics LIKE ?`).join(' OR ');\n const topicParams = topics.map(t => `%\"${t}\"%`);\n\n let query = `SELECT * FROM shared_troubleshooting WHERE (${topicConditions})`;\n const params: unknown[] = [...topicParams];\n\n if (options?.excludeProjectHash) {\n query += ` AND source_project_hash != ?`;\n params.push(options.excludeProjectHash);\n }\n\n query += ` ORDER BY confidence DESC, usage_count DESC LIMIT ?`;\n params.push(topK);\n\n const rows = await dbAll<Record<string, unknown>>(this.db, query, params);\n return rows.map(this.rowToEntry);\n }\n\n /**\n * Record usage of a shared entry (for ranking)\n */\n async recordUsage(entryId: string): Promise<void> {\n await dbRun(\n this.db,\n `UPDATE shared_troubleshooting\n SET usage_count = usage_count + 1,\n last_used_at = CURRENT_TIMESTAMP\n WHERE entry_id = ?`,\n [entryId]\n );\n }\n\n /**\n * Get entry by ID\n */\n async get(entryId: string): Promise<SharedTroubleshootingEntry | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM shared_troubleshooting WHERE entry_id = ?`,\n [entryId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEntry(rows[0]);\n }\n\n /**\n * Get entry by source (project hash + entry ID)\n */\n async getBySource(\n projectHash: string,\n sourceEntryId: string\n ): Promise<SharedTroubleshootingEntry | null> {\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM shared_troubleshooting\n WHERE source_project_hash = ? AND source_entry_id = ?`,\n [projectHash, sourceEntryId]\n );\n\n if (rows.length === 0) return null;\n return this.rowToEntry(rows[0]);\n }\n\n /**\n * Check if an entry already exists in shared store\n */\n async exists(projectHash: string, sourceEntryId: string): Promise<boolean> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM shared_troubleshooting\n WHERE source_project_hash = ? AND source_entry_id = ?`,\n [projectHash, sourceEntryId]\n );\n return (result[0]?.count || 0) > 0;\n }\n\n /**\n * Get all entries (with limit for safety)\n */\n async getAll(options?: { limit?: number }): Promise<SharedTroubleshootingEntry[]> {\n const limit = options?.limit || 100;\n const rows = await dbAll<Record<string, unknown>>(\n this.db,\n `SELECT * FROM shared_troubleshooting\n ORDER BY confidence DESC, usage_count DESC\n LIMIT ?`,\n [limit]\n );\n\n return rows.map(this.rowToEntry);\n }\n\n /**\n * Get total count\n */\n async count(): Promise<number> {\n const result = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM shared_troubleshooting`\n );\n return result[0]?.count || 0;\n }\n\n /**\n * Get statistics\n */\n async getStats(): Promise<{\n total: number;\n averageConfidence: number;\n topTopics: Array<{ topic: string; count: number }>;\n totalUsageCount: number;\n }> {\n const countResult = await dbAll<{ count: number }>(\n this.db,\n `SELECT COUNT(*) as count FROM shared_troubleshooting`\n );\n const total = countResult[0]?.count || 0;\n\n const avgResult = await dbAll<{ avg: number | null }>(\n this.db,\n `SELECT AVG(confidence) as avg FROM shared_troubleshooting`\n );\n const averageConfidence = avgResult[0]?.avg || 0;\n\n const usageResult = await dbAll<{ total: number }>(\n this.db,\n `SELECT SUM(usage_count) as total FROM shared_troubleshooting`\n );\n const totalUsageCount = usageResult[0]?.total || 0;\n\n // Get topic counts\n const entries = await this.getAll({ limit: 1000 });\n const topicCounts: Record<string, number> = {};\n for (const entry of entries) {\n for (const topic of entry.topics) {\n topicCounts[topic] = (topicCounts[topic] || 0) + 1;\n }\n }\n\n const topTopics = Object.entries(topicCounts)\n .map(([topic, count]) => ({ topic, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 10);\n\n return { total, averageConfidence, topTopics, totalUsageCount };\n }\n\n /**\n * Delete an entry\n */\n async delete(entryId: string): Promise<boolean> {\n const before = await this.count();\n await dbRun(\n this.db,\n `DELETE FROM shared_troubleshooting WHERE entry_id = ?`,\n [entryId]\n );\n const after = await this.count();\n return before > after;\n }\n\n private rowToEntry(row: Record<string, unknown>): SharedTroubleshootingEntry {\n return {\n entryId: row.entry_id as string,\n sourceProjectHash: row.source_project_hash as string,\n sourceEntryId: row.source_entry_id as string,\n title: row.title as string,\n symptoms: JSON.parse(row.symptoms as string || '[]'),\n rootCause: row.root_cause as string,\n solution: row.solution as string,\n topics: JSON.parse(row.topics as string || '[]'),\n technologies: JSON.parse(row.technologies as string || '[]'),\n confidence: row.confidence as number,\n usageCount: row.usage_count as number || 0,\n lastUsedAt: row.last_used_at ? toDate(row.last_used_at) : undefined,\n promotedAt: toDate(row.promoted_at),\n createdAt: toDate(row.created_at)\n };\n }\n}\n\nexport function createSharedStore(\n sharedEventStore: SharedEventStore\n): SharedStore {\n return new SharedStore(sharedEventStore);\n}\n", "/**\n * SharedVectorStore - Vector store for cross-project semantic search\n * Location: ~/.claude-code/memory/shared/vectors/\n */\n\nimport * as lancedb from '@lancedb/lancedb';\nimport type { SharedEntryType, SharedSearchResult } from './types.js';\n\nexport interface SharedVectorRecord {\n id: string;\n entryId: string;\n entryType: SharedEntryType;\n content: string;\n vector: number[];\n topics: string[];\n sourceProjectHash?: string;\n}\n\nexport class SharedVectorStore {\n private db: lancedb.Connection | null = null;\n private table: lancedb.Table | null = null;\n private readonly tableName = 'shared_knowledge';\n\n constructor(private dbPath: string) {}\n\n /**\n * Initialize LanceDB connection\n */\n async initialize(): Promise<void> {\n if (this.db) return;\n\n this.db = await lancedb.connect(this.dbPath);\n\n try {\n const tables = await this.db.tableNames();\n if (tables.includes(this.tableName)) {\n this.table = await this.db.openTable(this.tableName);\n }\n } catch {\n this.table = null;\n }\n }\n\n /**\n * Add or update a shared vector record\n */\n async upsert(record: SharedVectorRecord): Promise<void> {\n await this.initialize();\n\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const data = {\n id: record.id,\n entryId: record.entryId,\n entryType: record.entryType,\n content: record.content,\n vector: record.vector,\n topics: JSON.stringify(record.topics),\n sourceProjectHash: record.sourceProjectHash || ''\n };\n\n if (!this.table) {\n this.table = await this.db.createTable(this.tableName, [data]);\n } else {\n // Delete existing entry before adding (upsert behavior)\n try {\n await this.table.delete(`entryId = '${record.entryId}'`);\n } catch {\n // Entry might not exist, ignore\n }\n await this.table.add([data]);\n }\n }\n\n /**\n * Add multiple records in batch\n */\n async upsertBatch(records: SharedVectorRecord[]): Promise<void> {\n if (records.length === 0) return;\n\n await this.initialize();\n\n if (!this.db) {\n throw new Error('Database not initialized');\n }\n\n const data = records.map(record => ({\n id: record.id,\n entryId: record.entryId,\n entryType: record.entryType,\n content: record.content,\n vector: record.vector,\n topics: JSON.stringify(record.topics),\n sourceProjectHash: record.sourceProjectHash || ''\n }));\n\n if (!this.table) {\n this.table = await this.db.createTable(this.tableName, data);\n } else {\n await this.table.add(data);\n }\n }\n\n /**\n * Search for similar vectors\n */\n async search(\n queryVector: number[],\n options: {\n limit?: number;\n minScore?: number;\n excludeProjectHash?: string;\n entryType?: SharedEntryType;\n } = {}\n ): Promise<SharedSearchResult[]> {\n await this.initialize();\n\n if (!this.table) {\n return [];\n }\n\n const { limit = 5, minScore = 0.7, excludeProjectHash, entryType } = options;\n\n let query = this.table\n .search(queryVector)\n .distanceType('cosine')\n .limit(limit * 2);\n\n // Apply filters\n const filters: string[] = [];\n if (excludeProjectHash) {\n filters.push(`sourceProjectHash != '${excludeProjectHash}'`);\n }\n if (entryType) {\n filters.push(`entryType = '${entryType}'`);\n }\n\n if (filters.length > 0) {\n query = query.where(filters.join(' AND '));\n }\n\n const results = await query.toArray();\n\n return results\n .filter(r => {\n const distance = r._distance || 0;\n const score = 1 - (distance / 2);\n return score >= minScore;\n })\n .slice(0, limit)\n .map(r => {\n const distance = r._distance || 0;\n const score = 1 - (distance / 2);\n return {\n id: r.id as string,\n entryId: r.entryId as string,\n content: r.content as string,\n score,\n entryType: r.entryType as SharedEntryType\n };\n });\n }\n\n /**\n * Delete vector by entry ID\n */\n async delete(entryId: string): Promise<void> {\n if (!this.table) return;\n await this.table.delete(`entryId = '${entryId}'`);\n }\n\n /**\n * Get total count\n */\n async count(): Promise<number> {\n if (!this.table) return 0;\n return this.table.countRows();\n }\n\n /**\n * Check if vector exists for entry\n */\n async exists(entryId: string): Promise<boolean> {\n if (!this.table) return false;\n\n try {\n const results = await this.table\n .search([])\n .where(`entryId = '${entryId}'`)\n .limit(1)\n .toArray();\n return results.length > 0;\n } catch {\n return false;\n }\n }\n}\n\nexport function createSharedVectorStore(dbPath: string): SharedVectorStore {\n return new SharedVectorStore(dbPath);\n}\n", "/**\n * SharedPromoter - Handles auto-promotion of verified troubleshooting entries\n * Promotes entries from project-local storage to cross-project shared storage\n */\n\nimport { randomUUID } from 'crypto';\nimport { SharedStore } from './shared-store.js';\nimport { SharedVectorStore } from './shared-vector-store.js';\nimport { Embedder } from './embedder.js';\nimport type { Entry, SharedTroubleshootingInput, SharedStoreConfig } from './types.js';\n\nexport interface TroubleshootingContent {\n symptoms?: string[];\n rootCause?: string;\n solution?: string;\n technologies?: string[];\n}\n\nexport interface PromotionResult {\n success: boolean;\n entryId?: string;\n error?: string;\n skipped?: boolean;\n skipReason?: string;\n}\n\nexport class SharedPromoter {\n constructor(\n private sharedStore: SharedStore,\n private sharedVectorStore: SharedVectorStore,\n private embedder: Embedder,\n private config?: SharedStoreConfig\n ) {}\n\n /**\n * Check if an entry is eligible for promotion\n */\n isEligibleForPromotion(entry: Entry): boolean {\n // Must be troubleshooting type\n if (entry.entryType !== 'troubleshooting') {\n return false;\n }\n\n // Must be at least 'verified' stage\n if (entry.stage !== 'verified' && entry.stage !== 'certified') {\n return false;\n }\n\n // Must be active status\n if (entry.status !== 'active') {\n return false;\n }\n\n return true;\n }\n\n /**\n * Promote a verified troubleshooting entry to shared storage\n */\n async promoteEntry(\n entry: Entry,\n projectHash: string\n ): Promise<PromotionResult> {\n // Validate eligibility\n if (!this.isEligibleForPromotion(entry)) {\n return {\n success: false,\n skipped: true,\n skipReason: `Entry not eligible: type=${entry.entryType}, stage=${entry.stage}, status=${entry.status}`\n };\n }\n\n // Check if already promoted\n const exists = await this.sharedStore.exists(projectHash, entry.entryId);\n if (exists) {\n return {\n success: true,\n skipped: true,\n skipReason: 'Entry already exists in shared store'\n };\n }\n\n try {\n const content = entry.contentJson as TroubleshootingContent;\n const confidence = this.calculateConfidence(entry);\n\n // Check minimum confidence threshold\n const minConfidence = this.config?.minConfidenceForPromotion ?? 0.8;\n if (confidence < minConfidence) {\n return {\n success: false,\n skipped: true,\n skipReason: `Confidence ${confidence} below threshold ${minConfidence}`\n };\n }\n\n const input: SharedTroubleshootingInput = {\n sourceProjectHash: projectHash,\n sourceEntryId: entry.entryId,\n title: entry.title,\n symptoms: content.symptoms || [],\n rootCause: content.rootCause || '',\n solution: content.solution || '',\n topics: this.extractTopics(entry),\n technologies: content.technologies || [],\n confidence\n };\n\n // Promote to shared store\n const entryId = await this.sharedStore.promoteEntry(input);\n\n // Create embedding for vector search\n const embeddingContent = this.createEmbeddingContent(input);\n const embedding = await this.embedder.embed(embeddingContent);\n\n await this.sharedVectorStore.upsert({\n id: randomUUID(),\n entryId,\n entryType: 'troubleshooting',\n content: embeddingContent,\n vector: embedding.vector,\n topics: input.topics,\n sourceProjectHash: projectHash\n });\n\n return {\n success: true,\n entryId\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n /**\n * Batch promote multiple entries\n */\n async promoteEntries(\n entries: Entry[],\n projectHash: string\n ): Promise<Map<string, PromotionResult>> {\n const results = new Map<string, PromotionResult>();\n\n for (const entry of entries) {\n const result = await this.promoteEntry(entry, projectHash);\n results.set(entry.entryId, result);\n }\n\n return results;\n }\n\n /**\n * Extract topics from entry\n */\n private extractTopics(entry: Entry): string[] {\n const topics: string[] = [];\n\n // Extract from title (meaningful words)\n const titleWords = entry.title\n .toLowerCase()\n .split(/[\\s\\-_]+/)\n .filter(w => w.length > 3 && !this.isStopWord(w));\n topics.push(...titleWords);\n\n // Extract from content if available\n const content = entry.contentJson as Record<string, unknown>;\n if (content.topics && Array.isArray(content.topics)) {\n topics.push(...content.topics.map(t => String(t).toLowerCase()));\n }\n\n // Extract technologies as topics\n if (content.technologies && Array.isArray(content.technologies)) {\n topics.push(...content.technologies.map(t => String(t).toLowerCase()));\n }\n\n // Dedupe and return\n return [...new Set(topics)];\n }\n\n /**\n * Check if word is a stop word\n */\n private isStopWord(word: string): boolean {\n const stopWords = new Set([\n 'the', 'and', 'for', 'with', 'this', 'that', 'from', 'have', 'been',\n 'were', 'are', 'was', 'had', 'has', 'will', 'would', 'could', 'should',\n 'when', 'where', 'what', 'which', 'while', 'error', 'problem', 'issue'\n ]);\n return stopWords.has(word);\n }\n\n /**\n * Calculate confidence score for entry\n */\n private calculateConfidence(entry: Entry): number {\n let confidence = 0.8; // Base confidence for verified entries\n\n // Boost if certified\n if (entry.stage === 'certified') {\n confidence = 0.95;\n }\n\n // Could add more factors:\n // - Number of evidence items\n // - Age of entry (older verified entries may be more reliable)\n // - Usage count if tracked\n\n return Math.min(confidence, 1.0);\n }\n\n /**\n * Create embedding content from input\n */\n private createEmbeddingContent(input: SharedTroubleshootingInput): string {\n const parts: string[] = [];\n\n parts.push(`Problem: ${input.title}`);\n\n if (input.symptoms.length > 0) {\n parts.push(`Symptoms: ${input.symptoms.join(', ')}`);\n }\n\n if (input.rootCause) {\n parts.push(`Root Cause: ${input.rootCause}`);\n }\n\n if (input.solution) {\n parts.push(`Solution: ${input.solution}`);\n }\n\n if (input.technologies && input.technologies.length > 0) {\n parts.push(`Technologies: ${input.technologies.join(', ')}`);\n }\n\n return parts.join('\\n');\n }\n}\n\nexport function createSharedPromoter(\n sharedStore: SharedStore,\n sharedVectorStore: SharedVectorStore,\n embedder: Embedder,\n config?: SharedStoreConfig\n): SharedPromoter {\n return new SharedPromoter(sharedStore, sharedVectorStore, embedder, config);\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;AAKA,SAAS,SAAS;AAMX,IAAM,kBAAkB,EAAE,KAAK;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAOM,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,IAAI,EAAE,OAAO,EAAE,KAAK;AAAA,EACpB,WAAW;AAAA,EACX,WAAW,EAAE,OAAO;AAAA,EACpB,WAAW,EAAE,KAAK;AAAA,EAClB,SAAS,EAAE,OAAO;AAAA,EAClB,cAAc,EAAE,OAAO;AAAA,EACvB,WAAW,EAAE,OAAO;AAAA,EACpB,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAC3C,CAAC;AAIM,IAAM,yBAAyB,kBAAkB,KAAK;AAAA,EAC3D,IAAI;AAAA,EACJ,WAAW;AAAA,EACX,cAAc;AAChB,CAAC;AAOM,IAAM,gBAAgB,EAAE,OAAO;AAAA,EACpC,IAAI,EAAE,OAAO;AAAA,EACb,WAAW,EAAE,KAAK;AAAA,EAClB,SAAS,EAAE,KAAK,EAAE,SAAS;AAAA,EAC3B,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AACrC,CAAC;AAOM,IAAM,oBAAoB,EAAE,KAAK;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,gBAAgB,EAAE,OAAO;AAAA,EACpC,IAAI,EAAE,OAAO,EAAE,KAAK;AAAA,EACpB,aAAa;AAAA,EACb,SAAS,EAAE,OAAO;AAAA,EAClB,cAAc,EAAE,OAAO;AAAA,EACvB,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACnC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;AAAA,EACvC,WAAW,EAAE,KAAK;AAAA,EAClB,aAAa,EAAE,KAAK;AACtB,CAAC;AAOM,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,OAAO;AAAA,EACP,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EAC9B,iBAAiB,EAAE,OAAO,EAAE,SAAS;AACvC,CAAC;AAOM,IAAM,wBAAwB,EAAE,KAAK,CAAC,QAAQ,aAAa,MAAM,CAAC;AAGlE,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,OAAO,kBAAkB,SAAS;AAAA,EAClC,YAAY;AAAA,EACZ,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,EACzB,cAAc,EAAE,MAAM,iBAAiB,EAAE,SAAS;AACpD,CAAC;AAIM,IAAM,mBAAmB;AAAA,EAC9B,kBAAkB;AAAA,EAClB,QAAQ;AAAA,EACR,qBAAqB;AACvB;AAMO,IAAM,oBAAoB,EAAE,KAAK,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI,CAAC;AAG/D,IAAM,yBAAyB,EAAE,OAAO;AAAA,EAC7C,SAAS,EAAE,OAAO,EAAE,KAAK;AAAA,EACzB,WAAW;AAAA,EACX,SAAS;AAAA,EACT,SAAS,EAAE,QAAQ;AAAA,EACnB,QAAQ,EAAE,OAAO,EAAE,SAAS;AAC9B,CAAC;AAOM,IAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACpC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EAC/B,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACnC,WAAW,EAAE,KAAK,CAAC,SAAS,SAAS,MAAM,CAAC;AAAA,EAC5C,eAAe,EAAE,OAAO;AAAA,EACxB,aAAa,EAAE,OAAO;AACxB,CAAC;AAOM,IAAM,eAAe,EAAE,OAAO;AAAA,EACnC,SAAS,EAAE,OAAO;AAAA,IAChB,MAAM,EAAE,OAAO,EAAE,QAAQ,uBAAuB;AAAA,IAChD,WAAW,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,EACnC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,WAAW,EAAE,OAAO;AAAA,IAClB,UAAU,EAAE,KAAK,CAAC,SAAS,QAAQ,CAAC,EAAE,QAAQ,OAAO;AAAA,IACrD,OAAO,EAAE,OAAO,EAAE,QAAQ,yBAAyB;AAAA,IACnD,aAAa,EAAE,OAAO,EAAE,QAAQ,wBAAwB;AAAA,IACxD,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EAClC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,WAAW,EAAE,OAAO;AAAA,IAClB,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,IAC1B,UAAU,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,IAChC,WAAW,EAAE,OAAO,EAAE,QAAQ,GAAI;AAAA,EACpC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,UAAU,EAAE,OAAO;AAAA,IACjB,kBAAkB,EAAE,OAAO,EAAE,QAAQ,IAAI;AAAA,IACzC,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI;AAAA,IAC/B,qBAAqB,EAAE,OAAO,EAAE,QAAQ,IAAI;AAAA,IAC5C,SAAS,EAAE,OAAO;AAAA,MAChB,oBAAoB,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,MAC1C,UAAU,EAAE,OAAO,EAAE,QAAQ,IAAI;AAAA,MACjC,cAAc,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,MACpC,cAAc,EAAE,OAAO,EAAE,QAAQ,IAAI;AAAA,IACvC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACf,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,SAAS,EAAE,OAAO;AAAA,IAChB,iBAAiB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,YAAY,UAAU,WAAW,SAAS,QAAQ,CAAC;AAAA,IACjG,WAAW,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,IACpC,aAAa,EAAE,OAAO;AAAA,MACpB,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,MACjC,QAAQ,EAAE,KAAK,CAAC,aAAa,cAAc,EAAE,CAAC,EAAE,QAAQ,WAAW;AAAA,MACnE,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,MAC5C,kBAAkB,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,WAAW,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;AAAA,IAClF,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACf,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,iBAAiB,EAAE,OAAO;AAAA,IACxB,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IACjC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,aAAa,UAAU,CAAC;AAAA,IACpE,iBAAiB,EAAE,OAAO,EAAE,QAAQ,GAAK;AAAA,IACzC,gBAAgB,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,IACtC,oBAAoB,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAC/C,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,UAAU,EAAE,OAAO;AAAA,IACjB,UAAU,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IAClC,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IACxC,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IAC3C,sBAAsB,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,IAC/C,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IAC1C,aAAa,EAAE,OAAO;AAAA,MACpB,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,MACjC,aAAa,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,MACrC,cAAc,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,MACtC,2BAA2B,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,MACjD,mBAAmB,EAAE,OAAO,EAAE,QAAQ,8BAA8B;AAAA,IACtE,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACf,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,MAAM,EAAE,KAAK,CAAC,WAAW,SAAS,CAAC,EAAE,QAAQ,SAAS;AAAA,EACtD,SAAS,EAAE,OAAO;AAAA,IAChB,SAAS,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,IAClC,YAAY,EAAE,OAAO;AAAA,MACnB,WAAW,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,MACjC,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,MACtC,mBAAmB,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,IAC3C,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,IACb,eAAe,EAAE,OAAO;AAAA,MACtB,mBAAmB,EAAE,OAAO,EAAE,QAAQ,IAAO;AAAA,MAC7C,mBAAmB,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,MACzC,eAAe,EAAE,OAAO,EAAE,QAAQ,IAAO;AAAA,MACzC,qBAAqB,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,IAChD,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,IACb,YAAY,EAAE,OAAO;AAAA,MACnB,qBAAqB,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,MAC3C,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,IACxC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACf,CAAC,EAAE,SAAS;AACd,CAAC;AA2DM,IAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,EACzB,YAAY,EAAE,OAAO,EAAE,SAAS;AAClC,CAAC;AAGM,IAAM,+BAA+B,EAAE,OAAO;AAAA,EACnD,UAAU,EAAE,OAAO;AAAA,EACnB,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAC/B,YAAY,EAAE,OAAO;AAAA,EACrB,YAAY,EAAE,OAAO;AAAA,EACrB,SAAS,EAAE,QAAQ;AAAA,EACnB,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,UAAU,mBAAmB,SAAS;AACxC,CAAC;AAoCM,IAAM,mBAAmB,EAAE,KAAK,CAAC,QAAQ,aAAa,UAAU,CAAC;AAGjE,IAAM,mBAAmB,EAAE,KAAK;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,qBAAqB,EAAE,KAAK,CAAC,OAAO,UAAU,QAAQ,UAAU,CAAC;AAGvE,IAAM,oBAAoB,EAAE,KAAK;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,qBAAqB,EAAE,KAAK;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAIM,IAAM,eAAe,EAAE,OAAO;AAAA,EACnC,UAAU,EAAE,OAAO;AAAA,EACnB,YAAY;AAAA,EACZ,cAAc,EAAE,OAAO;AAAA,EACvB,OAAO,EAAE,OAAO;AAAA,EAChB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,aAAa,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EACjC,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,WAAW,EAAE,KAAK;AAAA,EAClB,WAAW,EAAE,KAAK;AACpB,CAAC;AAIM,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,QAAQ;AAAA,EACR,UAAU,mBAAmB,SAAS;AAAA,EACtC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACvC,oBAAoB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACjD,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,SAAS,EAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;AAIM,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,YAAY;AAAA,EACZ,cAAc,EAAE,OAAO;AAAA,EACvB,UAAU,EAAE,OAAO;AAAA,EACnB,WAAW,EAAE,QAAQ;AACvB,CAAC;AAOM,IAAM,iBAAiB,EAAE,KAAK,CAAC,SAAS,UAAU,OAAO,CAAC;AAG1D,IAAM,qBAAqB,EAAE,KAAK;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,aAAa,EAAE,OAAO;AAAA,EACjC,QAAQ,EAAE,OAAO;AAAA,EACjB,SAAS;AAAA,EACT,OAAO,EAAE,OAAO;AAAA,EAChB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO,EAAE,OAAO;AAAA,EAChB,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACzC,WAAW,EAAE,KAAK;AACpB,CAAC;AAOM,IAAM,sBAAsB,EAAE,KAAK;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,oBAAoB,EAAE,KAAK,CAAC,WAAW,SAAS,CAAC;AAGvD,IAAM,oBAAoB,EAAE,KAAK,CAAC,QAAQ,aAAa,UAAU,CAAC;AAGlE,IAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,MAAM;AAAA,EACN,UAAU,EAAE,OAAO;AAAA,EACnB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC9C,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAC3C,CAAC;AAIM,IAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,QAAQ,EAAE,OAAO;AAAA,EACjB,OAAO,EAAE,OAAO;AAAA,EAChB,cAAc,EAAE,OAAO;AAAA,EACvB,eAAe;AAAA,EACf,UAAU,mBAAmB,SAAS;AAAA,EACtC,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,SAAS,EAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;AAGM,IAAM,iCAAiC,EAAE,OAAO;AAAA,EACrD,QAAQ,EAAE,OAAO;AAAA,EACjB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,QAAQ,EAAE,OAAO,EAAE,SAAS;AAC9B,CAAC;AAGM,IAAM,+BAA+B,EAAE,OAAO;AAAA,EACnD,QAAQ,EAAE,OAAO;AAAA,EACjB,MAAM;AAAA,EACN,UAAU,EAAE,MAAM,gBAAgB;AAAA,EAClC,eAAe,EAAE,OAAO,EAAE,SAAS;AACrC,CAAC;AAOM,IAAM,kBAAkB,EAAE,KAAK;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,cAAc,EAAE,OAAO;AAAA,EAClC,SAAS,EAAE,OAAO;AAAA,EAClB,WAAW,EAAE,KAAK;AAAA,EAClB,WAAW;AAAA,EACX,OAAO,EAAE,OAAO;AAAA,EAChB,aAAa,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EACjC,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,cAAc,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EAC7C,cAAc,EAAE,OAAO;AACzB,CAAC;AAOM,IAAM,0BAA0B,EAAE,OAAO;AAAA,EAC9C,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EAC3C,OAAO,EAAE,OAAO;AAClB,CAAC;AAGM,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EAC3C,OAAO,EAAE,OAAO;AAAA,EAChB,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACxC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACnC,WAAW,EAAE,OAAO;AAAA,EACpB,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACnC,aAAa,EAAE,KAAK,CAAC,SAAS,cAAc,OAAO,CAAC;AACtD,CAAC;AAGM,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EAC3C,OAAO,EAAE,OAAO;AAAA,EAChB,eAAe,EAAE,KAAK,CAAC,aAAa,mBAAmB,aAAa,eAAe,eAAe,CAAC;AACrG,CAAC;AAGM,IAAM,4BAA4B,EAAE,mBAAmB,WAAW;AAAA,EACvE,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI,GAAG,UAAU,sBAAsB,CAAC;AAAA,EACtE,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,GAAG,UAAU,qBAAqB,CAAC;AACxE,CAAC;AAOM,IAAM,qBAAqB,EAAE,KAAK,CAAC,WAAW,cAAc,QAAQ,QAAQ,CAAC;AAG7E,IAAM,uBAAuB,EAAE,KAAK,CAAC,SAAS,cAAc,OAAO,CAAC;AAGpE,IAAM,kBAAkB,EAAE,OAAO;AAAA,EACtC,OAAO,EAAE,OAAO;AAAA,EAChB,UAAU;AAAA,EACV,QAAQ,EAAE,OAAO;AAAA,EACjB,kBAAkB,EAAE,OAAO;AAAA,EAC3B,QAAQ;AAAA,EACR,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACzC,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,WAAW,EAAE,KAAK;AAAA,EAClB,WAAW,EAAE,KAAK;AACpB,CAAC;AAIM,IAAM,2BAA4E;AAAA,EACvF,EAAE,MAAM,WAAW,IAAI,aAAa;AAAA,EACpC,EAAE,MAAM,cAAc,IAAI,OAAO;AAAA,EACjC,EAAE,MAAM,cAAc,IAAI,SAAS;AAAA,EACnC,EAAE,MAAM,UAAU,IAAI,UAAU;AAClC;AAMO,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,SAAS,EAAE,OAAO;AAAA,EAClB,WAAW,EAAE,KAAK;AAAA,EAClB,YAAY,EAAE,KAAK,EAAE,SAAS;AAAA,EAC9B,gBAAgB,EAAE,OAAO;AAAA,EACzB,qBAAqB,EAAE,OAAO;AAAA,EAC9B,eAAe,EAAE,OAAO;AAAA,EACxB,kBAAkB,EAAE,OAAO;AAAA,EAC3B,cAAc,EAAE,OAAO;AAAA,EACvB,eAAe,EAAE,OAAO;AAAA,EACxB,QAAQ,EAAE,KAAK,CAAC,WAAW,WAAW,QAAQ,CAAC;AAAA,EAC/C,OAAO,EAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAOM,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,IAAI,EAAE,OAAO;AAAA,EACb,IAAI,EAAE,KAAK;AAAA,EACX,OAAO,EAAE,OAAO;AAAA,EAChB,WAAW,EAAE,OAAO;AAAA,EACpB,SAAS,EAAE,QAAQ;AAAA,EACnB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,WAAW,EAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAQM,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,IAAI,EAAE,OAAO;AAAA,EACb,SAAS,EAAE,OAAO,EAAE,IAAI,GAAG;AAAA,EAC3B,OAAO,EAAE,OAAO;AAAA,EAChB,MAAM,EAAE,KAAK,CAAC,eAAe,kBAAkB,mBAAmB,kBAAkB,CAAC;AAAA,EACrF,WAAW,EAAE,KAAK;AAAA,EAClB,WAAW,EAAE,OAAO;AACtB,CAAC;AAIM,IAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,IAAI,EAAE,OAAO;AAAA,EACb,WAAW,EAAE,KAAK;AAAA,EAClB,MAAM,EAAE,KAAK,CAAC,eAAe,kBAAkB,mBAAmB,kBAAkB,CAAC;AAAA,EACrF,SAAS,EAAE,OAAO,EAAE,IAAI,GAAG;AAAA,EAC3B,UAAU,EAAE,QAAQ;AACtB,CAAC;AAIM,IAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,IAAI,EAAE,OAAO;AAAA,EACb,SAAS,EAAE,OAAO;AAAA,EAClB,MAAM,EAAE,KAAK,CAAC,eAAe,kBAAkB,mBAAmB,kBAAkB,CAAC;AAAA,EACrF,WAAW,EAAE,KAAK;AAAA,EAClB,WAAW,EAAE,OAAO;AAAA,EACpB,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,UAAU,EAAE,OAAO;AAAA,IACjB,YAAY,EAAE,OAAO;AAAA,IACrB,SAAS,EAAE,QAAQ;AAAA,IACnB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IACpC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACtC,CAAC;AACH,CAAC;AAIM,IAAM,gCAAgC,EAAE,OAAO;AAAA,EACpD,OAAO,EAAE,MAAM,qBAAqB;AAAA,EACpC,UAAU,EAAE,MAAM,kBAAkB,EAAE,SAAS;AAAA,EAC/C,SAAS,EAAE,MAAM,gBAAgB,EAAE,SAAS;AAAA,EAC5C,MAAM,EAAE,OAAO;AAAA,IACb,cAAc,EAAE,OAAO;AAAA,IACvB,eAAe,EAAE,OAAO;AAAA,IACxB,iBAAiB,EAAE,OAAO;AAAA,IAC1B,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,CAAC;AACH,CAAC;AAIM,IAAM,oCAAoC,EAAE,OAAO;AAAA,EACxD,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EACjC,QAAQ,EAAE,OAAO;AAAA,IACf,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,IAC3B,UAAU,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,EAClC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,YAAY,EAAE,OAAO;AAAA,IACnB,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IACjC,yBAAyB,EAAE,OAAO,EAAE,QAAQ,IAAI;AAAA,IAChD,mBAAmB,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,IACzC,oBAAoB,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAC1C,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACb,aAAa,EAAE,OAAO;AAAA,IACpB,gBAAgB,EAAE,OAAO,EAAE,QAAQ,GAAI;AAAA,IACvC,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,IACpC,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,IACpC,eAAe,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,EACvC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACf,CAAC;AAOM,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC;AAAA,EAC/B,SAAS,EAAE,OAAO;AAAA,EAClB,WAAW,EAAE,KAAK;AACpB,CAAC;AAGM,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,SAAS,EAAE,OAAO;AAAA,EAClB,YAAY,EAAE,OAAO;AAAA,EACrB,WAAW,EAAE,OAAO;AAAA,EACpB,QAAQ,EAAE,KAAK;AAAA,EACf,SAAS,EAAE,OAAO,EAAE,SAAS;AAC/B,CAAC;AAkBM,IAAM,mBAAmB,EAAE,KAAK,CAAC,WAAW,SAAS,CAAC;AAGtD,IAAM,0BAA0B,EAAE,OAAO;AAAA,EAC9C,SAAS,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAElC,YAAY,EAAE,OAAO;AAAA,IACnB,WAAW,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,IACjC,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,IACtC,mBAAmB,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,EAC3C,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAEb,eAAe,EAAE,OAAO;AAAA,IACtB,mBAAmB,EAAE,OAAO,EAAE,QAAQ,IAAO;AAAA;AAAA,IAC7C,mBAAmB,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,IACzC,eAAe,EAAE,OAAO,EAAE,QAAQ,IAAO;AAAA;AAAA,IACzC,qBAAqB,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAChD,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAEb,YAAY,EAAE,OAAO;AAAA,IACnB,qBAAqB,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,IAC3C,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EACxC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACf,CAAC;AAIM,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,IAAI,EAAE,OAAO;AAAA,EACb,SAAS,EAAE,OAAO;AAAA,EAClB,SAAS,EAAE,KAAK;AAAA,EAChB,gBAAgB,EAAE,OAAO;AAAA,EACzB,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACrC,WAAW,EAAE,KAAK;AACpB,CAAC;AAWM,IAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,UAAU,EAAE,OAAO;AAAA,EACnB,SAAS,EAAE,OAAO;AAAA,EAClB,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EAC1B,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EAChC,YAAY,EAAE,OAAO;AAAA,EACrB,WAAW,EAAE,KAAK;AAAA,EAClB,YAAY,EAAE,KAAK,EAAE,SAAS;AAAA,EAC9B,aAAa,EAAE,OAAO,EAAE,QAAQ,CAAC;AACnC,CAAC;AA2BM,IAAM,uBAAuB,EAAE,KAAK,CAAC,YAAY,eAAe,OAAO,CAAC;AAUxE,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,OAAO,EAAE,OAAO;AAAA,EAChB,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,iBAAiB,EAAE,OAAO;AAAA,EAC1B,gBAAgB;AAAA,EAChB,WAAW,EAAE,KAAK;AACpB,CAAC;AAgBM,IAAM,wBAAwB,EAAE,KAAK;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,mCAAmC,EAAE,OAAO;AAAA,EACvD,SAAS,EAAE,OAAO;AAAA,EAClB,mBAAmB,EAAE,OAAO;AAAA,EAC5B,eAAe,EAAE,OAAO;AAAA,EACxB,OAAO,EAAE,OAAO;AAAA,EAChB,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EAC5B,WAAW,EAAE,OAAO;AAAA,EACpB,UAAU,EAAE,OAAO;AAAA,EACnB,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EAC1B,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC3C,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACnC,YAAY,EAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAChC,YAAY,EAAE,KAAK,EAAE,SAAS;AAAA,EAC9B,YAAY,EAAE,KAAK;AAAA,EACnB,WAAW,EAAE,KAAK;AACpB,CAAC;AAeM,IAAM,0BAA0B,EAAE,OAAO;AAAA,EAC9C,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EACjC,aAAa,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EACrC,cAAc,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EACtC,2BAA2B,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,EACjD,mBAAmB,EAAE,OAAO,EAAE,QAAQ,8BAA8B;AACtE,CAAC;;;AC53BD,SAAS,kBAAkB;AAE3B,IAAM,iBAAiB;AAahB,SAAS,iBACd,OACA,SACQ;AAER,MAAI,aAAa,MAAM,UAAU,MAAM;AAGvC,eAAa,WAAW,YAAY;AAGpC,eAAa,WAAW,QAAQ,qBAAqB,EAAE;AAGvD,eAAa,WAAW,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAGlD,MAAI,MAAM;AACV,MAAI,SAAS,SAAS;AACpB,UAAM,GAAG,QAAQ,OAAO,KAAK,GAAG;AAAA,EAClC;AAGA,MAAI,IAAI,SAAS,gBAAgB;AAC/B,UAAM,aAAa,WAAW,KAAK,EAAE,OAAO,GAAG,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,CAAC;AACzE,UAAM,IAAI,MAAM,GAAG,iBAAiB,CAAC,IAAI,MAAM;AAAA,EACjD;AAEA,SAAO;AACT;AAKO,SAAS,mBAAmB,GAAW,GAAoB;AAChE,SAAO,iBAAiB,CAAC,MAAM,iBAAiB,CAAC;AACnD;AAMO,SAAS,cAAc,SAAiB,WAA2B;AACxE,QAAM,cAAc,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AACrE,SAAO,GAAG,SAAS,IAAI,WAAW;AACpC;AAKO,SAAS,YAAY,SAAyB;AACnD,SAAO,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAC1D;AAWA,SAAS,gBAAgB,MAAsB;AAC7C,SAAO,KACJ,UAAU,MAAM,EAChB,YAAY,EACZ,QAAQ,qBAAqB,EAAE,EAC/B,QAAQ,QAAQ,GAAG,EACnB,KAAK;AACV;AAMO,SAAS,uBACd,YACA,YACA,SACQ;AACR,QAAM,UAAU,SAAS,WAAW;AAEpC,UAAQ,YAAY;AAAA,IAClB,KAAK;AACH,aAAO,QAAQ,OAAO,IAAI,gBAAgB,UAAU,CAAC;AAAA,IACvD,KAAK;AACH,aAAO,QAAQ,OAAO,IAAI,gBAAgB,UAAU,CAAC;AAAA,IACvD,KAAK;AACH,aAAO,gBAAgB,UAAU;AAAA,EACrC;AACF;AASO,SAAS,gBAAgB,YAA4B;AAE1D,MAAI,eAAe,KAAK,UAAU,GAAG;AACnC,UAAMA,QAAO,WAAW,MAAM,EAAE,OAAO,UAAU,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAC5E,WAAO,WAAWA,KAAI;AAAA,EACxB;AAGA,QAAM,YAAY,WAAW,MAAM,gBAAgB;AACnD,MAAI,WAAW;AACb,WAAO,YAAY,UAAU,CAAC,EAAE,YAAY,CAAC;AAAA,EAC/C;AAGA,QAAM,UAAU,WAAW,MAAM,yBAAyB;AAC1D,MAAI,SAAS;AACX,WAAO,gBAAgB,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC;AAAA,EACjD;AAGA,QAAM,OAAO,WAAW,MAAM,EAAE,OAAO,UAAU,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAC5E,SAAO,eAAe,IAAI;AAC5B;AAKO,SAAS,uBACd,WACA,QACA,WACA,mBACQ;AACR,QAAM,QAAQ,CAAC,WAAW,QAAQ,SAAS;AAC3C,MAAI,mBAAmB;AACrB,UAAM,KAAK,iBAAiB;AAAA,EAC9B;AACA,QAAM,WAAW,MAAM,KAAK,GAAG;AAC/B,SAAO,WAAW,QAAQ,EAAE,OAAO,QAAQ,EAAE,OAAO,KAAK;AAC3D;AAKO,SAAS,wBAAwB,cAI/B;AACP,QAAM,YAAY,aAAa,MAAM,qBAAqB;AAC1D,MAAI,WAAW;AACb,WAAO,EAAE,YAAY,QAAQ,SAAS,UAAU,CAAC,GAAG,YAAY,UAAU,CAAC,EAAE;AAAA,EAC/E;AAEA,QAAM,YAAY,aAAa,MAAM,qBAAqB;AAC1D,MAAI,WAAW;AACb,WAAO,EAAE,YAAY,aAAa,SAAS,UAAU,CAAC,GAAG,YAAY,UAAU,CAAC,EAAE;AAAA,EACpF;AAEA,QAAM,WAAW,aAAa,MAAM,oBAAoB;AACxD,MAAI,UAAU;AACZ,WAAO,EAAE,YAAY,YAAY,YAAY,SAAS,CAAC,EAAE;AAAA,EAC3D;AAEA,SAAO;AACT;;;ACpLA,SAAS,kBAAkB;;;ACA3B,OAAO,YAAY;AAQnB,SAAS,eAAkB,KAAW;AACpC,MAAI,QAAQ,QAAQ,QAAQ;AAAW,WAAO;AAC9C,MAAI,OAAO,QAAQ;AAAU,WAAO,OAAO,GAAG;AAC9C,MAAI,eAAe;AAAM,WAAO;AAChC,MAAI,MAAM,QAAQ,GAAG;AAAG,WAAO,IAAI,IAAI,cAAc;AACrD,MAAI,OAAO,QAAQ,UAAU;AAC3B,UAAM,SAAkC,CAAC;AACzC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAA8B,GAAG;AACzE,aAAO,GAAG,IAAI,eAAe,KAAK;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAMO,SAAS,OAAO,OAAsB;AAC3C,MAAI,iBAAiB;AAAM,WAAO;AAClC,MAAI,OAAO,UAAU;AAAU,WAAO,IAAI,KAAK,KAAK;AACpD,MAAI,OAAO,UAAU;AAAU,WAAO,IAAI,KAAK,KAAK;AACpD,SAAO,IAAI,KAAK,OAAO,KAAK,CAAC;AAC/B;AAKO,SAAS,eAAe,MAAwB;AACrD,SAAO,IAAI,OAAO,SAAS,IAAI;AACjC;AAKO,SAAS,MAAM,IAAc,KAAa,SAAoB,CAAC,GAAkB;AACtF,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,OAAO,WAAW,GAAG;AACvB,SAAG,IAAI,KAAK,CAAC,QAAsB;AACjC,YAAI;AAAK,iBAAO,GAAG;AAAA;AACd,kBAAQ;AAAA,MACf,CAAC;AAAA,IACH,OAAO;AACL,SAAG,IAAI,KAAK,GAAG,QAAQ,CAAC,QAAsB;AAC5C,YAAI;AAAK,iBAAO,GAAG;AAAA;AACd,kBAAQ;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAMO,SAAS,MACd,IACA,KACA,SAAoB,CAAC,GACP;AACd,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,OAAO,WAAW,GAAG;AACvB,SAAG,IAAI,KAAK,CAAC,KAAmB,SAAc;AAC5C,YAAI;AAAK,iBAAO,GAAG;AAAA;AACd,kBAAQ,eAAe,QAAQ,CAAC,CAAC,CAAC;AAAA,MACzC,CAAC;AAAA,IACH,OAAO;AACL,SAAG,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAmB,SAAc;AACvD,YAAI;AAAK,iBAAO,GAAG;AAAA;AACd,kBAAQ,eAAe,QAAQ,CAAC,CAAC,CAAC;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAKO,SAAS,QAAQ,IAA6B;AACnD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,OAAG,MAAM,CAAC,QAAsB;AAC9B,UAAI;AAAK,eAAO,GAAG;AAAA;AACd,gBAAQ;AAAA,IACf,CAAC;AAAA,EACH,CAAC;AACH;;;ADnFO,IAAM,aAAN,MAAiB;AAAA,EAItB,YAAoB,QAAgB;AAAhB;AAClB,SAAK,KAAK,eAAe,MAAM;AAAA,EACjC;AAAA,EALQ;AAAA,EACA,cAAc;AAAA;AAAA;AAAA;AAAA,EAStB,MAAM,aAA4B;AAChC,QAAI,KAAK;AAAa;AAGtB,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAWpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAMpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KASpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAWpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAWpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAOpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAMpB;AAOD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAepB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAcpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KASpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAWpB;AAMD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAapB;AAMD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAcpB;AAED,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAUpB;AAOD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KASpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAWpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KASpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAMpB;AAOD,UAAM,MAAM,KAAK,IAAI,oEAAoE;AACzF,UAAM,MAAM,KAAK,IAAI,gEAAgE;AACrF,UAAM,MAAM,KAAK,IAAI,4EAA4E;AAGjG,UAAM,MAAM,KAAK,IAAI,0FAA0F;AAC/G,UAAM,MAAM,KAAK,IAAI,oEAAoE;AAGzF,UAAM,MAAM,KAAK,IAAI,qEAAqE;AAC1F,UAAM,MAAM,KAAK,IAAI,qEAAqE;AAC1F,UAAM,MAAM,KAAK,IAAI,6DAA6D;AAGlF,UAAM,MAAM,KAAK,IAAI,uEAAuE;AAG5F,UAAM,MAAM,KAAK,IAAI,+EAA+E;AACpG,UAAM,MAAM,KAAK,IAAI,2FAA2F;AAChH,UAAM,MAAM,KAAK,IAAI,kGAAkG;AACvH,UAAM,MAAM,KAAK,IAAI,iFAAiF;AAEtG,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAO,OAAgD;AAC3D,UAAM,KAAK,WAAW;AAEtB,UAAM,eAAe,iBAAiB,MAAM,OAAO;AACnD,UAAM,YAAY,cAAc,MAAM,SAAS,MAAM,SAAS;AAG9D,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,SAAS;AAAA,IACZ;AAEA,QAAI,SAAS,SAAS,GAAG;AACvB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,SAAS,CAAC,EAAE;AAAA,QACrB,aAAa;AAAA,MACf;AAAA,IACF;AAEA,UAAM,KAAK,WAAW;AACtB,UAAM,YAAY,MAAM,UAAU,YAAY;AAE9C,QAAI;AACF,YAAM;AAAA,QACJ,KAAK;AAAA,QACL;AAAA;AAAA,QAEA;AAAA,UACE;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,UACN;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,KAAK,UAAU,MAAM,YAAY,CAAC,CAAC;AAAA,QACrC;AAAA,MACF;AAEA,YAAM;AAAA,QACJ,KAAK;AAAA,QACL;AAAA,QACA,CAAC,WAAW,EAAE;AAAA,MAChB;AAGA,YAAM;AAAA,QACJ,KAAK;AAAA,QACL;AAAA,QACA,CAAC,EAAE;AAAA,MACL;AAEA,aAAO,EAAE,SAAS,MAAM,SAAS,IAAI,aAAa,MAAM;AAAA,IAC1D,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,WAA2C;AAChE,UAAM,KAAK,WAAW;AAEtB,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,SAAS;AAAA,IACZ;AAEA,WAAO,KAAK,IAAI,KAAK,UAAU;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,QAAgB,KAA6B;AACjE,UAAM,KAAK,WAAW;AAEtB,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,KAAK;AAAA,IACR;AAEA,WAAO,KAAK,IAAI,KAAK,UAAU;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,IAAyC;AACtD,UAAM,KAAK,WAAW;AAEtB,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,EAAE;AAAA,IACL;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAC9B,WAAO,KAAK,WAAW,KAAK,CAAC,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,SAA2D;AAC7E,UAAM,KAAK,WAAW;AAEtB,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,QAAQ,EAAE;AAAA,IACb;AAEA,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM;AAAA,QACJ,KAAK;AAAA,QACL;AAAA;AAAA,QAEA;AAAA,UACE,QAAQ;AAAA,WACP,QAAQ,aAAa,oBAAI,KAAK,GAAG,YAAY;AAAA,UAC9C,QAAQ,eAAe;AAAA,UACvB,KAAK,UAAU,QAAQ,QAAQ,CAAC,CAAC;AAAA,QACnC;AAAA,MACF;AAAA,IACF,OAAO;AACL,YAAM,UAAoB,CAAC;AAC3B,YAAM,SAAoB,CAAC;AAE3B,UAAI,QAAQ,SAAS;AACnB,gBAAQ,KAAK,cAAc;AAC3B,eAAO,KAAK,QAAQ,QAAQ,YAAY,CAAC;AAAA,MAC3C;AACA,UAAI,QAAQ,SAAS;AACnB,gBAAQ,KAAK,aAAa;AAC1B,eAAO,KAAK,QAAQ,OAAO;AAAA,MAC7B;AACA,UAAI,QAAQ,MAAM;AAChB,gBAAQ,KAAK,UAAU;AACvB,eAAO,KAAK,KAAK,UAAU,QAAQ,IAAI,CAAC;AAAA,MAC1C;AAEA,UAAI,QAAQ,SAAS,GAAG;AACtB,eAAO,KAAK,QAAQ,EAAE;AACtB,cAAM;AAAA,UACJ,KAAK;AAAA,UACL,uBAAuB,QAAQ,KAAK,IAAI,CAAC;AAAA,UACzC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,IAAqC;AACpD,UAAM,KAAK,WAAW;AAEtB,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,EAAE;AAAA,IACL;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAE9B,UAAM,MAAM,KAAK,CAAC;AAClB,WAAO;AAAA,MACL,IAAI,IAAI;AAAA,MACR,WAAW,OAAO,IAAI,UAAU;AAAA,MAChC,SAAS,IAAI,WAAW,OAAO,IAAI,QAAQ,IAAI;AAAA,MAC/C,aAAa,IAAI;AAAA,MACjB,SAAS,IAAI;AAAA,MACb,MAAM,IAAI,OAAO,KAAK,MAAM,IAAI,IAAc,IAAI;AAAA,IACpD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,SAAiB,SAAkC;AAC3E,UAAM,KAAK,WAAW;AAEtB,UAAM,KAAK,WAAW;AACtB,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA,MAEA,CAAC,IAAI,SAAS,OAAO;AAAA,IACvB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAsB,QAAgB,IAA2B;AACrE,UAAM,KAAK,WAAW;AAGtB,UAAM,UAAU,MAAM;AAAA,MACpB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA,CAAC,KAAK;AAAA,IACR;AAEA,QAAI,QAAQ,WAAW;AAAG,aAAO,CAAC;AAGlC,UAAM,MAAM,QAAQ,IAAI,OAAK,EAAE,EAAY;AAC3C,UAAM,eAAe,IAAI,IAAI,MAAM,GAAG,EAAE,KAAK,GAAG;AAChD,UAAM;AAAA,MACJ,KAAK;AAAA,MACL,kEAAkE,YAAY;AAAA,MAC9E;AAAA,IACF;AAEA,WAAO,QAAQ,IAAI,UAAQ;AAAA,MACzB,IAAI,IAAI;AAAA,MACR,SAAS,IAAI;AAAA,MACb,SAAS,IAAI;AAAA,MACb,QAAQ;AAAA,MACR,YAAY,IAAI;AAAA,MAChB,WAAW,OAAO,IAAI,UAAU;AAAA,MAChC,cAAc,IAAI;AAAA,IACpB,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,KAA8B;AACtD,QAAI,IAAI,WAAW;AAAG;AAEtB,UAAM,eAAe,IAAI,IAAI,MAAM,GAAG,EAAE,KAAK,GAAG;AAChD,UAAM;AAAA,MACJ,KAAK;AAAA,MACL,6CAA6C,YAAY;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,KAAe,OAA8B;AACjE,QAAI,IAAI,WAAW;AAAG;AAEtB,UAAM,eAAe,IAAI,IAAI,MAAM,GAAG,EAAE,KAAK,GAAG;AAChD,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,sBAIgB,YAAY;AAAA,MAC5B,CAAC,OAAO,GAAG,GAAG;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,SAAiB,OAA8B;AACrE,UAAM,KAAK,WAAW;AAEtB,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA,MACA,CAAC,OAAO,OAAO;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAkE;AACtE,UAAM,KAAK,WAAW;AAEtB,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,cAAwB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,KAAsC;AAC3D,UAAM,KAAK,WAAW;AAEtB,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,GAAG;AAAA,IACN;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAC9B,WAAO,KAAK,MAAM,KAAK,CAAC,EAAE,KAAK;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,KAAa,OAA+B;AACjE,UAAM,KAAK,WAAW;AAEtB,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA,MAEA,CAAC,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAqC;AACzC,UAAM,KAAK,WAAW;AAEtB,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,IACF;AAEA,WAAO,KAAK,IAAI,UAAQ;AAAA,MACtB,IAAI,IAAI;AAAA,MACR,WAAW,OAAO,IAAI,UAAU;AAAA,MAChC,SAAS,IAAI,WAAW,OAAO,IAAI,QAAQ,IAAI;AAAA,MAC/C,aAAa,IAAI;AAAA,MACjB,SAAS,IAAI;AAAA,MACb,MAAM,IAAI,OAAO,KAAK,MAAM,IAAI,IAAc,IAAI;AAAA,IACpD,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,UAAM,QAAQ,KAAK,EAAE;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,KAA2C;AAC5D,WAAO;AAAA,MACL,IAAI,IAAI;AAAA,MACR,WAAW,IAAI;AAAA,MACf,WAAW,IAAI;AAAA,MACf,WAAW,OAAO,IAAI,SAAS;AAAA,MAC/B,SAAS,IAAI;AAAA,MACb,cAAc,IAAI;AAAA,MAClB,WAAW,IAAI;AAAA,MACf,UAAU,IAAI,WAAW,KAAK,MAAM,IAAI,QAAkB,IAAI;AAAA,IAChE;AAAA,EACF;AACF;;;AEnrBA,SAAS,cAAAC,mBAAkB;AA2BpB,IAAM,aAAN,MAAiB;AAAA,EACtB,YAAoB,IAAc;AAAd;AAAA,EAAe;AAAA;AAAA;AAAA;AAAA,EAKnC,MAAM,OAAO,OAA2C;AACtD,UAAM,WAAWC,YAAW;AAC5B,UAAM,eAAe,uBAAuB,MAAM,YAAY,MAAM,OAAO;AAAA,MACzE,SAAS,MAAM;AAAA,IACjB,CAAC;AAED,UAAM,YAAY,MAAM,MAAM,YAAY,EAAE,KAAK;AACjD,UAAM,aAAa,GAAG,MAAM,KAAK,IAAI,KAAK,UAAU,MAAM,WAAW,CAAC;AAEtE,UAAM,MAAM,oBAAI,KAAK;AAErB,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA;AAAA,QACE;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA,MAAM;AAAA,QACN,MAAM,SAAS;AAAA,QACf,MAAM,UAAU;AAAA,QAChB,KAAK,UAAU,MAAM,WAAW;AAAA,QAChC;AAAA,QACA;AAAA,QACA,IAAI,YAAY;AAAA,QAChB,IAAI,YAAY;AAAA,MAClB;AAAA,IACF;AAGA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,MAAM,YAAY,cAAc,QAAQ;AAAA,IAC3C;AAEA,WAAO;AAAA,MACL;AAAA,MACA,YAAY,MAAM;AAAA,MAClB;AAAA,MACA,OAAO,MAAM;AAAA,MACb,OAAO,MAAM,SAAS;AAAA,MACtB,QAAQ,MAAM,UAAU;AAAA,MACxB,aAAa,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,WAAW;AAAA,IACb;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,UAA0C;AACvD,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,QAAQ;AAAA,IACX;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAC9B,WAAO,KAAK,YAAY,KAAK,CAAC,CAAC;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBACJ,YACA,cACwB;AACxB,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA,MAEA,CAAC,YAAY,YAAY;AAAA,IAC3B;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAC9B,WAAO,KAAK,YAAY,KAAK,CAAC,CAAC;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,OAAyE;AAC1F,UAAM,eAAe,uBAAuB,MAAM,YAAY,MAAM,OAAO;AAAA,MACzE,SAAS,MAAM;AAAA,IACjB,CAAC;AAED,UAAM,WAAW,MAAM,KAAK,mBAAmB,MAAM,YAAY,YAAY;AAC7E,QAAI,UAAU;AACZ,aAAO,EAAE,QAAQ,UAAU,SAAS,MAAM;AAAA,IAC5C;AAEA,UAAM,SAAS,MAAM,KAAK,OAAO,KAAK;AACtC,WAAO,EAAE,QAAQ,SAAS,KAAK;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,UAAkB,OAAkD;AAC/E,UAAM,WAAW,MAAM,KAAK,SAAS,QAAQ;AAC7C,QAAI,CAAC;AAAU,aAAO;AAEtB,UAAM,UAAoB,CAAC;AAC3B,UAAM,SAAoB,CAAC;AAE3B,QAAI,MAAM,gBAAgB,QAAW;AACnC,cAAQ,KAAK,kBAAkB;AAC/B,aAAO,KAAK,KAAK,UAAU,MAAM,WAAW,CAAC;AAAA,IAC/C;AACA,QAAI,MAAM,UAAU,QAAW;AAC7B,cAAQ,KAAK,WAAW;AACxB,aAAO,KAAK,MAAM,KAAK;AAAA,IACzB;AACA,QAAI,MAAM,WAAW,QAAW;AAC9B,cAAQ,KAAK,YAAY;AACzB,aAAO,KAAK,MAAM,MAAM;AAAA,IAC1B;AACA,QAAI,MAAM,eAAe,QAAW;AAClC,cAAQ,KAAK,iBAAiB;AAC9B,aAAO,KAAK,MAAM,UAAU;AAAA,IAC9B;AAEA,YAAQ,KAAK,gBAAgB;AAC7B,WAAO,MAAK,oBAAI,KAAK,GAAE,YAAY,CAAC;AAEpC,WAAO,KAAK,QAAQ;AAEpB,UAAM;AAAA,MACJ,KAAK;AAAA,MACL,uBAAuB,QAAQ,KAAK,IAAI,CAAC;AAAA,MACzC;AAAA,IACF;AAEA,WAAO,KAAK,SAAS,QAAQ;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACJ,YACA,SACmB;AACnB,QAAI,QAAQ;AACZ,UAAM,SAAoB,CAAC,UAAU;AAErC,QAAI,SAAS,QAAQ;AACnB,eAAS;AACT,aAAO,KAAK,QAAQ,MAAM;AAAA,IAC5B;AAEA,aAAS;AAET,QAAI,SAAS,OAAO;AAClB,eAAS;AACT,aAAO,KAAK,QAAQ,KAAK;AAAA,IAC3B;AACA,QAAI,SAAS,QAAQ;AACnB,eAAS;AACT,aAAO,KAAK,QAAQ,MAAM;AAAA,IAC5B;AAEA,UAAM,OAAO,MAAM,MAA+B,KAAK,IAAI,OAAO,MAAM;AACxE,WAAO,KAAK,IAAI,SAAO,KAAK,YAAY,GAAG,CAAC;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OACJ,OACA,SACmB;AACnB,UAAM,gBAAgB,IAAI,MAAM,YAAY,CAAC;AAE7C,QAAI,MAAM;AACV,UAAM,SAAoB,CAAC,eAAe,aAAa;AAEvD,QAAI,SAAS,YAAY;AACvB,aAAO;AACP,aAAO,KAAK,QAAQ,UAAU;AAAA,IAChC;AAEA,WAAO;AAEP,QAAI,SAAS,OAAO;AAClB,aAAO;AACP,aAAO,KAAK,QAAQ,KAAK;AAAA,IAC3B;AAEA,UAAM,OAAO,MAAM,MAA+B,KAAK,IAAI,KAAK,MAAM;AACtE,WAAO,KAAK,IAAI,SAAO,KAAK,YAAY,GAAG,CAAC;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,QAAmC;AACxD,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA;AAAA,MAKA,CAAC,MAAM;AAAA,IACT;AAEA,WAAO,KAAK,IAAI,SAAO,KAAK,YAAY,GAAG,CAAC;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,8BAGF;AACF,UAAM,QAAQ,MAAM,KAAK,iBAAiB,SAAS;AAEnD,UAAM,UAGD,CAAC;AAEN,eAAW,QAAQ,OAAO;AACxB,YAAM,eAAe,MAAM;AAAA,QACzB,KAAK;AAAA,QACL;AAAA;AAAA;AAAA;AAAA,QAIA,CAAC,KAAK,QAAQ;AAAA,MAChB;AAEA,cAAQ,KAAK;AAAA,QACX;AAAA,QACA,UAAU,aAAa,IAAI,UAAQ;AAAA,UACjC,UAAU,IAAI;AAAA,UACd,YAAY,IAAI;AAAA,UAChB,OAAO,IAAI;AAAA,QACb,EAAE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SACJ,YACA,cACA,UACe;AACf,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,YAAY,cAAc,QAAQ;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,YAAwB,cAA8C;AACtF,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,YAAY,YAAY;AAAA,IAC3B;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAC9B,WAAO,KAAK,YAAY,KAAK,CAAC,CAAC;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,KAAsC;AACxD,WAAO;AAAA,MACL,UAAU,IAAI;AAAA,MACd,YAAY,IAAI;AAAA,MAChB,cAAc,IAAI;AAAA,MAClB,OAAO,IAAI;AAAA,MACX,OAAO,IAAI;AAAA,MACX,QAAQ,IAAI;AAAA,MACZ,aAAa,OAAO,IAAI,iBAAiB,WACrC,KAAK,MAAM,IAAI,YAAY,IAC3B,IAAI;AAAA,MACR,WAAW,IAAI;AAAA,MACf,YAAY,IAAI;AAAA,MAChB,WAAW,OAAO,IAAI,UAAU;AAAA,MAChC,WAAW,OAAO,IAAI,UAAU;AAAA,IAClC;AAAA,EACF;AACF;;;ACxVA,SAAS,cAAAC,mBAAkB;AAYpB,IAAM,WAAN,MAAe;AAAA,EACpB,YAAoB,IAAc;AAAd;AAAA,EAAe;AAAA;AAAA;AAAA;AAAA,EAKnC,MAAM,OAAO,OAAuC;AAClD,UAAM,SAASA,YAAW;AAC1B,UAAM,MAAM,oBAAI,KAAK;AAErB,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA;AAAA,QACE;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,KAAK,UAAU,MAAM,YAAY,CAAC,CAAC;AAAA,QACnC,IAAI,YAAY;AAAA,MAClB;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,SAAS,MAAM;AAAA,MACf,OAAO,MAAM;AAAA,MACb,SAAS,MAAM;AAAA,MACf,SAAS,MAAM;AAAA,MACf,OAAO,MAAM;AAAA,MACb,UAAU,MAAM;AAAA,MAChB,WAAW;AAAA,IACb;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,OAAuC;AAElD,UAAM,WAAW,MAAM,KAAK;AAAA,MAC1B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAEA,QAAI,UAAU;AAEZ,YAAM;AAAA,QACJ,KAAK;AAAA,QACL;AAAA,QACA,CAAC,KAAK,UAAU,MAAM,YAAY,CAAC,CAAC,GAAG,SAAS,MAAM;AAAA,MACxD;AACA,aAAO,EAAE,GAAG,UAAU,UAAU,MAAM,SAAS;AAAA,IACjD;AAEA,WAAO,KAAK,OAAO,KAAK;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACJ,SACA,OACA,SACA,SACA,OACsB;AACtB,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,SAAS,OAAO,SAAS,SAAS,KAAK;AAAA,IAC1C;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAC9B,WAAO,KAAK,UAAU,KAAK,CAAC,CAAC;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UACJ,OACA,SACiB;AACjB,QAAI,QAAQ;AACZ,UAAM,SAAoB,CAAC,KAAK;AAEhC,QAAI,SAAS;AACX,eAAS;AACT,aAAO,KAAK,OAAO;AAAA,IACrB;AAEA,aAAS;AAET,UAAM,OAAO,MAAM,MAA+B,KAAK,IAAI,OAAO,MAAM;AACxE,WAAO,KAAK,IAAI,SAAO,KAAK,UAAU,GAAG,CAAC;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UACJ,OACA,SACiB;AACjB,QAAI,QAAQ;AACZ,UAAM,SAAoB,CAAC,KAAK;AAEhC,QAAI,SAAS;AACX,eAAS;AACT,aAAO,KAAK,OAAO;AAAA,IACrB;AAEA,aAAS;AAET,UAAM,OAAO,MAAM,MAA+B,KAAK,IAAI,OAAO,MAAM;AACxE,WAAO,KAAK,IAAI,SAAO,KAAK,UAAU,GAAG,CAAC;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,QAAiE;AAChF,UAAM,WAAW,MAAM,KAAK,UAAU,MAAM;AAC5C,UAAM,WAAW,MAAM,KAAK,UAAU,MAAM;AAC5C,WAAO,EAAE,UAAU,SAAS;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,QAAkC;AAC7C,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA,MACA,CAAC,MAAM;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,OAAe,SAAwC;AAC7E,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA,MACA,CAAC,OAAO,OAAO;AAAA,IACjB;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,OAAe,SAAwC;AAC7E,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA,MACA,CAAC,OAAO,OAAO;AAAA,IACjB;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aACJ,OACA,SACA,UACiB;AAEjB,UAAM,KAAK,kBAAkB,OAAO,OAAO;AAG3C,UAAM,UAAkB,CAAC;AACzB,eAAW,QAAQ,UAAU;AAC3B,YAAM,UAAU,MAAM,KAAK,OAAO;AAAA,QAChC,SAAS,KAAK;AAAA,QACd;AAAA,QACA;AAAA,QACA,SAAS,KAAK;AAAA,QACd,OAAO,KAAK;AAAA,QACZ,UAAU,KAAK;AAAA,MACjB,CAAC;AACD,cAAQ,KAAK,OAAO;AAAA,IACtB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,qBAAqB,QAIvB;AACF,UAAM,eAAe,MAAM,KAAK,UAAU,QAAQ,YAAY;AAC9D,UAAM,UAID,CAAC;AAEN,eAAW,QAAQ,cAAc;AAE/B,YAAM,aAAa,MAAM;AAAA,QACvB,KAAK;AAAA,QACL;AAAA;AAAA;AAAA,QAGA,CAAC,KAAK,KAAK;AAAA,MACb;AAEA,UAAI,WAAW,SAAS,GAAG;AACzB,gBAAQ,KAAK;AAAA,UACX,YAAY,KAAK;AAAA,UACjB,aAAa,WAAW,CAAC,EAAE;AAAA,UAC3B,YAAY;AAAA,QACd,CAAC;AAAA,MACH,OAAO;AACL,gBAAQ,KAAK;AAAA,UACX,YAAY,KAAK;AAAA,UACjB,aAAa,KAAK;AAAA,UAClB,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,SAIrB;AACF,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAgBA,CAAC,SAAS,OAAO;AAAA,IACnB;AAEA,WAAO,KAAK,IAAI,UAAQ;AAAA,MACtB,SAAS,IAAI;AAAA,MACb,aAAa,IAAI;AAAA,MACjB,cAAc,IAAI;AAAA,IACpB,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAqE;AACzE,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,IACF;AACA,WAAO,KAAK,IAAI,UAAQ;AAAA,MACtB,SAAS,IAAI;AAAA,MACb,OAAO,OAAO,IAAI,KAAK;AAAA,IACzB,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,KAAoC;AACpD,WAAO;AAAA,MACL,QAAQ,IAAI;AAAA,MACZ,SAAS,IAAI;AAAA,MACb,OAAO,IAAI;AAAA,MACX,SAAS,IAAI;AAAA,MACb,SAAS,IAAI;AAAA,MACb,OAAO,IAAI;AAAA,MACX,UAAU,OAAO,IAAI,cAAc,WAC/B,KAAK,MAAM,IAAI,SAAS,IACxB,IAAI;AAAA,MACR,WAAW,OAAO,IAAI,UAAU;AAAA,IAClC;AAAA,EACF;AACF;;;ACvUA,YAAY,aAAa;AAalB,IAAM,cAAN,MAAkB;AAAA,EAKvB,YAAoB,QAAgB;AAAhB;AAAA,EAAiB;AAAA,EAJ7B,KAAgC;AAAA,EAChC,QAA8B;AAAA,EACrB,YAAY;AAAA;AAAA;AAAA;AAAA,EAO7B,MAAM,aAA4B;AAChC,QAAI,KAAK;AAAI;AAEb,SAAK,KAAK,MAAc,gBAAQ,KAAK,MAAM;AAG3C,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,GAAG,WAAW;AACxC,UAAI,OAAO,SAAS,KAAK,SAAS,GAAG;AACnC,aAAK,QAAQ,MAAM,KAAK,GAAG,UAAU,KAAK,SAAS;AAAA,MACrD;AAAA,IACF,QAAQ;AAEN,WAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,QAAqC;AAChD,UAAM,KAAK,WAAW;AAEtB,QAAI,CAAC,KAAK,IAAI;AACZ,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC5C;AAEA,UAAM,OAAO;AAAA,MACX,IAAI,OAAO;AAAA,MACX,SAAS,OAAO;AAAA,MAChB,WAAW,OAAO;AAAA,MAClB,WAAW,OAAO;AAAA,MAClB,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO;AAAA,MACf,WAAW,OAAO;AAAA,MAClB,UAAU,KAAK,UAAU,OAAO,YAAY,CAAC,CAAC;AAAA,IAChD;AAEA,QAAI,CAAC,KAAK,OAAO;AAEf,WAAK,QAAQ,MAAM,KAAK,GAAG,YAAY,KAAK,WAAW,CAAC,IAAI,CAAC;AAAA,IAC/D,OAAO;AACL,YAAM,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,SAAwC;AACxD,QAAI,QAAQ,WAAW;AAAG;AAE1B,UAAM,KAAK,WAAW;AAEtB,QAAI,CAAC,KAAK,IAAI;AACZ,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC5C;AAEA,UAAM,OAAO,QAAQ,IAAI,aAAW;AAAA,MAClC,IAAI,OAAO;AAAA,MACX,SAAS,OAAO;AAAA,MAChB,WAAW,OAAO;AAAA,MAClB,WAAW,OAAO;AAAA,MAClB,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO;AAAA,MACf,WAAW,OAAO;AAAA,MAClB,UAAU,KAAK,UAAU,OAAO,YAAY,CAAC,CAAC;AAAA,IAChD,EAAE;AAEF,QAAI,CAAC,KAAK,OAAO;AACf,WAAK,QAAQ,MAAM,KAAK,GAAG,YAAY,KAAK,WAAW,IAAI;AAAA,IAC7D,OAAO;AACL,YAAM,KAAK,MAAM,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OACJ,aACA,UAII,CAAC,GACoB;AACzB,UAAM,KAAK,WAAW;AAEtB,QAAI,CAAC,KAAK,OAAO;AACf,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,EAAE,QAAQ,GAAG,WAAW,KAAK,UAAU,IAAI;AAGjD,QAAI,QAAQ,KAAK,MACd,OAAO,WAAW,EAClB,aAAa,QAAQ,EACrB,MAAM,QAAQ,CAAC;AAGlB,QAAI,WAAW;AACb,cAAQ,MAAM,MAAM,gBAAgB,SAAS,GAAG;AAAA,IAClD;AAEA,UAAM,UAAU,MAAM,MAAM,QAAQ;AAEpC,WAAO,QACJ,OAAO,OAAK;AAIX,YAAM,WAAW,EAAE,aAAa;AAChC,YAAM,QAAQ,IAAK,WAAW;AAC9B,aAAO,SAAS;AAAA,IAClB,CAAC,EACA,MAAM,GAAG,KAAK,EACd,IAAI,OAAK;AACR,YAAM,WAAW,EAAE,aAAa;AAChC,YAAM,QAAQ,IAAK,WAAW;AAC9B,aAAO;AAAA,QACL,IAAI,EAAE;AAAA,QACN,SAAS,EAAE;AAAA,QACX,SAAS,EAAE;AAAA,QACX;AAAA,QACA,WAAW,EAAE;AAAA,QACb,WAAW,EAAE;AAAA,QACb,WAAW,EAAE;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,SAAgC;AAC3C,QAAI,CAAC,KAAK;AAAO;AACjB,UAAM,KAAK,MAAM,OAAO,cAAc,OAAO,GAAG;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAyB;AAC7B,QAAI,CAAC,KAAK;AAAO,aAAO;AACxB,UAAM,SAAS,MAAM,KAAK,MAAM,UAAU;AAC1C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,SAAmC;AAC9C,QAAI,CAAC,KAAK;AAAO,aAAO;AAExB,UAAM,UAAU,MAAM,KAAK,MACxB,OAAO,CAAC,CAAC,EACT,MAAM,cAAc,OAAO,GAAG,EAC9B,MAAM,CAAC,EACP,QAAQ;AAEX,WAAO,QAAQ,SAAS;AAAA,EAC1B;AACF;;;AC3LA,SAAS,gBAA0B;AAQ5B,IAAM,WAAN,MAAe;AAAA,EACZ,WAA4B;AAAA,EACnB;AAAA,EACT,cAAc;AAAA,EAEtB,YAAY,YAAoB,2BAA2B;AACzD,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA4B;AAChC,QAAI,KAAK;AAAa;AAEtB,SAAK,WAAW,MAAM,SAAS,sBAAsB,KAAK,SAAS;AACnE,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,MAAwC;AAClD,UAAM,KAAK,WAAW;AAEtB,QAAI,CAAC,KAAK,UAAU;AAClB,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAEA,UAAM,SAAS,MAAM,KAAK,SAAS,MAAM;AAAA,MACvC,SAAS;AAAA,MACT,WAAW;AAAA,IACb,CAAC;AAED,UAAM,SAAS,MAAM,KAAK,OAAO,IAAoB;AAErD,WAAO;AAAA,MACL;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,YAAY,OAAO;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,OAA6C;AAC5D,UAAM,KAAK,WAAW;AAEtB,QAAI,CAAC,KAAK,UAAU;AAClB,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAEA,UAAM,UAA6B,CAAC;AAGpC,UAAM,YAAY;AAClB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,WAAW;AAChD,YAAM,QAAQ,MAAM,MAAM,GAAG,IAAI,SAAS;AAE1C,iBAAW,QAAQ,OAAO;AACxB,cAAM,SAAS,MAAM,KAAK,SAAS,MAAM;AAAA,UACvC,SAAS;AAAA,UACT,WAAW;AAAA,QACb,CAAC;AAED,cAAM,SAAS,MAAM,KAAK,OAAO,IAAoB;AAErD,gBAAQ,KAAK;AAAA,UACX;AAAA,UACA,OAAO,KAAK;AAAA,UACZ,YAAY,OAAO;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAiC;AACrC,UAAM,SAAS,MAAM,KAAK,MAAM,MAAM;AACtC,WAAO,OAAO;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAmB;AACjB,WAAO,KAAK,eAAe,KAAK,aAAa;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,eAAuB;AACrB,WAAO,KAAK;AAAA,EACd;AACF;AAGA,IAAI,kBAAmC;AAEhC,SAAS,qBAA+B;AAC7C,MAAI,CAAC,iBAAiB;AACpB,sBAAkB,IAAI,SAAS;AAAA,EACjC;AACA,SAAO;AACT;;;ACrHA,SAAS,cAAAC,mBAAkB;AAe3B,IAAM,iBAA+B;AAAA,EACnC,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,kBAAkB,IAAI,KAAK;AAAA;AAAA,EAC3B,aAAa;AACf;AAUO,IAAM,eAAN,MAAmB;AAAA,EAGxB,YACU,IACR,QACA;AAFQ;AAGR,SAAK,SAAS,EAAE,GAAG,gBAAgB,GAAG,OAAO;AAAA,EAC/C;AAAA,EAPQ;AAAA;AAAA;AAAA;AAAA,EAYR,MAAM,QACJ,UACA,QACA,kBACiB;AACjB,UAAM,UAAU,oBAAoB,KAAK,OAAO;AAChD,UAAM,QAAQA,YAAW;AACzB,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAEnC,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA,CAAC,OAAO,UAAU,QAAQ,SAAS,KAAK,GAAG;AAAA,IAC7C;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,QAAgB,IAA0B;AACxD,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAGnC,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,CAAC,KAAK,KAAK;AAAA,IACb;AAEA,WAAO,KAAK,IAAI,SAAO,KAAK,SAAS,GAAG,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,OAA8B;AAC3C,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,EAAC,oBAAI,KAAK,GAAE,YAAY,GAAG,KAAK;AAAA,IAClC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,OAAe,OAA8B;AAC5D,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAGnC,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,KAAK;AAAA,IACR;AAEA,QAAI,KAAK,WAAW;AAAG;AAEvB,UAAM,aAAa,KAAK,CAAC,EAAE;AAC3B,UAAM,YAA0B,cAAc,KAAK,OAAO,aAAa,IACnE,WACA;AAEJ,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,WAAW,OAAO,KAAK,KAAK;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,OAA0C;AACrD,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,KAAK;AAAA,IACR;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAC9B,WAAO,KAAK,SAAS,KAAK,CAAC,CAAC;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,QAAsB,QAAgB,KAA2B;AACrF,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA,CAAC,QAAQ,KAAK;AAAA,IAChB;AAEA,WAAO,KAAK,IAAI,SAAO,KAAK,SAAS,GAAG,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAA6D;AACjE,UAAM,MAAM,oBAAI,KAAK;AACrB,UAAM,iBAAiB,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,OAAO,gBAAgB;AAG5E,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA,CAAC,IAAI,YAAY,GAAG,eAAe,YAAY,CAAC;AAAA,IAClD;AAGA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA,CAAC,IAAI,YAAY,GAAG,KAAK,OAAO,UAAU;AAAA,IAC5C;AAGA,UAAM,gBAAgB,MAAM;AAAA,MAC1B,KAAK;AAAA,MACL;AAAA;AAAA,MAEA,CAAC,IAAI,YAAY,CAAC;AAAA,IACpB;AAEA,WAAO;AAAA,MACL,WAAW;AAAA;AAAA,MACX,SAAS;AAAA;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAA2B;AAC/B,UAAM,YAAY,oBAAI,KAAK;AAC3B,cAAU,QAAQ,UAAU,QAAQ,IAAI,KAAK,OAAO,WAAW;AAE/D,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,UAAU,YAAY,CAAC;AAAA,IAC1B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAqC;AACzC,UAAM,eAAe,MAAM;AAAA,MACzB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,IAGF;AAEA,UAAM,gBAAgB,MAAM;AAAA,MAC1B,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,IAIF;AAEA,UAAM,UAAyB;AAAA,MAC7B,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,aAAa;AAAA,MACb,kBAAkB;AAAA,IACpB;AAEA,eAAW,OAAO,cAAc;AAC9B,cAAQ,IAAI,QAAQ;AAAA,QAClB,KAAK;AACH,kBAAQ,eAAe,OAAO,IAAI,KAAK;AACvC;AAAA,QACF,KAAK;AACH,kBAAQ,kBAAkB,OAAO,IAAI,KAAK;AAC1C;AAAA,QACF,KAAK;AACH,kBAAQ,YAAY,OAAO,IAAI,KAAK;AACpC;AAAA,QACF,KAAK;AACH,kBAAQ,cAAc,OAAO,IAAI,KAAK;AACtC;AAAA,MACJ;AAAA,IACF;AAEA,QAAI,cAAc,SAAS,GAAG;AAC5B,YAAM,aAAa,IAAI,KAAK,cAAc,CAAC,EAAE,UAAU;AACvD,cAAQ,mBAAmB,KAAK,IAAI,IAAI,WAAW,QAAQ;AAAA,IAC7D;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,MAAoB,IAA2B;AAC/D,UAAM,mBAAmB;AAAA,MACvB,EAAE,MAAM,WAAW,IAAI,aAAa;AAAA,MACpC,EAAE,MAAM,cAAc,IAAI,OAAO;AAAA,MACjC,EAAE,MAAM,cAAc,IAAI,SAAS;AAAA,MACnC,EAAE,MAAM,UAAU,IAAI,UAAU;AAAA,IAClC;AAEA,WAAO,iBAAiB,KAAK,OAAK,EAAE,SAAS,QAAQ,EAAE,OAAO,EAAE;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,KAAyC;AACxD,WAAO;AAAA,MACL,OAAO,IAAI;AAAA,MACX,UAAU,IAAI;AAAA,MACd,QAAQ,IAAI;AAAA,MACZ,kBAAkB,IAAI;AAAA,MACtB,QAAQ,IAAI;AAAA,MACZ,YAAY,IAAI;AAAA,MAChB,OAAO,IAAI;AAAA,MACX,WAAW,OAAO,IAAI,UAAU;AAAA,MAChC,WAAW,OAAO,IAAI,UAAU;AAAA,IAClC;AAAA,EACF;AACF;;;ACnSA,IAAMC,kBAA+B;AAAA,EACnC,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,YAAY;AACd;AAEO,IAAM,eAAN,MAAmB;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,UAAU;AAAA,EACV,cAAqC;AAAA,EAE7C,YACE,YACA,aACA,UACA,SAAgC,CAAC,GACjC;AACA,SAAK,aAAa;AAClB,SAAK,cAAc;AACnB,SAAK,WAAW;AAChB,SAAK,SAAS,EAAE,GAAGA,iBAAgB,GAAG,OAAO;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,QAAI,KAAK;AAAS;AAClB,SAAK,UAAU;AACf,SAAK,KAAK;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,OAAa;AACX,SAAK,UAAU;AACf,QAAI,KAAK,aAAa;AACpB,mBAAa,KAAK,WAAW;AAC7B,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAgC;AACpC,UAAM,QAAQ,MAAM,KAAK,WAAW,sBAAsB,KAAK,OAAO,SAAS;AAE/E,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO;AAAA,IACT;AAEA,UAAM,aAAuB,CAAC;AAC9B,UAAM,SAAmB,CAAC;AAE1B,QAAI;AAEF,YAAM,aAAa,MAAM,KAAK,SAAS,WAAW,MAAM,IAAI,OAAK,EAAE,OAAO,CAAC;AAG3E,YAAM,UAA0B,CAAC;AAEjC,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,cAAM,OAAO,MAAM,CAAC;AACpB,cAAM,YAAY,WAAW,CAAC;AAG9B,cAAM,QAAQ,MAAM,KAAK,WAAW,SAAS,KAAK,OAAO;AACzD,YAAI,CAAC,OAAO;AACV,iBAAO,KAAK,KAAK,EAAE;AACnB;AAAA,QACF;AAEA,gBAAQ,KAAK;AAAA,UACX,IAAI,OAAO,KAAK,EAAE;AAAA,UAClB,SAAS,KAAK;AAAA,UACd,WAAW,MAAM;AAAA,UACjB,WAAW,MAAM;AAAA,UACjB,SAAS,KAAK;AAAA,UACd,QAAQ,UAAU;AAAA,UAClB,WAAW,MAAM,UAAU,YAAY;AAAA,UACvC,UAAU,MAAM;AAAA,QAClB,CAAC;AAED,mBAAW,KAAK,KAAK,EAAE;AAAA,MACzB;AAGA,UAAI,QAAQ,SAAS,GAAG;AACtB,cAAM,KAAK,YAAY,YAAY,OAAO;AAAA,MAC5C;AAGA,UAAI,WAAW,SAAS,GAAG;AACzB,cAAM,KAAK,WAAW,oBAAoB,UAAU;AAAA,MACtD;AAGA,UAAI,OAAO,SAAS,GAAG;AACrB,cAAM,KAAK,WAAW,gBAAgB,QAAQ,iBAAiB;AAAA,MACjE;AAEA,aAAO,WAAW;AAAA,IACpB,SAAS,OAAO;AAEd,YAAM,SAAS,MAAM,IAAI,OAAK,EAAE,EAAE;AAClC,YAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,YAAM,KAAK,WAAW,gBAAgB,QAAQ,YAAY;AAC1D,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,OAAsB;AAClC,QAAI,CAAC,KAAK;AAAS;AAEnB,QAAI;AACF,YAAM,KAAK,aAAa;AAAA,IAC1B,SAAS,OAAO;AACd,cAAQ,MAAM,wBAAwB,KAAK;AAAA,IAC7C;AAGA,SAAK,cAAc,WAAW,MAAM,KAAK,KAAK,GAAG,KAAK,OAAO,cAAc;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA8B;AAClC,QAAI,iBAAiB;AACrB,QAAI;AAEJ,OAAG;AACD,kBAAY,MAAM,KAAK,aAAa;AACpC,wBAAkB;AAAA,IACpB,SAAS,YAAY;AAErB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AACF;AAKO,SAAS,mBACd,YACA,aACA,UACA,QACc;AACd,QAAM,SAAS,IAAI,aAAa,YAAY,aAAa,UAAU,MAAM;AACzE,SAAO;AACT;AAiBA,IAAM,oBAAoC;AAAA,EACxC,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,kBAAkB;AACpB;AAeO,IAAM,yBAAN,MAAwD;AAAA,EAC7D,YAAoB,IAAc;AAAd;AAAA,EAAe;AAAA,EAEnC,MAAM,WAAW,UAA0B,QAGjC;AACR,YAAQ,UAAU;AAAA,MAChB,KAAK;AACH,eAAO,KAAK,gBAAgB,MAAM;AAAA,MACpC,KAAK;AACH,eAAO,KAAK,oBAAoB,MAAM;AAAA,MACxC,KAAK;AACH,eAAO,KAAK,gBAAgB,MAAM;AAAA,MACpC;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEA,MAAc,gBAAgB,SAGpB;AACR,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,OAAO;AAAA,IACV;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAE9B,UAAM,MAAM,KAAK,CAAC;AAClB,UAAM,cAAc,OAAO,IAAI,iBAAiB,WAC5C,KAAK,MAAM,IAAI,YAAY,IAC3B,IAAI;AAER,WAAO;AAAA,MACL,SAAS,GAAG,IAAI,KAAK;AAAA,EAAK,KAAK,UAAU,WAAW,CAAC;AAAA,MACrD,UAAU;AAAA,QACR,UAAU;AAAA,QACV,WAAW,IAAI;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,oBAAoB,QAGxB;AACR,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA,MAEA,CAAC,MAAM;AAAA,IACT;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAE9B,UAAM,MAAM,KAAK,CAAC;AAClB,WAAO;AAAA,MACL,SAAS,IAAI,eAAyB,IAAI;AAAA,MAC1C,UAAU;AAAA,QACR,UAAU;AAAA,QACV,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,gBAAgB,SAGpB;AACR,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,OAAO;AAAA,IACV;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAE9B,UAAM,MAAM,KAAK,CAAC;AAClB,WAAO;AAAA,MACL,SAAS,IAAI;AAAA,MACb,UAAU;AAAA,QACR,UAAU;AAAA,QACV,WAAW,IAAI;AAAA,QACf,WAAW,IAAI;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACF;AAKO,IAAM,iBAAN,MAAqB;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,UAAU;AAAA,EACV,cAAqC;AAAA,EAE7C,YACE,IACA,aACA,UACA,SAAkC,CAAC,GACnC,iBACA;AACA,SAAK,SAAS,IAAI,aAAa,IAAI;AAAA,MACjC,kBAAkB,OAAO,oBAAoB,kBAAkB;AAAA,MAC/D,YAAY,OAAO,cAAc,kBAAkB;AAAA,IACrD,CAAC;AACD,SAAK,cAAc;AACnB,SAAK,WAAW;AAChB,SAAK,SAAS,EAAE,GAAG,mBAAmB,GAAG,OAAO;AAChD,SAAK,kBAAkB,mBAAmB,IAAI,uBAAuB,EAAE;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,QAAI,KAAK;AAAS;AAClB,SAAK,UAAU;AACf,SAAK,KAAK;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,OAAa;AACX,SAAK,UAAU;AACf,QAAI,KAAK,aAAa;AACpB,mBAAa,KAAK,WAAW;AAC7B,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAgC;AACpC,UAAM,OAAO,MAAM,KAAK,OAAO,UAAU,KAAK,OAAO,SAAS;AAE9D,QAAI,KAAK,WAAW,GAAG;AACrB,aAAO;AAAA,IACT;AAEA,QAAI,eAAe;AAEnB,eAAW,OAAO,MAAM;AACtB,UAAI;AACF,cAAM,KAAK,WAAW,GAAG;AACzB,cAAM,KAAK,OAAO,SAAS,IAAI,KAAK;AACpC;AAAA,MACF,SAAS,OAAO;AACd,cAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,cAAM,KAAK,OAAO,WAAW,IAAI,OAAO,YAAY;AAAA,MACtD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAW,KAA+B;AAEtD,UAAM,cAAc,MAAM,KAAK,gBAAgB,WAAW,IAAI,UAAU,IAAI,MAAM;AAElF,QAAI,CAAC,aAAa;AAEhB;AAAA,IACF;AAGA,UAAM,YAAY,MAAM,KAAK,SAAS,MAAM,YAAY,OAAO;AAG/D,UAAM,SAAuB;AAAA,MAC3B,IAAI,GAAG,IAAI,QAAQ,IAAI,IAAI,MAAM,IAAI,IAAI,gBAAgB;AAAA,MACzD,SAAS,IAAI,aAAa,UAAU,IAAI,SAAS;AAAA,MACjD,WAAY,YAAY,SAAS,aAAwB;AAAA,MACzD,WAAY,YAAY,SAAS,aAAwB,IAAI;AAAA,MAC7D,SAAS,YAAY;AAAA,MACrB,QAAQ,UAAU;AAAA,MAClB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,UAAU;AAAA,QACR,GAAG,YAAY;AAAA,QACf,kBAAkB,IAAI;AAAA,MACxB;AAAA,IACF;AAGA,UAAM,KAAK,YAAY,YAAY,CAAC,MAAM,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,OAAsB;AAClC,QAAI,CAAC,KAAK;AAAS;AAEnB,QAAI;AACF,YAAM,KAAK,aAAa;AAAA,IAC1B,SAAS,OAAO;AACd,cAAQ,MAAM,2BAA2B,KAAK;AAAA,IAChD;AAGA,SAAK,cAAc,WAAW,MAAM,KAAK,KAAK,GAAG,KAAK,OAAO,cAAc;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA8B;AAClC,QAAI,iBAAiB;AACrB,QAAI;AAEJ,OAAG;AACD,kBAAY,MAAM,KAAK,aAAa;AACpC,wBAAkB;AAAA,IACpB,SAAS,YAAY;AAErB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAA6D;AACjE,WAAO,KAAK,OAAO,UAAU;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa;AACjB,WAAO,KAAK,OAAO,WAAW;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,YAA0B;AACxB,WAAO,KAAK;AAAA,EACd;AACF;AAKO,SAAS,qBACd,IACA,aACA,UACA,QACgB;AAChB,SAAO,IAAI,eAAe,IAAI,aAAa,UAAU,MAAM;AAC7D;;;AC9cA,IAAMC,kBAAgC;AAAA,EACpC,SAAS;AAAA,IACP,oBAAoB;AAAA,IACpB,UAAU;AAAA,IACV,cAAc;AAAA,IACd,cAAc;AAAA,EAChB;AAAA,EACA,kBAAkB;AAAA,EAClB,QAAQ;AAAA,EACR,qBAAqB;AACvB;AAEO,IAAM,UAAN,MAAc;AAAA,EACF;AAAA,EAEjB,YAAY,SAAiC,CAAC,GAAG;AAC/C,SAAK,SAAS;AAAA,MACZ,GAAGA;AAAA,MACH,GAAG;AAAA,MACH,SAAS,EAAE,GAAGA,gBAAe,SAAS,GAAG,OAAO,QAAQ;AAAA,IAC1D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,uBACE,eACA,WAAmB,GACnB,cAAsB,GACtB,WAAoB,MACZ;AACR,UAAM,EAAE,QAAQ,IAAI,KAAK;AAGzB,UAAM,eAAe,KAAK,IAAI,GAAG,IAAI,cAAc,EAAE;AAGrD,UAAM,mBAAmB,WAAW,IAAM;AAE1C,UAAM,gBACJ,QAAQ,qBAAqB,gBAC7B,QAAQ,WAAW,WACnB,QAAQ,eAAe,eACvB,QAAQ,eAAe;AAEzB,WAAO,KAAK,IAAI,GAAK,aAAa;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,mBACE,UACA,aACiB;AACjB,UAAM,EAAE,kBAAkB,QAAQ,oBAAoB,IAAI,KAAK;AAG/D,UAAM,MAAM,gBAAgB,OAAO,WAAW,cAAc;AAG5D,QAAI,YAAY,oBAAoB,OAAO,QAAQ;AACjD,aAAO;AAAA,IACT;AAGA,QAAI,YAAY,qBAAqB;AACnC,aAAO;AAAA,IACT;AAGA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,mBACE,SACA,aACa;AACb,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,MACd;AAAA,IACF;AAGA,UAAM,gBAAgB,QAAQ,IAAI,YAAU;AAC1C,YAAM,UAAU,YAAY,OAAO,OAAO;AAC1C,YAAM,gBAAgB,KAAK;AAAA,QACzB,OAAO;AAAA,QACP;AAAA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,MACF;AAEA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAGD,kBAAc,KAAK,CAAC,GAAG,MAAM,EAAE,gBAAgB,EAAE,aAAa;AAE9D,UAAM,YAAY,cAAc,CAAC;AACjC,UAAM,cAAc,cAAc,SAAS,IAAI,cAAc,CAAC,EAAE,gBAAgB;AAGhF,UAAM,aAAa,KAAK,mBAAmB,UAAU,eAAe,WAAW;AAG/E,UAAM,QAAqB;AAAA,MACzB,OAAO;AAAA,QACL,IAAI,UAAU,OAAO;AAAA,QACrB,WAAW,UAAU,OAAO;AAAA,QAC5B,WAAW,UAAU,OAAO;AAAA,QAC5B,WAAW,IAAI,KAAK,UAAU,OAAO,SAAS;AAAA,QAC9C,SAAS,UAAU,OAAO;AAAA,QAC1B,cAAc;AAAA;AAAA,QACd,WAAW;AAAA;AAAA,MACb;AAAA,MACA,OAAO,UAAU;AAAA,IACnB;AAEA,UAAM,MAAM,gBAAgB,OAAO,UAAU,gBAAgB,cAAc;AAG3E,UAAM,eAAe,eAAe,cAChC,cAAc,MAAM,GAAG,CAAC,EAAE,IAAI,SAAO;AAAA,MACnC,OAAO;AAAA,QACL,IAAI,GAAG,OAAO;AAAA,QACd,WAAW,GAAG,OAAO;AAAA,QACrB,WAAW,GAAG,OAAO;AAAA,QACrB,WAAW,IAAI,KAAK,GAAG,OAAO,SAAS;AAAA,QACvC,SAAS,GAAG,OAAO;AAAA,QACnB,cAAc;AAAA,QACd,WAAW;AAAA,MACb;AAAA,MACA,OAAO,GAAG;AAAA,IACZ,EAAE,IACF;AAEJ,WAAO;AAAA,MACL,OAAO,eAAe,SAAS,QAAQ;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,iBAAiB,WAAyB;AAC/C,UAAM,MAAM,oBAAI,KAAK;AACrB,UAAM,SAAS,IAAI,QAAQ,IAAI,UAAU,QAAQ;AACjD,WAAO,UAAU,MAAO,KAAK,KAAK;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAqC;AACnC,WAAO,EAAE,GAAG,KAAK,OAAO;AAAA,EAC1B;AACF;AAKA,IAAI,iBAAiC;AAE9B,SAAS,oBAA6B;AAC3C,MAAI,CAAC,gBAAgB;AACnB,qBAAiB,IAAI,QAAQ;AAAA,EAC/B;AACA,SAAO;AACT;;;AC3MA,SAAS,cAAAC,mBAAkB;AA+B3B,IAAM,kBAAoC;AAAA,EACxC,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,kBAAkB;AACpB;AAEA,IAAM,qBAAyC;AAAA,EAC7C,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,gBAAgB;AAAA,EAChB,iBAAiB;AACnB;AAWO,IAAM,kBAAN,MAAsB;AAAA,EACV;AAAA,EAEjB,YAAY,UAAqC,CAAC,GAAG;AACnD,SAAK,UAAU,EAAE,GAAG,iBAAiB,GAAG,QAAQ;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAkB,eAAwC;AAC9D,UAAM,QAAwB,CAAC;AAC/B,UAAM,gBAA0B,CAAC;AACjC,UAAM,mBAAmB,KAAK,UAAU,aAAa;AAErD,eAAW,SAAS,QAAQ;AAC1B,YAAM,kBAAkB,KAAK,UAAU,KAAK;AAG5C,UAAI,gBAAgB,SAAS,KAAK,QAAQ,gBAAgB;AACxD;AAAA,MACF;AAGA,YAAM,YAAY,KAAK,eAAe,iBAAiB,kBAAkB,aAAa;AACtF,UAAI,WAAW;AACb,cAAM,KAAK,SAAS;AACpB;AAAA,MACF;AAGA,YAAM,YAAY,KAAK,eAAe,iBAAiB,kBAAkB,aAAa;AACtF,UAAI,aAAa,UAAU,cAAc,KAAK,QAAQ,gBAAgB;AACpE,cAAM,KAAK,SAAS;AACpB;AAAA,MACF;AAGA,oBAAc,KAAK,KAAK;AAAA,IAC1B;AAGA,UAAM,cAAc,OAAO;AAC3B,UAAM,gBAAgB,MAAM;AAC5B,UAAM,aAAa,cAAc,IAAI,gBAAgB,cAAc;AAGnE,UAAM,YAAY,cAAc,UAAU,KAAK,QAAQ;AAEvD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eACN,iBACA,kBACA,gBACqB;AACrB,UAAM,QAAQ,iBAAiB,QAAQ,eAAe;AAEtD,QAAI,UAAU,IAAI;AAChB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,OAAO;AAAA,MACP,KAAK,QAAQ,gBAAgB;AAAA,MAC7B,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,eAAe,eAAe,MAAM,OAAO,QAAQ,gBAAgB,MAAM;AAAA,MACzE,aAAa;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eACN,iBACA,kBACA,gBACqB;AACrB,UAAM,aAAa,gBAAgB;AACnC,QAAI,YAA0D;AAG9D,aAAS,IAAI,GAAG,KAAK,iBAAiB,SAAS,YAAY,KAAK;AAC9D,YAAM,SAAS,iBAAiB,MAAM,GAAG,IAAI,UAAU;AACvD,YAAM,aAAa,KAAK,oBAAoB,iBAAiB,MAAM;AAEnE,UAAI,CAAC,aAAa,aAAa,UAAU,YAAY;AACnD,oBAAY,EAAE,OAAO,GAAG,WAAW;AAAA,MACrC;AAAA,IACF;AAEA,QAAI,CAAC,aAAa,UAAU,aAAa,KAAK,QAAQ,gBAAgB;AACpE,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,OAAO,UAAU;AAAA,MACjB,KAAK,UAAU,QAAQ;AAAA,MACvB,YAAY,UAAU;AAAA,MACtB,WAAW;AAAA,MACX,eAAe,eAAe,MAAM,UAAU,OAAO,UAAU,QAAQ,UAAU;AAAA,MACjF,aAAa;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,GAAW,GAAmB;AACxD,UAAM,OAAO,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC;AACrC,UAAM,OAAO,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC;AAErC,UAAM,eAAe,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,OAAK,KAAK,IAAI,CAAC,CAAC,CAAC;AAC/D,UAAM,QAAQ,oBAAI,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;AAExC,WAAO,aAAa,OAAO,MAAM;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,MAAwB;AACvC,WAAO,KAAK,YAAY,EAAE,MAAM,KAAK,EAAE,OAAO,OAAK,EAAE,SAAS,CAAC;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,MAAsB;AACtC,WAAO,KACJ,UAAU,MAAM,EAChB,YAAY,EACZ,QAAQ,qBAAqB,EAAE,EAC/B,QAAQ,QAAQ,GAAG,EACnB,KAAK;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,MAAwB;AAEpC,UAAM,YAAY,KAAK,MAAM,QAAQ,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAK,EAAE,SAAS,CAAC;AAGlF,WAAO,UAAU,OAAO,OAAK;AAC3B,aAAO,EAAE,UAAU,KAAK,QAAQ,kBAAkB,CAAC,EAAE,SAAS,GAAG;AAAA,IACnE,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,UAAkB,SAAoC;AACpE,UAAM,SAAS,KAAK,cAAc,QAAQ;AAC1C,UAAM,kBAAkB,QAAQ,KAAK,GAAG;AAExC,WAAO,KAAK,MAAM,QAAQ,eAAe;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAMQ,YAAgC;AAAA;AAAA;AAAA;AAAA,EAKxC,YAAY,SAA4C;AACtD,SAAK,YAAY,EAAE,GAAG,oBAAoB,GAAG,QAAQ;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QACE,iBACA,UACe;AACf,UAAM,UAAiC,CAAC;AACxC,QAAI,eAAe;AACnB,QAAI,kBAAkB;AAEtB,eAAW,MAAM,UAAU;AACzB,YAAM,SAAS,KAAK,oBAAoB,iBAAiB,EAAE;AAC3D,cAAQ,KAAK,MAAM;AAEnB,UAAI,OAAO,SAAS;AAClB;AACA,2BAAmB,OAAO,SAAS;AAAA,MACrC;AAAA,IACF;AAEA,UAAM,cAAc,SAAS,SAAS;AACtC,UAAM,aAAa,KAAK,MAAM,SAAS,SAAS,KAAK,UAAU,eAAe;AAC9E,UAAM,kBAAkB,eAAe;AACvC,UAAM,oBAAoB,SAAS,SAAS,IACxC,kBAAkB,SAAS,SAC3B;AAEJ,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBACN,iBACA,UACqB;AACrB,UAAM,EAAE,cAAc,MAAM,IAAI;AAGhC,QAAI,eAAe,KAAK,gBAAgB,gBAAgB,QAAQ;AAC9D,aAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,UACR;AAAA,UACA;AAAA,UACA,eAAe;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,SAAS,MAAM,KAAK,EAAE,WAAW,GAAG;AACvC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,UACR;AAAA,UACA;AAAA,UACA,eAAe;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,gBAAgB,gBAAgB,YAAY;AAGlD,UAAM,cAAc,KAAK,gBAAgB,OAAO,eAAe,YAAY;AAC3E,QAAI,aAAa;AACf,aAAO;AAAA,IACT;AAGA,UAAM,mBAAmB,KAAK,qBAAqB,OAAO,eAAe,YAAY;AACrF,QAAI,kBAAkB;AACpB,aAAO;AAAA,IACT;AAGA,UAAM,cAAc,KAAK,gBAAgB,OAAO,eAAe,YAAY;AAC3E,QAAI,aAAa;AACf,aAAO;AAAA,IACT;AAGA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA,eAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBACN,OACA,QACA,cAC4B;AAC5B,UAAM,QAAQ,OAAO,QAAQ,KAAK;AAElC,QAAI,UAAU,IAAI;AAChB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX,SAAS,QAAQ,MAAM;AAAA,QACvB,WAAW,KAAK,UAAU,KAAK;AAAA,QAC/B,YAAY;AAAA,QACZ,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBACN,OACA,QACA,cAC4B;AAC5B,UAAM,kBAAkB,KAAK,oBAAoB,KAAK;AACtD,UAAM,mBAAmB,KAAK,oBAAoB,MAAM;AAExD,UAAM,kBAAkB,iBAAiB,QAAQ,eAAe;AAChE,QAAI,oBAAoB,IAAI;AAC1B,aAAO;AAAA,IACT;AAGA,UAAM,eAAe,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA,kBAAkB,gBAAgB;AAAA,IACpC;AAEA,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA,WAAW,aAAa;AAAA,QACxB,SAAS,aAAa;AAAA,QACtB,WAAW,KAAK,UAAU,KAAK;AAAA,QAC/B,YAAY;AAAA,QACZ,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBACN,OACA,QACA,cAC4B;AAC5B,UAAM,kBAAkB,KAAK,UAAU,KAAK;AAC5C,UAAM,mBAAmB,KAAK,UAAU,MAAM;AAE9C,QAAI,gBAAgB,SAAS,KAAK,UAAU,gBAAgB;AAC1D,aAAO;AAAA,IACT;AAGA,UAAM,cAAc;AAAA,MAClB,gBAAgB;AAAA,MAChB,KAAK,MAAM,gBAAgB,SAAS,GAAG;AAAA,MACvC,KAAK,MAAM,gBAAgB,SAAS,GAAG;AAAA,IACzC;AAEA,QAAI,YAIO;AAEX,eAAW,cAAc,aAAa;AACpC,eAAS,IAAI,GAAG,KAAK,iBAAiB,SAAS,YAAY,KAAK;AAC9D,cAAM,SAAS,iBAAiB,MAAM,GAAG,IAAI,UAAU;AACvD,cAAM,aAAa,KAAK,+BAA+B,iBAAiB,MAAM;AAE9E,YAAI,cAAc,KAAK,UAAU,gBAAgB;AAC/C,cAAI,CAAC,aAAa,aAAa,UAAU,YAAY;AACnD,wBAAY,EAAE,OAAO,GAAG,YAAY,WAAW;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,IACT;AAGA,UAAM,eAAe,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,UAAU,QAAQ,UAAU;AAAA,IAC9B;AAEA,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,QACR;AAAA,QACA;AAAA,QACA,WAAW,aAAa;AAAA,QACxB,SAAS,aAAa;AAAA,QACtB,WAAW,KAAK,UAAU,KAAK;AAAA,QAC/B,YAAY,UAAU;AAAA,QACtB,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,MAAsB;AAChD,WAAO,KACJ,QAAQ,WAAW,GAAG,EACtB,QAAQ,QAAQ,GAAG,EACnB,QAAQ,OAAO,GAAG,EAClB,KAAK;AAAA,EACV;AAAA;AAAA;AAAA;AAAA,EAKQ,uBACN,UACA,YACA,iBACA,eACuC;AAEvC,UAAM,uBAA4C,oBAAI,IAAI;AAC1D,QAAI,gBAAgB;AAEpB,aAAS,UAAU,GAAG,UAAU,SAAS,QAAQ,WAAW;AAC1D,YAAM,OAAO,SAAS,OAAO;AAG7B,UAAI,KAAK,KAAK,IAAI,GAAG;AAEnB,YAAI,gBAAgB,WAAW,UAAU,KAAK,KAAK,WAAW,aAAa,CAAC,GAAG;AAC7E,+BAAqB,IAAI,eAAe,OAAO;AAC/C;AAGA,iBAAO,UAAU,IAAI,SAAS,UAAU,KAAK,KAAK,SAAS,UAAU,CAAC,CAAC,GAAG;AACxE;AAAA,UACF;AAAA,QACF;AAAA,MACF,OAAO;AACL,6BAAqB,IAAI,eAAe,OAAO;AAC/C;AAAA,MACF;AAAA,IACF;AAEA,UAAM,YAAY,qBAAqB,IAAI,eAAe;AAC1D,QAAI,UAAU,qBAAqB,IAAI,gBAAgB,CAAC;AAExD,QAAI,cAAc,QAAW;AAC3B,aAAO;AAAA,IACT;AAEA,QAAI,YAAY,QAAW;AAEzB,gBAAU,SAAS,SAAS;AAAA,IAC9B;AAEA,WAAO;AAAA,MACL,OAAO;AAAA,MACP,KAAK,UAAU;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,+BAA+B,GAAW,GAAmB;AACnE,UAAM,IAAI,EAAE;AACZ,UAAM,IAAI,EAAE;AAEZ,QAAI,MAAM;AAAG,aAAO,MAAM,IAAI,IAAI;AAClC,QAAI,MAAM;AAAG,aAAO;AAEpB,UAAM,KAAiB,MAAM,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE,IAAI,MAAM,MAAM,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AAE7E,aAAS,IAAI,GAAG,KAAK,GAAG;AAAK,SAAG,CAAC,EAAE,CAAC,IAAI;AACxC,aAAS,IAAI,GAAG,KAAK,GAAG;AAAK,SAAG,CAAC,EAAE,CAAC,IAAI;AAExC,aAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,eAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,cAAM,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI;AACzC,WAAG,CAAC,EAAE,CAAC,IAAI,KAAK;AAAA,UACd,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI;AAAA;AAAA,UACf,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI;AAAA;AAAA,UACf,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI;AAAA;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,GAAG,CAAC,EAAE,CAAC;AACxB,UAAM,SAAS,KAAK,IAAI,GAAG,CAAC;AAC5B,WAAO,IAAI,WAAW;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,OAAuB;AACvC,WAAOA,YAAW,QAAQ,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,UAA0C;AAC1D,UAAM,QAAwB,CAAC;AAC/B,UAAM,gBAA0B,CAAC;AAEjC,eAAW,UAAU,SAAS,SAAS;AACrC,UAAI,OAAO,SAAS;AAClB,cAAM,KAAK,OAAO;AAClB,cAAM,KAAK;AAAA,UACT,OAAO,GAAG;AAAA,UACV,KAAK,GAAG;AAAA,UACR,YAAY,GAAG;AAAA,UACf,WAAW,GAAG,gBAAgB,UAAU,UAAU;AAAA,UAClD,eAAe,GAAG;AAAA,UAClB,aAAa,GAAG;AAAA,QAClB,CAAC;AAAA,MACH,OAAO;AACL,cAAM,KAAK,OAAO;AAClB,sBAAc,KAAK,GAAG,KAAK;AAAA,MAC7B;AAAA,IACF;AAEA,WAAO;AAAA,MACL,WAAW,SAAS;AAAA,MACpB,YAAY,SAAS;AAAA,MACrB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAKA,IAAI,iBAAyC;AAEtC,SAAS,oBAAqC;AACnD,MAAI,CAAC,gBAAgB;AACnB,qBAAiB,IAAI,gBAAgB;AAAA,EACvC;AACA,SAAO;AACT;;;AC/kBA,IAAMC,mBAAoC;AAAA,EACxC,MAAM;AAAA,EACN,UAAU;AAAA,EACV,WAAW;AAAA,EACX,uBAAuB;AACzB;AAOO,IAAM,YAAN,MAAgB;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EACA;AAAA,EAER,YACE,YACA,aACA,UACA,SACA,eACA;AACA,SAAK,aAAa;AAClB,SAAK,cAAc;AACnB,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,cAAc,eAAe;AAClC,SAAK,oBAAoB,eAAe;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,aAA0B,mBAA4C;AACpF,SAAK,cAAc;AACnB,SAAK,oBAAoB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SACJ,OACA,UAAqC,CAAC,GACZ;AAC1B,UAAM,OAAO,EAAE,GAAGA,kBAAiB,GAAG,QAAQ;AAG9C,UAAM,iBAAiB,MAAM,KAAK,SAAS,MAAM,KAAK;AAGtD,UAAM,gBAAgB,MAAM,KAAK,YAAY,OAAO,eAAe,QAAQ;AAAA,MACzE,OAAO,KAAK,OAAO;AAAA;AAAA,MACnB,UAAU,KAAK;AAAA,MACf,WAAW,KAAK;AAAA,IAClB,CAAC;AAGD,UAAM,cAAc,KAAK,QAAQ;AAAA,MAC/B;AAAA,MACA,CAAC,YAAY,KAAK,gBAAgB,OAAO;AAAA,IAC3C;AAGA,UAAM,WAAW,MAAM,KAAK,cAAc,cAAc,MAAM,GAAG,KAAK,IAAI,GAAG,IAAI;AAGjF,UAAM,UAAU,KAAK,aAAa,UAAU,KAAK,SAAS;AAE1D,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,aAAa,KAAK,eAAe,OAAO;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACJ,OACA,UAA4C,CAAC,GACZ;AAEjC,UAAM,gBAAgB,MAAM,KAAK,SAAS,OAAO,OAAO;AAGxD,QAAI,CAAC,QAAQ,iBAAiB,CAAC,KAAK,eAAe,CAAC,KAAK,mBAAmB;AAC1E,aAAO;AAAA,IACT;AAEA,QAAI;AAEF,YAAM,iBAAiB,MAAM,KAAK,SAAS,MAAM,KAAK;AAGtD,YAAM,sBAAsB,MAAM,KAAK,kBAAkB;AAAA,QACvD,eAAe;AAAA,QACf;AAAA,UACE,OAAO,QAAQ,QAAQ;AAAA,UACvB,UAAU,QAAQ,YAAY;AAAA,UAC9B,oBAAoB,QAAQ;AAAA,QAC9B;AAAA,MACF;AAGA,YAAM,iBAA+C,CAAC;AACtD,iBAAW,UAAU,qBAAqB;AACxC,cAAM,QAAQ,MAAM,KAAK,YAAY,IAAI,OAAO,OAAO;AACvD,YAAI,OAAO;AAET,cAAI,CAAC,QAAQ,eAAe,MAAM,sBAAsB,QAAQ,aAAa;AAC3E,2BAAe,KAAK,KAAK;AAEzB,kBAAM,KAAK,YAAY,YAAY,MAAM,OAAO;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAGA,YAAM,iBAAiB,KAAK,oBAAoB,eAAe,cAAc;AAE7E,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS;AAAA,QACT,aAAa,KAAK,eAAe,cAAc;AAAA,QAC/C;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AAEd,cAAQ,MAAM,yBAAyB,KAAK;AAC5C,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBACN,eACA,gBACQ;AACR,QAAI,UAAU,cAAc;AAE5B,QAAI,eAAe,SAAS,GAAG;AAC7B,iBAAW;AACX,iBAAW,UAAU,eAAe,MAAM,GAAG,CAAC,GAAG;AAC/C,mBAAW,OAAO,OAAO,KAAK;AAAA;AAC9B,YAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,qBAAW,iBAAiB,OAAO,SAAS,KAAK,IAAI,CAAC;AAAA;AAAA,QACxD;AACA,mBAAW,mBAAmB,OAAO,SAAS;AAAA;AAC9C,mBAAW,iBAAiB,OAAO,QAAQ;AAAA;AAC3C,YAAI,OAAO,gBAAgB,OAAO,aAAa,SAAS,GAAG;AACzD,qBAAW,qBAAqB,OAAO,aAAa,KAAK,IAAI,CAAC;AAAA;AAAA,QAChE;AACA,mBAAW,iBAAiB,OAAO,aAAa,KAAK,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA,MACjE;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,WAA2C;AACnE,WAAO,KAAK,WAAW,iBAAiB,SAAS;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,QAAgB,KAA6B;AAChE,WAAO,KAAK,WAAW,gBAAgB,KAAK;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cACZ,SACA,SAC8B;AAC9B,UAAM,WAAgC,CAAC;AAEvC,eAAW,UAAU,SAAS;AAC5B,YAAM,QAAQ,MAAM,KAAK,WAAW,SAAS,OAAO,OAAO;AAC3D,UAAI,CAAC;AAAO;AAEZ,UAAI;AACJ,UAAI,QAAQ,uBAAuB;AACjC,yBAAiB,MAAM,KAAK,kBAAkB,MAAM,WAAW,MAAM,EAAE;AAAA,MACzE;AAEA,eAAS,KAAK;AAAA,QACZ;AAAA,QACA,OAAO,OAAO;AAAA,QACd;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBACZ,WACA,SAC6B;AAC7B,UAAM,gBAAgB,MAAM,KAAK,WAAW,iBAAiB,SAAS;AAGtE,UAAM,aAAa,cAAc,UAAU,OAAK,EAAE,OAAO,OAAO;AAChE,QAAI,eAAe;AAAI,aAAO;AAG9B,UAAM,QAAQ,KAAK,IAAI,GAAG,aAAa,CAAC;AACxC,UAAM,MAAM,KAAK,IAAI,cAAc,QAAQ,aAAa,CAAC;AACzD,UAAM,gBAAgB,cAAc,MAAM,OAAO,GAAG;AAEpD,QAAI,cAAc,UAAU;AAAG,aAAO;AAEtC,WAAO,cACJ,OAAO,OAAK,EAAE,OAAO,OAAO,EAC5B,IAAI,OAAK,IAAI,EAAE,SAAS,MAAM,EAAE,QAAQ,MAAM,GAAG,GAAG,CAAC,KAAK,EAC1D,KAAK,IAAI;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,UAA+B,WAA2B;AAC7E,UAAM,QAAkB,CAAC;AACzB,QAAI,gBAAgB;AAEpB,eAAW,UAAU,UAAU;AAC7B,YAAM,aAAa,KAAK,aAAa,MAAM;AAC3C,YAAM,eAAe,KAAK,eAAe,UAAU;AAEnD,UAAI,gBAAgB,eAAe,WAAW;AAC5C;AAAA,MACF;AAEA,YAAM,KAAK,UAAU;AACrB,uBAAiB;AAAA,IACnB;AAEA,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA;AAAA,EAA2B,MAAM,KAAK,aAAa,CAAC;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,QAAmC;AACtD,UAAM,EAAE,OAAO,OAAO,eAAe,IAAI;AACzC,UAAM,OAAO,MAAM,UAAU,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAEvD,QAAI,OAAO,KAAK,MAAM,SAAS,OAAO,IAAI,YAAY,MAAM,QAAQ,CAAC,CAAC;AAAA,EAAM,MAAM,OAAO;AAEzF,QAAI,gBAAgB;AAClB,cAAQ;AAAA;AAAA,aAAkB,cAAc;AAAA,IAC1C;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,MAAsB;AAE3C,WAAO,KAAK,KAAK,KAAK,SAAS,CAAC;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,SAAyB;AAG/C,WAAO;AAAA,EACT;AACF;AAKO,SAAS,gBACd,YACA,aACA,UACA,SACW;AACX,SAAO,IAAI,UAAU,YAAY,aAAa,UAAU,OAAO;AACjE;;;AC7TA,IAAM,mBAAkC;AAAA,EACtC,QAAQ;AAAA,IACN,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,YAAY;AAAA,EACd;AAAA,EACA,QAAQ;AAAA,IACN,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,YAAY;AAAA,EACd;AAAA,EACA,QAAQ;AAAA,IACN,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,YAAY;AAAA,EACd;AAAA,EACA,QAAQ;AAAA,IACN,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,YAAY;AAAA,EACd;AACF;AAUO,IAAM,qBAAN,MAAyB;AAAA,EACb;AAAA,EACA;AAAA,EACA,UAAqC,oBAAI,IAAI;AAAA,EAE9D,YACE,YACA,WAAmC,CAAC,GACpC;AACA,SAAK,aAAa;AAClB,SAAK,WAAW;AAAA,MACd,QAAQ,EAAE,GAAG,iBAAiB,QAAQ,GAAG,SAAS,OAAO;AAAA,MACzD,QAAQ,EAAE,GAAG,iBAAiB,QAAQ,GAAG,SAAS,OAAO;AAAA,MACzD,QAAQ,EAAE,GAAG,iBAAiB,QAAQ,GAAG,SAAS,OAAO;AAAA,MACzD,QAAQ,EAAE,GAAG,iBAAiB,QAAQ,GAAG,SAAS,OAAO;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,SAAiB,eAAuB,aAAqB,GAAW;AACnF,UAAM,WAAW,KAAK,QAAQ,IAAI,OAAO;AAEzC,QAAI,UAAU;AACZ,eAAS;AACT,eAAS,eAAe,oBAAI,KAAK;AACjC,eAAS,aAAa,KAAK,IAAI,SAAS,YAAY,UAAU;AAAA,IAGhE,OAAO;AACL,WAAK,QAAQ,IAAI,SAAS;AAAA,QACxB;AAAA,QACA,aAAa;AAAA,QACb,cAAc,oBAAI,KAAK;AAAA,QACvB,kBAAkB;AAAA,QAClB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,SAAiB,cAAsD;AAC9F,UAAM,UAAU,KAAK,QAAQ,IAAI,OAAO;AAExC,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,QACL;AAAA,QACA,WAAW;AAAA,QACX,SAAS;AAAA,QACT,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,aAAa,YAAY;AAChD,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,QACL;AAAA,QACA,WAAW;AAAA,QACX,SAAS;AAAA,QACT,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,YAAY,cAAc,SAAS;AACzD,UAAM,aAAa,KAAK,cAAc,SAAS,QAAQ;AAEvD,QAAI,WAAW,QAAQ;AAErB,YAAM,KAAK,WAAW,kBAAkB,SAAS,SAAS;AAE1D,aAAO;AAAA,QACL;AAAA,QACA,WAAW;AAAA,QACX,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,WAAW;AAAA,MACX,SAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,OAAiD;AACnE,UAAM,UAA8B,CAAC;AAErC,eAAW,CAAC,SAAS,OAAO,KAAK,KAAK,SAAS;AAC7C,YAAM,SAAS,MAAM,KAAK,mBAAmB,SAAS,KAAK;AAC3D,cAAQ,KAAK,MAAM;AAAA,IACrB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,QAAkC;AAChD,UAAM,WAAsB,CAAC;AAG7B,UAAM,WAAW,KAAK,eAAe,MAAM;AAC3C,eAAW,WAAW,UAAU;AAC9B,eAAS,KAAK;AAAA,QACZ,IAAI,OAAO,WAAW;AAAA,QACtB,aAAa;AAAA,QACb,SAAS,QAAQ;AAAA,QACjB,cAAc,QAAQ;AAAA,QACtB,YAAY,QAAQ;AAAA,QACpB,cAAc,QAAQ;AAAA,QACtB,WAAW,oBAAI,KAAK;AAAA,QACpB,aAAa,oBAAI,KAAK;AAAA,MACxB,CAAC;AAAA,IACH;AAGA,UAAM,cAAc,KAAK,kBAAkB,MAAM;AACjD,eAAW,QAAQ,aAAa;AAC9B,eAAS,KAAK;AAAA,QACZ,IAAI,OAAO,WAAW;AAAA,QACtB,aAAa;AAAA,QACb,SAAS,KAAK;AAAA,QACd,cAAc,KAAK;AAAA,QACnB,YAAY,KAAK;AAAA,QACjB,cAAc,KAAK;AAAA,QACnB,WAAW,oBAAI,KAAK;AAAA,QACpB,aAAa,oBAAI,KAAK;AAAA,MACxB,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,SAA0C;AAC7D,UAAM,SAAwB,CAAC,MAAM,MAAM,MAAM,MAAM,IAAI;AAC3D,UAAM,eAAe,OAAO,QAAQ,OAAO;AAE3C,QAAI,iBAAiB,MAAM,gBAAgB,OAAO,SAAS,GAAG;AAC5D,aAAO;AAAA,IACT;AAEA,WAAO,OAAO,eAAe,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,MAAmB,IAAqC;AAC1E,UAAM,MAAM,GAAG,IAAI,KAAK,EAAE;AAC1B,WAAO,KAAK,SAAS,GAAG,KAAK,iBAAiB;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKQ,cACN,SACA,UACsC;AACtC,QAAI,QAAQ,cAAc,SAAS,gBAAgB;AACjD,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,gBAAgB,QAAQ,WAAW,MAAM,SAAS,cAAc;AAAA,MAC1E;AAAA,IACF;AAEA,QAAI,QAAQ,aAAa,SAAS,eAAe;AAC/C,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,cAAc,QAAQ,UAAU,MAAM,SAAS,aAAa;AAAA,MACtE;AAAA,IACF;AAEA,QAAI,QAAQ,mBAAmB,SAAS,qBAAqB;AAC3D,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,sBAAsB,QAAQ,gBAAgB,MAAM,SAAS,mBAAmB;AAAA,MAC1F;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,IAAI,IAAI,QAAQ,aAAa,QAAQ,MAAM,MAAO,KAAK,KAAK;AAClF,QAAI,UAAU,SAAS,YAAY;AACjC,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,kBAAkB,QAAQ,QAAQ,CAAC,CAAC,WAAW,SAAS,UAAU;AAAA,MAC5E;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ,KAAK;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,QAKpB;AAED,UAAM,YAAY,oBAAI,IAA2B;AAEjD,eAAW,SAAS,QAAQ;AAC1B,YAAM,WAAW,UAAU,IAAI,MAAM,YAAY,KAAK,CAAC;AACvD,eAAS,KAAK,KAAK;AACnB,gBAAU,IAAI,MAAM,cAAc,QAAQ;AAAA,IAC5C;AAEA,UAAM,WAKD,CAAC;AAEN,eAAW,CAAC,KAAK,WAAW,KAAK,WAAW;AAC1C,UAAI,YAAY,UAAU,GAAG;AAC3B,iBAAS,KAAK;AAAA,UACZ;AAAA,UACA,aAAa,mBAAmB,IAAI,MAAM,GAAG,EAAE,CAAC;AAAA,UAChD,YAAY,KAAK,IAAI,GAAK,YAAY,SAAS,CAAC;AAAA,UAChD,UAAU,YAAY,IAAI,OAAK,EAAE,EAAE;AAAA,QACrC,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,QAKvB;AAED,UAAM,qBAAqB,CAAC,UAAU,QAAQ,QAAQ,UAAU,SAAS,UAAU;AACnF,UAAM,cAKD,CAAC;AAEN,eAAW,SAAS,QAAQ;AAC1B,UAAI,MAAM,cAAc;AAAe;AAEvC,YAAM,eAAe,MAAM,QAAQ,YAAY;AAC/C,iBAAW,WAAW,oBAAoB;AACxC,YAAI,aAAa,SAAS,OAAO,GAAG;AAClC,sBAAY,KAAK;AAAA,YACf,KAAK,cAAc,OAAO,IAAI,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC;AAAA,YAClD,aAAa,oBAAoB,MAAM,QAAQ,MAAM,GAAG,GAAG,CAAC;AAAA,YAC5D,YAAY;AAAA,YACZ,UAAU,CAAC,MAAM,EAAE;AAAA,UACrB,CAAC;AACD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAwD;AAC5D,WAAO,KAAK,WAAW,cAAc;AAAA,EACvC;AACF;AAKO,SAAS,yBAAyB,YAA4C;AACnF,SAAO,IAAI,mBAAmB,UAAU;AAC1C;;;ACnVA,IAAMC,kBAAoC;AAAA,EACxC,kBAAkB,iBAAiB;AAAA,EACnC,QAAQ,iBAAiB;AAAA,EACzB,qBAAqB,iBAAiB;AAAA,EACtC,eAAe;AACjB;AAEO,IAAM,cAAN,MAAkB;AAAA,EAGvB,YACU,IACR,QACA;AAFQ;AAGR,SAAK,SAAS,EAAE,GAAGA,iBAAgB,GAAG,OAAO;AAAA,EAC/C;AAAA,EAPiB;AAAA;AAAA;AAAA;AAAA,EAYjB,MAAM,UAAU,OAAe,SAA0C;AACvE,UAAM,eAAe,uBAAuB,QAAQ,OAAO,EAAE,QAAQ,CAAC;AAEtE,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,YAAY;AAAA,IACf;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAC9B,WAAO,KAAK,YAAY,KAAK,CAAC,CAAC;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,OAAe,SAA0C;AACzE,UAAM,eAAe,uBAAuB,QAAQ,OAAO,EAAE,QAAQ,CAAC;AAEtE,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA,CAAC,YAAY;AAAA,IACf;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAC9B,WAAO,KAAK,YAAY,KAAK,CAAC,CAAC;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,OAAe,SAAqE;AACrG,UAAM,gBAAgB,IAAI,MAAM,YAAY,CAAC;AAE7C,QAAI,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaV,UAAM,kBAAkB,MAAM,YAAY,EAAE,KAAK;AACjD,UAAM,SAAoB,CAAC,iBAAiB,IAAI,eAAe,KAAK,eAAe,aAAa;AAEhG,QAAI,SAAS;AACX,aAAO;AACP,aAAO,KAAK,OAAO;AAAA,IACrB;AAEA,WAAO;AACP,WAAO,KAAK,KAAK,OAAO,aAAa;AAErC,UAAM,OAAO,MAAM,MAA+B,KAAK,IAAI,KAAK,MAAM;AAEtE,WAAO,KAAK,IAAI,UAAQ;AAAA,MACtB,QAAQ,KAAK,YAAY,GAAG;AAAA,MAC5B,OAAO,IAAI;AAAA,IACb,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAM,OAAe,SAA4C;AAErE,UAAM,aAAa,MAAM,KAAK,UAAU,OAAO,OAAO;AACtD,QAAI,YAAY;AACd,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,OAAO;AAAA,MACT;AAAA,IACF;AAGA,UAAM,aAAa,MAAM,KAAK,YAAY,OAAO,OAAO;AACxD,QAAI,YAAY;AACd,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,OAAO;AAAA,MACT;AAAA,IACF;AAGA,UAAM,gBAAgB,MAAM,KAAK,aAAa,OAAO,OAAO;AAC5D,QAAI,cAAc,WAAW,GAAG;AAC9B,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,OAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,YAAY,cAAc,CAAC;AACjC,UAAM,cAAc,cAAc,SAAS,IAAI,cAAc,CAAC,EAAE,QAAQ;AAGxE,UAAM,MAAM,gBAAgB,OAAO,UAAU,QAAQ,cAAc;AAGnE,UAAM,aAAa,KAAK,mBAAmB,UAAU,OAAO,GAAG;AAG/D,QAAI,eAAe,QAAQ;AACzB,aAAO;AAAA,QACL,OAAO,UAAU;AAAA,QACjB,YAAY;AAAA,QACZ,OAAO,UAAU;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAGA,QAAI,eAAe,aAAa;AAC9B,aAAO;AAAA,QACL,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,OAAO,UAAU;AAAA,QACjB;AAAA,QACA,YAAY,cAAc,MAAM,GAAG,KAAK,OAAO,aAAa,EAAE,IAAI,OAAK,EAAE,MAAM;AAAA,MACjF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,OAAO,UAAU;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,OAAe,KAA8B;AACtE,UAAM,EAAE,kBAAkB,QAAQ,oBAAoB,IAAI,KAAK;AAG/D,QAAI,SAAS,oBAAoB,OAAO,QAAQ;AAC9C,aAAO;AAAA,IACT;AAGA,QAAI,SAAS,qBAAqB;AAChC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAwB,OAAe,SAAqC;AAChF,UAAM,gBAAgB,MAAM,KAAK,aAAa,OAAO,OAAO;AAC5D,WAAO,cACJ,OAAO,OAAK,EAAE,SAAS,KAAK,OAAO,mBAAmB,EACtD,MAAM,GAAG,KAAK,OAAO,aAAa,EAClC,IAAI,OAAK,EAAE,MAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,KAAsC;AACxD,WAAO;AAAA,MACL,UAAU,IAAI;AAAA,MACd,YAAY,IAAI;AAAA,MAChB,cAAc,IAAI;AAAA,MAClB,OAAO,IAAI;AAAA,MACX,OAAO,IAAI;AAAA,MACX,QAAQ,IAAI;AAAA,MACZ,aAAa,OAAO,IAAI,iBAAiB,WACrC,KAAK,MAAM,IAAI,YAAY,IAC3B,IAAI;AAAA,MACR,WAAW,IAAI;AAAA,MACf,YAAY,IAAI;AAAA,MAChB,WAAW,OAAO,IAAI,UAAU;AAAA,MAChC,WAAW,OAAO,IAAI,UAAU;AAAA,IAClC;AAAA,EACF;AACF;;;ACzOA,SAAS,cAAAC,mBAAkB;AAU3B,IAAM,cAAc;AACpB,IAAM,eAAe;AACrB,IAAM,uBAAuB;AAC7B,IAAM,kBAAkB;AAEjB,IAAM,kBAAN,MAAsB;AAAA,EAG3B,YACU,IACA,SAAgC,CAAC,GACzC;AAFQ;AACA;AAER,SAAK,cAAc,IAAI,YAAY,EAAE;AAAA,EACvC;AAAA,EAPQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBR,MAAM,eACJ,MACA,eACqB;AACrB,UAAM,cAAc,KAAK,KAAK;AAG9B,UAAM,cAAc,MAAM,KAAK,qBAAqB,WAAW;AAC/D,QAAI,aAAa;AACf,aAAO;AAAA,IACT;AAGA,QAAI,gBAAgB,KAAK,WAAW,GAAG;AACrC,YAAM,UAAU,MAAM,KAAK,mBAAmB,WAAW;AACzD,UAAI,SAAS;AACX,eAAO;AAAA,MACT;AAAA,IAEF;AAGA,UAAM,YAAY,MAAM,KAAK,YAAY,MAAM,aAAa,KAAK,OAAO,OAAO;AAE/E,QAAI,UAAU,eAAe,UAAU,UAAU,OAAO;AAEtD,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU,UAAU,MAAM;AAAA,QAC1B,SAAS;AAAA,QACT,YAAY,UAAU;AAAA,MACxB;AAAA,IACF;AAIA,UAAM,eAAe,MAAM,KAAK;AAAA,MAC9B;AAAA,MACA,UAAU;AAAA,IACZ;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACJ,OACA,eACuB;AACvB,UAAM,UAAwB,CAAC;AAE/B,eAAW,QAAQ,OAAO;AACxB,YAAM,MAAM,MAAM,KAAK,eAAe,MAAM,aAAa;AACzD,cAAQ,KAAK,GAAG;AAAA,IAClB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAqB,MAA0C;AAE3E,QAAI,CAAC,YAAY,KAAK,IAAI,KAAK,CAAC,aAAa,KAAK,IAAI,KAAK,CAAC,qBAAqB,KAAK,IAAI,GAAG;AAC3F,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,gBAAgB,IAAI;AAGzC,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK;AAAA,MACL;AAAA;AAAA,MAEA,CAAC,YAAY;AAAA,IACf;AAEA,QAAI;AAEJ,QAAI,SAAS,SAAS,GAAG;AACvB,iBAAW,SAAS,CAAC,EAAE;AAAA,IACzB,OAAO;AAEL,iBAAW,MAAM,KAAK,gBAAgB,MAAM,YAAY;AAAA,IAC1D;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBAAmB,QAA4C;AAE3E,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,MAAM;AAAA,IACT;AAEA,QAAI,KAAK,WAAW,GAAG;AACrB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,KAAK,CAAC,EAAE;AAAA,MAClB,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,uBACZ,MACA,YACqB;AACrB,UAAM,eAAe,uBAAuB,aAAa,MAAM;AAAA,MAC7D,SAAS,KAAK,OAAO;AAAA,IACvB,CAAC;AAGD,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK;AAAA,MACL;AAAA;AAAA,MAEA,CAAC,YAAY;AAAA,IACf;AAEA,QAAI;AAEJ,QAAI,SAAS,SAAS,GAAG;AACvB,iBAAW,SAAS,CAAC,EAAE;AAAA,IACzB,OAAO;AAEL,iBAAW,MAAM,KAAK,iBAAiB,MAAM,cAAc,UAAU;AAAA,IACvE;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,YAAY,YAAY,IAAI,OAAK,EAAE,QAAQ;AAAA,IAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBACZ,MACA,cACA,YACiB;AACjB,UAAM,WAAWC,YAAW;AAC5B,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAEnC,UAAM,cAAc;AAAA,MAClB;AAAA,MACA,UAAU;AAAA,MACV,YAAY,YAAY,IAAI,QAAM;AAAA,QAChC,UAAU,EAAE;AAAA,QACZ,OAAO,EAAE;AAAA,MACX,EAAE;AAAA,IACJ;AAEA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK,UAAU,WAAW;AAAA,QAC1B,KAAK,YAAY,EAAE,KAAK;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,aAAa,cAAc,QAAQ;AAAA,IACtC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBACZ,YACA,cACiB;AACjB,UAAM,WAAWA,YAAW;AAC5B,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAGnC,QAAI,eAAe;AACnB,QAAI,YAAY,KAAK,UAAU,GAAG;AAChC,qBAAe;AAAA,IACjB,WAAW,aAAa,KAAK,UAAU,GAAG;AACxC,qBAAe;AAAA,IACjB,WAAW,qBAAqB,KAAK,UAAU,GAAG;AAChD,qBAAe;AAAA,IACjB;AAEA,UAAM,cAAc;AAAA,MAClB;AAAA,MACA;AAAA,IACF;AAEA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK,UAAU,WAAW;AAAA,QAC1B,WAAW,YAAY;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,YAAY,cAAc,QAAQ;AAAA,IACrC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,yBAAyB,WAAwC;AACrE,UAAM,OAAO,wBAAwB,SAAS;AAE9C,UAAM,MAAM,MAAM,KAAK,uBAAuB,IAAI;AAGlD,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,IAAI,QAAQ;AAAA,IACf;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,YAAY;AAAA,IACd;AAAA,EACF;AACF;;;ACtUA,SAAS,cAAAC,mBAAkB;AA4B3B,IAAM,oBAAsD;AAAA,EAC1D,SAAS,CAAC,eAAe,WAAW;AAAA,EACpC,aAAa,CAAC,WAAW,QAAQ,WAAW;AAAA,EAC5C,SAAS,CAAC,eAAe,QAAQ,WAAW;AAAA,EAC5C,MAAM,CAAC;AAAA;AAAA,EACP,WAAW,CAAC;AAAA;AACd;AAEO,IAAM,eAAN,MAAmB;AAAA,EAIxB,YACU,IACA,QACR;AAFQ;AACA;AAER,SAAK,cAAc,IAAI,YAAY,EAAE;AACrC,SAAK,kBAAkB,IAAI,gBAAgB,IAAI,EAAE,SAAS,OAAO,QAAQ,CAAC;AAAA,EAC5E;AAAA,EATQ;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBR,MAAM,YAAY,WAA0B,eAIzC;AACD,UAAM,SAAmB,CAAC;AAG1B,UAAM,EAAE,MAAM,OAAO,SAAS,cAAc,IAAI,MAAM,KAAK,iBAAiB,SAAS;AAErF,QAAI,SAAS,eAAe;AAC1B,aAAO,KAAK,aAAa;AAAA,IAC3B;AAGA,QAAI,UAAU,QAAQ;AACpB,YAAM,cAAc,MAAM,KAAK,mBAAmB,MAAM,UAAU,MAAM;AACxE,UAAI,aAAa;AACf,eAAO,KAAK,WAAW;AAAA,MACzB;AAAA,IACF;AAGA,QAAI,UAAU,UAAU;AACtB,YAAM,gBAAgB,MAAM,KAAK,qBAAqB,MAAM,UAAU,QAAQ;AAC9E,UAAI,eAAe;AACjB,eAAO,KAAK,aAAa;AAAA,MAC3B;AAAA,IACF;AAGA,QAAI,UAAU,aAAa,UAAU,UAAU,SAAS,GAAG;AACzD,YAAM,eAAe,MAAM,KAAK;AAAA,QAC9B;AAAA,QACA,UAAU;AAAA,QACV;AAAA,MACF;AACA,UAAI,cAAc;AAChB,eAAO,KAAK,YAAY;AAAA,MAC1B;AAAA,IACF,WAAW,UAAU,WAAW,WAAW;AAGzC,YAAM,eAAe,MAAM,KAAK,qBAAqB,IAAI;AACzD,UAAI,cAAc;AAChB,eAAO,KAAK,YAAY;AAAA,MAC1B;AAAA,IACF;AAEA,WAAO;AAAA,MACL,QAAQ,KAAK;AAAA,MACb;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAiB,WAI5B;AAED,UAAM,cAAc,MAAM,KAAK,YAAY,MAAM,UAAU,OAAO,UAAU,OAAO;AAEnF,QAAI,YAAY,eAAe,UAAU,YAAY,OAAO;AAC1D,aAAO;AAAA,QACL,MAAM,YAAY;AAAA,QAClB,OAAO;AAAA,MACT;AAAA,IACF;AAGA,UAAM,SAASC,YAAW;AAC1B,UAAM,eAAe,uBAAuB,QAAQ,UAAU,OAAO;AAAA,MACnE,SAAS,UAAU;AAAA,IACrB,CAAC;AAGD,QAAI,gBAAgB,UAAU,UAAU;AACxC,QAAI,kBAAkB,QAAQ;AAC5B,sBAAgB;AAAA,IAClB;AAEA,UAAM,MAAM,oBAAI,KAAK;AAErB,UAAM,cAAc;AAAA,MAClB,QAAQ;AAAA,MACR,UAAU,UAAU,YAAY;AAAA,MAChC,aAAa,UAAU;AAAA,MACvB,SAAS,UAAU,WAAW,KAAK,OAAO;AAAA,IAC5C;AAGA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA,KAAK,UAAU,WAAW;AAAA,QAC1B,UAAU,MAAM,YAAY,EAAE,KAAK;AAAA,QACnC,GAAG,UAAU,KAAK,IAAI,UAAU,eAAe,EAAE;AAAA,QACjD,IAAI,YAAY;AAAA,QAChB,IAAI,YAAY;AAAA,MAClB;AAAA,IACF;AAGA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,QAAQ,cAAc,MAAM;AAAA,IAC/B;AAGA,UAAM,UAAU,MAAM,KAAK,cAAc,gBAAgB;AAAA,MACvD;AAAA,MACA,OAAO,UAAU;AAAA,MACjB;AAAA,MACA;AAAA,MACA,UAAU,UAAU,YAAY;AAAA,MAChC,aAAa,UAAU;AAAA,MACvB,SAAS,UAAU,WAAW,KAAK,OAAO;AAAA,IAC5C,CAAC;AAGD,UAAM,OAAe;AAAA,MACnB,UAAU;AAAA,MACV,YAAY;AAAA,MACZ;AAAA,MACA,OAAO,UAAU;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR;AAAA,MACA,WAAW,UAAU,MAAM,YAAY,EAAE,KAAK;AAAA,MAC9C,YAAY,GAAG,UAAU,KAAK,IAAI,UAAU,eAAe,EAAE;AAAA,MAC7D,WAAW;AAAA,MACX,WAAW;AAAA,IACb;AAEA,WAAO,EAAE,MAAM,OAAO,MAAM,QAAQ;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBACZ,MACA,WACwB;AACxB,UAAM,cAAc,KAAK;AACzB,UAAM,gBAAgB,YAAY;AAElC,QAAI,kBAAkB,WAAW;AAC/B,aAAO;AAAA,IACT;AAGA,UAAM,kBAAkB,kBAAkB,aAAa,KAAK,CAAC;AAC7D,QAAI,CAAC,gBAAgB,SAAS,SAAS,GAAG;AAExC,aAAO,KAAK,cAAc,4BAA4B;AAAA,QACpD,QAAQ,KAAK;AAAA,QACb,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,QAAQ,2BAA2B,aAAa,OAAO,SAAS;AAAA,MAClE,CAAC;AAAA,IACH;AAGA,UAAM,UAAU,MAAM,KAAK,cAAc,uBAAuB;AAAA,MAC9D,QAAQ,KAAK;AAAA,MACb,YAAY;AAAA,MACZ,UAAU;AAAA,IACZ,CAAC;AAGD,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA,CAAC,YAAW,oBAAI,KAAK,GAAE,YAAY,GAAG,KAAK,QAAQ;AAAA,IACrD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBACZ,MACA,aACwB;AACxB,UAAM,cAAc,KAAK;AACzB,UAAM,kBAAkB,YAAY,YAAY;AAEhD,QAAI,oBAAoB,aAAa;AACnC,aAAO;AAAA,IACT;AAGA,UAAM,UAAU,MAAM,KAAK,cAAc,yBAAyB;AAAA,MAChE,QAAQ,KAAK;AAAA,MACb,cAAc;AAAA,MACd,YAAY;AAAA,IACd,CAAC;AAGD,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA,CAAC,cAAa,oBAAI,KAAK,GAAE,YAAY,GAAG,KAAK,QAAQ;AAAA,IACvD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eACZ,MACA,gBACA,eACwB;AAExB,UAAM,cAAc,MAAM,KAAK,gBAAgB,gBAAgB,cAAc;AAG7E,UAAM,OAAoB,KAAK,OAAO,kBAAkB,YAAY;AAGpE,UAAM,UAAU,MAAM,KAAK,cAAc,qBAAqB;AAAA,MAC5D,QAAQ,KAAK;AAAA,MACb;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAqB,MAAsC;AACvE,UAAM,iBAAiB,MAAM,KAAK,gBAAgB,yBAAyB,KAAK,KAAK;AAErF,UAAM,UAAU,MAAM,KAAK,cAAc,qBAAqB;AAAA,MAC5D,QAAQ,KAAK;AAAA,MACb,MAAM;AAAA,MACN,UAAU,CAAC,cAAc;AAAA,IAC3B,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cACZ,WACA,SACiB;AACjB,UAAM,UAAUA,YAAW;AAC3B,UAAM,MAAM,oBAAI,KAAK;AAGrB,UAAM,YAAY;AAAA,MAChB;AAAA,MACA,QAAQ;AAAA,MACR,KAAK,OAAO;AAAA,MACZ,KAAK,UAAU,OAAO;AAAA,IACxB;AAGA,UAAM,WAAW,MAAM;AAAA,MACrB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,SAAS;AAAA,IACZ;AAEA,QAAI,SAAS,SAAS,GAAG;AACvB,aAAO,SAAS,CAAC,EAAE;AAAA,IACrB;AAGA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA;AAAA,QACE;AAAA,QACA;AAAA,QACA,KAAK,OAAO;AAAA,QACZ,IAAI,YAAY;AAAA,QAChB,KAAK,UAAU,OAAO;AAAA,QACtB,cAAc,SAAS,IAAI,QAAQ,MAAM;AAAA,QACzC;AAAA,QACA,KAAK,UAAU,EAAE,QAAQ,gBAAgB,CAAC;AAAA,MAC5C;AAAA,IACF;AAGA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,WAAW,OAAO;AAAA,IACrB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBACJ,aACA,QACiB;AACjB,UAAM,UAAU,MAAM,KAAK,cAAc,yBAAyB;AAAA,MAChE;AAAA,MACA,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,IACF,CAAC;AAGD,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAACA,YAAW,GAAG,aAAa,QAAQ,KAAK,UAAU,EAAE,cAAa,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC,CAAC;AAAA,IAC/F;AAEA,WAAO;AAAA,EACT;AACF;;;AC/ZA,SAAS,cAAAC,mBAAkB;AAG3B,IAAM,iBAAiB;AACvB,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAeO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAAoB,IAAc;AAAd;AAAA,EAAe;AAAA;AAAA;AAAA;AAAA,EAKnC,MAAM,YAAuC;AAC3C,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,cAAc;AAAA,IACjB;AAEA,QAAI,KAAK,WAAW,GAAG;AACrB,aAAO,EAAE,aAAa,MAAM,eAAe,KAAK;AAAA,IAClD;AAEA,WAAO;AAAA,MACL,aAAa,KAAK,CAAC,EAAE;AAAA,MACrB,eAAe,KAAK,CAAC,EAAE,iBACnB,IAAI,KAAK,KAAK,CAAC,EAAE,cAAwB,IACzC;AAAA,IACN;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAa,SAAiB,WAAgC;AAC1E,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,CAAC,gBAAgB,SAAS,UAAU,YAAY,CAAC;AAAA,IACnD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBACJ,QACA,QAAgB,KACM;AACtB,QAAI,QAAQ;AAAA;AAAA;AAAA,6BAGa,iBAAiB,IAAI,MAAM,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA;AAEnE,UAAM,SAAoB,CAAC,GAAG,gBAAgB;AAE9C,QAAI,OAAO,iBAAiB,OAAO,aAAa;AAC9C,eAAS;AACT,aAAO;AAAA,QACL,OAAO,cAAc,YAAY;AAAA,QACjC,OAAO,cAAc,YAAY;AAAA,QACjC,OAAO;AAAA,MACT;AAAA,IACF;AAEA,aAAS;AACT,WAAO,KAAK,KAAK;AAEjB,UAAM,OAAO,MAAM,MAA+B,KAAK,IAAI,OAAO,MAAM;AAExE,WAAO,KAAK,IAAI,UAAQ;AAAA,MACtB,IAAI,IAAI;AAAA,MACR,WAAW,IAAI;AAAA,MACf,WAAW,IAAI;AAAA,MACf,WAAW,OAAO,IAAI,SAAS;AAAA,MAC/B,SAAS,OAAO,IAAI,YAAY,WAC5B,KAAK,MAAM,IAAI,OAAO,IACtB,IAAI;AAAA,IACV,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,YAAoB,KAAsB;AAC3D,UAAM,SAAS,MAAM,KAAK,UAAU;AACpC,UAAM,SAAS,MAAM,KAAK,iBAAiB,QAAQ,SAAS;AAE5D,QAAI,OAAO,WAAW,GAAG;AACvB,aAAO;AAAA,IACT;AAEA,eAAW,SAAS,QAAQ;AAC1B,YAAM,KAAK,aAAa,KAAK;AAC7B,YAAM,KAAK,aAAa,MAAM,IAAI,MAAM,SAAS;AAAA,IACnD;AAEA,WAAO,OAAO;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA8B;AAClC,QAAI,iBAAiB;AACrB,QAAI;AAEJ,OAAG;AACD,kBAAY,MAAM,KAAK,aAAa;AACpC,wBAAkB;AAAA,IACpB,SAAS,YAAY;AAErB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,aAAa,OAAiC;AAC1D,YAAQ,MAAM,WAAW;AAAA,MACvB,KAAK;AAEH,cAAM,KAAK,wBAAwB,MAAM,QAAQ,QAAkB,YAAY;AAC/E;AAAA,MAEF,KAAK;AACH,cAAM,KAAK,oBAAoB,KAAK;AACpC;AAAA,MAEF,KAAK;AAEH;AAAA,MAEF,KAAK;AACH,cAAM,KAAK,kBAAkB,KAAK;AAClC;AAAA,MAEF,KAAK;AACH,cAAM,KAAK,wBAAwB,KAAK;AACxC;AAAA,MAEF,KAAK;AAEH;AAAA,IACJ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,oBAAoB,OAAiC;AACjE,UAAM,EAAE,QAAQ,SAAS,IAAI,MAAM;AAGnC,QAAI,aAAa,QAAQ;AACvB,YAAM;AAAA,QACJ,KAAK;AAAA,QACL;AAAA;AAAA,QAEA,CAAC,MAAM;AAAA,MACT;AAGA,YAAM;AAAA,QACJ,KAAK;AAAA,QACL;AAAA;AAAA;AAAA;AAAA,QAIA,CAAC,MAAM;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBAAkB,OAAiC;AAC/D,UAAM,EAAE,QAAQ,MAAM,SAAS,IAAI,MAAM;AAMzC,QAAI,SAAS,WAAW;AAEtB,YAAM;AAAA,QACJ,KAAK;AAAA,QACL;AAAA,QACA,CAAC,MAAM;AAAA,MACT;AAGA,iBAAW,WAAW,UAAU;AAC9B,cAAM,KAAK,kBAAkB,QAAQ,SAAS,YAAY;AAAA,MAC5D;AAGA,YAAM,aAAa,SAAS,IAAI,OAAK,EAAE,QAAQ;AAC/C,YAAM;AAAA,QACJ,KAAK;AAAA,QACL;AAAA;AAAA;AAAA;AAAA,QAIA,CAAC,KAAK,UAAU,UAAU,GAAG,MAAM;AAAA,MACrC;AAAA,IAEF,OAAO;AAGL,YAAM;AAAA,QACJ,KAAK;AAAA,QACL;AAAA,QACA,CAAC,MAAM;AAAA,MACT;AAGA,iBAAW,WAAW,UAAU;AAC9B,cAAM,KAAK,kBAAkB,QAAQ,SAAS,sBAAsB;AAAA,MACtE;AAGA,YAAM,gBAAgB,SAAS,IAAI,OAAK,EAAE,QAAQ;AAClD,YAAM;AAAA,QACJ,KAAK;AAAA,QACL;AAAA;AAAA;AAAA;AAAA,QAIA,CAAC,KAAK,UAAU,aAAa,GAAG,MAAM;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBACZ,QACA,SACA,SACe;AACf,UAAM,SAASA,YAAW;AAE1B,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,KAAK,UAAU;AAAA,UACb,MAAM,QAAQ;AAAA,UACd,SAAS,QAAQ;AAAA,UACjB,YAAY,QAAQ;AAAA,UACpB,YAAY,QAAQ;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,wBAAwB,OAAiC;AACrE,UAAM,EAAE,aAAa,WAAW,IAAI,MAAM;AAM1C,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA,CAAC,KAAK,UAAU,UAAU,GAAG,WAAW;AAAA,IAC1C;AAAA,EAGF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,wBAAwB,QAAgB,UAAiC;AACrF,UAAM,QAAQA,YAAW;AACzB,UAAM,mBAAmB;AAEzB,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,OAAO,UAAU,QAAQ,gBAAgB;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAA2B;AAE/B,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA,IACF;AAGA,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA,MACA,CAAC,cAAc;AAAA,IACjB;AAGA,WAAO,KAAK,WAAW;AAAA,EACzB;AACF;;;ACzVO,IAAM,mBAAN,MAAuB;AAAA,EAI5B,YAAoB,QAAgB;AAAhB;AAClB,SAAK,KAAK,eAAe,MAAM;AAAA,EACjC;AAAA,EALQ;AAAA,EACA,cAAc;AAAA,EAMtB,MAAM,aAA4B;AAChC,QAAI,KAAK;AAAa;AAGtB,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAkBpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAcpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAgBpB;AAGD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA,KAGpB;AACD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA,KAGpB;AACD,UAAM,MAAM,KAAK,IAAI;AAAA;AAAA;AAAA,KAGpB;AAED,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,cAAwB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,gBAAyB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,QAAQ,KAAK,EAAE;AACrB,SAAK,cAAc;AAAA,EACrB;AACF;AAEO,SAAS,uBAAuB,QAAkC;AACvE,SAAO,IAAI,iBAAiB,MAAM;AACpC;;;AC5GA,SAAS,cAAAC,mBAAkB;AAQpB,IAAM,cAAN,MAAkB;AAAA,EACvB,YAAoB,kBAAoC;AAApC;AAAA,EAAqC;AAAA,EAEzD,IAAY,KAAe;AACzB,WAAO,KAAK,iBAAiB,YAAY;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aACJ,OACiB;AACjB,UAAM,UAAUC,YAAW;AAE3B,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAkBA;AAAA,QACE;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,KAAK,UAAU,MAAM,QAAQ;AAAA,QAC7B,MAAM;AAAA,QACN,MAAM;AAAA,QACN,KAAK,UAAU,MAAM,MAAM;AAAA,QAC3B,KAAK,UAAU,MAAM,gBAAgB,CAAC,CAAC;AAAA,QACvC,MAAM;AAAA,MACR;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OACJ,OACA,SACuC;AACvC,UAAM,OAAO,SAAS,QAAQ;AAC9B,UAAM,gBAAgB,SAAS,iBAAiB;AAChD,UAAM,gBAAgB,IAAI,KAAK;AAE/B,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA;AAAA,MAKA,CAAC,eAAe,eAAe,eAAe,eAAe,IAAI;AAAA,IACnE;AAEA,WAAO,KAAK,IAAI,KAAK,UAAU;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACJ,QACA,SACuC;AACvC,UAAM,OAAO,SAAS,QAAQ;AAE9B,QAAI,OAAO,WAAW,GAAG;AACvB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,kBAAkB,OAAO,IAAI,MAAM,eAAe,EAAE,KAAK,MAAM;AACrE,UAAM,cAAc,OAAO,IAAI,OAAK,KAAK,CAAC,IAAI;AAE9C,QAAI,QAAQ,+CAA+C,eAAe;AAC1E,UAAM,SAAoB,CAAC,GAAG,WAAW;AAEzC,QAAI,SAAS,oBAAoB;AAC/B,eAAS;AACT,aAAO,KAAK,QAAQ,kBAAkB;AAAA,IACxC;AAEA,aAAS;AACT,WAAO,KAAK,IAAI;AAEhB,UAAM,OAAO,MAAM,MAA+B,KAAK,IAAI,OAAO,MAAM;AACxE,WAAO,KAAK,IAAI,KAAK,UAAU;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,SAAgC;AAChD,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA,CAAC,OAAO;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,SAA6D;AACrE,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA,MACA,CAAC,OAAO;AAAA,IACV;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAC9B,WAAO,KAAK,WAAW,KAAK,CAAC,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,aACA,eAC4C;AAC5C,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA,MAEA,CAAC,aAAa,aAAa;AAAA,IAC7B;AAEA,QAAI,KAAK,WAAW;AAAG,aAAO;AAC9B,WAAO,KAAK,WAAW,KAAK,CAAC,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,aAAqB,eAAyC;AACzE,UAAM,SAAS,MAAM;AAAA,MACnB,KAAK;AAAA,MACL;AAAA;AAAA,MAEA,CAAC,aAAa,aAAa;AAAA,IAC7B;AACA,YAAQ,OAAO,CAAC,GAAG,SAAS,KAAK;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,SAAqE;AAChF,UAAM,QAAQ,SAAS,SAAS;AAChC,UAAM,OAAO,MAAM;AAAA,MACjB,KAAK;AAAA,MACL;AAAA;AAAA;AAAA,MAGA,CAAC,KAAK;AAAA,IACR;AAEA,WAAO,KAAK,IAAI,KAAK,UAAU;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAyB;AAC7B,UAAM,SAAS,MAAM;AAAA,MACnB,KAAK;AAAA,MACL;AAAA,IACF;AACA,WAAO,OAAO,CAAC,GAAG,SAAS;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAKH;AACD,UAAM,cAAc,MAAM;AAAA,MACxB,KAAK;AAAA,MACL;AAAA,IACF;AACA,UAAM,QAAQ,YAAY,CAAC,GAAG,SAAS;AAEvC,UAAM,YAAY,MAAM;AAAA,MACtB,KAAK;AAAA,MACL;AAAA,IACF;AACA,UAAM,oBAAoB,UAAU,CAAC,GAAG,OAAO;AAE/C,UAAM,cAAc,MAAM;AAAA,MACxB,KAAK;AAAA,MACL;AAAA,IACF;AACA,UAAM,kBAAkB,YAAY,CAAC,GAAG,SAAS;AAGjD,UAAM,UAAU,MAAM,KAAK,OAAO,EAAE,OAAO,IAAK,CAAC;AACjD,UAAM,cAAsC,CAAC;AAC7C,eAAW,SAAS,SAAS;AAC3B,iBAAW,SAAS,MAAM,QAAQ;AAChC,oBAAY,KAAK,KAAK,YAAY,KAAK,KAAK,KAAK;AAAA,MACnD;AAAA,IACF;AAEA,UAAM,YAAY,OAAO,QAAQ,WAAW,EACzC,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,EAAE,OAAO,MAAM,EAAE,EAC1C,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,MAAM,GAAG,EAAE;AAEd,WAAO,EAAE,OAAO,mBAAmB,WAAW,gBAAgB;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,SAAmC;AAC9C,UAAM,SAAS,MAAM,KAAK,MAAM;AAChC,UAAM;AAAA,MACJ,KAAK;AAAA,MACL;AAAA,MACA,CAAC,OAAO;AAAA,IACV;AACA,UAAM,QAAQ,MAAM,KAAK,MAAM;AAC/B,WAAO,SAAS;AAAA,EAClB;AAAA,EAEQ,WAAW,KAA0D;AAC3E,WAAO;AAAA,MACL,SAAS,IAAI;AAAA,MACb,mBAAmB,IAAI;AAAA,MACvB,eAAe,IAAI;AAAA,MACnB,OAAO,IAAI;AAAA,MACX,UAAU,KAAK,MAAM,IAAI,YAAsB,IAAI;AAAA,MACnD,WAAW,IAAI;AAAA,MACf,UAAU,IAAI;AAAA,MACd,QAAQ,KAAK,MAAM,IAAI,UAAoB,IAAI;AAAA,MAC/C,cAAc,KAAK,MAAM,IAAI,gBAA0B,IAAI;AAAA,MAC3D,YAAY,IAAI;AAAA,MAChB,YAAY,IAAI,eAAyB;AAAA,MACzC,YAAY,IAAI,eAAe,OAAO,IAAI,YAAY,IAAI;AAAA,MAC1D,YAAY,OAAO,IAAI,WAAW;AAAA,MAClC,WAAW,OAAO,IAAI,UAAU;AAAA,IAClC;AAAA,EACF;AACF;AAEO,SAAS,kBACd,kBACa;AACb,SAAO,IAAI,YAAY,gBAAgB;AACzC;;;AC3RA,YAAYC,cAAa;AAalB,IAAM,oBAAN,MAAwB;AAAA,EAK7B,YAAoB,QAAgB;AAAhB;AAAA,EAAiB;AAAA,EAJ7B,KAAgC;AAAA,EAChC,QAA8B;AAAA,EACrB,YAAY;AAAA;AAAA;AAAA;AAAA,EAO7B,MAAM,aAA4B;AAChC,QAAI,KAAK;AAAI;AAEb,SAAK,KAAK,MAAc,iBAAQ,KAAK,MAAM;AAE3C,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,GAAG,WAAW;AACxC,UAAI,OAAO,SAAS,KAAK,SAAS,GAAG;AACnC,aAAK,QAAQ,MAAM,KAAK,GAAG,UAAU,KAAK,SAAS;AAAA,MACrD;AAAA,IACF,QAAQ;AACN,WAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,QAA2C;AACtD,UAAM,KAAK,WAAW;AAEtB,QAAI,CAAC,KAAK,IAAI;AACZ,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC5C;AAEA,UAAM,OAAO;AAAA,MACX,IAAI,OAAO;AAAA,MACX,SAAS,OAAO;AAAA,MAChB,WAAW,OAAO;AAAA,MAClB,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO;AAAA,MACf,QAAQ,KAAK,UAAU,OAAO,MAAM;AAAA,MACpC,mBAAmB,OAAO,qBAAqB;AAAA,IACjD;AAEA,QAAI,CAAC,KAAK,OAAO;AACf,WAAK,QAAQ,MAAM,KAAK,GAAG,YAAY,KAAK,WAAW,CAAC,IAAI,CAAC;AAAA,IAC/D,OAAO;AAEL,UAAI;AACF,cAAM,KAAK,MAAM,OAAO,cAAc,OAAO,OAAO,GAAG;AAAA,MACzD,QAAQ;AAAA,MAER;AACA,YAAM,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,SAA8C;AAC9D,QAAI,QAAQ,WAAW;AAAG;AAE1B,UAAM,KAAK,WAAW;AAEtB,QAAI,CAAC,KAAK,IAAI;AACZ,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC5C;AAEA,UAAM,OAAO,QAAQ,IAAI,aAAW;AAAA,MAClC,IAAI,OAAO;AAAA,MACX,SAAS,OAAO;AAAA,MAChB,WAAW,OAAO;AAAA,MAClB,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO;AAAA,MACf,QAAQ,KAAK,UAAU,OAAO,MAAM;AAAA,MACpC,mBAAmB,OAAO,qBAAqB;AAAA,IACjD,EAAE;AAEF,QAAI,CAAC,KAAK,OAAO;AACf,WAAK,QAAQ,MAAM,KAAK,GAAG,YAAY,KAAK,WAAW,IAAI;AAAA,IAC7D,OAAO;AACL,YAAM,KAAK,MAAM,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OACJ,aACA,UAKI,CAAC,GAC0B;AAC/B,UAAM,KAAK,WAAW;AAEtB,QAAI,CAAC,KAAK,OAAO;AACf,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,EAAE,QAAQ,GAAG,WAAW,KAAK,oBAAoB,UAAU,IAAI;AAErE,QAAI,QAAQ,KAAK,MACd,OAAO,WAAW,EAClB,aAAa,QAAQ,EACrB,MAAM,QAAQ,CAAC;AAGlB,UAAM,UAAoB,CAAC;AAC3B,QAAI,oBAAoB;AACtB,cAAQ,KAAK,yBAAyB,kBAAkB,GAAG;AAAA,IAC7D;AACA,QAAI,WAAW;AACb,cAAQ,KAAK,gBAAgB,SAAS,GAAG;AAAA,IAC3C;AAEA,QAAI,QAAQ,SAAS,GAAG;AACtB,cAAQ,MAAM,MAAM,QAAQ,KAAK,OAAO,CAAC;AAAA,IAC3C;AAEA,UAAM,UAAU,MAAM,MAAM,QAAQ;AAEpC,WAAO,QACJ,OAAO,OAAK;AACX,YAAM,WAAW,EAAE,aAAa;AAChC,YAAM,QAAQ,IAAK,WAAW;AAC9B,aAAO,SAAS;AAAA,IAClB,CAAC,EACA,MAAM,GAAG,KAAK,EACd,IAAI,OAAK;AACR,YAAM,WAAW,EAAE,aAAa;AAChC,YAAM,QAAQ,IAAK,WAAW;AAC9B,aAAO;AAAA,QACL,IAAI,EAAE;AAAA,QACN,SAAS,EAAE;AAAA,QACX,SAAS,EAAE;AAAA,QACX;AAAA,QACA,WAAW,EAAE;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,SAAgC;AAC3C,QAAI,CAAC,KAAK;AAAO;AACjB,UAAM,KAAK,MAAM,OAAO,cAAc,OAAO,GAAG;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAyB;AAC7B,QAAI,CAAC,KAAK;AAAO,aAAO;AACxB,WAAO,KAAK,MAAM,UAAU;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,SAAmC;AAC9C,QAAI,CAAC,KAAK;AAAO,aAAO;AAExB,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,MACxB,OAAO,CAAC,CAAC,EACT,MAAM,cAAc,OAAO,GAAG,EAC9B,MAAM,CAAC,EACP,QAAQ;AACX,aAAO,QAAQ,SAAS;AAAA,IAC1B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAAS,wBAAwB,QAAmC;AACzE,SAAO,IAAI,kBAAkB,MAAM;AACrC;;;ACrMA,SAAS,cAAAC,mBAAkB;AAqBpB,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YACU,aACA,mBACA,UACA,QACR;AAJQ;AACA;AACA;AACA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKH,uBAAuB,OAAuB;AAE5C,QAAI,MAAM,cAAc,mBAAmB;AACzC,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,UAAU,cAAc,MAAM,UAAU,aAAa;AAC7D,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,WAAW,UAAU;AAC7B,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aACJ,OACA,aAC0B;AAE1B,QAAI,CAAC,KAAK,uBAAuB,KAAK,GAAG;AACvC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS;AAAA,QACT,YAAY,4BAA4B,MAAM,SAAS,WAAW,MAAM,KAAK,YAAY,MAAM,MAAM;AAAA,MACvG;AAAA,IACF;AAGA,UAAM,SAAS,MAAM,KAAK,YAAY,OAAO,aAAa,MAAM,OAAO;AACvE,QAAI,QAAQ;AACV,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS;AAAA,QACT,YAAY;AAAA,MACd;AAAA,IACF;AAEA,QAAI;AACF,YAAM,UAAU,MAAM;AACtB,YAAM,aAAa,KAAK,oBAAoB,KAAK;AAGjD,YAAM,gBAAgB,KAAK,QAAQ,6BAA6B;AAChE,UAAI,aAAa,eAAe;AAC9B,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS;AAAA,UACT,YAAY,cAAc,UAAU,oBAAoB,aAAa;AAAA,QACvE;AAAA,MACF;AAEA,YAAM,QAAoC;AAAA,QACxC,mBAAmB;AAAA,QACnB,eAAe,MAAM;AAAA,QACrB,OAAO,MAAM;AAAA,QACb,UAAU,QAAQ,YAAY,CAAC;AAAA,QAC/B,WAAW,QAAQ,aAAa;AAAA,QAChC,UAAU,QAAQ,YAAY;AAAA,QAC9B,QAAQ,KAAK,cAAc,KAAK;AAAA,QAChC,cAAc,QAAQ,gBAAgB,CAAC;AAAA,QACvC;AAAA,MACF;AAGA,YAAM,UAAU,MAAM,KAAK,YAAY,aAAa,KAAK;AAGzD,YAAM,mBAAmB,KAAK,uBAAuB,KAAK;AAC1D,YAAM,YAAY,MAAM,KAAK,SAAS,MAAM,gBAAgB;AAE5D,YAAM,KAAK,kBAAkB,OAAO;AAAA,QAClC,IAAIA,YAAW;AAAA,QACf;AAAA,QACA,WAAW;AAAA,QACX,SAAS;AAAA,QACT,QAAQ,UAAU;AAAA,QAClB,QAAQ,MAAM;AAAA,QACd,mBAAmB;AAAA,MACrB,CAAC;AAED,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACJ,SACA,aACuC;AACvC,UAAM,UAAU,oBAAI,IAA6B;AAEjD,eAAW,SAAS,SAAS;AAC3B,YAAM,SAAS,MAAM,KAAK,aAAa,OAAO,WAAW;AACzD,cAAQ,IAAI,MAAM,SAAS,MAAM;AAAA,IACnC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,OAAwB;AAC5C,UAAM,SAAmB,CAAC;AAG1B,UAAM,aAAa,MAAM,MACtB,YAAY,EACZ,MAAM,UAAU,EAChB,OAAO,OAAK,EAAE,SAAS,KAAK,CAAC,KAAK,WAAW,CAAC,CAAC;AAClD,WAAO,KAAK,GAAG,UAAU;AAGzB,UAAM,UAAU,MAAM;AACtB,QAAI,QAAQ,UAAU,MAAM,QAAQ,QAAQ,MAAM,GAAG;AACnD,aAAO,KAAK,GAAG,QAAQ,OAAO,IAAI,OAAK,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC;AAAA,IACjE;AAGA,QAAI,QAAQ,gBAAgB,MAAM,QAAQ,QAAQ,YAAY,GAAG;AAC/D,aAAO,KAAK,GAAG,QAAQ,aAAa,IAAI,OAAK,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC;AAAA,IACvE;AAGA,WAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,MAAuB;AACxC,UAAM,YAAY,oBAAI,IAAI;AAAA,MACxB;AAAA,MAAO;AAAA,MAAO;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAC7D;AAAA,MAAQ;AAAA,MAAO;AAAA,MAAO;AAAA,MAAO;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAS;AAAA,MAAS;AAAA,MAC9D;AAAA,MAAQ;AAAA,MAAS;AAAA,MAAQ;AAAA,MAAS;AAAA,MAAS;AAAA,MAAS;AAAA,MAAW;AAAA,IACjE,CAAC;AACD,WAAO,UAAU,IAAI,IAAI;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,OAAsB;AAChD,QAAI,aAAa;AAGjB,QAAI,MAAM,UAAU,aAAa;AAC/B,mBAAa;AAAA,IACf;AAOA,WAAO,KAAK,IAAI,YAAY,CAAG;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,OAA2C;AACxE,UAAM,QAAkB,CAAC;AAEzB,UAAM,KAAK,YAAY,MAAM,KAAK,EAAE;AAEpC,QAAI,MAAM,SAAS,SAAS,GAAG;AAC7B,YAAM,KAAK,aAAa,MAAM,SAAS,KAAK,IAAI,CAAC,EAAE;AAAA,IACrD;AAEA,QAAI,MAAM,WAAW;AACnB,YAAM,KAAK,eAAe,MAAM,SAAS,EAAE;AAAA,IAC7C;AAEA,QAAI,MAAM,UAAU;AAClB,YAAM,KAAK,aAAa,MAAM,QAAQ,EAAE;AAAA,IAC1C;AAEA,QAAI,MAAM,gBAAgB,MAAM,aAAa,SAAS,GAAG;AACvD,YAAM,KAAK,iBAAiB,MAAM,aAAa,KAAK,IAAI,CAAC,EAAE;AAAA,IAC7D;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AACF;AAEO,SAAS,qBACd,aACA,mBACA,UACA,QACgB;AAChB,SAAO,IAAI,eAAe,aAAa,mBAAmB,UAAU,MAAM;AAC5E;",
|
|
6
|
+
"names": ["hash", "randomUUID", "randomUUID", "randomUUID", "randomUUID", "DEFAULT_CONFIG", "DEFAULT_CONFIG", "createHash", "DEFAULT_OPTIONS", "DEFAULT_CONFIG", "randomUUID", "randomUUID", "randomUUID", "randomUUID", "randomUUID", "randomUUID", "randomUUID", "lancedb", "randomUUID"]
|
|
7
7
|
}
|