@elizaos/plugin-sql 2.0.3-beta.2 → 2.0.3-beta.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.
Files changed (85) hide show
  1. package/package.json +3 -3
  2. package/src/dist/base.d.ts +1169 -0
  3. package/src/dist/browser/index.browser.d.ts +2 -0
  4. package/src/dist/browser/index.browser.js +31167 -0
  5. package/src/dist/browser/index.browser.js.map +76 -0
  6. package/src/dist/browser/index.d.ts +2 -0
  7. package/src/dist/cjs/index.d.ts +2 -0
  8. package/src/dist/cjs/index.node.cjs +13565 -0
  9. package/src/dist/cjs/index.node.cjs.map +75 -0
  10. package/src/dist/cjs/index.node.d.cts +2 -0
  11. package/src/dist/connector-credential-store.d.ts +48 -0
  12. package/src/dist/drizzle/index.d.ts +1 -0
  13. package/src/dist/drizzle/index.js +1 -0
  14. package/src/dist/index.d.ts +4 -0
  15. package/src/dist/index.js +2 -0
  16. package/src/dist/index.node.d.ts +53 -0
  17. package/src/dist/migration-service.d.ts +17 -0
  18. package/src/dist/migrations.d.ts +15 -0
  19. package/src/dist/node/index.d.ts +2 -0
  20. package/src/dist/node/index.node.d.ts +2 -0
  21. package/src/dist/node/index.node.js +13588 -0
  22. package/src/dist/node/index.node.js.map +75 -0
  23. package/src/dist/pg/adapter.d.ts +42 -0
  24. package/src/dist/pg/manager.d.ts +17 -0
  25. package/src/dist/pg/sslmode.d.ts +6 -0
  26. package/src/dist/pglite/adapter.d.ts +63 -0
  27. package/src/dist/pglite/errors.d.ts +20 -0
  28. package/src/dist/pglite/manager.d.ts +213 -0
  29. package/src/dist/rls.d.ts +13 -0
  30. package/src/dist/runtime-migrator/crypto-utils.d.ts +25 -0
  31. package/src/dist/runtime-migrator/drizzle-adapters/database-introspector.d.ts +58 -0
  32. package/src/dist/runtime-migrator/drizzle-adapters/diff-calculator.d.ts +77 -0
  33. package/src/dist/runtime-migrator/drizzle-adapters/snapshot-generator.d.ts +21 -0
  34. package/src/dist/runtime-migrator/drizzle-adapters/sql-generator.d.ts +38 -0
  35. package/src/dist/runtime-migrator/extension-manager.d.ts +6 -0
  36. package/src/dist/runtime-migrator/index.d.ts +8 -0
  37. package/src/dist/runtime-migrator/runtime-migrator.d.ts +95 -0
  38. package/src/dist/runtime-migrator/schema-transformer.d.ts +18 -0
  39. package/src/dist/runtime-migrator/storage/journal-storage.d.ts +10 -0
  40. package/src/dist/runtime-migrator/storage/migration-tracker.d.ts +13 -0
  41. package/src/dist/runtime-migrator/storage/snapshot-storage.d.ts +9 -0
  42. package/src/dist/runtime-migrator/types.d.ts +157 -0
  43. package/src/dist/schema/agent.d.ts +344 -0
  44. package/src/dist/schema/approvalRequests.d.ts +277 -0
  45. package/src/dist/schema/authAuditEvent.d.ts +153 -0
  46. package/src/dist/schema/authBootstrapJti.d.ts +49 -0
  47. package/src/dist/schema/authIdentity.d.ts +121 -0
  48. package/src/dist/schema/authOwnerBinding.d.ts +168 -0
  49. package/src/dist/schema/authOwnerLoginToken.d.ts +122 -0
  50. package/src/dist/schema/authSession.d.ts +225 -0
  51. package/src/dist/schema/cache.d.ts +97 -0
  52. package/src/dist/schema/channel.d.ts +177 -0
  53. package/src/dist/schema/channelParticipant.d.ts +41 -0
  54. package/src/dist/schema/component.d.ts +163 -0
  55. package/src/dist/schema/connectorAccounts.d.ts +981 -0
  56. package/src/dist/schema/embedding.d.ts +225 -0
  57. package/src/dist/schema/entity.d.ts +125 -0
  58. package/src/dist/schema/entityIdentity.d.ts +577 -0
  59. package/src/dist/schema/index.d.ts +35 -0
  60. package/src/dist/schema/index.js +1 -0
  61. package/src/dist/schema/log.d.ts +114 -0
  62. package/src/dist/schema/longTermMemories.d.ts +254 -0
  63. package/src/dist/schema/memory.d.ts +185 -0
  64. package/src/dist/schema/memoryAccessLogs.d.ts +109 -0
  65. package/src/dist/schema/message.d.ts +194 -0
  66. package/src/dist/schema/messageServer.d.ts +126 -0
  67. package/src/dist/schema/messageServerAgent.d.ts +41 -0
  68. package/src/dist/schema/pairingAllowlist.d.ts +113 -0
  69. package/src/dist/schema/pairingRequest.d.ts +147 -0
  70. package/src/dist/schema/participant.d.ts +114 -0
  71. package/src/dist/schema/relationship.d.ts +156 -0
  72. package/src/dist/schema/room.d.ts +195 -0
  73. package/src/dist/schema/server.d.ts +64 -0
  74. package/src/dist/schema/sessionSummaries.d.ts +273 -0
  75. package/src/dist/schema/tasks.d.ts +225 -0
  76. package/src/dist/schema/types.d.ts +68 -0
  77. package/src/dist/schema/world.d.ts +114 -0
  78. package/src/dist/services/advanced-memory-storage.d.ts +36 -0
  79. package/src/dist/stores/connectorAccount.store.d.ts +64 -0
  80. package/src/dist/stores/types.d.ts +25 -0
  81. package/src/dist/types.d.ts +13 -0
  82. package/src/dist/utils/string-to-uuid.d.ts +2 -0
  83. package/src/dist/utils.d.ts +4 -0
  84. package/src/dist/utils.node.d.ts +4 -0
  85. package/src/dist/write-back/index.d.ts +56 -0
@@ -0,0 +1,75 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../schema/agent.ts", "../../schema/server.ts", "../../types.ts", "../../migrations.ts", "../../rls.ts", "../../runtime-migrator/crypto-utils.ts", "../../runtime-migrator/schema-transformer.ts", "../../runtime-migrator/drizzle-adapters/database-introspector.ts", "../../runtime-migrator/drizzle-adapters/diff-calculator.ts", "../../runtime-migrator/drizzle-adapters/snapshot-generator.ts", "../../runtime-migrator/drizzle-adapters/sql-generator.ts", "../../runtime-migrator/extension-manager.ts", "../../runtime-migrator/storage/journal-storage.ts", "../../runtime-migrator/storage/migration-tracker.ts", "../../runtime-migrator/storage/snapshot-storage.ts", "../../runtime-migrator/runtime-migrator.ts", "../../runtime-migrator/index.ts", "../../migration-service.ts", "../../index.ts", "../../pg/adapter.ts", "../../base.ts", "../../schema/embedding.ts", "../../schema/memory.ts", "../../schema/entity.ts", "../../schema/room.ts", "../../schema/index.ts", "../../schema/approvalRequests.ts", "../../schema/authAuditEvent.ts", "../../schema/authBootstrapJti.ts", "../../schema/authIdentity.ts", "../../schema/authOwnerBinding.ts", "../../schema/authOwnerLoginToken.ts", "../../schema/authSession.ts", "../../schema/cache.ts", "../../schema/channel.ts", "../../schema/messageServer.ts", "../../schema/channelParticipant.ts", "../../schema/component.ts", "../../schema/world.ts", "../../schema/connectorAccounts.ts", "../../schema/entityIdentity.ts", "../../schema/log.ts", "../../schema/longTermMemories.ts", "../../schema/memoryAccessLogs.ts", "../../schema/message.ts", "../../schema/messageServerAgent.ts", "../../schema/pairingAllowlist.ts", "../../schema/pairingRequest.ts", "../../schema/participant.ts", "../../schema/relationship.ts", "../../schema/sessionSummaries.ts", "../../schema/tasks.ts", "../../stores/connectorAccount.store.ts", "../../pg/manager.ts", "../../pg/sslmode.ts", "../../pglite/adapter.ts", "../../pglite/manager.ts", "../../../../../node_modules/.bun/@electric-sql+client@1.5.21/node_modules/@electric-sql/client/dist/index.mjs", "../../../../../node_modules/.bun/@electric-sql+experimental@1.0.14+2cb74579c256cbd3/node_modules/@electric-sql/experimental/dist/index.mjs", "../../../../../node_modules/.bun/@electric-sql+pglite-sync@0.5.6+7503d3eaf0aad049/node_modules/@electric-sql/pglite-sync/dist/index.js", "../../write-back/index.ts", "../../pglite/errors.ts", "../../services/advanced-memory-storage.ts", "../../utils/string-to-uuid.ts", "../../utils.ts", "../../connector-credential-store.ts"],
4
+ "sourcesContent": [
5
+ "import type { MessageExample } from \"@elizaos/core\";\nimport { sql } from \"drizzle-orm\";\nimport { boolean, jsonb, pgTable, text, timestamp, uuid } from \"drizzle-orm/pg-core\";\n\n/**\n * Represents a table for storing agent data.\n *\n * @type {Table}\n */\nexport const agentTable = pgTable(\"agents\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n enabled: boolean(\"enabled\").default(true).notNull(),\n server_id: uuid(\"server_id\"),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).default(sql`now()`).notNull(),\n\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).default(sql`now()`).notNull(),\n\n // Character\n name: text(\"name\").notNull(),\n username: text(\"username\"),\n system: text(\"system\").default(\"\"),\n bio: jsonb(\"bio\").$type<string | string[]>().default(sql`'[]'::jsonb`),\n messageExamples: jsonb(\"message_examples\")\n .$type<MessageExample[][]>()\n .default(sql`'[]'::jsonb`)\n .notNull(),\n postExamples: jsonb(\"post_examples\").$type<string[]>().default(sql`'[]'::jsonb`).notNull(),\n topics: jsonb(\"topics\").$type<string[]>().default(sql`'[]'::jsonb`).notNull(),\n adjectives: jsonb(\"adjectives\").$type<string[]>().default(sql`'[]'::jsonb`).notNull(),\n knowledge: jsonb(\"knowledge\")\n .$type<(string | { path: string; shared?: boolean })[]>()\n .default(sql`'[]'::jsonb`)\n .notNull(),\n plugins: jsonb(\"plugins\").$type<string[]>().default(sql`'[]'::jsonb`).notNull(),\n settings: jsonb(\"settings\")\n .$type<{\n secrets?: { [key: string]: string | boolean | number };\n [key: string]: string | boolean | number | Record<string, unknown> | undefined;\n }>()\n .default(sql`'{}'::jsonb`)\n .notNull(),\n style: jsonb(\"style\")\n .$type<{\n all?: string[];\n chat?: string[];\n post?: string[];\n }>()\n .default(sql`'{}'::jsonb`)\n .notNull(),\n});\n",
6
+ "import { sql } from \"drizzle-orm\";\nimport { pgTable, timestamp, uuid } from \"drizzle-orm/pg-core\";\n\n/**\n * Represents a table for storing server data for RLS multi-tenant isolation.\n * Each server represents one elizaOS instance in a multi-tenant deployment.\n *\n * @type {Table}\n */\nexport const serverTable = pgTable(\"servers\", {\n id: uuid(\"id\").primaryKey(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).default(sql`now()`).notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).default(sql`now()`).notNull(),\n});\n",
7
+ "import type { IDatabaseAdapter } from \"@elizaos/core\";\nimport type { NodePgDatabase } from \"drizzle-orm/node-postgres\";\nimport type { PgliteDatabase } from \"drizzle-orm/pglite\";\n\nexport type DrizzleDatabase = NodePgDatabase | PgliteDatabase;\n\nexport interface IDatabaseClientManager<T> {\n initialize(): Promise<void>;\n getConnection(): T;\n close(): Promise<void>;\n}\n\nexport function getDb(adapter: IDatabaseAdapter): DrizzleDatabase {\n return adapter.db as DrizzleDatabase;\n}\n\nexport function getRow<T>(result: { rows: unknown[] }, index = 0): T | undefined {\n return result.rows[index] as T | undefined;\n}\n",
8
+ "import { type IDatabaseAdapter, logger } from \"@elizaos/core\";\nimport { sql } from \"drizzle-orm\";\nimport { getDb } from \"./types\";\n\n// Column info row for schema introspection queries\ninterface ColumnInfoRow {\n column_name: string;\n data_type: string;\n}\n\n// Table info row for schema introspection queries\ninterface TableInfoRow {\n table_name: string;\n}\n\n/**\n * Type-safe extraction of rows from SQL query results.\n */\nfunction getRows<T>(result: { rows: unknown[] }): T[] {\n return result.rows as T[];\n}\n\n/**\n * TEMPORARY MIGRATION: pre-1.6.5 → 1.6.5+ schema migration\n *\n * This migration runs automatically on startup and is idempotent.\n * It handles the migration from Owner RLS to Server RLS + Entity RLS, including:\n * - Disabling old RLS policies temporarily\n * - Renaming server_id → message_server_id in channels, worlds, rooms\n * - Converting TEXT → UUID where needed\n * - Dropping old server_id columns for RLS\n * - Cleaning up indexes\n *\n * @param adapter - Database adapter\n */\nexport async function migrateToEntityRLS(adapter: IDatabaseAdapter): Promise<void> {\n const db = getDb(adapter);\n\n // Detect database type - skip PostgreSQL-specific migrations for SQLite\n try {\n await db.execute(sql`SELECT 1 FROM pg_tables LIMIT 1`);\n } catch {\n // Not PostgreSQL (likely SQLite)\n logger.debug(\"[Migration] ⊘ Not PostgreSQL, skipping PostgreSQL-specific migrations\");\n return;\n }\n\n // Check if schema migration has already been completed\n // We use the presence of snake_case columns as a marker\n let schemaAlreadyMigrated = false;\n try {\n const migrationCheck = await db.execute(sql`\n SELECT column_name FROM information_schema.columns\n WHERE table_schema = 'public'\n AND table_name = 'rooms'\n AND column_name = 'agent_id'\n `);\n\n if (migrationCheck.rows && migrationCheck.rows.length > 0) {\n // Migration already completed - rooms.agent_id exists (snake_case)\n schemaAlreadyMigrated = true;\n logger.debug(\"[Migration] ⊘ Schema already migrated (snake_case columns exist)\");\n }\n } catch {\n // Table might not exist yet, continue with migration\n logger.debug(\"[Migration] → rooms table not found, will be created by RuntimeMigrator\");\n return; // Let RuntimeMigrator create fresh tables\n }\n\n // If schema is already migrated, check if we need to clean up RLS\n // Only disable RLS if ENABLE_DATA_ISOLATION is NOT true (user disabled isolation)\n // If ENABLE_DATA_ISOLATION=true, keep RLS as-is - migration-service.ts will ensure proper config\n if (schemaAlreadyMigrated) {\n const dataIsolationEnabled = process.env.ENABLE_DATA_ISOLATION === \"true\";\n\n if (dataIsolationEnabled) {\n // RLS should stay enabled - no need to disable/re-enable cycle\n // migration-service.ts ensures RLS is properly configured via idempotent calls\n logger.debug(\"[Migration] ⊘ Schema already migrated, RLS enabled - nothing to do\");\n return;\n }\n\n // User disabled data isolation - clean up RLS if it was previously enabled\n logger.debug(\"[Migration] → Schema migrated but RLS disabled, cleaning up...\");\n\n try {\n const tablesWithRls = await db.execute(sql`\n SELECT c.relname as tablename\n FROM pg_class c\n JOIN pg_namespace n ON n.oid = c.relnamespace\n WHERE n.nspname = 'public'\n AND c.relkind = 'r'\n AND c.relrowsecurity = true\n ORDER BY c.relname\n `);\n\n if (tablesWithRls.rows && tablesWithRls.rows.length > 0) {\n for (const row of tablesWithRls.rows) {\n const tableName = row.tablename as string;\n try {\n await db.execute(sql.raw(`ALTER TABLE \"${tableName}\" DISABLE ROW LEVEL SECURITY`));\n } catch {\n // Ignore errors\n }\n }\n logger.debug(`[Migration] ✓ RLS cleanup completed (${tablesWithRls.rows.length} tables)`);\n } else {\n logger.debug(\"[Migration] ⊘ No tables with RLS to clean up\");\n }\n } catch {\n logger.debug(\"[Migration] ⊘ Could not perform RLS cleanup\");\n }\n\n return;\n }\n\n logger.info(\"[Migration] Starting pre-1.6.5 → 1.6.5+ schema migration...\");\n\n try {\n // Clear RuntimeMigrator snapshot cache to force fresh introspection\n // This ensures the snapshot matches the current database state after our migrations\n logger.debug(\"[Migration] → Clearing RuntimeMigrator snapshot cache...\");\n try {\n await db.execute(\n sql`DELETE FROM migrations._snapshots WHERE plugin_name = '@elizaos/plugin-sql'`\n );\n logger.debug(\"[Migration] ✓ Snapshot cache cleared\");\n } catch (_error) {\n // If migrations schema is absent, there is no cache to clear.\n logger.debug(\"[Migration] ⊘ No snapshot cache to clear (migrations schema absent)\");\n }\n\n // Disable RLS only on tables that have it enabled\n // RLS will be re-implemented properly later\n logger.debug(\"[Migration] → Checking for Row Level Security to disable...\");\n try {\n const tablesWithRls = await db.execute(sql`\n SELECT c.relname as tablename\n FROM pg_class c\n JOIN pg_namespace n ON n.oid = c.relnamespace\n WHERE n.nspname = 'public'\n AND c.relkind = 'r'\n AND c.relrowsecurity = true\n ORDER BY c.relname\n `);\n\n if (tablesWithRls.rows && tablesWithRls.rows.length > 0) {\n for (const row of tablesWithRls.rows) {\n const tableName = row.tablename as string;\n try {\n await db.execute(sql.raw(`ALTER TABLE \"${tableName}\" DISABLE ROW LEVEL SECURITY`));\n logger.debug(`[Migration] ✓ Disabled RLS on ${tableName}`);\n } catch (_error) {\n logger.debug(`[Migration] ⊘ Could not disable RLS on ${tableName}`);\n }\n }\n } else {\n logger.debug(\"[Migration] ⊘ No tables with RLS enabled\");\n }\n } catch (_error) {\n logger.debug(\"[Migration] ⊘ Could not check RLS (may not have permissions)\");\n }\n\n // Special handling for tables where serverId/server_id needs to become message_server_id\n // v1.6.4 had: rooms.serverId (TEXT camelCase), worlds.serverId (TEXT camelCase), channels.server_id (UUID)\n // Current: message_server_id (UUID) in all tables\n //\n // STRATEGY: Rename serverId/server_id to message_server_id preserving data\n logger.debug(\"[Migration] → Handling serverId/server_id → message_server_id migrations...\");\n\n const tablesToMigrate = [\"channels\", \"worlds\", \"rooms\"];\n\n for (const tableName of tablesToMigrate) {\n try {\n // Check for both camelCase (serverId) and snake_case (server_id) columns\n const columnsResult = await db.execute(sql`\n SELECT column_name, data_type, is_nullable\n FROM information_schema.columns\n WHERE table_schema = 'public'\n AND table_name = ${tableName}\n AND column_name IN ('server_id', 'serverId', 'message_server_id')\n ORDER BY column_name\n `);\n\n const columns = getRows<ColumnInfoRow>(columnsResult);\n const serverIdSnake = columns.find((c) => c.column_name === \"server_id\");\n const serverIdCamel = columns.find((c) => c.column_name === \"serverId\");\n const messageServerId = columns.find((c) => c.column_name === \"message_server_id\");\n\n // Use whichever old column exists (prefer snake_case for channels)\n const serverId = serverIdSnake || serverIdCamel;\n const oldColumnName = serverIdSnake ? \"server_id\" : \"serverId\";\n\n if (serverId && !messageServerId) {\n // Old column exists → rename it to message_server_id\n logger.debug(\n `[Migration] → Renaming ${tableName}.${oldColumnName} to message_server_id...`\n );\n await db.execute(\n sql.raw(\n `ALTER TABLE \"${tableName}\" RENAME COLUMN \"${oldColumnName}\" TO \"message_server_id\"`\n )\n );\n logger.debug(`[Migration] ✓ Renamed ${tableName}.${oldColumnName} → message_server_id`);\n\n // If the column was text, try to convert to UUID (if data is UUID-compatible)\n if (serverId.data_type === \"text\") {\n // CRITICAL: Drop DEFAULT constraint before type conversion\n // This prevents \"default for column cannot be cast automatically\" errors\n // Wrap in separate try-catch to ensure we continue even if no default exists\n try {\n logger.debug(\n `[Migration] → Dropping DEFAULT constraint on ${tableName}.message_server_id...`\n );\n await db.execute(\n sql.raw(`ALTER TABLE \"${tableName}\" ALTER COLUMN \"message_server_id\" DROP DEFAULT`)\n );\n logger.debug(`[Migration] ✓ Dropped DEFAULT constraint`);\n } catch {\n logger.debug(\n `[Migration] ⊘ No DEFAULT constraint to drop on ${tableName}.message_server_id`\n );\n }\n\n try {\n logger.debug(\n `[Migration] → Converting ${tableName}.message_server_id from text to uuid...`\n );\n // Use robust conversion: valid UUIDs are cast directly, others get md5 hash\n // This handles: empty strings, non-UUID text, uppercase UUIDs, NULL values\n await db.execute(\n sql.raw(`\n ALTER TABLE \"${tableName}\"\n ALTER COLUMN \"message_server_id\" TYPE uuid\n USING CASE\n WHEN \"message_server_id\" IS NULL THEN NULL\n WHEN \"message_server_id\" = '' THEN NULL\n WHEN \"message_server_id\" ~ '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$'\n THEN \"message_server_id\"::uuid\n ELSE md5(\"message_server_id\")::uuid\n END\n `)\n );\n logger.debug(`[Migration] ✓ Converted ${tableName}.message_server_id to uuid`);\n } catch (convertError) {\n logger.warn(\n `[Migration] ⚠️ Could not convert ${tableName}.message_server_id to uuid: ${convertError}`\n );\n }\n }\n\n // If the column should be NOT NULL but has NULLs, we need to handle that\n // For channels, it's NOT NULL in the new schema\n if (tableName === \"channels\") {\n const nullCountResult = await db.execute(\n sql.raw(\n `SELECT COUNT(*) as count FROM \"${tableName}\" WHERE \"message_server_id\" IS NULL`\n )\n );\n const nullCount = nullCountResult.rows[0]?.count as string | undefined;\n if (nullCount && parseInt(nullCount, 10) > 0) {\n logger.warn(\n `[Migration] ⚠️ ${tableName} has ${nullCount} rows with NULL message_server_id - these will be deleted`\n );\n await db.execute(\n sql.raw(`DELETE FROM \"${tableName}\" WHERE \"message_server_id\" IS NULL`)\n );\n logger.debug(\n `[Migration] ✓ Deleted ${nullCount} rows with NULL message_server_id from ${tableName}`\n );\n }\n\n // Make it NOT NULL\n logger.debug(`[Migration] → Making ${tableName}.message_server_id NOT NULL...`);\n await db.execute(\n sql.raw(`ALTER TABLE \"${tableName}\" ALTER COLUMN \"message_server_id\" SET NOT NULL`)\n );\n logger.debug(`[Migration] ✓ Set ${tableName}.message_server_id NOT NULL`);\n }\n } else if (serverId && messageServerId) {\n // Both exist → just drop the old column\n logger.debug(`[Migration] → ${tableName} has both columns, dropping ${oldColumnName}...`);\n await db.execute(\n sql.raw(`ALTER TABLE \"${tableName}\" DROP COLUMN \"${oldColumnName}\" CASCADE`)\n );\n logger.debug(`[Migration] ✓ Dropped ${tableName}.${oldColumnName}`);\n } else if (!serverId && messageServerId) {\n // Only message_server_id exists - check if it needs type conversion from TEXT to UUID\n // This handles idempotency when migration partially ran before rollback\n if (messageServerId.data_type === \"text\") {\n logger.debug(\n `[Migration] → ${tableName}.message_server_id exists but is TEXT, needs UUID conversion...`\n );\n\n // CRITICAL: Drop DEFAULT constraint before type conversion\n // This prevents \"default for column cannot be cast automatically\" errors\n logger.debug(\n `[Migration] → Dropping DEFAULT constraint on ${tableName}.message_server_id...`\n );\n await db.execute(\n sql.raw(`ALTER TABLE \"${tableName}\" ALTER COLUMN \"message_server_id\" DROP DEFAULT`)\n );\n logger.debug(`[Migration] ✓ Dropped DEFAULT constraint`);\n\n // Convert TEXT to UUID using MD5 hash for non-UUID text values\n // This creates deterministic UUIDs from text values, preserving data\n logger.debug(\n `[Migration] → Converting ${tableName}.message_server_id from text to uuid (generating UUIDs from text)...`\n );\n await db.execute(\n sql.raw(`\n ALTER TABLE \"${tableName}\"\n ALTER COLUMN \"message_server_id\" TYPE uuid\n USING CASE\n WHEN \"message_server_id\" ~ '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$'\n THEN \"message_server_id\"::uuid\n ELSE md5(\"message_server_id\")::uuid\n END\n `)\n );\n logger.debug(`[Migration] ✓ Converted ${tableName}.message_server_id to uuid`);\n } else {\n logger.debug(`[Migration] ⊘ ${tableName}.message_server_id already UUID, skipping`);\n }\n } else {\n logger.debug(`[Migration] ⊘ ${tableName} already migrated, skipping`);\n }\n } catch (error) {\n logger.warn(`[Migration] ⚠️ Error migrating ${tableName}.server_id: ${error}`);\n }\n }\n\n // Drop ALL remaining server_id columns (will be re-added by RLS after migrations)\n // This prevents RuntimeMigrator from seeing them and trying to drop them\n // EXCEPT for tables where server_id is part of the schema (like agents, server_agents)\n logger.debug(\"[Migration] → Dropping all remaining RLS-managed server_id columns...\");\n try {\n const serverIdColumnsResult = await db.execute(sql`\n SELECT table_name\n FROM information_schema.columns\n WHERE table_schema = 'public'\n AND column_name = 'server_id'\n AND table_name NOT IN (\n 'servers', -- server_id is the primary key\n 'agents', -- server_id is in the schema (for RLS)\n 'channels', -- already handled above\n 'worlds', -- already handled above\n 'rooms', -- already handled above\n 'server_agents', -- server_id is part of composite key\n 'drizzle_migrations',\n '__drizzle_migrations'\n )\n ORDER BY table_name\n `);\n\n const tablesToClean = serverIdColumnsResult.rows || [];\n logger.debug(`[Migration] → Found ${tablesToClean.length} tables with server_id columns`);\n\n for (const row of tablesToClean) {\n const tableName = row.table_name as string;\n try {\n await db.execute(\n sql.raw(`ALTER TABLE \"${tableName}\" DROP COLUMN IF EXISTS server_id CASCADE`)\n );\n logger.debug(`[Migration] ✓ Dropped server_id from ${tableName}`);\n } catch (_error) {\n logger.debug(`[Migration] ⊘ Could not drop server_id from ${tableName}`);\n }\n }\n } catch (_error) {\n logger.debug(\"[Migration] ⊘ Could not drop server_id columns (may not have permissions)\");\n }\n\n // Special handling for agents table: rename owner_id → server_id\n // v1.6.4 had owner_id, v1.6.5 changed it to server_id\n logger.debug(\"[Migration] → Checking agents.owner_id → server_id rename...\");\n try {\n const agentsColumnsResult = await db.execute(sql`\n SELECT column_name\n FROM information_schema.columns\n WHERE table_schema = 'public'\n AND table_name = 'agents'\n AND column_name IN ('owner_id', 'server_id')\n ORDER BY column_name\n `);\n\n const agentsColumns = getRows<ColumnInfoRow>(agentsColumnsResult);\n const hasOwnerId = agentsColumns.some((c) => c.column_name === \"owner_id\");\n const hasServerId = agentsColumns.some((c) => c.column_name === \"server_id\");\n\n if (hasOwnerId && !hasServerId) {\n // Rename owner_id → server_id\n logger.debug(\"[Migration] → Renaming agents.owner_id to server_id...\");\n await db.execute(sql.raw(`ALTER TABLE \"agents\" RENAME COLUMN \"owner_id\" TO \"server_id\"`));\n logger.debug(\"[Migration] ✓ Renamed agents.owner_id → server_id\");\n } else if (hasOwnerId && hasServerId) {\n // Both exist - drop owner_id (data should be in server_id)\n logger.debug(\"[Migration] → Both owner_id and server_id exist, dropping owner_id...\");\n await db.execute(sql.raw(`ALTER TABLE \"agents\" DROP COLUMN \"owner_id\" CASCADE`));\n logger.debug(\"[Migration] ✓ Dropped agents.owner_id\");\n } else {\n logger.debug(\"[Migration] ⊘ agents table already has server_id (or no owner_id), skipping\");\n }\n } catch (_error) {\n logger.debug(\"[Migration] ⊘ Could not check/migrate agents.owner_id\");\n }\n\n // Migrate data from obsolete 'owners' table to 'servers' (if owners exists)\n // v1.6.4 used owners table, v1.6.5+ uses servers table\n logger.debug(\"[Migration] → Checking for owners → servers data migration...\");\n try {\n const ownersTableResult = await db.execute(sql`\n SELECT table_name\n FROM information_schema.tables\n WHERE table_schema = 'public'\n AND table_name = 'owners'\n `);\n\n if (ownersTableResult.rows && ownersTableResult.rows.length > 0) {\n // First, ensure servers table exists\n logger.debug(\"[Migration] → Ensuring servers table exists...\");\n await db.execute(\n sql.raw(`\n CREATE TABLE IF NOT EXISTS \"servers\" (\n \"id\" uuid PRIMARY KEY,\n \"created_at\" timestamp with time zone DEFAULT now() NOT NULL,\n \"updated_at\" timestamp with time zone DEFAULT now() NOT NULL\n )\n `)\n );\n\n // Migrate data from owners to servers (if any)\n logger.debug(\"[Migration] → Migrating owners data to servers...\");\n await db.execute(\n sql.raw(`\n INSERT INTO \"servers\" (\"id\", \"created_at\", \"updated_at\")\n SELECT \"id\", COALESCE(\"created_at\", now()), COALESCE(\"updated_at\", now())\n FROM \"owners\"\n ON CONFLICT (\"id\") DO NOTHING\n `)\n );\n logger.debug(\"[Migration] ✓ Migrated owners data to servers\");\n\n // Now safe to drop owners table\n logger.debug(\"[Migration] → Dropping obsolete owners table...\");\n await db.execute(sql.raw(`DROP TABLE IF EXISTS \"owners\" CASCADE`));\n logger.debug(\"[Migration] ✓ Dropped obsolete owners table\");\n } else {\n logger.debug(\"[Migration] ⊘ owners table not found, skipping\");\n }\n } catch (error) {\n logger.warn(`[Migration] ⚠️ Could not migrate owners → servers: ${error}`);\n }\n\n // Special handling for server_agents → message_server_agents rename\n // This aligns with the server_id → message_server_id naming convention\n logger.debug(\"[Migration] → Checking server_agents table rename...\");\n try {\n const tablesResult = await db.execute(sql`\n SELECT table_name\n FROM information_schema.tables\n WHERE table_schema = 'public'\n AND table_name IN ('server_agents', 'message_server_agents')\n ORDER BY table_name\n `);\n\n const tables = getRows<TableInfoRow>(tablesResult);\n const hasServerAgents = tables.some((t) => t.table_name === \"server_agents\");\n const hasMessageServerAgents = tables.some((t) => t.table_name === \"message_server_agents\");\n\n if (hasServerAgents && !hasMessageServerAgents) {\n // Rename server_agents → message_server_agents\n logger.debug(\"[Migration] → Renaming server_agents to message_server_agents...\");\n await db.execute(sql.raw(`ALTER TABLE \"server_agents\" RENAME TO \"message_server_agents\"`));\n logger.debug(\"[Migration] ✓ Renamed server_agents → message_server_agents\");\n\n // Now rename server_id column → message_server_id\n logger.debug(\n \"[Migration] → Renaming message_server_agents.server_id to message_server_id...\"\n );\n await db.execute(\n sql.raw(\n `ALTER TABLE \"message_server_agents\" RENAME COLUMN \"server_id\" TO \"message_server_id\"`\n )\n );\n logger.debug(\"[Migration] ✓ Renamed message_server_agents.server_id → message_server_id\");\n } else if (!hasServerAgents && !hasMessageServerAgents) {\n // Neither table exists - RuntimeMigrator will create message_server_agents\n logger.debug(\"[Migration] ⊘ No server_agents table to migrate\");\n } else if (hasMessageServerAgents) {\n // Check if it has the columns and rename if needed\n logger.debug(\"[Migration] → Checking message_server_agents columns...\");\n const columnsResult = await db.execute(sql`\n SELECT column_name\n FROM information_schema.columns\n WHERE table_schema = 'public'\n AND table_name = 'message_server_agents'\n AND column_name IN ('server_id', 'message_server_id')\n ORDER BY column_name\n `);\n\n const columns = getRows<ColumnInfoRow>(columnsResult);\n const hasServerId = columns.some((c) => c.column_name === \"server_id\");\n const hasMessageServerId = columns.some((c) => c.column_name === \"message_server_id\");\n\n if (hasServerId && !hasMessageServerId) {\n // Rename server_id → message_server_id\n logger.debug(\n \"[Migration] → Renaming message_server_agents.server_id to message_server_id...\"\n );\n await db.execute(\n sql.raw(\n `ALTER TABLE \"message_server_agents\" RENAME COLUMN \"server_id\" TO \"message_server_id\"`\n )\n );\n logger.debug(\"[Migration] ✓ Renamed message_server_agents.server_id → message_server_id\");\n } else if (!hasServerId && !hasMessageServerId) {\n // Table exists but doesn't have either column - truncate it\n logger.debug(\n \"[Migration] → message_server_agents exists without required columns, truncating...\"\n );\n await db.execute(sql`TRUNCATE TABLE message_server_agents CASCADE`);\n logger.debug(\"[Migration] ✓ Truncated message_server_agents\");\n } else {\n logger.debug(\"[Migration] ⊘ message_server_agents already has correct schema\");\n }\n }\n } catch (_error) {\n logger.debug(\"[Migration] ⊘ Could not check/migrate server_agents table\");\n }\n\n // Special handling for channel_participants: rename userId → entityId\n // This handles the migration from the old userId column to the new entityId column\n logger.debug(\"[Migration] → Checking channel_participants table...\");\n try {\n const columnsResult = await db.execute(sql`\n SELECT column_name\n FROM information_schema.columns\n WHERE table_schema = 'public'\n AND table_name = 'channel_participants'\n AND column_name IN ('user_id', 'entity_id')\n ORDER BY column_name\n `);\n\n const columns = getRows<ColumnInfoRow>({\n rows: columnsResult.rows || [],\n });\n const hasUserId = columns.some((c) => c.column_name === \"user_id\");\n const hasEntityId = columns.some((c) => c.column_name === \"entity_id\");\n\n if (hasUserId && !hasEntityId) {\n // Rename user_id → entity_id\n logger.debug(\"[Migration] → Renaming channel_participants.user_id to entity_id...\");\n await db.execute(\n sql.raw(`ALTER TABLE \"channel_participants\" RENAME COLUMN \"user_id\" TO \"entity_id\"`)\n );\n logger.debug(\"[Migration] ✓ Renamed channel_participants.user_id → entity_id\");\n } else if (!hasUserId && !hasEntityId) {\n // Table exists but has neither column - truncate it so RuntimeMigrator can add entity_id\n logger.debug(\n \"[Migration] → channel_participants exists without entity_id or user_id, truncating...\"\n );\n await db.execute(sql`TRUNCATE TABLE channel_participants CASCADE`);\n logger.debug(\"[Migration] ✓ Truncated channel_participants\");\n } else {\n logger.debug(\"[Migration] ⊘ channel_participants already has entity_id column\");\n }\n } catch (_error) {\n logger.debug(\"[Migration] ⊘ Could not check/migrate channel_participants\");\n }\n\n // Drop ALL regular indexes (not PK or unique constraints) to avoid conflicts\n // The RuntimeMigrator will recreate them based on the schema\n logger.debug(\"[Migration] → Discovering and dropping all regular indexes...\");\n try {\n const indexesResult = await db.execute(sql`\n SELECT i.relname AS index_name\n FROM pg_index idx\n JOIN pg_class i ON i.oid = idx.indexrelid\n JOIN pg_class c ON c.oid = idx.indrelid\n JOIN pg_namespace n ON n.oid = c.relnamespace\n LEFT JOIN pg_constraint con ON con.conindid = idx.indexrelid\n WHERE n.nspname = 'public'\n AND NOT idx.indisprimary -- Not a primary key\n AND con.contype IS NULL -- Not a constraint (unique, etc)\n ORDER BY i.relname\n `);\n\n const indexesToDrop = indexesResult.rows || [];\n logger.debug(`[Migration] → Found ${indexesToDrop.length} indexes to drop`);\n\n for (const row of indexesToDrop) {\n const indexName = row.index_name as string;\n try {\n await db.execute(sql.raw(`DROP INDEX IF EXISTS \"${indexName}\"`));\n logger.debug(`[Migration] ✓ Dropped index ${indexName}`);\n } catch (_error) {\n logger.debug(`[Migration] ⊘ Could not drop index ${indexName}`);\n }\n }\n } catch (_error) {\n logger.debug(\"[Migration] ⊘ Could not drop indexes (may not have permissions)\");\n }\n\n // =========================================================================\n // SMOOTH MIGRATION: camelCase → snake_case column renames\n // This ensures a non-destructive transition from v1.6.4 to v1.6.5+\n // All data is preserved through RENAME COLUMN operations\n // This section can be removed once all deployments have been migrated\n // =========================================================================\n logger.debug(\"[Migration] → Starting camelCase → snake_case column renames...\");\n\n const columnRenames = [\n // rooms table\n { table: \"rooms\", from: \"agentId\", to: \"agent_id\" },\n { table: \"rooms\", from: \"worldId\", to: \"world_id\" },\n { table: \"rooms\", from: \"channelId\", to: \"channel_id\" },\n { table: \"rooms\", from: \"createdAt\", to: \"created_at\" },\n\n // worlds table\n { table: \"worlds\", from: \"agentId\", to: \"agent_id\" },\n { table: \"worlds\", from: \"createdAt\", to: \"created_at\" },\n\n // memories table\n { table: \"memories\", from: \"createdAt\", to: \"created_at\" },\n { table: \"memories\", from: \"entityId\", to: \"entity_id\" },\n { table: \"memories\", from: \"agentId\", to: \"agent_id\" },\n { table: \"memories\", from: \"roomId\", to: \"room_id\" },\n { table: \"memories\", from: \"worldId\", to: \"world_id\" },\n\n // components table\n { table: \"components\", from: \"entityId\", to: \"entity_id\" },\n { table: \"components\", from: \"agentId\", to: \"agent_id\" },\n { table: \"components\", from: \"roomId\", to: \"room_id\" },\n { table: \"components\", from: \"worldId\", to: \"world_id\" },\n { table: \"components\", from: \"sourceEntityId\", to: \"source_entity_id\" },\n { table: \"components\", from: \"createdAt\", to: \"created_at\" },\n\n // participants table\n { table: \"participants\", from: \"entityId\", to: \"entity_id\" },\n { table: \"participants\", from: \"roomId\", to: \"room_id\" },\n { table: \"participants\", from: \"agentId\", to: \"agent_id\" },\n { table: \"participants\", from: \"roomState\", to: \"room_state\" },\n { table: \"participants\", from: \"createdAt\", to: \"created_at\" },\n\n // relationships table\n {\n table: \"relationships\",\n from: \"sourceEntityId\",\n to: \"source_entity_id\",\n },\n {\n table: \"relationships\",\n from: \"targetEntityId\",\n to: \"target_entity_id\",\n },\n { table: \"relationships\", from: \"agentId\", to: \"agent_id\" },\n { table: \"relationships\", from: \"createdAt\", to: \"created_at\" },\n\n // logs table\n { table: \"logs\", from: \"entityId\", to: \"entity_id\" },\n { table: \"logs\", from: \"roomId\", to: \"room_id\" },\n { table: \"logs\", from: \"createdAt\", to: \"created_at\" },\n\n // tasks table\n { table: \"tasks\", from: \"roomId\", to: \"room_id\" },\n { table: \"tasks\", from: \"worldId\", to: \"world_id\" },\n { table: \"tasks\", from: \"entityId\", to: \"entity_id\" },\n { table: \"tasks\", from: \"createdAt\", to: \"created_at\" },\n { table: \"tasks\", from: \"updatedAt\", to: \"updated_at\" },\n\n // agents table\n { table: \"agents\", from: \"createdAt\", to: \"created_at\" },\n { table: \"agents\", from: \"updatedAt\", to: \"updated_at\" },\n\n // entities table\n { table: \"entities\", from: \"agentId\", to: \"agent_id\" },\n { table: \"entities\", from: \"createdAt\", to: \"created_at\" },\n\n // embeddings table\n { table: \"embeddings\", from: \"memoryId\", to: \"memory_id\" },\n { table: \"embeddings\", from: \"createdAt\", to: \"created_at\" },\n\n // cache table\n { table: \"cache\", from: \"agentId\", to: \"agent_id\" },\n { table: \"cache\", from: \"createdAt\", to: \"created_at\" },\n { table: \"cache\", from: \"expiresAt\", to: \"expires_at\" },\n ];\n\n for (const rename of columnRenames) {\n try {\n // Check if table exists first\n const tableExistsResult = await db.execute(sql`\n SELECT 1 FROM information_schema.tables\n WHERE table_schema = 'public' AND table_name = ${rename.table}\n `);\n\n if (!tableExistsResult.rows || tableExistsResult.rows.length === 0) {\n // Table doesn't exist yet, skip\n continue;\n }\n\n // Check which columns exist\n const columnsResult = await db.execute(sql`\n SELECT column_name\n FROM information_schema.columns\n WHERE table_schema = 'public'\n AND table_name = ${rename.table}\n AND column_name IN (${rename.from}, ${rename.to})\n ORDER BY column_name\n `);\n\n const columns = getRows<ColumnInfoRow>(columnsResult);\n const hasOldColumn = columns.some((c) => c.column_name === rename.from);\n const hasNewColumn = columns.some((c) => c.column_name === rename.to);\n\n if (hasOldColumn && !hasNewColumn) {\n // Old column exists, new doesn't → RENAME (preserves data!)\n logger.debug(`[Migration] → Renaming ${rename.table}.${rename.from} to ${rename.to}...`);\n await db.execute(\n sql.raw(\n `ALTER TABLE \"${rename.table}\" RENAME COLUMN \"${rename.from}\" TO \"${rename.to}\"`\n )\n );\n logger.debug(`[Migration] ✓ Renamed ${rename.table}.${rename.from} → ${rename.to}`);\n } else if (hasOldColumn && hasNewColumn) {\n // Both exist → drop old (data should be in new already)\n logger.debug(\n `[Migration] → Both columns exist, dropping ${rename.table}.${rename.from}...`\n );\n await db.execute(\n sql.raw(`ALTER TABLE \"${rename.table}\" DROP COLUMN \"${rename.from}\" CASCADE`)\n );\n logger.debug(`[Migration] ✓ Dropped ${rename.table}.${rename.from}`);\n }\n // If only new column exists or neither exists, nothing to do\n } catch (error) {\n // Log but continue - table might not exist yet or column might already be renamed\n logger.debug(`[Migration] ⊘ Could not process ${rename.table}.${rename.from}: ${error}`);\n }\n }\n\n logger.debug(\"[Migration] ✓ Completed camelCase → snake_case column renames\");\n\n logger.info(\"[Migration] ✓ Migration complete - pre-1.6.5 → 1.6.5+ schema migration finished\");\n } catch (error) {\n // Re-throw errors to prevent RuntimeMigrator from running on broken state\n logger.error(\"[Migration] Migration failed:\", String(error));\n throw error;\n }\n}\n",
9
+ "import { type IDatabaseAdapter, logger, validateUuid } from \"@elizaos/core\";\nimport { eq, sql } from \"drizzle-orm\";\nimport { agentTable } from \"./schema/agent\";\nimport { serverTable } from \"./schema/server\";\nimport { getDb } from \"./types\";\n\nexport async function installRLSFunctions(adapter: IDatabaseAdapter): Promise<void> {\n const db = getDb(adapter);\n\n await db.execute(sql`\n CREATE TABLE IF NOT EXISTS servers (\n id UUID PRIMARY KEY,\n created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,\n updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL\n )\n `);\n\n await db.execute(sql`\n CREATE OR REPLACE FUNCTION current_server_id() RETURNS UUID AS $$\n DECLARE\n app_name TEXT;\n BEGIN\n app_name := NULLIF(current_setting('application_name', TRUE), '');\n\n BEGIN\n RETURN app_name::UUID;\n EXCEPTION WHEN OTHERS THEN\n RETURN NULL;\n END;\n END;\n $$ LANGUAGE plpgsql STABLE;\n `);\n\n await db.execute(sql`\n CREATE OR REPLACE FUNCTION add_server_isolation(\n schema_name text,\n table_name text\n ) RETURNS void AS $$\n DECLARE\n full_table_name text;\n column_exists boolean;\n orphaned_count bigint;\n BEGIN\n full_table_name := schema_name || '.' || table_name;\n\n SELECT EXISTS (\n SELECT 1 FROM information_schema.columns\n WHERE information_schema.columns.table_schema = schema_name\n AND information_schema.columns.table_name = add_server_isolation.table_name\n AND information_schema.columns.column_name = 'server_id'\n ) INTO column_exists;\n\n IF NOT column_exists THEN\n EXECUTE format('ALTER TABLE %I.%I ADD COLUMN server_id UUID DEFAULT current_server_id()', schema_name, table_name);\n EXECUTE format('UPDATE %I.%I SET server_id = current_server_id() WHERE server_id IS NULL', schema_name, table_name);\n ELSE\n EXECUTE format('ALTER TABLE %I.%I ALTER COLUMN server_id SET DEFAULT current_server_id()', schema_name, table_name);\n EXECUTE format('SELECT COUNT(*) FROM %I.%I WHERE server_id IS NULL', schema_name, table_name) INTO orphaned_count;\n\n IF orphaned_count > 0 THEN\n RAISE NOTICE 'Backfilling % rows with NULL server_id in %.%', orphaned_count, schema_name, table_name;\n EXECUTE format('UPDATE %I.%I SET server_id = current_server_id() WHERE server_id IS NULL', schema_name, table_name);\n END IF;\n END IF;\n\n EXECUTE format('CREATE INDEX IF NOT EXISTS idx_%I_server_id ON %I.%I(server_id)', table_name, schema_name, table_name);\n EXECUTE format('ALTER TABLE %I.%I ENABLE ROW LEVEL SECURITY', schema_name, table_name);\n EXECUTE format('ALTER TABLE %I.%I FORCE ROW LEVEL SECURITY', schema_name, table_name);\n EXECUTE format('DROP POLICY IF EXISTS server_isolation_policy ON %I.%I', schema_name, table_name);\n EXECUTE format('\n CREATE POLICY server_isolation_policy ON %I.%I\n USING (server_id = current_server_id())\n WITH CHECK (server_id = current_server_id())\n ', schema_name, table_name);\n END;\n $$ LANGUAGE plpgsql;\n `);\n\n await db.execute(sql`\n CREATE OR REPLACE FUNCTION apply_rls_to_all_tables() RETURNS void AS $$\n DECLARE\n tbl record;\n BEGIN\n FOR tbl IN\n SELECT schemaname, tablename\n FROM pg_tables\n WHERE schemaname = 'public'\n AND tablename NOT IN (\n 'servers',\n 'drizzle_migrations',\n '__drizzle_migrations'\n )\n LOOP\n BEGIN\n PERFORM add_server_isolation(tbl.schemaname, tbl.tablename);\n EXCEPTION WHEN OTHERS THEN\n RAISE WARNING 'Failed to apply RLS to %.%: %', tbl.schemaname, tbl.tablename, SQLERRM;\n END;\n END LOOP;\n END;\n $$ LANGUAGE plpgsql;\n `);\n\n logger.info({ src: \"plugin:sql\" }, \"RLS PostgreSQL functions installed\");\n await installEntityRLS(adapter);\n}\n\nexport async function getOrCreateRlsServer(\n adapter: IDatabaseAdapter,\n serverId: string\n): Promise<string> {\n const db = getDb(adapter);\n\n // Use Drizzle's insert with onConflictDoNothing\n await db\n .insert(serverTable)\n .values({\n id: serverId,\n })\n .onConflictDoNothing();\n\n logger.info({ src: \"plugin:sql\", serverId: serverId.slice(0, 8) }, \"RLS server registered\");\n return serverId;\n}\n\nexport async function setServerContext(adapter: IDatabaseAdapter, serverId: string): Promise<void> {\n if (!validateUuid(serverId)) {\n throw new Error(`Invalid server ID format: ${serverId}. Must be a valid UUID.`);\n }\n\n const db = getDb(adapter);\n const servers = await db.select().from(serverTable).where(eq(serverTable.id, serverId));\n\n if (servers.length === 0) {\n throw new Error(`Server ${serverId} does not exist`);\n }\n\n logger.info({ src: \"plugin:sql\", serverId: serverId.slice(0, 8) }, \"RLS context configured\");\n}\n\nexport async function assignAgentToServer(\n adapter: IDatabaseAdapter,\n agentId: string,\n serverId: string\n): Promise<void> {\n if (!agentId || !serverId) {\n logger.warn(\n `[Data Isolation] Cannot assign agent to server: invalid agentId (${agentId}) or serverId (${serverId})`\n );\n return;\n }\n\n const db = getDb(adapter);\n\n // Check if agent exists using Drizzle\n const agents = await db.select().from(agentTable).where(eq(agentTable.id, agentId));\n\n if (agents.length > 0) {\n const agent = agents[0];\n const currentServerId = agent.server_id;\n\n if (currentServerId === serverId) {\n logger.debug(\n { src: \"plugin:sql\", agentName: agent.name },\n \"Agent already assigned to correct server\"\n );\n } else {\n // Update agent server using Drizzle\n await db.update(agentTable).set({ server_id: serverId }).where(eq(agentTable.id, agentId));\n\n if (currentServerId === null) {\n logger.info({ src: \"plugin:sql\", agentName: agent.name }, \"Agent assigned to server\");\n } else {\n logger.warn({ src: \"plugin:sql\", agentName: agent.name }, \"Agent server changed\");\n }\n }\n } else {\n logger.debug({ src: \"plugin:sql\", agentId }, \"Agent does not exist yet\");\n }\n}\n\n/**\n * Apply RLS to all tables by calling PostgreSQL function\n */\nexport async function applyRLSToNewTables(adapter: IDatabaseAdapter): Promise<void> {\n const db = getDb(adapter);\n\n try {\n await db.execute(sql`SELECT apply_rls_to_all_tables()`);\n logger.info({ src: \"plugin:sql\" }, \"RLS applied to all tables\");\n } catch (error) {\n logger.warn({ src: \"plugin:sql\", error: String(error) }, \"Failed to apply RLS to some tables\");\n }\n}\n\nexport async function uninstallRLS(adapter: IDatabaseAdapter): Promise<void> {\n const db = getDb(adapter);\n\n try {\n const checkResult = await db.execute(sql`\n SELECT EXISTS (\n SELECT FROM pg_tables\n WHERE schemaname = 'public' AND tablename = 'servers'\n ) as rls_enabled\n `);\n\n const rlsEnabled = checkResult.rows[0]?.rls_enabled;\n\n if (!rlsEnabled) {\n logger.debug({ src: \"plugin:sql\" }, \"RLS not installed, skipping cleanup\");\n return;\n }\n\n logger.info(\n { src: \"plugin:sql\" },\n \"Disabling RLS globally (keeping server_id columns for schema compatibility)...\"\n );\n\n try {\n await uninstallEntityRLS(adapter);\n } catch (_entityRlsError) {\n logger.debug(\n { src: \"plugin:sql\" },\n \"Entity RLS cleanup skipped (not installed or already cleaned)\"\n );\n }\n\n await db.execute(sql`\n CREATE OR REPLACE FUNCTION _temp_disable_rls_on_table(\n p_schema_name text,\n p_table_name text\n ) RETURNS void AS $$\n DECLARE\n policy_rec record;\n BEGIN\n -- Drop all policies on this table\n FOR policy_rec IN\n SELECT policyname\n FROM pg_policies\n WHERE schemaname = p_schema_name AND tablename = p_table_name\n LOOP\n EXECUTE format('DROP POLICY IF EXISTS %I ON %I.%I',\n policy_rec.policyname, p_schema_name, p_table_name);\n END LOOP;\n\n -- Disable RLS\n EXECUTE format('ALTER TABLE %I.%I NO FORCE ROW LEVEL SECURITY', p_schema_name, p_table_name);\n EXECUTE format('ALTER TABLE %I.%I DISABLE ROW LEVEL SECURITY', p_schema_name, p_table_name);\n END;\n $$ LANGUAGE plpgsql;\n `);\n\n const tablesResult = await db.execute(sql`\n SELECT schemaname, tablename\n FROM pg_tables\n WHERE schemaname = 'public'\n AND tablename NOT IN ('drizzle_migrations', '__drizzle_migrations')\n `);\n\n for (const row of tablesResult.rows || []) {\n const schemaName = row.schemaname;\n const tableName = row.tablename;\n\n try {\n await db.execute(sql`SELECT _temp_disable_rls_on_table(${schemaName}, ${tableName})`);\n logger.debug({ src: \"plugin:sql\", schemaName, tableName }, \"Disabled RLS on table\");\n } catch (error) {\n logger.warn(\n { src: \"plugin:sql\", schemaName, tableName, error: String(error) },\n \"Failed to disable RLS on table\"\n );\n }\n }\n\n await db.execute(sql`DROP FUNCTION IF EXISTS _temp_disable_rls_on_table(text, text)`);\n\n logger.info(\n { src: \"plugin:sql\" },\n \"Keeping server_id values intact (prevents data theft on re-enable)\"\n );\n\n logger.info({ src: \"plugin:sql\" }, \"Clearing servers table...\");\n await db.execute(sql`TRUNCATE TABLE servers`);\n\n await db.execute(sql`DROP FUNCTION IF EXISTS apply_rls_to_all_tables() CASCADE`);\n await db.execute(sql`DROP FUNCTION IF EXISTS add_server_isolation(text, text) CASCADE`);\n await db.execute(sql`DROP FUNCTION IF EXISTS current_server_id() CASCADE`);\n logger.info({ src: \"plugin:sql\" }, \"Dropped all RLS functions\");\n\n logger.info({ src: \"plugin:sql\" }, \"RLS disabled successfully (server_id columns preserved)\");\n } catch (error) {\n logger.error({ src: \"plugin:sql\", error: String(error) }, \"Failed to disable RLS\");\n throw error;\n }\n}\n\nexport async function installEntityRLS(adapter: IDatabaseAdapter): Promise<void> {\n const db = getDb(adapter);\n\n logger.info(\"[Entity RLS] Installing entity RLS functions and policies...\");\n\n await db.execute(sql`\n CREATE OR REPLACE FUNCTION current_entity_id()\n RETURNS UUID AS $$\n DECLARE\n entity_id_text TEXT;\n BEGIN\n -- Read from transaction-local variable\n entity_id_text := NULLIF(current_setting('app.entity_id', TRUE), '');\n\n IF entity_id_text IS NULL OR entity_id_text = '' THEN\n RETURN NULL;\n END IF;\n\n BEGIN\n RETURN entity_id_text::UUID;\n EXCEPTION WHEN OTHERS THEN\n RETURN NULL;\n END;\n END;\n $$ LANGUAGE plpgsql STABLE;\n `);\n\n logger.info(\"[Entity RLS] Created current_entity_id() function\");\n\n // 2. Create add_entity_isolation() function - applies entity RLS to a single table\n await db.execute(sql`\n CREATE OR REPLACE FUNCTION add_entity_isolation(\n schema_name text,\n table_name text,\n require_entity boolean DEFAULT false\n ) RETURNS void AS $$\n DECLARE\n full_table_name text;\n has_entity_id boolean;\n has_author_id boolean;\n has_channel_id boolean;\n has_room_id boolean;\n entity_column_name text;\n room_column_name text;\n BEGIN\n full_table_name := schema_name || '.' || table_name;\n\n SELECT EXISTS (\n SELECT 1 FROM information_schema.columns\n WHERE information_schema.columns.table_schema = schema_name\n AND information_schema.columns.table_name = add_entity_isolation.table_name\n AND information_schema.columns.column_name = 'entity_id'\n ) INTO has_entity_id;\n\n SELECT EXISTS (\n SELECT 1 FROM information_schema.columns\n WHERE information_schema.columns.table_schema = schema_name\n AND information_schema.columns.table_name = add_entity_isolation.table_name\n AND information_schema.columns.column_name = 'author_id'\n ) INTO has_author_id;\n\n SELECT EXISTS (\n SELECT 1 FROM information_schema.columns\n WHERE information_schema.columns.table_schema = schema_name\n AND information_schema.columns.table_name = add_entity_isolation.table_name\n AND information_schema.columns.column_name = 'room_id'\n ) INTO has_room_id;\n\n IF NOT (has_entity_id OR has_author_id OR has_room_id) THEN\n RAISE NOTICE '[Entity RLS] Skipping %.%: no entity columns found', schema_name, table_name;\n RETURN;\n END IF;\n\n IF table_name = 'participants' AND has_entity_id THEN\n entity_column_name := 'entity_id';\n room_column_name := NULL;\n ELSIF has_room_id THEN\n room_column_name := 'room_id';\n entity_column_name := NULL;\n ELSIF has_entity_id THEN\n entity_column_name := 'entity_id';\n room_column_name := NULL;\n ELSIF has_author_id THEN\n entity_column_name := 'author_id';\n room_column_name := NULL;\n ELSE\n entity_column_name := NULL;\n room_column_name := NULL;\n END IF;\n\n EXECUTE format('ALTER TABLE %I.%I ENABLE ROW LEVEL SECURITY', schema_name, table_name);\n EXECUTE format('ALTER TABLE %I.%I FORCE ROW LEVEL SECURITY', schema_name, table_name);\n EXECUTE format('DROP POLICY IF EXISTS entity_isolation_policy ON %I.%I', schema_name, table_name);\n\n IF room_column_name IS NOT NULL THEN\n IF require_entity THEN\n EXECUTE format('\n CREATE POLICY entity_isolation_policy ON %I.%I\n AS RESTRICTIVE\n USING (\n current_entity_id() IS NOT NULL\n AND %I IN (\n SELECT room_id\n FROM participants\n WHERE entity_id = current_entity_id()\n )\n )\n WITH CHECK (\n current_entity_id() IS NOT NULL\n AND %I IN (\n SELECT room_id\n FROM participants\n WHERE entity_id = current_entity_id()\n )\n )\n ', schema_name, table_name, room_column_name, room_column_name);\n RAISE NOTICE '[Entity RLS] Applied STRICT RESTRICTIVE to %.% (via % → participants.room_id, entity REQUIRED)', schema_name, table_name, room_column_name;\n ELSE\n EXECUTE format('\n CREATE POLICY entity_isolation_policy ON %I.%I\n AS RESTRICTIVE\n USING (\n current_entity_id() IS NULL\n OR %I IN (\n SELECT room_id\n FROM participants\n WHERE entity_id = current_entity_id()\n )\n )\n WITH CHECK (\n current_entity_id() IS NULL\n OR %I IN (\n SELECT room_id\n FROM participants\n WHERE entity_id = current_entity_id()\n )\n )\n ', schema_name, table_name, room_column_name, room_column_name);\n RAISE NOTICE '[Entity RLS] Applied PERMISSIVE RESTRICTIVE to %.% (via % → participants.room_id, NULL allowed)', schema_name, table_name, room_column_name;\n END IF;\n\n ELSIF entity_column_name IS NOT NULL THEN\n IF require_entity THEN\n EXECUTE format('\n CREATE POLICY entity_isolation_policy ON %I.%I\n AS RESTRICTIVE\n USING (\n current_entity_id() IS NOT NULL\n AND %I = current_entity_id()\n )\n WITH CHECK (\n current_entity_id() IS NOT NULL\n AND %I = current_entity_id()\n )\n ', schema_name, table_name, entity_column_name, entity_column_name);\n RAISE NOTICE '[Entity RLS] Applied STRICT RESTRICTIVE to %.% (direct column: %, entity REQUIRED)', schema_name, table_name, entity_column_name;\n ELSE\n -- PERMISSIVE MODE: NULL entity_id allows system/admin access\n EXECUTE format('\n CREATE POLICY entity_isolation_policy ON %I.%I\n AS RESTRICTIVE\n USING (\n current_entity_id() IS NULL\n OR %I = current_entity_id()\n )\n WITH CHECK (\n current_entity_id() IS NULL\n OR %I = current_entity_id()\n )\n ', schema_name, table_name, entity_column_name, entity_column_name);\n RAISE NOTICE '[Entity RLS] Applied PERMISSIVE RESTRICTIVE to %.% (direct column: %, NULL allowed)', schema_name, table_name, entity_column_name;\n END IF;\n END IF;\n\n IF room_column_name IS NOT NULL THEN\n EXECUTE format('CREATE INDEX IF NOT EXISTS idx_%I_room ON %I.%I(%I)',\n table_name, schema_name, table_name, room_column_name);\n END IF;\n\n IF entity_column_name IS NOT NULL THEN\n EXECUTE format('CREATE INDEX IF NOT EXISTS idx_%I_entity ON %I.%I(%I)',\n table_name, schema_name, table_name, entity_column_name);\n END IF;\n END;\n $$ LANGUAGE plpgsql;\n `);\n\n logger.info(\"[Entity RLS] Created add_entity_isolation() function\");\n\n await db.execute(sql`\n CREATE OR REPLACE FUNCTION apply_entity_rls_to_all_tables() RETURNS void AS $$\n DECLARE\n tbl record;\n require_entity_for_table boolean;\n BEGIN\n FOR tbl IN\n SELECT schemaname, tablename\n FROM pg_tables\n WHERE schemaname = 'public'\n AND tablename NOT IN (\n 'servers', -- Server RLS table\n 'users', -- Authentication table (no entity isolation needed)\n 'entity_mappings', -- Mapping table (no entity isolation needed)\n 'drizzle_migrations', -- Migration tracking\n '__drizzle_migrations' -- Migration tracking\n )\n LOOP\n BEGIN\n -- Apply STRICT mode (require_entity=true) to sensitive user-facing tables\n -- These tables MUST have entity context set to access data\n -- STRICT tables: memories, logs, components, tasks (user data requiring isolation)\n -- NOTE: Excluded tables:\n -- - 'participants': Adding participants is a privileged operation during initialization\n IF tbl.tablename IN ('memories', 'logs', 'components', 'tasks') THEN\n require_entity_for_table := true;\n ELSE\n require_entity_for_table := false;\n END IF;\n\n PERFORM add_entity_isolation(tbl.schemaname, tbl.tablename, require_entity_for_table);\n EXCEPTION WHEN OTHERS THEN\n RAISE WARNING '[Entity RLS] Failed to apply to %.%: %', tbl.schemaname, tbl.tablename, SQLERRM;\n END;\n END LOOP;\n END;\n $$ LANGUAGE plpgsql;\n `);\n\n logger.info(\"[Entity RLS] Created apply_entity_rls_to_all_tables() function\");\n\n logger.info(\"[Entity RLS] Entity RLS functions installed successfully\");\n}\n\nexport async function applyEntityRLSToAllTables(adapter: IDatabaseAdapter): Promise<void> {\n const db = getDb(adapter);\n\n try {\n await db.execute(sql`SELECT apply_entity_rls_to_all_tables()`);\n logger.info(\"[Entity RLS] Applied entity RLS to all eligible tables\");\n } catch (error) {\n logger.warn(\"[Entity RLS] Failed to apply entity RLS to some tables:\", String(error));\n }\n}\n\nexport async function uninstallEntityRLS(adapter: IDatabaseAdapter): Promise<void> {\n const db = getDb(adapter);\n\n logger.info(\"[Entity RLS] Removing entity RLS policies and functions...\");\n\n try {\n const tablesResult = await db.execute(sql`\n SELECT schemaname, tablename\n FROM pg_tables\n WHERE schemaname = 'public'\n AND tablename NOT IN ('drizzle_migrations', '__drizzle_migrations')\n `);\n\n for (const row of tablesResult.rows || []) {\n const schemaName = row.schemaname;\n const tableName = row.tablename;\n\n try {\n await db.execute(\n sql.raw(`DROP POLICY IF EXISTS entity_isolation_policy ON \"${schemaName}\".\"${tableName}\"`)\n );\n logger.debug(\n `[Entity RLS] Dropped entity_isolation_policy from ${schemaName}.${tableName}`\n );\n } catch (_error) {\n logger.debug(`[Entity RLS] No entity policy on ${schemaName}.${tableName}`);\n }\n }\n\n await db.execute(sql`DROP FUNCTION IF EXISTS apply_entity_rls_to_all_tables() CASCADE`);\n await db.execute(sql`DROP FUNCTION IF EXISTS add_entity_isolation(text, text) CASCADE`);\n await db.execute(sql`DROP FUNCTION IF EXISTS current_entity_id() CASCADE`);\n\n logger.info(\"[Entity RLS] Entity RLS functions and policies removed successfully\");\n } catch (error) {\n logger.error(\"[Entity RLS] Failed to remove entity RLS:\", String(error));\n throw error;\n }\n}\n",
10
+ "/**\n * Browser-compatible crypto utilities\n * Uses the Web Crypto API which is available in both browsers and Node.js\n */\n\n/**\n * Simple synchronous hash function for change detection\n * This is NOT cryptographic - it's just for comparing snapshots\n * Uses djb2 hash algorithm for speed and simplicity\n */\nexport function simpleHash(str: string): string {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = (hash * 33) ^ str.charCodeAt(i);\n }\n // Convert to unsigned 32-bit integer and then to hex\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n}\n\n/**\n * Create a longer hash by combining multiple passes\n * This provides better distribution for larger inputs\n */\nexport function extendedHash(str: string): string {\n // Run multiple passes with different seeds for better distribution\n const h1 = hashWithSeed(str, 5381);\n const h2 = hashWithSeed(str, 7919);\n const h3 = hashWithSeed(str, 104729);\n const h4 = hashWithSeed(str, 224737);\n\n return h1 + h2 + h3 + h4;\n}\n\nfunction hashWithSeed(str: string, seed: number): string {\n let hash = seed;\n for (let i = 0; i < str.length; i++) {\n hash = (hash * 33) ^ str.charCodeAt(i);\n }\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n}\n\n/**\n * Convert string to Uint8Array\n */\nfunction stringToBytes(str: string): Uint8Array {\n const encoder = new TextEncoder();\n return encoder.encode(str);\n}\n\n/**\n * Convert ArrayBuffer to hex string\n */\nfunction bufferToHex(buffer: ArrayBuffer): string {\n const bytes = new Uint8Array(buffer);\n let hex = \"\";\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i].toString(16).padStart(2, \"0\");\n }\n return hex;\n}\n\n/**\n * Async SHA-256 hash using Web Crypto API\n * Works in both browsers and Node.js (v15+)\n */\nexport async function sha256Async(data: string): Promise<string> {\n const bytes = stringToBytes(data);\n // Cast to ArrayBuffer to satisfy TypeScript's strict BufferSource typing\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", bytes.buffer as ArrayBuffer);\n return bufferToHex(hashBuffer);\n}\n\n/**\n * Generate a stable bigint from a string for advisory lock IDs\n * Uses a simple hash that produces consistent results across runs\n */\nexport function stringToBigInt(str: string): bigint {\n // Use extended hash for better uniqueness\n const hash = extendedHash(str);\n\n // Convert first 16 hex chars (64 bits) to bigint\n let lockId = BigInt(`0x${hash.slice(0, 16)}`);\n\n // Ensure the value fits in PostgreSQL's positive bigint range\n // Use a mask to keep only 63 bits (ensures positive in signed 64-bit)\n const mask63Bits = 0x7fffffffffffffffn;\n lockId = lockId & mask63Bits;\n\n // Ensure non-zero\n if (lockId === 0n) {\n lockId = 1n;\n }\n\n return lockId;\n}\n",
11
+ "import { logger } from \"@elizaos/core\";\nimport { getTableConfig, type PgTable, pgSchema } from \"drizzle-orm/pg-core\";\n\n// Drizzle schema type - an object mapping names to tables or other schema objects\ntype DrizzleSchema = Record<string, unknown>;\n\n// pgSchema object interface\ninterface PgSchemaObject {\n _schema?: string;\n table?: (...args: unknown[]) => unknown;\n}\n\n/**\n * Transform a plugin's schema to use the appropriate namespace\n *\n * @elizaos/plugin-sql uses 'public' schema (no transformation)\n * Other plugins get their tables wrapped in a namespaced schema\n */\nexport function transformPluginSchema(pluginName: string, schema: DrizzleSchema): DrizzleSchema {\n // Core plugin uses public schema - no transformation needed\n if (pluginName === \"@elizaos/plugin-sql\") {\n return schema;\n }\n\n // Derive schema name from plugin name\n const schemaName = deriveSchemaName(pluginName);\n\n // If schema is already using pgSchema, return as-is\n if (isAlreadyNamespaced(schema, schemaName)) {\n logger.debug(\n { src: \"plugin:sql\", pluginName, schemaName },\n \"Plugin already uses expected schema\"\n );\n return schema;\n }\n\n logger.info({ src: \"plugin:sql\", pluginName, schemaName }, \"Transforming plugin to use schema\");\n\n // Transform the schema object\n const transformed: DrizzleSchema = {};\n\n for (const [key, value] of Object.entries(schema)) {\n if (isPgTable(value)) {\n // Get the table configuration\n const config = getTableConfig(value as PgTable);\n\n // If the table doesn't have a schema or is in public, warn about it\n if (!config.schema || config.schema === \"public\") {\n // Can't easily transform existing tables to different schema\n // (would require reconstructing all column definitions, constraints, etc.)\n logger.warn(\n {\n src: \"plugin:sql\",\n tableName: config.name,\n pluginName,\n expectedSchema: schemaName,\n },\n \"Table should use pgSchema for proper isolation - manual migration may be required\"\n );\n transformed[key] = value;\n } else {\n // Table already has a schema, keep it as-is\n transformed[key] = value;\n }\n } else if (typeof value === \"object\" && value !== null) {\n // Check if this is a schema object (created with pgSchema)\n const obj = value as PgSchemaObject;\n if (obj._schema && obj.table) {\n // This is already a pgSchema object, keep it\n transformed[key] = value;\n } else {\n // Regular object, keep as-is\n transformed[key] = value;\n }\n } else {\n // Not a table, keep as-is\n transformed[key] = value;\n }\n }\n\n return transformed;\n}\n\n/**\n * Derive a valid PostgreSQL schema name from a plugin name\n */\nexport function deriveSchemaName(pluginName: string): string {\n // Remove common prefixes and convert to lowercase with underscores\n let schemaName = pluginName\n .replace(/^@[^/]+\\//, \"\") // Remove npm scope like @elizaos/\n .replace(/^plugin-/, \"\") // Remove plugin- prefix\n .toLowerCase();\n\n // Replace non-alphanumeric characters with underscores (avoid polynomial regex)\n schemaName = normalizeSchemaName(schemaName);\n\n // Ensure schema name is valid (not empty, not a reserved word)\n const reserved = [\"public\", \"pg_catalog\", \"information_schema\", \"migrations\"];\n if (!schemaName || reserved.includes(schemaName)) {\n // Fallback to using the full plugin name with safe characters\n schemaName = `plugin_${normalizeSchemaName(pluginName.toLowerCase())}`;\n }\n\n // Ensure it starts with a letter (PostgreSQL requirement)\n if (!/^[a-z]/.test(schemaName)) {\n schemaName = `p_${schemaName}`;\n }\n\n // Truncate if too long (PostgreSQL identifier limit is 63 chars)\n if (schemaName.length > 63) {\n schemaName = schemaName.substring(0, 63);\n }\n\n return schemaName;\n}\n\n/**\n * Normalize a string to be a valid PostgreSQL identifier\n * Avoids polynomial regex by using string manipulation instead\n */\nfunction normalizeSchemaName(input: string): string {\n const chars: string[] = [];\n let prevWasUnderscore = false;\n\n for (let i = 0; i < input.length; i++) {\n const char = input[i];\n\n if (/[a-z0-9]/.test(char)) {\n chars.push(char);\n prevWasUnderscore = false;\n } else if (!prevWasUnderscore) {\n // Only add underscore if previous char wasn't already an underscore\n chars.push(\"_\");\n prevWasUnderscore = true;\n }\n // Skip consecutive non-alphanumeric characters\n }\n\n // Remove leading and trailing underscores\n const result = chars.join(\"\");\n\n // Trim underscores from start and end efficiently\n let start = 0;\n let end = result.length;\n\n while (start < end && result[start] === \"_\") {\n start++;\n }\n\n while (end > start && result[end - 1] === \"_\") {\n end--;\n }\n\n return result.slice(start, end);\n}\n\n/**\n * Check if a value is a PgTable\n */\nfunction isPgTable(value: unknown): value is PgTable {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n // Check for table-like properties\n // This is a heuristic since we can't use instanceof across module boundaries\n try {\n const config = getTableConfig(value as PgTable);\n return config && typeof config.name === \"string\";\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a schema is already properly namespaced\n */\nfunction isAlreadyNamespaced(schema: DrizzleSchema, expectedSchemaName: string): boolean {\n for (const value of Object.values(schema)) {\n if (isPgTable(value)) {\n try {\n const config = getTableConfig(value);\n if (config.schema === expectedSchemaName) {\n return true;\n }\n } catch {\n // Not a table, continue\n }\n }\n }\n return false;\n}\n\n/**\n * Create a namespaced schema helper for plugins\n * This is what plugins should ideally use to define their tables\n */\nexport function createPluginSchema(pluginName: string) {\n const schemaName = deriveSchemaName(pluginName);\n return pgSchema(schemaName);\n}\n",
12
+ "import { logger } from \"@elizaos/core\";\nimport { sql } from \"drizzle-orm\";\nimport { deriveSchemaName } from \"../schema-transformer\";\nimport type {\n CheckConstraintInfoRow,\n ColumnInfoRow,\n DrizzleDB,\n EnumInfoRow,\n ForeignKeyInfoRow,\n IndexInfoRow,\n PrimaryKeyInfoRow,\n SchemaCheckConstraint,\n SchemaColumn,\n SchemaEnum,\n SchemaForeignKey,\n SchemaIndex,\n SchemaPrimaryKey,\n SchemaSnapshot,\n SchemaTable,\n SchemaUniqueConstraint,\n TableInfoRow,\n UniqueConstraintInfoRow,\n} from \"../types\";\n\n/**\n * Type-safe extraction of rows from SQL query results.\n * Raw SQL queries in Drizzle return untyped rows - this helper provides type safety.\n */\nfunction getRows<T>(result: { rows: unknown[] }): T[] {\n return result.rows as T[];\n}\n\n/**\n * Introspect the current database state and generate a snapshot\n * This is used when no previous snapshot exists for a plugin\n * to capture the existing database state before migrations\n */\nexport class DatabaseIntrospector {\n constructor(private db: DrizzleDB) {}\n\n /**\n * Introspect all tables in the database and generate a snapshot\n * @param schemaName - Schema to introspect (default: 'public')\n * @returns Schema snapshot of current database state\n */\n async introspectSchema(schemaName: string = \"public\"): Promise<SchemaSnapshot> {\n logger.info({ src: \"plugin:sql\", schemaName }, \"Starting database introspection\");\n\n const tables: Record<string, SchemaTable> = {};\n const schemas: Record<string, string> = {};\n const enums: Record<string, SchemaEnum> = {};\n\n // Get all tables in the schema\n const allTables = await this.getTables(schemaName);\n\n for (const tableInfo of allTables) {\n const tableName = tableInfo.table_name;\n const tableSchema = tableInfo.table_schema || \"public\";\n\n logger.debug({ src: \"plugin:sql\", tableSchema, tableName }, \"Introspecting table\");\n\n // Get columns for this table\n const columns = await this.getColumns(tableSchema, tableName);\n const columnsObject: Record<string, SchemaColumn> = {};\n const uniqueConstraintObject: Record<string, SchemaUniqueConstraint> = {};\n\n for (const col of columns) {\n columnsObject[col.column_name] = {\n name: col.column_name,\n type: col.data_type,\n primaryKey: col.is_primary || false,\n notNull: col.is_nullable === \"NO\",\n default: col.column_default\n ? this.parseDefault(col.column_default, col.data_type)\n : undefined,\n };\n }\n\n // Get indexes\n const indexes = await this.getIndexes(tableSchema, tableName);\n const indexesObject: Record<string, SchemaIndex> = {};\n\n for (const idx of indexes) {\n if (!idx.is_primary && !idx.is_unique_constraint) {\n // Skip primary keys and unique constraints\n // Also skip indexes with no columns (partial indexes, expression indexes, etc.)\n if (idx.columns && Array.isArray(idx.columns) && idx.columns.length > 0) {\n indexesObject[idx.name] = {\n name: idx.name,\n columns: idx.columns.map((col) => ({\n expression: col,\n isExpression: false,\n })),\n isUnique: idx.is_unique,\n method: idx.method || \"btree\",\n };\n }\n }\n }\n\n // Get foreign keys\n const foreignKeys = await this.getForeignKeys(tableSchema, tableName);\n const foreignKeysObject: Record<string, SchemaForeignKey> = {};\n\n for (const fk of foreignKeys) {\n foreignKeysObject[fk.name] = {\n name: fk.name,\n tableFrom: tableName,\n schemaFrom: tableSchema,\n tableTo: fk.foreign_table_name,\n schemaTo: fk.foreign_table_schema || \"public\",\n columnsFrom: [fk.column_name],\n columnsTo: [fk.foreign_column_name],\n onDelete: fk.delete_rule.toLowerCase() || \"no action\",\n onUpdate: fk.update_rule.toLowerCase() || \"no action\",\n };\n }\n\n // Get primary keys\n const primaryKeys = await this.getPrimaryKeys(tableSchema, tableName);\n const primaryKeysObject: Record<string, SchemaPrimaryKey> = {};\n\n for (const pk of primaryKeys) {\n primaryKeysObject[pk.name] = {\n name: pk.name,\n columns: pk.columns,\n };\n }\n\n // Get unique constraints\n const uniqueConstraints = await this.getUniqueConstraints(tableSchema, tableName);\n\n for (const unq of uniqueConstraints) {\n uniqueConstraintObject[unq.name] = {\n name: unq.name,\n columns: unq.columns,\n nullsNotDistinct: false, // Default value\n };\n }\n\n // Get check constraints\n const checkConstraints = await this.getCheckConstraints(tableSchema, tableName);\n const checksObject: Record<string, SchemaCheckConstraint> = {};\n\n for (const check of checkConstraints) {\n checksObject[check.name] = {\n name: check.name,\n value: check.definition,\n };\n }\n\n // Build the table object\n tables[`${tableSchema}.${tableName}`] = {\n name: tableName,\n schema: tableSchema,\n columns: columnsObject,\n indexes: indexesObject,\n foreignKeys: foreignKeysObject,\n compositePrimaryKeys: primaryKeysObject,\n uniqueConstraints: uniqueConstraintObject,\n checkConstraints: checksObject,\n };\n\n // Track schemas\n if (tableSchema && tableSchema !== \"public\") {\n schemas[tableSchema] = tableSchema;\n }\n }\n\n // Get enums if any\n const enumsResult = await this.getEnums(schemaName);\n for (const enumInfo of enumsResult) {\n const key = `${enumInfo.schema}.${enumInfo.name}`;\n if (!enums[key]) {\n enums[key] = {\n name: enumInfo.name,\n schema: enumInfo.schema,\n values: [],\n };\n }\n enums[key].values.push(enumInfo.value);\n }\n\n logger.info(\n { src: \"plugin:sql\", tableCount: Object.keys(tables).length },\n \"Database introspection complete\"\n );\n\n return {\n version: \"7\",\n dialect: \"postgresql\",\n tables,\n schemas,\n enums,\n _meta: {\n schemas: {},\n tables: {},\n columns: {},\n },\n };\n }\n\n /**\n * Get all tables in a schema\n */\n private async getTables(schemaName: string): Promise<TableInfoRow[]> {\n const result = await this.db.execute(\n sql`SELECT \n table_schema,\n table_name\n FROM information_schema.tables\n WHERE table_schema = ${schemaName}\n AND table_type = 'BASE TABLE'\n ORDER BY table_name`\n );\n return getRows<TableInfoRow>(result);\n }\n\n /**\n * Get columns for a table\n */\n private async getColumns(schemaName: string, tableName: string): Promise<ColumnInfoRow[]> {\n const result = await this.db.execute(\n sql`SELECT \n a.attname AS column_name,\n CASE \n WHEN a.attnotnull THEN 'NO'\n ELSE 'YES'\n END AS is_nullable,\n CASE \n WHEN a.atttypid = ANY ('{int,int8,int2}'::regtype[]) \n AND EXISTS (\n SELECT FROM pg_attrdef ad\n WHERE ad.adrelid = a.attrelid \n AND ad.adnum = a.attnum \n AND pg_get_expr(ad.adbin, ad.adrelid) = 'nextval(''' \n || pg_get_serial_sequence(a.attrelid::regclass::text, a.attname)::regclass || '''::regclass)'\n )\n THEN CASE a.atttypid\n WHEN 'int'::regtype THEN 'serial'\n WHEN 'int8'::regtype THEN 'bigserial'\n WHEN 'int2'::regtype THEN 'smallserial'\n END\n ELSE format_type(a.atttypid, a.atttypmod)\n END AS data_type,\n pg_get_expr(ad.adbin, ad.adrelid) AS column_default,\n CASE \n WHEN con.contype = 'p' THEN true\n ELSE false\n END AS is_primary\n FROM pg_attribute a\n JOIN pg_class cls ON cls.oid = a.attrelid\n JOIN pg_namespace ns ON ns.oid = cls.relnamespace\n LEFT JOIN pg_attrdef ad ON ad.adrelid = a.attrelid AND ad.adnum = a.attnum\n LEFT JOIN pg_constraint con ON con.conrelid = a.attrelid \n AND a.attnum = ANY(con.conkey) \n AND con.contype = 'p'\n WHERE \n a.attnum > 0\n AND NOT a.attisdropped\n AND ns.nspname = ${schemaName}\n AND cls.relname = ${tableName}\n ORDER BY a.attnum`\n );\n return getRows<ColumnInfoRow>(result);\n }\n\n /**\n * Get indexes for a table\n */\n private async getIndexes(schemaName: string, tableName: string): Promise<IndexInfoRow[]> {\n const result = await this.db.execute(\n sql`SELECT \n i.relname AS name,\n idx.indisunique AS is_unique,\n idx.indisprimary AS is_primary,\n con.contype = 'u' AS is_unique_constraint,\n ARRAY(\n SELECT a.attname\n FROM pg_attribute a\n WHERE a.attrelid = idx.indrelid\n AND a.attnum = ANY(idx.indkey::int[])\n ORDER BY a.attnum\n ) AS columns,\n am.amname AS method\n FROM pg_index idx\n JOIN pg_class i ON i.oid = idx.indexrelid\n JOIN pg_class c ON c.oid = idx.indrelid\n JOIN pg_namespace n ON n.oid = c.relnamespace\n JOIN pg_am am ON am.oid = i.relam\n LEFT JOIN pg_constraint con ON con.conindid = idx.indexrelid\n WHERE n.nspname = ${schemaName}\n AND c.relname = ${tableName}`\n );\n return getRows<IndexInfoRow>(result);\n }\n\n /**\n * Get foreign keys for a table\n */\n private async getForeignKeys(\n schemaName: string,\n tableName: string\n ): Promise<ForeignKeyInfoRow[]> {\n const result = await this.db.execute(\n sql`SELECT\n con.conname AS name,\n att.attname AS column_name,\n fnsp.nspname AS foreign_table_schema,\n frel.relname AS foreign_table_name,\n fatt.attname AS foreign_column_name,\n CASE con.confupdtype\n WHEN 'a' THEN 'NO ACTION'\n WHEN 'r' THEN 'RESTRICT'\n WHEN 'n' THEN 'SET NULL'\n WHEN 'c' THEN 'CASCADE'\n WHEN 'd' THEN 'SET DEFAULT'\n END AS update_rule,\n CASE con.confdeltype\n WHEN 'a' THEN 'NO ACTION'\n WHEN 'r' THEN 'RESTRICT'\n WHEN 'n' THEN 'SET NULL'\n WHEN 'c' THEN 'CASCADE'\n WHEN 'd' THEN 'SET DEFAULT'\n END AS delete_rule\n FROM pg_catalog.pg_constraint con\n JOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid\n JOIN pg_catalog.pg_namespace nsp ON nsp.oid = con.connamespace\n LEFT JOIN pg_catalog.pg_attribute att ON att.attnum = ANY (con.conkey)\n AND att.attrelid = con.conrelid\n LEFT JOIN pg_catalog.pg_class frel ON frel.oid = con.confrelid\n LEFT JOIN pg_catalog.pg_namespace fnsp ON fnsp.oid = frel.relnamespace\n LEFT JOIN pg_catalog.pg_attribute fatt ON fatt.attnum = ANY (con.confkey)\n AND fatt.attrelid = con.confrelid\n WHERE con.contype = 'f'\n AND nsp.nspname = ${schemaName}\n AND rel.relname = ${tableName}`\n );\n return getRows<ForeignKeyInfoRow>(result);\n }\n\n /**\n * Get primary keys for a table\n */\n private async getPrimaryKeys(\n schemaName: string,\n tableName: string\n ): Promise<PrimaryKeyInfoRow[]> {\n const result = await this.db.execute(\n sql`SELECT \n con.conname AS name,\n ARRAY(\n SELECT a.attname\n FROM pg_attribute a\n WHERE a.attrelid = con.conrelid\n AND a.attnum = ANY(con.conkey)\n ORDER BY a.attnum\n ) AS columns\n FROM pg_constraint con\n JOIN pg_class rel ON rel.oid = con.conrelid\n JOIN pg_namespace nsp ON nsp.oid = con.connamespace\n WHERE con.contype = 'p'\n AND nsp.nspname = ${schemaName}\n AND rel.relname = ${tableName}`\n );\n return getRows<PrimaryKeyInfoRow>(result);\n }\n\n /**\n * Get unique constraints for a table\n */\n private async getUniqueConstraints(\n schemaName: string,\n tableName: string\n ): Promise<UniqueConstraintInfoRow[]> {\n const result = await this.db.execute(\n sql`SELECT \n con.conname AS name,\n ARRAY(\n SELECT a.attname\n FROM pg_attribute a\n WHERE a.attrelid = con.conrelid\n AND a.attnum = ANY(con.conkey)\n ORDER BY a.attnum\n ) AS columns\n FROM pg_constraint con\n JOIN pg_class rel ON rel.oid = con.conrelid\n JOIN pg_namespace nsp ON nsp.oid = con.connamespace\n WHERE con.contype = 'u'\n AND nsp.nspname = ${schemaName}\n AND rel.relname = ${tableName}`\n );\n return getRows<UniqueConstraintInfoRow>(result);\n }\n\n /**\n * Get check constraints for a table\n */\n private async getCheckConstraints(\n schemaName: string,\n tableName: string\n ): Promise<CheckConstraintInfoRow[]> {\n const result = await this.db.execute(\n sql`SELECT \n con.conname AS name,\n pg_get_constraintdef(con.oid) AS definition\n FROM pg_constraint con\n JOIN pg_class rel ON rel.oid = con.conrelid\n JOIN pg_namespace nsp ON nsp.oid = con.connamespace\n WHERE con.contype = 'c'\n AND nsp.nspname = ${schemaName}\n AND rel.relname = ${tableName}`\n );\n return getRows<CheckConstraintInfoRow>(result);\n }\n\n /**\n * Get enums in a schema\n */\n private async getEnums(schemaName: string): Promise<EnumInfoRow[]> {\n const result = await this.db.execute(\n sql`SELECT \n n.nspname AS schema,\n t.typname AS name,\n e.enumlabel AS value,\n e.enumsortorder AS sort_order\n FROM pg_type t\n JOIN pg_enum e ON t.oid = e.enumtypid\n JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace\n WHERE n.nspname = ${schemaName}\n ORDER BY schema, name, sort_order`\n );\n return getRows<EnumInfoRow>(result);\n }\n\n /**\n * Parse default value for a column\n */\n private parseDefault(defaultValue: string, dataType: string): string | undefined {\n if (!defaultValue) return undefined;\n\n // Remove the type cast if present (e.g., \"'value'::text\" -> \"'value'\")\n const match = defaultValue.match(/^'(.*)'::/);\n if (match) {\n return `'${match[1]}'`;\n }\n\n // Handle nextval for sequences\n if (defaultValue.includes(\"nextval(\")) {\n return undefined; // Serial types handle this automatically\n }\n\n // Handle boolean defaults\n if (dataType === \"boolean\") {\n if (defaultValue === \"true\") return \"true\";\n if (defaultValue === \"false\") return \"false\";\n }\n\n // Return as-is for other cases\n return defaultValue;\n }\n\n /**\n * Check if tables exist for a plugin by checking if any tables exist in its schema\n * @param pluginName - Name of the plugin\n * @returns True if tables exist, false otherwise\n */\n async hasExistingTables(pluginName: string): Promise<boolean> {\n const schemaName =\n pluginName === \"@elizaos/plugin-sql\" ? \"public\" : deriveSchemaName(pluginName);\n\n const result = await this.db.execute(\n sql`SELECT COUNT(*) AS count\n FROM information_schema.tables\n WHERE table_schema = ${schemaName}\n AND table_type = 'BASE TABLE'`\n );\n\n const firstRow = result.rows[0];\n const count = parseInt((firstRow && (firstRow.count as string)) || \"0\", 10);\n return count > 0;\n }\n}\n",
13
+ "import type {\n IndexColumn,\n SchemaCheckConstraint,\n SchemaColumn,\n SchemaForeignKey,\n SchemaIndex,\n SchemaSnapshot,\n SchemaUniqueConstraint,\n} from \"../types\";\n\n/**\n * Normalize SQL types for comparison\n * Handles equivalent type variations between introspected DB and schema definitions\n */\nfunction normalizeType(type: string | undefined): string {\n if (!type) return \"\";\n\n const normalized = type.toLowerCase().trim();\n\n // Handle timestamp variations\n if (normalized === \"timestamp without time zone\" || normalized === \"timestamp with time zone\") {\n return \"timestamp\";\n }\n\n // Handle serial vs integer with identity\n // serial is essentially integer with auto-increment\n if (normalized === \"serial\") {\n return \"integer\";\n }\n if (normalized === \"bigserial\") {\n return \"bigint\";\n }\n if (normalized === \"smallserial\") {\n return \"smallint\";\n }\n\n // Handle numeric/decimal equivalence\n if (normalized.startsWith(\"numeric\") || normalized.startsWith(\"decimal\")) {\n // Extract precision and scale if present\n const match = normalized.match(/\\((\\d+)(?:,\\s*(\\d+))?\\)/);\n if (match) {\n return `numeric(${match[1]}${match[2] ? `,${match[2]}` : \"\"})`;\n }\n return \"numeric\";\n }\n\n // Handle varchar/character varying\n if (normalized.startsWith(\"character varying\")) {\n return normalized.replace(\"character varying\", \"varchar\");\n }\n\n // Handle text array variations\n if (normalized === \"text[]\" || normalized === \"_text\") {\n return \"text[]\";\n }\n\n return normalized;\n}\n\n/**\n * Helper function to compare two index definitions\n * Returns true if indexes are different and need to be recreated\n */\nfunction isIndexChanged(prevIndex: SchemaIndex, currIndex: SchemaIndex): boolean {\n // Compare basic properties\n if (prevIndex.isUnique !== currIndex.isUnique) return true;\n if (prevIndex.method !== currIndex.method) return true;\n if (prevIndex.where !== currIndex.where) return true;\n if (prevIndex.concurrently !== currIndex.concurrently) return true;\n\n // Compare columns array - must be same columns in same order\n const prevColumns = prevIndex.columns || [];\n const currColumns = currIndex.columns || [];\n\n if (prevColumns.length !== currColumns.length) return true;\n\n for (let i = 0; i < prevColumns.length; i++) {\n const prevCol = prevColumns[i] as string | IndexColumn;\n const currCol = currColumns[i] as string | IndexColumn;\n\n // Handle both string columns and expression columns\n if (typeof prevCol === \"string\" && typeof currCol === \"string\") {\n if (prevCol !== currCol) return true;\n } else if (typeof prevCol === \"object\" && typeof currCol === \"object\") {\n // Compare expression columns\n if (prevCol.expression !== currCol.expression) return true;\n if (prevCol.isExpression !== currCol.isExpression) return true;\n if (prevCol.asc !== currCol.asc) return true;\n if (prevCol.nulls !== currCol.nulls) return true;\n } else {\n // Type mismatch (one is string, other is object)\n return true;\n }\n }\n\n return false;\n}\n\n// Column changes interface\nexport interface ColumnChanges {\n typeChanged?: boolean;\n prevType?: string;\n newType?: string;\n nullabilityChanged?: boolean;\n wasNullable?: boolean;\n isNullable?: boolean;\n defaultChanged?: boolean;\n prevDefault?: string | number | boolean;\n newDefault?: string | number | boolean;\n from?: SchemaColumn;\n to?: SchemaColumn;\n}\n\n// Table changes interface\nexport interface TableChanges {\n columnsAdded: string[];\n columnsDeleted: string[];\n columnsModified: string[];\n}\n\nexport interface SchemaDiff {\n tables: {\n created: string[];\n deleted: string[];\n modified: Array<{\n name: string;\n changes: TableChanges;\n }>;\n };\n columns: {\n added: Array<{\n table: string;\n column: string;\n definition: SchemaColumn;\n }>;\n deleted: Array<{\n table: string;\n column: string;\n }>;\n modified: Array<{\n table: string;\n column: string;\n changes: ColumnChanges;\n }>;\n };\n indexes: {\n created: SchemaIndex[];\n deleted: SchemaIndex[];\n altered: Array<{\n // Indexes with same name but different definition\n old: SchemaIndex;\n new: SchemaIndex;\n }>;\n };\n foreignKeys: {\n created: SchemaForeignKey[];\n deleted: SchemaForeignKey[];\n altered: Array<{\n // FKs with modified CASCADE behavior\n old: SchemaForeignKey;\n new: SchemaForeignKey;\n }>;\n };\n uniqueConstraints: {\n created: SchemaUniqueConstraint[];\n deleted: SchemaUniqueConstraint[];\n };\n checkConstraints: {\n created: SchemaCheckConstraint[];\n deleted: SchemaCheckConstraint[];\n };\n}\n\n/**\n * Calculate the difference between two snapshots\n */\nexport async function calculateDiff(\n previousSnapshot: SchemaSnapshot | null,\n currentSnapshot: SchemaSnapshot\n): Promise<SchemaDiff> {\n const diff: SchemaDiff = {\n tables: {\n created: [],\n deleted: [],\n modified: [],\n },\n columns: {\n added: [],\n deleted: [],\n modified: [],\n },\n indexes: {\n created: [],\n deleted: [],\n altered: [],\n },\n foreignKeys: {\n created: [],\n deleted: [],\n altered: [],\n },\n uniqueConstraints: {\n created: [],\n deleted: [],\n },\n checkConstraints: {\n created: [],\n deleted: [],\n },\n };\n\n // If no previous snapshot, all tables are new\n if (!previousSnapshot) {\n diff.tables.created = Object.keys(currentSnapshot.tables);\n\n // Also track indexes and foreign keys from new tables\n for (const tableName in currentSnapshot.tables) {\n const table = currentSnapshot.tables[tableName];\n\n // Add indexes\n if (table.indexes) {\n for (const indexName in table.indexes) {\n diff.indexes.created.push({\n ...table.indexes[indexName],\n table: tableName,\n } as SchemaIndex & { table: string });\n }\n }\n\n // Add foreign keys\n if (table.foreignKeys) {\n for (const fkName in table.foreignKeys) {\n diff.foreignKeys.created.push(table.foreignKeys[fkName]);\n }\n }\n }\n\n return diff;\n }\n\n const prevTables = previousSnapshot.tables || {};\n const currTables = currentSnapshot.tables || {};\n\n // Find created tables\n for (const tableName in currTables) {\n if (!(tableName in prevTables)) {\n diff.tables.created.push(tableName);\n\n const table = currTables[tableName];\n\n // Add indexes for new table\n if (table.indexes) {\n for (const indexName in table.indexes) {\n diff.indexes.created.push({\n ...table.indexes[indexName],\n table: tableName,\n } as SchemaIndex & { table: string });\n }\n }\n\n // Add unique constraints for new table\n if (table.uniqueConstraints) {\n for (const uqName in table.uniqueConstraints) {\n diff.uniqueConstraints.created.push({\n ...table.uniqueConstraints[uqName],\n table: tableName,\n } as SchemaUniqueConstraint & { table: string });\n }\n }\n\n // Add check constraints for new table\n if (table.checkConstraints) {\n for (const checkName in table.checkConstraints) {\n diff.checkConstraints.created.push({\n ...table.checkConstraints[checkName],\n table: tableName,\n } as SchemaCheckConstraint & { table: string });\n }\n }\n\n // Add foreign keys for new table\n if (table.foreignKeys) {\n for (const fkName in table.foreignKeys) {\n diff.foreignKeys.created.push(table.foreignKeys[fkName]);\n }\n }\n }\n }\n\n // Find deleted tables\n for (const tableName in prevTables) {\n if (!(tableName in currTables)) {\n diff.tables.deleted.push(tableName);\n }\n }\n\n // Find modified tables (check columns, indexes, foreign keys)\n for (const tableName in currTables) {\n if (tableName in prevTables) {\n const prevTable = prevTables[tableName];\n const currTable = currTables[tableName];\n\n // Early check: if the table schemas are identical, skip it entirely\n // This prevents false positives when other tables are modified\n const prevTableJson = JSON.stringify({\n columns: prevTable.columns || {},\n indexes: prevTable.indexes || {},\n foreignKeys: prevTable.foreignKeys || {},\n uniqueConstraints: prevTable.uniqueConstraints || {},\n checkConstraints: prevTable.checkConstraints || {},\n });\n\n const currTableJson = JSON.stringify({\n columns: currTable.columns || {},\n indexes: currTable.indexes || {},\n foreignKeys: currTable.foreignKeys || {},\n uniqueConstraints: currTable.uniqueConstraints || {},\n checkConstraints: currTable.checkConstraints || {},\n });\n\n // If tables are identical, skip all processing for this table\n if (prevTableJson === currTableJson) {\n continue;\n }\n\n // Compare columns\n const prevColumns = prevTable.columns || {};\n const currColumns = currTable.columns || {};\n\n // Find added columns\n for (const colName in currColumns) {\n if (!(colName in prevColumns)) {\n diff.columns.added.push({\n table: tableName,\n column: colName,\n definition: currColumns[colName],\n });\n }\n }\n\n // Find deleted columns\n for (const colName in prevColumns) {\n if (!(colName in currColumns)) {\n diff.columns.deleted.push({\n table: tableName,\n column: colName,\n });\n }\n }\n\n // Find modified columns\n for (const colName in currColumns) {\n if (colName in prevColumns) {\n const prevCol = prevColumns[colName];\n const currCol = currColumns[colName];\n\n // Check for changes in column properties\n // Use normalized type comparison\n const typeChanged = normalizeType(prevCol.type) !== normalizeType(currCol.type);\n const hasChanges =\n typeChanged ||\n prevCol.notNull !== currCol.notNull ||\n prevCol.default !== currCol.default ||\n prevCol.primaryKey !== currCol.primaryKey;\n\n if (hasChanges) {\n diff.columns.modified.push({\n table: tableName,\n column: colName,\n changes: {\n from: prevCol,\n to: currCol,\n },\n });\n }\n }\n }\n\n // Compare indexes\n const prevIndexes = prevTable.indexes || {};\n const currIndexes = currTable.indexes || {};\n\n // Find new, deleted, and altered indexes\n for (const indexName in currIndexes) {\n if (!(indexName in prevIndexes)) {\n // New index\n diff.indexes.created.push({\n ...currIndexes[indexName],\n table: tableName,\n } as SchemaIndex & { table: string });\n } else {\n // Check if index definition changed\n const prevIndex = prevIndexes[indexName];\n const currIndex = currIndexes[indexName];\n\n // Deep comparison of index properties\n const indexChanged = isIndexChanged(prevIndex, currIndex);\n\n if (indexChanged) {\n // Index definition changed - need to drop and recreate\n diff.indexes.altered.push({\n old: {\n ...prevIndex,\n table: tableName,\n name: indexName,\n } as SchemaIndex & { table: string },\n new: {\n ...currIndex,\n table: tableName,\n name: indexName,\n } as SchemaIndex & { table: string },\n });\n }\n }\n }\n\n // Find deleted indexes (not altered)\n for (const indexName in prevIndexes) {\n if (!(indexName in currIndexes)) {\n diff.indexes.deleted.push({\n ...prevIndexes[indexName],\n table: tableName,\n } as SchemaIndex & { table: string });\n }\n }\n\n // Compare unique constraints\n const prevUniqueConstraints = prevTable.uniqueConstraints || {};\n const currUniqueConstraints = currTable.uniqueConstraints || {};\n\n // Find new unique constraints\n for (const uqName in currUniqueConstraints) {\n if (!(uqName in prevUniqueConstraints)) {\n diff.uniqueConstraints.created.push({\n ...currUniqueConstraints[uqName],\n table: tableName,\n } as SchemaUniqueConstraint & { table: string });\n }\n }\n\n // Find deleted unique constraints\n for (const uqName in prevUniqueConstraints) {\n if (!(uqName in currUniqueConstraints)) {\n diff.uniqueConstraints.deleted.push({\n ...prevUniqueConstraints[uqName],\n table: tableName,\n } as SchemaUniqueConstraint & { table: string });\n }\n }\n\n // Compare check constraints\n const prevCheckConstraints = prevTable.checkConstraints || {};\n const currCheckConstraints = currTable.checkConstraints || {};\n\n // Find new check constraints\n for (const checkName in currCheckConstraints) {\n if (!(checkName in prevCheckConstraints)) {\n diff.checkConstraints.created.push({\n ...currCheckConstraints[checkName],\n table: tableName,\n } as SchemaCheckConstraint & { table: string });\n }\n }\n\n // Find deleted check constraints\n for (const checkName in prevCheckConstraints) {\n if (!(checkName in currCheckConstraints)) {\n diff.checkConstraints.deleted.push({\n ...prevCheckConstraints[checkName],\n table: tableName,\n } as SchemaCheckConstraint & { table: string });\n }\n }\n\n // Compare foreign keys\n const prevFKs = prevTable.foreignKeys || {};\n const currFKs = currTable.foreignKeys || {};\n\n // Find new, deleted, and altered foreign keys\n for (const fkName in currFKs) {\n if (!(fkName in prevFKs)) {\n // New FK\n diff.foreignKeys.created.push(currFKs[fkName]);\n } else {\n // Check if FK definition changed (CASCADE behavior, etc.)\n const prevFK = prevFKs[fkName];\n const currFK = currFKs[fkName];\n\n // Compare FK properties\n const prevOnDelete = prevFK.onDelete || \"no action\";\n const currOnDelete = currFK.onDelete || \"no action\";\n const prevOnUpdate = prevFK.onUpdate || \"no action\";\n const currOnUpdate = currFK.onUpdate || \"no action\";\n\n if (prevOnDelete !== currOnDelete || prevOnUpdate !== currOnUpdate) {\n // FK CASCADE behavior changed - need to drop and recreate\n diff.foreignKeys.altered.push({\n old: prevFK,\n new: currFK,\n });\n }\n }\n }\n\n // Find deleted foreign keys (not altered)\n for (const fkName in prevFKs) {\n if (!(fkName in currFKs)) {\n const prevFK = prevFKs[fkName];\n diff.foreignKeys.deleted.push({\n ...prevFK,\n tableFrom: tableName,\n } as SchemaForeignKey);\n }\n }\n }\n }\n\n return diff;\n}\n\n/**\n * Check if a diff has any changes\n */\nexport function hasDiffChanges(diff: SchemaDiff): boolean {\n return (\n diff.tables.created.length > 0 ||\n diff.tables.deleted.length > 0 ||\n diff.tables.modified.length > 0 ||\n diff.columns.added.length > 0 ||\n diff.columns.deleted.length > 0 ||\n diff.columns.modified.length > 0 ||\n diff.indexes.created.length > 0 ||\n diff.indexes.deleted.length > 0 ||\n diff.indexes.altered.length > 0 ||\n diff.foreignKeys.created.length > 0 ||\n diff.foreignKeys.deleted.length > 0 ||\n diff.foreignKeys.altered.length > 0 ||\n diff.uniqueConstraints.created.length > 0 ||\n diff.uniqueConstraints.deleted.length > 0 ||\n diff.checkConstraints.created.length > 0 ||\n diff.checkConstraints.deleted.length > 0\n );\n}\n",
14
+ "import { is, SQL } from \"drizzle-orm\";\nimport { getTableConfig, type PgColumn, PgDialect, PgTable } from \"drizzle-orm/pg-core\";\nimport { extendedHash } from \"../crypto-utils\";\nimport type {\n IndexColumn,\n SchemaCheckConstraint,\n SchemaColumn,\n SchemaEnum,\n SchemaForeignKey,\n SchemaIndex,\n SchemaPrimaryKey,\n SchemaSnapshot,\n SchemaTable,\n SchemaUniqueConstraint,\n} from \"../types\";\n\n// Drizzle schema type - an object mapping table names to PgTable instances\ntype DrizzleSchema = Record<string, unknown>;\n\n// Array element type for building SQL arrays\ntype ArrayElement = number | bigint | boolean | string | Date | object | ArrayElement[];\n\n/**\n * Internal Drizzle column config interface.\n * PgColumn has internal properties not exposed in the public type definition.\n */\ninterface DrizzleColumnWithConfig {\n name: string;\n notNull: boolean;\n primary: boolean;\n getSQLType: () => string;\n default?: unknown;\n isUnique?: boolean;\n config?: {\n uniqueName?: string;\n uniqueType?: string;\n };\n}\n\nfunction hasDrizzleColumnConfig(column: PgColumn): column is PgColumn & DrizzleColumnWithConfig {\n return (\n \"config\" in column &&\n (typeof (column as { isUnique?: unknown }).isUnique === \"boolean\" ||\n (column as { isUnique?: unknown }).isUnique === undefined)\n );\n}\n\n/**\n * Utility functions from Drizzle's code\n */\nfunction escapeSingleQuotes(str: string): string {\n return str.replace(/'/g, \"''\");\n}\n\nfunction isPgArrayType(sqlType: string): boolean {\n return sqlType.match(/.*\\[\\d*\\].*|.*\\[\\].*/g) !== null;\n}\n\nfunction buildArrayString(array: ArrayElement[], sqlType: string): string {\n sqlType = sqlType.split(\"[\")[0];\n const values = array\n .map((value) => {\n if (typeof value === \"number\" || typeof value === \"bigint\") {\n return value.toString();\n } else if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n } else if (Array.isArray(value)) {\n return buildArrayString(value, sqlType);\n } else if (value instanceof Date) {\n if (sqlType === \"date\") {\n return `\"${value.toISOString().split(\"T\")[0]}\"`;\n } else if (sqlType === \"timestamp\") {\n return `\"${value.toISOString().replace(\"T\", \" \").slice(0, 23)}\"`;\n } else {\n return `\"${value.toISOString()}\"`;\n }\n } else if (typeof value === \"object\") {\n return `\"${JSON.stringify(value).replaceAll('\"', '\\\\\"')}\"`;\n }\n\n return `\"${value}\"`;\n })\n .join(\",\");\n\n return `{${values}}`;\n}\n\n/** Convert a Drizzle SQL expression to a string for extracting default values. */\nconst DEFAULT_PG_DIALECT = new PgDialect({ casing: undefined });\n\nconst sqlToStr = (sql: SQL, _casing: string | undefined) => {\n return DEFAULT_PG_DIALECT.sqlToQuery(sql).sql;\n};\n\n/**\n * Extract Drizzle tables from a schema object\n */\nfunction extractTablesFromSchema(schema: DrizzleSchema): PgTable[] {\n const tables: PgTable[] = [];\n\n // Iterate through all exports in the schema\n const exports = Object.values(schema);\n exports.forEach((t: unknown) => {\n // Check if it's a PgTable using Drizzle's is() function\n if (is(t, PgTable)) {\n tables.push(t);\n }\n });\n\n return tables;\n}\n\n/**\n * Generate a snapshot from a Drizzle schema\n * This is a port of Drizzle's pgSerializer.generatePgSnapshot\n */\nexport async function generateSnapshot(schema: DrizzleSchema): Promise<SchemaSnapshot> {\n const dialect = new PgDialect({ casing: undefined });\n const tables: Record<string, SchemaTable> = {};\n const schemas: Record<string, string> = {};\n const enums: Record<string, SchemaEnum> = {};\n\n // Extract tables from schema\n const pgTables = extractTablesFromSchema(schema);\n\n // Process each table\n for (const table of pgTables) {\n const config = getTableConfig(table);\n const {\n name: tableName,\n columns,\n indexes,\n foreignKeys,\n schema: tableSchema,\n primaryKeys,\n uniqueConstraints,\n checks,\n } = config;\n\n const columnsObject: Record<string, SchemaColumn> = {};\n const indexesObject: Record<string, SchemaIndex> = {};\n const foreignKeysObject: Record<string, SchemaForeignKey> = {};\n const primaryKeysObject: Record<string, SchemaPrimaryKey> = {};\n const uniqueConstraintObject: Record<string, SchemaUniqueConstraint> = {};\n const checksObject: Record<string, SchemaCheckConstraint> = {};\n\n // Process columns - EXACT copy of Drizzle's logic\n columns.forEach((column: PgColumn) => {\n const name = column.name;\n const notNull = column.notNull;\n const primaryKey = column.primary;\n const sqlType = column.getSQLType();\n const sqlTypeLowered = sqlType.toLowerCase();\n\n const columnToSet: SchemaColumn = {\n name,\n type: sqlType,\n primaryKey,\n notNull,\n };\n\n // Handle defaults - EXACT copy from Drizzle's pgSerializer.ts lines 247-273\n if (column.default !== undefined) {\n if (is(column.default, SQL)) {\n columnToSet.default = sqlToStr(column.default, undefined);\n } else {\n if (typeof column.default === \"string\") {\n columnToSet.default = `'${escapeSingleQuotes(column.default)}'`;\n } else {\n if (sqlTypeLowered === \"jsonb\" || sqlTypeLowered === \"json\") {\n columnToSet.default = `'${JSON.stringify(column.default)}'::${sqlTypeLowered}`;\n } else if (column.default instanceof Date) {\n if (sqlTypeLowered === \"date\") {\n columnToSet.default = `'${column.default.toISOString().split(\"T\")[0]}'`;\n } else if (sqlTypeLowered === \"timestamp\") {\n columnToSet.default = `'${column.default.toISOString().replace(\"T\", \" \").slice(0, 23)}'`;\n } else {\n columnToSet.default = `'${column.default.toISOString()}'`;\n }\n } else if (isPgArrayType(sqlTypeLowered) && Array.isArray(column.default)) {\n columnToSet.default = `'${buildArrayString(column.default as ArrayElement[], sqlTypeLowered)}'`;\n } else {\n // Should do for all types\n // columnToSet.default = `'${column.default}'::${sqlTypeLowered}`;\n columnToSet.default = column.default as string | number | boolean;\n }\n }\n }\n }\n\n // Handle column-level unique constraints\n // IMPORTANT: Check isUnique, not just uniqueName presence!\n // Drizzle sets uniqueName for all columns but only unique ones should have constraints\n // Type assertion: accessing internal Drizzle column properties not in public types\n const columnConfig = hasDrizzleColumnConfig(column) ? column.config : undefined;\n if (hasDrizzleColumnConfig(column) && column.isUnique && columnConfig?.uniqueName) {\n uniqueConstraintObject[columnConfig.uniqueName] = {\n name: columnConfig.uniqueName,\n columns: [name],\n nullsNotDistinct: columnConfig.uniqueType === \"not distinct\",\n };\n }\n\n columnsObject[name] = columnToSet;\n });\n\n // Drizzle primary key interface\n interface DrizzlePrimaryKey {\n columns: Array<{ name: string }>;\n getName: () => string;\n }\n\n // Process primary keys\n primaryKeys.forEach((pk: DrizzlePrimaryKey) => {\n const columnNames = pk.columns.map((c) => c.name);\n const name = pk.getName();\n\n primaryKeysObject[name] = {\n name,\n columns: columnNames,\n };\n });\n\n // Drizzle unique constraint interface\n interface DrizzleUniqueConstraint {\n columns: Array<{ name: string }>;\n name?: string;\n nullsNotDistinct?: boolean;\n }\n\n // Process unique constraints\n uniqueConstraints.forEach((unq: DrizzleUniqueConstraint) => {\n const columnNames = unq.columns.map((c) => c.name);\n const name = unq.name || `${tableName}_${columnNames.join(\"_\")}_unique`;\n\n uniqueConstraintObject[name] = {\n name,\n columns: columnNames,\n nullsNotDistinct: unq.nullsNotDistinct,\n };\n });\n\n // Drizzle foreign key interfaces\n interface DrizzleForeignKeyReference {\n columns: Array<{ name: string }>;\n foreignColumns: Array<{ name: string }>;\n foreignTable: PgTable;\n }\n\n interface DrizzleForeignKey {\n reference: () => DrizzleForeignKeyReference;\n getName: () => string;\n onDelete?: string;\n onUpdate?: string;\n }\n\n // Process foreign keys - includes both explicit foreignKeys and inline references\n // Drizzle's getTableConfig automatically collects inline .references() into foreignKeys\n foreignKeys.forEach((fk: DrizzleForeignKey) => {\n const reference = fk.reference();\n const columnsFrom = reference.columns.map((it) => it.name);\n const columnsTo = reference.foreignColumns.map((it) => it.name);\n const tableTo = getTableConfig(reference.foreignTable).name;\n const schemaTo = getTableConfig(reference.foreignTable).schema || \"public\";\n\n const name = fk.getName();\n\n foreignKeysObject[name] = {\n name,\n tableFrom: tableName,\n schemaFrom: tableSchema, // Add source table schema\n tableTo,\n schemaTo,\n columnsFrom,\n columnsTo,\n onDelete: fk.onDelete || \"no action\",\n onUpdate: fk.onUpdate || \"no action\",\n };\n });\n\n // Drizzle index interfaces\n interface DrizzleIndexConfig {\n order?: string;\n nulls?: string;\n }\n\n interface DrizzleIndexColumn {\n name: string;\n indexConfig?: DrizzleIndexConfig;\n }\n\n interface DrizzleIndex {\n config: {\n columns: Array<DrizzleIndexColumn | SQL>;\n name?: string;\n unique?: boolean;\n method?: string;\n };\n }\n\n // Process indexes\n // Drizzle's getTableConfig returns indexes with internal types not exported from the package\n (indexes as DrizzleIndex[]).forEach((idx: DrizzleIndex) => {\n const indexCols = idx.config.columns;\n const indexColumns: IndexColumn[] = indexCols.map((col) => {\n if (is(col, SQL)) {\n return {\n expression: dialect.sqlToQuery(col).sql,\n isExpression: true,\n };\n } else {\n const indexCol: IndexColumn = {\n expression: col.name,\n isExpression: false,\n asc: col.indexConfig && col.indexConfig.order === \"asc\",\n };\n // Only add nulls if explicitly specified in the config\n if (col.indexConfig?.nulls) {\n indexCol.nulls = col.indexConfig.nulls;\n }\n return indexCol;\n }\n });\n\n const name =\n idx.config.name || `${tableName}_${indexColumns.map((c) => c.expression).join(\"_\")}_index`;\n\n indexesObject[name] = {\n name,\n columns: indexColumns,\n isUnique: idx.config.unique || false,\n method: idx.config.method || \"btree\",\n };\n });\n\n // Drizzle check constraint interface\n interface DrizzleCheck {\n name: string;\n value: SQL;\n }\n\n // Process check constraints\n if (checks) {\n checks.forEach((check: DrizzleCheck) => {\n const checkName = check.name;\n checksObject[checkName] = {\n name: checkName,\n value: dialect.sqlToQuery(check.value).sql,\n };\n });\n }\n\n // Build the table object\n tables[`${tableSchema || \"public\"}.${tableName}`] = {\n name: tableName,\n schema: tableSchema || \"public\",\n columns: columnsObject,\n indexes: indexesObject,\n foreignKeys: foreignKeysObject,\n compositePrimaryKeys: primaryKeysObject,\n uniqueConstraints: uniqueConstraintObject,\n checkConstraints: checksObject,\n };\n\n // Track schemas\n if (tableSchema && tableSchema !== \"public\") {\n schemas[tableSchema] = tableSchema;\n }\n }\n\n // Create snapshot in Drizzle's format\n const snapshot: SchemaSnapshot = {\n version: \"7\",\n dialect: \"postgresql\",\n tables,\n schemas,\n enums,\n _meta: {\n schemas: {},\n tables: {},\n columns: {},\n },\n };\n\n return snapshot;\n}\n\n/**\n * Calculate hash of a snapshot for change detection\n * Uses a browser-compatible hash function\n */\nexport function hashSnapshot(snapshot: SchemaSnapshot): string {\n const content = JSON.stringify(snapshot);\n return extendedHash(content);\n}\n\n/**\n * Create an empty snapshot for initial migration\n */\nexport function createEmptySnapshot(): SchemaSnapshot {\n return {\n version: \"7\",\n dialect: \"postgresql\",\n tables: {},\n schemas: {},\n enums: {},\n _meta: {\n schemas: {},\n tables: {},\n columns: {},\n },\n };\n}\n\n/**\n * Compare two snapshots and detect if there are changes\n */\nexport function hasChanges(\n previousSnapshot: SchemaSnapshot | null,\n currentSnapshot: SchemaSnapshot\n): boolean {\n // If no previous snapshot, there are definitely changes\n if (!previousSnapshot) {\n return Object.keys(currentSnapshot.tables).length > 0;\n }\n\n // Hash normalized snapshot payloads so nested schema changes are covered\n // without walking every table/column field by hand.\n const prevHash = hashSnapshot(previousSnapshot);\n const currHash = hashSnapshot(currentSnapshot);\n\n return prevHash !== currHash;\n}\n",
15
+ "import { logger } from \"@elizaos/core\";\nimport type {\n SchemaCheckConstraint,\n SchemaColumn,\n SchemaForeignKey,\n SchemaIndex,\n SchemaPrimaryKey,\n SchemaSnapshot,\n SchemaTable,\n SchemaUniqueConstraint,\n} from \"../types\";\nimport type { SchemaDiff } from \"./diff-calculator\";\n\n/**\n * Data loss detection result\n * Based on Drizzle's pgPushUtils approach\n */\nexport interface DataLossCheck {\n hasDataLoss: boolean;\n tablesToRemove: string[];\n columnsToRemove: string[];\n tablesToTruncate: string[];\n typeChanges: Array<{\n table: string;\n column: string;\n from: string;\n to: string;\n }>;\n warnings: string[];\n requiresConfirmation: boolean;\n}\n\n/**\n * Check for potential data loss in schema changes\n * Based on Drizzle's pgSuggestions function\n */\nexport function checkForDataLoss(diff: SchemaDiff): DataLossCheck {\n const result: DataLossCheck = {\n hasDataLoss: false,\n tablesToRemove: [],\n columnsToRemove: [],\n tablesToTruncate: [],\n typeChanges: [],\n warnings: [],\n requiresConfirmation: false,\n };\n\n // Check for table deletions\n if (diff.tables.deleted.length > 0) {\n result.hasDataLoss = true;\n result.requiresConfirmation = true;\n result.tablesToRemove = [...diff.tables.deleted];\n for (const table of diff.tables.deleted) {\n result.warnings.push(`Table \"${table}\" will be dropped with all its data`);\n }\n }\n\n // Check for column deletions\n if (diff.columns.deleted.length > 0) {\n result.hasDataLoss = true;\n result.requiresConfirmation = true;\n for (const col of diff.columns.deleted) {\n result.columnsToRemove.push(`${col.table}.${col.column}`);\n result.warnings.push(`Column \"${col.column}\" in table \"${col.table}\" will be dropped`);\n }\n }\n\n // Check for column type changes that might cause data loss\n for (const modified of diff.columns.modified) {\n const from = modified.changes.from;\n const to = modified.changes.to;\n\n if (!from || !to) continue;\n\n // Check if type change is destructive\n if (from.type !== to.type) {\n const isDestructive = checkIfTypeChangeIsDestructive(from.type, to.type);\n\n if (isDestructive) {\n result.hasDataLoss = true;\n result.requiresConfirmation = true;\n result.typeChanges.push({\n table: modified.table,\n column: modified.column,\n from: from.type,\n to: to.type,\n });\n result.tablesToTruncate.push(modified.table);\n result.warnings.push(\n `Column \"${modified.column}\" in table \"${modified.table}\" changes type from \"${from.type}\" to \"${to.type}\". ` +\n `This may require truncating the table to avoid data conversion errors.`\n );\n }\n }\n\n // Check for adding NOT NULL without default to existing column\n if (!from.notNull && to.notNull && !to.default) {\n result.hasDataLoss = true;\n result.requiresConfirmation = true;\n result.warnings.push(\n `Column \"${modified.column}\" in table \"${modified.table}\" is becoming NOT NULL without a default value. ` +\n `This will fail if the table contains NULL values.`\n );\n }\n }\n\n // Check for adding NOT NULL columns without defaults\n for (const added of diff.columns.added) {\n if (added.definition.notNull && !added.definition.default) {\n // This is only a problem if the table already has data\n // We'll flag it as a potential issue\n result.warnings.push(\n `Column \"${added.column}\" is being added to table \"${added.table}\" as NOT NULL without a default value. ` +\n `This will fail if the table contains data.`\n );\n // Don't set requiresConfirmation here - it's only a warning\n }\n }\n\n return result;\n}\n\n/**\n * Normalize SQL types for comparison\n * Handles equivalent type variations between introspected DB and schema definitions\n */\nfunction normalizeType(type: string | undefined): string {\n if (!type) return \"\";\n\n const normalized = type.toLowerCase().trim();\n\n // Handle timestamp variations - all are equivalent\n if (\n normalized === \"timestamp without time zone\" ||\n normalized === \"timestamp with time zone\" ||\n normalized === \"timestamptz\"\n ) {\n return \"timestamp\";\n }\n\n // Handle serial vs integer with identity\n // serial is essentially integer with auto-increment\n if (normalized === \"serial\") {\n return \"integer\";\n }\n if (normalized === \"bigserial\") {\n return \"bigint\";\n }\n if (normalized === \"smallserial\") {\n return \"smallint\";\n }\n\n // Handle numeric/decimal equivalence\n if (normalized.startsWith(\"numeric\") || normalized.startsWith(\"decimal\")) {\n // Extract precision and scale if present\n const match = normalized.match(/\\((\\d+)(?:,\\s*(\\d+))?\\)/);\n if (match) {\n return `numeric(${match[1]}${match[2] ? `,${match[2]}` : \"\"})`;\n }\n return \"numeric\";\n }\n\n // Handle varchar/character varying\n if (normalized.startsWith(\"character varying\")) {\n return normalized.replace(\"character varying\", \"varchar\");\n }\n\n // Handle text array variations\n if (normalized === \"text[]\" || normalized === \"_text\") {\n return \"text[]\";\n }\n\n return normalized;\n}\n\n/**\n * Check if a type change is destructive\n * Based on PostgreSQL's type casting rules\n */\nfunction checkIfTypeChangeIsDestructive(fromType: string, toType: string): boolean {\n // First normalize the types to handle equivalent variations\n const normalizedFrom = normalizeType(fromType);\n const normalizedTo = normalizeType(toType);\n\n // If normalized types match, it's not destructive\n if (normalizedFrom === normalizedTo) {\n return false;\n }\n\n // Safe conversions (PostgreSQL) - based on Drizzle's logic\n const safeConversions: Record<string, string[]> = {\n smallint: [\"integer\", \"bigint\", \"numeric\", \"real\", \"double precision\"],\n integer: [\"bigint\", \"numeric\", \"real\", \"double precision\"],\n bigint: [\"numeric\"],\n real: [\"double precision\"],\n varchar: [\"text\"],\n char: [\"varchar\", \"text\"],\n citext: [\"text\"],\n text: [\"citext\"],\n // UUID to text is safe\n uuid: [\"text\", \"varchar\"],\n // Timestamp variations are generally safe (now handled by normalization)\n timestamp: [\"timestamp\"], // Simplified since normalization handles variations\n // Date/time conversions\n date: [\"timestamp\"],\n time: [\"timetz\"],\n };\n\n const fromBase = normalizedFrom.split(\"(\")[0];\n const toBase = normalizedTo.split(\"(\")[0];\n\n // Same type is always safe\n if (fromBase === toBase) {\n return false;\n }\n\n // Check if it's a safe conversion\n const safeTo = safeConversions[fromBase];\n if (safeTo?.includes(toBase)) {\n return false;\n }\n\n // All other conversions are considered potentially destructive\n return true;\n}\n\n/**\n * Generate SQL statements from a schema diff\n * This follows Drizzle's approach: create all tables first, then add foreign keys\n */\nexport async function generateMigrationSQL(\n previousSnapshot: SchemaSnapshot | null,\n currentSnapshot: SchemaSnapshot,\n diff?: SchemaDiff\n): Promise<string[]> {\n const statements: string[] = [];\n\n // If no diff provided, calculate it\n if (!diff) {\n const { calculateDiff } = await import(\"./diff-calculator\");\n diff = await calculateDiff(previousSnapshot, currentSnapshot);\n }\n\n // Check for data loss\n const dataLossCheck = checkForDataLoss(diff);\n\n // Log warnings if any\n if (dataLossCheck.warnings.length > 0) {\n logger.warn(\n { src: \"plugin:sql\", warnings: dataLossCheck.warnings },\n \"Schema changes may cause data loss\"\n );\n }\n\n // Phase 1: Collect unique schemas and create them first\n const schemasToCreate = new Set<string>();\n for (const tableName of diff.tables.created) {\n const table = currentSnapshot.tables[tableName];\n if (table) {\n const schema = table.schema || \"public\";\n if (schema !== \"public\") {\n schemasToCreate.add(schema);\n }\n }\n }\n\n // Create schemas first (following drizzle-kit pattern)\n for (const schema of schemasToCreate) {\n statements.push(`CREATE SCHEMA IF NOT EXISTS \"${schema}\";`);\n }\n\n // Phase 2: Generate CREATE TABLE statements for new tables (WITHOUT foreign keys)\n const createTableStatements: string[] = [];\n const foreignKeyStatements: string[] = [];\n\n for (const tableName of diff.tables.created) {\n const table = currentSnapshot.tables[tableName];\n if (table) {\n const { tableSQL, fkSQLs } = generateCreateTableSQL(tableName, table);\n createTableStatements.push(tableSQL);\n foreignKeyStatements.push(...fkSQLs);\n }\n }\n\n // Add all CREATE TABLE statements\n statements.push(...createTableStatements);\n\n // Phase 3: Add all foreign keys AFTER tables are created\n // Deduplicate foreign key statements to avoid duplicate constraints\n const uniqueFKs = new Set<string>();\n const dedupedFKStatements: string[] = [];\n\n for (const fkSQL of foreignKeyStatements) {\n // Extract constraint name to check for duplicates\n const match = fkSQL.match(/ADD CONSTRAINT \"([^\"]+)\"/);\n if (match) {\n const constraintName = match[1];\n if (!uniqueFKs.has(constraintName)) {\n uniqueFKs.add(constraintName);\n dedupedFKStatements.push(fkSQL);\n }\n } else {\n dedupedFKStatements.push(fkSQL);\n }\n }\n\n statements.push(...dedupedFKStatements);\n\n // Phase 4: Handle table modifications\n\n // Generate DROP TABLE statements for deleted tables\n for (const tableName of diff.tables.deleted) {\n const [schema, name] = tableName.includes(\".\") ? tableName.split(\".\") : [\"public\", tableName];\n statements.push(`DROP TABLE IF EXISTS \"${schema}\".\"${name}\" CASCADE;`);\n }\n\n // Generate ALTER TABLE statements for column changes\n // Handle column additions\n for (const added of diff.columns.added) {\n statements.push(generateAddColumnSQL(added.table, added.column, added.definition));\n }\n\n // Handle column deletions\n for (const deleted of diff.columns.deleted) {\n statements.push(generateDropColumnSQL(deleted.table, deleted.column));\n }\n\n // Handle column modifications\n for (const modified of diff.columns.modified) {\n const alterStatements = generateAlterColumnSQL(\n modified.table,\n modified.column,\n modified.changes\n );\n statements.push(...alterStatements);\n }\n\n // Generate DROP INDEX statements (including altered ones - drop old version)\n for (const index of diff.indexes.deleted) {\n statements.push(generateDropIndexSQL(index));\n }\n\n // Drop old version of altered indexes\n for (const alteredIndex of diff.indexes.altered) {\n statements.push(generateDropIndexSQL(alteredIndex.old));\n }\n\n // Generate CREATE INDEX statements (including altered ones - create new version)\n for (const index of diff.indexes.created) {\n statements.push(generateCreateIndexSQL(index));\n }\n\n // Create new version of altered indexes\n for (const alteredIndex of diff.indexes.altered) {\n statements.push(generateCreateIndexSQL(alteredIndex.new));\n }\n\n // Generate CREATE UNIQUE CONSTRAINT statements\n for (const constraint of diff.uniqueConstraints.created) {\n // Skip if it's part of a new table (already handled)\n const isNewTable = diff.tables.created.some((tableName) => {\n const [schema, table] = tableName.includes(\".\")\n ? tableName.split(\".\")\n : [\"public\", tableName];\n const constraintTable =\n (constraint as SchemaUniqueConstraint & { table?: string }).table || \"\";\n const [constraintSchema, constraintTableName] = constraintTable.includes(\".\")\n ? constraintTable.split(\".\")\n : [\"public\", constraintTable];\n return table === constraintTableName && schema === constraintSchema;\n });\n\n if (!isNewTable) {\n statements.push(generateCreateUniqueConstraintSQL(constraint));\n }\n }\n\n // Generate DROP UNIQUE CONSTRAINT statements\n for (const constraint of diff.uniqueConstraints.deleted) {\n statements.push(generateDropUniqueConstraintSQL(constraint));\n }\n\n // Generate CREATE CHECK CONSTRAINT statements\n for (const constraint of diff.checkConstraints.created) {\n // Skip if it's part of a new table (already handled)\n const isNewTable = diff.tables.created.some((tableName) => {\n const [schema, table] = tableName.includes(\".\")\n ? tableName.split(\".\")\n : [\"public\", tableName];\n const constraintTable =\n (constraint as SchemaCheckConstraint & { table?: string }).table || \"\";\n const [constraintSchema, constraintTableName] = constraintTable.includes(\".\")\n ? constraintTable.split(\".\")\n : [\"public\", constraintTable];\n return table === constraintTableName && schema === constraintSchema;\n });\n\n if (!isNewTable) {\n statements.push(generateCreateCheckConstraintSQL(constraint));\n }\n }\n\n // Generate DROP CHECK CONSTRAINT statements\n for (const constraint of diff.checkConstraints.deleted) {\n statements.push(generateDropCheckConstraintSQL(constraint));\n }\n\n // Handle foreign key deletions first (including altered ones)\n for (const fk of diff.foreignKeys.deleted) {\n statements.push(generateDropForeignKeySQL(fk));\n }\n\n // Drop old version of altered foreign keys\n for (const alteredFK of diff.foreignKeys.altered) {\n statements.push(generateDropForeignKeySQL(alteredFK.old));\n }\n\n // Handle foreign key creations (for existing tables)\n for (const fk of diff.foreignKeys.created) {\n // Only add if it's not part of a new table (those were handled above)\n // Check both with and without schema prefix\n const tableFrom = fk.tableFrom || \"\";\n const schemaFrom = fk.schemaFrom || \"public\";\n\n const isNewTable = diff.tables.created.some((tableName) => {\n // Compare table names, handling schema prefixes\n const [createdSchema, createdTable] = tableName.includes(\".\")\n ? tableName.split(\".\")\n : [\"public\", tableName];\n\n // Compare using the actual schema and table from the FK\n return createdTable === tableFrom && createdSchema === schemaFrom;\n });\n\n if (!isNewTable) {\n statements.push(generateCreateForeignKeySQL(fk));\n }\n }\n\n // Create new version of altered foreign keys\n for (const alteredFK of diff.foreignKeys.altered) {\n statements.push(generateCreateForeignKeySQL(alteredFK.new));\n }\n\n return statements;\n}\n\n/**\n * Generate CREATE TABLE SQL (following Drizzle's pattern)\n * Returns the table creation SQL and separate foreign key SQLs\n */\nfunction generateCreateTableSQL(\n fullTableName: string,\n table: SchemaTable\n): { tableSQL: string; fkSQLs: string[] } {\n const [schema, tableName] = fullTableName.includes(\".\")\n ? fullTableName.split(\".\")\n : [\"public\", fullTableName];\n const columns: string[] = [];\n const fkSQLs: string[] = [];\n\n // Add columns\n for (const [colName, colDef] of Object.entries(table.columns || {})) {\n columns.push(generateColumnDefinition(colName, colDef));\n }\n\n // Add composite primary keys if exists\n const primaryKeys = table.compositePrimaryKeys || {};\n for (const [pkName, pkDef] of Object.entries(primaryKeys)) {\n const pk = pkDef as SchemaPrimaryKey;\n if (pk.columns && pk.columns.length > 0) {\n columns.push(\n `CONSTRAINT \"${pkName}\" PRIMARY KEY (${pk.columns.map((c) => `\"${c}\"`).join(\", \")})`\n );\n }\n }\n\n // Add unique constraints\n const uniqueConstraints = table.uniqueConstraints || {};\n for (const [uqName, uqDef] of Object.entries(uniqueConstraints)) {\n const uq = uqDef as SchemaUniqueConstraint;\n if (uq.columns && uq.columns.length > 0) {\n const uniqueDef = uq.nullsNotDistinct\n ? `CONSTRAINT \"${uqName}\" UNIQUE NULLS NOT DISTINCT (${uq.columns.map((c) => `\"${c}\"`).join(\", \")})`\n : `CONSTRAINT \"${uqName}\" UNIQUE (${uq.columns.map((c) => `\"${c}\"`).join(\", \")})`;\n columns.push(uniqueDef);\n }\n }\n\n // Add check constraints\n const checkConstraints = table.checkConstraints || {};\n for (const [checkName, checkDef] of Object.entries(checkConstraints)) {\n const check = checkDef as SchemaCheckConstraint;\n if (check.value) {\n columns.push(`CONSTRAINT \"${checkName}\" CHECK (${check.value})`);\n }\n }\n\n // Following drizzle-kit pattern: don't create schema here, it's handled separately\n const tableSQL = `CREATE TABLE IF NOT EXISTS \"${schema}\".\"${tableName}\" (\\n ${columns.join(\",\\n \")}\\n);`;\n\n // Collect foreign keys to be added AFTER all tables are created\n const foreignKeys = table.foreignKeys || {};\n for (const [fkName, fkDef] of Object.entries(foreignKeys)) {\n const fk = fkDef as SchemaForeignKey;\n const fkSQL = wrapConstraintCreationGuard(\n fkName,\n buildCreateForeignKeyBodySQL({\n ...fk,\n name: fkName,\n schemaFrom: schema,\n tableFrom: tableName,\n })\n );\n fkSQLs.push(fkSQL);\n }\n\n return { tableSQL, fkSQLs };\n}\n\n/**\n * Generate column definition (following Drizzle's pattern)\n */\nfunction generateColumnDefinition(name: string, def: SchemaColumn): string {\n let sql = `\"${name}\" ${def.type}`;\n\n // Handle primary key that's not part of composite\n if (def.primaryKey && !def.type.includes(\"SERIAL\")) {\n sql += \" PRIMARY KEY\";\n }\n\n // Add NOT NULL constraint\n if (def.notNull) {\n sql += \" NOT NULL\";\n }\n\n // Add DEFAULT value - properly formatted\n if (def.default !== undefined) {\n const defaultValue = formatDefaultValue(def.default, def.type);\n sql += ` DEFAULT ${defaultValue}`;\n }\n\n return sql;\n}\n\n/**\n * Generate ALTER TABLE ADD COLUMN SQL\n * Based on Drizzle's PgAlterTableAddColumnConvertor\n */\nfunction generateAddColumnSQL(table: string, column: string, definition: SchemaColumn): string {\n const [schema, tableName] = table.includes(\".\") ? table.split(\".\") : [\"public\", table];\n const tableNameWithSchema = `\"${schema}\".\"${tableName}\"`;\n\n // Build column definition parts in the correct order (like Drizzle)\n const parts: string[] = [`\"${column}\"`];\n\n // Type\n parts.push(definition.type);\n\n // Primary key\n if (definition.primaryKey) {\n parts.push(\"PRIMARY KEY\");\n }\n\n // Default value - needs proper formatting based on type\n if (definition.default !== undefined) {\n const defaultValue = formatDefaultValue(definition.default, definition.type);\n if (defaultValue) {\n parts.push(`DEFAULT ${defaultValue}`);\n }\n }\n\n // Generated columns\n const definitionWithGenerated = definition as SchemaColumn & {\n generated?: string;\n };\n if (definitionWithGenerated.generated) {\n parts.push(`GENERATED ALWAYS AS (${definitionWithGenerated.generated}) STORED`);\n }\n\n // NOT NULL constraint - comes after DEFAULT\n if (definition.notNull) {\n parts.push(\"NOT NULL\");\n }\n\n // IF NOT EXISTS makes this idempotent — important when a column was added by\n // a prior boot whose migration journal/snapshot didn't persist (e.g. crash\n // mid-bootstrap, manual ALTER, or .elizadb reset without journal reset).\n // PostgreSQL 9.6+ and PGlite both support this syntax.\n return `ALTER TABLE ${tableNameWithSchema} ADD COLUMN IF NOT EXISTS ${parts.join(\" \")};`;\n}\n\n/**\n * Generate ALTER TABLE DROP COLUMN SQL\n * Based on Drizzle's approach with CASCADE\n */\nfunction generateDropColumnSQL(table: string, column: string): string {\n const [schema, tableName] = table.includes(\".\") ? table.split(\".\") : [\"public\", table];\n const tableNameWithSchema = `\"${schema}\".\"${tableName}\"`;\n // IF EXISTS for the same idempotency reasons as ADD COLUMN above.\n return `ALTER TABLE ${tableNameWithSchema} DROP COLUMN IF EXISTS \"${column}\" CASCADE;`;\n}\n\n// Column change tracking interface\ninterface ColumnChangeInfo {\n from?: SchemaColumn;\n to?: SchemaColumn;\n}\n\n/**\n * Generate ALTER TABLE ALTER COLUMN SQL\n * Based on Drizzle's approach with proper type casting and handling\n */\nfunction generateAlterColumnSQL(\n table: string,\n column: string,\n changes: ColumnChangeInfo\n): string[] {\n const [schema, tableName] = table.includes(\".\") ? table.split(\".\") : [\"public\", table];\n const tableNameWithSchema = `\"${schema}\".\"${tableName}\"`;\n const statements: string[] = [];\n\n // Handle type changes - need to handle enums and complex types\n const changesTo = changes.to;\n const changesFrom = changes.from;\n const changesToType = changesTo?.type;\n const changesFromType = changesFrom?.type;\n if (changesToType !== changesFromType) {\n const newType = changesToType || \"TEXT\";\n\n // Check if we need a USING clause for type conversion\n const needsUsing = checkIfNeedsUsingClause(changesFromType || \"\", newType);\n\n if (needsUsing) {\n // For complex type changes, use USING clause like Drizzle\n statements.push(\n `ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${column}\" TYPE ${newType} USING ${buildUsingExpression(column, changesFromType || \"\", newType)};`\n );\n } else {\n statements.push(\n `ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${column}\" SET DATA TYPE ${newType};`\n );\n }\n }\n\n // Handle NOT NULL changes\n const changesToNotNull = changesTo?.notNull;\n const changesFromNotNull = changesFrom?.notNull;\n if (changesToNotNull !== changesFromNotNull) {\n if (changesToNotNull) {\n // When adding NOT NULL, might need to set defaults for existing NULL values\n statements.push(`ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${column}\" SET NOT NULL;`);\n } else {\n statements.push(`ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${column}\" DROP NOT NULL;`);\n }\n }\n\n // Handle default value changes\n const changesToDefault = changesTo?.default;\n const changesFromDefault = changesFrom?.default;\n if (changesToDefault !== changesFromDefault) {\n if (changesToDefault !== undefined) {\n const defaultValue = formatDefaultValue(changesToDefault, changesToType || \"\");\n statements.push(\n `ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${column}\" SET DEFAULT ${defaultValue};`\n );\n } else {\n statements.push(`ALTER TABLE ${tableNameWithSchema} ALTER COLUMN \"${column}\" DROP DEFAULT;`);\n }\n }\n\n return statements;\n}\n\n/**\n * Build the USING expression for an ALTER COLUMN TYPE conversion.\n *\n * The generic `::text::<target>` bridge works for most conversions, but\n * Postgres rejects boolean text ('true'/'false') as integer input, so\n * boolean→integer must use the native cast (true→1, false→0) instead.\n */\nfunction buildUsingExpression(column: string, fromType: string, toType: string): string {\n const from = fromType.split(\"(\")[0].toLowerCase().trim();\n const to = toType.split(\"(\")[0].toLowerCase().trim();\n if (from === \"boolean\" && to === \"integer\") {\n return `\"${column}\"::${toType}`;\n }\n return `\"${column}\"::text::${toType}`;\n}\n\n/**\n * Check if a type change needs a USING clause\n * Based on Drizzle's type conversion logic\n */\nfunction checkIfNeedsUsingClause(fromType: string, toType: string): boolean {\n if (!fromType || !toType) return false;\n\n // Enum changes always need USING\n if (fromType.includes(\"enum\") || toType.includes(\"enum\")) {\n return true;\n }\n\n // Postgres introspection reports the canonical \"character varying\";\n // normalize to \"varchar\" so the pairs below (e.g. varchar→uuid) match.\n // Without this, an ALTER COLUMN id TYPE uuid is emitted without a USING\n // clause and Postgres rejects it (\"cannot be cast automatically\").\n const normalizeType = (t: string) => {\n const base = t.split(\"(\")[0].toLowerCase().trim();\n return base === \"character varying\" ? \"varchar\" : base;\n };\n const fromBase = normalizeType(fromType);\n const toBase = normalizeType(toType);\n\n // Text/varchar to JSONB always needs USING\n if (\n (fromBase === \"text\" || fromBase === \"varchar\") &&\n (toBase === \"jsonb\" || toBase === \"json\")\n ) {\n return true;\n }\n\n // Some specific type conversions need USING\n const needsUsingPairs = [\n [\"integer\", \"boolean\"],\n [\"boolean\", \"integer\"],\n [\"text\", \"integer\"],\n [\"text\", \"numeric\"],\n [\"text\", \"boolean\"],\n [\"text\", \"uuid\"],\n [\"text\", \"jsonb\"],\n [\"text\", \"json\"],\n [\"varchar\", \"integer\"],\n [\"varchar\", \"numeric\"],\n [\"varchar\", \"boolean\"],\n [\"varchar\", \"uuid\"],\n [\"varchar\", \"jsonb\"],\n [\"varchar\", \"json\"],\n // Add more as needed based on PostgreSQL casting rules\n ];\n\n for (const [from, to] of needsUsingPairs) {\n if ((fromBase === from && toBase === to) || (fromBase === to && toBase === from)) {\n return true;\n }\n }\n\n return false;\n}\n\n// Default value type - can be string, number, boolean, or null\ntype DefaultValue = string | number | boolean | null | undefined;\n\n/**\n * Format a default value for SQL\n * Based on Drizzle's default value formatting\n */\nfunction formatDefaultValue(value: DefaultValue, type: string): string {\n // Handle NULL\n if (value === null || value === \"NULL\") {\n return \"NULL\";\n }\n\n // Handle boolean\n if (type && (type.toLowerCase().includes(\"boolean\") || type.toLowerCase() === \"bool\")) {\n if (value === true || value === \"true\" || value === \"t\" || value === 1) {\n return \"true\";\n }\n if (value === false || value === \"false\" || value === \"f\" || value === 0) {\n return \"false\";\n }\n }\n\n // Handle numeric types\n if (type.match(/^(integer|bigint|smallint|numeric|decimal|real|double)/i)) {\n return String(value);\n }\n\n // Handle SQL expressions and pre-formatted defaults\n if (typeof value === \"string\") {\n // Already formatted with type cast (e.g., '[]'::jsonb, '{}'::jsonb)\n // These come from the snapshot and are already properly formatted\n if (value.includes(\"::\")) {\n return value;\n }\n\n // Already quoted string literals (from snapshot)\n // These start and end with single quotes\n if (value.startsWith(\"'\") && value.endsWith(\"'\")) {\n return value;\n }\n\n // SQL functions like now(), gen_random_uuid(), etc.\n if (value.match(/^\\w+\\(\\)/i) || (value.includes(\"(\") && value.includes(\")\"))) {\n return value;\n }\n\n // SQL expressions starting with CURRENT_\n if (value.toUpperCase().startsWith(\"CURRENT_\")) {\n return value;\n }\n\n // Otherwise, it's an unquoted string literal - wrap and escape\n return `'${value.replace(/'/g, \"''\")}'`;\n }\n\n // Default: return as-is\n return String(value);\n}\n\n// Extended index interface with table reference\ninterface SchemaIndexWithTableRef {\n name: string;\n columns: Array<{\n expression: string;\n isExpression: boolean;\n asc?: boolean;\n nulls?: string;\n }>;\n isUnique: boolean;\n method?: string;\n where?: string;\n concurrently?: boolean;\n table?: string;\n}\n\n/**\n * Generate CREATE INDEX SQL\n */\nfunction generateCreateIndexSQL(index: SchemaIndexWithTableRef): string {\n const unique = index.isUnique ? \"UNIQUE \" : \"\";\n const method = index.method || \"btree\";\n const columns = index.columns\n .map((c) => {\n if (c.isExpression) {\n return c.expression;\n }\n // Only add DESC if explicitly set to false, no NULLS clause by default\n return `\"${c.expression}\"${c.asc === false ? \" DESC\" : \"\"}`;\n })\n .join(\", \");\n\n // Extract index name and table with proper schema handling\n const indexName = index.name.includes(\".\") ? index.name.split(\".\")[1] : index.name;\n\n // Keep the full table name with schema if present\n let tableRef: string;\n const indexTable = index.table;\n if (indexTable?.includes(\".\")) {\n const [schema, table] = indexTable.split(\".\");\n tableRef = `\"${schema}\".\"${table}\"`;\n } else {\n tableRef = `\"${indexTable || \"\"}\"`;\n }\n\n // Include schema in table reference for correct index creation\n return `CREATE ${unique}INDEX IF NOT EXISTS \"${indexName}\" ON ${tableRef} USING ${method} (${columns});`;\n}\n\n/**\n * Generate DROP INDEX SQL\n */\nfunction generateDropIndexSQL(index: SchemaIndex | string): string {\n // Extract just the index name without schema\n const indexNameFull = typeof index === \"string\" ? index : index.name;\n const indexName = indexNameFull.includes(\".\") ? indexNameFull.split(\".\")[1] : indexNameFull;\n // Match Drizzle's format - no schema qualification\n return `DROP INDEX IF EXISTS \"${indexName}\";`;\n}\n\n/**\n * Generate CREATE FOREIGN KEY SQL (for existing tables)\n */\nfunction generateCreateForeignKeySQL(fk: SchemaForeignKey): string {\n return wrapConstraintCreationGuard(fk.name, buildCreateForeignKeyBodySQL(fk));\n}\n\n/**\n * Generate DROP FOREIGN KEY SQL\n */\nfunction generateDropForeignKeySQL(fk: SchemaForeignKey): string {\n const [schema, tableName] = fk.tableFrom\n ? fk.tableFrom.includes(\".\")\n ? fk.tableFrom.split(\".\")\n : [\"public\", fk.tableFrom]\n : [\"public\", \"\"];\n return `ALTER TABLE \"${schema}\".\"${tableName}\" DROP CONSTRAINT \"${fk.name}\";`;\n}\n\n/**\n * Generate SQL for renaming a table\n */\nexport function generateRenameTableSQL(oldName: string, newName: string): string {\n const [oldSchema, oldTable] = oldName.includes(\".\") ? oldName.split(\".\") : [\"public\", oldName];\n const [, newTable] = newName.includes(\".\") ? newName.split(\".\") : [\"public\", newName];\n return `ALTER TABLE \"${oldSchema}\".\"${oldTable}\" RENAME TO \"${newTable}\";`;\n}\n\n/**\n * Generate SQL for renaming a column\n */\nexport function generateRenameColumnSQL(table: string, oldName: string, newName: string): string {\n const [schema, tableName] = table.includes(\".\") ? table.split(\".\") : [\"public\", table];\n return `ALTER TABLE \"${schema}\".\"${tableName}\" RENAME COLUMN \"${oldName}\" TO \"${newName}\";`;\n}\n\n// Extended constraint interfaces with table reference\ninterface UniqueConstraintWithTable extends SchemaUniqueConstraint {\n table?: string;\n}\n\ninterface CheckConstraintWithTable extends SchemaCheckConstraint {\n table?: string;\n}\n\n/**\n * Generate CREATE UNIQUE CONSTRAINT SQL\n */\nfunction generateCreateUniqueConstraintSQL(constraint: UniqueConstraintWithTable): string {\n const table = constraint.table || \"\";\n const [schema, tableName] = table.includes(\".\") ? table.split(\".\") : [\"public\", table];\n\n const name = constraint.name;\n const columns = constraint.columns.map((c) => `\"${c}\"`).join(\", \");\n\n let sql = `ALTER TABLE \"${schema}\".\"${tableName}\" ADD CONSTRAINT \"${name}\" UNIQUE`;\n\n // Handle NULLS NOT DISTINCT if specified (PostgreSQL 15+)\n if (constraint.nullsNotDistinct) {\n sql += ` NULLS NOT DISTINCT`;\n }\n\n sql += ` (${columns});`;\n\n return sql;\n}\n\n/**\n * Generate DROP UNIQUE CONSTRAINT SQL\n */\nfunction generateDropUniqueConstraintSQL(constraint: UniqueConstraintWithTable): string {\n const table = constraint.table || \"\";\n const [schema, tableName] = table.includes(\".\") ? table.split(\".\") : [\"public\", table];\n\n return `ALTER TABLE \"${schema}\".\"${tableName}\" DROP CONSTRAINT \"${constraint.name}\";`;\n}\n\n/**\n * Generate CREATE CHECK CONSTRAINT SQL\n */\nfunction generateCreateCheckConstraintSQL(constraint: CheckConstraintWithTable): string {\n const table = constraint.table || \"\";\n const [schema, tableName] = table.includes(\".\") ? table.split(\".\") : [\"public\", table];\n\n const name = constraint.name;\n const value = constraint.value;\n\n return `ALTER TABLE \"${schema}\".\"${tableName}\" ADD CONSTRAINT \"${name}\" CHECK (${value});`;\n}\n\n/**\n * Generate DROP CHECK CONSTRAINT SQL\n */\nfunction generateDropCheckConstraintSQL(constraint: CheckConstraintWithTable): string {\n const table = constraint.table || \"\";\n const [schema, tableName] = table.includes(\".\") ? table.split(\".\") : [\"public\", table];\n\n return `ALTER TABLE \"${schema}\".\"${tableName}\" DROP CONSTRAINT \"${constraint.name}\";`;\n}\n\nfunction buildCreateForeignKeyBodySQL(fk: SchemaForeignKey): string {\n const schemaFrom = fk.schemaFrom || \"public\";\n const schemaTo = fk.schemaTo || \"public\";\n const tableFrom = fk.tableFrom;\n const columnsFrom = fk.columnsFrom.map((c: string) => `\"${c}\"`).join(\", \");\n const columnsTo = fk.columnsTo.map((c: string) => `\"${c}\"`).join(\", \");\n\n let sql = `ALTER TABLE \"${schemaFrom}\".\"${tableFrom}\" ADD CONSTRAINT \"${fk.name}\" FOREIGN KEY (${columnsFrom}) REFERENCES \"${schemaTo}\".\"${fk.tableTo}\" (${columnsTo})`;\n\n if (fk.onDelete) {\n sql += ` ON DELETE ${fk.onDelete}`;\n }\n\n if (fk.onUpdate) {\n sql += ` ON UPDATE ${fk.onUpdate}`;\n }\n\n return sql;\n}\n\nfunction wrapConstraintCreationGuard(constraintName: string, statement: string): string {\n const escapedConstraintName = constraintName.replace(/'/g, \"''\");\n return `DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = '${escapedConstraintName}') THEN ${statement}; END IF; END $$;`;\n}\n",
16
+ "import { logger } from \"@elizaos/core\";\nimport { sql } from \"drizzle-orm\";\nimport type { DrizzleDB } from \"./types\";\n\nexport class ExtensionManager {\n constructor(private db: DrizzleDB) {}\n\n async installRequiredExtensions(extensions: string[]): Promise<void> {\n for (const extension of extensions) {\n try {\n // Validate extension name to prevent SQL injection\n // Extension names should only contain alphanumeric characters, underscores, and hyphens\n if (!/^[a-zA-Z0-9_-]+$/.test(extension)) {\n logger.warn(\n { src: \"plugin:sql\", extension },\n \"Invalid extension name - contains invalid characters\"\n );\n continue;\n }\n\n // Use sql.identifier for safe escaping of SQL identifiers\n await this.db.execute(sql`CREATE EXTENSION IF NOT EXISTS ${sql.identifier(extension)}`);\n logger.debug({ src: \"plugin:sql\", extension }, \"Extension installed\");\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.warn(\n { src: \"plugin:sql\", extension, error: errorMessage },\n \"Could not install extension\"\n );\n // Some extensions might not be available or already installed\n // This shouldn't stop the migration process\n }\n }\n }\n}\n",
17
+ "import { sql } from \"drizzle-orm\";\nimport { getRow } from \"../../types\";\nimport type { DrizzleDB, Journal, JournalEntry } from \"../types\";\n\nexport class JournalStorage {\n constructor(private db: DrizzleDB) {}\n\n async loadJournal(pluginName: string): Promise<Journal | null> {\n const result = await this.db.execute(\n sql`SELECT version, dialect, entries \n FROM migrations._journal \n WHERE plugin_name = ${pluginName}`\n );\n\n if (result.rows.length === 0) {\n return null;\n }\n\n interface JournalRow {\n version: string;\n dialect: string;\n entries: JournalEntry[];\n }\n const row = getRow<JournalRow>(result);\n if (!row) {\n throw new Error(`Journal not found for plugin: ${pluginName}`);\n }\n return {\n version: row.version,\n dialect: row.dialect,\n entries: row.entries as JournalEntry[],\n };\n }\n\n async saveJournal(pluginName: string, journal: Journal): Promise<void> {\n await this.db.execute(\n sql`INSERT INTO migrations._journal (plugin_name, version, dialect, entries)\n VALUES (${pluginName}, ${journal.version}, ${journal.dialect}, ${JSON.stringify(journal.entries)}::jsonb)\n ON CONFLICT (plugin_name) \n DO UPDATE SET \n version = EXCLUDED.version,\n dialect = EXCLUDED.dialect,\n entries = EXCLUDED.entries`\n );\n }\n\n async addEntry(pluginName: string, entry: JournalEntry): Promise<void> {\n // First, get the current journal\n let journal = await this.loadJournal(pluginName);\n\n // If no journal exists, create a new one\n if (!journal) {\n journal = {\n version: \"7\", // Latest Drizzle version\n dialect: \"postgresql\",\n entries: [],\n };\n }\n\n // Add the new entry\n journal.entries.push(entry);\n\n // Save the updated journal\n await this.saveJournal(pluginName, journal);\n }\n\n async getNextIdx(pluginName: string): Promise<number> {\n const journal = await this.loadJournal(pluginName);\n\n if (!journal || journal.entries.length === 0) {\n return 0;\n }\n\n const lastEntry = journal.entries[journal.entries.length - 1];\n return lastEntry.idx + 1;\n }\n\n async updateJournal(\n pluginName: string,\n idx: number,\n tag: string,\n breakpoints: boolean = true\n ): Promise<void> {\n const entry: JournalEntry = {\n idx,\n version: \"7\",\n when: Date.now(),\n tag,\n breakpoints,\n };\n\n await this.addEntry(pluginName, entry);\n }\n}\n",
18
+ "import { sql } from \"drizzle-orm\";\nimport { getRow } from \"../../types\";\nimport type { DrizzleDB } from \"../types\";\n\nexport class MigrationTracker {\n constructor(private db: DrizzleDB) {}\n\n async ensureSchema(): Promise<void> {\n await this.db.execute(sql`CREATE SCHEMA IF NOT EXISTS migrations`);\n }\n\n async ensureTables(): Promise<void> {\n // Ensure schema exists\n await this.ensureSchema();\n\n // Create migrations table (like Drizzle's __drizzle_migrations)\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS migrations._migrations (\n id SERIAL PRIMARY KEY,\n plugin_name TEXT NOT NULL,\n hash TEXT NOT NULL,\n created_at BIGINT NOT NULL\n )\n `);\n\n // Create journal table (replaces _journal.json)\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS migrations._journal (\n plugin_name TEXT PRIMARY KEY,\n version TEXT NOT NULL,\n dialect TEXT NOT NULL DEFAULT 'postgresql',\n entries JSONB NOT NULL DEFAULT '[]'\n )\n `);\n\n // Create snapshots table (replaces snapshot JSON files)\n await this.db.execute(sql`\n CREATE TABLE IF NOT EXISTS migrations._snapshots (\n id SERIAL PRIMARY KEY,\n plugin_name TEXT NOT NULL,\n idx INTEGER NOT NULL,\n snapshot JSONB NOT NULL,\n created_at TIMESTAMP DEFAULT NOW(),\n UNIQUE(plugin_name, idx)\n )\n `);\n }\n\n async getLastMigration(pluginName: string): Promise<{\n id: number;\n hash: string;\n created_at: string;\n } | null> {\n const result = await this.db.execute(\n sql`SELECT id, hash, created_at\n FROM migrations._migrations\n WHERE plugin_name = ${pluginName}\n ORDER BY created_at DESC\n LIMIT 1`\n );\n interface MigrationRow {\n id: number;\n hash: string;\n created_at: string;\n }\n return getRow<MigrationRow>(result) || null;\n }\n\n async recordMigration(pluginName: string, hash: string, createdAt: number): Promise<void> {\n await this.db.execute(\n sql`INSERT INTO migrations._migrations (plugin_name, hash, created_at) \n VALUES (${pluginName}, ${hash}, ${createdAt})`\n );\n }\n}\n",
19
+ "import { sql } from \"drizzle-orm\";\nimport type { DrizzleDB, SchemaSnapshot } from \"../types\";\n\nexport class SnapshotStorage {\n constructor(private db: DrizzleDB) {}\n\n async saveSnapshot(pluginName: string, idx: number, snapshot: SchemaSnapshot): Promise<void> {\n await this.db.execute(\n sql`INSERT INTO migrations._snapshots (plugin_name, idx, snapshot)\n VALUES (${pluginName}, ${idx}, ${JSON.stringify(snapshot)}::jsonb)\n ON CONFLICT (plugin_name, idx) \n DO UPDATE SET \n snapshot = EXCLUDED.snapshot,\n created_at = NOW()`\n );\n }\n\n async loadSnapshot(pluginName: string, idx: number): Promise<SchemaSnapshot | null> {\n const result = await this.db.execute(\n sql`SELECT snapshot \n FROM migrations._snapshots \n WHERE plugin_name = ${pluginName} AND idx = ${idx}`\n );\n\n if (result.rows.length === 0) {\n return null;\n }\n\n return result.rows[0].snapshot as SchemaSnapshot;\n }\n\n async getLatestSnapshot(pluginName: string): Promise<SchemaSnapshot | null> {\n const result = await this.db.execute(\n sql`SELECT snapshot \n FROM migrations._snapshots \n WHERE plugin_name = ${pluginName}\n ORDER BY idx DESC\n LIMIT 1`\n );\n\n if (result.rows.length === 0) {\n return null;\n }\n\n return result.rows[0].snapshot as SchemaSnapshot;\n }\n\n async getAllSnapshots(pluginName: string): Promise<SchemaSnapshot[]> {\n const result = await this.db.execute(\n sql`SELECT snapshot \n FROM migrations._snapshots \n WHERE plugin_name = ${pluginName}\n ORDER BY idx ASC`\n );\n\n return result.rows.map((row) => row.snapshot as SchemaSnapshot);\n }\n}\n",
20
+ "import { logger } from \"@elizaos/core\";\nimport { sql } from \"drizzle-orm\";\nimport { getRow } from \"../types\";\nimport { stringToBigInt } from \"./crypto-utils\";\nimport { DatabaseIntrospector } from \"./drizzle-adapters/database-introspector\";\nimport { calculateDiff, hasDiffChanges } from \"./drizzle-adapters/diff-calculator\";\nimport { generateSnapshot, hasChanges, hashSnapshot } from \"./drizzle-adapters/snapshot-generator\";\nimport {\n checkForDataLoss,\n type DataLossCheck,\n generateMigrationSQL,\n} from \"./drizzle-adapters/sql-generator\";\nimport { ExtensionManager } from \"./extension-manager\";\nimport { deriveSchemaName } from \"./schema-transformer\";\nimport { JournalStorage } from \"./storage/journal-storage\";\nimport { MigrationTracker } from \"./storage/migration-tracker\";\nimport { SnapshotStorage } from \"./storage/snapshot-storage\";\nimport type { DrizzleDB, RuntimeMigrationOptions, SchemaSnapshot, SchemaTable } from \"./types\";\n\nexport class RuntimeMigrator {\n private migrationTracker: MigrationTracker;\n private journalStorage: JournalStorage;\n private snapshotStorage: SnapshotStorage;\n private extensionManager: ExtensionManager;\n private introspector: DatabaseIntrospector;\n\n constructor(private db: DrizzleDB) {\n this.migrationTracker = new MigrationTracker(db);\n this.journalStorage = new JournalStorage(db);\n this.snapshotStorage = new SnapshotStorage(db);\n this.extensionManager = new ExtensionManager(db);\n this.introspector = new DatabaseIntrospector(db);\n }\n\n /**\n * Get expected schema name for a plugin\n * @elizaos/plugin-sql uses 'public' schema (core application)\n * All other plugins should use namespaced schemas\n */\n private getExpectedSchemaName(pluginName: string): string {\n // Core plugin uses public schema\n if (pluginName === \"@elizaos/plugin-sql\") {\n return \"public\";\n }\n\n // Use the schema transformer's logic for consistency\n return deriveSchemaName(pluginName);\n }\n\n /**\n * Ensure all schemas used in the snapshot exist\n */\n private async ensureSchemasExist(snapshot: SchemaSnapshot): Promise<void> {\n const schemasToCreate = new Set<string>();\n\n // Collect all schemas from tables\n for (const table of Object.values(snapshot.tables)) {\n const schemaName = table.schema || \"public\";\n if (schemaName !== \"public\") {\n schemasToCreate.add(schemaName);\n }\n }\n\n // Also add schemas from the snapshot's schemas object\n for (const schema of Object.keys(snapshot.schemas || {})) {\n if (schema !== \"public\") {\n schemasToCreate.add(schema);\n }\n }\n\n // Create all non-public schemas\n for (const schemaName of schemasToCreate) {\n logger.debug({ src: \"plugin:sql\", schemaName }, \"Ensuring schema exists\");\n await this.db.execute(sql.raw(`CREATE SCHEMA IF NOT EXISTS \"${schemaName}\"`));\n }\n }\n\n /**\n * Validate schema usage and provide warnings\n */\n private validateSchemaUsage(pluginName: string, snapshot: SchemaSnapshot): void {\n const expectedSchema = this.getExpectedSchemaName(pluginName);\n const isCorePLugin = pluginName === \"@elizaos/plugin-sql\";\n\n for (const table of Object.values(snapshot.tables)) {\n const actualSchema = table.schema || \"public\";\n\n // Warn if non-core plugin is using public schema\n if (!isCorePLugin && actualSchema === \"public\") {\n logger.warn(\n {\n src: \"plugin:sql\",\n pluginName,\n tableName: table.name,\n expectedSchema,\n },\n \"Plugin table is using public schema - consider using pgSchema for better isolation\"\n );\n }\n\n // Warn if core plugin is not using public schema\n if (isCorePLugin && actualSchema !== \"public\") {\n logger.warn(\n {\n src: \"plugin:sql\",\n pluginName: \"@elizaos/plugin-sql\",\n tableName: table.name,\n actualSchema,\n },\n \"Core plugin table should use public schema\"\n );\n }\n }\n }\n\n /**\n * Generate a stable advisory lock ID from plugin name\n * PostgreSQL advisory locks use bigint, so we need to hash the plugin name\n * and convert to a stable bigint value\n * Uses browser-compatible hashing\n */\n private getAdvisoryLockId(pluginName: string): bigint {\n return stringToBigInt(pluginName);\n }\n\n /**\n * Validate that a value is a valid PostgreSQL bigint\n * PostgreSQL bigint range: -9223372036854775808 to 9223372036854775807\n */\n private validateBigInt(value: bigint): boolean {\n const MIN_BIGINT = -9223372036854775808n;\n const MAX_BIGINT = 9223372036854775807n;\n return value >= MIN_BIGINT && value <= MAX_BIGINT;\n }\n\n /**\n * Detect if a connection string represents a real PostgreSQL database\n * (not PGLite, in-memory, or other non-PostgreSQL databases)\n */\n private isRealPostgresDatabase(connectionUrl: string): boolean {\n if (!connectionUrl.trim()) return false;\n\n const url = connectionUrl.trim().toLowerCase();\n\n // Exclude non-PostgreSQL databases (check schemes first)\n const nonPgSchemes = [\"mysql://\", \"mysqli://\", \"mariadb://\", \"mongodb://\", \"mongodb+srv://\"];\n if (nonPgSchemes.some((s) => url.startsWith(s))) return false;\n\n // Always reject :memory: databases (even with postgres:// scheme, it's not valid)\n if (url.includes(\":memory:\")) return false;\n\n // PostgreSQL URL schemes - check BEFORE other exclude patterns\n // (a postgres:// URL may have \"sqlite\" in the database name, that's OK)\n const pgSchemes = [\n \"postgres://\",\n \"postgresql://\",\n \"postgis://\",\n \"pgbouncer://\",\n \"pgpool://\",\n \"cockroach://\",\n \"cockroachdb://\",\n \"redshift://\",\n \"timescaledb://\",\n \"yugabyte://\",\n ];\n if (pgSchemes.some((s) => url.startsWith(s))) return true;\n\n // Exclude PGLite, SQLite databases (only for non-postgres:// URLs)\n const excludePatterns = [\"pglite\", \"sqlite\"];\n const urlBase = url.split(\"?\")[0];\n if (excludePatterns.some((p) => url.includes(p))) return false;\n if (/\\.(db|sqlite|sqlite3)$/.test(urlBase)) return false;\n\n // Local PostgreSQL (localhost, 127.0.0.1, Docker service names)\n if (url.includes(\"localhost\") || url.includes(\"127.0.0.1\")) return true;\n\n // PostgreSQL connection params (libpq style)\n const connParams = [\n \"host=\",\n \"dbname=\",\n \"sslmode=\",\n \"connect_timeout=\",\n \"application_name=\",\n \"user=\",\n \"password=\",\n \"port=\",\n \"options=\",\n \"sslcert=\",\n \"sslkey=\",\n \"sslrootcert=\",\n \"fallback_application_name=\",\n \"keepalives=\",\n \"target_session_attrs=\",\n ];\n if (connParams.some((p) => url.includes(p))) return true;\n\n // user@host format with postgres keyword or port\n if (url.includes(\"@\") && (url.includes(\"postgres\") || /:\\d{4,5}/.test(url))) return true;\n\n // Common PostgreSQL ports\n if (/:(5432|5433|5434|6432|8432|9999|25060|26257)\\b/.test(url)) return true;\n\n // Cloud providers\n const cloudPatterns = [\n // AWS\n \"amazonaws.com\",\n \".rds.\",\n // Azure\n \"azure.com\",\n \"database.azure.com\",\n // Google Cloud\n \"googleusercontent\",\n \"cloudsql\",\n // Supabase\n \"supabase\",\n // Neon\n \"neon.tech\",\n \"neon.build\",\n // Railway\n \"railway.app\",\n \"railway.internal\",\n // Render\n \"render.com\",\n \"onrender.com\",\n // Heroku\n \"heroku\",\n // TimescaleDB\n \"timescale\",\n \".tsdb.cloud\",\n // CockroachDB\n \"cockroachlabs\",\n \"cockroachdb.cloud\",\n \".crdb.io\",\n // DigitalOcean\n \"digitalocean\",\n \"db.ondigitalocean\",\n \"do-user-\",\n // Aiven\n \"aiven\",\n // Crunchy Data\n \"crunchydata\",\n // ElephantSQL\n \"elephantsql\",\n // YugabyteDB\n \"yugabyte\",\n // Scaleway\n \"scaleway\",\n \".rdb.fr-par.scw.cloud\",\n // Vercel Postgres\n \"vercel-storage\",\n // PlanetScale\n \"psdb.cloud\",\n // Xata\n \"xata.sh\",\n // Fly.io\n \"fly.dev\",\n \"fly.io\",\n ];\n if (cloudPatterns.some((p) => url.includes(p))) return true;\n\n // IP:port patterns (IPv4 and IPv6)\n if (/\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:\\d{1,5}/.test(url)) return true;\n if (/\\[[0-9a-f:]+\\](:\\d{1,5})?/i.test(connectionUrl)) return true;\n\n // host:port/database format (Docker Compose, etc.)\n if (/^[a-z0-9_.-]+:\\d{1,5}\\/[a-z0-9_-]+/i.test(connectionUrl)) return true;\n\n logger.debug(\n { src: \"plugin:sql\", urlPreview: url.substring(0, 50) },\n \"Connection string did not match any PostgreSQL patterns\"\n );\n return false;\n }\n\n /**\n * Initialize migration system - create necessary tables\n * @throws Error if table creation fails\n */\n async initialize(): Promise<void> {\n logger.info({ src: \"plugin:sql\" }, \"Initializing migration system\");\n await this.migrationTracker.ensureTables();\n logger.info({ src: \"plugin:sql\" }, \"Migration system initialized\");\n }\n\n /**\n * Run migrations for a plugin/schema\n * @param pluginName - Plugin identifier\n * @param schema - Drizzle schema object\n * @param options - Migration options (verbose, force, dryRun, allowDataLoss)\n * @throws Error if destructive migrations blocked or migration fails\n */\n async migrate(\n pluginName: string,\n schema: Record<string, unknown>,\n options: RuntimeMigrationOptions = {}\n ): Promise<void> {\n const lockId = this.getAdvisoryLockId(pluginName);\n\n // Validate lockId is within PostgreSQL bigint range\n if (!this.validateBigInt(lockId)) {\n throw new Error(`Invalid advisory lock ID generated for plugin ${pluginName}`);\n }\n\n let lockAcquired = false;\n\n try {\n logger.info({ src: \"plugin:sql\", pluginName }, \"Starting migration for plugin\");\n\n // Ensure migration tables exist\n await this.initialize();\n\n // Only use advisory locks for real PostgreSQL databases\n // Skip for PGLite or development databases\n const postgresUrl = process.env.POSTGRES_URL || process.env.DATABASE_URL || \"\";\n const isRealPostgres = this.isRealPostgresDatabase(postgresUrl);\n\n if (isRealPostgres) {\n try {\n logger.debug({ src: \"plugin:sql\", pluginName }, \"Using PostgreSQL advisory locks\");\n\n // Convert bigint to string for SQL query\n // The sql tagged template will properly parameterize this value\n const lockIdStr = lockId.toString();\n\n const lockResult = await this.db.execute(\n sql`SELECT pg_try_advisory_lock(CAST(${lockIdStr} AS bigint)) as acquired`\n );\n\n interface LockResultRow {\n acquired: boolean;\n }\n lockAcquired = getRow<LockResultRow>(lockResult)?.acquired === true;\n\n if (!lockAcquired) {\n logger.info(\n { src: \"plugin:sql\", pluginName },\n \"Migration already in progress, waiting for lock\"\n );\n\n // Wait for the lock (blocking call)\n await this.db.execute(sql`SELECT pg_advisory_lock(CAST(${lockIdStr} AS bigint))`);\n lockAcquired = true;\n\n logger.info({ src: \"plugin:sql\", pluginName }, \"Lock acquired\");\n } else {\n logger.debug(\n { src: \"plugin:sql\", pluginName, lockId: lockIdStr },\n \"Advisory lock acquired\"\n );\n }\n } catch (lockError) {\n // If advisory locks fail, log but continue\n // This might happen if the PostgreSQL version doesn't support advisory locks\n logger.warn(\n {\n src: \"plugin:sql\",\n pluginName,\n error: lockError instanceof Error ? lockError.message : String(lockError),\n },\n \"Failed to acquire advisory lock, continuing without lock\"\n );\n lockAcquired = false;\n }\n } else {\n // For PGLite or other development databases, skip advisory locks\n logger.debug(\n { src: \"plugin:sql\" },\n \"Development database detected, skipping advisory locks\"\n );\n }\n\n // Install required extensions\n // pgcrypto is only needed for real PostgreSQL (PGLite uses native gen_random_uuid)\n const extensions = isRealPostgres\n ? [\"vector\", \"fuzzystrmatch\", \"pgcrypto\"]\n : [\"vector\", \"fuzzystrmatch\"];\n await this.extensionManager.installRequiredExtensions(extensions);\n\n // Generate current snapshot from schema\n const currentSnapshot = await generateSnapshot(schema);\n\n // Ensure all schemas referenced in the snapshot exist\n await this.ensureSchemasExist(currentSnapshot);\n\n // Validate schema usage and warn about potential issues\n this.validateSchemaUsage(pluginName, currentSnapshot);\n\n const currentHash = hashSnapshot(currentSnapshot);\n\n // Check if we've already run this exact migration\n // This check happens AFTER acquiring the lock to handle concurrent scenarios\n // This is critical: if we had to wait for the lock (lockAcquired was initially false),\n // another process may have completed the migration while we were waiting\n // We MUST check regardless of whether lastMigration existed before\n const lastMigration = await this.migrationTracker.getLastMigration(pluginName);\n if (lastMigration && lastMigration.hash === currentHash) {\n logger.info(\n { src: \"plugin:sql\", pluginName, hash: currentHash },\n \"No changes detected, skipping migration\"\n );\n return;\n }\n\n // Load previous snapshot\n let previousSnapshot = await this.snapshotStorage.getLatestSnapshot(pluginName);\n\n // If no snapshot exists but tables exist in database, introspect them\n if (!previousSnapshot && Object.keys(currentSnapshot.tables).length > 0) {\n const hasExistingTables = await this.introspector.hasExistingTables(pluginName);\n\n if (hasExistingTables) {\n logger.info(\n { src: \"plugin:sql\", pluginName },\n \"No snapshot found but tables exist in database, introspecting\"\n );\n\n // Determine the schema name for introspection\n const schemaName = this.getExpectedSchemaName(pluginName);\n\n // Introspect the current database state\n const introspectedSnapshot = await this.introspector.introspectSchema(schemaName);\n\n // IMPORTANT: Filter the introspected snapshot to only include tables that are\n // defined in the current schema. This prevents tables from other plugins\n // (e.g., gamification tables in 'public' schema) from being marked as \"orphans\"\n // and scheduled for deletion.\n const expectedTableNames = new Set<string>();\n for (const tableKey of Object.keys(currentSnapshot.tables)) {\n const tableData = currentSnapshot.tables[tableKey];\n const tableName = tableData.name || tableKey.split(\".\").pop() || \"\";\n expectedTableNames.add(tableName);\n }\n\n // Filter introspected tables to only those in the current schema\n const filteredTables: Record<string, SchemaTable> = {};\n for (const tableKey of Object.keys(introspectedSnapshot.tables)) {\n const tableData = introspectedSnapshot.tables[tableKey];\n const tableName = tableData.name || tableKey.split(\".\").pop() || \"\";\n if (expectedTableNames.has(tableName)) {\n filteredTables[tableKey] = tableData;\n } else {\n logger.debug(\n { src: \"plugin:sql\", pluginName, tableName },\n \"Ignoring table from introspection (not in current schema)\"\n );\n }\n }\n\n // Use filtered snapshot\n const filteredSnapshot = {\n ...introspectedSnapshot,\n tables: filteredTables,\n };\n\n // Only use the introspected snapshot if it has tables\n if (Object.keys(filteredSnapshot.tables).length > 0) {\n // Save this as the initial snapshot (idx: 0)\n await this.snapshotStorage.saveSnapshot(pluginName, 0, filteredSnapshot);\n\n // Update journal to record this initial state\n await this.journalStorage.updateJournal(\n pluginName,\n 0,\n `introspected_${Date.now()}`,\n true\n );\n\n // Record this as a migration\n const filteredHash = hashSnapshot(filteredSnapshot);\n await this.migrationTracker.recordMigration(pluginName, filteredHash, Date.now());\n\n logger.info(\n { src: \"plugin:sql\", pluginName },\n \"Created initial snapshot from existing database\"\n );\n\n // Set this as the previous snapshot for comparison\n previousSnapshot = filteredSnapshot;\n }\n }\n }\n\n // Check if there are actual changes\n if (!hasChanges(previousSnapshot, currentSnapshot)) {\n logger.info({ src: \"plugin:sql\", pluginName }, \"No schema changes\");\n\n // For empty schemas, we still want to record the migration\n // to ensure idempotency and consistency\n if (!previousSnapshot && Object.keys(currentSnapshot.tables).length === 0) {\n logger.info({ src: \"plugin:sql\", pluginName }, \"Recording empty schema\");\n await this.migrationTracker.recordMigration(pluginName, currentHash, Date.now());\n const idx = await this.journalStorage.getNextIdx(pluginName);\n const tag = this.generateMigrationTag(idx, pluginName);\n await this.journalStorage.updateJournal(pluginName, idx, tag, true);\n await this.snapshotStorage.saveSnapshot(pluginName, idx, currentSnapshot);\n }\n\n return;\n }\n\n // Calculate diff\n const diff = await calculateDiff(previousSnapshot, currentSnapshot);\n\n // Check if diff has changes\n if (!hasDiffChanges(diff)) {\n logger.info({ src: \"plugin:sql\", pluginName }, \"No actionable changes\");\n return;\n }\n\n // Check for potential data loss\n const dataLossCheck = checkForDataLoss(diff);\n\n if (dataLossCheck.hasDataLoss) {\n const isProduction = process.env.NODE_ENV === \"production\";\n\n // Determine if destructive migrations are allowed\n // Priority: explicit options > environment variable\n const allowDestructive =\n options.force ||\n options.allowDataLoss ||\n process.env.ELIZA_ALLOW_DESTRUCTIVE_MIGRATIONS === \"true\";\n\n if (!allowDestructive) {\n // Block the migration and provide clear instructions\n logger.error(\n {\n src: \"plugin:sql\",\n pluginName,\n environment: isProduction ? \"PRODUCTION\" : \"DEVELOPMENT\",\n warnings: dataLossCheck.warnings,\n },\n \"Destructive migration blocked - set ELIZA_ALLOW_DESTRUCTIVE_MIGRATIONS=true or use force option\"\n );\n\n const errorMessage = isProduction\n ? `Destructive migration blocked in production for ${pluginName}. Set ELIZA_ALLOW_DESTRUCTIVE_MIGRATIONS=true or use drizzle-kit.`\n : `Destructive migration blocked for ${pluginName}. Set ELIZA_ALLOW_DESTRUCTIVE_MIGRATIONS=true to proceed.`;\n\n throw new Error(errorMessage);\n }\n\n // Log that we're proceeding with destructive operations\n if (dataLossCheck.requiresConfirmation) {\n logger.warn(\n { src: \"plugin:sql\", pluginName, warnings: dataLossCheck.warnings },\n \"Proceeding with destructive migration\"\n );\n }\n }\n\n // Generate SQL statements\n const sqlStatements = await generateMigrationSQL(previousSnapshot, currentSnapshot, diff);\n\n if (sqlStatements.length === 0) {\n logger.info({ src: \"plugin:sql\", pluginName }, \"No SQL statements to execute\");\n return;\n }\n\n // Log what we're about to do\n logger.info(\n { src: \"plugin:sql\", pluginName, statementCount: sqlStatements.length },\n \"Executing SQL statements\"\n );\n if (options.verbose) {\n sqlStatements.forEach((stmt, i) => {\n logger.debug(\n { src: \"plugin:sql\", statementIndex: i + 1, statement: stmt },\n \"SQL statement\"\n );\n });\n }\n\n // Dry run mode - just log what would happen\n if (options.dryRun) {\n logger.info(\n { src: \"plugin:sql\", pluginName, statements: sqlStatements },\n \"DRY RUN mode - not executing statements\"\n );\n return;\n }\n\n // Execute migration in transaction\n await this.executeMigration(pluginName, currentSnapshot, currentHash, sqlStatements);\n\n logger.info({ src: \"plugin:sql\", pluginName }, \"Migration completed successfully\");\n\n // Return a success result\n return;\n } catch (error) {\n logger.error(\n {\n src: \"plugin:sql\",\n pluginName,\n error: error instanceof Error ? error.message : String(error),\n },\n \"Migration failed\"\n );\n throw error;\n } finally {\n // Always release the advisory lock if we acquired it (only for real PostgreSQL)\n const postgresUrl = process.env.POSTGRES_URL || process.env.DATABASE_URL || \"\";\n const isRealPostgres = this.isRealPostgresDatabase(postgresUrl);\n\n if (lockAcquired && isRealPostgres) {\n try {\n // Convert bigint to string for SQL query (same as when acquiring)\n const lockIdStr = lockId.toString();\n await this.db.execute(sql`SELECT pg_advisory_unlock(CAST(${lockIdStr} AS bigint))`);\n logger.debug({ src: \"plugin:sql\", pluginName }, \"Advisory lock released\");\n } catch (unlockError) {\n logger.warn(\n {\n src: \"plugin:sql\",\n pluginName,\n error: unlockError instanceof Error ? unlockError.message : String(unlockError),\n },\n \"Failed to release advisory lock\"\n );\n }\n }\n }\n }\n\n /**\n * Execute migration in a transaction\n */\n private async executeMigration(\n pluginName: string,\n snapshot: SchemaSnapshot,\n hash: string,\n sqlStatements: string[]\n ): Promise<void> {\n let transactionStarted = false;\n\n try {\n // Start manual transaction\n await this.db.execute(sql`BEGIN`);\n transactionStarted = true;\n\n // Execute all SQL statements\n for (const stmt of sqlStatements) {\n logger.debug({ src: \"plugin:sql\", statement: stmt }, \"Executing SQL statement\");\n await this.db.execute(sql.raw(stmt));\n }\n\n // Get next index for journal\n const idx = await this.journalStorage.getNextIdx(pluginName);\n\n // Record migration\n await this.migrationTracker.recordMigration(pluginName, hash, Date.now());\n\n // Update journal\n const tag = this.generateMigrationTag(idx, pluginName);\n await this.journalStorage.updateJournal(\n pluginName,\n idx,\n tag,\n true // breakpoints\n );\n\n // Store snapshot\n await this.snapshotStorage.saveSnapshot(pluginName, idx, snapshot);\n\n // Commit the transaction\n await this.db.execute(sql`COMMIT`);\n\n logger.info({ src: \"plugin:sql\", pluginName, tag }, \"Recorded migration\");\n } catch (error) {\n // Rollback on error if transaction was started\n if (transactionStarted) {\n try {\n await this.db.execute(sql`ROLLBACK`);\n logger.error(\n {\n src: \"plugin:sql\",\n error: error instanceof Error ? error.message : String(error),\n },\n \"Migration failed, rolled back\"\n );\n } catch (rollbackError) {\n logger.error(\n {\n src: \"plugin:sql\",\n error: rollbackError instanceof Error ? rollbackError.message : String(rollbackError),\n },\n \"Failed to rollback transaction\"\n );\n }\n }\n throw error;\n }\n }\n\n /**\n * Generate migration tag (like 0000_jazzy_shard)\n */\n private generateMigrationTag(idx: number, pluginName: string): string {\n // Generate a simple tag - in production, use Drizzle's word generation\n const prefix = idx.toString().padStart(4, \"0\");\n const timestamp = Date.now().toString(36);\n return `${prefix}_${pluginName}_${timestamp}`;\n }\n\n /**\n * Get migration status for a plugin\n * @param pluginName - Plugin identifier\n * @returns Migration history and current state\n */\n async getStatus(pluginName: string): Promise<{\n hasRun: boolean;\n lastMigration: { id: number; hash: string; created_at: string } | null;\n journal: { version: string; dialect: string; entries: unknown[] } | null;\n snapshots: number;\n }> {\n const lastMigration = await this.migrationTracker.getLastMigration(pluginName);\n const journal = await this.journalStorage.loadJournal(pluginName);\n const snapshots = await this.snapshotStorage.getAllSnapshots(pluginName);\n\n return {\n hasRun: !!lastMigration,\n lastMigration,\n journal,\n snapshots: snapshots.length,\n };\n }\n\n /**\n * Reset migrations for a plugin (dangerous - for development only)\n * @param pluginName - Plugin identifier\n * @warning Deletes all migration history - use only in development\n */\n async reset(pluginName: string): Promise<void> {\n logger.warn({ src: \"plugin:sql\", pluginName }, \"Resetting migrations\");\n\n await this.db.execute(\n sql`DELETE FROM migrations._migrations WHERE plugin_name = ${pluginName}`\n );\n await this.db.execute(sql`DELETE FROM migrations._journal WHERE plugin_name = ${pluginName}`);\n await this.db.execute(sql`DELETE FROM migrations._snapshots WHERE plugin_name = ${pluginName}`);\n\n logger.warn({ src: \"plugin:sql\", pluginName }, \"Reset complete\");\n }\n\n /**\n * Check if a migration would cause data loss without executing it\n * @param pluginName - Plugin identifier\n * @param schema - Drizzle schema to check\n * @returns Data loss analysis or null if no changes\n */\n async checkMigration(\n pluginName: string,\n schema: Record<string, unknown>\n ): Promise<DataLossCheck | null> {\n try {\n logger.info({ src: \"plugin:sql\", pluginName }, \"Checking migration\");\n\n // Generate current snapshot from schema\n const currentSnapshot = await generateSnapshot(schema);\n\n // Load previous snapshot\n const previousSnapshot = await this.snapshotStorage.getLatestSnapshot(pluginName);\n\n // Check if there are changes\n if (!hasChanges(previousSnapshot, currentSnapshot)) {\n logger.info({ src: \"plugin:sql\", pluginName }, \"No changes detected\");\n return null;\n }\n\n // Calculate diff\n const diff = await calculateDiff(previousSnapshot, currentSnapshot);\n\n // Check for data loss\n const dataLossCheck = checkForDataLoss(diff);\n\n if (dataLossCheck.hasDataLoss) {\n logger.warn({ src: \"plugin:sql\", pluginName }, \"Migration would cause data loss\");\n } else {\n logger.info({ src: \"plugin:sql\", pluginName }, \"Migration is safe (no data loss)\");\n }\n\n return dataLossCheck;\n } catch (error) {\n logger.error(\n {\n src: \"plugin:sql\",\n pluginName,\n error: error instanceof Error ? error.message : String(error),\n },\n \"Failed to check migration\"\n );\n throw error;\n }\n }\n}\n",
21
+ "export {\n calculateDiff,\n hasDiffChanges,\n type SchemaDiff,\n} from \"./drizzle-adapters/diff-calculator\";\n// Drizzle adapter exports (if needed for extensions)\nexport {\n createEmptySnapshot,\n generateSnapshot,\n hasChanges,\n hashSnapshot,\n} from \"./drizzle-adapters/snapshot-generator\";\nexport {\n generateMigrationSQL,\n generateRenameColumnSQL,\n generateRenameTableSQL,\n} from \"./drizzle-adapters/sql-generator\";\nexport { RuntimeMigrator } from \"./runtime-migrator\";\nexport { JournalStorage } from \"./storage/journal-storage\";\n// Storage exports (if needed for advanced usage)\nexport { MigrationTracker } from \"./storage/migration-tracker\";\nexport { SnapshotStorage } from \"./storage/snapshot-storage\";\nexport * from \"./types\";\n",
22
+ "import { type IDatabaseAdapter, logger, type Plugin } from \"@elizaos/core\";\nimport { migrateToEntityRLS } from \"./migrations\";\nimport { applyEntityRLSToAllTables, applyRLSToNewTables, installRLSFunctions } from \"./rls\";\nimport { RuntimeMigrator } from \"./runtime-migrator\";\nimport type { DrizzleDatabase } from \"./types\";\n\nexport class DatabaseMigrationService {\n private db: DrizzleDatabase | null = null;\n private registeredSchemas = new Map<string, Record<string, unknown>>();\n private migrator: RuntimeMigrator | null = null;\n\n async initializeWithDatabase(db: DrizzleDatabase): Promise<void> {\n this.db = db;\n\n interface AdapterWrapper extends IDatabaseAdapter {\n db: DrizzleDatabase;\n }\n const adapterWrapper: AdapterWrapper = { db } as AdapterWrapper;\n await migrateToEntityRLS(adapterWrapper);\n\n this.migrator = new RuntimeMigrator(db);\n await this.migrator.initialize();\n logger.info({ src: \"plugin:sql\" }, \"DatabaseMigrationService initialized\");\n }\n\n discoverAndRegisterPluginSchemas(plugins: Plugin[]): void {\n for (const plugin of plugins) {\n type PluginWithSchema = Plugin & {\n schema?: Record<string, unknown>;\n };\n const pluginWithSchema = plugin as PluginWithSchema;\n if (pluginWithSchema.schema) {\n this.registeredSchemas.set(plugin.name, pluginWithSchema.schema);\n }\n }\n logger.info(\n {\n src: \"plugin:sql\",\n schemasDiscovered: this.registeredSchemas.size,\n totalPlugins: plugins.length,\n },\n \"Plugin schemas discovered\"\n );\n }\n\n registerSchema(pluginName: string, schema: Record<string, unknown>): void {\n this.registeredSchemas.set(pluginName, schema);\n logger.debug({ src: \"plugin:sql\", pluginName }, \"Schema registered\");\n }\n\n async runAllPluginMigrations(options?: {\n verbose?: boolean;\n force?: boolean;\n dryRun?: boolean;\n }): Promise<void> {\n if (!this.db || !this.migrator) {\n throw new Error(\"Database or migrator not initialized in DatabaseMigrationService\");\n }\n\n const isProduction = process.env.NODE_ENV === \"production\";\n\n const migrationOptions = {\n verbose: options?.verbose ?? !isProduction,\n force: options?.force ?? false,\n dryRun: options?.dryRun ?? false,\n };\n\n logger.info(\n {\n src: \"plugin:sql\",\n environment: isProduction ? \"PRODUCTION\" : \"DEVELOPMENT\",\n pluginCount: this.registeredSchemas.size,\n dryRun: migrationOptions.dryRun,\n },\n \"Starting migrations\"\n );\n\n let successCount = 0;\n let failureCount = 0;\n const errors: Array<{ pluginName: string; error: Error }> = [];\n\n for (const [pluginName, schema] of this.registeredSchemas) {\n try {\n await this.migrator.migrate(pluginName, schema, migrationOptions);\n successCount++;\n logger.info({ src: \"plugin:sql\", pluginName }, \"Migration completed\");\n } catch (error) {\n failureCount++;\n const errorMessage = (error as Error).message;\n\n errors.push({ pluginName, error: error as Error });\n\n if (errorMessage.includes(\"Destructive migration blocked\")) {\n logger.error(\n { src: \"plugin:sql\", pluginName },\n \"Migration blocked - destructive changes detected. Set ELIZA_ALLOW_DESTRUCTIVE_MIGRATIONS=true or use force option\"\n );\n } else {\n logger.error({ src: \"plugin:sql\", pluginName, error: errorMessage }, \"Migration failed\");\n }\n }\n }\n\n if (failureCount === 0) {\n logger.info({ src: \"plugin:sql\", successCount }, \"All migrations completed successfully\");\n\n const dataIsolationEnabled = process.env.ENABLE_DATA_ISOLATION === \"true\";\n\n if (dataIsolationEnabled) {\n try {\n logger.info({ src: \"plugin:sql\" }, \"Re-applying Row Level Security...\");\n interface AdapterWrapper extends IDatabaseAdapter {\n db: DrizzleDatabase;\n }\n const adapterWrapper: AdapterWrapper = {\n db: this.db,\n } as AdapterWrapper;\n await installRLSFunctions(adapterWrapper);\n await applyRLSToNewTables(adapterWrapper);\n await applyEntityRLSToAllTables(adapterWrapper);\n logger.info({ src: \"plugin:sql\" }, \"RLS re-applied successfully\");\n } catch (rlsError) {\n const errorMsg = rlsError instanceof Error ? rlsError.message : String(rlsError);\n logger.warn(\n { src: \"plugin:sql\", error: errorMsg },\n \"Failed to re-apply RLS (expected while schemas are still missing server_id columns)\"\n );\n }\n } else {\n logger.info(\n { src: \"plugin:sql\" },\n \"Skipping RLS re-application (ENABLE_DATA_ISOLATION is not true)\"\n );\n }\n } else {\n logger.error({ src: \"plugin:sql\", failureCount, successCount }, \"Some migrations failed\");\n\n const errorSummary = errors.map((e) => `${e.pluginName}: ${e.error.message}`).join(\"\\n \");\n const aggregateError = new Error(`${failureCount} migration(s) failed:\\n ${errorSummary}`, {\n cause: errors[0]?.error,\n }) as Error & {\n migrationErrors?: Array<{ pluginName: string; error: Error }>;\n };\n aggregateError.migrationErrors = errors;\n throw aggregateError;\n }\n }\n\n getMigrator(): RuntimeMigrator | null {\n return this.migrator;\n }\n}\n",
23
+ "import { mkdirSync } from \"node:fs\";\nimport type { IDatabaseAdapter, UUID } from \"@elizaos/core\";\nimport { type IAgentRuntime, logger, type Plugin } from \"@elizaos/core\";\n\nexport {\n and,\n asc,\n count,\n desc,\n eq,\n gt,\n gte,\n inArray,\n isNull,\n lt,\n lte,\n ne,\n or,\n type SQL,\n sql,\n} from \"drizzle-orm\";\n\nimport { PgDatabaseAdapter } from \"./pg/adapter\";\nimport { PostgresConnectionManager } from \"./pg/manager\";\nimport { PgliteDatabaseAdapter } from \"./pglite/adapter\";\nimport {\n type LiveNamespace,\n PGliteClientManager,\n type PgliteSyncStatus,\n type PgliteSyncTableStatus,\n} from \"./pglite/manager\";\nimport * as schema from \"./schema\";\nimport { AdvancedMemoryStorageService } from \"./services/advanced-memory-storage\";\nimport { resolvePgliteDir } from \"./utils\";\nimport { stringToUuid } from \"./utils/string-to-uuid\";\n\nexport type {\n AppendConnectorAccountAuditEventParams,\n ConnectorAccountAuditEventRecord,\n ConnectorAccountAuditOutcome,\n ConnectorAccountCredentialRefRecord,\n ConnectorAccountJsonObject,\n ConnectorAccountRecord,\n ConsumeOAuthFlowStateParams,\n CreateOAuthFlowStateParams,\n DeleteConnectorAccountParams,\n GetConnectorAccountCredentialRefParams,\n GetConnectorAccountParams,\n ListConnectorAccountCredentialRefsParams,\n ListConnectorAccountsParams,\n OAuthFlowRecord,\n SetConnectorAccountCredentialRefParams,\n UpsertConnectorAccountParams,\n} from \"@elizaos/core\";\nexport * from \"./connector-credential-store\";\nexport * from \"./pglite/errors\";\nexport type { LiveNamespace, PgliteSyncStatus, PgliteSyncTableStatus } from \"./pglite/manager\";\nexport * from \"./schema\";\nexport type { DrizzleDatabase } from \"./types\";\n\nconst GLOBAL_SINGLETONS = Symbol.for(\"elizaos.plugin-sql.global-singletons\");\n\ninterface GlobalSingletons {\n pgLiteClientManager?: PGliteClientManager;\n postgresConnectionManager?: PostgresConnectionManager;\n}\n\ninterface RuntimeWithAdapterRegistrar {\n adapter?: IDatabaseAdapter;\n databaseAdapter?: IDatabaseAdapter;\n getDatabaseAdapter?: () => IDatabaseAdapter | undefined;\n hasDatabaseAdapter?: () => boolean;\n registerDatabaseAdapter: (adapter: IDatabaseAdapter) => void;\n}\n\nconst globalSymbols = globalThis as typeof globalThis & Record<symbol, GlobalSingletons>;\n\nif (!globalSymbols[GLOBAL_SINGLETONS]) {\n globalSymbols[GLOBAL_SINGLETONS] = {};\n}\n\nconst globalSingletons = globalSymbols[GLOBAL_SINGLETONS];\n\nfunction shouldReusePgliteManager(manager: PGliteClientManager | undefined): boolean {\n if (!manager) {\n return false;\n }\n\n return !manager.isShuttingDown();\n}\n\nfunction shouldReusePostgresManager(\n manager: PostgresConnectionManager | undefined\n): manager is PostgresConnectionManager {\n if (!manager) {\n return false;\n }\n\n return !manager.isShuttingDown();\n}\n\nexport function createDatabaseAdapter(\n config: {\n dataDir?: string;\n postgresUrl?: string;\n },\n agentId: UUID\n): IDatabaseAdapter {\n if (config.postgresUrl) {\n let manager = globalSingletons.postgresConnectionManager;\n if (!shouldReusePostgresManager(manager)) {\n const dataIsolationEnabled = process.env.ENABLE_DATA_ISOLATION === \"true\";\n let rlsServerId: string | undefined;\n if (dataIsolationEnabled) {\n const rlsServerIdString = process.env.ELIZA_SERVER_ID;\n if (!rlsServerIdString) {\n throw new Error(\n \"[Data Isolation] ENABLE_DATA_ISOLATION=true requires ELIZA_SERVER_ID environment variable\"\n );\n }\n rlsServerId = stringToUuid(rlsServerIdString);\n logger.debug(\n {\n src: \"plugin:sql\",\n rlsServerId: rlsServerId.slice(0, 8),\n serverIdString: rlsServerIdString,\n },\n \"Creating connection pool with RLS server\"\n );\n }\n\n manager = new PostgresConnectionManager(config.postgresUrl, rlsServerId);\n globalSingletons.postgresConnectionManager = manager;\n }\n return new PgDatabaseAdapter(agentId, manager);\n }\n\n const dataDir = resolvePgliteDir(config.dataDir);\n\n // `:memory:` is PGlite's in-memory sentinel, not a real path. On Windows the\n // reserved `:` makes mkdirSync throw (on POSIX it silently creates a junk\n // `:memory:` directory), so skip directory creation for it and for URLs.\n if (dataDir && !dataDir.includes(\"://\") && dataDir !== \":memory:\") {\n mkdirSync(dataDir, { recursive: true });\n }\n\n if (!shouldReusePgliteManager(globalSingletons.pgLiteClientManager)) {\n globalSingletons.pgLiteClientManager = new PGliteClientManager({ dataDir, agentId });\n }\n\n const manager = globalSingletons.pgLiteClientManager;\n if (!manager) {\n throw new Error(\"[plugin-sql] pgLiteClientManager not initialized before adapter creation\");\n }\n\n return new PgliteDatabaseAdapter(agentId, manager);\n}\n\nexport const plugin: Plugin = {\n name: \"@elizaos/plugin-sql\",\n description: \"A plugin for SQL database access with dynamic schema migrations\",\n priority: 0,\n schema: schema,\n services: [AdvancedMemoryStorageService],\n init: async (_, runtime: IAgentRuntime) => {\n const runtimeWithAdapter = runtime as IAgentRuntime & RuntimeWithAdapterRegistrar;\n runtime.logger.info(\n { src: \"plugin:sql\", agentId: runtime.agentId },\n \"plugin-sql init starting\"\n );\n\n const adapterRegistered =\n typeof runtimeWithAdapter.hasDatabaseAdapter === \"function\"\n ? runtimeWithAdapter.hasDatabaseAdapter()\n : (() => {\n try {\n const existing =\n runtimeWithAdapter.getDatabaseAdapter?.() ??\n runtimeWithAdapter.databaseAdapter ??\n runtimeWithAdapter.adapter;\n return Boolean(existing);\n } catch {\n return false;\n }\n })();\n\n if (adapterRegistered) {\n runtime.logger.info(\n { src: \"plugin:sql\", agentId: runtime.agentId },\n \"Database adapter already registered, skipping creation\"\n );\n return;\n }\n\n runtime.logger.debug(\n { src: \"plugin:sql\", agentId: runtime.agentId },\n \"No database adapter found, proceeding to register\"\n );\n\n const postgresUrl = runtime.getSetting(\"POSTGRES_URL\");\n const dataDir = runtime.getSetting(\"PGLITE_DATA_DIR\");\n\n const dbAdapter = createDatabaseAdapter(\n {\n dataDir: typeof dataDir === \"string\" ? dataDir : undefined,\n postgresUrl: typeof postgresUrl === \"string\" ? postgresUrl : undefined,\n },\n runtime.agentId\n );\n\n runtimeWithAdapter.registerDatabaseAdapter(dbAdapter);\n await dbAdapter.initialize();\n runtime.logger.info(\n { src: \"plugin:sql\", agentId: runtime.agentId },\n \"Database adapter created and registered\"\n );\n },\n async dispose(runtime) {\n await runtime\n .getService<AdvancedMemoryStorageService>(AdvancedMemoryStorageService.serviceType)\n ?.stop();\n },\n};\n\nexport default plugin;\n\nexport * from \"./drizzle\";\nexport { DatabaseMigrationService } from \"./migration-service\";\nexport {\n applyRLSToNewTables,\n assignAgentToServer,\n getOrCreateRlsServer,\n installRLSFunctions,\n setServerContext,\n uninstallRLS,\n} from \"./rls\";\nexport * from \"./schema\";\nexport { AdvancedMemoryStorageService } from \"./services/advanced-memory-storage\";\nexport * from \"./types\";\nexport { schema };\n\n/**\n * Query the live Electric Sync status from the global PGliteClientManager\n * singleton. Returns \"disabled\" when no manager exists or sync is not\n * configured, and \"syncing\" / \"synced\" / \"error\" at runtime as the sync\n * client transitions.\n */\nexport function getPgliteSyncStatus(): {\n status: PgliteSyncStatus;\n error: string | null;\n tables: PgliteSyncTableStatus;\n synced: string[];\n} {\n const manager = globalSingletons.pgLiteClientManager;\n if (!manager) {\n return { status: \"disabled\", error: null, tables: {}, synced: [] };\n }\n return manager.getSyncStatus();\n}\n\n/**\n * Access the PGlite live query namespace from the global singleton.\n * Returns null when the PGlite adapter is not in use or extensions are disabled.\n * Use for reactive dashboard queries via pg.live.query() / incrementalQuery() / changes().\n */\nexport function getPgliteLiveNamespace(): LiveNamespace | null {\n const manager = globalSingletons.pgLiteClientManager;\n if (!manager) return null;\n return manager.liveQuery();\n}\n\n/**\n * Force-reset the Electric Sync stream for the current agent.\n * Drops the electric schema, unsubscribes the current stream,\n * and starts a fresh sync from the source Postgres.\n * Returns the sync status after the reset, or null when sync is not configured.\n */\nexport async function forcePgliteResync(): Promise<{\n status: PgliteSyncStatus;\n error: string | null;\n tables: PgliteSyncTableStatus;\n synced: string[];\n} | null> {\n const manager = globalSingletons.pgLiteClientManager;\n if (!manager) return null;\n return manager.forceResync();\n}\n",
24
+ "import {\n type Agent,\n type Component,\n type Entity,\n logger,\n type Memory,\n type UUID,\n} from \"@elizaos/core\";\nimport type { NodePgDatabase } from \"drizzle-orm/node-postgres\";\nimport type { Pool } from \"pg\";\nimport { BaseDrizzleAdapter } from \"../base\";\nimport { DIMENSION_MAP, type EmbeddingDimensionColumn } from \"../schema/embedding\";\nimport type { PostgresConnectionManager } from \"./manager\";\n\nexport class PgDatabaseAdapter extends BaseDrizzleAdapter {\n protected embeddingDimension: EmbeddingDimensionColumn = DIMENSION_MAP[384];\n private manager: PostgresConnectionManager;\n\n constructor(\n agentId: UUID,\n manager: PostgresConnectionManager,\n _schema?: Record<string, unknown>\n ) {\n super(agentId);\n this.manager = manager;\n this.db = manager.getDatabase();\n }\n\n getManager(): PostgresConnectionManager {\n return this.manager;\n }\n\n public async withEntityContext<T>(\n entityId: UUID | null,\n callback: (tx: NodePgDatabase) => Promise<T>\n ): Promise<T> {\n return await this.manager.withEntityContext(entityId, callback);\n }\n\n async getEntityByIds(entityIds: UUID[]): Promise<Entity[] | null> {\n return this.getEntitiesByIds(entityIds);\n }\n\n async getMemoriesByServerId(params: { serverId: UUID; count?: number }): Promise<Memory[]> {\n return super.getMemoriesByServerId(params);\n }\n\n async ensureAgentExists(agent: Partial<Agent>): Promise<Agent> {\n const existingAgent = await this.getAgent(this.agentId);\n if (existingAgent) {\n return existingAgent;\n }\n\n const newAgent: Agent = {\n id: this.agentId,\n name: agent.name || \"Unknown Agent\",\n username: agent.username,\n bio: (Array.isArray(agent.bio)\n ? agent.bio\n : agent.bio\n ? [agent.bio]\n : [\"An AI agent\"]) as string[],\n createdAt: agent.createdAt || Date.now(),\n updatedAt: agent.updatedAt || Date.now(),\n };\n\n await this.createAgent(newAgent);\n const createdAgent = await this.getAgent(this.agentId);\n if (!createdAgent) {\n throw new Error(\"Failed to create agent\");\n }\n return createdAgent;\n }\n\n protected async withDatabase<T>(operation: () => Promise<T>): Promise<T> {\n return await this.withRetry(async () => {\n return await operation();\n });\n }\n\n async init(): Promise<void> {\n logger.debug({ src: \"plugin:sql\" }, \"PgDatabaseAdapter initialized\");\n }\n\n async isReady(): Promise<boolean> {\n return this.manager.testConnection();\n }\n\n async close(): Promise<void> {\n await this.manager.close();\n }\n\n async getConnection(): Promise<NodePgDatabase> {\n return this.db as NodePgDatabase;\n }\n\n getRawConnection(): Pool {\n return this.manager.getConnection();\n }\n\n async createAgent(agent: Agent): Promise<boolean> {\n return super.createAgent(agent);\n }\n\n getAgent(agentId: UUID): Promise<Agent | null> {\n return super.getAgent(agentId);\n }\n\n updateAgent(agentId: UUID, agent: Partial<Agent>): Promise<boolean> {\n return super.updateAgent(agentId, agent);\n }\n\n deleteAgent(agentId: UUID): Promise<boolean> {\n return super.deleteAgent(agentId);\n }\n\n createEntities(entities: Entity[]): Promise<UUID[]> {\n return super.createEntities(entities);\n }\n\n getEntitiesByIds(entityIds: UUID[]): Promise<Entity[]> {\n return super.getEntitiesByIds(entityIds).then((result) => result || []);\n }\n\n updateEntity(entity: Entity): Promise<void> {\n return super.updateEntity(entity);\n }\n\n createMemory(memory: Memory, tableName: string): Promise<UUID> {\n return super.createMemory(memory, tableName);\n }\n\n getMemoryById(memoryId: UUID): Promise<Memory | null> {\n return super.getMemoryById(memoryId);\n }\n\n updateMemory(memory: Partial<Memory> & { id: UUID }): Promise<boolean> {\n return super.updateMemory(memory);\n }\n\n deleteMemory(memoryId: UUID): Promise<void> {\n return super.deleteMemory(memoryId);\n }\n\n createComponent(component: Component): Promise<boolean> {\n return super.createComponent(component);\n }\n\n getComponent(\n entityId: UUID,\n type: string,\n worldId?: UUID,\n sourceEntityId?: UUID\n ): Promise<Component | null> {\n return super.getComponent(entityId, type, worldId, sourceEntityId);\n }\n\n updateComponent(component: Component): Promise<void> {\n return super.updateComponent(component);\n }\n\n deleteComponent(componentId: UUID): Promise<void> {\n return super.deleteComponent(componentId);\n }\n}\n",
25
+ "import {\n type AccessContext,\n type Agent,\n type AgentRunCounts,\n type AgentRunSummary,\n type AgentRunSummaryResult,\n type AppendConnectorAccountAuditEventParams,\n ChannelType,\n type Component,\n type ConnectorAccountAuditEventRecord,\n type ConnectorAccountCredentialRefRecord,\n type ConnectorAccountRecord,\n type ConnectorOwnerBindingLookup,\n type ConnectorOwnerBindingRecord,\n type ConsumeOAuthFlowStateParams,\n type CreateOAuthFlowStateParams,\n DatabaseAdapter,\n type DeleteConnectorAccountParams,\n type EntitiesForRoomsResult,\n type Entity,\n type GetConnectorAccountCredentialRefParams,\n type GetConnectorAccountParams,\n type IDatabaseAdapter,\n type JsonValue,\n type ListConnectorAccountCredentialRefsParams,\n type ListConnectorAccountsParams,\n type Log,\n type LogBody,\n logger,\n type Memory,\n type MemoryMetadata,\n type Metadata,\n type OAuthFlowRecord,\n type PairingAllowlistEntry,\n type PairingAllowlistsResult,\n type PairingChannel,\n type PairingRequest,\n type PairingRequestsResult,\n type Participant,\n type ParticipantsForRoomsResult,\n type ParticipantUpdateFields,\n type ParticipantUserState,\n type PatchOp,\n type Relationship,\n type Room,\n type RunStatus,\n type SetConnectorAccountCredentialRefParams,\n type Task,\n type TaskMetadata,\n type UpsertConnectorAccountParams,\n type UUID,\n type World,\n} from \"@elizaos/core\";\n\nfunction agentBioRowsFromDb(bio: unknown): string[] {\n if (bio == null) return [];\n if (Array.isArray(bio)) return bio.map((entry) => String(entry));\n if (typeof bio === \"string\") return bio.trim() === \"\" ? [] : [bio];\n return [];\n}\n\ninterface GetOAuthFlowStateParams {\n state?: string;\n stateHash?: string;\n flowId?: string;\n agentId?: string;\n provider?: string;\n includeConsumed?: boolean;\n includeExpired?: boolean;\n now?: number | Date;\n}\n\nfunction applyPatchOp(target: Record<string, unknown>, op: PatchOp): void {\n if (!op.path) return;\n const parts = op.path.split(\".\");\n const last = parts.pop();\n if (last === undefined) return;\n\n let parent: Record<string, unknown> = target;\n for (const segment of parts) {\n const next = parent[segment];\n if (next === null || typeof next !== \"object\") {\n const created: Record<string, unknown> = {};\n parent[segment] = created;\n parent = created;\n } else {\n parent = next as Record<string, unknown>;\n }\n }\n\n switch (op.op) {\n case \"set\":\n parent[last] = op.value;\n break;\n case \"remove\":\n delete parent[last];\n break;\n case \"push\": {\n const existing = parent[last];\n if (Array.isArray(existing)) {\n existing.push(op.value);\n } else {\n parent[last] = [op.value];\n }\n break;\n }\n case \"increment\": {\n const existing = parent[last];\n const delta = typeof op.value === \"number\" ? op.value : 1;\n parent[last] = typeof existing === \"number\" ? existing + delta : delta;\n break;\n }\n }\n}\n\ninterface UpdateOAuthFlowStateParams {\n state?: string;\n stateHash?: string;\n flowId?: string;\n agentId?: string;\n provider?: string;\n accountId?: string | null;\n redirectUri?: string | null;\n codeVerifierRef?: string | null;\n scopes?: string[];\n metadata?: Record<string, JsonValue>;\n expiresAt?: number | Date;\n consumedAt?: number | Date | null;\n consumedBy?: string | null;\n}\n\ninterface DeleteOAuthFlowStateParams {\n state?: string;\n stateHash?: string;\n flowId?: string;\n agentId?: string;\n provider?: string;\n}\n\nfunction asRawMessage(value: unknown): Record<string, unknown> | undefined {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return undefined;\n}\n\nfunction asMetadata(value: unknown): Metadata | undefined {\n return (value ?? undefined) as Metadata | undefined;\n}\n\nfunction normalizeAgentBio(value: unknown): string[] | undefined {\n if (Array.isArray(value)) {\n return value.filter((item): item is string => typeof item === \"string\");\n }\n if (typeof value === \"string\" && value.trim()) return [value];\n return undefined;\n}\n\ntype CountMemoriesParams = {\n roomIds?: UUID[];\n unique?: boolean;\n tableName?: string;\n entityId?: UUID;\n agentId?: UUID;\n metadata?: Record<string, unknown>;\n};\n\nimport {\n and,\n cosineDistance,\n count,\n desc,\n eq,\n gte,\n inArray,\n lt,\n lte,\n or,\n type SQL,\n sql,\n} from \"drizzle-orm\";\n\nconst v4 = () => crypto.randomUUID();\n\n/**\n * Detects whether an error is a postgres `unique_violation` (SQLState 23505),\n * walking the Error.cause chain because drizzle-orm rewraps the underlying\n * node-postgres / pglite error and the SQLState code lives on `error.cause`,\n * not on the outer Error. Also matches the legacy human-readable patterns\n * for callers that fabricate generic Errors.\n */\nfunction isDuplicateKeyError(error: unknown): boolean {\n const seen = new Set<unknown>();\n let current: unknown = error;\n while (current && typeof current === \"object\" && !seen.has(current)) {\n seen.add(current);\n const layer = current as {\n code?: unknown;\n message?: unknown;\n cause?: unknown;\n };\n if (layer.code === \"23505\") return true;\n if (typeof layer.message === \"string\" && /duplicate key|already exists/i.test(layer.message)) {\n return true;\n }\n current = layer.cause;\n }\n return false;\n}\n\nimport type { DatabaseMigrationService } from \"./migration-service\";\nimport { DIMENSION_MAP, type EmbeddingDimensionColumn } from \"./schema/embedding\";\nimport {\n agentTable,\n cacheTable,\n channelParticipantsTable,\n channelTable,\n componentTable,\n embeddingTable,\n entityTable,\n logTable,\n memoryTable,\n messageServerAgentsTable,\n messageServerTable,\n messageTable,\n pairingAllowlistTable,\n pairingRequestTable,\n participantTable,\n relationshipTable,\n roomTable,\n taskTable,\n worldTable,\n} from \"./schema/index\";\n\ntype AgentRow = typeof agentTable.$inferSelect;\ntype AgentMessageExamples = NonNullable<Agent[\"messageExamples\"]>;\ntype AgentKnowledge = NonNullable<Agent[\"knowledge\"]>;\n\nfunction normalizeAgentMessageExamples(messageExamples: unknown): AgentMessageExamples {\n if (!Array.isArray(messageExamples) || messageExamples.length === 0) {\n return [];\n }\n return messageExamples.flatMap((entry): AgentMessageExamples => {\n if (Array.isArray(entry)) {\n return [{ examples: entry }];\n }\n if (\n entry &&\n typeof entry === \"object\" &&\n Array.isArray((entry as { examples?: unknown }).examples)\n ) {\n return [entry as AgentMessageExamples[number]];\n }\n return [];\n });\n}\n\nfunction normalizeAgentKnowledge(knowledge: AgentRow[\"knowledge\"]): AgentKnowledge {\n return knowledge.flatMap((item): AgentKnowledge => {\n if (typeof item === \"string\") {\n return [{ item: { case: \"path\", value: item } }];\n }\n if (item && typeof item === \"object\" && typeof item.path === \"string\") {\n return [{ item: { case: \"path\", value: item.path } }];\n }\n return [];\n });\n}\n\nfunction mapAgentRow(row: AgentRow): Agent {\n const agent: Agent = {\n ...row,\n username: row.username || \"\",\n id: row.id as UUID,\n system: !row.system ? undefined : row.system,\n bio: normalizeAgentBio(row.bio),\n messageExamples: normalizeAgentMessageExamples(row.messageExamples),\n knowledge: normalizeAgentKnowledge(row.knowledge),\n settings: row.settings as Agent[\"settings\"],\n createdAt: row.createdAt.getTime(),\n updatedAt: row.updatedAt.getTime(),\n };\n return agent;\n}\n\nimport {\n ConnectorAccountStore,\n type ListConnectorAccountAuditEventsParams,\n} from \"./stores/connectorAccount.store\";\nimport type { StoreContext } from \"./stores/types\";\nimport type { DrizzleDatabase } from \"./types\";\n\nexport abstract class BaseDrizzleAdapter extends DatabaseAdapter<DrizzleDatabase> {\n protected readonly maxRetries: number = 3;\n protected readonly baseDelay: number = 1000;\n protected readonly maxDelay: number = 10000;\n protected readonly jitterMax: number = 1000;\n protected embeddingDimension: EmbeddingDimensionColumn = DIMENSION_MAP[384];\n protected migrationService?: DatabaseMigrationService;\n private migrationRunPromise: Promise<void> | null = null;\n private _connectorAccountStore?: ConnectorAccountStore;\n\n protected getConnectorAccountStore(): ConnectorAccountStore {\n if (!this._connectorAccountStore) {\n const ctx: StoreContext = {\n getDb: () => this.db as DrizzleDatabase,\n withRetry: <T>(operation: () => Promise<T>) => this.withDatabase(operation),\n withIsolationContext: <T>(\n entityId: UUID | null,\n callback: (tx: DrizzleDatabase) => Promise<T>\n ) => this.withEntityContext(entityId, callback),\n agentId: this.agentId,\n getEmbeddingDimension: () => this.embeddingDimension,\n };\n this._connectorAccountStore = new ConnectorAccountStore(ctx);\n }\n return this._connectorAccountStore;\n }\n\n protected abstract withDatabase<T>(operation: () => Promise<T>): Promise<T>;\n\n public abstract withEntityContext<T>(\n entityId: UUID | null,\n callback: (tx: DrizzleDatabase) => Promise<T>\n ): Promise<T>;\n\n public abstract init(): Promise<void>;\n public abstract close(): Promise<void>;\n\n public async initialize(): Promise<void> {\n await this.init();\n }\n\n public async runPluginMigrations(\n plugins: Array<{ name: string; schema?: Record<string, unknown> }>,\n options?: {\n verbose?: boolean;\n force?: boolean;\n dryRun?: boolean;\n }\n ): Promise<void> {\n if (!this.migrationService) {\n const { DatabaseMigrationService } = await import(\"./migration-service\");\n this.migrationService = new DatabaseMigrationService();\n await this.migrationService.initializeWithDatabase(this.db as DrizzleDatabase);\n }\n\n for (const plugin of plugins) {\n if (plugin.schema) {\n this.migrationService.registerSchema(plugin.name, plugin.schema);\n }\n }\n\n if (this.migrationRunPromise) {\n logger.info(\n { src: \"plugin:sql\", pluginCount: plugins.length },\n \"Plugin migrations already running in this process; joining active run\"\n );\n await this.migrationRunPromise;\n return;\n }\n\n this.migrationRunPromise = this.migrationService.runAllPluginMigrations(options);\n try {\n await this.migrationRunPromise;\n } finally {\n this.migrationRunPromise = null;\n }\n }\n\n public getDatabase(): unknown {\n return this.db;\n }\n\n protected agentId: UUID;\n\n constructor(agentId: UUID) {\n super();\n this.agentId = agentId;\n }\n\n private normalizeEntityNames(names: unknown): string[] {\n if (names == null) {\n return [];\n }\n\n if (typeof names === \"string\") {\n return [names];\n }\n\n if (Array.isArray(names)) {\n return names.map(String);\n }\n\n if (names instanceof Set) {\n return Array.from(names).map(String);\n }\n\n if (typeof names === \"object\") {\n const iterableNames = names as { [Symbol.iterator]?: () => Iterator<unknown> };\n if (typeof iterableNames[Symbol.iterator] === \"function\") {\n return Array.from(names as Iterable<unknown>).map(String);\n }\n }\n\n return [String(names)];\n }\n\n private isValidUUID(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value);\n }\n\n private normalizeWorldData(\n world: Partial<World> & { serverId?: UUID | null }\n ): typeof worldTable.$inferInsert {\n const worldData: typeof worldTable.$inferInsert = {\n agentId: this.agentId,\n id: (world.id || v4()) as UUID,\n name: world.name || \"\",\n metadata: world.metadata || {},\n };\n\n const serverId = world.serverId ?? world.messageServerId;\n if (typeof serverId === \"string\" && this.isValidUUID(serverId)) {\n worldData.messageServerId = serverId;\n } else if (serverId) {\n logger.warn(\n { src: \"plugin:sql\", agentId: this.agentId, serverId },\n \"Ignoring non-UUID message/server identifier for world\"\n );\n }\n\n return worldData;\n }\n\n private mapWorldResult(world: unknown): World {\n const mappedWorld = world as Record<string, unknown>;\n const messageServerId = mappedWorld.messageServerId || mappedWorld.serverId;\n return {\n ...mappedWorld,\n ...(typeof messageServerId === \"string\"\n ? {\n messageServerId: messageServerId as UUID,\n serverId: messageServerId as UUID,\n }\n : {}),\n } as World;\n }\n\n /**\n * Executes the given operation with retry logic.\n * @template T\n * @param {() => Promise<T>} operation - The operation to be executed.\n * @returns {Promise<T>} A promise that resolves with the result of the operation.\n */\n protected async withRetry<T>(operation: () => Promise<T>): Promise<T> {\n let lastError: Error = new Error(\"Unknown error\");\n\n for (let attempt = 1; attempt <= this.maxRetries; attempt++) {\n try {\n return await operation();\n } catch (error) {\n lastError = error as Error;\n\n if (attempt < this.maxRetries) {\n const backoffDelay = Math.min(this.baseDelay * 2 ** (attempt - 1), this.maxDelay);\n\n const jitter = Math.random() * this.jitterMax;\n const delay = backoffDelay + jitter;\n\n logger.warn(\n {\n src: \"plugin:sql\",\n attempt,\n maxRetries: this.maxRetries,\n error: error instanceof Error ? error.message : String(error),\n },\n \"Database operation failed, retrying\"\n );\n\n await new Promise((resolve) => setTimeout(resolve, delay));\n } else {\n logger.error(\n {\n src: \"plugin:sql\",\n totalAttempts: attempt,\n error: error instanceof Error ? error.message : String(error),\n },\n \"Max retry attempts reached\"\n );\n throw error instanceof Error ? error : new Error(String(error));\n }\n }\n }\n\n throw lastError;\n }\n\n /**\n * Asynchronously ensures that the given embedding dimension is valid for the agent.\n *\n * @param {number} dimension - The dimension to ensure for the embedding.\n * @returns {Promise<void>} - Resolves once the embedding dimension is ensured.\n */\n async ensureEmbeddingDimension(dimension: number) {\n return this.withDatabase(async () => {\n const resolvedDimension = DIMENSION_MAP[dimension as keyof typeof DIMENSION_MAP];\n if (!resolvedDimension) {\n logger.warn(\n {\n src: \"plugin:sql\",\n agentId: this.agentId,\n requestedDimension: dimension,\n fallbackDimension: this.embeddingDimension,\n },\n \"Unsupported embedding dimension requested; keeping current embedding column\"\n );\n return;\n }\n\n this.embeddingDimension = resolvedDimension;\n });\n }\n\n /**\n * Asynchronously retrieves an agent by their ID from the database.\n * @param {UUID} agentId - The ID of the agent to retrieve.\n * @returns {Promise<Agent | null>} A promise that resolves to the retrieved agent or null if not found.\n */\n async getAgent(agentId: UUID): Promise<Agent | null> {\n return this.withDatabase(async () => {\n const rows = await this.db\n .select()\n .from(agentTable)\n .where(eq(agentTable.id, agentId))\n .limit(1);\n\n if (rows.length === 0) return null;\n\n return mapAgentRow(rows[0]);\n });\n }\n\n /**\n * Asynchronously retrieves a list of agents from the database.\n *\n * @returns {Promise<Partial<Agent>[]>} A Promise that resolves to an array of Agent objects.\n */\n async getAgents(): Promise<Partial<Agent>[]> {\n const result = await this.withDatabase(async () => {\n const rows = await this.db\n .select({\n id: agentTable.id,\n name: agentTable.name,\n bio: agentTable.bio,\n })\n .from(agentTable);\n return rows.map(\n (row) =>\n ({\n ...row,\n id: row.id as UUID,\n bio: agentBioRowsFromDb(row.bio),\n }) as Partial<Agent>\n );\n });\n // Guard against null return\n return result || [];\n }\n\n async getAgentsByIds(agentIds: UUID[]): Promise<Agent[]> {\n if (agentIds.length === 0) return [];\n return this.withDatabase(async () => {\n const rows = await this.db.select().from(agentTable).where(inArray(agentTable.id, agentIds));\n return rows.map((row) => mapAgentRow(row));\n });\n }\n\n async createAgents(agents: Partial<Agent>[]): Promise<UUID[]> {\n if (agents.length === 0) return [];\n return this.withDatabase(async () => {\n const ids: UUID[] = [];\n for (const agent of agents) {\n if (agent.id) {\n const success = await this.createAgent(agent as Agent);\n if (success) ids.push(agent.id);\n }\n }\n return ids;\n });\n }\n\n async updateAgents(updates: Array<{ agentId: UUID; agent: Partial<Agent> }>): Promise<boolean> {\n for (const { agentId, agent } of updates) {\n const success = await this.updateAgent(agentId, agent);\n if (!success) return false;\n }\n return true;\n }\n\n async upsertAgents(agents: Partial<Agent>[]): Promise<void> {\n for (const agent of agents) {\n if (!agent.id) continue;\n const existing = await this.getAgent(agent.id);\n if (existing) {\n await this.updateAgent(agent.id, agent);\n } else {\n await this.createAgent(agent as Agent);\n }\n }\n }\n\n async deleteAgents(agentIds: UUID[]): Promise<boolean> {\n if (agentIds.length === 0) return true;\n return this.withDatabase(async () => {\n try {\n await this.db.delete(agentTable).where(inArray(agentTable.id, agentIds));\n return true;\n } catch (error) {\n logger.error(\n {\n src: \"plugin:sql\",\n error: error instanceof Error ? error.message : String(error),\n },\n \"Failed to delete agents\"\n );\n return false;\n }\n });\n }\n\n /**\n * Asynchronously creates a new agent record in the database.\n *\n * @param {Partial<Agent>} agent The agent object to be created.\n * @returns {Promise<boolean>} A promise that resolves to a boolean indicating the success of the operation.\n */\n async createAgent(agent: Agent): Promise<boolean> {\n return this.withDatabase(async () => {\n try {\n // Check for existing agent with the same ID only (names can be duplicated)\n if (agent.id) {\n const existing = await this.db\n .select({ id: agentTable.id })\n .from(agentTable)\n .where(eq(agentTable.id, agent.id))\n .limit(1);\n\n if (existing.length > 0) {\n logger.warn(\n { src: \"plugin:sql\", agentId: agent.id },\n \"Attempted to create agent with duplicate ID\"\n );\n return false;\n }\n }\n\n await this.db.transaction(async (tx) => {\n const agentData = {\n ...agent,\n createdAt: new Date(\n typeof agent.createdAt === \"bigint\"\n ? Number(agent.createdAt)\n : agent.createdAt || Date.now()\n ),\n updatedAt: new Date(\n typeof agent.updatedAt === \"bigint\"\n ? Number(agent.updatedAt)\n : agent.updatedAt || Date.now()\n ),\n };\n const sanitizedAgentData = Object.fromEntries(\n Object.entries(agentData).filter(([, value]) => value !== undefined)\n ) as typeof agentTable.$inferInsert;\n\n await tx.insert(agentTable).values(sanitizedAgentData);\n });\n\n return true;\n } catch (error) {\n if (isDuplicateKeyError(error)) {\n logger.warn(\n { src: \"plugin:sql\", agentId: agent.id },\n \"Attempted to create agent with duplicate ID\"\n );\n return false;\n }\n\n logger.error(\n {\n src: \"plugin:sql\",\n agentId: agent.id,\n error: error instanceof Error ? error.message : String(error),\n },\n \"Failed to create agent\"\n );\n throw error;\n }\n });\n }\n\n /**\n * Updates an agent in the database with the provided agent ID and data.\n * @param {UUID} agentId - The unique identifier of the agent to update.\n * @param {Partial<Agent>} agent - The partial agent object containing the fields to update.\n * @returns {Promise<boolean>} - A boolean indicating if the agent was successfully updated.\n */\n async updateAgent(agentId: UUID, agent: Partial<Agent>): Promise<boolean> {\n return this.withDatabase(async () => {\n try {\n if (!agentId) {\n throw new Error(\"Agent ID is required for update\");\n }\n\n await this.db.transaction(async (tx) => {\n // Handle settings update if present\n if (agent.settings) {\n agent.settings = await this.mergeAgentSettings(tx, agentId, agent.settings);\n }\n\n // Convert numeric timestamps to Date objects for database storage\n // The Agent interface uses numbers, but the database schema expects Date objects\n const updateData: Record<string, unknown> = { ...agent };\n\n if (updateData.createdAt) {\n if (typeof updateData.createdAt === \"number\") {\n updateData.createdAt = new Date(updateData.createdAt);\n } else {\n delete updateData.createdAt; // Don't update createdAt if it's not a valid timestamp\n }\n }\n if (updateData.updatedAt) {\n if (typeof updateData.updatedAt === \"number\") {\n updateData.updatedAt = new Date(updateData.updatedAt);\n } else {\n updateData.updatedAt = new Date(); // Use current time if invalid\n }\n } else {\n updateData.updatedAt = new Date(); // Always set updatedAt to current time\n }\n\n await tx.update(agentTable).set(updateData).where(eq(agentTable.id, agentId));\n });\n\n return true;\n } catch (error) {\n logger.error(\n {\n src: \"plugin:sql\",\n agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n \"Failed to update agent\"\n );\n return false;\n }\n });\n }\n\n /**\n * Merges updated agent settings with existing settings in the database,\n * with special handling for nested objects like secrets.\n * @param tx - The database transaction\n * @param agentId - The ID of the agent\n * @param updatedSettings - The settings object with updates\n * @returns The merged settings object\n * @private\n */\n private async mergeAgentSettings<T extends Record<string, unknown>>(\n tx: DrizzleDatabase,\n agentId: UUID,\n updatedSettings: T\n ): Promise<T> {\n // First get the current agent data\n const currentAgent = await tx\n .select({ settings: agentTable.settings })\n .from(agentTable)\n .where(eq(agentTable.id, agentId))\n .limit(1);\n\n const currentSettings =\n currentAgent.length > 0 && currentAgent[0].settings ? currentAgent[0].settings : {};\n\n const deepMerge = (\n target: Record<string, unknown> | unknown,\n source: Record<string, unknown>\n ): Record<string, unknown> | undefined => {\n // If source is explicitly null, it means the intention is to set this entire branch to null (or delete if top-level handled by caller).\n // For recursive calls, if a sub-object in source is null, it effectively means \"remove this sub-object from target\".\n // However, our primary deletion signal is a *property value* being null within an object.\n if (source === null) {\n // If the entire source for a given key is null, we treat it as \"delete this key from target\"\n // by returning undefined, which the caller can use to delete the key.\n return undefined;\n }\n\n // If source is an array or a primitive, it replaces the target value.\n if (Array.isArray(source) || typeof source !== \"object\") {\n return source;\n }\n\n // Initialize output. If target is not an object, start with an empty one to merge source into.\n const output: Record<string, unknown> =\n typeof target === \"object\" && target !== null && !Array.isArray(target)\n ? { ...(target as Record<string, unknown>) }\n : {};\n\n for (const key of Object.keys(source)) {\n // Iterate over source keys\n const sourceValue = source[key];\n\n if (sourceValue === null) {\n // If a value in source is null, delete the corresponding key from output.\n delete output[key];\n } else if (typeof sourceValue === \"object\" && !Array.isArray(sourceValue)) {\n // If value is an object, recurse.\n const nestedMergeResult = deepMerge(output[key], sourceValue as Record<string, unknown>);\n if (nestedMergeResult === undefined) {\n // If recursive merge resulted in undefined (meaning the nested object should be deleted)\n delete output[key];\n } else {\n output[key] = nestedMergeResult;\n }\n } else {\n // Primitive or array value from source, assign it.\n output[key] = sourceValue;\n }\n }\n\n // After processing all keys from source, check if output became empty.\n // An object is empty if all its keys were deleted or resulted in undefined.\n // This is a more direct check than iterating 'output' after building it.\n if (Object.keys(output).length === 0) {\n // If the source itself was not an explicitly empty object,\n // and the merge resulted in an empty object, signal deletion.\n if (!(typeof source === \"object\" && source !== null && Object.keys(source).length === 0)) {\n return undefined; // Signal to delete this (parent) key if it became empty.\n }\n }\n\n return output;\n }; // End of deepMerge\n\n const finalSettings = deepMerge(currentSettings, updatedSettings);\n // If the entire settings object becomes undefined (e.g. all keys removed),\n // return an empty object instead of undefined/null to keep the settings field present.\n return (finalSettings ?? {}) as T;\n }\n\n /**\n * Asynchronously deletes an agent with the specified UUID and all related entries.\n *\n * @param {UUID} agentId - The UUID of the agent to be deleted.\n * @returns {Promise<boolean>} - A boolean indicating if the deletion was successful.\n */\n async deleteAgent(agentId: UUID): Promise<boolean> {\n return this.withDatabase(async () => {\n try {\n // Simply delete the agent - all related data will be cascade deleted\n const result = await this.db\n .delete(agentTable)\n .where(eq(agentTable.id, agentId))\n .returning();\n\n if (result.length === 0) {\n logger.warn({ src: \"plugin:sql\", agentId }, \"Agent not found for deletion\");\n return false;\n }\n\n return true;\n } catch (error) {\n logger.error(\n {\n src: \"plugin:sql\",\n agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n \"Failed to delete agent\"\n );\n throw error;\n }\n });\n }\n\n /**\n * Count all agents in the database\n * Used primarily for maintenance and cleanup operations\n */\n /**\n * Asynchronously counts the number of agents in the database.\n * @returns {Promise<number>} A Promise that resolves to the number of agents in the database.\n */\n async countAgents(): Promise<number> {\n return this.withDatabase(async () => {\n try {\n const result = await this.db.select({ count: count() }).from(agentTable);\n\n const result0 = result[0];\n return result0?.count || 0;\n } catch (error) {\n logger.error(\n {\n src: \"plugin:sql\",\n error: error instanceof Error ? error.message : String(error),\n },\n \"Failed to count agents\"\n );\n return 0;\n }\n });\n }\n\n /**\n * Clean up the agents table by removing all agents\n * This is used during server startup to ensure no orphaned agents exist\n * from previous crashes or improper shutdowns\n */\n async cleanupAgents(): Promise<void> {\n return this.withDatabase(async () => {\n try {\n await this.db.delete(agentTable);\n } catch (error) {\n logger.error(\n {\n src: \"plugin:sql\",\n error: error instanceof Error ? error.message : String(error),\n },\n \"Failed to clean up agent table\"\n );\n throw error;\n }\n });\n }\n\n /**\n * Asynchronously retrieves an entity and its components by entity IDs.\n * @param {UUID[]} entityIds - The unique identifiers of the entities to retrieve.\n * @returns {Promise<Entity[]>} A Promise that resolves to the entity with its components.\n */\n async getEntitiesByIds(entityIds: UUID[]): Promise<Entity[]> {\n return this.withDatabase(async () => {\n const result = await this.db\n .select({\n entity: entityTable,\n components: componentTable,\n })\n .from(entityTable)\n .leftJoin(componentTable, eq(componentTable.entityId, entityTable.id))\n .where(inArray(entityTable.id, entityIds));\n\n if (result.length === 0) return [];\n\n // Group components by entity\n const entities: Record<UUID, Entity> = {};\n const entityComponents: Record<UUID, Entity[\"components\"]> = {};\n for (const e of result) {\n const key = e.entity.id;\n entities[key] = e.entity;\n if (entityComponents[key] === undefined) entityComponents[key] = [];\n if (e.components) {\n // Handle both single component and array of components\n const componentsArray = Array.isArray(e.components) ? e.components : [e.components];\n entityComponents[key] = [...entityComponents[key], ...componentsArray];\n }\n }\n for (const k of Object.keys(entityComponents)) {\n entities[k].components = entityComponents[k];\n }\n\n return Object.values(entities);\n });\n }\n\n /**\n * Asynchronously retrieves all entities for a given room, optionally including their components.\n * @param {UUID} roomId - The unique identifier of the room to get entities for\n * @param {boolean} [includeComponents] - Whether to include component data for each entity\n * @returns {Promise<Entity[]>} A Promise that resolves to an array of entities in the room\n */\n async getEntitiesForRoom(roomId: UUID, includeComponents?: boolean): Promise<Entity[]> {\n return this.withDatabase(async () => {\n const query = this.db\n .select({\n entity: entityTable,\n ...(includeComponents && { components: componentTable }),\n })\n .from(participantTable)\n .leftJoin(\n entityTable,\n and(eq(participantTable.entityId, entityTable.id), eq(entityTable.agentId, this.agentId))\n );\n\n if (includeComponents) {\n query.leftJoin(componentTable, eq(componentTable.entityId, entityTable.id));\n }\n\n const result = await query.where(eq(participantTable.roomId, roomId));\n\n // Group components by entity if includeComponents is true\n const entitiesByIdMap = new Map<UUID, Entity>();\n\n for (const row of result) {\n if (!row.entity) continue;\n\n const entityId = row.entity.id as UUID;\n if (!entitiesByIdMap.has(entityId)) {\n const entity: Entity = {\n ...row.entity,\n id: entityId,\n agentId: row.entity.agentId as UUID,\n metadata: (row.entity.metadata || {}) as Metadata,\n components: includeComponents ? [] : undefined,\n };\n entitiesByIdMap.set(entityId, entity);\n }\n\n if (includeComponents && row.components) {\n const entity = entitiesByIdMap.get(entityId);\n if (entity) {\n if (!entity.components) {\n entity.components = [];\n }\n entity.components.push(row.components);\n }\n }\n }\n\n return Array.from(entitiesByIdMap.values());\n });\n }\n\n /**\n * Asynchronously creates new entities in the database.\n * @param {Entity[]} entities - The entity objects to be created.\n * @returns {Promise<UUID[]>} The IDs of the created entities.\n */\n async createEntities(entities: Entity[]): Promise<UUID[]> {\n return this.withDatabase(async () => {\n // Pre-assign IDs so we can recover existing rows on a duplicate-key\n // collision (treat duplicates as already-created → success).\n const normalizedEntities = entities.map((entity) => {\n const { names, metadata, ...normalizedEntity } = entity as Entity & {\n names?: unknown;\n metadata?: Metadata;\n };\n const id = (entity.id || v4()) as UUID;\n return {\n ...normalizedEntity,\n id,\n agentId: this.agentId,\n names: this.normalizeEntityNames(names),\n metadata: metadata || {},\n };\n });\n\n try {\n return await this.db.transaction(async (tx) => {\n await tx.insert(entityTable).values(normalizedEntities);\n return normalizedEntities.map((entity) => entity.id as UUID);\n });\n } catch (error) {\n if (isDuplicateKeyError(error)) {\n // Entities with these IDs already exist — return them so callers\n // see this as a successful (idempotent) create.\n logger.warn(\n { src: \"plugin:sql\", entityId: entities[0]?.id },\n \"Entities already exist; returning existing IDs\"\n );\n return normalizedEntities.map((entity) => entity.id as UUID);\n }\n logger.error(\n {\n src: \"plugin:sql\",\n entityId: entities[0]?.id,\n error: error instanceof Error ? error.message : String(error),\n },\n \"Failed to create entities\"\n );\n return [];\n }\n });\n }\n\n /**\n * Asynchronously ensures an entity exists, creating it if it doesn't\n * @param entity The entity to ensure exists\n * @returns Promise resolving to boolean indicating success\n */\n protected async ensureEntityExists(entity: Entity): Promise<boolean> {\n if (!entity.id) {\n logger.error({ src: \"plugin:sql\" }, \"Entity ID is required for ensureEntityExists\");\n return false;\n }\n\n try {\n const existingEntities = await this.getEntitiesByIds([entity.id]);\n\n if (!existingEntities.length) {\n return (await this.createEntities([entity])).length > 0;\n }\n\n return true;\n } catch (error) {\n logger.error(\n {\n src: \"plugin:sql\",\n entityId: entity.id,\n error: error instanceof Error ? error.message : String(error),\n },\n \"Failed to ensure entity exists\"\n );\n return false;\n }\n }\n\n /**\n * Asynchronously updates an entity in the database.\n * @param {Entity} entity - The entity object to be updated.\n * @returns {Promise<void>} A Promise that resolves when the entity is updated.\n */\n async updateEntity(entity: Entity): Promise<void> {\n if (!entity.id) {\n throw new Error(\"Entity ID is required for update\");\n }\n return this.withDatabase(async () => {\n // Normalize entity data to ensure names is a proper array\n const normalizedEntity = {\n ...entity,\n agentId: this.agentId,\n names: this.normalizeEntityNames(entity.names),\n metadata: entity.metadata || {},\n };\n\n await this.db\n .update(entityTable)\n .set(normalizedEntity)\n .where(eq(entityTable.id, entity.id as string));\n });\n }\n\n /**\n * Asynchronously deletes an entity from the database based on the provided ID.\n * @param {UUID} entityId - The ID of the entity to delete.\n * @returns {Promise<void>} A Promise that resolves when the entity is deleted.\n */\n async deleteEntity(entityId: UUID): Promise<void> {\n return this.withDatabase(async () => {\n await this.db.transaction(async (tx) => {\n // Delete related components first\n await tx\n .delete(componentTable)\n .where(\n or(eq(componentTable.entityId, entityId), eq(componentTable.sourceEntityId, entityId))\n );\n\n // Delete the entity\n await tx.delete(entityTable).where(eq(entityTable.id, entityId));\n });\n });\n }\n\n /**\n * Asynchronously retrieves entities by their names and agentId.\n * @param {Object} params - The parameters for retrieving entities.\n * @param {string[]} params.names - The names to search for.\n * @param {UUID} params.agentId - The agent ID to filter by.\n * @returns {Promise<Entity[]>} A Promise that resolves to an array of entities.\n */\n async getEntitiesByNames(params: { names: string[]; agentId: UUID }): Promise<Entity[]> {\n return this.withDatabase(async () => {\n const { names, agentId } = params;\n\n // Build a condition to match any of the names\n const nameConditions = names.map((name) => sql`${name} = ANY(${entityTable.names})`);\n\n const query = sql`\n SELECT * FROM ${entityTable}\n WHERE ${entityTable.agentId} = ${agentId}\n AND (${sql.join(nameConditions, sql` OR `)})\n `;\n\n const result = await this.db.execute(query);\n\n return result.rows.map((row: Record<string, unknown>) => ({\n id: row.id as UUID,\n agentId: row.agentId as UUID,\n names: (row.names || []) as string[],\n metadata: (row.metadata || {}) as Metadata,\n }));\n });\n }\n\n /**\n * Asynchronously searches for entities by name with fuzzy matching.\n * @param {Object} params - The parameters for searching entities.\n * @param {string} params.query - The search query.\n * @param {UUID} params.agentId - The agent ID to filter by.\n * @param {number} params.limit - The maximum number of results to return.\n * @returns {Promise<Entity[]>} A Promise that resolves to an array of entities.\n */\n async searchEntitiesByName(params: {\n query: string;\n agentId: UUID;\n limit?: number;\n }): Promise<Entity[]> {\n return this.withDatabase(async () => {\n const { query, agentId, limit = 10 } = params;\n\n // If query is empty, return all entities up to limit\n if (!query || query.trim() === \"\") {\n const result = await this.db\n .select()\n .from(entityTable)\n .where(eq(entityTable.agentId, agentId))\n .limit(limit);\n\n return result.map((row: Record<string, unknown>) => ({\n id: row.id as UUID,\n agentId: row.agentId as UUID,\n names: (row.names || []) as string[],\n metadata: (row.metadata || {}) as Metadata,\n }));\n }\n\n // Otherwise, search for entities with names containing the query (case-insensitive)\n const searchQuery = sql`\n SELECT * FROM ${entityTable}\n WHERE ${entityTable.agentId} = ${agentId}\n AND EXISTS (\n SELECT 1 FROM unnest(${entityTable.names}) AS name\n WHERE LOWER(name) LIKE LOWER(${`%${query}%`})\n )\n LIMIT ${limit}\n `;\n\n const result = await this.db.execute(searchQuery);\n\n return result.rows.map((row: Record<string, unknown>) => ({\n id: row.id as UUID,\n agentId: row.agentId as UUID,\n names: (row.names || []) as string[],\n metadata: (row.metadata || {}) as Metadata,\n }));\n });\n }\n\n async getComponent(\n entityId: UUID,\n type: string,\n worldId?: UUID,\n sourceEntityId?: UUID\n ): Promise<Component | null> {\n return this.withDatabase(async () => {\n const conditions = [eq(componentTable.entityId, entityId), eq(componentTable.type, type)];\n\n if (worldId) {\n conditions.push(eq(componentTable.worldId, worldId));\n }\n\n if (sourceEntityId) {\n conditions.push(eq(componentTable.sourceEntityId, sourceEntityId));\n }\n\n const result = await this.db\n .select()\n .from(componentTable)\n .where(and(...conditions));\n\n if (result.length === 0) return null;\n\n const component = result[0];\n\n return {\n ...component,\n id: component.id as UUID,\n entityId: component.entityId as UUID,\n agentId: component.agentId as UUID,\n roomId: component.roomId as UUID,\n worldId: (component.worldId ?? \"\") as UUID,\n sourceEntityId: (component.sourceEntityId ?? \"\") as UUID,\n data: component.data as Metadata,\n createdAt: component.createdAt.getTime(),\n };\n });\n }\n\n /**\n * Asynchronously retrieves all components for a given entity, optionally filtered by world and source entity.\n * @param {UUID} entityId - The unique identifier of the entity to retrieve components for\n * @param {UUID} [worldId] - Optional world ID to filter components by\n * @param {UUID} [sourceEntityId] - Optional source entity ID to filter components by\n * @returns {Promise<Component[]>} A Promise that resolves to an array of components\n */\n async getComponents(entityId: UUID, worldId?: UUID, sourceEntityId?: UUID): Promise<Component[]> {\n return this.withDatabase(async () => {\n const conditions = [eq(componentTable.entityId, entityId)];\n\n if (worldId) {\n conditions.push(eq(componentTable.worldId, worldId));\n }\n\n if (sourceEntityId) {\n conditions.push(eq(componentTable.sourceEntityId, sourceEntityId));\n }\n\n const result = await this.db\n .select({\n id: componentTable.id,\n entityId: componentTable.entityId,\n type: componentTable.type,\n data: componentTable.data,\n worldId: componentTable.worldId,\n agentId: componentTable.agentId,\n roomId: componentTable.roomId,\n sourceEntityId: componentTable.sourceEntityId,\n createdAt: componentTable.createdAt,\n })\n .from(componentTable)\n .where(and(...conditions));\n\n if (result.length === 0) return [];\n\n const components = result.map((component) => ({\n ...component,\n id: component.id as UUID,\n entityId: component.entityId as UUID,\n agentId: component.agentId as UUID,\n roomId: component.roomId as UUID,\n worldId: (component.worldId ?? \"\") as UUID,\n sourceEntityId: (component.sourceEntityId ?? \"\") as UUID,\n data: component.data as Metadata,\n createdAt: component.createdAt.getTime(),\n }));\n\n return components;\n });\n }\n\n /**\n * Asynchronously creates a new component in the database.\n * @param {Component} component - The component object to be created.\n * @returns {Promise<boolean>} A Promise that resolves to a boolean indicating the success of the operation.\n */\n async createComponent(component: Component): Promise<boolean> {\n return this.withDatabase(async () => {\n await this.db.insert(componentTable).values({\n ...component,\n createdAt: new Date(),\n });\n return true;\n });\n }\n\n /**\n * Asynchronously updates an existing component in the database.\n * @param {Component} component - The component object to be updated.\n * @returns {Promise<void>} A Promise that resolves when the component is updated.\n */\n async updateComponent(component: Component): Promise<void> {\n return this.withDatabase(async () => {\n try {\n // Convert createdAt from number to Date for database compatibility\n const { createdAt, ...rest } = component;\n await this.db\n .update(componentTable)\n .set({\n ...rest,\n createdAt: new Date(createdAt),\n })\n .where(eq(componentTable.id, component.id));\n } catch (e) {\n console.error(\"updateComponent error\", e);\n }\n });\n }\n\n /**\n * Asynchronously deletes a component from the database.\n * @param {UUID} componentId - The unique identifier of the component to delete.\n * @returns {Promise<void>} A Promise that resolves when the component is deleted.\n */\n async deleteComponent(componentId: UUID): Promise<void> {\n return this.withDatabase(async () => {\n await this.db.delete(componentTable).where(eq(componentTable.id, componentId));\n });\n }\n\n /**\n * Asynchronously retrieves memories from the database based on the provided parameters.\n * @param {Object} params - The parameters for retrieving memories.\n * @param {UUID} params.roomId - The ID of the room to retrieve memories for.\n * @param {number} [params.count] - The maximum number of memories to retrieve.\n * @param {number} [params.offset] - The offset for pagination.\n * @param {boolean} [params.unique] - Whether to retrieve unique memories only.\n * @param {string} [params.tableName] - The name of the table to retrieve memories from.\n * @param {number} [params.start] - The start date to retrieve memories from.\n * @param {number} [params.end] - The end date to retrieve memories from.\n * @returns {Promise<Memory[]>} A Promise that resolves to an array of memories.\n */\n async getMemories(params: {\n entityId?: UUID;\n agentId?: UUID;\n limit?: number;\n count?: number;\n offset?: number;\n unique?: boolean;\n tableName: string;\n start?: number;\n end?: number;\n roomId?: UUID;\n worldId?: UUID;\n /**\n * When `false`, skip fetching/materializing the embedding vector. List and\n * browse callers discard embeddings, so fetching the 384-float column for\n * every row (via the embeddingTable join) is pure waste. Defaults to `true`\n * (embeddings included) to preserve existing behavior.\n */\n includeEmbedding?: boolean;\n accessContext?: AccessContext;\n }): Promise<Memory[]> {\n const { entityId, agentId, roomId, worldId, unique, start, end, offset } = params;\n const includeEmbedding = params.includeEmbedding !== false;\n const tableName = params.tableName;\n // Honor either `limit` (canonical) or `count` (legacy) so callers that pass\n // only `limit` still get a LIMIT clause applied (see IDatabaseAdapter.getMemories).\n const effectiveLimit = params.limit ?? params.count;\n\n if (offset !== undefined && offset < 0) {\n throw new Error(\"offset must be a non-negative number\");\n }\n\n return this.withEntityContext(entityId ?? null, async (tx) => {\n const conditions = [eq(memoryTable.type, tableName)];\n\n if (start !== undefined) {\n conditions.push(gte(memoryTable.createdAt, new Date(start)));\n }\n\n // RLS handles access control - no explicit entityId filter needed\n\n if (roomId) {\n conditions.push(eq(memoryTable.roomId, roomId));\n }\n\n // Add worldId condition\n if (worldId) {\n conditions.push(eq(memoryTable.worldId, worldId));\n }\n\n if (end !== undefined) {\n conditions.push(lte(memoryTable.createdAt, new Date(end)));\n }\n\n if (unique) {\n conditions.push(eq(memoryTable.unique, true));\n }\n\n if (agentId) {\n conditions.push(eq(memoryTable.agentId, agentId));\n }\n\n const memorySelect = {\n id: memoryTable.id,\n type: memoryTable.type,\n createdAt: memoryTable.createdAt,\n content: memoryTable.content,\n entityId: memoryTable.entityId,\n agentId: memoryTable.agentId,\n roomId: memoryTable.roomId,\n unique: memoryTable.unique,\n metadata: memoryTable.metadata,\n };\n type SelectedMemory = {\n id: string;\n type: string;\n createdAt: Date;\n content: unknown;\n entityId: string;\n agentId: string;\n roomId: string;\n unique: boolean;\n metadata: unknown;\n };\n const mapRow = (m: SelectedMemory, embedding: ArrayLike<number> | null | undefined) => ({\n id: m.id as UUID,\n type: m.type,\n createdAt: m.createdAt.getTime(),\n content: typeof m.content === \"string\" ? JSON.parse(m.content) : m.content,\n entityId: m.entityId as UUID,\n agentId: m.agentId as UUID,\n roomId: m.roomId as UUID,\n unique: m.unique,\n metadata: m.metadata as MemoryMetadata,\n embedding: embedding ? Array.from(embedding) : undefined,\n });\n\n if (includeEmbedding) {\n const baseQuery = tx\n .select({\n memory: memorySelect,\n embedding: embeddingTable[this.embeddingDimension],\n })\n .from(memoryTable)\n .leftJoin(embeddingTable, eq(embeddingTable.memoryId, memoryTable.id))\n .where(and(...conditions))\n .orderBy(desc(memoryTable.createdAt), desc(memoryTable.id));\n const rows = await (async () => {\n // Honor `effectiveLimit` (params.limit ?? params.count), matching the\n // no-embedding branch below. Gating the LIMIT on `params.count` alone\n // meant any caller passing only `limit` got NO limit clause and the\n // whole table back (e.g. evaluator recent-message fetches returning\n // thousands of rows instead of 10).\n if (effectiveLimit && offset !== undefined && offset > 0) {\n return baseQuery.limit(effectiveLimit).offset(offset);\n } else if (effectiveLimit) {\n return baseQuery.limit(effectiveLimit);\n } else if (offset !== undefined && offset > 0) {\n return baseQuery.offset(offset);\n } else {\n return baseQuery;\n }\n })();\n return rows.map((row) => mapRow(row.memory as SelectedMemory, row.embedding));\n }\n\n // includeEmbedding === false: skip the embeddingTable join + column. The\n // left join never filtered rows, so the result set is identical — only the\n // 384-float vector is omitted (callers that requested this discard it).\n const baseQuery = tx\n .select({ memory: memorySelect })\n .from(memoryTable)\n .where(and(...conditions))\n .orderBy(desc(memoryTable.createdAt), desc(memoryTable.id));\n const rows = await (async () => {\n if (effectiveLimit && offset !== undefined && offset > 0) {\n return baseQuery.limit(effectiveLimit).offset(offset);\n } else if (effectiveLimit) {\n return baseQuery.limit(effectiveLimit);\n } else if (offset !== undefined && offset > 0) {\n return baseQuery.offset(offset);\n } else {\n return baseQuery;\n }\n })();\n return rows.map((row) => mapRow(row.memory as SelectedMemory, undefined));\n });\n }\n\n /**\n * Asynchronously retrieves memories from the database based on the provided parameters.\n * @param {Object} params - The parameters for retrieving memories.\n * @param {UUID[]} params.roomIds - The IDs of the rooms to retrieve memories for.\n * @param {string} params.tableName - The name of the table to retrieve memories from.\n * @param {number} [params.limit] - The maximum number of memories to retrieve.\n * @returns {Promise<Memory[]>} A Promise that resolves to an array of memories.\n */\n async getMemoriesByRoomIds(params: {\n roomIds: UUID[];\n tableName: string;\n limit?: number;\n accessContext?: AccessContext;\n }): Promise<Memory[]> {\n return this.withDatabase(async () => {\n if (params.roomIds.length === 0) return [];\n\n const conditions = [\n eq(memoryTable.type, params.tableName),\n inArray(memoryTable.roomId, params.roomIds),\n ];\n\n conditions.push(eq(memoryTable.agentId, this.agentId));\n\n const query = this.db\n .select({\n id: memoryTable.id,\n type: memoryTable.type,\n createdAt: memoryTable.createdAt,\n content: memoryTable.content,\n entityId: memoryTable.entityId,\n agentId: memoryTable.agentId,\n roomId: memoryTable.roomId,\n unique: memoryTable.unique,\n metadata: memoryTable.metadata,\n })\n .from(memoryTable)\n .where(and(...conditions))\n .orderBy(desc(memoryTable.createdAt));\n\n const rows = params.limit ? await query.limit(params.limit) : await query;\n\n return rows.map((row) => ({\n id: row.id as UUID,\n createdAt: row.createdAt.getTime(),\n content: typeof row.content === \"string\" ? JSON.parse(row.content) : row.content,\n entityId: row.entityId as UUID,\n agentId: row.agentId as UUID,\n roomId: row.roomId as UUID,\n unique: row.unique,\n metadata: row.metadata,\n })) as Memory[];\n });\n }\n\n /**\n * Asynchronously retrieves a memory by its unique identifier.\n * @param {UUID} id - The unique identifier of the memory to retrieve.\n * @returns {Promise<Memory | null>} A Promise that resolves to the memory if found, null otherwise.\n */\n async getMemoryById(id: UUID): Promise<Memory | null> {\n return this.withDatabase(async () => {\n const result = await this.db\n .select({\n memory: memoryTable,\n embedding: embeddingTable[this.embeddingDimension],\n })\n .from(memoryTable)\n .leftJoin(embeddingTable, eq(memoryTable.id, embeddingTable.memoryId))\n .where(eq(memoryTable.id, id))\n .limit(1);\n\n if (result.length === 0) return null;\n\n const row = result[0];\n return {\n id: row.memory.id as UUID,\n createdAt: row.memory.createdAt.getTime(),\n content:\n typeof row.memory.content === \"string\"\n ? JSON.parse(row.memory.content)\n : row.memory.content,\n entityId: row.memory.entityId as UUID,\n agentId: row.memory.agentId as UUID,\n roomId: row.memory.roomId as UUID,\n unique: row.memory.unique,\n metadata: row.memory.metadata as MemoryMetadata,\n embedding: row.embedding ?? undefined,\n };\n });\n }\n\n /**\n * Asynchronously retrieves memories from the database based on the provided parameters.\n * @param {Object} params - The parameters for retrieving memories.\n * @param {UUID[]} params.memoryIds - The IDs of the memories to retrieve.\n * @param {string} [params.tableName] - The name of the table to retrieve memories from.\n * @returns {Promise<Memory[]>} A Promise that resolves to an array of memories.\n */\n async getMemoriesByIds(memoryIds: UUID[], tableName?: string): Promise<Memory[]> {\n return this.withDatabase(async () => {\n if (memoryIds.length === 0) return [];\n\n const conditions = [inArray(memoryTable.id, memoryIds)];\n\n if (tableName) {\n conditions.push(eq(memoryTable.type, tableName));\n }\n\n const rows = await this.db\n .select({\n memory: memoryTable,\n embedding: embeddingTable[this.embeddingDimension],\n })\n .from(memoryTable)\n .leftJoin(embeddingTable, eq(embeddingTable.memoryId, memoryTable.id))\n .where(and(...conditions))\n .orderBy(desc(memoryTable.createdAt));\n\n return rows.map((row) => ({\n id: row.memory.id as UUID,\n createdAt: row.memory.createdAt.getTime(),\n content:\n typeof row.memory.content === \"string\"\n ? JSON.parse(row.memory.content)\n : row.memory.content,\n entityId: row.memory.entityId as UUID,\n agentId: row.memory.agentId as UUID,\n roomId: row.memory.roomId as UUID,\n unique: row.memory.unique,\n metadata: row.memory.metadata as MemoryMetadata,\n embedding: row.embedding ?? undefined,\n }));\n });\n }\n\n /**\n * Asynchronously retrieves cached embeddings from the database based on the provided parameters.\n * @param {Object} opts - The parameters for retrieving cached embeddings.\n * @param {string} opts.query_table_name - The name of the table to retrieve embeddings from.\n * @param {number} opts.query_threshold - The threshold for the levenshtein distance.\n * @param {string} opts.query_input - The input string to search for.\n * @param {string} opts.query_field_name - The name of the field to retrieve embeddings from.\n * @param {string} opts.query_field_sub_name - The name of the sub-field to retrieve embeddings from.\n * @param {number} opts.query_match_count - The maximum number of matches to retrieve.\n * @returns {Promise<{ embedding: number[]; levenshtein_score: number }[]>} A Promise that resolves to an array of cached embeddings.\n */\n async getCachedEmbeddings(opts: {\n query_table_name: string;\n query_threshold: number;\n query_input: string;\n query_field_name: string;\n query_field_sub_name: string;\n query_match_count: number;\n }): Promise<{ embedding: number[]; levenshtein_score: number }[]> {\n return this.withDatabase(async () => {\n try {\n // Drizzle database has execute method for raw SQL\n interface DrizzleDatabaseWithExecute {\n execute: (query: ReturnType<typeof sql>) => Promise<{ rows: Record<string, unknown>[] }>;\n }\n const results = await (this.db as DrizzleDatabaseWithExecute).execute(sql`\n WITH content_text AS (\n SELECT\n m.id,\n COALESCE(\n m.content->>${opts.query_field_sub_name},\n ''\n ) as content_text\n FROM memories m\n WHERE m.type = ${opts.query_table_name}\n AND m.content->>${opts.query_field_sub_name} IS NOT NULL\n ),\n embedded_text AS (\n SELECT\n ct.content_text,\n COALESCE(\n e.dim_384,\n e.dim_512,\n e.dim_768,\n e.dim_1024,\n e.dim_1536,\n e.dim_3072\n ) as embedding\n FROM content_text ct\n LEFT JOIN embeddings e ON e.memory_id = ct.id\n WHERE e.memory_id IS NOT NULL\n )\n SELECT\n embedding,\n levenshtein(CAST(${opts.query_input} AS text), content_text) as levenshtein_score\n FROM embedded_text\n WHERE levenshtein(CAST(${opts.query_input} AS text), content_text) <= ${opts.query_threshold}\n ORDER BY levenshtein_score\n LIMIT ${opts.query_match_count}\n `);\n\n return results.rows\n .map((row) => ({\n embedding: Array.isArray(row.embedding)\n ? row.embedding\n : typeof row.embedding === \"string\"\n ? JSON.parse(row.embedding)\n : [],\n levenshtein_score: Number(row.levenshtein_score),\n }))\n .filter((row) => Array.isArray(row.embedding));\n } catch (error) {\n logger.error(\n {\n src: \"plugin:sql\",\n tableName: opts.query_table_name,\n fieldName: opts.query_field_name,\n error: error instanceof Error ? error.message : String(error),\n },\n \"Failed to get cached embeddings\"\n );\n if (\n error instanceof Error &&\n error.message === \"levenshtein argument exceeds maximum length of 255 characters\"\n ) {\n return [];\n }\n throw error;\n }\n });\n }\n\n /**\n * Asynchronously logs an event in the database.\n * @param {Object} params - The parameters for logging an event.\n * @param {Object} params.body - The body of the event to log.\n * @param {UUID} params.entityId - The ID of the entity associated with the event.\n * @param {UUID} params.roomId - The ID of the room associated with the event.\n * @param {string} params.type - The type of the event to log.\n * @returns {Promise<void>} A Promise that resolves when the event is logged.\n */\n async log(params: { body: LogBody; entityId: UUID; roomId: UUID; type: string }): Promise<void> {\n return this.withDatabase(async () => {\n try {\n // Sanitize JSON body to prevent Unicode escape sequence errors\n const sanitizedBody = this.sanitizeJsonObject(params.body);\n\n // Serialize to JSON string first for an additional layer of protection\n // This ensures any problematic characters are properly escaped during JSON serialization\n const jsonString = JSON.stringify(sanitizedBody);\n\n // Use withEntityContext to set Entity RLS context before inserting\n // This ensures the log entry passes STRICT Entity RLS policy\n await this.withEntityContext(params.entityId, async (tx) => {\n await tx.insert(logTable).values({\n body: sql`${jsonString}::jsonb`,\n entityId: params.entityId,\n roomId: params.roomId,\n type: params.type,\n });\n });\n } catch (error) {\n logger.error(\n {\n src: \"plugin:sql\",\n type: params.type,\n roomId: params.roomId,\n entityId: params.entityId,\n error: error instanceof Error ? error.message : String(error),\n },\n \"Failed to create log entry\"\n );\n return;\n }\n });\n }\n\n /**\n * Sanitizes a JSON object by replacing problematic Unicode escape sequences\n * that could cause errors during JSON serialization/storage\n *\n * @param value - The value to sanitize\n * @returns The sanitized value\n */\n private sanitizeJsonObject(value: unknown, seen: WeakSet<object> = new WeakSet()): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === \"string\") {\n // Handle multiple cases that can cause PostgreSQL/PgLite JSON parsing errors:\n // 1. Remove null bytes (U+0000) which are not allowed in PostgreSQL text fields\n // 2. Escape single backslashes that might be interpreted as escape sequences\n // 3. Fix broken Unicode escape sequences (\\u not followed by 4 hex digits)\n const nullChar = String.fromCharCode(0);\n const nullCharRegex = new RegExp(nullChar, \"g\");\n return value\n .replace(nullCharRegex, \"\") // Remove null bytes\n .replace(/\\\\(?![\"\\\\/bfnrtu])/g, \"\\\\\\\\\") // Escape single backslashes not part of valid escape sequences\n .replace(/\\\\u(?![0-9a-fA-F]{4})/g, \"\\\\\\\\u\"); // Fix malformed Unicode escape sequences\n }\n\n if (typeof value === \"object\") {\n if (seen.has(value as object)) {\n return null;\n } else {\n seen.add(value as object);\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => this.sanitizeJsonObject(item, seen));\n } else {\n const result: Record<string, unknown> = {};\n const nullChar = String.fromCharCode(0);\n const nullCharRegex = new RegExp(nullChar, \"g\");\n for (const [key, val] of Object.entries(value)) {\n // Also sanitize object keys\n const sanitizedKey =\n typeof key === \"string\"\n ? key.replace(nullCharRegex, \"\").replace(/\\\\u(?![0-9a-fA-F]{4})/g, \"\\\\\\\\u\")\n : key;\n result[sanitizedKey] = this.sanitizeJsonObject(val, seen);\n }\n return result;\n }\n }\n\n return value;\n }\n\n /**\n * Asynchronously retrieves logs from the database based on the provided parameters.\n * @param {Object} params - The parameters for retrieving logs.\n * @param {UUID} params.entityId - The ID of the entity associated with the logs.\n * @param {UUID} [params.roomId] - The ID of the room associated with the logs.\n * @param {string} [params.type] - The type of the logs to retrieve.\n * @param {number} [params.count] - The maximum number of logs to retrieve.\n * @param {number} [params.offset] - The offset to retrieve logs from.\n * @returns {Promise<Log[]>} A Promise that resolves to an array of logs.\n */\n async getLogs(params: {\n entityId?: UUID;\n roomId?: UUID;\n type?: string;\n count?: number;\n offset?: number;\n }): Promise<Log[]> {\n const { entityId, roomId, type, count, offset } = params;\n\n // Use withEntityContext for RLS only when entityId is provided\n // Without entityId, bypass RLS to see all logs (for non-RLS mode)\n return this.withEntityContext(entityId ?? null, async (tx) => {\n const result = await tx\n .select()\n .from(logTable)\n .where(\n and(\n roomId ? eq(logTable.roomId, roomId) : undefined,\n type ? eq(logTable.type, type) : undefined\n )\n )\n .orderBy(desc(logTable.createdAt))\n .limit(count ?? 10)\n .offset(offset ?? 0);\n\n const logs = result.map((log) => ({\n ...log,\n id: log.id as UUID,\n entityId: log.entityId as UUID,\n roomId: log.roomId as UUID,\n type: log.type as string,\n body: log.body as LogBody,\n createdAt: new Date(log.createdAt as string | number | Date),\n }));\n\n if (logs.length === 0) return [];\n\n return logs;\n });\n }\n\n async getAgentRunSummaries(\n params: {\n limit?: number;\n roomId?: UUID;\n status?: RunStatus | \"all\";\n from?: number;\n to?: number;\n entityId?: UUID;\n } = {}\n ): Promise<AgentRunSummaryResult> {\n const limit = Math.min(Math.max(params.limit ?? 20, 1), 100);\n const fromDate = typeof params.from === \"number\" ? new Date(params.from) : undefined;\n const toDate = typeof params.to === \"number\" ? new Date(params.to) : undefined;\n\n // Use withEntityContext for RLS when entityId is provided\n return this.withEntityContext(params.entityId ?? null, async (tx) => {\n const runMap = new Map<string, AgentRunSummary>();\n\n const conditions: SQL<unknown>[] = [\n eq(logTable.type, \"run_event\"),\n sql`${logTable.body} ? 'runId'`,\n eq(roomTable.agentId, this.agentId),\n ];\n\n if (params.roomId) {\n conditions.push(eq(logTable.roomId, params.roomId));\n }\n if (fromDate) {\n conditions.push(gte(logTable.createdAt, fromDate));\n }\n if (toDate) {\n conditions.push(lte(logTable.createdAt, toDate));\n }\n\n const whereClause = and(...conditions);\n\n const eventLimit = Math.max(limit * 20, 200);\n\n const runEventRows = await tx\n .select({\n runId: sql<string>`(${logTable.body} ->> 'runId')`,\n status: sql<string | null>`(${logTable.body} ->> 'status')`,\n messageId: sql<string | null>`(${logTable.body} ->> 'messageId')`,\n rawBody: logTable.body,\n createdAt: logTable.createdAt,\n roomId: logTable.roomId,\n entityId: logTable.entityId,\n })\n .from(logTable)\n .innerJoin(roomTable, eq(roomTable.id, logTable.roomId))\n .where(whereClause)\n .orderBy(desc(logTable.createdAt))\n .limit(eventLimit);\n\n for (const row of runEventRows) {\n const runId = row.runId;\n if (!runId) continue;\n\n const summary: AgentRunSummary = runMap.get(runId) ?? {\n runId,\n status: \"started\",\n startedAt: null,\n endedAt: null,\n durationMs: null,\n messageId: undefined,\n roomId: undefined,\n entityId: undefined,\n metadata: {},\n };\n\n if (!summary.messageId && row.messageId) {\n summary.messageId = row.messageId as UUID;\n }\n if (!summary.roomId && row.roomId) {\n summary.roomId = row.roomId as UUID;\n }\n if (!summary.entityId && row.entityId) {\n summary.entityId = row.entityId as UUID;\n }\n\n const body = row.rawBody as Record<string, unknown> | undefined;\n if (body && typeof body === \"object\") {\n if (!summary.roomId && typeof body.roomId === \"string\") {\n summary.roomId = body.roomId as UUID;\n }\n if (!summary.entityId && typeof body.entityId === \"string\") {\n summary.entityId = body.entityId as UUID;\n }\n if (!summary.messageId && typeof body.messageId === \"string\") {\n summary.messageId = body.messageId as UUID;\n }\n if (!summary.metadata || Object.keys(summary.metadata).length === 0) {\n const metadata = (body.metadata as Record<string, unknown> | undefined) ?? undefined;\n summary.metadata = metadata ? ({ ...metadata } as Record<string, JsonValue>) : {};\n }\n }\n\n const createdAt = row.createdAt instanceof Date ? row.createdAt : new Date(row.createdAt);\n const timestamp = createdAt.getTime();\n const bodyStatus = body?.status;\n const eventStatus =\n (row.status as RunStatus | undefined) ?? (bodyStatus as RunStatus | undefined);\n\n if (eventStatus === \"started\") {\n const currentStartedAt =\n summary.startedAt === null\n ? null\n : typeof summary.startedAt === \"bigint\"\n ? Number(summary.startedAt)\n : summary.startedAt;\n summary.startedAt =\n currentStartedAt === null ? timestamp : Math.min(currentStartedAt, timestamp);\n } else if (\n eventStatus === \"completed\" ||\n eventStatus === \"timeout\" ||\n eventStatus === \"error\"\n ) {\n summary.status = eventStatus;\n summary.endedAt = timestamp;\n if (summary.startedAt !== null) {\n const startedAtNum =\n typeof summary.startedAt === \"bigint\" ? Number(summary.startedAt) : summary.startedAt;\n summary.durationMs = Math.max(timestamp - startedAtNum, 0);\n }\n }\n\n runMap.set(runId, summary);\n }\n\n let runs = Array.from(runMap.values());\n if (params.status && params.status !== \"all\") {\n runs = runs.filter((run) => run.status === params.status);\n }\n\n runs.sort((a, b) => {\n const aStarted =\n a.startedAt === null\n ? 0\n : typeof a.startedAt === \"bigint\"\n ? Number(a.startedAt)\n : a.startedAt;\n const bStarted =\n b.startedAt === null\n ? 0\n : typeof b.startedAt === \"bigint\"\n ? Number(b.startedAt)\n : b.startedAt;\n return bStarted - aStarted;\n });\n\n const total = runs.length;\n const limitedRuns = runs.slice(0, limit);\n const hasMore = total > limit;\n\n const runCounts = new Map<string, AgentRunCounts>();\n for (const run of limitedRuns) {\n runCounts.set(run.runId, {\n actions: 0,\n modelCalls: 0,\n errors: 0,\n evaluators: 0,\n });\n }\n\n const runIds = limitedRuns.map((run) => run.runId).filter(Boolean);\n\n if (runIds.length > 0) {\n const runIdArray = sql`array[${sql.join(\n runIds.map((id) => sql`${id}`),\n sql`, `\n )}]::text[]`;\n\n const actionSummary = await this.db.execute(sql`\n SELECT\n body->>'runId' as \"runId\",\n COUNT(*)::int as \"actions\",\n SUM(CASE WHEN COALESCE(body->'result'->>'success', 'true') = 'false' THEN 1 ELSE 0 END)::int as \"errors\",\n SUM(COALESCE((body->>'promptCount')::int, 0))::int as \"modelCalls\"\n FROM ${logTable}\n WHERE type = 'action'\n AND body->>'runId' = ANY(${runIdArray})\n GROUP BY body->>'runId'\n `);\n\n const actionRows = actionSummary.rows as Array<{\n runId: string;\n actions: number | string;\n errors: number | string;\n modelCalls: number | string;\n }>;\n\n for (const row of actionRows) {\n const counts = runCounts.get(row.runId);\n if (!counts) continue;\n counts.actions += Number(row.actions);\n counts.errors += Number(row.errors);\n counts.modelCalls += Number(row.modelCalls);\n }\n\n const evaluatorSummary = await this.db.execute(sql`\n SELECT\n body->>'runId' as \"runId\",\n COUNT(*)::int as \"evaluators\"\n FROM ${logTable}\n WHERE type = 'evaluator'\n AND body->>'runId' = ANY(${runIdArray})\n GROUP BY body->>'runId'\n `);\n\n const evaluatorRows = evaluatorSummary.rows as Array<{\n runId: string;\n evaluators: number | string;\n }>;\n\n for (const row of evaluatorRows) {\n const counts = runCounts.get(row.runId);\n if (!counts) continue;\n counts.evaluators += Number(row.evaluators);\n }\n\n const genericSummary = await this.db.execute(sql`\n SELECT\n body->>'runId' as \"runId\",\n COUNT(*) FILTER (WHERE type LIKE 'useModel:%')::int as \"modelLogs\",\n COUNT(*) FILTER (WHERE type = 'embedding_event' AND body->>'status' = 'failed')::int as \"embeddingErrors\"\n FROM ${logTable}\n WHERE (type LIKE 'useModel:%' OR type = 'embedding_event')\n AND body->>'runId' = ANY(${runIdArray})\n GROUP BY body->>'runId'\n `);\n\n const genericRows = genericSummary.rows as Array<{\n runId: string;\n modelLogs: number | string;\n embeddingErrors: number | string;\n }>;\n\n for (const row of genericRows) {\n const counts = runCounts.get(row.runId);\n if (!counts) continue;\n counts.modelCalls += Number(row.modelLogs);\n counts.errors += Number(row.embeddingErrors);\n }\n }\n\n for (const run of limitedRuns) {\n const counts = runCounts.get(run.runId) ?? {\n actions: 0,\n modelCalls: 0,\n errors: 0,\n evaluators: 0,\n };\n run.counts = counts;\n }\n\n return {\n runs: limitedRuns,\n total,\n hasMore,\n } as AgentRunSummaryResult;\n });\n }\n\n /**\n * Asynchronously deletes a log from the database based on the provided parameters.\n * @param {UUID} logId - The ID of the log to delete.\n * @returns {Promise<void>} A Promise that resolves when the log is deleted.\n */\n async deleteLog(logId: UUID): Promise<void> {\n return this.withDatabase(async () => {\n await this.db.delete(logTable).where(eq(logTable.id, logId));\n });\n }\n\n /**\n * Asynchronously searches for memories in the database based on the provided parameters.\n * @param {Object} params - The parameters for searching for memories.\n * @param {string} params.tableName - The name of the table to search for memories in.\n * @param {number[]} params.embedding - The embedding to search for.\n * @param {number} [params.match_threshold] - The threshold for the cosine distance.\n * @param {number} [params.count] - The maximum number of memories to retrieve.\n * @param {boolean} [params.unique] - Whether to retrieve unique memories only.\n * @param {string} [params.query] - Optional query string for potential reranking.\n * @param {UUID} [params.roomId] - Optional room ID to filter by.\n * @param {UUID} [params.worldId] - Optional world ID to filter by.\n * @param {UUID} [params.entityId] - Optional entity ID to filter by.\n * @returns {Promise<Memory[]>} A Promise that resolves to an array of memories.\n */\n async searchMemories(params: {\n tableName: string;\n embedding: number[];\n match_threshold?: number;\n count?: number;\n unique?: boolean;\n query?: string;\n roomId?: UUID;\n worldId?: UUID;\n entityId?: UUID;\n accessContext?: AccessContext;\n }): Promise<Memory[]> {\n return await this.searchMemoriesByEmbedding(params.embedding, {\n match_threshold: params.match_threshold,\n count: params.count,\n // Pass direct scope fields down\n roomId: params.roomId,\n worldId: params.worldId,\n entityId: params.entityId,\n unique: params.unique,\n tableName: params.tableName,\n });\n }\n\n /**\n * Asynchronously searches for memories in the database based on the provided parameters.\n * @param {number[]} embedding - The embedding to search for.\n * @param {Object} params - The parameters for searching for memories.\n * @param {number} [params.match_threshold] - The threshold for the cosine distance.\n * @param {number} [params.count] - The maximum number of memories to retrieve.\n * @param {UUID} [params.roomId] - Optional room ID to filter by.\n * @param {UUID} [params.worldId] - Optional world ID to filter by.\n * @param {UUID} [params.entityId] - Optional entity ID to filter by.\n * @param {boolean} [params.unique] - Whether to retrieve unique memories only.\n * @param {string} [params.tableName] - The name of the table to search for memories in.\n * @returns {Promise<Memory[]>} A Promise that resolves to an array of memories.\n */\n async searchMemoriesByEmbedding(\n embedding: number[],\n params: {\n match_threshold?: number;\n count?: number;\n roomId?: UUID;\n worldId?: UUID;\n entityId?: UUID;\n unique?: boolean;\n tableName: string;\n }\n ): Promise<Memory[]> {\n return this.withDatabase(async () => {\n const cleanVector = embedding.map((n) => (Number.isFinite(n) ? Number(n.toFixed(6)) : 0));\n\n const similarity = sql<number>`1 - (${cosineDistance(\n embeddingTable[this.embeddingDimension],\n cleanVector\n )})`;\n\n const conditions = [eq(memoryTable.type, params.tableName)];\n\n if (params.unique) {\n conditions.push(eq(memoryTable.unique, true));\n }\n\n conditions.push(eq(memoryTable.agentId, this.agentId));\n\n // Add filters based on direct params\n if (params.roomId) {\n conditions.push(eq(memoryTable.roomId, params.roomId));\n }\n if (params.worldId) {\n conditions.push(eq(memoryTable.worldId, params.worldId));\n }\n if (params.entityId) {\n conditions.push(eq(memoryTable.entityId, params.entityId));\n }\n\n if (params.match_threshold) {\n conditions.push(gte(similarity, params.match_threshold));\n }\n\n const results = await this.db\n .select({\n memory: memoryTable,\n similarity,\n embedding: embeddingTable[this.embeddingDimension],\n })\n .from(embeddingTable)\n .innerJoin(memoryTable, eq(memoryTable.id, embeddingTable.memoryId))\n .where(and(...conditions))\n .orderBy(desc(similarity))\n .limit(params.count ?? 10);\n\n return results.map((row) => ({\n id: row.memory.id as UUID,\n type: row.memory.type,\n createdAt: row.memory.createdAt.getTime(),\n content:\n typeof row.memory.content === \"string\"\n ? JSON.parse(row.memory.content)\n : row.memory.content,\n entityId: row.memory.entityId as UUID,\n agentId: row.memory.agentId as UUID,\n roomId: row.memory.roomId as UUID,\n worldId: row.memory.worldId as UUID | undefined, // Include worldId\n unique: row.memory.unique,\n metadata: row.memory.metadata as MemoryMetadata,\n embedding: row.embedding ?? undefined,\n similarity: row.similarity,\n }));\n });\n }\n\n /**\n * Asynchronously creates a new memory in the database.\n * @param {Memory & { metadata?: MemoryMetadata }} memory - The memory object to create.\n * @param {string} tableName - The name of the table to create the memory in.\n * @returns {Promise<UUID>} A Promise that resolves to the ID of the created memory.\n */\n async createMemory(\n memory: Memory & { metadata?: MemoryMetadata },\n tableName: string\n ): Promise<UUID> {\n const memoryId = memory.id ?? (v4() as UUID);\n\n const existing = await this.getMemoryById(memoryId);\n if (existing) {\n return memoryId;\n }\n\n // only do costly check if we need to\n if (memory.unique === undefined) {\n memory.unique = true; // set default\n if (memory.embedding && Array.isArray(memory.embedding)) {\n const similarMemories = await this.searchMemoriesByEmbedding(memory.embedding, {\n tableName,\n // Use the scope fields from the memory object for similarity check\n roomId: memory.roomId,\n worldId: memory.worldId,\n entityId: memory.entityId,\n match_threshold: 0.95,\n count: 1,\n });\n memory.unique = similarMemories.length === 0;\n }\n }\n\n // Ensure we always pass a JSON string to the SQL bind parameter; if we pass an\n // object directly PG sees `[object Object]` and fails the `::jsonb` cast.\n const contentToInsert =\n typeof memory.content === \"string\" ? memory.content : JSON.stringify(memory.content);\n\n const metadataToInsert =\n typeof memory.metadata === \"string\" ? memory.metadata : JSON.stringify(memory.metadata ?? {});\n\n // Use withEntityContext to set Entity RLS context if needed\n // This delegates to the concrete adapter implementation (PostgreSQL or PGLite)\n await this.withEntityContext(memory.entityId, async (tx) => {\n await tx.insert(memoryTable).values([\n {\n id: memoryId,\n type: tableName,\n content: sql`${contentToInsert}::jsonb`,\n metadata: sql`${metadataToInsert}::jsonb`,\n entityId: memory.entityId,\n roomId: memory.roomId,\n worldId: memory.worldId, // Include worldId\n agentId: memory.agentId || this.agentId,\n unique: memory.unique,\n createdAt: memory.createdAt !== undefined ? new Date(memory.createdAt) : new Date(),\n },\n ]);\n\n if (memory.embedding && Array.isArray(memory.embedding)) {\n const expectedDimension = Number(this.embeddingDimension.replace(/^dim/, \"\"));\n if (memory.embedding.length !== expectedDimension) {\n // The runtime's TEXT_EMBEDDING provider returned a vector whose width\n // does not match the column this agent is configured to write to —\n // typically because a fallback provider (e.g. cloud at 1536 dims) ran\n // before the configured local model finished warmup. Persist the\n // memory itself; skip the embedding so a later write with the right\n // model can supply one.\n logger.warn(\n {\n src: \"plugin:sql\",\n agentId: this.agentId,\n expectedDimension,\n receivedDimension: memory.embedding.length,\n column: this.embeddingDimension,\n },\n \"Skipping embedding insert: dimension mismatch with configured column\"\n );\n } else {\n const embeddingValues: Record<string, unknown> = {\n id: v4(),\n memoryId: memoryId,\n createdAt: memory.createdAt !== undefined ? new Date(memory.createdAt) : new Date(),\n };\n\n const cleanVector = memory.embedding.map((n) =>\n Number.isFinite(n) ? Number(n.toFixed(6)) : 0\n );\n\n embeddingValues[this.embeddingDimension] = cleanVector;\n\n await tx.insert(embeddingTable).values([embeddingValues]);\n }\n }\n });\n\n return memoryId;\n }\n\n /**\n * Updates an existing memory in the database.\n * @param memory The memory object with updated content and optional embedding\n * @returns Promise resolving to boolean indicating success\n */\n async updateMemory(\n memory: Partial<Memory> & { id: UUID; metadata?: MemoryMetadata }\n ): Promise<boolean> {\n return this.withDatabase(async () => {\n try {\n await this.db.transaction(async (tx) => {\n // Update memory content if provided\n if (memory.content) {\n const contentToUpdate =\n typeof memory.content === \"string\" ? memory.content : JSON.stringify(memory.content);\n\n const metadataToUpdate =\n typeof memory.metadata === \"string\"\n ? memory.metadata\n : JSON.stringify(memory.metadata ?? {});\n\n await tx\n .update(memoryTable)\n .set({\n content: sql`${contentToUpdate}::jsonb`,\n ...(memory.metadata && {\n metadata: sql`${metadataToUpdate}::jsonb`,\n }),\n })\n .where(eq(memoryTable.id, memory.id));\n } else if (memory.metadata) {\n // Update only metadata if content is not provided\n const metadataToUpdate =\n typeof memory.metadata === \"string\"\n ? memory.metadata\n : JSON.stringify(memory.metadata);\n\n await tx\n .update(memoryTable)\n .set({\n metadata: sql`${metadataToUpdate}::jsonb`,\n })\n .where(eq(memoryTable.id, memory.id));\n }\n\n // Update embedding if provided\n if (memory.embedding && Array.isArray(memory.embedding)) {\n const expectedDimension = Number(this.embeddingDimension.replace(/^dim/, \"\"));\n if (memory.embedding.length !== expectedDimension) {\n logger.warn(\n {\n src: \"plugin:sql\",\n agentId: this.agentId,\n memoryId: memory.id,\n expectedDimension,\n receivedDimension: memory.embedding.length,\n column: this.embeddingDimension,\n },\n \"Skipping embedding update: dimension mismatch with configured column\"\n );\n } else {\n const cleanVector = memory.embedding.map((n) =>\n Number.isFinite(n) ? Number(n.toFixed(6)) : 0\n );\n\n // Check if embedding exists\n const existingEmbedding = await tx\n .select({ id: embeddingTable.id })\n .from(embeddingTable)\n .where(eq(embeddingTable.memoryId, memory.id))\n .limit(1);\n\n if (existingEmbedding.length > 0) {\n // Update existing embedding\n const updateValues: Record<string, unknown> = {};\n updateValues[this.embeddingDimension] = cleanVector;\n\n await tx\n .update(embeddingTable)\n .set(updateValues)\n .where(eq(embeddingTable.memoryId, memory.id));\n } else {\n // Create new embedding\n const embeddingValues: Record<string, unknown> = {\n id: v4(),\n memoryId: memory.id,\n };\n embeddingValues[this.embeddingDimension] = cleanVector;\n\n await tx.insert(embeddingTable).values([embeddingValues]);\n }\n }\n }\n });\n\n return true;\n } catch (error) {\n logger.error(\n {\n src: \"plugin:sql\",\n memoryId: memory.id,\n error: error instanceof Error ? error.message : String(error),\n },\n \"Failed to update memory\"\n );\n return false;\n }\n });\n }\n\n /**\n * Asynchronously deletes a memory from the database based on the provided parameters.\n * @param {UUID} memoryId - The ID of the memory to delete.\n * @returns {Promise<void>} A Promise that resolves when the memory is deleted.\n */\n async deleteMemory(memoryId: UUID): Promise<void> {\n return this.withDatabase(async () => {\n await this.db.transaction(async (tx) => {\n // See if there are any fragments that we need to delete\n await this.deleteMemoryFragments(tx, memoryId);\n\n // Then delete the embedding for the main memory\n await tx.delete(embeddingTable).where(eq(embeddingTable.memoryId, memoryId));\n\n // Finally delete the memory itself\n await tx.delete(memoryTable).where(eq(memoryTable.id, memoryId));\n });\n });\n }\n\n /**\n * Asynchronously deletes multiple memories from the database in a single batch operation.\n * @param {UUID[]} memoryIds - An array of UUIDs of the memories to delete.\n * @returns {Promise<void>} A Promise that resolves when all memories are deleted.\n */\n async deleteManyMemories(memoryIds: UUID[]): Promise<void> {\n if (memoryIds.length === 0) {\n return;\n }\n\n return this.withDatabase(async () => {\n await this.db.transaction(async (tx) => {\n // Process in smaller batches to avoid query size limits\n const BATCH_SIZE = 100;\n for (let i = 0; i < memoryIds.length; i += BATCH_SIZE) {\n const batch = memoryIds.slice(i, i + BATCH_SIZE);\n\n // Delete any fragments for document memories in this batch\n await Promise.all(\n batch.map(async (memoryId) => {\n await this.deleteMemoryFragments(tx, memoryId);\n })\n );\n\n // Delete embeddings for the batch\n await tx.delete(embeddingTable).where(inArray(embeddingTable.memoryId, batch));\n\n // Delete the memories themselves\n await tx.delete(memoryTable).where(inArray(memoryTable.id, batch));\n }\n });\n });\n }\n\n /**\n * Deletes all memory fragments that reference a specific document memory\n * @param tx The database transaction\n * @param documentId The UUID of the document memory whose fragments should be deleted\n * @private\n */\n private async deleteMemoryFragments(tx: DrizzleDatabase, documentId: UUID): Promise<void> {\n const fragmentsToDelete = await this.getMemoryFragments(tx, documentId);\n\n if (fragmentsToDelete.length > 0) {\n const fragmentIds = fragmentsToDelete.map((f) => f.id) as UUID[];\n\n // Delete embeddings for fragments\n await tx.delete(embeddingTable).where(inArray(embeddingTable.memoryId, fragmentIds));\n\n // Delete the fragments\n await tx.delete(memoryTable).where(inArray(memoryTable.id, fragmentIds));\n }\n }\n\n /**\n * Retrieves all memory fragments that reference a specific document memory\n * @param tx The database transaction\n * @param documentId The UUID of the document memory whose fragments should be retrieved\n * @returns An array of memory fragments\n * @private\n */\n private async getMemoryFragments(tx: DrizzleDatabase, documentId: UUID): Promise<{ id: UUID }[]> {\n const fragments = await tx\n .select({ id: memoryTable.id })\n .from(memoryTable)\n .where(\n and(\n eq(memoryTable.agentId, this.agentId),\n sql`${memoryTable.metadata}->>'documentId' = ${documentId}`\n )\n );\n\n return fragments.map((f) => ({ id: f.id as UUID }));\n }\n\n /**\n * Asynchronously deletes all memories from the database based on the provided parameters.\n * @param {UUID[]} roomIds - The IDs of the rooms to delete memories from.\n * @param {string} tableName - The name of the table to delete memories from.\n * @returns {Promise<void>} A Promise that resolves when the memories are deleted.\n */\n async deleteAllMemories(roomIds: UUID[], tableName: string): Promise<void>;\n async deleteAllMemories(roomId: UUID, tableName: string): Promise<void>;\n async deleteAllMemories(roomIdsOrRoomId: UUID[] | UUID, tableName: string): Promise<void> {\n return this.withDatabase(async () => {\n const roomIds = Array.isArray(roomIdsOrRoomId) ? roomIdsOrRoomId : [roomIdsOrRoomId];\n\n if (roomIds.length === 0) {\n return;\n }\n\n await this.db.transaction(async (tx) => {\n // 1) fetch all memory IDs for the requested rooms + table\n const rows = await tx\n .select({ id: memoryTable.id })\n .from(memoryTable)\n .where(\n and(\n inArray(memoryTable.roomId, roomIds),\n eq(memoryTable.type, tableName),\n eq(memoryTable.agentId, this.agentId)\n )\n );\n\n const ids = rows.map((r) => r.id);\n logger.debug(\n { src: \"plugin:sql\", roomIds, tableName, memoryCount: ids.length },\n \"Deleting all memories\"\n );\n\n if (ids.length === 0) {\n return;\n }\n\n // 2) delete any fragments for \"document\" memories & their embeddings\n await Promise.all(\n ids.map(async (memoryId) => {\n await this.deleteMemoryFragments(tx, memoryId);\n await tx.delete(embeddingTable).where(eq(embeddingTable.memoryId, memoryId));\n })\n );\n\n // 3) delete the memories themselves\n await tx\n .delete(memoryTable)\n .where(\n and(\n inArray(memoryTable.roomId, roomIds),\n eq(memoryTable.type, tableName),\n eq(memoryTable.agentId, this.agentId)\n )\n );\n });\n });\n }\n\n /**\n * Count memories using the current object-based adapter contract while preserving\n * the legacy positional signature used by older tests and callers.\n * @returns {Promise<number>} A Promise that resolves to the number of memories.\n */\n async countMemories(params: CountMemoriesParams): Promise<number>;\n async countMemories(roomId: UUID, unique?: boolean, tableName?: string): Promise<number>;\n async countMemories(\n paramsOrRoomId: CountMemoriesParams | UUID,\n unique = true,\n tableName?: string\n ): Promise<number> {\n const params: CountMemoriesParams =\n typeof paramsOrRoomId === \"string\"\n ? {\n roomIds: [paramsOrRoomId],\n unique,\n tableName: tableName ?? \"messages\",\n }\n : {\n ...paramsOrRoomId,\n tableName: paramsOrRoomId.tableName ?? \"messages\",\n unique: paramsOrRoomId.unique ?? false,\n };\n\n return this.withDatabase(async () => {\n const tableName = params.tableName ?? \"messages\";\n const conditions = [eq(memoryTable.type, tableName)];\n\n if (params.roomIds && params.roomIds.length > 0) {\n conditions.push(inArray(memoryTable.roomId, params.roomIds));\n }\n if (params.entityId) {\n conditions.push(eq(memoryTable.entityId, params.entityId));\n }\n if (params.agentId) {\n conditions.push(eq(memoryTable.agentId, params.agentId));\n }\n if (params.unique) {\n conditions.push(eq(memoryTable.unique, true));\n }\n\n const result = await this.db\n .select({ count: sql<number>`count(*)` })\n .from(memoryTable)\n .where(and(...conditions));\n\n const result0 = result[0];\n return Number(result0?.count);\n });\n }\n\n /**\n * Asynchronously retrieves rooms from the database based on the provided parameters.\n * @param {UUID[]} roomIds - The IDs of the rooms to retrieve.\n * @returns {Promise<Room[] | null>} A Promise that resolves to the rooms if found, null otherwise.\n */\n async getRoomsByIds(roomIds: UUID[]): Promise<Room[]> {\n return this.withDatabase(async () => {\n const result = await this.db\n .select({\n id: roomTable.id,\n name: roomTable.name, // Added name\n channelId: roomTable.channelId,\n agentId: roomTable.agentId,\n messageServerId: roomTable.messageServerId,\n worldId: roomTable.worldId,\n type: roomTable.type,\n source: roomTable.source,\n metadata: roomTable.metadata, // Added metadata\n })\n .from(roomTable)\n .where(and(inArray(roomTable.id, roomIds), eq(roomTable.agentId, this.agentId)));\n\n // Map the result to properly typed Room objects\n const rooms = result.map((room) => ({\n ...room,\n id: room.id as UUID,\n name: room.name ?? undefined,\n agentId: room.agentId as UUID,\n messageServerId: room.messageServerId as UUID,\n serverId: room.messageServerId as UUID, // Backward compatibility alias\n worldId: room.worldId as UUID,\n channelId: room.channelId as UUID,\n type: room.type as ChannelType,\n metadata: room.metadata as Metadata,\n }));\n\n return rooms;\n });\n }\n\n /**\n * Asynchronously retrieves all rooms from the database based on the provided parameters.\n * @param {UUID} worldId - The ID of the world to retrieve rooms from.\n * @returns {Promise<Room[]>} A Promise that resolves to an array of rooms.\n */\n async getRoomsByWorld(worldId: UUID): Promise<Room[]> {\n return this.withDatabase(async () => {\n const result = await this.db.select().from(roomTable).where(eq(roomTable.worldId, worldId));\n const rooms = result.map((room) => ({\n ...room,\n id: room.id as UUID,\n name: room.name ?? undefined,\n agentId: room.agentId as UUID,\n messageServerId: room.messageServerId as UUID,\n serverId: room.messageServerId as UUID, // Backward compatibility alias\n worldId: room.worldId as UUID,\n channelId: room.channelId as UUID,\n type: room.type as ChannelType,\n metadata: room.metadata as Metadata,\n }));\n return rooms;\n });\n }\n\n /**\n * Asynchronously updates a room in the database based on the provided parameters.\n * @param {Room} room - The room object to update.\n * @returns {Promise<void>} A Promise that resolves when the room is updated.\n */\n async updateRoom(room: Room): Promise<void> {\n return this.withDatabase(async () => {\n await this.db\n .update(roomTable)\n .set({ ...room, agentId: this.agentId })\n .where(eq(roomTable.id, room.id));\n });\n }\n\n /**\n * Asynchronously creates a new room in the database based on the provided parameters.\n * @param {Room} room - The room object to create.\n * @returns {Promise<UUID>} A Promise that resolves to the ID of the created room.\n */\n async createRooms(rooms: Room[]): Promise<UUID[]> {\n return this.withDatabase(async () => {\n const roomsWithIds = rooms.map((room) => ({\n ...room,\n agentId: this.agentId,\n id: room.id || v4(), // ensure each room has a unique ID\n }));\n\n const insertedRooms = await this.db\n .insert(roomTable)\n .values(roomsWithIds)\n .onConflictDoNothing()\n .returning();\n const insertedIds = insertedRooms.map((r) => r.id as UUID);\n return insertedIds;\n });\n }\n\n /**\n * Asynchronously deletes a room from the database based on the provided parameters.\n * @param {UUID} roomId - The ID of the room to delete.\n * @returns {Promise<void>} A Promise that resolves when the room is deleted.\n */\n async deleteRoom(roomId: UUID): Promise<void> {\n if (!roomId) throw new Error(\"Room ID is required\");\n return this.withDatabase(async () => {\n await this.db.transaction(async (tx) => {\n await tx.delete(roomTable).where(eq(roomTable.id, roomId));\n });\n });\n }\n\n /**\n * Asynchronously retrieves all rooms for a participant from the database based on the provided parameters.\n * @param {UUID} entityId - The ID of the entity to retrieve rooms for.\n * @returns {Promise<UUID[]>} A Promise that resolves to an array of room IDs.\n */\n async getRoomsForParticipant(entityId: UUID): Promise<UUID[]> {\n return this.withDatabase(async () => {\n const result = await this.db\n .select({ roomId: participantTable.roomId })\n .from(participantTable)\n .innerJoin(roomTable, eq(participantTable.roomId, roomTable.id))\n .where(and(eq(participantTable.entityId, entityId), eq(roomTable.agentId, this.agentId)));\n\n return result.map((row) => row.roomId as UUID);\n });\n }\n\n /**\n * Asynchronously retrieves all rooms for a list of participants from the database based on the provided parameters.\n * @param {UUID[]} entityIds - The IDs of the entities to retrieve rooms for.\n * @returns {Promise<UUID[]>} A Promise that resolves to an array of room IDs.\n */\n async getRoomsForParticipants(entityIds: UUID[]): Promise<UUID[]> {\n return this.withDatabase(async () => {\n const result = await this.db\n .selectDistinct({ roomId: participantTable.roomId })\n .from(participantTable)\n .innerJoin(roomTable, eq(participantTable.roomId, roomTable.id))\n .where(\n and(inArray(participantTable.entityId, entityIds), eq(roomTable.agentId, this.agentId))\n );\n\n return result.map((row) => row.roomId as UUID);\n });\n }\n\n /**\n * Asynchronously adds a participant to a room in the database based on the provided parameters.\n * @param {UUID} entityId - The ID of the entity to add to the room.\n * @param {UUID} roomId - The ID of the room to add the entity to.\n * @returns {Promise<boolean>} A Promise that resolves to a boolean indicating whether the participant was added successfully.\n */\n async addParticipant(entityId: UUID, roomId: UUID): Promise<boolean> {\n return this.withDatabase(async () => {\n try {\n const existing = await this.db\n .select({ id: participantTable.id })\n .from(participantTable)\n .where(\n and(\n eq(participantTable.entityId, entityId),\n eq(participantTable.roomId, roomId),\n eq(participantTable.agentId, this.agentId)\n )\n )\n .limit(1);\n if (existing.length === 0) {\n await this.db.insert(participantTable).values({\n entityId,\n roomId,\n agentId: this.agentId,\n });\n }\n return true;\n } catch (error) {\n logger.error(\n {\n src: \"plugin:sql\",\n entityId,\n roomId,\n agentId: this.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n \"Failed to add participant to room\"\n );\n return false;\n }\n });\n }\n\n async addParticipantsRoom(entityIds: UUID[], roomId: UUID): Promise<boolean> {\n return this.withDatabase(async () => {\n try {\n for (const id of entityIds) {\n const existing = await this.db\n .select({ id: participantTable.id })\n .from(participantTable)\n .where(\n and(\n eq(participantTable.entityId, id),\n eq(participantTable.roomId, roomId),\n eq(participantTable.agentId, this.agentId)\n )\n )\n .limit(1);\n if (existing.length === 0) {\n await this.db.insert(participantTable).values({\n entityId: id,\n roomId,\n agentId: this.agentId,\n });\n }\n }\n return true;\n } catch (error) {\n logger.error(\n {\n src: \"plugin:sql\",\n roomId,\n agentId: this.agentId,\n error: error instanceof Error ? error.message : String(error),\n },\n \"Failed to add participants to room\"\n );\n return false;\n }\n });\n }\n\n /**\n * Asynchronously removes a participant from a room in the database based on the provided parameters.\n * @param {UUID} entityId - The ID of the entity to remove from the room.\n * @param {UUID} roomId - The ID of the room to remove the entity from.\n * @returns {Promise<boolean>} A Promise that resolves to a boolean indicating whether the participant was removed successfully.\n */\n async removeParticipant(entityId: UUID, roomId: UUID): Promise<boolean> {\n return this.withDatabase(async () => {\n try {\n const result = await this.db.transaction(async (tx) => {\n return await tx\n .delete(participantTable)\n .where(\n and(eq(participantTable.entityId, entityId), eq(participantTable.roomId, roomId))\n )\n .returning();\n });\n\n const removed = result.length > 0;\n return removed;\n } catch (error) {\n logger.error(\n {\n src: \"plugin:sql\",\n entityId,\n roomId,\n error: error instanceof Error ? error.message : String(error),\n },\n \"Failed to remove participant from room\"\n );\n return false;\n }\n });\n }\n\n /**\n * Asynchronously retrieves all participants for an entity from the database based on the provided parameters.\n * @param {UUID} entityId - The ID of the entity to retrieve participants for.\n * @returns {Promise<Participant[]>} A Promise that resolves to an array of participants.\n */\n async getParticipantsForEntity(entityId: UUID): Promise<Participant[]> {\n return this.withDatabase(async () => {\n const result = await this.db\n .select({\n id: participantTable.id,\n entityId: participantTable.entityId,\n roomId: participantTable.roomId,\n })\n .from(participantTable)\n .where(eq(participantTable.entityId, entityId));\n\n const entities = await this.getEntitiesByIds([entityId]);\n\n if (!entities.length) {\n return [];\n }\n\n return result.map((row) => ({\n id: row.id as UUID,\n entity: entities[0],\n }));\n });\n }\n\n /**\n * Asynchronously retrieves all participants for a room from the database based on the provided parameters.\n * @param {UUID} roomId - The ID of the room to retrieve participants for.\n * @returns {Promise<UUID[]>} A Promise that resolves to an array of entity IDs.\n */\n async getParticipantsForRoom(roomId: UUID): Promise<UUID[]> {\n return this.withDatabase(async () => {\n const result = await this.db\n .select({ entityId: participantTable.entityId })\n .from(participantTable)\n .where(eq(participantTable.roomId, roomId));\n\n return result.map((row) => row.entityId as UUID);\n });\n }\n\n /**\n * Check if an entity is a participant in a specific room/channel.\n * More efficient than getParticipantsForRoom when only checking membership.\n * @param {UUID} roomId - The ID of the room to check.\n * @param {UUID} entityId - The ID of the entity to check.\n * @returns {Promise<boolean>} A Promise that resolves to true if entity is a participant.\n */\n async isRoomParticipant(roomId: UUID, entityId: UUID): Promise<boolean> {\n return this.withDatabase(async () => {\n const result = await this.db\n .select()\n .from(participantTable)\n .where(and(eq(participantTable.roomId, roomId), eq(participantTable.entityId, entityId)))\n .limit(1);\n\n return result.length > 0;\n });\n }\n\n /**\n * Asynchronously retrieves the user state for a participant in a room from the database based on the provided parameters.\n * @param {UUID} roomId - The ID of the room to retrieve the participant's user state for.\n * @param {UUID} entityId - The ID of the entity to retrieve the user state for.\n * @returns {Promise<\"FOLLOWED\" | \"MUTED\" | null>} A Promise that resolves to the participant's user state.\n */\n async getParticipantUserState(\n roomId: UUID,\n entityId: UUID\n ): Promise<\"FOLLOWED\" | \"MUTED\" | null> {\n return this.withDatabase(async () => {\n const result = await this.db\n .select({ roomState: participantTable.roomState })\n .from(participantTable)\n .where(\n and(\n eq(participantTable.roomId, roomId),\n eq(participantTable.entityId, entityId),\n eq(participantTable.agentId, this.agentId)\n )\n )\n .limit(1);\n\n const result0 = result[0];\n return (result0?.roomState as \"FOLLOWED\" | \"MUTED\" | null) ?? null;\n });\n }\n\n /**\n * Asynchronously sets the user state for a participant in a room in the database based on the provided parameters.\n * @param {UUID} roomId - The ID of the room to set the participant's user state for.\n * @param {UUID} entityId - The ID of the entity to set the user state for.\n * @param {string} state - The state to set the participant's user state to.\n * @returns {Promise<void>} A Promise that resolves when the participant's user state is set.\n */\n async setParticipantUserState(\n roomId: UUID,\n entityId: UUID,\n state: \"FOLLOWED\" | \"MUTED\" | null\n ): Promise<void> {\n return this.withDatabase(async () => {\n try {\n await this.db.transaction(async (tx) => {\n await tx\n .update(participantTable)\n .set({ roomState: state })\n .where(\n and(\n eq(participantTable.roomId, roomId),\n eq(participantTable.entityId, entityId),\n eq(participantTable.agentId, this.agentId)\n )\n );\n });\n } catch (error) {\n logger.error(\n {\n src: \"plugin:sql\",\n roomId,\n entityId,\n state,\n error: error instanceof Error ? error.message : String(error),\n },\n \"Failed to set participant follow state\"\n );\n throw error;\n }\n });\n }\n\n /**\n * Asynchronously creates a new relationship in the database based on the provided parameters.\n * @param {Object} params - The parameters for creating a new relationship.\n * @param {UUID} params.sourceEntityId - The ID of the source entity.\n * @param {UUID} params.targetEntityId - The ID of the target entity.\n * @param {string[]} [params.tags] - The tags for the relationship.\n * @param {Object} [params.metadata] - The metadata for the relationship.\n * @returns {Promise<boolean>} A Promise that resolves to a boolean indicating whether the relationship was created successfully.\n */\n async createRelationship(params: {\n sourceEntityId: UUID;\n targetEntityId: UUID;\n tags?: string[];\n metadata?: { [key: string]: unknown };\n }): Promise<boolean> {\n return this.withDatabase(async () => {\n const id = v4();\n const saveParams = {\n id,\n sourceEntityId: params.sourceEntityId,\n targetEntityId: params.targetEntityId,\n agentId: this.agentId,\n tags: params.tags || [],\n metadata: params.metadata || {},\n };\n try {\n const inserted = await this.db\n .insert(relationshipTable)\n .values(saveParams)\n .onConflictDoNothing()\n .returning();\n return inserted.length > 0;\n } catch (error) {\n logger.error(\n {\n src: \"plugin:sql\",\n agentId: this.agentId,\n error: error instanceof Error ? error.message : String(error),\n saveParams,\n },\n \"Error creating relationship\"\n );\n return false;\n }\n });\n }\n\n /**\n * Asynchronously updates an existing relationship in the database based on the provided parameters.\n * @param {Relationship} relationship - The relationship object to update.\n * @returns {Promise<void>} A Promise that resolves when the relationship is updated.\n */\n async updateRelationship(relationship: Relationship): Promise<void> {\n return this.withDatabase(async () => {\n try {\n await this.db\n .update(relationshipTable)\n .set({\n tags: relationship.tags || [],\n metadata: relationship.metadata || {},\n })\n .where(eq(relationshipTable.id, relationship.id));\n } catch (error) {\n logger.error(\n {\n src: \"plugin:sql\",\n agentId: this.agentId,\n error: error instanceof Error ? error.message : String(error),\n relationshipId: relationship.id,\n },\n \"Error updating relationship\"\n );\n throw error;\n }\n });\n }\n\n /**\n * Asynchronously retrieves a relationship from the database based on the provided parameters.\n * @param {Object} params - The parameters for retrieving a relationship.\n * @param {UUID} params.sourceEntityId - The ID of the source entity.\n * @param {UUID} params.targetEntityId - The ID of the target entity.\n * @returns {Promise<Relationship | null>} A Promise that resolves to the relationship if found, null otherwise.\n */\n async getRelationship(params: {\n sourceEntityId: UUID;\n targetEntityId: UUID;\n }): Promise<Relationship | null> {\n return this.withDatabase(async () => {\n const { sourceEntityId, targetEntityId } = params;\n const result = await this.db\n .select()\n .from(relationshipTable)\n .where(\n and(\n eq(relationshipTable.sourceEntityId, sourceEntityId),\n eq(relationshipTable.targetEntityId, targetEntityId)\n )\n );\n if (result.length === 0) return null;\n const relationship = result[0];\n return {\n ...relationship,\n id: relationship.id as UUID,\n sourceEntityId: relationship.sourceEntityId as UUID,\n targetEntityId: relationship.targetEntityId as UUID,\n agentId: relationship.agentId as UUID,\n tags: (relationship.tags ?? []) as string[],\n metadata: (relationship.metadata ?? {}) as Metadata,\n createdAt: relationship.createdAt.toISOString(),\n };\n });\n }\n\n /**\n * Asynchronously retrieves relationships from the database based on the provided parameters.\n * @param {Object} params - The parameters for retrieving relationships.\n * @param {UUID[]} [params.entityIds] - Entity IDs to retrieve relationships for.\n * @param {UUID} [params.entityId] - Legacy single-entity alias.\n * @param {string[]} [params.tags] - The tags to filter relationships by.\n * @returns {Promise<Relationship[]>} A Promise that resolves to an array of relationships.\n */\n async getRelationships(params: {\n entityIds?: UUID[];\n entityId?: UUID;\n tags?: string[];\n limit?: number;\n offset?: number;\n }): Promise<Relationship[]> {\n return this.withDatabase(async () => {\n const { entityIds: rawEntityIds, entityId, tags, limit, offset } = params;\n const entityIds = (\n rawEntityIds && rawEntityIds.length > 0 ? rawEntityIds : entityId ? [entityId] : []\n ).filter((id): id is UUID => typeof id === \"string\" && id.trim().length > 0);\n\n if (entityIds.length === 0) {\n return [];\n }\n\n const entityFilter = sql.join(\n entityIds.map(\n (id) =>\n sql`(${relationshipTable.sourceEntityId} = ${id} OR ${relationshipTable.targetEntityId} = ${id})`\n ),\n sql` OR `\n );\n let query = sql`\n SELECT * FROM ${relationshipTable}\n WHERE (${entityFilter})\n `;\n\n if (tags && tags.length > 0) {\n query = sql`\n ${query}\n AND ${relationshipTable.tags} && CAST(ARRAY[${sql.join(tags, sql`, `)}] AS text[])\n `;\n }\n\n if (typeof limit === \"number\") {\n query = sql`${query} LIMIT ${limit}`;\n }\n\n if (typeof offset === \"number\" && offset > 0) {\n query = sql`${query} OFFSET ${offset}`;\n }\n\n const result = await this.db.execute(query);\n\n return result.rows.map((relationship: Record<string, unknown>) => ({\n ...relationship,\n id: relationship.id as UUID,\n sourceEntityId: (relationship.source_entity_id || relationship.sourceEntityId) as UUID,\n targetEntityId: (relationship.target_entity_id || relationship.targetEntityId) as UUID,\n agentId: (relationship.agent_id || relationship.agentId) as UUID,\n tags: (relationship.tags ?? []) as string[],\n metadata: (relationship.metadata ?? {}) as Metadata,\n createdAt:\n relationship.created_at || relationship.createdAt\n ? (relationship.created_at || relationship.createdAt) instanceof Date\n ? ((relationship.created_at || relationship.createdAt) as Date).toISOString()\n : new Date(\n (relationship.created_at as string) || (relationship.createdAt as string)\n ).toISOString()\n : new Date().toISOString(),\n }));\n });\n }\n\n /**\n * Asynchronously retrieves a cache value from the database based on the provided key.\n * @param {string} key - The key to retrieve the cache value for.\n * @returns {Promise<T | undefined>} A Promise that resolves to the cache value if found, undefined otherwise.\n */\n async getCache<T>(key: string): Promise<T | undefined> {\n return this.withDatabase(async () => {\n try {\n const result = await this.db\n .select({ value: cacheTable.value })\n .from(cacheTable)\n .where(and(eq(cacheTable.agentId, this.agentId), eq(cacheTable.key, key)))\n .limit(1);\n\n if (result && result.length > 0 && result[0]) {\n return result[0].value as T | undefined;\n }\n\n return undefined;\n } catch (error) {\n logger.error(\n {\n src: \"plugin:sql\",\n agentId: this.agentId,\n error: error instanceof Error ? error.message : String(error),\n key,\n },\n \"Error fetching cache\"\n );\n return undefined;\n }\n });\n }\n\n /**\n * Asynchronously sets a cache value in the database based on the provided key and value.\n * @param {string} key - The key to set the cache value for.\n * @param {T} value - The value to set in the cache.\n * @returns {Promise<boolean>} A Promise that resolves to a boolean indicating whether the cache value was set successfully.\n */\n async setCache<T>(key: string, value: T): Promise<boolean> {\n return this.withDatabase(async () => {\n try {\n await this.db\n .insert(cacheTable)\n .values({\n key: key,\n agentId: this.agentId,\n value: value,\n })\n .onConflictDoUpdate({\n target: [cacheTable.key, cacheTable.agentId],\n set: {\n value: value,\n },\n });\n\n return true;\n } catch (error) {\n logger.error(\n {\n src: \"plugin:sql\",\n agentId: this.agentId,\n error: error instanceof Error ? error.message : String(error),\n key,\n },\n \"Error setting cache\"\n );\n return false;\n }\n });\n }\n\n /**\n * Asynchronously deletes a cache value from the database based on the provided key.\n * @param {string} key - The key to delete the cache value for.\n * @returns {Promise<boolean>} A Promise that resolves to a boolean indicating whether the cache value was deleted successfully.\n */\n async deleteCache(key: string): Promise<boolean> {\n return this.withDatabase(async () => {\n try {\n await this.db.transaction(async (tx) => {\n await tx\n .delete(cacheTable)\n .where(and(eq(cacheTable.agentId, this.agentId), eq(cacheTable.key, key)));\n });\n return true;\n } catch (error) {\n logger.error(\n {\n src: \"plugin:sql\",\n agentId: this.agentId,\n error: error instanceof Error ? error.message : String(error),\n key,\n },\n \"Error deleting cache\"\n );\n return false;\n }\n });\n }\n\n /**\n * Asynchronously creates a new world in the database based on the provided parameters.\n * @param {World} world - The world object to create.\n * @returns {Promise<UUID>} A Promise that resolves to the ID of the created world.\n */\n async createWorld(world: World): Promise<UUID> {\n return this.withDatabase(async () => {\n const normalizedWorld = this.normalizeWorldData(world);\n const newWorldId = normalizedWorld.id as UUID;\n\n await this.db.insert(worldTable).values(normalizedWorld);\n return newWorldId;\n });\n }\n\n /**\n * Asynchronously retrieves a world from the database based on the provided parameters.\n * @param {UUID} id - The ID of the world to retrieve.\n * @returns {Promise<World | null>} A Promise that resolves to the world if found, null otherwise.\n */\n async getWorld(id: UUID): Promise<World | null> {\n return this.withDatabase(async () => {\n const result = await this.db.select().from(worldTable).where(eq(worldTable.id, id));\n return result.length > 0 ? this.mapWorldResult(result[0]) : null;\n });\n }\n\n /**\n * Asynchronously retrieves all worlds from the database based on the provided parameters.\n * @returns {Promise<World[]>} A Promise that resolves to an array of worlds.\n */\n async getAllWorlds(): Promise<World[]> {\n return this.withDatabase(async () => {\n const result = await this.db\n .select()\n .from(worldTable)\n .where(eq(worldTable.agentId, this.agentId));\n return result.map((world) => this.mapWorldResult(world));\n });\n }\n\n /**\n * Asynchronously updates an existing world in the database based on the provided parameters.\n * @param {World} world - The world object to update.\n * @returns {Promise<void>} A Promise that resolves when the world is updated.\n */\n async updateWorld(world: World): Promise<void> {\n return this.withDatabase(async () => {\n const normalizedWorld = this.normalizeWorldData(world);\n delete normalizedWorld.id;\n await this.db\n .update(worldTable)\n .set(normalizedWorld)\n .where(and(eq(worldTable.id, world.id), eq(worldTable.agentId, this.agentId)));\n });\n }\n\n /**\n * Asynchronously removes a world from the database based on the provided parameters.\n * @param {UUID} id - The ID of the world to remove.\n * @returns {Promise<void>} A Promise that resolves when the world is removed.\n */\n async removeWorld(id: UUID): Promise<void> {\n return this.withDatabase(async () => {\n await this.db.delete(worldTable).where(eq(worldTable.id, id));\n });\n }\n\n /**\n * Asynchronously creates a new task in the database based on the provided parameters.\n * @param {Task} task - The task object to create.\n * @returns {Promise<UUID>} A Promise that resolves to the ID of the created task.\n */\n async createTask(task: Task): Promise<UUID> {\n // Default worldId to agentId for agent-internal tasks\n if (!task.worldId) {\n task = { ...task, worldId: this.agentId as UUID };\n }\n return this.withRetry(async () => {\n return this.withDatabase(async () => {\n const now = new Date();\n const metadata = task.metadata || {};\n\n const values = {\n // Only include id when provided; otherwise let the DB use its\n // gen_random_uuid() DEFAULT — passing undefined explicitly causes\n // Drizzle to insert NULL which violates the NOT NULL constraint.\n ...(task.id ? { id: task.id as UUID } : {}),\n name: task.name,\n description: task.description,\n roomId: task.roomId as UUID,\n worldId: task.worldId as UUID,\n tags: task.tags,\n metadata: metadata,\n createdAt: now,\n updatedAt: now,\n agentId: this.agentId as UUID,\n };\n\n const result = await this.db.insert(taskTable).values(values).returning();\n\n return result[0].id as UUID;\n });\n });\n }\n\n /**\n * Asynchronously retrieves tasks based on specified parameters.\n * @param params Object containing optional roomId, tags, and entityId to filter tasks\n * @returns Promise resolving to an array of Task objects\n */\n async getTasks(params: {\n roomId?: UUID;\n tags?: string[];\n entityId?: UUID; // Added entityId parameter\n }): Promise<Task[]> {\n return this.withRetry(async () => {\n return this.withDatabase(async () => {\n const result = await this.db\n .select()\n .from(taskTable)\n .where(\n and(\n eq(taskTable.agentId, this.agentId),\n ...(params.roomId ? [eq(taskTable.roomId, params.roomId)] : []),\n ...(params.tags && params.tags.length > 0\n ? [\n sql`${taskTable.tags} @> ARRAY[${sql.join(\n params.tags.map((t) => sql`${t}`),\n sql`, `\n )}]::text[]`,\n ]\n : [])\n )\n );\n\n return result.map((row) => ({\n id: row.id as UUID,\n agentId: row.agentId as UUID,\n name: row.name,\n description: row.description ?? \"\",\n roomId: row.roomId as UUID,\n worldId: row.worldId as UUID,\n tags: row.tags || [],\n metadata: row.metadata as TaskMetadata,\n }));\n });\n });\n }\n\n /**\n * Asynchronously retrieves a specific task by its name.\n * @param name The name of the task to retrieve\n * @returns Promise resolving to the Task object if found, null otherwise\n */\n async getTasksByName(name: string): Promise<Task[]> {\n return this.withRetry(async () => {\n return this.withDatabase(async () => {\n const result = await this.db\n .select()\n .from(taskTable)\n .where(and(eq(taskTable.name, name), eq(taskTable.agentId, this.agentId)));\n\n return result.map((row) => ({\n id: row.id as UUID,\n agentId: row.agentId as UUID,\n name: row.name,\n description: row.description ?? \"\",\n roomId: row.roomId as UUID,\n worldId: row.worldId as UUID,\n tags: row.tags || [],\n metadata: (row.metadata || {}) as TaskMetadata,\n }));\n });\n });\n }\n\n /**\n * Asynchronously retrieves a specific task by its ID.\n * @param id The UUID of the task to retrieve\n * @returns Promise resolving to the Task object if found, null otherwise\n */\n async getTask(id: UUID): Promise<Task | null> {\n return this.withRetry(async () => {\n return this.withDatabase(async () => {\n const result = await this.db\n .select()\n .from(taskTable)\n .where(and(eq(taskTable.id, id), eq(taskTable.agentId, this.agentId)))\n .limit(1);\n\n if (result.length === 0) {\n return null;\n }\n\n const row = result[0];\n return {\n id: row.id as UUID,\n agentId: row.agentId as UUID,\n name: row.name,\n description: row.description ?? \"\",\n roomId: row.roomId as UUID,\n worldId: row.worldId as UUID,\n tags: row.tags || [],\n metadata: (row.metadata || {}) as TaskMetadata,\n };\n });\n });\n }\n\n /**\n * Asynchronously updates an existing task in the database.\n * @param id The UUID of the task to update\n * @param task Partial Task object containing the fields to update\n * @returns Promise resolving when the update is complete\n */\n async updateTask(id: UUID, task: Partial<Task>): Promise<void> {\n await this.withRetry(async () => {\n await this.withDatabase(async () => {\n const updateValues: Partial<typeof taskTable.$inferInsert> = {};\n\n // Add fields to update if they exist in the partial task object\n if (task.name !== undefined) updateValues.name = task.name;\n if (task.description !== undefined) updateValues.description = task.description;\n if (task.roomId !== undefined) updateValues.roomId = task.roomId;\n if (task.worldId !== undefined) updateValues.worldId = task.worldId;\n if (task.tags !== undefined) updateValues.tags = task.tags;\n if (task.metadata !== undefined)\n updateValues.metadata = task.metadata as typeof taskTable.$inferInsert.metadata;\n // Handle createdAt if present in the task object (using type assertion for compatibility)\n const taskWithCreatedAt = task as {\n createdAt?: number | bigint | null;\n };\n if (taskWithCreatedAt.createdAt !== undefined && taskWithCreatedAt.createdAt !== null) {\n const createdAtValue = taskWithCreatedAt.createdAt;\n updateValues.createdAt = new Date(\n typeof createdAtValue === \"bigint\" ? Number(createdAtValue) : createdAtValue\n );\n }\n\n // Always update the updatedAt timestamp as a Date (schema uses Date, not number)\n const dbUpdateValues: Partial<typeof taskTable.$inferInsert> = {\n ...updateValues,\n updatedAt: new Date(),\n };\n\n // Handle metadata updates - just set it directly without merging\n if (task.metadata !== undefined) {\n dbUpdateValues.metadata = task.metadata;\n }\n\n await this.db\n .update(taskTable)\n // createdAt is hella borked, number / Date\n .set(dbUpdateValues)\n .where(and(eq(taskTable.id, id), eq(taskTable.agentId, this.agentId)));\n });\n });\n }\n\n /**\n * Asynchronously deletes a task from the database.\n * @param id The UUID of the task to delete\n * @returns Promise resolving when the deletion is complete\n */\n async deleteTask(id: UUID): Promise<void> {\n return this.withDatabase(async () => {\n await this.db.delete(taskTable).where(eq(taskTable.id, id));\n });\n }\n\n async getMemoriesByWorldId(params: {\n worldId: UUID;\n count?: number;\n tableName?: string;\n }): Promise<Memory[]> {\n return this.withDatabase(async () => {\n // First, get all rooms for the given worldId\n const rooms = await this.db\n .select({ id: roomTable.id })\n .from(roomTable)\n .where(and(eq(roomTable.worldId, params.worldId), eq(roomTable.agentId, this.agentId)));\n\n if (rooms.length === 0) {\n return [];\n }\n\n const roomIds = rooms.map((room) => room.id as UUID);\n\n const memories = await this.getMemoriesByRoomIds({\n roomIds,\n tableName: params.tableName || \"messages\",\n limit: params.count,\n });\n\n return memories;\n });\n }\n\n async getMemoriesByServerId(params: {\n serverId: UUID;\n count?: number;\n tableName?: string;\n }): Promise<Memory[]> {\n return this.withDatabase(async () => {\n const rooms = await this.db\n .select({ id: roomTable.id })\n .from(roomTable)\n .where(\n and(eq(roomTable.messageServerId, params.serverId), eq(roomTable.agentId, this.agentId))\n );\n\n if (rooms.length === 0) {\n return [];\n }\n\n return this.getMemoriesByRoomIds({\n roomIds: rooms.map((room) => room.id as UUID),\n tableName: params.tableName || \"messages\",\n limit: params.count,\n });\n });\n }\n\n async deleteRoomsByWorldId(worldId: UUID): Promise<void> {\n return this.withDatabase(async () => {\n const rooms = await this.db\n .select({ id: roomTable.id })\n .from(roomTable)\n .where(and(eq(roomTable.worldId, worldId), eq(roomTable.agentId, this.agentId)));\n\n if (rooms.length === 0) {\n return;\n }\n\n const roomIds = rooms.map((room) => room.id as UUID);\n\n if (roomIds.length > 0) {\n await this.db.delete(logTable).where(inArray(logTable.roomId, roomIds));\n await this.db.delete(participantTable).where(inArray(participantTable.roomId, roomIds));\n\n const memoriesInRooms = await this.db\n .select({ id: memoryTable.id })\n .from(memoryTable)\n .where(inArray(memoryTable.roomId, roomIds));\n const memoryIdsInRooms = memoriesInRooms.map((m) => m.id as UUID);\n\n if (memoryIdsInRooms.length > 0) {\n await this.db\n .delete(embeddingTable)\n .where(inArray(embeddingTable.memoryId, memoryIdsInRooms));\n await this.db.delete(memoryTable).where(inArray(memoryTable.id, memoryIdsInRooms));\n }\n\n await this.db.delete(roomTable).where(inArray(roomTable.id, roomIds));\n\n logger.debug(\n {\n src: \"plugin:sql\",\n worldId,\n roomsDeleted: roomIds.length,\n memoriesDeleted: memoryIdsInRooms.length,\n },\n \"World cleanup completed\"\n );\n }\n });\n }\n\n // Message Server Database Operations\n\n /**\n * Creates a new message server in the central database\n */\n async createMessageServer(data: {\n id?: UUID; // Allow passing a specific ID\n name: string;\n sourceType: string;\n sourceId?: string;\n metadata?: Metadata;\n }): Promise<{\n id: UUID;\n name: string;\n sourceType: string;\n sourceId?: string;\n metadata?: Metadata;\n createdAt: Date;\n updatedAt: Date;\n }> {\n return this.withDatabase(async () => {\n const newId = data.id || (v4() as UUID);\n const now = new Date();\n const serverToInsert = {\n id: newId,\n name: data.name,\n sourceType: data.sourceType,\n sourceId: data.sourceId,\n metadata: data.metadata,\n createdAt: now,\n updatedAt: now,\n };\n\n await this.db.insert(messageServerTable).values(serverToInsert).onConflictDoNothing(); // In case the ID already exists\n\n // If server already existed, fetch it\n if (data.id) {\n const existing = await this.db\n .select()\n .from(messageServerTable)\n .where(eq(messageServerTable.id, data.id))\n .limit(1);\n if (existing.length > 0) {\n return {\n id: existing[0].id as UUID,\n name: existing[0].name,\n sourceType: existing[0].sourceType,\n sourceId: existing[0].sourceId || undefined,\n metadata: (existing[0].metadata || undefined) as Metadata | undefined,\n createdAt: existing[0].createdAt,\n updatedAt: existing[0].updatedAt,\n };\n }\n }\n\n return serverToInsert;\n });\n }\n\n /**\n * Gets all message servers\n */\n async getMessageServers(): Promise<\n Array<{\n id: UUID;\n name: string;\n sourceType: string;\n sourceId?: string;\n metadata?: Metadata;\n createdAt: Date;\n updatedAt: Date;\n }>\n > {\n const result = await this.withDatabase(async () => {\n const results = await this.db.select().from(messageServerTable);\n return results.map((r) => ({\n id: r.id as UUID,\n name: r.name,\n sourceType: r.sourceType,\n sourceId: r.sourceId || undefined,\n metadata: (r.metadata || undefined) as Metadata | undefined,\n createdAt: r.createdAt,\n updatedAt: r.updatedAt,\n }));\n });\n // Guard against null return\n return result || [];\n }\n\n /**\n * Gets a message server by ID\n */\n async getMessageServerById(serverId: UUID): Promise<{\n id: UUID;\n name: string;\n sourceType: string;\n sourceId?: string;\n metadata?: Metadata;\n createdAt: Date;\n updatedAt: Date;\n } | null> {\n return this.withDatabase(async () => {\n const results = await this.db\n .select()\n .from(messageServerTable)\n .where(eq(messageServerTable.id, serverId))\n .limit(1);\n return results.length > 0\n ? {\n id: results[0].id as UUID,\n name: results[0].name,\n sourceType: results[0].sourceType,\n sourceId: results[0].sourceId || undefined,\n metadata: (results[0].metadata || undefined) as Metadata | undefined,\n createdAt: results[0].createdAt,\n updatedAt: results[0].updatedAt,\n }\n : null;\n });\n }\n\n /**\n * Gets a message server by RLS server_id.\n * The server_id column is added dynamically when RLS is enabled.\n */\n async getMessageServerByRlsServerId(rlsServerId: UUID): Promise<{\n id: UUID;\n name: string;\n sourceType: string;\n sourceId?: string;\n metadata?: Metadata;\n createdAt: Date;\n updatedAt: Date;\n } | null> {\n return this.withDatabase(async () => {\n // Use raw SQL since server_id column is dynamically added by RLS and not in Drizzle schema\n const results = await this.db.execute(sql`\n SELECT id, name, source_type, source_id, metadata, created_at, updated_at\n FROM message_servers\n WHERE server_id = ${rlsServerId}\n LIMIT 1\n `);\n\n const rows = results.rows || results;\n return (rows as Record<string, unknown>[]).length > 0\n ? {\n id: (rows as Record<string, unknown>[])[0].id as UUID,\n name: (rows as Record<string, unknown>[])[0].name as string,\n sourceType: (rows as Record<string, unknown>[])[0].source_type as string,\n sourceId: ((rows as Record<string, unknown>[])[0].source_id || undefined) as\n | string\n | undefined,\n metadata: ((rows as Record<string, unknown>[])[0].metadata || undefined) as\n | Metadata\n | undefined,\n createdAt: new Date((rows as Record<string, unknown>[])[0].created_at as string),\n updatedAt: new Date((rows as Record<string, unknown>[])[0].updated_at as string),\n }\n : null;\n });\n }\n\n /**\n * Creates a new channel\n */\n async createChannel(\n data: {\n id?: UUID; // Allow passing a specific ID\n messageServerId: UUID;\n name: string;\n type: string;\n sourceType?: string;\n sourceId?: string;\n topic?: string;\n metadata?: Metadata;\n },\n participantIds?: UUID[]\n ): Promise<{\n id: UUID;\n messageServerId: UUID;\n name: string;\n type: string;\n sourceType?: string;\n sourceId?: string;\n topic?: string;\n metadata?: Metadata;\n createdAt: Date;\n updatedAt: Date;\n }> {\n return this.withDatabase(async () => {\n const newId = data.id || (v4() as UUID);\n const now = new Date();\n const channelToInsert = {\n id: newId,\n messageServerId: data.messageServerId,\n name: data.name,\n type: data.type,\n sourceType: data.sourceType,\n sourceId: data.sourceId,\n topic: data.topic,\n metadata: data.metadata,\n createdAt: now,\n updatedAt: now,\n };\n\n await this.db.transaction(async (tx) => {\n await tx.insert(channelTable).values(channelToInsert);\n\n if (participantIds && participantIds.length > 0) {\n const participantValues = participantIds.map((entityId) => ({\n channelId: newId,\n entityId: entityId,\n }));\n await tx.insert(channelParticipantsTable).values(participantValues).onConflictDoNothing();\n }\n });\n\n return channelToInsert;\n });\n }\n\n /**\n * Gets channels for a message server\n */\n async getChannelsForMessageServer(messageServerId: UUID): Promise<\n Array<{\n id: UUID;\n messageServerId: UUID;\n name: string;\n type: string;\n sourceType?: string;\n sourceId?: string;\n topic?: string;\n metadata?: Metadata;\n createdAt: Date;\n updatedAt: Date;\n }>\n > {\n return this.withDatabase(async () => {\n const results = await this.db\n .select()\n .from(channelTable)\n .where(eq(channelTable.messageServerId, messageServerId));\n return results.map((r) => ({\n id: r.id as UUID,\n messageServerId: r.messageServerId as UUID,\n name: r.name,\n type: r.type,\n sourceType: r.sourceType || undefined,\n sourceId: r.sourceId || undefined,\n topic: r.topic || undefined,\n metadata: (r.metadata || undefined) as Metadata | undefined,\n createdAt: r.createdAt,\n updatedAt: r.updatedAt,\n }));\n });\n }\n\n /**\n * Gets channel details\n */\n async getChannelDetails(channelId: UUID): Promise<{\n id: UUID;\n messageServerId: UUID;\n name: string;\n type: string;\n sourceType?: string;\n sourceId?: string;\n topic?: string;\n metadata?: Metadata;\n createdAt: Date;\n updatedAt: Date;\n } | null> {\n return this.withDatabase(async () => {\n const results = await this.db\n .select()\n .from(channelTable)\n .where(eq(channelTable.id, channelId))\n .limit(1);\n return results.length > 0\n ? {\n id: results[0].id as UUID,\n messageServerId: results[0].messageServerId as UUID,\n name: results[0].name,\n type: results[0].type,\n sourceType: results[0].sourceType || undefined,\n sourceId: results[0].sourceId || undefined,\n topic: results[0].topic || undefined,\n metadata: (results[0].metadata || undefined) as Metadata | undefined,\n createdAt: results[0].createdAt,\n updatedAt: results[0].updatedAt,\n }\n : null;\n });\n }\n\n /**\n * Creates a message\n */\n async createMessage(data: {\n channelId: UUID;\n authorId: UUID;\n content: string;\n rawMessage?: Record<string, unknown>;\n sourceType?: string;\n sourceId?: string;\n metadata?: Metadata;\n inReplyToRootMessageId?: UUID;\n messageId?: UUID;\n }): Promise<{\n id: UUID;\n channelId: UUID;\n authorId: UUID;\n content: string;\n rawMessage?: Record<string, unknown>;\n sourceType?: string;\n sourceId?: string;\n metadata?: Metadata;\n inReplyToRootMessageId?: UUID;\n createdAt: Date;\n updatedAt: Date;\n }> {\n return this.withDatabase(async () => {\n const newId = data.messageId || (v4() as UUID);\n const now = new Date();\n const messageToInsert = {\n id: newId,\n channelId: data.channelId,\n authorId: data.authorId,\n content: data.content,\n rawMessage: data.rawMessage,\n sourceType: data.sourceType,\n sourceId: data.sourceId,\n metadata: data.metadata,\n inReplyToRootMessageId: data.inReplyToRootMessageId,\n createdAt: now,\n updatedAt: now,\n };\n\n await this.db.insert(messageTable).values(messageToInsert);\n return messageToInsert;\n });\n }\n\n async getMessageById(id: UUID): Promise<{\n id: UUID;\n channelId: UUID;\n authorId: UUID;\n content: string;\n rawMessage?: Record<string, unknown>;\n sourceType?: string;\n sourceId?: string;\n metadata?: Metadata;\n inReplyToRootMessageId?: UUID;\n createdAt: Date;\n updatedAt: Date;\n } | null> {\n return this.withDatabase(async () => {\n const rows = await this.db\n .select()\n .from(messageTable)\n .where(eq(messageTable.id, id))\n .limit(1);\n if (!rows || rows.length === 0) return null;\n const row = rows[0];\n return {\n id: row.id as UUID,\n channelId: row.channelId as UUID,\n authorId: row.authorId as UUID,\n content: row.content,\n rawMessage: asRawMessage(row.rawMessage),\n sourceType: row.sourceType || undefined,\n sourceId: row.sourceId || undefined,\n metadata: (row.metadata || undefined) as Metadata | undefined,\n inReplyToRootMessageId: (row.inReplyToRootMessageId || undefined) as UUID | undefined,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n });\n }\n\n async updateMessage(\n id: UUID,\n patch: {\n content?: string;\n rawMessage?: Record<string, unknown>;\n sourceType?: string;\n sourceId?: string;\n metadata?: Metadata;\n inReplyToRootMessageId?: UUID;\n }\n ): Promise<{\n id: UUID;\n channelId: UUID;\n authorId: UUID;\n content: string;\n rawMessage?: Record<string, unknown>;\n sourceType?: string;\n sourceId?: string;\n metadata?: Metadata;\n inReplyToRootMessageId?: UUID;\n createdAt: Date;\n updatedAt: Date;\n } | null> {\n return this.withDatabase(async () => {\n const existing = await this.getMessageById(id);\n if (!existing) return null;\n\n const updatedAt = new Date();\n const next = {\n content: patch.content ?? existing.content,\n rawMessage: patch.rawMessage ?? existing.rawMessage,\n sourceType: patch.sourceType ?? existing.sourceType,\n sourceId: patch.sourceId ?? existing.sourceId,\n metadata: patch.metadata ?? existing.metadata,\n inReplyToRootMessageId: patch.inReplyToRootMessageId ?? existing.inReplyToRootMessageId,\n updatedAt,\n };\n\n await this.db.update(messageTable).set(next).where(eq(messageTable.id, id));\n\n // Return merged object\n return {\n ...existing,\n ...next,\n };\n });\n }\n\n /**\n * Gets messages for a channel\n */\n async getMessagesForChannel(\n channelId: UUID,\n limit: number = 50,\n beforeTimestamp?: Date\n ): Promise<\n Array<{\n id: UUID;\n channelId: UUID;\n authorId: UUID;\n content: string;\n rawMessage?: Record<string, unknown>;\n sourceType?: string;\n sourceId?: string;\n metadata?: Metadata;\n inReplyToRootMessageId?: UUID;\n createdAt: Date;\n updatedAt: Date;\n }>\n > {\n return this.withDatabase(async () => {\n const conditions = [eq(messageTable.channelId, channelId)];\n if (beforeTimestamp) {\n conditions.push(lt(messageTable.createdAt, beforeTimestamp));\n }\n\n const query = this.db\n .select()\n .from(messageTable)\n .where(and(...conditions))\n .orderBy(desc(messageTable.createdAt))\n .limit(limit);\n\n const results = await query;\n return results.map((r) => ({\n id: r.id as UUID,\n channelId: r.channelId as UUID,\n authorId: r.authorId as UUID,\n content: r.content,\n rawMessage: asRawMessage(r.rawMessage),\n sourceType: r.sourceType || undefined,\n sourceId: r.sourceId || undefined,\n metadata: asMetadata(r.metadata),\n inReplyToRootMessageId: r.inReplyToRootMessageId as UUID | undefined,\n createdAt: r.createdAt,\n updatedAt: r.updatedAt,\n }));\n });\n }\n\n /**\n * Deletes a message\n */\n async deleteMessage(messageId: UUID): Promise<void> {\n return this.withDatabase(async () => {\n await this.db.delete(messageTable).where(eq(messageTable.id, messageId));\n });\n }\n\n /**\n * Updates a channel\n */\n async updateChannel(\n channelId: UUID,\n updates: {\n name?: string;\n participantCentralUserIds?: UUID[];\n metadata?: Metadata;\n }\n ): Promise<{\n id: UUID;\n messageServerId: UUID;\n name: string;\n type: string;\n sourceType?: string;\n sourceId?: string;\n topic?: string;\n metadata?: Metadata;\n createdAt: Date;\n updatedAt: Date;\n }> {\n return this.withDatabase(async () => {\n const now = new Date();\n\n await this.db.transaction(async (tx) => {\n // Update channel details\n const updateData: Record<string, unknown> = { updatedAt: now };\n if (updates.name !== undefined) updateData.name = updates.name;\n if (updates.metadata !== undefined) updateData.metadata = updates.metadata;\n\n await tx.update(channelTable).set(updateData).where(eq(channelTable.id, channelId));\n\n // Update participants if provided\n if (updates.participantCentralUserIds !== undefined) {\n // Remove existing participants\n await tx\n .delete(channelParticipantsTable)\n .where(eq(channelParticipantsTable.channelId, channelId));\n\n // Add new participants\n if (updates.participantCentralUserIds.length > 0) {\n const participantValues = updates.participantCentralUserIds.map((entityId) => ({\n channelId: channelId,\n entityId: entityId,\n }));\n await tx\n .insert(channelParticipantsTable)\n .values(participantValues)\n .onConflictDoNothing();\n }\n }\n });\n\n // Return updated channel details\n const updatedChannel = await this.getChannelDetails(channelId);\n if (!updatedChannel) {\n throw new Error(`Channel ${channelId} not found after update`);\n }\n return updatedChannel;\n });\n }\n\n /**\n * Deletes a channel and all its associated data\n */\n async deleteChannel(channelId: UUID): Promise<void> {\n return this.withDatabase(async () => {\n await this.db.transaction(async (tx) => {\n // Delete all messages in the channel (cascade delete will handle this, but explicit is better)\n await tx.delete(messageTable).where(eq(messageTable.channelId, channelId));\n\n // Delete all participants (cascade delete will handle this, but explicit is better)\n await tx\n .delete(channelParticipantsTable)\n .where(eq(channelParticipantsTable.channelId, channelId));\n\n // Delete the channel itself\n await tx.delete(channelTable).where(eq(channelTable.id, channelId));\n });\n });\n }\n\n /**\n * Adds participants to a channel\n */\n async addChannelParticipants(channelId: UUID, entityIds: UUID[]): Promise<void> {\n return this.withDatabase(async () => {\n if (!entityIds || entityIds.length === 0) return;\n\n const participantValues = entityIds.map((entityId) => ({\n channelId: channelId,\n entityId: entityId,\n }));\n\n await this.db\n .insert(channelParticipantsTable)\n .values(participantValues)\n .onConflictDoNothing();\n });\n }\n\n /**\n * Gets participants for a channel\n */\n async getChannelParticipants(channelId: UUID): Promise<UUID[]> {\n return this.withDatabase(async () => {\n const results = await this.db\n .select({ entityId: channelParticipantsTable.entityId })\n .from(channelParticipantsTable)\n .where(eq(channelParticipantsTable.channelId, channelId));\n\n return results.map((r) => r.entityId as UUID);\n });\n }\n\n /**\n * Check if an entity is a participant in a specific messaging channel.\n * @param {UUID} channelId - The ID of the channel to check.\n * @param {UUID} entityId - The ID of the entity to check.\n * @returns {Promise<boolean>} A Promise that resolves to true if entity is a participant.\n */\n async isChannelParticipant(channelId: UUID, entityId: UUID): Promise<boolean> {\n return this.withDatabase(async () => {\n const result = await this.db\n .select()\n .from(channelParticipantsTable)\n .where(\n and(\n eq(channelParticipantsTable.channelId, channelId),\n eq(channelParticipantsTable.entityId, entityId)\n )\n )\n .limit(1);\n\n return result.length > 0;\n });\n }\n\n /**\n * Adds an agent to a message server (Discord/Telegram server)\n */\n async addAgentToMessageServer(messageServerId: UUID, agentId: UUID): Promise<void> {\n return this.withDatabase(async () => {\n await this.db\n .insert(messageServerAgentsTable)\n .values({\n messageServerId,\n agentId,\n })\n .onConflictDoNothing();\n });\n }\n\n /**\n * Gets agents for a message server (Discord/Telegram server)\n */\n async getAgentsForMessageServer(messageServerId: UUID): Promise<UUID[]> {\n return this.withDatabase(async () => {\n const results = await this.db\n .select({ agentId: messageServerAgentsTable.agentId })\n .from(messageServerAgentsTable)\n .where(eq(messageServerAgentsTable.messageServerId, messageServerId));\n\n return results.map((r) => r.agentId as UUID);\n });\n }\n\n /**\n * Removes an agent from a message server (Discord/Telegram server)\n */\n async removeAgentFromMessageServer(messageServerId: UUID, agentId: UUID): Promise<void> {\n return this.withDatabase(async () => {\n await this.db\n .delete(messageServerAgentsTable)\n .where(\n and(\n eq(messageServerAgentsTable.messageServerId, messageServerId),\n eq(messageServerAgentsTable.agentId, agentId)\n )\n );\n });\n }\n\n /**\n * Finds or creates a DM channel between two users\n */\n async findOrCreateDmChannel(\n user1Id: UUID,\n user2Id: UUID,\n messageServerId: UUID\n ): Promise<{\n id: UUID;\n messageServerId: UUID;\n name: string;\n type: string;\n sourceType?: string;\n sourceId?: string;\n topic?: string;\n metadata?: Metadata;\n createdAt: Date;\n updatedAt: Date;\n }> {\n return this.withDatabase(async () => {\n const ids = [user1Id, user2Id].sort();\n const dmChannelName = `DM-${ids[0]}-${ids[1]}`;\n\n const existingChannels = await this.db\n .select()\n .from(channelTable)\n .where(\n and(\n eq(channelTable.type, ChannelType.DM),\n eq(channelTable.name, dmChannelName),\n eq(channelTable.messageServerId, messageServerId)\n )\n )\n .limit(1);\n\n if (existingChannels.length > 0) {\n return {\n id: existingChannels[0].id as UUID,\n messageServerId: existingChannels[0].messageServerId as UUID,\n name: existingChannels[0].name,\n type: existingChannels[0].type,\n sourceType: existingChannels[0].sourceType || undefined,\n sourceId: existingChannels[0].sourceId || undefined,\n topic: existingChannels[0].topic || undefined,\n metadata: (existingChannels[0].metadata || undefined) as Metadata | undefined,\n createdAt: existingChannels[0].createdAt,\n updatedAt: existingChannels[0].updatedAt,\n };\n }\n\n // Create new DM channel\n return this.createChannel(\n {\n messageServerId,\n name: dmChannelName,\n type: ChannelType.DM,\n metadata: { user1: ids[0], user2: ids[1] },\n },\n ids\n );\n });\n }\n\n // ===============================\n // Pairing Methods\n // ===============================\n\n /**\n * Get all pending pairing requests for a channel and agent.\n */\n async getPairingRequests(\n queries: Array<{ channel: PairingChannel; agentId: UUID }>\n ): Promise<PairingRequestsResult> {\n return this.withDatabase(async () => {\n if (queries.length === 0) {\n return [];\n }\n\n return Promise.all(\n queries.map(async ({ channel, agentId }) => {\n const results = await this.db\n .select()\n .from(pairingRequestTable)\n .where(\n and(\n eq(pairingRequestTable.channel, channel),\n eq(pairingRequestTable.agentId, agentId)\n )\n )\n .orderBy(pairingRequestTable.createdAt);\n\n return {\n channel,\n agentId,\n requests: results.map((row) => ({\n id: row.id as UUID,\n channel: row.channel as PairingChannel,\n senderId: row.senderId,\n code: row.code,\n createdAt: row.createdAt,\n lastSeenAt: row.lastSeenAt,\n metadata: (row.metadata as Record<string, string>) || undefined,\n agentId: row.agentId as UUID,\n })),\n };\n })\n );\n });\n }\n\n /**\n * Create a new pairing request.\n */\n async createPairingRequest(request: PairingRequest): Promise<UUID> {\n return this.withDatabase(async () => {\n const id = request.id || (v4() as UUID);\n await this.db.insert(pairingRequestTable).values({\n id,\n channel: request.channel,\n senderId: request.senderId,\n code: request.code,\n createdAt: request.createdAt,\n lastSeenAt: request.lastSeenAt,\n metadata: request.metadata || {},\n agentId: request.agentId,\n });\n return id;\n });\n }\n\n /**\n * Update an existing pairing request.\n */\n async updatePairingRequest(request: PairingRequest): Promise<void> {\n return this.withDatabase(async () => {\n await this.db\n .update(pairingRequestTable)\n .set({\n lastSeenAt: request.lastSeenAt,\n metadata: request.metadata || {},\n })\n .where(eq(pairingRequestTable.id, request.id));\n });\n }\n\n /**\n * Delete a pairing request by ID.\n */\n async deletePairingRequest(id: UUID): Promise<void> {\n return this.withDatabase(async () => {\n await this.db.delete(pairingRequestTable).where(eq(pairingRequestTable.id, id));\n });\n }\n\n /**\n * Get the allowlist for a channel and agent.\n */\n async getPairingAllowlist(\n channel: PairingChannel,\n agentId: UUID\n ): Promise<PairingAllowlistEntry[]> {\n return this.withDatabase(async () => {\n const results = await this.db\n .select()\n .from(pairingAllowlistTable)\n .where(\n and(\n eq(pairingAllowlistTable.channel, channel),\n eq(pairingAllowlistTable.agentId, agentId)\n )\n )\n .orderBy(pairingAllowlistTable.createdAt);\n\n return results.map((row) => ({\n id: row.id as UUID,\n channel: row.channel as PairingChannel,\n senderId: row.senderId,\n createdAt: row.createdAt,\n metadata: (row.metadata as Record<string, string>) || undefined,\n agentId: row.agentId as UUID,\n }));\n });\n }\n\n /**\n * Create a new allowlist entry.\n */\n async createPairingAllowlistEntry(entry: PairingAllowlistEntry): Promise<UUID> {\n return this.withDatabase(async () => {\n const id = entry.id || (v4() as UUID);\n await this.db\n .insert(pairingAllowlistTable)\n .values({\n id,\n channel: entry.channel,\n senderId: entry.senderId,\n createdAt: entry.createdAt,\n metadata: entry.metadata || {},\n agentId: entry.agentId,\n })\n .onConflictDoNothing();\n return id;\n });\n }\n\n /**\n * Delete an allowlist entry by ID.\n */\n async deletePairingAllowlistEntry(id: UUID): Promise<void> {\n return this.withDatabase(async () => {\n await this.db.delete(pairingAllowlistTable).where(eq(pairingAllowlistTable.id, id));\n });\n }\n\n // ── Lifecycle methods ─────────────────────────────────────────────────\n\n async isReady(): Promise<boolean> {\n try {\n await this.db.execute(sql`SELECT 1`);\n return true;\n } catch {\n return false;\n }\n }\n\n async getConnection(): Promise<DrizzleDatabase> {\n return this.db;\n }\n\n async transaction<T>(\n callback: (tx: IDatabaseAdapter<DrizzleDatabase>) => Promise<T>,\n _options?: { entityContext?: UUID }\n ): Promise<T> {\n // Delegate to the callback with this adapter as the transaction context.\n // True DB-level transactions are handled by drizzle's this.db.transaction() in individual methods.\n return callback(this as IDatabaseAdapter<DrizzleDatabase>);\n }\n\n // ── Component batch methods ───────────────────────────────────────────\n\n async getComponentsByNaturalKeys(\n keys: Array<{\n entityId: UUID;\n type: string;\n worldId?: UUID;\n sourceEntityId?: UUID;\n }>\n ): Promise<(Component | null)[]> {\n if (keys.length === 0) return [];\n const results: (Component | null)[] = [];\n for (const key of keys) {\n const component = await this.getComponent(\n key.entityId,\n key.type,\n key.worldId,\n key.sourceEntityId\n );\n results.push(component);\n }\n return results;\n }\n\n async getComponentsForEntities(\n entityIds: UUID[],\n worldId?: UUID,\n sourceEntityId?: UUID\n ): Promise<Component[]> {\n if (entityIds.length === 0) return [];\n return this.withDatabase(async () => {\n const conditions: SQL[] = [inArray(componentTable.entityId, entityIds)];\n if (worldId) {\n conditions.push(eq(componentTable.worldId, worldId));\n }\n if (sourceEntityId) {\n conditions.push(eq(componentTable.sourceEntityId, sourceEntityId));\n }\n const result = await this.db\n .select()\n .from(componentTable)\n .where(and(...conditions));\n return result.map((component) => ({\n ...component,\n id: component.id as UUID,\n entityId: component.entityId as UUID,\n agentId: component.agentId as UUID,\n roomId: component.roomId as UUID,\n worldId: (component.worldId ?? \"\") as UUID,\n sourceEntityId: (component.sourceEntityId ?? \"\") as UUID,\n data: component.data as Metadata,\n createdAt: component.createdAt.getTime(),\n }));\n });\n }\n\n async createComponents(components: Component[]): Promise<UUID[]> {\n if (components.length === 0) return [];\n return this.withDatabase(async () => {\n const ids: UUID[] = [];\n for (const component of components) {\n const success = await this.createComponent(component);\n if (success) ids.push(component.id);\n }\n return ids;\n });\n }\n\n async getComponentsByIds(componentIds: UUID[]): Promise<Component[]> {\n if (componentIds.length === 0) return [];\n return this.withDatabase(async () => {\n const result = await this.db\n .select()\n .from(componentTable)\n .where(inArray(componentTable.id, componentIds));\n return result.map((component) => ({\n ...component,\n id: component.id as UUID,\n entityId: component.entityId as UUID,\n agentId: component.agentId as UUID,\n roomId: component.roomId as UUID,\n worldId: (component.worldId ?? \"\") as UUID,\n sourceEntityId: (component.sourceEntityId ?? \"\") as UUID,\n data: component.data as Metadata,\n createdAt: component.createdAt.getTime(),\n }));\n });\n }\n\n async updateComponents(components: Component[]): Promise<void> {\n for (const component of components) {\n await this.updateComponent(component);\n }\n }\n\n async deleteComponents(componentIds: UUID[]): Promise<void> {\n if (componentIds.length === 0) return;\n return this.withDatabase(async () => {\n await this.db.delete(componentTable).where(inArray(componentTable.id, componentIds));\n });\n }\n\n async upsertComponents(\n components: Component[],\n _options?: { entityContext?: UUID }\n ): Promise<void> {\n for (const component of components) {\n const existing = await this.getComponent(\n component.entityId,\n component.type,\n component.worldId,\n component.sourceEntityId\n );\n if (existing) {\n await this.updateComponent({ ...component, id: existing.id });\n } else {\n await this.createComponent(component);\n }\n }\n }\n\n async patchComponents(\n updates: Array<{ componentId: UUID; ops: PatchOp[] }>,\n _options?: { entityContext?: UUID }\n ): Promise<void> {\n for (const update of updates) {\n const rows = await this.withDatabase(async () =>\n this.db.select().from(componentTable).where(eq(componentTable.id, update.componentId))\n );\n const row = rows[0];\n if (!row) continue;\n\n const data = { ...((row.data ?? {}) as Record<string, unknown>) };\n for (const op of update.ops) {\n applyPatchOp(data, op);\n }\n\n await this.withDatabase(async () => {\n await this.db\n .update(componentTable)\n .set({ data })\n .where(eq(componentTable.id, update.componentId));\n });\n }\n }\n\n // ── Entity batch methods ──────────────────────────────────────────────\n\n async upsertEntities(entities: Entity[]): Promise<void> {\n for (const entity of entities) {\n if (!entity.id) {\n await this.createEntities([entity]);\n continue;\n }\n const existing = await this.getEntitiesByIds([entity.id]);\n if (existing.length > 0) {\n await this.updateEntity(entity);\n } else {\n await this.createEntities([entity]);\n }\n }\n }\n\n async queryEntities(params: {\n componentType?: string;\n componentDataFilter?: Record<string, unknown>;\n agentId?: UUID;\n entityIds?: UUID[];\n worldId?: UUID;\n limit?: number;\n offset?: number;\n includeAllComponents?: boolean;\n entityContext?: UUID;\n }): Promise<Entity[]> {\n // If specific entityIds are provided, delegate to getEntitiesByIds\n if (params.entityIds?.length) {\n const entities = await this.getEntitiesByIds(params.entityIds);\n return entities || [];\n }\n\n return this.withDatabase(async () => {\n const conditions: SQL[] = [];\n\n if (params.agentId) {\n conditions.push(eq(entityTable.agentId, params.agentId));\n }\n\n // Build a single EXISTS subquery when filtering by componentType,\n // component data, and/or worldId.\n // Both predicates apply to the component table so they share one subquery.\n if (params.componentType || params.componentDataFilter || params.worldId) {\n const subConditions: SQL[] = [sql`${componentTable.entityId} = ${entityTable.id}`];\n if (params.componentType) {\n subConditions.push(sql`${componentTable.type} = ${params.componentType}`);\n }\n if (params.componentDataFilter) {\n subConditions.push(\n sql`${componentTable.data} @> ${JSON.stringify(params.componentDataFilter)}::jsonb`\n );\n }\n if (params.worldId) {\n subConditions.push(sql`${componentTable.worldId} = ${params.worldId}`);\n }\n const subquery = sql`EXISTS (\n SELECT 1 FROM ${componentTable}\n WHERE ${sql.join(subConditions, sql` AND `)}\n )`;\n conditions.push(subquery);\n }\n\n let query = this.db\n .select()\n .from(entityTable)\n .where(conditions.length > 0 ? and(...conditions) : undefined);\n\n if (params.limit) {\n query = query.limit(params.limit) as typeof query;\n }\n if (params.offset) {\n query = query.offset(params.offset) as typeof query;\n }\n\n const result = await query;\n\n const entities: Entity[] = result.map((row) => ({\n ...row,\n id: row.id as UUID,\n agentId: row.agentId as UUID,\n names: (row.names || []) as string[],\n metadata: (row.metadata || {}) as Metadata,\n }));\n\n // Load components for returned entities when requested\n if (params.includeAllComponents && entities.length > 0) {\n const entityIds = entities.flatMap((entity) => (entity.id ? [entity.id] : []));\n const components = await this.getComponentsForEntities(entityIds, params.worldId);\n const componentsByEntity = new Map<UUID, Component[]>();\n for (const comp of components) {\n const list = componentsByEntity.get(comp.entityId) ?? [];\n list.push(comp);\n componentsByEntity.set(comp.entityId, list);\n }\n for (const entity of entities) {\n entity.components = entity.id ? (componentsByEntity.get(entity.id) ?? []) : [];\n }\n }\n\n return entities;\n });\n }\n\n async updateEntities(entities: Entity[]): Promise<void> {\n for (const entity of entities) {\n await this.updateEntity(entity);\n }\n }\n\n async deleteEntities(entityIds: UUID[]): Promise<void> {\n for (const entityId of entityIds) {\n await this.deleteEntity(entityId);\n }\n }\n\n async getEntitiesForRooms(\n roomIds: UUID[],\n includeComponents?: boolean\n ): Promise<EntitiesForRoomsResult> {\n const result: EntitiesForRoomsResult = [];\n for (const roomId of roomIds) {\n const entities = await this.getEntitiesForRoom(roomId, includeComponents);\n result.push({ roomId, entities });\n }\n return result;\n }\n\n // ── Log batch methods ─────────────────────────────────────────────────\n\n async createLogs(\n params: Array<{\n body: LogBody;\n entityId: UUID;\n roomId: UUID;\n type: string;\n }>\n ): Promise<void> {\n for (const param of params) {\n await this.log(param);\n }\n }\n\n async getLogsByIds(logIds: UUID[]): Promise<Log[]> {\n if (logIds.length === 0) return [];\n return this.withDatabase(async () => {\n const result = await this.db.select().from(logTable).where(inArray(logTable.id, logIds));\n return result.map((log) => ({\n ...log,\n id: log.id as UUID,\n entityId: log.entityId as UUID,\n roomId: log.roomId as UUID,\n type: log.type as string,\n body: log.body as LogBody,\n createdAt: new Date(log.createdAt as string | number | Date),\n }));\n });\n }\n\n async updateLogs(logs: Array<{ id: UUID; updates: Partial<Log> }>): Promise<void> {\n return this.withDatabase(async () => {\n for (const { id, updates } of logs) {\n const setValues: Record<string, unknown> = {};\n if (updates.body !== undefined) setValues.body = updates.body;\n if (updates.type !== undefined) setValues.type = updates.type;\n if (Object.keys(setValues).length > 0) {\n await this.db.update(logTable).set(setValues).where(eq(logTable.id, id));\n }\n }\n });\n }\n\n async deleteLogs(logIds: UUID[]): Promise<void> {\n if (logIds.length === 0) return;\n return this.withDatabase(async () => {\n await this.db.delete(logTable).where(inArray(logTable.id, logIds));\n });\n }\n\n // ── Memory batch methods ──────────────────────────────────────────────\n\n async createMemories(\n memories: Array<{ memory: Memory; tableName: string; unique?: boolean }>\n ): Promise<UUID[]> {\n const ids: UUID[] = [];\n for (const { memory, tableName, unique } of memories) {\n const memoryWithUnique = unique !== undefined ? { ...memory, unique } : memory;\n const id = await this.createMemory(memoryWithUnique, tableName);\n ids.push(id);\n }\n return ids;\n }\n\n async updateMemories(\n memories: Array<Partial<Memory> & { id: UUID; metadata?: MemoryMetadata }>\n ): Promise<void> {\n for (const memory of memories) {\n await this.updateMemory(memory);\n }\n }\n\n async upsertMemories(\n memories: Array<{ memory: Memory; tableName: string }>,\n _options?: { entityContext?: UUID }\n ): Promise<void> {\n for (const { memory, tableName } of memories) {\n if (memory.id) {\n const existing = await this.getMemoryById(memory.id);\n if (existing) {\n await this.updateMemory(memory as Partial<Memory> & { id: UUID });\n continue;\n }\n }\n await this.createMemory(memory, tableName);\n }\n }\n\n async deleteMemories(memoryIds: UUID[]): Promise<void> {\n await this.deleteManyMemories(memoryIds);\n }\n\n // ── World batch methods ───────────────────────────────────────────────\n\n async getWorldsByIds(worldIds: UUID[]): Promise<World[]> {\n if (worldIds.length === 0) return [];\n return this.withDatabase(async () => {\n const result = await this.db\n .select()\n .from(worldTable)\n .where(inArray(worldTable.id, worldIds));\n return result.map((world) => this.mapWorldResult(world));\n });\n }\n\n async createWorlds(worlds: World[]): Promise<UUID[]> {\n const ids: UUID[] = [];\n for (const world of worlds) {\n const id = await this.createWorld(world);\n ids.push(id);\n }\n return ids;\n }\n\n async deleteWorlds(worldIds: UUID[]): Promise<void> {\n for (const id of worldIds) {\n await this.removeWorld(id);\n }\n }\n\n async updateWorlds(worlds: World[]): Promise<void> {\n for (const world of worlds) {\n await this.updateWorld(world);\n }\n }\n\n async upsertWorlds(worlds: World[]): Promise<void> {\n for (const world of worlds) {\n const existing = await this.getWorld(world.id);\n if (existing) {\n await this.updateWorld(world);\n } else {\n await this.createWorld(world);\n }\n }\n }\n\n // ── Room batch methods ────────────────────────────────────────────────\n\n async deleteRoomsByWorldIds(worldIds: UUID[]): Promise<void> {\n for (const worldId of worldIds) {\n await this.deleteRoomsByWorldId(worldId);\n }\n }\n\n async getRoomsByWorlds(worldIds: UUID[], limit?: number, offset?: number): Promise<Room[]> {\n if (worldIds.length === 0) return [];\n return this.withDatabase(async () => {\n const conditions = [\n inArray(roomTable.worldId, worldIds),\n eq(roomTable.agentId, this.agentId),\n ];\n let query = this.db\n .select()\n .from(roomTable)\n .where(and(...conditions));\n if (offset) {\n query = query.offset(offset) as typeof query;\n }\n if (limit) {\n query = query.limit(limit) as typeof query;\n }\n const result = await query;\n return result.map((room) => ({\n ...room,\n id: room.id as UUID,\n name: room.name ?? undefined,\n agentId: room.agentId as UUID,\n messageServerId: room.messageServerId as UUID,\n serverId: room.messageServerId as UUID,\n worldId: room.worldId as UUID,\n channelId: room.channelId as UUID,\n type: room.type as ChannelType,\n metadata: room.metadata as Metadata,\n }));\n });\n }\n\n async upsertRooms(rooms: Room[]): Promise<void> {\n for (const room of rooms) {\n const existing = await this.getRoomsByIds([room.id]);\n if (existing && existing.length > 0) {\n await this.updateRoom(room);\n } else {\n await this.createRooms([room]);\n }\n }\n }\n\n async createRoomParticipants(entityIds: UUID[], roomId: UUID): Promise<UUID[]> {\n const ids: UUID[] = [];\n for (const entityId of entityIds) {\n const success = await this.addParticipant(entityId, roomId);\n if (success) {\n ids.push(`${roomId}:${entityId}` as UUID);\n }\n }\n return ids;\n }\n\n async deleteParticipants(\n participants: Array<{ entityId: UUID; roomId: UUID }>\n ): Promise<boolean> {\n for (const { entityId, roomId } of participants) {\n const success = await this.removeParticipant(entityId, roomId);\n if (!success) return false;\n }\n return true;\n }\n\n async updateParticipants(\n participants: Array<{\n entityId: UUID;\n roomId: UUID;\n updates: ParticipantUpdateFields;\n }>\n ): Promise<void> {\n for (const { entityId, roomId, updates } of participants) {\n if (updates.roomState !== undefined) {\n await this.setParticipantUserState(roomId, entityId, updates.roomState);\n }\n }\n }\n\n async updateRooms(rooms: Room[]): Promise<void> {\n for (const room of rooms) {\n await this.updateRoom(room);\n }\n }\n\n async deleteRooms(roomIds: UUID[]): Promise<void> {\n for (const roomId of roomIds) {\n await this.deleteRoom(roomId);\n }\n }\n\n // ── Participant batch methods ─────────────────────────────────────────\n\n async getParticipantsForEntities(entityIds: UUID[]): Promise<Participant[]> {\n const result: Participant[] = [];\n for (const entityId of entityIds) {\n const participants = await this.getParticipantsForEntity(entityId);\n result.push(...participants);\n }\n return result;\n }\n\n async getParticipantsForRooms(roomIds: UUID[]): Promise<ParticipantsForRoomsResult> {\n const result: ParticipantsForRoomsResult = [];\n for (const roomId of roomIds) {\n const entityIds = await this.getParticipantsForRoom(roomId);\n result.push({ roomId, entityIds });\n }\n return result;\n }\n\n async areRoomParticipants(pairs: Array<{ roomId: UUID; entityId: UUID }>): Promise<boolean[]> {\n const results: boolean[] = [];\n for (const { roomId, entityId } of pairs) {\n const isParticipant = await this.isRoomParticipant(roomId, entityId);\n results.push(isParticipant);\n }\n return results;\n }\n\n async getParticipantUserStates(\n pairs: Array<{ roomId: UUID; entityId: UUID }>\n ): Promise<ParticipantUserState[]> {\n const results: ParticipantUserState[] = [];\n for (const { roomId, entityId } of pairs) {\n const state = await this.getParticipantUserState(roomId, entityId);\n results.push(state);\n }\n return results;\n }\n\n async updateParticipantUserStates(\n updates: Array<{\n roomId: UUID;\n entityId: UUID;\n state: ParticipantUserState;\n }>\n ): Promise<void> {\n for (const { roomId, entityId, state } of updates) {\n await this.setParticipantUserState(roomId, entityId, state);\n }\n }\n\n // ── Relationship batch methods ────────────────────────────────────────\n\n async getRelationshipsByPairs(\n pairs: Array<{ sourceEntityId: UUID; targetEntityId: UUID }>\n ): Promise<(Relationship | null)[]> {\n const results: (Relationship | null)[] = [];\n for (const pair of pairs) {\n const rel = await this.getRelationship(pair);\n results.push(rel);\n }\n return results;\n }\n\n async createRelationships(\n relationships: Array<{\n sourceEntityId: UUID;\n targetEntityId: UUID;\n tags?: string[];\n metadata?: Metadata;\n }>\n ): Promise<UUID[]> {\n const ids: UUID[] = [];\n for (const rel of relationships) {\n const id = v4() as UUID;\n const success = await this.createRelationship(rel);\n if (success) ids.push(id);\n }\n return ids;\n }\n\n async getRelationshipsByIds(relationshipIds: UUID[]): Promise<Relationship[]> {\n if (relationshipIds.length === 0) return [];\n return this.withDatabase(async () => {\n const result = await this.db\n .select()\n .from(relationshipTable)\n .where(inArray(relationshipTable.id, relationshipIds));\n return result.map((relationship) => ({\n ...relationship,\n id: relationship.id as UUID,\n sourceEntityId: relationship.sourceEntityId as UUID,\n targetEntityId: relationship.targetEntityId as UUID,\n agentId: relationship.agentId as UUID,\n tags: (relationship.tags ?? []) as string[],\n metadata: (relationship.metadata ?? {}) as Metadata,\n createdAt: relationship.createdAt.toISOString(),\n }));\n });\n }\n\n async updateRelationships(relationships: Relationship[]): Promise<void> {\n for (const relationship of relationships) {\n await this.updateRelationship(relationship);\n }\n }\n\n async deleteRelationships(relationshipIds: UUID[]): Promise<void> {\n if (relationshipIds.length === 0) return;\n return this.withDatabase(async () => {\n await this.db.delete(relationshipTable).where(inArray(relationshipTable.id, relationshipIds));\n });\n }\n\n // ── Cache batch methods ───────────────────────────────────────────────\n\n async getCaches<T>(keys: string[]): Promise<Map<string, T>> {\n const result = new Map<string, T>();\n for (const key of keys) {\n const value = await this.getCache<T>(key);\n if (value !== undefined) {\n result.set(key, value);\n }\n }\n return result;\n }\n\n async setCaches<T>(entries: Array<{ key: string; value: T }>): Promise<boolean> {\n for (const { key, value } of entries) {\n const success = await this.setCache(key, value);\n if (!success) return false;\n }\n return true;\n }\n\n async deleteCaches(keys: string[]): Promise<boolean> {\n for (const key of keys) {\n const success = await this.deleteCache(key);\n if (!success) return false;\n }\n return true;\n }\n\n // ── Task batch methods ────────────────────────────────────────────────\n\n async createTasks(tasks: Task[]): Promise<UUID[]> {\n const ids: UUID[] = [];\n for (const task of tasks) {\n const id = await this.createTask(task);\n ids.push(id);\n }\n return ids;\n }\n\n async getTasksByIds(taskIds: UUID[]): Promise<Task[]> {\n const tasks: Task[] = [];\n for (const taskId of taskIds) {\n const task = await this.getTask(taskId);\n if (task) tasks.push(task);\n }\n return tasks;\n }\n\n async updateTasks(updates: Array<{ id: UUID; task: Partial<Task> }>): Promise<void> {\n for (const { id, task } of updates) {\n await this.updateTask(id, task);\n }\n }\n\n async deleteTasks(taskIds: UUID[]): Promise<void> {\n for (const taskId of taskIds) {\n await this.deleteTask(taskId);\n }\n }\n\n // ── Pairing batch methods ─────────────────────────────────────────────\n\n async getPairingAllowlists(\n queries: Array<{ channel: PairingChannel; agentId: UUID }>\n ): Promise<PairingAllowlistsResult> {\n const result: PairingAllowlistsResult = [];\n for (const { channel, agentId } of queries) {\n const entries = await this.getPairingAllowlist(channel, agentId);\n result.push({ channel, agentId, entries });\n }\n return result;\n }\n\n async createPairingRequests(requests: PairingRequest[]): Promise<UUID[]> {\n const ids: UUID[] = [];\n for (const request of requests) {\n const id = await this.createPairingRequest(request);\n ids.push(id);\n }\n return ids;\n }\n\n async updatePairingRequests(requests: PairingRequest[]): Promise<void> {\n for (const request of requests) {\n await this.updatePairingRequest(request);\n }\n }\n\n async deletePairingRequests(ids: UUID[]): Promise<void> {\n for (const id of ids) {\n await this.deletePairingRequest(id);\n }\n }\n\n async createPairingAllowlistEntries(entries: PairingAllowlistEntry[]): Promise<UUID[]> {\n const ids: UUID[] = [];\n for (const entry of entries) {\n const id = await this.createPairingAllowlistEntry(entry);\n ids.push(id);\n }\n return ids;\n }\n\n async updatePairingAllowlistEntries(entries: PairingAllowlistEntry[]): Promise<void> {\n // The singular updatePairingAllowlistEntry doesn't exist in base.ts,\n // so we implement inline using the same pattern as the singular update.\n return this.withDatabase(async () => {\n for (const entry of entries) {\n if (!entry.id) continue;\n await this.db\n .update(pairingAllowlistTable)\n .set({\n metadata: entry.metadata || {},\n })\n .where(eq(pairingAllowlistTable.id, entry.id));\n }\n });\n }\n\n async deletePairingAllowlistEntries(ids: UUID[]): Promise<void> {\n for (const id of ids) {\n await this.deletePairingAllowlistEntry(id);\n }\n }\n\n // ── Connector account storage ────────────────────────────────────────\n\n async listConnectorAccounts(\n params?: ListConnectorAccountsParams\n ): Promise<ConnectorAccountRecord[]> {\n return this.getConnectorAccountStore().listAccounts(params ?? {});\n }\n\n async getConnectorAccount(\n params: GetConnectorAccountParams\n ): Promise<ConnectorAccountRecord | null> {\n return this.getConnectorAccountStore().getAccount(params);\n }\n\n async upsertConnectorAccount(\n params: UpsertConnectorAccountParams\n ): Promise<ConnectorAccountRecord> {\n return this.getConnectorAccountStore().upsertAccount(params);\n }\n\n async deleteConnectorAccount(params: DeleteConnectorAccountParams): Promise<boolean> {\n return this.getConnectorAccountStore().deleteAccount(params);\n }\n\n async findConnectorOwnerBinding(\n params: ConnectorOwnerBindingLookup\n ): Promise<ConnectorOwnerBindingRecord | null> {\n return this.getConnectorAccountStore().findOwnerBinding(params);\n }\n\n async setConnectorAccountCredentialRef(\n params: SetConnectorAccountCredentialRefParams\n ): Promise<ConnectorAccountCredentialRefRecord> {\n return this.getConnectorAccountStore().setCredentialRef(params);\n }\n\n async getConnectorAccountCredentialRef(\n params: GetConnectorAccountCredentialRefParams\n ): Promise<ConnectorAccountCredentialRefRecord | null> {\n return this.getConnectorAccountStore().getCredentialRef(params);\n }\n\n async listConnectorAccountCredentialRefs(\n params: ListConnectorAccountCredentialRefsParams\n ): Promise<ConnectorAccountCredentialRefRecord[]> {\n return this.getConnectorAccountStore().listCredentialRefs(params);\n }\n\n async appendConnectorAccountAuditEvent(\n params: AppendConnectorAccountAuditEventParams\n ): Promise<ConnectorAccountAuditEventRecord> {\n return this.getConnectorAccountStore().appendAuditEvent(params);\n }\n\n async listConnectorAccountAuditEvents(\n params: ListConnectorAccountAuditEventsParams = {}\n ): Promise<ConnectorAccountAuditEventRecord[]> {\n return this.getConnectorAccountStore().listAuditEvents(params);\n }\n\n async createOAuthFlowState(params: CreateOAuthFlowStateParams): Promise<OAuthFlowRecord> {\n return this.getConnectorAccountStore().createOAuthFlowState(params);\n }\n\n async consumeOAuthFlowState(\n params: ConsumeOAuthFlowStateParams\n ): Promise<OAuthFlowRecord | null> {\n return this.getConnectorAccountStore().consumeOAuthFlowState(params);\n }\n\n async getOAuthFlowState(params: GetOAuthFlowStateParams): Promise<OAuthFlowRecord | null> {\n return this.getConnectorAccountStore().getOAuthFlowState(params);\n }\n\n async updateOAuthFlowState(params: UpdateOAuthFlowStateParams): Promise<OAuthFlowRecord | null> {\n return this.getConnectorAccountStore().updateOAuthFlowState(params);\n }\n\n async deleteOAuthFlowState(params: DeleteOAuthFlowStateParams): Promise<boolean> {\n return this.getConnectorAccountStore().deleteOAuthFlowState(params);\n }\n}\n\n// Import tables at the end to avoid circular dependencies\n",
26
+ "import { relations, sql } from \"drizzle-orm\";\nimport { check, foreignKey, index, pgTable, timestamp, uuid, vector } from \"drizzle-orm/pg-core\";\nimport { memoryTable } from \"./memory\";\n\nexport const VECTOR_DIMS = {\n SMALL: 384,\n MEDIUM: 512,\n LARGE: 768,\n XL: 1024,\n XXL: 1536,\n // 2048: native embedding width of the on-device eliza-1-2b model (qwen3.5\n // n_embd=2048). Without this column the 2b's embeddings have no storable\n // dimension and are silently dropped (broken on-device memory/RAG).\n XXL2: 2048,\n XXXL: 3072,\n} as const;\n\nexport const DIMENSION_MAP = {\n [VECTOR_DIMS.SMALL]: \"dim384\",\n [VECTOR_DIMS.MEDIUM]: \"dim512\",\n [VECTOR_DIMS.LARGE]: \"dim768\",\n [VECTOR_DIMS.XL]: \"dim1024\",\n [VECTOR_DIMS.XXL]: \"dim1536\",\n [VECTOR_DIMS.XXL2]: \"dim2048\",\n [VECTOR_DIMS.XXXL]: \"dim3072\",\n} as const;\n\n/**\n * Definition of the embeddings table in the database.\n * Contains columns for ID, Memory ID, Creation Timestamp, and multiple vector dimensions.\n */\nexport const embeddingTable = pgTable(\n \"embeddings\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom().notNull(),\n memoryId: uuid(\"memory_id\").references(() => memoryTable.id, {\n onDelete: \"cascade\",\n }),\n createdAt: timestamp(\"created_at\").default(sql`now()`).notNull(),\n dim384: vector(\"dim_384\", { dimensions: VECTOR_DIMS.SMALL }),\n dim512: vector(\"dim_512\", { dimensions: VECTOR_DIMS.MEDIUM }),\n dim768: vector(\"dim_768\", { dimensions: VECTOR_DIMS.LARGE }),\n dim1024: vector(\"dim_1024\", { dimensions: VECTOR_DIMS.XL }),\n dim1536: vector(\"dim_1536\", { dimensions: VECTOR_DIMS.XXL }),\n dim2048: vector(\"dim_2048\", { dimensions: VECTOR_DIMS.XXL2 }),\n dim3072: vector(\"dim_3072\", { dimensions: VECTOR_DIMS.XXXL }),\n },\n (table) => [\n check(\"embedding_source_check\", sql`\"memory_id\" IS NOT NULL`),\n index(\"idx_embedding_memory\").on(table.memoryId),\n foreignKey({\n name: \"fk_embedding_memory\",\n columns: [table.memoryId],\n foreignColumns: [memoryTable.id],\n }).onDelete(\"cascade\"),\n ]\n);\n\n/**\n * Defines the possible values for the Embedding Dimension Column.\n * It can be \"dim384\", \"dim512\", \"dim768\", \"dim1024\", \"dim1536\", or \"dim3072\".\n */\nexport type EmbeddingDimensionColumn =\n | \"dim384\"\n | \"dim512\"\n | \"dim768\"\n | \"dim1024\"\n | \"dim1536\"\n | \"dim2048\"\n | \"dim3072\";\n\n/**\n * Retrieve the type of a specific column in the EmbeddingTable based on the EmbeddingDimensionColumn key.\n */\nexport type EmbeddingTableColumn = (typeof embeddingTable._.columns)[EmbeddingDimensionColumn];\n\n// Relations - defined here to avoid circular dependency with memory.ts\nexport const memoryRelations = relations(memoryTable, ({ one }) => ({\n embedding: one(embeddingTable),\n}));\n",
27
+ "import { sql } from \"drizzle-orm\";\nimport {\n boolean,\n check,\n foreignKey,\n index,\n jsonb,\n pgTable,\n text,\n timestamp,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\nimport { entityTable } from \"./entity\";\nimport { roomTable } from \"./room\";\n\n/**\n * Definition of the memory table in the database.\n *\n * @param {string} tableName - The name of the table.\n * @param {object} columns - An object containing the column definitions.\n * @param {function} indexes - A function that defines the indexes for the table.\n * @returns {object} - The memory table object.\n */\nexport const memoryTable = pgTable(\n \"memories\",\n {\n id: uuid(\"id\").primaryKey().notNull(),\n type: text(\"type\").notNull(),\n createdAt: timestamp(\"created_at\").default(sql`now()`).notNull(),\n content: jsonb(\"content\").notNull(),\n entityId: uuid(\"entity_id\").references(() => entityTable.id, {\n onDelete: \"cascade\",\n }),\n agentId: uuid(\"agent_id\")\n .references(() => agentTable.id, {\n onDelete: \"cascade\",\n })\n .notNull(),\n roomId: uuid(\"room_id\").references(() => roomTable.id, {\n onDelete: \"cascade\",\n }),\n worldId: uuid(\"world_id\"),\n // .references(() => worldTable.id, {\n // onDelete: 'set null',\n // }),\n unique: boolean(\"unique\").default(true).notNull(),\n metadata: jsonb(\"metadata\").default({}).notNull(),\n },\n (table) => [\n index(\"idx_memories_type_room\").on(table.type, table.roomId),\n index(\"idx_memories_world_id\").on(table.worldId),\n foreignKey({\n name: \"fk_room\",\n columns: [table.roomId],\n foreignColumns: [roomTable.id],\n }).onDelete(\"cascade\"),\n foreignKey({\n name: \"fk_user\",\n columns: [table.entityId],\n foreignColumns: [entityTable.id],\n }).onDelete(\"cascade\"),\n foreignKey({\n name: \"fk_agent\",\n columns: [table.agentId],\n foreignColumns: [agentTable.id],\n }).onDelete(\"cascade\"),\n // foreignKey({\n // name: 'fk_world',\n // columns: [table.worldId],\n // foreignColumns: [worldTable.id],\n // }).onDelete('set null'),\n index(\"idx_memories_metadata_type\").on(sql`((metadata->>'type'))`),\n index(\"idx_memories_document_id\").on(sql`((metadata->>'documentId'))`),\n index(\"idx_fragments_order\").on(\n sql`((metadata->>'documentId'))`,\n sql`((metadata->>'position'))`\n ),\n check(\n \"fragment_metadata_check\",\n sql`\n CASE \n WHEN metadata->>'type' = 'fragment' THEN\n metadata ? 'documentId' AND \n metadata ? 'position'\n ELSE true\n END\n `\n ),\n check(\n \"document_metadata_check\",\n sql`\n CASE \n WHEN metadata->>'type' = 'document' THEN\n metadata ? 'timestamp'\n ELSE true\n END\n `\n ),\n ]\n);\n\n// Relations are defined in embedding.ts to avoid circular dependency\n",
28
+ "import type { Metadata } from \"@elizaos/core\";\nimport { sql } from \"drizzle-orm\";\nimport { jsonb, pgTable, text, timestamp, unique, uuid } from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\n\n/**\n * Represents an entity table in the database.\n * Includes columns for id, agentId, createdAt, names, and metadata.\n */\nexport const entityTable = pgTable(\n \"entities\",\n {\n id: uuid(\"id\").notNull().primaryKey(),\n agentId: uuid(\"agent_id\")\n .notNull()\n .references(() => agentTable.id, {\n onDelete: \"cascade\",\n }),\n createdAt: timestamp(\"created_at\").default(sql`now()`).notNull(),\n names: text(\"names\").array().default(sql`'{}'::text[]`).notNull(),\n metadata: jsonb(\"metadata\").$type<Metadata>().default(sql`'{}'::jsonb`).notNull(),\n },\n (table) => {\n return {\n idAgentIdUnique: unique(\"id_agent_id_unique\").on(table.id, table.agentId),\n };\n }\n);\n",
29
+ "import type { Metadata } from \"@elizaos/core\";\nimport { sql } from \"drizzle-orm\";\nimport { jsonb, pgTable, text, timestamp, uuid } from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\n\n/**\n * Defines a table schema for 'rooms' in the database.\n *\n * @typedef {object} RoomTable\n * @property {string} id - The unique identifier for the room.\n * @property {string} agentId - The UUID of the agent associated with the room.\n * @property {string} source - The source of the room.\n * @property {string} type - The type of the room.\n * @property {string} messageServerId - The message server ID of the room.\n * @property {string} worldId - The UUID of the world associated with the room.\n * @property {string} name - The name of the room.\n * @property {object} metadata - Additional metadata for the room in JSON format.\n * @property {string} channelId - The channel ID of the room.\n * @property {number} createdAt - The timestamp of when the room was created.\n */\nexport const roomTable = pgTable(\"rooms\", {\n id: uuid(\"id\").notNull().primaryKey().default(sql`gen_random_uuid()`),\n agentId: uuid(\"agent_id\").references(() => agentTable.id, {\n onDelete: \"cascade\",\n }),\n source: text(\"source\").notNull(),\n type: text(\"type\").notNull(),\n messageServerId: uuid(\"message_server_id\"),\n worldId: uuid(\"world_id\"), // optional: rooms may be created before a world row exists\n // .references(() => worldTable.id, {\n // onDelete: 'cascade',\n // }),\n name: text(\"name\"),\n metadata: jsonb(\"metadata\").$type<Metadata>(),\n channelId: text(\"channel_id\"),\n createdAt: timestamp(\"created_at\").default(sql`now()`).notNull(),\n});\n",
30
+ "export { agentTable } from \"./agent\";\nexport { approvalRequestTable } from \"./approvalRequests\";\nexport type { AuthAuditOutcome } from \"./authAuditEvent\";\nexport { authAuditEventTable } from \"./authAuditEvent\";\nexport { authBootstrapJtiSeenTable } from \"./authBootstrapJti\";\nexport type { AuthIdentityKind } from \"./authIdentity\";\nexport {\n authIdentityCreatedAtDefault,\n authIdentityTable,\n} from \"./authIdentity\";\nexport { authOwnerBindingTable } from \"./authOwnerBinding\";\nexport { authOwnerLoginTokenTable } from \"./authOwnerLoginToken\";\nexport type { AuthSessionKind } from \"./authSession\";\nexport { authSessionTable } from \"./authSession\";\nexport { cacheTable } from \"./cache\";\nexport { channelTable } from \"./channel\";\nexport { channelParticipantsTable } from \"./channelParticipant\";\nexport { componentTable } from \"./component\";\nexport {\n connectorAccountAuditEventsTable,\n connectorAccountCredentialsTable,\n connectorAccountsTable,\n oauthFlowsTable,\n} from \"./connectorAccounts\";\nexport { embeddingTable } from \"./embedding\";\nexport { entityTable } from \"./entity\";\nexport {\n entityIdentityTable,\n entityMergeCandidateTable,\n factCandidateTable,\n} from \"./entityIdentity\";\nexport { logTable } from \"./log\";\nexport { longTermMemories } from \"./longTermMemories\";\nexport { memoryTable } from \"./memory\";\nexport { memoryAccessLogs } from \"./memoryAccessLogs\";\nexport { messageTable } from \"./message\";\nexport { messageServerTable } from \"./messageServer\";\nexport { messageServerAgentsTable } from \"./messageServerAgent\";\nexport { pairingAllowlistTable } from \"./pairingAllowlist\";\nexport { pairingRequestTable } from \"./pairingRequest\";\nexport { participantTable } from \"./participant\";\nexport { relationshipTable } from \"./relationship\";\nexport { roomTable } from \"./room\";\nexport { serverTable } from \"./server\";\nexport { sessionSummaries } from \"./sessionSummaries\";\nexport { taskTable } from \"./tasks\";\nexport { worldTable } from \"./world\";\n",
31
+ "import { sql } from \"drizzle-orm\";\nimport { index, jsonb, pgTable, text, timestamp, uuid } from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\n\n/**\n * Persistent backing store for the LifeOps human-in-the-loop approval queue.\n *\n * Owned by `plugins/plugin-personal-assistant` (see `src/lifeops/approval-queue.types.ts`),\n * but lives in plugin-sql so the runtime migrator picks it up automatically\n * for both PostgreSQL and PGlite deployments.\n *\n * Migration safety: this table is additive. It is created on first boot via\n * the runtime migrator when absent, and existing databases are unaffected.\n *\n * State, action, channel, resolved_by, resolution_reason, and resolved_at are\n * intentionally text/timestamp without a CHECK constraint — the application\n * layer is the single source of truth for the state machine and the closed\n * action/channel enums (Commandment 7).\n */\nexport const approvalRequestTable = pgTable(\n \"approval_requests\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n /** Lifecycle state. See `ApprovalRequestState` in app-lifeops. */\n state: text(\"state\").notNull(),\n /** Agent or service that enqueued the request. */\n requestedBy: text(\"requested_by\").notNull(),\n /** Owner whose approval is required. */\n subjectUserId: text(\"subject_user_id\").notNull(),\n /** Closed enum from `ApprovalAction`. */\n action: text(\"action\").notNull(),\n /** Discriminated union from `ApprovalPayload`. */\n payload: jsonb(\"payload\").notNull(),\n /** Closed enum from `ApprovalChannel`. */\n channel: text(\"channel\").notNull(),\n /** Required justification for the request. */\n reason: text(\"reason\").notNull(),\n expiresAt: timestamp(\"expires_at\", { withTimezone: true }).notNull(),\n /** Null until the request leaves `pending`. */\n resolvedAt: timestamp(\"resolved_at\", { withTimezone: true }),\n /** Null until resolved; resolver identity. */\n resolvedBy: text(\"resolved_by\"),\n /** Null until resolved; human-readable resolution note. */\n resolutionReason: text(\"resolution_reason\"),\n /** Owning agent (cascade-deletes when the agent is removed). */\n agentId: uuid(\"agent_id\")\n .notNull()\n .references(() => agentTable.id, { onDelete: \"cascade\" }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).default(sql`now()`).notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).default(sql`now()`).notNull(),\n },\n (table) => [\n index(\"approval_requests_subject_state_idx\").on(table.subjectUserId, table.state),\n index(\"approval_requests_agent_state_idx\").on(table.agentId, table.state),\n index(\"approval_requests_state_expires_idx\").on(table.state, table.expiresAt),\n ]\n);\n",
32
+ "import { bigint, index, jsonb, pgTable, text } from \"drizzle-orm/pg-core\";\n\n/**\n * Append-only audit row for every sensitive auth action.\n *\n * Rows are also mirrored to JSONL on disk so a wiped DB does not lose history.\n * Token-shaped values in `metadata` MUST be redacted before insert by the\n * caller.\n */\nexport const authAuditEventTable = pgTable(\n \"auth_audit_events\",\n {\n id: text(\"id\").primaryKey(),\n ts: bigint(\"ts\", { mode: \"number\" }).notNull(),\n actorIdentityId: text(\"actor_identity_id\"),\n ip: text(\"ip\"),\n userAgent: text(\"user_agent\"),\n action: text(\"action\").notNull(),\n outcome: text(\"outcome\").notNull(),\n metadata: jsonb(\"metadata\").$type<Record<string, string | number | boolean>>().notNull(),\n },\n (table) => [\n index(\"auth_audit_events_action_idx\").on(table.action),\n index(\"auth_audit_events_ts_idx\").on(table.ts),\n index(\"auth_audit_events_actor_idx\").on(table.actorIdentityId),\n ]\n);\n\nexport type AuthAuditOutcome = \"success\" | \"failure\";\n",
33
+ "import { bigint, index, pgTable, text } from \"drizzle-orm/pg-core\";\n\n/**\n * Replay-defence set for bootstrap-token `jti` claims. A row exists for every\n * bootstrap token successfully verified on this instance; subsequent\n * presentations of the same `jti` must be rejected.\n *\n * Rows are kept until natural `exp` of the original token plus a buffer; the\n * cleanup job lives in the auth-store.\n */\nexport const authBootstrapJtiSeenTable = pgTable(\n \"auth_bootstrap_jti_seen\",\n {\n jti: text(\"jti\").primaryKey(),\n seenAt: bigint(\"seen_at\", { mode: \"number\" }).notNull(),\n },\n (table) => [index(\"auth_bootstrap_jti_seen_at_idx\").on(table.seenAt)]\n);\n",
34
+ "import { sql } from \"drizzle-orm\";\nimport { bigint, index, pgTable, text } from \"drizzle-orm/pg-core\";\n\n/**\n * Auth identity row. One per real user / machine actor on this Eliza instance.\n *\n * `kind` distinguishes interactive (\"owner\") identities from non-interactive\n * (\"machine\") identities used by long-lived bearer tokens. Exactly one of\n * `passwordHash` or `cloudUserId` is expected to be populated for an owner\n * (with possible owner-bindings extending login methods); machines have\n * neither and are authenticated by the bearer token bound to their session.\n */\nexport const authIdentityTable = pgTable(\n \"auth_identities\",\n {\n /** uuid v7 string. Stored as text so we don't have to pull a v7 generator into pg defaults. */\n id: text(\"id\").primaryKey(),\n kind: text(\"kind\").notNull(),\n displayName: text(\"display_name\").notNull(),\n createdAt: bigint(\"created_at\", { mode: \"number\" }).notNull(),\n /** argon2id encoded password hash. Optional: cloud-only identities may not have one. */\n passwordHash: text(\"password_hash\"),\n /** Linked Eliza Cloud user id when SSO is enabled. */\n cloudUserId: text(\"cloud_user_id\"),\n },\n (table) => [\n index(\"auth_identities_kind_idx\").on(table.kind),\n index(\"auth_identities_cloud_user_idx\").on(table.cloudUserId),\n ]\n);\n\nexport type AuthIdentityKind = \"owner\" | \"machine\";\n\n/** Default SQL `now() * 1000` to populate `created_at` when callers don't supply one. */\nexport const authIdentityCreatedAtDefault = sql`(extract(epoch from now()) * 1000)::bigint`;\n",
35
+ "import { bigint, foreignKey, index, pgTable, text, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport { authIdentityTable } from \"./authIdentity\";\n\n/**\n * Connector-owner binding. Lets an external connector account (Discord,\n * Telegram, WeChat, Matrix) prove ownership of a local Eliza identity.\n *\n * Uniqueness is enforced on `(connector, external_id, instance_id)` so the same\n * Discord account can own multiple Eliza instances (one binding per\n * (connector, external) pair *per instance*) without cross-talk.\n */\nexport const authOwnerBindingTable = pgTable(\n \"auth_owner_bindings\",\n {\n id: text(\"id\").primaryKey(),\n identityId: text(\"identity_id\")\n .notNull()\n .references(() => authIdentityTable.id, { onDelete: \"cascade\" }),\n connector: text(\"connector\").notNull(),\n externalId: text(\"external_id\").notNull(),\n displayHandle: text(\"display_handle\").notNull(),\n /** Stable per-instance id; populated from ELIZA_INSTANCE_ID or generated once at boot. */\n instanceId: text(\"instance_id\").notNull(),\n verifiedAt: bigint(\"verified_at\", { mode: \"number\" }).notNull(),\n /** Hashed pairing code (sha256 hex) — never store the plaintext. */\n pendingCodeHash: text(\"pending_code_hash\"),\n pendingExpiresAt: bigint(\"pending_expires_at\", { mode: \"number\" }),\n },\n (table) => [\n index(\"auth_owner_bindings_identity_idx\").on(table.identityId),\n index(\"auth_owner_bindings_connector_idx\").on(table.connector),\n uniqueIndex(\"auth_owner_bindings_connector_external_instance_uniq\").on(\n table.connector,\n table.externalId,\n table.instanceId\n ),\n foreignKey({\n name: \"fk_auth_owner_bindings_identity\",\n columns: [table.identityId],\n foreignColumns: [authIdentityTable.id],\n }).onDelete(\"cascade\"),\n ]\n);\n",
36
+ "import { bigint, foreignKey, index, pgTable, text } from \"drizzle-orm/pg-core\";\nimport { authIdentityTable } from \"./authIdentity\";\nimport { authOwnerBindingTable } from \"./authOwnerBinding\";\n\n/**\n * Single-use DM-link login tokens for the connector-owner convenience flow.\n *\n * The user types `/eliza-pair` in their connector and asks Eliza to DM\n * a login link. The DM contains a short-lived URL whose `?token=...` is\n * the SHA-256 hash of a random UUID v7. The plaintext is sent only via the\n * DM channel; the database stores only the hash so a DB read does not\n * surrender unconsumed tokens.\n *\n * Tokens are consumed exactly once: the consume endpoint sets\n * `consumed_at` and the row is preserved for audit. Rows older than\n * `expires_at + 24h` are eligible for cleanup.\n */\nexport const authOwnerLoginTokenTable = pgTable(\n \"auth_owner_login_tokens\",\n {\n /** SHA-256 hex of the plaintext token. Plaintext is never stored. */\n tokenHash: text(\"token_hash\").primaryKey(),\n identityId: text(\"identity_id\")\n .notNull()\n .references(() => authIdentityTable.id, { onDelete: \"cascade\" }),\n /** Binding that issued this token. */\n bindingId: text(\"binding_id\")\n .notNull()\n .references(() => authOwnerBindingTable.id, { onDelete: \"cascade\" }),\n issuedAt: bigint(\"issued_at\", { mode: \"number\" }).notNull(),\n expiresAt: bigint(\"expires_at\", { mode: \"number\" }).notNull(),\n /** Set on first successful consume. Null while the token is live. */\n consumedAt: bigint(\"consumed_at\", { mode: \"number\" }),\n },\n (table) => [\n index(\"auth_owner_login_tokens_identity_idx\").on(table.identityId),\n index(\"auth_owner_login_tokens_binding_idx\").on(table.bindingId),\n index(\"auth_owner_login_tokens_expires_idx\").on(table.expiresAt),\n foreignKey({\n name: \"fk_auth_owner_login_tokens_identity\",\n columns: [table.identityId],\n foreignColumns: [authIdentityTable.id],\n }).onDelete(\"cascade\"),\n foreignKey({\n name: \"fk_auth_owner_login_tokens_binding\",\n columns: [table.bindingId],\n foreignColumns: [authOwnerBindingTable.id],\n }).onDelete(\"cascade\"),\n ]\n);\n",
37
+ "import { bigint, boolean, foreignKey, index, jsonb, pgTable, text } from \"drizzle-orm/pg-core\";\nimport { authIdentityTable } from \"./authIdentity\";\n\n/**\n * Active authenticated session.\n *\n * `id` is the opaque cookie value (256-bit hex) — server-side lookup, never JWT.\n * `kind` is \"browser\" (sliding TTL, CSRF-bound) or \"machine\" (absolute TTL,\n * scope-bearing bearer token).\n *\n * Browser sessions store a `csrfSecret` used to derive double-submit tokens.\n * Machine sessions list explicit scopes; browser sessions get an empty list\n * which the auth layer treats as \"all scopes\".\n */\nexport const authSessionTable = pgTable(\n \"auth_sessions\",\n {\n id: text(\"id\").primaryKey(),\n identityId: text(\"identity_id\")\n .notNull()\n .references(() => authIdentityTable.id, { onDelete: \"cascade\" }),\n kind: text(\"kind\").notNull(),\n createdAt: bigint(\"created_at\", { mode: \"number\" }).notNull(),\n lastSeenAt: bigint(\"last_seen_at\", { mode: \"number\" }).notNull(),\n expiresAt: bigint(\"expires_at\", { mode: \"number\" }).notNull(),\n rememberDevice: boolean(\"remember_device\").notNull().default(false),\n csrfSecret: text(\"csrf_secret\").notNull(),\n ip: text(\"ip\"),\n userAgent: text(\"user_agent\"),\n scopes: jsonb(\"scopes\").$type<string[]>().notNull(),\n revokedAt: bigint(\"revoked_at\", { mode: \"number\" }),\n },\n (table) => [\n index(\"auth_sessions_identity_idx\").on(table.identityId),\n index(\"auth_sessions_expires_idx\").on(table.expiresAt),\n foreignKey({\n name: \"fk_auth_sessions_identity\",\n columns: [table.identityId],\n foreignColumns: [authIdentityTable.id],\n }).onDelete(\"cascade\"),\n ]\n);\n\nexport type AuthSessionKind = \"browser\" | \"machine\";\n",
38
+ "import { sql } from \"drizzle-orm\";\nimport { jsonb, pgTable, primaryKey, text, timestamp, uuid } from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\n\n/**\n * Represents a PostgreSQL table for caching data.\n *\n * @type {pgTable}\n */\nexport const cacheTable = pgTable(\n \"cache\",\n {\n key: text(\"key\").notNull(),\n agentId: uuid(\"agent_id\")\n .notNull()\n .references(() => agentTable.id, { onDelete: \"cascade\" }),\n value: jsonb(\"value\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).default(sql`now()`).notNull(),\n expiresAt: timestamp(\"expires_at\", { withTimezone: true }),\n },\n (table) => [primaryKey({ columns: [table.key, table.agentId] })]\n);\n",
39
+ "import { sql } from \"drizzle-orm\";\nimport { jsonb, pgTable, text, timestamp, uuid } from \"drizzle-orm/pg-core\";\nimport { messageServerTable } from \"./messageServer\";\n\nexport const channelTable = pgTable(\"channels\", {\n id: text(\"id\").primaryKey(), // UUID stored as text\n messageServerId: uuid(\"message_server_id\")\n .notNull()\n .references(() => messageServerTable.id, { onDelete: \"cascade\" }),\n name: text(\"name\").notNull(),\n type: text(\"type\").notNull(), // Store ChannelType enum values as text\n sourceType: text(\"source_type\"),\n sourceId: text(\"source_id\"),\n topic: text(\"topic\"),\n metadata: jsonb(\"metadata\"),\n // server_id is added dynamically by RLS setup\n createdAt: timestamp(\"created_at\", { mode: \"date\" }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n updatedAt: timestamp(\"updated_at\", { mode: \"date\" }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n});\n",
40
+ "import { sql } from \"drizzle-orm\";\nimport { jsonb, pgTable, text, timestamp, uuid } from \"drizzle-orm/pg-core\";\n\nexport const messageServerTable = pgTable(\"message_servers\", {\n id: uuid(\"id\").primaryKey(),\n name: text(\"name\").notNull(),\n sourceType: text(\"source_type\").notNull(),\n sourceId: text(\"source_id\"),\n metadata: jsonb(\"metadata\"),\n createdAt: timestamp(\"created_at\", { mode: \"date\" }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n updatedAt: timestamp(\"updated_at\", { mode: \"date\" }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n});\n",
41
+ "import { pgTable, primaryKey, text } from \"drizzle-orm/pg-core\";\nimport { channelTable } from \"./channel\";\n\nexport const channelParticipantsTable = pgTable(\n \"channel_participants\",\n {\n channelId: text(\"channel_id\")\n .notNull()\n .references(() => channelTable.id, { onDelete: \"cascade\" }),\n entityId: text(\"entity_id\").notNull(), // Entity UUID (can be an agentId or a dedicated central user ID)\n },\n (table) => [primaryKey({ columns: [table.channelId, table.entityId] })]\n);\n",
42
+ "import { sql } from \"drizzle-orm\";\nimport { jsonb, pgTable, text, timestamp, uuid } from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\nimport { entityTable } from \"./entity\";\nimport { roomTable } from \"./room\";\nimport { worldTable } from \"./world\";\n\n/**\n * Represents a component table in the database.\n */\nexport const componentTable = pgTable(\"components\", {\n id: uuid(\"id\").primaryKey().default(sql`gen_random_uuid()`).notNull(),\n\n // Foreign keys\n entityId: uuid(\"entity_id\")\n .references(() => entityTable.id, { onDelete: \"cascade\" })\n .notNull(),\n agentId: uuid(\"agent_id\")\n .references(() => agentTable.id, { onDelete: \"cascade\" })\n .notNull(),\n roomId: uuid(\"room_id\")\n .references(() => roomTable.id, { onDelete: \"cascade\" })\n .notNull(),\n worldId: uuid(\"world_id\").references(() => worldTable.id, {\n onDelete: \"cascade\",\n }),\n sourceEntityId: uuid(\"source_entity_id\").references(() => entityTable.id, {\n onDelete: \"cascade\",\n }),\n\n // Data\n type: text(\"type\").notNull(),\n data: jsonb(\"data\").default(sql`'{}'::jsonb`),\n\n // Timestamps\n createdAt: timestamp(\"created_at\").default(sql`now()`).notNull(),\n});\n",
43
+ "import { sql } from \"drizzle-orm\";\nimport { jsonb, pgTable, text, timestamp, uuid } from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\n\n/**\n * Represents a table schema for worlds in the database.\n *\n * @type {PgTable}\n */\n\nexport const worldTable = pgTable(\"worlds\", {\n id: uuid(\"id\").notNull().primaryKey().default(sql`gen_random_uuid()`),\n agentId: uuid(\"agent_id\")\n .notNull()\n .references(() => agentTable.id, { onDelete: \"cascade\" }),\n name: text(\"name\").notNull(),\n metadata: jsonb(\"metadata\"),\n messageServerId: uuid(\"message_server_id\"),\n createdAt: timestamp(\"created_at\").default(sql`now()`).notNull(),\n});\n",
44
+ "import { sql } from \"drizzle-orm\";\nimport {\n index,\n jsonb,\n pgTable,\n primaryKey,\n text,\n timestamp,\n uniqueIndex,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\n\nexport const connectorAccountsTable = pgTable(\n \"connector_accounts\",\n {\n id: uuid(\"id\").primaryKey().default(sql`gen_random_uuid()`).notNull(),\n agentId: uuid(\"agent_id\")\n .notNull()\n .references(() => agentTable.id, { onDelete: \"cascade\" }),\n provider: text(\"provider\").notNull(),\n /**\n * Provider-scoped stable account identity. Callers should prefer provider\n * account id; email/handle are acceptable fallbacks when no id exists.\n */\n accountKey: text(\"account_key\").notNull(),\n externalId: text(\"external_id\"),\n displayName: text(\"display_name\"),\n username: text(\"username\"),\n email: text(\"email\"),\n ownerBindingId: text(\"owner_binding_id\"),\n ownerIdentityId: text(\"owner_identity_id\"),\n role: text(\"role\").notNull().default(\"OWNER\"),\n purpose: jsonb(\"purpose\").$type<string[]>().default(sql`'[\"messaging\"]'::jsonb`).notNull(),\n accessGate: text(\"access_gate\").notNull().default(\"open\"),\n status: text(\"status\").notNull().default(\"connected\"),\n scopes: jsonb(\"scopes\").$type<string[]>().default(sql`'[]'::jsonb`).notNull(),\n capabilities: jsonb(\"capabilities\").$type<string[]>().default(sql`'[]'::jsonb`).notNull(),\n profile: jsonb(\"profile\").$type<Record<string, unknown>>().default(sql`'{}'::jsonb`).notNull(),\n metadata: jsonb(\"metadata\")\n .$type<Record<string, unknown>>()\n .default(sql`'{}'::jsonb`)\n .notNull(),\n connectedAt: timestamp(\"connected_at\", { withTimezone: true }).default(sql`now()`).notNull(),\n lastSyncAt: timestamp(\"last_sync_at\", { withTimezone: true }),\n deletedAt: timestamp(\"deleted_at\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).default(sql`now()`).notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).default(sql`now()`).notNull(),\n },\n (table) => [\n uniqueIndex(\"connector_accounts_agent_provider_account_key_uniq\")\n .on(table.agentId, table.provider, table.accountKey)\n .where(sql`${table.deletedAt} IS NULL`),\n uniqueIndex(\"connector_accounts_agent_provider_external_uniq\")\n .on(table.agentId, table.provider, table.externalId)\n .where(sql`${table.deletedAt} IS NULL`),\n index(\"connector_accounts_agent_provider_idx\").on(table.agentId, table.provider),\n index(\"connector_accounts_status_idx\").on(table.status),\n index(\"connector_accounts_updated_idx\").on(table.updatedAt),\n ]\n);\n\nexport const connectorAccountCredentialsTable = pgTable(\n \"connector_account_credentials\",\n {\n id: uuid(\"id\").primaryKey().default(sql`gen_random_uuid()`).notNull(),\n accountId: uuid(\"account_id\")\n .notNull()\n .references(() => connectorAccountsTable.id, { onDelete: \"cascade\" }),\n agentId: uuid(\"agent_id\")\n .notNull()\n .references(() => agentTable.id, { onDelete: \"cascade\" }),\n provider: text(\"provider\").notNull(),\n credentialType: text(\"credential_type\").notNull(),\n /** Pointer to @elizaos/vault or a password-manager-backed vault entry. */\n vaultRef: text(\"vault_ref\").notNull(),\n metadata: jsonb(\"metadata\")\n .$type<Record<string, unknown>>()\n .default(sql`'{}'::jsonb`)\n .notNull(),\n expiresAt: timestamp(\"expires_at\", { withTimezone: true }),\n lastVerifiedAt: timestamp(\"last_verified_at\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).default(sql`now()`).notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).default(sql`now()`).notNull(),\n },\n (table) => [\n uniqueIndex(\"connector_account_credentials_account_type_uniq\").on(\n table.accountId,\n table.credentialType\n ),\n uniqueIndex(\"connector_account_credentials_agent_provider_ref_uniq\").on(\n table.agentId,\n table.provider,\n table.vaultRef\n ),\n index(\"connector_account_credentials_agent_provider_idx\").on(table.agentId, table.provider),\n index(\"connector_account_credentials_expires_idx\").on(table.expiresAt),\n ]\n);\n\nexport const connectorAccountAuditEventsTable = pgTable(\n \"connector_account_audit_events\",\n {\n id: uuid(\"id\").primaryKey().default(sql`gen_random_uuid()`).notNull(),\n accountId: uuid(\"account_id\").references(() => connectorAccountsTable.id, {\n onDelete: \"set null\",\n }),\n agentId: uuid(\"agent_id\")\n .notNull()\n .references(() => agentTable.id, { onDelete: \"cascade\" }),\n provider: text(\"provider\").notNull(),\n actorId: text(\"actor_id\"),\n action: text(\"action\").notNull(),\n outcome: text(\"outcome\").notNull(),\n metadata: jsonb(\"metadata\")\n .$type<Record<string, unknown>>()\n .default(sql`'{}'::jsonb`)\n .notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).default(sql`now()`).notNull(),\n },\n (table) => [\n index(\"connector_account_audit_agent_provider_idx\").on(table.agentId, table.provider),\n index(\"connector_account_audit_account_idx\").on(table.accountId),\n index(\"connector_account_audit_action_idx\").on(table.action),\n index(\"connector_account_audit_created_idx\").on(table.createdAt),\n ]\n);\n\nexport const oauthFlowsTable = pgTable(\n \"oauth_flows\",\n {\n /** SHA-256 hex of the plaintext OAuth state. Plaintext state is never stored. */\n stateHash: text(\"state_hash\").notNull(),\n agentId: uuid(\"agent_id\")\n .notNull()\n .references(() => agentTable.id, { onDelete: \"cascade\" }),\n provider: text(\"provider\").notNull(),\n accountId: uuid(\"account_id\").references(() => connectorAccountsTable.id, {\n onDelete: \"set null\",\n }),\n redirectUri: text(\"redirect_uri\"),\n /** Optional vault ref for PKCE code verifier or provider-specific transient secret. */\n codeVerifierRef: text(\"code_verifier_ref\"),\n scopes: jsonb(\"scopes\").$type<string[]>().default(sql`'[]'::jsonb`).notNull(),\n metadata: jsonb(\"metadata\")\n .$type<Record<string, unknown>>()\n .default(sql`'{}'::jsonb`)\n .notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).default(sql`now()`).notNull(),\n expiresAt: timestamp(\"expires_at\", { withTimezone: true }).notNull(),\n consumedAt: timestamp(\"consumed_at\", { withTimezone: true }),\n consumedBy: text(\"consumed_by\"),\n },\n (table) => [\n primaryKey({\n name: \"oauth_flows_agent_provider_state_pk\",\n columns: [table.agentId, table.provider, table.stateHash],\n }),\n index(\"oauth_flows_agent_provider_idx\").on(table.agentId, table.provider),\n index(\"oauth_flows_account_idx\").on(table.accountId),\n index(\"oauth_flows_expires_idx\").on(table.expiresAt),\n index(\"oauth_flows_consumed_idx\").on(table.consumedAt),\n ]\n);\n",
45
+ "import { sql } from \"drizzle-orm\";\nimport {\n boolean,\n foreignKey,\n index,\n jsonb,\n pgTable,\n real,\n text,\n timestamp,\n unique,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\nimport { entityTable } from \"./entity\";\n\n/**\n * Strengthened (platform, handle) claim attached to an entity. Re-observations\n * of the same pair bump confidence and append to evidence_message_ids rather\n * than producing duplicate rows.\n */\nexport const entityIdentityTable = pgTable(\n \"entity_identities\",\n {\n id: uuid(\"id\").notNull().primaryKey().default(sql`gen_random_uuid()`),\n entityId: uuid(\"entity_id\")\n .notNull()\n .references(() => entityTable.id, { onDelete: \"cascade\" }),\n agentId: uuid(\"agent_id\")\n .notNull()\n .references(() => agentTable.id, { onDelete: \"cascade\" }),\n platform: text(\"platform\").notNull(),\n handle: text(\"handle\").notNull(),\n verified: boolean(\"verified\").notNull().default(false),\n confidence: real(\"confidence\").notNull().default(0),\n source: text(\"source\"),\n firstSeen: timestamp(\"first_seen\", { withTimezone: true }).notNull().default(sql`now()`),\n lastSeen: timestamp(\"last_seen\", { withTimezone: true }).notNull().default(sql`now()`),\n evidenceMessageIds: jsonb(\"evidence_message_ids\").$type<string[]>(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull().default(sql`now()`),\n },\n (table) => [\n index(\"idx_entity_identities_entity\").on(table.entityId),\n index(\"idx_entity_identities_platform_handle\").on(table.platform, table.handle),\n unique(\"unique_entity_identity\").on(\n table.entityId,\n table.platform,\n table.handle,\n table.agentId\n ),\n foreignKey({\n name: \"fk_entity_identities_entity\",\n columns: [table.entityId],\n foreignColumns: [entityTable.id],\n }).onDelete(\"cascade\"),\n foreignKey({\n name: \"fk_entity_identities_agent\",\n columns: [table.agentId],\n foreignColumns: [agentTable.id],\n }).onDelete(\"cascade\"),\n ]\n);\n\nexport const entityMergeCandidateTable = pgTable(\n \"entity_merge_candidates\",\n {\n id: uuid(\"id\").notNull().primaryKey().default(sql`gen_random_uuid()`),\n agentId: uuid(\"agent_id\")\n .notNull()\n .references(() => agentTable.id, { onDelete: \"cascade\" }),\n entityA: uuid(\"entity_a\")\n .notNull()\n .references(() => entityTable.id, { onDelete: \"cascade\" }),\n entityB: uuid(\"entity_b\")\n .notNull()\n .references(() => entityTable.id, { onDelete: \"cascade\" }),\n confidence: real(\"confidence\").notNull().default(0),\n evidence: jsonb(\"evidence\"),\n status: text(\"status\").notNull().default(\"pending\"),\n proposedAt: timestamp(\"proposed_at\", { withTimezone: true }).notNull().default(sql`now()`),\n resolvedAt: timestamp(\"resolved_at\", { withTimezone: true }),\n },\n (table) => [\n index(\"idx_entity_merge_candidates_status\").on(table.status),\n index(\"idx_entity_merge_candidates_pair\").on(table.entityA, table.entityB),\n foreignKey({\n name: \"fk_entity_merge_candidates_a\",\n columns: [table.entityA],\n foreignColumns: [entityTable.id],\n }).onDelete(\"cascade\"),\n foreignKey({\n name: \"fk_entity_merge_candidates_b\",\n columns: [table.entityB],\n foreignColumns: [entityTable.id],\n }).onDelete(\"cascade\"),\n foreignKey({\n name: \"fk_entity_merge_candidates_agent\",\n columns: [table.agentId],\n foreignColumns: [agentTable.id],\n }).onDelete(\"cascade\"),\n ]\n);\n\n/**\n * Pending fact refinement proposals (contradictions / merges) surfaced from\n * the FactRefinementEvaluator. The Facts tab in the UI lets users accept\n * or reject these.\n */\nexport const factCandidateTable = pgTable(\n \"fact_candidates\",\n {\n id: uuid(\"id\").notNull().primaryKey().default(sql`gen_random_uuid()`),\n agentId: uuid(\"agent_id\")\n .notNull()\n .references(() => agentTable.id, { onDelete: \"cascade\" }),\n entityId: uuid(\"entity_id\")\n .notNull()\n .references(() => entityTable.id, { onDelete: \"cascade\" }),\n kind: text(\"kind\").notNull(),\n existingFactId: uuid(\"existing_fact_id\"),\n proposedText: text(\"proposed_text\").notNull(),\n confidence: real(\"confidence\").notNull().default(0),\n evidence: jsonb(\"evidence\"),\n status: text(\"status\").notNull().default(\"pending\"),\n proposedAt: timestamp(\"proposed_at\", { withTimezone: true }).notNull().default(sql`now()`),\n resolvedAt: timestamp(\"resolved_at\", { withTimezone: true }),\n },\n (table) => [\n index(\"idx_fact_candidates_status\").on(table.status),\n index(\"idx_fact_candidates_entity\").on(table.entityId),\n foreignKey({\n name: \"fk_fact_candidates_entity\",\n columns: [table.entityId],\n foreignColumns: [entityTable.id],\n }).onDelete(\"cascade\"),\n foreignKey({\n name: \"fk_fact_candidates_agent\",\n columns: [table.agentId],\n foreignColumns: [agentTable.id],\n }).onDelete(\"cascade\"),\n ]\n);\n",
46
+ "import { sql } from \"drizzle-orm\";\nimport { foreignKey, jsonb, pgTable, text, timestamp, uuid } from \"drizzle-orm/pg-core\";\nimport { entityTable } from \"./entity\";\nimport { roomTable } from \"./room\";\n\n/**\n * Represents a PostgreSQL table for storing logs.\n *\n * @type {Table}\n */\n\nexport const logTable = pgTable(\n \"logs\",\n {\n id: uuid(\"id\").defaultRandom().notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).default(sql`now()`).notNull(),\n entityId: uuid(\"entity_id\")\n .notNull()\n .references(() => entityTable.id, { onDelete: \"cascade\" }),\n body: jsonb(\"body\").notNull(),\n type: text(\"type\").notNull(),\n roomId: uuid(\"room_id\")\n .notNull()\n .references(() => roomTable.id, { onDelete: \"cascade\" }),\n },\n (table) => [\n foreignKey({\n name: \"fk_room\",\n columns: [table.roomId],\n foreignColumns: [roomTable.id],\n }).onDelete(\"cascade\"),\n foreignKey({\n name: \"fk_user\",\n columns: [table.entityId],\n foreignColumns: [entityTable.id],\n }).onDelete(\"cascade\"),\n ]\n);\n",
47
+ "import { sql } from \"drizzle-orm\";\nimport { index, integer, jsonb, pgTable, real, text, timestamp, uuid } from \"drizzle-orm/pg-core\";\n\nexport const longTermMemories = pgTable(\n \"long_term_memories\",\n {\n id: uuid(\"id\").primaryKey().notNull(),\n agentId: uuid(\"agent_id\").notNull(),\n entityId: uuid(\"entity_id\").notNull(),\n category: text(\"category\").notNull(),\n content: text(\"content\").notNull(),\n metadata: jsonb(\"metadata\"),\n embedding: real(\"embedding\").array(),\n confidence: real(\"confidence\").default(1),\n source: text(\"source\"),\n createdAt: timestamp(\"created_at\").default(sql`now()`).notNull(),\n updatedAt: timestamp(\"updated_at\").default(sql`now()`).notNull(),\n lastAccessedAt: timestamp(\"last_accessed_at\"),\n accessCount: integer(\"access_count\").default(0),\n },\n (table) => [\n index(\"long_term_memories_agent_entity_idx\").on(table.agentId, table.entityId),\n index(\"long_term_memories_category_idx\").on(table.category),\n index(\"long_term_memories_confidence_idx\").on(table.confidence),\n index(\"long_term_memories_created_at_idx\").on(table.createdAt),\n ]\n);\n",
48
+ "import { sql } from \"drizzle-orm\";\nimport { index, pgTable, text, timestamp, uuid } from \"drizzle-orm/pg-core\";\n\nexport const memoryAccessLogs = pgTable(\n \"memory_access_logs\",\n {\n id: uuid(\"id\").primaryKey().notNull(),\n memoryId: uuid(\"memory_id\").notNull(),\n memoryType: text(\"memory_type\").notNull(),\n agentId: uuid(\"agent_id\").notNull(),\n accessType: text(\"access_type\").notNull(),\n accessedAt: timestamp(\"accessed_at\").default(sql`now()`).notNull(),\n },\n (table) => [\n index(\"memory_access_logs_memory_id_idx\").on(table.memoryId),\n index(\"memory_access_logs_agent_id_idx\").on(table.agentId),\n index(\"memory_access_logs_accessed_at_idx\").on(table.accessedAt),\n ]\n);\n",
49
+ "import { sql } from \"drizzle-orm\";\nimport { type AnyPgColumn, jsonb, pgTable, text, timestamp } from \"drizzle-orm/pg-core\";\nimport { channelTable } from \"./channel\";\n\nexport const messageTable = pgTable(\"central_messages\", {\n id: text(\"id\").primaryKey(), // UUID stored as text\n channelId: text(\"channel_id\")\n .notNull()\n .references(() => channelTable.id, { onDelete: \"cascade\" }),\n authorId: text(\"author_id\").notNull(),\n content: text(\"content\").notNull(),\n rawMessage: jsonb(\"raw_message\"),\n inReplyToRootMessageId: text(\"in_reply_to_root_message_id\").references(\n (): AnyPgColumn => messageTable.id,\n {\n onDelete: \"set null\",\n }\n ),\n sourceType: text(\"source_type\"),\n sourceId: text(\"source_id\"),\n metadata: jsonb(\"metadata\"),\n createdAt: timestamp(\"created_at\", { mode: \"date\" }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n updatedAt: timestamp(\"updated_at\", { mode: \"date\" }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n});\n",
50
+ "import { pgTable, primaryKey, uuid } from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\nimport { messageServerTable } from \"./messageServer\";\n\nexport const messageServerAgentsTable = pgTable(\n \"message_server_agents\",\n {\n messageServerId: uuid(\"message_server_id\")\n .notNull()\n .references(() => messageServerTable.id, { onDelete: \"cascade\" }),\n agentId: uuid(\"agent_id\")\n .notNull()\n .references(() => agentTable.id, { onDelete: \"cascade\" }),\n },\n (table) => [primaryKey({ columns: [table.messageServerId, table.agentId] })]\n);\n",
51
+ "import { sql } from \"drizzle-orm\";\nimport { index, jsonb, pgTable, text, timestamp, uniqueIndex, uuid } from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\n\n/**\n * Represents the allowlist of approved senders for each channel.\n * Senders in this list are permitted to send DMs to the bot.\n */\nexport const pairingAllowlistTable = pgTable(\n \"pairing_allowlist\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n /** The messaging channel (telegram, discord, whatsapp, etc.) */\n channel: text(\"channel\").notNull(),\n /** Approved sender identifier */\n senderId: text(\"sender_id\").notNull(),\n /** When the entry was added */\n createdAt: timestamp(\"created_at\", { withTimezone: true }).default(sql`now()`).notNull(),\n /** Optional metadata about the approved sender */\n metadata: jsonb(\"metadata\").default(sql`'{}'::jsonb`),\n /** Agent ID this allowlist belongs to */\n agentId: uuid(\"agent_id\")\n .notNull()\n .references(() => agentTable.id, { onDelete: \"cascade\" }),\n },\n (table) => [\n // Index for looking up allowlist by channel and agent\n index(\"pairing_allowlist_channel_agent_idx\").on(table.channel, table.agentId),\n // Unique constraint to prevent duplicate entries\n uniqueIndex(\"pairing_allowlist_sender_channel_agent_idx\").on(\n table.senderId,\n table.channel,\n table.agentId\n ),\n ]\n);\n",
52
+ "import { sql } from \"drizzle-orm\";\nimport { index, jsonb, pgTable, text, timestamp, uniqueIndex, uuid } from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\n\n/**\n * Represents pending pairing requests from users trying to access the bot via DM.\n * Requests are stored temporarily until approved or expired.\n */\nexport const pairingRequestTable = pgTable(\n \"pairing_requests\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n /** The messaging channel (telegram, discord, whatsapp, etc.) */\n channel: text(\"channel\").notNull(),\n /** User identifier on the channel (userId, phoneNumber, etc.) */\n senderId: text(\"sender_id\").notNull(),\n /** Human-friendly pairing code */\n code: text(\"code\").notNull(),\n /** When the request was created */\n createdAt: timestamp(\"created_at\", { withTimezone: true }).default(sql`now()`).notNull(),\n /** When the request was last seen/updated */\n lastSeenAt: timestamp(\"last_seen_at\", { withTimezone: true }).default(sql`now()`).notNull(),\n /** Optional metadata about the requester */\n metadata: jsonb(\"metadata\").default(sql`'{}'::jsonb`),\n /** Agent ID that received this request */\n agentId: uuid(\"agent_id\")\n .notNull()\n .references(() => agentTable.id, { onDelete: \"cascade\" }),\n },\n (table) => [\n // Index for looking up requests by channel and agent\n index(\"pairing_requests_channel_agent_idx\").on(table.channel, table.agentId),\n // Unique constraint on code per channel/agent to prevent duplicates\n uniqueIndex(\"pairing_requests_code_channel_agent_idx\").on(\n table.code,\n table.channel,\n table.agentId\n ),\n // Unique constraint on sender per channel/agent (one request per user)\n uniqueIndex(\"pairing_requests_sender_channel_agent_idx\").on(\n table.senderId,\n table.channel,\n table.agentId\n ),\n ]\n);\n",
53
+ "import { sql } from \"drizzle-orm\";\nimport { foreignKey, index, pgTable, text, timestamp, uuid } from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\nimport { entityTable } from \"./entity\";\nimport { roomTable } from \"./room\";\n\n/**\n * Defines the schema for the \"participants\" table in the database.\n *\n * @type {import('knex').TableBuilder}\n */\nexport const participantTable = pgTable(\n \"participants\",\n {\n id: uuid(\"id\").notNull().primaryKey().default(sql`gen_random_uuid()`),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).default(sql`now()`).notNull(),\n entityId: uuid(\"entity_id\").references(() => entityTable.id, {\n onDelete: \"cascade\",\n }),\n roomId: uuid(\"room_id\").references(() => roomTable.id, {\n onDelete: \"cascade\",\n }),\n agentId: uuid(\"agent_id\").references(() => agentTable.id, {\n onDelete: \"cascade\",\n }),\n roomState: text(\"room_state\"),\n },\n (table) => [\n // unique(\"participants_user_room_agent_unique\").on(table.entityId, table.roomId, table.agentId),\n index(\"idx_participants_user\").on(table.entityId),\n index(\"idx_participants_room\").on(table.roomId),\n foreignKey({\n name: \"fk_room\",\n columns: [table.roomId],\n foreignColumns: [roomTable.id],\n }).onDelete(\"cascade\"),\n foreignKey({\n name: \"fk_user\",\n columns: [table.entityId],\n foreignColumns: [entityTable.id],\n }).onDelete(\"cascade\"),\n ]\n);\n",
54
+ "import { sql } from \"drizzle-orm\";\nimport {\n foreignKey,\n index,\n jsonb,\n pgTable,\n text,\n timestamp,\n unique,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\nimport { entityTable } from \"./entity\";\n\n/**\n * Defines the relationshipTable containing information about relationships between entities and agents.\n * @type {import('knex').TableBuilder}\n */\nexport const relationshipTable = pgTable(\n \"relationships\",\n {\n id: uuid(\"id\").notNull().primaryKey().default(sql`gen_random_uuid()`),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).default(sql`now()`).notNull(),\n sourceEntityId: uuid(\"source_entity_id\")\n .notNull()\n .references(() => entityTable.id, { onDelete: \"cascade\" }),\n targetEntityId: uuid(\"target_entity_id\")\n .notNull()\n .references(() => entityTable.id, { onDelete: \"cascade\" }),\n agentId: uuid(\"agent_id\")\n .notNull()\n .references(() => agentTable.id, { onDelete: \"cascade\" }),\n tags: text(\"tags\").array(),\n metadata: jsonb(\"metadata\"),\n },\n (table) => [\n index(\"idx_relationships_users\").on(table.sourceEntityId, table.targetEntityId),\n unique(\"unique_relationship\").on(table.sourceEntityId, table.targetEntityId, table.agentId),\n foreignKey({\n name: \"fk_user_a\",\n columns: [table.sourceEntityId],\n foreignColumns: [entityTable.id],\n }).onDelete(\"cascade\"),\n foreignKey({\n name: \"fk_user_b\",\n columns: [table.targetEntityId],\n foreignColumns: [entityTable.id],\n }).onDelete(\"cascade\"),\n ]\n);\n",
55
+ "import { sql } from \"drizzle-orm\";\nimport { index, integer, jsonb, pgTable, real, text, timestamp, uuid } from \"drizzle-orm/pg-core\";\n\nexport const sessionSummaries = pgTable(\n \"session_summaries\",\n {\n id: uuid(\"id\").primaryKey().notNull(),\n agentId: uuid(\"agent_id\").notNull(),\n roomId: uuid(\"room_id\").notNull(),\n entityId: uuid(\"entity_id\"),\n summary: text(\"summary\").notNull(),\n messageCount: integer(\"message_count\").notNull(),\n lastMessageOffset: integer(\"last_message_offset\").default(0).notNull(),\n startTime: timestamp(\"start_time\").notNull(),\n endTime: timestamp(\"end_time\").notNull(),\n topics: jsonb(\"topics\").$type<string[]>(),\n metadata: jsonb(\"metadata\"),\n embedding: real(\"embedding\").array(),\n createdAt: timestamp(\"created_at\").default(sql`now()`).notNull(),\n updatedAt: timestamp(\"updated_at\").default(sql`now()`).notNull(),\n },\n (table) => [\n index(\"session_summaries_agent_room_idx\").on(table.agentId, table.roomId),\n index(\"session_summaries_entity_idx\").on(table.entityId),\n index(\"session_summaries_start_time_idx\").on(table.startTime),\n ]\n);\n",
56
+ "import { sql } from \"drizzle-orm\";\nimport { jsonb, pgTable, text, timestamp, uuid } from \"drizzle-orm/pg-core\";\nimport { agentTable } from \"./agent\";\n\n/**\n * Represents a table schema for tasks in the database.\n *\n * @type {PgTable}\n */\nexport const taskTable = pgTable(\"tasks\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n name: text(\"name\").notNull(),\n description: text(\"description\"),\n roomId: uuid(\"room_id\"),\n worldId: uuid(\"world_id\"),\n entityId: uuid(\"entity_id\"),\n agentId: uuid(\"agent_id\")\n .notNull()\n .references(() => agentTable.id, { onDelete: \"cascade\" }),\n tags: text(\"tags\").array().default(sql`'{}'::text[]`),\n metadata: jsonb(\"metadata\").default(sql`'{}'::jsonb`),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).defaultNow(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).defaultNow(),\n});\n",
57
+ "import { createHash } from \"node:crypto\";\nimport type {\n AppendConnectorAccountAuditEventParams,\n ConnectorAccountAuditEventRecord,\n ConnectorAccountAuditOutcome,\n ConnectorAccountCredentialRefRecord,\n ConnectorAccountJsonObject,\n ConnectorAccountRecord,\n ConnectorOwnerBindingLookup,\n ConnectorOwnerBindingRecord,\n ConsumeOAuthFlowStateParams,\n CreateOAuthFlowStateParams,\n DeleteConnectorAccountParams,\n GetConnectorAccountCredentialRefParams,\n GetConnectorAccountParams,\n JsonValue,\n ListConnectorAccountCredentialRefsParams,\n ListConnectorAccountsParams,\n OAuthFlowRecord,\n SetConnectorAccountCredentialRefParams,\n UpsertConnectorAccountParams,\n UUID,\n} from \"@elizaos/core\";\nimport { and, desc, eq, gt, isNull, type SQL, sql } from \"drizzle-orm\";\nimport {\n authOwnerBindingTable,\n connectorAccountAuditEventsTable,\n connectorAccountCredentialsTable,\n connectorAccountsTable,\n oauthFlowsTable,\n} from \"../schema/index\";\nimport type { DrizzleDatabase } from \"../types\";\nimport type { Store, StoreContext } from \"./types\";\n\nconst CONNECTOR_AUDIT_REDACTED = \"[REDACTED]\";\nconst CONNECTOR_AUDIT_SECRET_KEY_PATTERN =\n /(access|refresh|id)?_?token|secret|password|credential|authorization|cookie|code[_-]?verifier|codeVerifier|client[_-]?secret|api_?key|private_?key|oauth_?code|state/i;\n\nfunction redactConnectorAuditValue(value: unknown): JsonValue {\n if (value === null || value === undefined) return null;\n if (Array.isArray(value)) {\n return value.map(redactConnectorAuditValue) as JsonValue;\n }\n if (typeof value === \"object\") {\n const redacted: ConnectorAccountJsonObject = {};\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n redacted[key] = CONNECTOR_AUDIT_SECRET_KEY_PATTERN.test(key)\n ? CONNECTOR_AUDIT_REDACTED\n : redactConnectorAuditValue(item);\n }\n return redacted;\n }\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return value;\n }\n return String(value);\n}\n\nfunction redactConnectorAuditMetadata(\n metadata: Record<string, unknown> | undefined\n): ConnectorAccountJsonObject {\n return redactConnectorAuditValue(metadata ?? {}) as ConnectorAccountJsonObject;\n}\n\nfunction sha256Hex(value: string): string {\n return createHash(\"sha256\").update(value, \"utf8\").digest(\"hex\");\n}\n\nfunction dateToMillis(value: Date | null | undefined): number | null {\n if (value == null) return null;\n return value.getTime();\n}\n\nfunction paramDateToDate(value: number | Date | null | undefined): Date | null | undefined {\n if (value === undefined) return undefined;\n if (value === null) return null;\n return value instanceof Date ? value : new Date(value);\n}\n\nfunction asJsonObject(value: unknown): ConnectorAccountJsonObject {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return value as ConnectorAccountJsonObject;\n }\n return {};\n}\n\nfunction asStringArray(value: unknown): string[] {\n return Array.isArray(value) ? value.map((entry) => String(entry)) : [];\n}\n\ntype ConnectorAccountRow = typeof connectorAccountsTable.$inferSelect;\ntype ConnectorCredentialRow = typeof connectorAccountCredentialsTable.$inferSelect;\ntype ConnectorAuditRow = typeof connectorAccountAuditEventsTable.$inferSelect;\ntype OAuthFlowRow = typeof oauthFlowsTable.$inferSelect;\n\ninterface GetOAuthFlowStateParams {\n state?: string;\n stateHash?: string;\n flowId?: string;\n agentId?: string;\n provider?: string;\n includeConsumed?: boolean;\n includeExpired?: boolean;\n now?: number | Date;\n}\n\ninterface UpdateOAuthFlowStateParams {\n state?: string;\n stateHash?: string;\n flowId?: string;\n agentId?: string;\n provider?: string;\n accountId?: string | null;\n redirectUri?: string | null;\n codeVerifierRef?: string | null;\n scopes?: string[];\n metadata?: ConnectorAccountJsonObject;\n expiresAt?: number | Date;\n consumedAt?: number | Date | null;\n consumedBy?: string | null;\n}\n\ninterface DeleteOAuthFlowStateParams {\n state?: string;\n stateHash?: string;\n flowId?: string;\n agentId?: string;\n provider?: string;\n}\n\nfunction mapAccountRow(row: ConnectorAccountRow): ConnectorAccountRecord {\n return {\n id: row.id as UUID,\n agentId: row.agentId as UUID,\n provider: row.provider,\n accountKey: row.accountKey,\n externalId: row.externalId ?? null,\n displayName: row.displayName ?? null,\n username: row.username ?? null,\n email: row.email ?? null,\n ownerBindingId: row.ownerBindingId ?? null,\n ownerIdentityId: row.ownerIdentityId ?? null,\n role: row.role,\n purpose: asStringArray(row.purpose),\n accessGate: row.accessGate,\n status: row.status,\n scopes: asStringArray(row.scopes),\n capabilities: asStringArray(row.capabilities),\n profile: asJsonObject(row.profile),\n metadata: asJsonObject(row.metadata),\n connectedAt: row.connectedAt.getTime(),\n lastSyncAt: dateToMillis(row.lastSyncAt),\n deletedAt: dateToMillis(row.deletedAt),\n createdAt: row.createdAt.getTime(),\n updatedAt: row.updatedAt.getTime(),\n };\n}\n\nfunction mapCredentialRow(row: ConnectorCredentialRow): ConnectorAccountCredentialRefRecord {\n return {\n id: row.id as UUID,\n accountId: row.accountId as UUID,\n agentId: row.agentId as UUID,\n provider: row.provider,\n credentialType: row.credentialType,\n vaultRef: row.vaultRef,\n metadata: asJsonObject(row.metadata),\n expiresAt: dateToMillis(row.expiresAt),\n lastVerifiedAt: dateToMillis(row.lastVerifiedAt),\n createdAt: row.createdAt.getTime(),\n updatedAt: row.updatedAt.getTime(),\n };\n}\n\nfunction mapAuditRow(row: ConnectorAuditRow): ConnectorAccountAuditEventRecord {\n return {\n id: row.id as UUID,\n accountId: (row.accountId ?? null) as UUID | null,\n agentId: row.agentId as UUID,\n provider: row.provider,\n actorId: row.actorId ?? null,\n action: row.action,\n outcome: row.outcome as ConnectorAccountAuditOutcome,\n metadata: asJsonObject(row.metadata),\n createdAt: row.createdAt.getTime(),\n };\n}\n\nfunction mapOAuthFlowRow(row: OAuthFlowRow): OAuthFlowRecord {\n return {\n stateHash: row.stateHash,\n agentId: row.agentId as UUID,\n provider: row.provider,\n accountId: (row.accountId ?? null) as UUID | null,\n redirectUri: row.redirectUri ?? null,\n codeVerifierRef: row.codeVerifierRef ?? null,\n scopes: asStringArray(row.scopes),\n metadata: asJsonObject(row.metadata),\n createdAt: row.createdAt.getTime(),\n expiresAt: row.expiresAt.getTime(),\n consumedAt: dateToMillis(row.consumedAt),\n consumedBy: row.consumedBy ?? null,\n };\n}\n\nexport interface ListConnectorAccountAuditEventsParams {\n agentId?: string;\n provider?: string;\n accountId?: string;\n action?: string;\n outcome?: string;\n limit?: number;\n}\n\nexport class ConnectorAccountStore implements Store {\n constructor(public readonly ctx: StoreContext) {}\n\n private get db(): DrizzleDatabase {\n return this.ctx.getDb();\n }\n\n async listAccounts(params: ListConnectorAccountsParams = {}): Promise<ConnectorAccountRecord[]> {\n return this.ctx.withRetry(async () => {\n const agentId = (params.agentId ?? this.ctx.agentId) as UUID;\n const conditions = [\n eq(connectorAccountsTable.agentId, agentId),\n isNull(connectorAccountsTable.deletedAt),\n ];\n if (params.provider) {\n conditions.push(eq(connectorAccountsTable.provider, params.provider));\n }\n if (params.status) {\n conditions.push(eq(connectorAccountsTable.status, params.status));\n }\n const limit = params.limit ?? 100;\n const offset = params.offset ?? 0;\n const rows = await this.db\n .select()\n .from(connectorAccountsTable)\n .where(and(...conditions))\n .orderBy(desc(connectorAccountsTable.updatedAt), connectorAccountsTable.id)\n .limit(limit)\n .offset(offset);\n return rows.map(mapAccountRow);\n }, \"ConnectorAccountStore.listAccounts\");\n }\n\n async getAccount(params: GetConnectorAccountParams): Promise<ConnectorAccountRecord | null> {\n return this.ctx.withRetry(async () => {\n const agentId = (params.agentId ?? this.ctx.agentId) as UUID;\n const conditions = [\n eq(connectorAccountsTable.agentId, agentId),\n isNull(connectorAccountsTable.deletedAt),\n ];\n if (params.id) {\n conditions.push(eq(connectorAccountsTable.id, params.id));\n } else {\n if (!params.provider || !params.accountKey) {\n throw new Error(\"getConnectorAccount requires id or provider + accountKey\");\n }\n conditions.push(\n eq(connectorAccountsTable.provider, params.provider),\n eq(connectorAccountsTable.accountKey, params.accountKey)\n );\n }\n const rows = await this.db\n .select()\n .from(connectorAccountsTable)\n .where(and(...conditions))\n .limit(1);\n const row = rows[0];\n return row ? mapAccountRow(row) : null;\n }, \"ConnectorAccountStore.getAccount\");\n }\n\n async upsertAccount(params: UpsertConnectorAccountParams): Promise<ConnectorAccountRecord> {\n return this.ctx.withRetry(async () => {\n const agentId = (params.agentId ?? this.ctx.agentId) as UUID;\n const connectedAt = paramDateToDate(params.connectedAt);\n const lastSyncAt = paramDateToDate(params.lastSyncAt);\n const deletedAt = paramDateToDate(params.deletedAt);\n\n const insertValues: typeof connectorAccountsTable.$inferInsert = {\n agentId,\n provider: params.provider,\n accountKey: params.accountKey,\n externalId: params.externalId ?? null,\n displayName: params.displayName ?? null,\n username: params.username ?? null,\n email: params.email ?? null,\n ownerBindingId: params.ownerBindingId ?? null,\n ownerIdentityId: params.ownerIdentityId ?? null,\n role: params.role ?? \"OWNER\",\n purpose: params.purpose ? [...params.purpose] : [\"messaging\"],\n accessGate: params.accessGate ?? \"open\",\n status: params.status ?? \"connected\",\n scopes: params.scopes ? [...params.scopes] : [],\n capabilities: params.capabilities ? [...params.capabilities] : [],\n profile: params.profile ?? {},\n metadata: params.metadata ?? {},\n ...(params.id ? { id: params.id } : {}),\n ...(connectedAt !== undefined ? { connectedAt: connectedAt ?? new Date() } : {}),\n ...(lastSyncAt !== undefined ? { lastSyncAt } : {}),\n ...(deletedAt !== undefined ? { deletedAt } : {}),\n };\n\n const updateSet: Record<string, unknown> = {\n updatedAt: new Date(),\n };\n if (params.externalId !== undefined) updateSet.externalId = params.externalId;\n if (params.displayName !== undefined) updateSet.displayName = params.displayName;\n if (params.username !== undefined) updateSet.username = params.username;\n if (params.email !== undefined) updateSet.email = params.email;\n if (params.ownerBindingId !== undefined) updateSet.ownerBindingId = params.ownerBindingId;\n if (params.ownerIdentityId !== undefined) updateSet.ownerIdentityId = params.ownerIdentityId;\n if (params.role !== undefined) updateSet.role = params.role;\n if (params.purpose !== undefined) updateSet.purpose = [...params.purpose];\n if (params.accessGate !== undefined) updateSet.accessGate = params.accessGate;\n if (params.status !== undefined) updateSet.status = params.status;\n if (params.scopes !== undefined) updateSet.scopes = [...params.scopes];\n if (params.capabilities !== undefined) updateSet.capabilities = [...params.capabilities];\n if (params.profile !== undefined) updateSet.profile = params.profile;\n if (params.metadata !== undefined) updateSet.metadata = params.metadata;\n if (connectedAt !== undefined && connectedAt !== null) {\n updateSet.connectedAt = connectedAt;\n }\n if (lastSyncAt !== undefined) updateSet.lastSyncAt = lastSyncAt;\n updateSet.deletedAt = deletedAt === undefined ? null : deletedAt;\n\n if (params.id) {\n const existing = await this.db\n .select({ id: connectorAccountsTable.id })\n .from(connectorAccountsTable)\n .where(\n and(\n eq(connectorAccountsTable.agentId, agentId),\n eq(connectorAccountsTable.id, params.id),\n isNull(connectorAccountsTable.deletedAt)\n )\n )\n .limit(1);\n if (existing.length > 0) {\n const updated = await this.db\n .update(connectorAccountsTable)\n .set({\n ...updateSet,\n accountKey: params.accountKey,\n })\n .where(\n and(\n eq(connectorAccountsTable.agentId, agentId),\n eq(connectorAccountsTable.id, params.id)\n )\n )\n .returning();\n const row = updated[0];\n if (!row) {\n throw new Error(\"Failed to update connector account\");\n }\n return mapAccountRow(row);\n }\n }\n\n const inserted = await this.db\n .insert(connectorAccountsTable)\n .values(insertValues)\n .onConflictDoUpdate({\n target: [\n connectorAccountsTable.agentId,\n connectorAccountsTable.provider,\n connectorAccountsTable.accountKey,\n ],\n targetWhere: sql`${connectorAccountsTable.deletedAt} IS NULL`,\n set: updateSet,\n })\n .returning();\n\n const row = inserted[0];\n if (!row) {\n throw new Error(\"Failed to upsert connector account\");\n }\n return mapAccountRow(row);\n }, \"ConnectorAccountStore.upsertAccount\");\n }\n\n async deleteAccount(params: DeleteConnectorAccountParams): Promise<boolean> {\n return this.ctx.withRetry(async () => {\n const agentId = (params.agentId ?? this.ctx.agentId) as UUID;\n const conditions = [eq(connectorAccountsTable.agentId, agentId)];\n if (params.id) {\n conditions.push(eq(connectorAccountsTable.id, params.id));\n } else {\n if (!params.provider || !params.accountKey) {\n throw new Error(\"deleteConnectorAccount requires id or provider + accountKey\");\n }\n conditions.push(\n eq(connectorAccountsTable.provider, params.provider),\n eq(connectorAccountsTable.accountKey, params.accountKey)\n );\n }\n const now = new Date();\n const updated = await this.db\n .update(connectorAccountsTable)\n .set({ deletedAt: now, status: \"disabled\", updatedAt: now })\n .where(and(...conditions))\n .returning();\n return updated.length > 0;\n }, \"ConnectorAccountStore.deleteAccount\");\n }\n\n async findOwnerBinding(\n params: ConnectorOwnerBindingLookup\n ): Promise<ConnectorOwnerBindingRecord | null> {\n return this.ctx.withRetry(async () => {\n if (!params.instanceId) {\n return null;\n }\n const conditions = [\n eq(authOwnerBindingTable.connector, params.connector),\n eq(authOwnerBindingTable.externalId, params.externalId),\n eq(authOwnerBindingTable.instanceId, params.instanceId),\n ];\n const rows = await this.db\n .select()\n .from(authOwnerBindingTable)\n .where(and(...conditions))\n .limit(1);\n const row = rows[0];\n return row\n ? {\n id: row.id,\n identityId: row.identityId,\n connector: row.connector,\n externalId: row.externalId,\n displayHandle: row.displayHandle,\n instanceId: row.instanceId,\n verifiedAt: Number(row.verifiedAt),\n }\n : null;\n }, \"ConnectorAccountStore.findOwnerBinding\");\n }\n\n async setCredentialRef(\n params: SetConnectorAccountCredentialRefParams\n ): Promise<ConnectorAccountCredentialRefRecord> {\n return this.ctx.withRetry(async () => {\n const account = await this.getAccount({ id: params.accountId });\n if (!account) {\n throw new Error(`Connector account not found: ${params.accountId}`);\n }\n const expiresAt = paramDateToDate(params.expiresAt);\n const lastVerifiedAt = paramDateToDate(params.lastVerifiedAt);\n\n const insertValues: typeof connectorAccountCredentialsTable.$inferInsert = {\n accountId: params.accountId,\n agentId: account.agentId,\n provider: account.provider,\n credentialType: params.credentialType,\n vaultRef: params.vaultRef,\n metadata: params.metadata ?? {},\n ...(expiresAt !== undefined ? { expiresAt } : {}),\n ...(lastVerifiedAt !== undefined ? { lastVerifiedAt } : {}),\n };\n\n const updateSet: Record<string, unknown> = {\n vaultRef: params.vaultRef,\n updatedAt: new Date(),\n };\n if (params.metadata !== undefined) updateSet.metadata = params.metadata;\n if (expiresAt !== undefined) updateSet.expiresAt = expiresAt;\n if (lastVerifiedAt !== undefined) updateSet.lastVerifiedAt = lastVerifiedAt;\n\n const inserted = await this.db\n .insert(connectorAccountCredentialsTable)\n .values(insertValues)\n .onConflictDoUpdate({\n target: [\n connectorAccountCredentialsTable.accountId,\n connectorAccountCredentialsTable.credentialType,\n ],\n set: updateSet,\n })\n .returning();\n\n const row = inserted[0];\n if (!row) {\n throw new Error(\"Failed to upsert connector account credential ref\");\n }\n return mapCredentialRow(row);\n }, \"ConnectorAccountStore.setCredentialRef\");\n }\n\n async getCredentialRef(\n params: GetConnectorAccountCredentialRefParams\n ): Promise<ConnectorAccountCredentialRefRecord | null> {\n return this.ctx.withRetry(async () => {\n const account = await this.getAccount({ id: params.accountId });\n if (!account) return null;\n const rows = await this.db\n .select()\n .from(connectorAccountCredentialsTable)\n .where(\n and(\n eq(connectorAccountCredentialsTable.agentId, this.ctx.agentId as UUID),\n eq(connectorAccountCredentialsTable.accountId, params.accountId),\n eq(connectorAccountCredentialsTable.credentialType, params.credentialType)\n )\n )\n .limit(1);\n const row = rows[0];\n return row ? mapCredentialRow(row) : null;\n }, \"ConnectorAccountStore.getCredentialRef\");\n }\n\n async listCredentialRefs(\n params: ListConnectorAccountCredentialRefsParams\n ): Promise<ConnectorAccountCredentialRefRecord[]> {\n return this.ctx.withRetry(async () => {\n const account = await this.getAccount({ id: params.accountId });\n if (!account) return [];\n const rows = await this.db\n .select()\n .from(connectorAccountCredentialsTable)\n .where(\n and(\n eq(connectorAccountCredentialsTable.agentId, this.ctx.agentId as UUID),\n eq(connectorAccountCredentialsTable.accountId, params.accountId)\n )\n )\n .orderBy(\n desc(connectorAccountCredentialsTable.updatedAt),\n connectorAccountCredentialsTable.id\n );\n return rows.map(mapCredentialRow);\n }, \"ConnectorAccountStore.listCredentialRefs\");\n }\n\n async appendAuditEvent(\n params: AppendConnectorAccountAuditEventParams\n ): Promise<ConnectorAccountAuditEventRecord> {\n return this.ctx.withRetry(async () => {\n let agentId = (params.agentId ?? this.ctx.agentId) as UUID;\n let provider = params.provider;\n if (params.accountId && (!params.agentId || !provider)) {\n const account = await this.getAccount({ id: params.accountId });\n if (!account) {\n throw new Error(`Connector account not found: ${params.accountId}`);\n }\n agentId = account.agentId;\n provider = account.provider;\n }\n if (!provider) {\n throw new Error(\"appendConnectorAccountAuditEvent requires provider or accountId\");\n }\n const createdAt = paramDateToDate(params.createdAt);\n const insertValues: typeof connectorAccountAuditEventsTable.$inferInsert = {\n accountId: params.accountId ?? null,\n agentId,\n provider,\n actorId: params.actorId ?? null,\n action: params.action,\n outcome: params.outcome ?? \"success\",\n metadata: redactConnectorAuditMetadata(params.metadata),\n ...(createdAt ? { createdAt } : {}),\n };\n const inserted = await this.db\n .insert(connectorAccountAuditEventsTable)\n .values(insertValues)\n .returning();\n const row = inserted[0];\n if (!row) {\n throw new Error(\"Failed to insert connector account audit event\");\n }\n return mapAuditRow(row);\n }, \"ConnectorAccountStore.appendAuditEvent\");\n }\n\n async listAuditEvents(\n params: ListConnectorAccountAuditEventsParams = {}\n ): Promise<ConnectorAccountAuditEventRecord[]> {\n return this.ctx.withRetry(async () => {\n const conditions: SQL<unknown>[] = [];\n const agentId = (params.agentId ?? this.ctx.agentId) as UUID;\n conditions.push(eq(connectorAccountAuditEventsTable.agentId, agentId));\n if (params.provider) {\n conditions.push(eq(connectorAccountAuditEventsTable.provider, params.provider));\n }\n if (params.accountId) {\n conditions.push(eq(connectorAccountAuditEventsTable.accountId, params.accountId as UUID));\n }\n if (params.action) {\n conditions.push(eq(connectorAccountAuditEventsTable.action, params.action));\n }\n if (params.outcome) {\n conditions.push(eq(connectorAccountAuditEventsTable.outcome, params.outcome));\n }\n const limit = params.limit ?? 50;\n const rows = await this.db\n .select()\n .from(connectorAccountAuditEventsTable)\n .where(and(...conditions))\n .orderBy(\n desc(connectorAccountAuditEventsTable.createdAt),\n desc(connectorAccountAuditEventsTable.id)\n )\n .limit(limit);\n return rows.map(mapAuditRow);\n }, \"ConnectorAccountStore.listAuditEvents\");\n }\n\n async createOAuthFlowState(params: CreateOAuthFlowStateParams): Promise<OAuthFlowRecord> {\n return this.ctx.withRetry(async () => {\n const stateHash = sha256Hex(params.state);\n const agentId = (params.agentId ?? this.ctx.agentId) as UUID;\n const now = new Date();\n const explicitExpiresAt = paramDateToDate(params.expiresAt);\n const ttlMs = params.ttlMs ?? 10 * 60_000;\n const expiresAt = explicitExpiresAt ?? new Date(now.getTime() + ttlMs);\n\n const insertValues: typeof oauthFlowsTable.$inferInsert = {\n stateHash,\n agentId,\n provider: params.provider,\n accountId: params.accountId ?? null,\n redirectUri: params.redirectUri ?? null,\n codeVerifierRef: params.codeVerifierRef ?? null,\n scopes: params.scopes ? [...params.scopes] : [],\n metadata: params.metadata ?? {},\n expiresAt,\n };\n\n const inserted = await this.db\n .insert(oauthFlowsTable)\n .values(insertValues)\n .onConflictDoUpdate({\n target: [oauthFlowsTable.agentId, oauthFlowsTable.provider, oauthFlowsTable.stateHash],\n set: {\n accountId: params.accountId ?? null,\n redirectUri: params.redirectUri ?? null,\n codeVerifierRef: params.codeVerifierRef ?? null,\n scopes: params.scopes ? [...params.scopes] : [],\n metadata: params.metadata ?? {},\n expiresAt,\n consumedAt: null,\n consumedBy: null,\n },\n })\n .returning();\n\n const row = inserted[0];\n if (!row) {\n throw new Error(\"Failed to insert OAuth flow state\");\n }\n return mapOAuthFlowRow(row);\n }, \"ConnectorAccountStore.createOAuthFlowState\");\n }\n\n async consumeOAuthFlowState(\n params: ConsumeOAuthFlowStateParams\n ): Promise<OAuthFlowRecord | null> {\n return this.ctx.withRetry(async () => {\n const stateHash = sha256Hex(params.state);\n const now = paramDateToDate(params.now) ?? new Date();\n const agentId = (params.agentId ?? this.ctx.agentId) as UUID;\n const conditions = [\n eq(oauthFlowsTable.stateHash, stateHash),\n eq(oauthFlowsTable.agentId, agentId),\n isNull(oauthFlowsTable.consumedAt),\n gt(oauthFlowsTable.expiresAt, now),\n ];\n if (params.provider) {\n conditions.push(eq(oauthFlowsTable.provider, params.provider));\n }\n const updated = await this.db\n .update(oauthFlowsTable)\n .set({\n consumedAt: now,\n consumedBy: params.consumedBy ?? null,\n })\n .where(and(...conditions))\n .returning();\n const row = updated[0];\n return row ? mapOAuthFlowRow(row) : null;\n }, \"ConnectorAccountStore.consumeOAuthFlowState\");\n }\n\n private async buildOAuthFlowLookupConditions(\n params: GetOAuthFlowStateParams | UpdateOAuthFlowStateParams | DeleteOAuthFlowStateParams\n ): Promise<SQL[]> {\n const agentId = (params.agentId ?? this.ctx.agentId) as UUID;\n const conditions: SQL[] = [eq(oauthFlowsTable.agentId, agentId)];\n if (params.stateHash) {\n conditions.push(eq(oauthFlowsTable.stateHash, params.stateHash));\n } else if (params.state) {\n conditions.push(eq(oauthFlowsTable.stateHash, sha256Hex(params.state)));\n } else if (params.flowId) {\n conditions.push(sql`${oauthFlowsTable.metadata}->>'flowId' = ${params.flowId}`);\n } else {\n throw new Error(\"OAuth flow lookup requires state, stateHash, or flowId\");\n }\n if (params.provider) {\n conditions.push(eq(oauthFlowsTable.provider, params.provider));\n }\n return conditions;\n }\n\n async getOAuthFlowState(params: GetOAuthFlowStateParams): Promise<OAuthFlowRecord | null> {\n return this.ctx.withRetry(async () => {\n const conditions = await this.buildOAuthFlowLookupConditions(params);\n const now = paramDateToDate(params.now) ?? new Date();\n if (!params.includeConsumed) {\n conditions.push(isNull(oauthFlowsTable.consumedAt));\n }\n if (!params.includeExpired) {\n conditions.push(gt(oauthFlowsTable.expiresAt, now));\n }\n const rows = await this.db\n .select()\n .from(oauthFlowsTable)\n .where(and(...conditions))\n .limit(1);\n const row = rows[0];\n return row ? mapOAuthFlowRow(row) : null;\n }, \"ConnectorAccountStore.getOAuthFlowState\");\n }\n\n async updateOAuthFlowState(params: UpdateOAuthFlowStateParams): Promise<OAuthFlowRecord | null> {\n return this.ctx.withRetry(async () => {\n const existing = await this.getOAuthFlowState({\n ...params,\n includeConsumed: true,\n includeExpired: true,\n });\n if (!existing) return null;\n\n const conditions = await this.buildOAuthFlowLookupConditions({\n stateHash: existing.stateHash,\n agentId: existing.agentId,\n provider: existing.provider,\n });\n const updateSet: Partial<typeof oauthFlowsTable.$inferInsert> = {};\n if (params.accountId !== undefined) updateSet.accountId = params.accountId;\n if (params.redirectUri !== undefined) updateSet.redirectUri = params.redirectUri;\n if (params.codeVerifierRef !== undefined) {\n updateSet.codeVerifierRef = params.codeVerifierRef;\n }\n if (params.scopes !== undefined) updateSet.scopes = [...params.scopes];\n if (params.metadata !== undefined) {\n updateSet.metadata = {\n ...existing.metadata,\n ...params.metadata,\n };\n }\n if (params.expiresAt !== undefined) {\n updateSet.expiresAt = paramDateToDate(params.expiresAt) ?? new Date();\n }\n if (params.consumedAt !== undefined) {\n updateSet.consumedAt = paramDateToDate(params.consumedAt);\n }\n if (params.consumedBy !== undefined) updateSet.consumedBy = params.consumedBy;\n\n const updated = await this.db\n .update(oauthFlowsTable)\n .set(updateSet)\n .where(and(...conditions))\n .returning();\n const row = updated[0];\n return row ? mapOAuthFlowRow(row) : null;\n }, \"ConnectorAccountStore.updateOAuthFlowState\");\n }\n\n async deleteOAuthFlowState(params: DeleteOAuthFlowStateParams): Promise<boolean> {\n return this.ctx.withRetry(async () => {\n const existing = await this.getOAuthFlowState({\n ...params,\n includeConsumed: true,\n includeExpired: true,\n });\n if (!existing) return false;\n const conditions = await this.buildOAuthFlowLookupConditions({\n stateHash: existing.stateHash,\n agentId: existing.agentId,\n provider: existing.provider,\n });\n const deleted = await this.db\n .delete(oauthFlowsTable)\n .where(and(...conditions))\n .returning();\n return deleted.length > 0;\n }, \"ConnectorAccountStore.deleteOAuthFlowState\");\n }\n}\n",
58
+ "import { logger, type UUID, validateUuid } from \"@elizaos/core\";\nimport { sql } from \"drizzle-orm\";\nimport { drizzle, type NodePgDatabase } from \"drizzle-orm/node-postgres\";\nimport { Pool, type PoolClient, type PoolConfig } from \"pg\";\nimport { normalizePgSslMode } from \"./sslmode\";\n\nexport class PostgresConnectionManager {\n private pool: Pool;\n private db: NodePgDatabase;\n private closePromise: Promise<void> | null = null;\n private shuttingDown = false;\n\n constructor(connectionString: string, rlsServerId?: string) {\n // Pool sizing is env-tunable so multi-tenant deployments (e.g. Eliza Cloud,\n // where many agent containers share one Postgres) can run lean pools and not\n // exhaust the server's max_connections. Defaults preserve the original\n // single-agent behavior (max 20 / min 2). Set POSTGRES_POOL_MIN=0 so idle\n // agents release every connection; a small POSTGRES_POOL_MAX caps bursts.\n const envInt = (key: string, fallback: number): number => {\n const raw = process.env[key];\n if (raw === undefined || raw === \"\") return fallback;\n const n = Number(raw);\n return Number.isFinite(n) && n >= 0 ? n : fallback;\n };\n const poolConfig: PoolConfig = {\n connectionString: normalizePgSslMode(connectionString),\n max: envInt(\"POSTGRES_POOL_MAX\", 20),\n min: envInt(\"POSTGRES_POOL_MIN\", 2),\n idleTimeoutMillis: envInt(\"POSTGRES_POOL_IDLE_TIMEOUT_MS\", 30000),\n connectionTimeoutMillis: 5000,\n keepAlive: true,\n keepAliveInitialDelayMillis: 10000,\n };\n\n if (rlsServerId) {\n poolConfig.application_name = rlsServerId;\n logger.debug(\n { src: \"plugin:sql\", rlsServerId: rlsServerId.substring(0, 8) },\n \"Pool configured with RLS server\"\n );\n }\n\n this.pool = new Pool(poolConfig);\n\n this.pool.on(\"error\", (err) => {\n logger.warn(\n { src: \"plugin:sql\", error: err.message || String(err) },\n \"Pool client error (connection will be replaced)\"\n );\n });\n\n this.db = drizzle(this.pool, { casing: \"snake_case\" });\n }\n\n public getDatabase(): NodePgDatabase {\n return this.db;\n }\n\n public getConnection(): Pool {\n return this.pool;\n }\n\n public isShuttingDown(): boolean {\n return this.shuttingDown || this.pool.ending || this.pool.ended;\n }\n\n public async getClient(): Promise<PoolClient> {\n if (this.isShuttingDown()) {\n throw new Error(\"Database pool is shutting down - client acquisition rejected\");\n }\n\n return this.pool.connect();\n }\n\n public async testConnection(): Promise<boolean> {\n let client: PoolClient | null = null;\n try {\n if (this.isShuttingDown()) {\n return false;\n }\n\n client = await this.pool.connect();\n await client.query(\"SELECT 1\");\n return true;\n } catch (error) {\n logger.error(\n {\n src: \"plugin:sql\",\n error: error instanceof Error ? error.message : String(error),\n },\n \"Failed to connect to the database\"\n );\n return false;\n } finally {\n if (client) {\n client.release();\n }\n }\n }\n\n public async withEntityContext<T>(\n entityId: UUID | null,\n callback: (tx: NodePgDatabase) => Promise<T>\n ): Promise<T> {\n if (this.isShuttingDown()) {\n throw new Error(\"Database pool is shutting down - operation rejected\");\n }\n\n const dataIsolationEnabled = process.env.ENABLE_DATA_ISOLATION === \"true\";\n\n return await this.db.transaction(async (tx) => {\n if (dataIsolationEnabled && entityId) {\n if (!validateUuid(entityId)) {\n throw new Error(`Invalid UUID format for entity context: ${entityId}`);\n }\n\n try {\n // Use parameterized set_config() (transaction-scoped via is_local=true)\n // instead of string-interpolated SET LOCAL, matching the Neon adapter.\n // SET LOCAL cannot take a bind parameter; set_config() can, removing\n // the only interpolated SQL in the RLS path.\n await tx.execute(sql`SELECT set_config('app.entity_id', ${entityId}, true)`);\n logger.debug(`[Entity Context] Set app.entity_id = ${entityId}`);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n logger.error(\n { error, entityId },\n `[Entity Context] Failed to set entity context: ${errorMessage}`\n );\n throw error;\n }\n } else if (!dataIsolationEnabled) {\n } else {\n logger.debug(\"[Entity Context] No entity context set (server operation)\");\n }\n\n return await callback(tx);\n });\n }\n\n public async close(): Promise<void> {\n if (this.closePromise) {\n return this.closePromise;\n }\n\n this.shuttingDown = true;\n if (this.pool.ended) {\n return;\n }\n\n this.closePromise = this.pool.end().finally(() => {\n this.shuttingDown = true;\n });\n\n return this.closePromise;\n }\n}\n",
59
+ "const PG_SSLMODE_CURRENT_TLS_ALIASES = new Set([\"prefer\", \"require\", \"verify-ca\"]);\n\n/**\n * pg-connection-string currently treats these sslmode values like verify-full,\n * but warns that its next major version will switch them to libpq semantics.\n * Make the current strict TLS behavior explicit before node-postgres parses it.\n */\nexport function normalizePgSslMode(connectionString: string): string {\n if (!connectionString || /(?:[?&]|\\s)uselibpqcompat=true(?:[&#]|\\s|$)/i.test(connectionString)) {\n return connectionString;\n }\n\n return connectionString\n .replace(/([?&]sslmode=)(prefer|require|verify-ca)(?=(&|#|$))/gi, (match, prefix, value) =>\n PG_SSLMODE_CURRENT_TLS_ALIASES.has(String(value).toLowerCase())\n ? `${prefix}verify-full`\n : match\n )\n .replace(\n /(^|\\s)(sslmode=)(prefer|require|verify-ca)(?=\\s|$)/gi,\n (match, boundary, prefix, value) =>\n PG_SSLMODE_CURRENT_TLS_ALIASES.has(String(value).toLowerCase())\n ? `${boundary}${prefix}verify-full`\n : match\n );\n}\n",
60
+ "import type { PGlite } from \"@electric-sql/pglite\";\nimport {\n type Agent,\n type Entity,\n logger,\n type Memory,\n type MemoryMetadata,\n type Relationship,\n type Room,\n type Task,\n type UUID,\n type World,\n} from \"@elizaos/core\";\nimport { drizzle, type PgliteDatabase } from \"drizzle-orm/pglite\";\nimport { BaseDrizzleAdapter } from \"../base\";\nimport { DIMENSION_MAP, type EmbeddingDimensionColumn } from \"../schema/embedding\";\nimport type { PGliteClientManager } from \"./manager\";\n\nexport class PgliteDatabaseAdapter extends BaseDrizzleAdapter {\n private manager: PGliteClientManager;\n protected embeddingDimension: EmbeddingDimensionColumn = DIMENSION_MAP[384];\n\n constructor(agentId: UUID, manager: PGliteClientManager) {\n super(agentId);\n this.manager = manager;\n // The PGlite class identity differs across @electric-sql/pglite minor\n // versions when this workspace is nested under a parent that pins an\n // older copy. Type the call site explicitly; the runtime\n // shape is identical and drizzle just calls .query() on the client.\n const drizzlePglite = drizzle as (client: unknown) => PgliteDatabase;\n this.db = drizzlePglite(this.manager.getConnection());\n }\n\n public async withEntityContext<T>(\n _entityId: UUID | null,\n callback: (tx: PgliteDatabase) => Promise<T>\n ): Promise<T> {\n return this.db.transaction(callback);\n }\n\n async getEntityByIds(entityIds: UUID[]): Promise<Entity[] | null> {\n return this.getEntitiesByIds(entityIds);\n }\n\n async getMemoriesByServerId(params: { serverId: UUID; count?: number }): Promise<Memory[]> {\n return super.getMemoriesByServerId(params);\n }\n\n async ensureAgentExists(agent: Partial<Agent>): Promise<Agent> {\n const existingAgent = await this.getAgent(this.agentId);\n if (existingAgent) {\n return existingAgent;\n }\n\n const newAgent: Agent = {\n id: this.agentId,\n name: agent.name || \"Unknown Agent\",\n username: agent.username,\n bio: (Array.isArray(agent.bio)\n ? agent.bio\n : agent.bio\n ? [agent.bio]\n : [\"An AI agent\"]) as string[],\n createdAt: agent.createdAt || Date.now(),\n updatedAt: agent.updatedAt || Date.now(),\n };\n\n await this.createAgent(newAgent);\n const createdAgent = await this.getAgent(this.agentId);\n if (!createdAgent) {\n throw new Error(\"Failed to create agent\");\n }\n return createdAgent;\n }\n\n protected async withDatabase<T>(operation: () => Promise<T>): Promise<T> {\n if (this.manager.isShuttingDown()) {\n const error = new Error(\"Database is shutting down - operation rejected\");\n logger.info(\n { src: \"plugin:sql\", error: error.message },\n \"Database operation rejected during shutdown\"\n );\n throw error;\n }\n const managerWithInit = this.manager as PGliteClientManager & {\n initialize?: () => Promise<void>;\n ensureSync?: () => Promise<void>;\n };\n await managerWithInit.initialize();\n // Deferred Electric Sync startup: tables must exist before sync inserts\n // data. Migrations run after plugin init, so we defer sync to the first\n // real database operation — by which point tables are guaranteed to exist.\n await managerWithInit.ensureSync?.();\n if (this.manager.isShuttingDown()) {\n const error = new Error(\"Database is shutting down - operation rejected\");\n logger.info(\n { src: \"plugin:sql\", error: error.message },\n \"Database operation rejected during shutdown\"\n );\n throw error;\n }\n return operation();\n }\n\n async init(): Promise<void> {\n const managerWithInit = this.manager as PGliteClientManager & {\n initialize?: () => Promise<void>;\n };\n await managerWithInit.initialize();\n logger.debug({ src: \"plugin:sql\" }, \"PGliteDatabaseAdapter initialized\");\n }\n\n async isReady(): Promise<boolean> {\n const managerWithState = this.manager as PGliteClientManager & {\n isInitialized?: () => boolean;\n };\n return !this.manager.isShuttingDown() && managerWithState.isInitialized() === true;\n }\n\n async close() {\n await this.manager.close();\n }\n\n async getConnection(): Promise<PgliteDatabase> {\n const managerWithInit = this.manager as PGliteClientManager & {\n initialize?: () => Promise<void>;\n };\n await managerWithInit.initialize();\n return this.db as PgliteDatabase;\n }\n\n getRawConnection(): PGlite {\n return this.manager.getConnection();\n }\n\n // ── Electric write-back notification overrides ─────────────────────────\n // Each override calls super[method] then fires manager.notifyWrite() so the\n // WriteBackService (Pattern 1 — Online Writes) can forward the change to the\n // cloud API. The row payload contains at minimum the primary key(s); for\n // inserts and upserts it includes the full data the caller provided.\n\n async createAgent(agent: Agent): Promise<boolean> {\n const ok = await super.createAgent(agent);\n if (ok && agent.id) {\n this.manager.notifyWrite(\"agents\", \"insert\", { ...agent, id: agent.id } as Record<\n string,\n unknown\n >);\n }\n return ok;\n }\n\n async updateAgent(agentId: UUID, agent: Partial<Agent>): Promise<boolean> {\n const ok = await super.updateAgent(agentId, agent);\n if (ok) {\n this.manager.notifyWrite(\"agents\", \"upsert\", { ...agent, id: agentId } as Record<\n string,\n unknown\n >);\n }\n return ok;\n }\n\n async deleteAgent(agentId: UUID): Promise<boolean> {\n const ok = await super.deleteAgent(agentId);\n if (ok) {\n this.manager.notifyWrite(\"agents\", \"delete\", { id: agentId });\n }\n return ok;\n }\n\n async deleteAgents(agentIds: UUID[]): Promise<boolean> {\n const ok = await super.deleteAgents(agentIds);\n if (ok) {\n for (const id of agentIds) {\n this.manager.notifyWrite(\"agents\", \"delete\", { id });\n }\n }\n return ok;\n }\n\n async createEntities(entities: Entity[]): Promise<UUID[]> {\n const ids = await super.createEntities(entities);\n for (let i = 0; i < entities.length && i < ids.length; i++) {\n this.manager.notifyWrite(\"entities\", \"insert\", { ...entities[i], id: ids[i] } as Record<\n string,\n unknown\n >);\n }\n return ids;\n }\n\n async updateEntity(entity: Entity): Promise<void> {\n await super.updateEntity(entity);\n if (entity.id) {\n this.manager.notifyWrite(\"entities\", \"upsert\", { ...entity, id: entity.id } as Record<\n string,\n unknown\n >);\n }\n }\n\n async deleteEntity(entityId: UUID): Promise<void> {\n await super.deleteEntity(entityId);\n this.manager.notifyWrite(\"entities\", \"delete\", { id: entityId });\n }\n\n async createWorld(world: World): Promise<UUID> {\n const id = await super.createWorld(world);\n this.manager.notifyWrite(\"worlds\", \"insert\", { ...world, id } as Record<string, unknown>);\n return id;\n }\n\n async updateWorld(world: World): Promise<void> {\n await super.updateWorld(world);\n if (world.id) {\n this.manager.notifyWrite(\"worlds\", \"upsert\", { ...world, id: world.id } as Record<\n string,\n unknown\n >);\n }\n }\n\n async removeWorld(id: UUID): Promise<void> {\n await super.removeWorld(id);\n this.manager.notifyWrite(\"worlds\", \"delete\", { id });\n }\n\n async createRooms(rooms: Room[]): Promise<UUID[]> {\n const ids = await super.createRooms(rooms);\n for (let i = 0; i < rooms.length && i < ids.length; i++) {\n this.manager.notifyWrite(\"rooms\", \"insert\", { ...rooms[i], id: ids[i] } as Record<\n string,\n unknown\n >);\n }\n return ids;\n }\n\n async updateRoom(room: Room): Promise<void> {\n await super.updateRoom(room);\n this.manager.notifyWrite(\"rooms\", \"upsert\", { ...room, id: room.id } as Record<\n string,\n unknown\n >);\n }\n\n async deleteRoom(roomId: UUID): Promise<void> {\n await super.deleteRoom(roomId);\n this.manager.notifyWrite(\"rooms\", \"delete\", { id: roomId });\n }\n\n async addParticipant(entityId: UUID, roomId: UUID): Promise<boolean> {\n const ok = await super.addParticipant(entityId, roomId);\n if (ok) {\n // Query the actual DB-generated id so the write-back ID matches the\n // local row. The base adapter returns boolean, not UUID.\n let participantId: string | null = null;\n try {\n const result = await this.manager\n .getConnection()\n .query(\n `SELECT id FROM participants WHERE entity_id = $1 AND room_id = $2 AND agent_id = $3 ORDER BY created_at DESC LIMIT 1`,\n [entityId, roomId, this.agentId]\n );\n const rows = result.rows as Array<{ id: string }>;\n participantId = rows[0]?.id ?? null;\n } catch (err) {\n logger.debug(\n { src: \"plugin:sql\", error: err instanceof Error ? err.message : String(err) },\n \"Failed to look up participant id for write-back\"\n );\n }\n if (participantId) {\n this.manager.notifyWrite(\"participants\", \"insert\", {\n id: participantId,\n entity_id: entityId,\n room_id: roomId,\n agent_id: this.agentId,\n });\n }\n }\n return ok;\n }\n\n async removeParticipant(entityId: UUID, roomId: UUID): Promise<boolean> {\n const ok = await super.removeParticipant(entityId, roomId);\n if (ok) {\n this.manager.notifyWrite(\"participants\", \"delete\", { entity_id: entityId, room_id: roomId });\n }\n return ok;\n }\n\n async createMemory(\n memory: Memory & { metadata?: MemoryMetadata },\n tableName: string\n ): Promise<UUID> {\n const id = await super.createMemory(memory, tableName);\n // `tableName` is the logical memory type (e.g. \"messages\"/\"facts\"), stored\n // in the `type` column of the single physical `memories` table — the\n // write-back target is always the physical table.\n this.manager.notifyWrite(\"memories\", \"insert\", { ...memory, id } as Record<string, unknown>);\n return id;\n }\n\n async updateMemory(\n memory: Partial<Memory> & { id: UUID; metadata?: MemoryMetadata }\n ): Promise<boolean> {\n const ok = await super.updateMemory(memory);\n if (ok) {\n this.manager.notifyWrite(\"memories\", \"upsert\", { ...memory, id: memory.id } as Record<\n string,\n unknown\n >);\n }\n return ok;\n }\n\n async deleteMemory(memoryId: UUID): Promise<void> {\n await super.deleteMemory(memoryId);\n this.manager.notifyWrite(\"memories\", \"delete\", { id: memoryId });\n }\n\n async deleteManyMemories(memoryIds: UUID[]): Promise<void> {\n await super.deleteManyMemories(memoryIds);\n for (const id of memoryIds) {\n this.manager.notifyWrite(\"memories\", \"delete\", { id });\n }\n }\n\n async deleteAllMemories(roomIds: UUID[], tableName: string): Promise<void>;\n async deleteAllMemories(roomId: UUID, tableName: string): Promise<void>;\n async deleteAllMemories(roomIdsOrRoomId: UUID[] | UUID, tableName: string): Promise<void> {\n // Capture the IDs that will be deleted so the write-back notification\n // can include them. The base method does not return the deleted IDs.\n const roomIds = Array.isArray(roomIdsOrRoomId) ? roomIdsOrRoomId : [roomIdsOrRoomId];\n let deletedIds: string[] = [];\n if (roomIds.length > 0) {\n try {\n const result = await this.manager\n .getConnection()\n .query(\n `SELECT id FROM memories WHERE room_id = ANY($1::uuid[]) AND type = $2 AND agent_id = $3`,\n [roomIds, tableName, this.agentId]\n );\n deletedIds = (result.rows as Array<{ id: string }>).map((r) => r.id);\n } catch (err) {\n logger.debug(\n { src: \"plugin:sql\", error: err instanceof Error ? err.message : String(err) },\n \"Failed to look up deleted memory ids for write-back\"\n );\n }\n }\n await super.deleteAllMemories(roomIdsOrRoomId as never, tableName);\n for (const id of deletedIds) {\n this.manager.notifyWrite(\"memories\", \"delete\", { id });\n }\n }\n\n async createRelationship(params: {\n sourceEntityId: UUID;\n targetEntityId: UUID;\n tags?: string[];\n metadata?: { [key: string]: unknown };\n }): Promise<boolean> {\n const ok = await super.createRelationship(params);\n if (ok) {\n // Query the actual DB-generated id so the write-back ID matches the\n // local row. The base adapter returns boolean, not UUID.\n let relationshipId: string | null = null;\n try {\n const result = await this.manager\n .getConnection()\n .query(\n `SELECT id FROM relationships WHERE source_entity_id = $1 AND target_entity_id = $2 AND agent_id = $3 ORDER BY created_at DESC LIMIT 1`,\n [params.sourceEntityId, params.targetEntityId, this.agentId]\n );\n const rows = result.rows as Array<{ id: string }>;\n relationshipId = rows[0]?.id ?? null;\n } catch (err) {\n logger.debug(\n { src: \"plugin:sql\", error: err instanceof Error ? err.message : String(err) },\n \"Failed to look up relationship id for write-back\"\n );\n }\n if (relationshipId) {\n this.manager.notifyWrite(\"relationships\", \"insert\", {\n id: relationshipId,\n source_entity_id: params.sourceEntityId,\n target_entity_id: params.targetEntityId,\n agent_id: this.agentId,\n tags: params.tags ?? [],\n metadata: params.metadata ?? {},\n });\n }\n }\n return ok;\n }\n\n async updateRelationship(relationship: Relationship): Promise<void> {\n await super.updateRelationship(relationship);\n this.manager.notifyWrite(\"relationships\", \"upsert\", {\n ...relationship,\n id: relationship.id,\n } as Record<string, unknown>);\n }\n\n async deleteRelationships(relationshipIds: UUID[]): Promise<void> {\n await super.deleteRelationships(relationshipIds);\n for (const id of relationshipIds) {\n this.manager.notifyWrite(\"relationships\", \"delete\", { id });\n }\n }\n\n async createTask(task: Task): Promise<UUID> {\n const id = await super.createTask(task);\n this.manager.notifyWrite(\"tasks\", \"insert\", { ...task, id } as Record<string, unknown>);\n return id;\n }\n\n async updateTask(id: UUID, task: Partial<Task>): Promise<void> {\n await super.updateTask(id, task);\n this.manager.notifyWrite(\"tasks\", \"upsert\", { ...task, id } as Record<string, unknown>);\n }\n\n async deleteTask(id: UUID): Promise<void> {\n await super.deleteTask(id);\n this.manager.notifyWrite(\"tasks\", \"delete\", { id });\n }\n}\n",
61
+ "import {\n closeSync,\n existsSync,\n mkdirSync,\n openSync,\n readFileSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { PGlite, type PGliteOptions } from \"@electric-sql/pglite\";\nimport { fuzzystrmatch } from \"@electric-sql/pglite/contrib/fuzzystrmatch\";\nimport { live } from \"@electric-sql/pglite/live\";\nimport { vector } from \"@electric-sql/pglite/vector\";\nimport { electricSync } from \"@electric-sql/pglite-sync\";\nimport { logger } from \"@elizaos/core\";\nimport type { IDatabaseClientManager } from \"../types\";\nimport { WriteBackService } from \"../write-back\";\nimport { createPgliteInitError, PGLITE_ERROR_CODES } from \"./errors\";\n\n/**\n * Canonical list of table names synced via Electric and tracked by the\n * write-back service. Used by both syncShapesToTables (read path) and\n * PgliteDatabaseAdapter (write path) so the two stay in sync.\n */\nexport const SYNCED_TABLE_NAMES = [\n \"agents\",\n \"entities\",\n \"worlds\",\n \"rooms\",\n \"participants\",\n \"memories\",\n \"relationships\",\n \"tasks\",\n] as const satisfies readonly string[];\n\ntype PglitePidFileStatus =\n | \"missing\"\n | \"active\"\n | \"active-unconfirmed\"\n | \"cleared-stale\"\n | \"cleared-malformed\"\n | \"check-failed\";\n\n/**\n * Runtime sync status of the Electric Sync client wired into PGlite.\n * - syncing: the sync stream is connecting or catching up with the source.\n * - synced: the local PGlite is up-to-date with the Electric source.\n * - error: the sync stream encountered a non-recoverable error.\n * - disabled: no ELIZA_ELECTRIC_SYNC_URL was configured at boot.\n */\nexport type PgliteSyncStatus = \"syncing\" | \"synced\" | \"error\" | \"disabled\";\n\n/** Per-table sync state. */\nexport type PgliteSyncTableState = \"pending\" | \"synced\" | \"error\";\n\n/** Per-table status map exposed by getSyncStatus(). */\nexport type PgliteSyncTableStatus = Record<string, { state: PgliteSyncTableState; error?: string }>;\n\n/**\n * Result row type for live queries. Matches the shape returned by\n * {@link https://pglite.dev/docs/live-queries | pg.live.query()}.\n */\nexport interface LiveQueryResult<T = Record<string, unknown>> {\n rows: T[];\n fields: { name: string; dataTypeID: number }[];\n affectedRows?: number;\n}\n\n/**\n * Return value from {@link https://pglite.dev/docs/live-queries | pg.live.query()}.\n */\nexport interface LiveQueryReturn<T = Record<string, unknown>> {\n initialResults: LiveQueryResult<T>;\n unsubscribe: () => Promise<void>;\n refresh: (options?: { offset?: number; limit?: number }) => Promise<void>;\n}\n\n/**\n * The `pg.live` namespace added by the `@electric-sql/pglite/live` extension.\n */\nexport interface LiveNamespace {\n query<T = Record<string, unknown>>(\n sql: string,\n params: unknown[] | undefined,\n callback: (result: LiveQueryResult<T>) => void\n ): Promise<LiveQueryReturn<T>>;\n incrementalQuery<T = Record<string, unknown>>(\n sql: string,\n params: unknown[] | undefined,\n key: string,\n callback: (result: LiveQueryResult<T>) => void\n ): Promise<LiveQueryReturn<T>>;\n changes<T = Record<string, unknown>>(\n sql: string,\n params: unknown[] | undefined,\n key: string,\n callback: (changes: unknown[]) => void\n ): Promise<LiveQueryReturn<T>>;\n}\n\nexport class PGliteClientManager implements IDatabaseClientManager<PGlite> {\n // A lock whose liveness we cannot positively confirm (EPERM / non-ESRCH probe\n // error, i.e. a possibly recycled cross-user PID) and whose recorded createdAt\n // is older than this window is treated as stale, so a recycled PID cannot\n // permanently brick boot. Confirmed-live PIDs are honored regardless of age.\n // 7 days comfortably exceeds any real unconfirmable window while still\n // bounding the false-positive blast radius. See isLockActive.\n private static readonly LOCK_STALE_MS = 7 * 24 * 60 * 60 * 1000;\n\n private client: PGlite;\n private options: PGliteOptions;\n private shuttingDown = false;\n private initialized = false;\n private initializePromise: Promise<void> | null = null;\n private lockFd: number | null = null;\n private lockPath: string | null = null;\n private syncUrl: string | null;\n private agentId: string | null;\n private syncStatus: PgliteSyncStatus = \"disabled\";\n private syncError: string | null = null;\n private syncUnsubscribe: (() => void) | null = null;\n private syncTableStates: PgliteSyncTableStatus = {};\n private syncedTables: string[] = [];\n // Serializes calls to startSync() so concurrent forceResync() / ensureSync()\n // calls don't race into syncShapesToTables (\"Already syncing shape\" errors).\n private startSyncMutex: Promise<void> | null = null;\n // Serializes the full forceResync() operation so concurrent calls don't race\n // into unsubscribe + DROP SCHEMA (\"electric.subscriptions_metadata does not\n // exist\" when the extension hasn't drained before DROP CASCADE).\n private forceResyncMutex: ReturnType<PGliteClientManager[\"forceResync\"]> | null = null;\n // Write-back service: forwards local PGlite writes to the cloud API\n // (Electric Pattern 1 — Online Writes) for bidirectional sync.\n private writeBack: WriteBackService;\n\n constructor(\n options: PGliteOptions & {\n syncUrl?: string;\n agentId?: string;\n writeBackBaseUrl?: string;\n serviceKey?: string;\n }\n ) {\n this.options = options;\n this.syncUrl = options.syncUrl ?? null;\n this.agentId = options.agentId ?? null;\n this.writeBack = new WriteBackService({\n writeBaseUrl: options.writeBackBaseUrl,\n agentId: options.agentId,\n serviceKey: options.serviceKey,\n });\n this.acquireDataDirLockIfNeeded();\n try {\n this.client = this.createClient(options);\n this.setupShutdownHandlers();\n } catch (err) {\n // If client creation (WASM/FS init) throws, no reference to this manager\n // escapes the constructor, so close() can never run. Release the data-dir\n // lock here so the open fd and on-disk lock file don't leak — otherwise a\n // same-process retry would self-deadlock on its own (still-running) PID.\n this.releaseDataDirLock();\n throw err;\n }\n }\n\n public getConnection(): PGlite {\n return this.client;\n }\n\n /**\n * Access the write-back service for forwarding local writes to the\n * cloud API. Returns null when write-back is not configured.\n */\n public getWriteBack(): WriteBackService | null {\n return this.writeBack.enabled ? this.writeBack : null;\n }\n\n /**\n * Notify the write-back service of a local write to a sync table.\n * Called by the adapter after a successful write operation.\n * No-op when write-back is not configured.\n */\n public notifyWrite(\n table: string,\n operation: \"insert\" | \"upsert\" | \"delete\",\n row: Record<string, unknown>\n ): void {\n this.writeBack.enqueue(table, operation, row);\n }\n\n /**\n * Current Electric Sync status.\n * - \"disabled\": no ELIZA_ELECTRIC_SYNC_URL was configured.\n * - \"syncing\": sync client is connecting or catching up.\n * - \"synced\": local PGlite is up-to-date with the Electric source.\n * - \"error\": sync encountered an error (see syncError).\n *\n * Also returns per-table state so operators can see which specific\n * tables are healthy vs errored vs still pending.\n */\n public getSyncStatus(): {\n status: PgliteSyncStatus;\n error: string | null;\n tables: PgliteSyncTableStatus;\n synced: string[];\n } {\n return {\n status: this.syncStatus,\n error: this.syncError,\n tables: { ...this.syncTableStates },\n synced: [...this.syncedTables],\n };\n }\n\n public isShuttingDown(): boolean {\n return this.shuttingDown;\n }\n\n public isInitialized(): boolean {\n return this.initialized;\n }\n\n public async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n if (!this.initializePromise) {\n this.initializePromise = this.initializeInternal().finally(() => {\n this.initializePromise = null;\n });\n }\n\n await this.initializePromise;\n }\n\n public async close(): Promise<void> {\n this.shuttingDown = true;\n // Flush pending write-backs before tearing down.\n if (this.writeBack.enabled) {\n try {\n await this.writeBack.flush();\n } catch {}\n }\n // Drain any in-progress startSync before we tear down.\n if (this.startSyncMutex) {\n try {\n await this.startSyncMutex;\n } catch {}\n }\n if (this.syncUnsubscribe) {\n try {\n this.syncUnsubscribe();\n } catch {}\n this.syncUnsubscribe = null;\n }\n // Allow the sync extension's async teardown (network abort handlers,\n // final subscription-metadata writes) to settle before we close the\n // database. A single setTimeout(0) is insufficient — the extension uses\n // network I/O whose abort + cleanup can take multiple event-loop ticks.\n await new Promise((r) => setTimeout(r, 50));\n if (this.client) {\n try {\n await this.client.close();\n } catch {}\n }\n this.releaseDataDirLock();\n }\n\n private setupShutdownHandlers() {}\n\n private createClient(options: PGliteOptions): PGlite {\n // PGlite's in-memory mode is the `memory://` URL. `:memory:` is SQLite\n // syntax that PGlite does NOT recognize, so it treats it as a real path and\n // its NodeFS mkdir()s `resolve(\":memory:\")` — which throws EINVAL on Windows\n // (the `:` is reserved) and silently creates a junk `:memory:` dir on POSIX.\n // Translate to the URL form so in-memory actually stays in memory.\n if ((options as { dataDir?: unknown }).dataDir === \":memory:\") {\n options = { ...options, dataDir: \"memory://\" };\n }\n if (process.env.ELIZA_PGLITE_DISABLE_EXTENSIONS === \"1\") {\n return new PGlite(options);\n }\n // When ELIZA_ELECTRIC_SYNC_URL is set (or syncUrl was passed in options),\n // register the electricSync extension so the PGlite instance can sync.\n const syncUrl = this.syncUrl ?? process.env.ELIZA_ELECTRIC_SYNC_URL ?? null;\n const extensions = {\n ...(options.extensions ?? {}),\n vector,\n fuzzystrmatch,\n // Only load the `live` extension when Electric sync is configured — its\n // live-query namespace is only used by the sync/dashboard paths, so the\n // default local-dev PGlite boot pays nothing for it.\n ...(syncUrl ? { electric: electricSync(), live } : {}),\n } as PGliteOptions[\"extensions\"];\n return new PGlite({\n ...options,\n extensions,\n });\n }\n\n private getDataDir(): string | null {\n const optionsWithDataDir = this.options as PGliteOptions & {\n dataDir?: unknown;\n dataPath?: unknown;\n };\n\n const dataDir = optionsWithDataDir.dataDir ?? optionsWithDataDir.dataPath;\n return typeof dataDir === \"string\" ? dataDir : null;\n }\n\n private isFileBackedDataDir(dataDir: string | null): dataDir is string {\n if (!dataDir) {\n return false;\n }\n\n if (dataDir.includes(\"://\")) {\n return false;\n }\n\n if (dataDir === \":memory:\") {\n return false;\n }\n\n return true;\n }\n\n private getDataDirLockPath(dataDir: string): string {\n return `${dataDir}/eliza-pglite.lock`;\n }\n\n private getLockInfo(lockPath: string): { pid: number | null; createdAt: number | null } {\n try {\n const raw = readFileSync(lockPath, \"utf-8\");\n const parsed = JSON.parse(raw) as { pid?: unknown; createdAt?: unknown };\n const pid = typeof parsed.pid === \"number\" && parsed.pid > 0 ? parsed.pid : null;\n const createdAtMs = typeof parsed.createdAt === \"string\" ? Date.parse(parsed.createdAt) : NaN;\n const createdAt = Number.isNaN(createdAtMs) ? null : createdAtMs;\n return { pid, createdAt };\n } catch {\n return { pid: null, createdAt: null };\n }\n }\n\n /**\n * Decide whether an existing lock should be honored as held by a live owner.\n *\n * Single-writer safety comes first: a *confirmed-running* PID is always\n * honored, regardless of how old its `createdAt` is. A long-running agent\n * (days or weeks of uptime) must never have its live lock reclaimed by a\n * second manager — that would open a dual-writer window, which is\n * unrecoverable, whereas a falsely-bricked boot is recoverable by removing\n * the lock file. This matches the sibling `reconcilePglitePidFile`, which\n * also treats a live PID as \"active\".\n *\n * The staleness window only rescues the *unconfirmable* case. A bare\n * `process.kill(pid, 0)` is vulnerable to PID reuse, and a recycled\n * cross-user PID surfaces as `EPERM` (or another non-`ESRCH` error) rather\n * than a clean success. For those we cannot prove the PID belongs to a live\n * Eliza process, so we fall back to `createdAt`: a recent lock is still\n * respected, but one older than `LOCK_STALE_MS` (or with no usable timestamp)\n * is treated as stale and reclaimed so an aliased PID cannot brick boot\n * forever. `ESRCH` is unambiguous — the process is gone and the lock is stale.\n */\n private isLockActive(pid: number, createdAt: number | null): boolean {\n try {\n process.kill(pid, 0);\n // Confirmed alive -> honor unconditionally (preserve single-writer).\n return true;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"ESRCH\") {\n // Definitely gone -> reclaim.\n return false;\n }\n // Unconfirmable liveness (EPERM, etc.): honor only a recent lock; an old\n // or timestamp-less one is treated as stale so boot can recover.\n if (createdAt === null) {\n return false;\n }\n return Date.now() - createdAt < PGliteClientManager.LOCK_STALE_MS;\n }\n }\n\n private acquireDataDirLockIfNeeded(): void {\n const dataDir = this.getDataDir();\n if (!this.isFileBackedDataDir(dataDir)) {\n return;\n }\n\n mkdirSync(dataDir, { recursive: true });\n const lockPath = this.getDataDirLockPath(dataDir);\n for (let attempt = 0; attempt < 2; attempt++) {\n try {\n const fd = openSync(lockPath, \"wx\");\n writeFileSync(\n fd,\n `${JSON.stringify({\n pid: process.pid,\n createdAt: new Date().toISOString(),\n dataDir,\n })}\\n`\n );\n this.lockFd = fd;\n this.lockPath = lockPath;\n return;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== \"EEXIST\") {\n throw this.createActiveLockError(dataDir, err);\n }\n\n const { pid, createdAt } = this.getLockInfo(lockPath);\n if (pid && this.isLockActive(pid, createdAt)) {\n throw this.createActiveLockError(\n dataDir,\n new Error(`PGlite lock file is held by running process ${pid}`)\n );\n }\n\n try {\n unlinkSync(lockPath);\n logger.debug(\n { src: \"plugin:sql\", dataDir, lockPath, pid },\n \"Removed stale PGlite lock file\"\n );\n } catch (unlinkErr) {\n throw this.createActiveLockError(dataDir, unlinkErr);\n }\n }\n }\n\n throw this.createActiveLockError(dataDir, new Error(\"Could not acquire PGlite lock file\"));\n }\n\n private releaseDataDirLock(): void {\n if (this.lockFd !== null) {\n try {\n closeSync(this.lockFd);\n } catch {}\n this.lockFd = null;\n }\n\n if (this.lockPath) {\n try {\n unlinkSync(this.lockPath);\n } catch {}\n this.lockPath = null;\n }\n }\n\n private getErrorText(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === \"string\") {\n return error;\n }\n if (error && typeof error === \"object\") {\n const obj = error as { message?: unknown; toString?: unknown };\n if (typeof obj.message === \"string\" && obj.message.length > 0) {\n return obj.message;\n }\n try {\n const json = JSON.stringify(error);\n if (json && json !== \"{}\") {\n return json;\n }\n } catch {}\n if (typeof obj.toString === \"function\") {\n const stringified = obj.toString.call(error);\n if (stringified && stringified !== \"[object Object]\") {\n return stringified;\n }\n }\n }\n return String(error);\n }\n\n private reconcilePglitePidFile(dataDir: string): PglitePidFileStatus {\n const pidPath = `${dataDir}/postmaster.pid`;\n if (!existsSync(pidPath)) {\n return \"missing\";\n }\n\n // iOS embedded mode is single-tenant: Bun runs as a thread inside the\n // host app process, and ElizaBunRuntime serializes engine starts. Any\n // leftover postmaster.pid is by definition stale — either from a prior\n // app launch, or from a prior Bun thread in this same process that\n // already exited. The standard `process.kill(pid, 0)` heuristic\n // produces false positives here because the recorded PID matches the\n // current iOS app PID.\n // Mobile embedded modes (iOS and Android) are single-tenant: each app\n // launch spawns a fresh Bun process, so any leftover postmaster.pid is\n // always stale. The process.kill(pid, 0) heuristic below can produce\n // false positives on both platforms (iOS: same-process PID; Android:\n // EPERM instead of ESRCH for cross-UID pids), so clear unconditionally.\n if (\n process.env.ELIZA_IOS_LOCAL_BACKEND === \"1\" ||\n process.env.ELIZA_ANDROID_LOCAL_BACKEND === \"1\"\n ) {\n try {\n unlinkSync(pidPath);\n logger.info(\n { src: \"plugin:sql\", dataDir, pidPath },\n \"Mobile embedded mode: removed leftover PGlite postmaster.pid\"\n );\n return \"cleared-stale\";\n } catch (err) {\n logger.warn(\n { src: \"plugin:sql\", dataDir, error: this.getErrorText(err) },\n \"Mobile embedded mode: failed to remove postmaster.pid\"\n );\n return \"check-failed\";\n }\n }\n\n try {\n const content = readFileSync(pidPath, \"utf-8\");\n const firstLine = content.split(\"\\n\")[0]?.trim();\n const pid = parseInt(firstLine, 10);\n\n if (Number.isNaN(pid) || pid <= 0) {\n unlinkSync(pidPath);\n logger.debug(\n { src: \"plugin:sql\", dataDir, pidPath },\n \"Removed malformed PGlite postmaster.pid\"\n );\n return \"cleared-malformed\";\n }\n\n try {\n process.kill(pid, 0);\n logger.warn(\n { src: \"plugin:sql\", dataDir, pid },\n \"PGlite data dir is already in use by another process\"\n );\n return \"active\";\n } catch (killErr: unknown) {\n const code = (killErr as NodeJS.ErrnoException).code;\n if (code === \"ESRCH\") {\n unlinkSync(pidPath);\n logger.info({ src: \"plugin:sql\", dataDir, pid }, \"Removed stale PGlite postmaster.pid\");\n return \"cleared-stale\";\n }\n logger.warn(\n { src: \"plugin:sql\", dataDir, pid, code },\n \"Cannot confirm PGlite postmaster.pid ownership\"\n );\n return \"active-unconfirmed\";\n }\n } catch (err) {\n logger.warn(\n {\n src: \"plugin:sql\",\n dataDir,\n error: this.getErrorText(err),\n },\n \"Failed to inspect PGlite postmaster.pid\"\n );\n return \"check-failed\";\n }\n }\n\n private createActiveLockError(dataDir: string, cause: unknown): Error {\n return createPgliteInitError(\n PGLITE_ERROR_CODES.ACTIVE_LOCK,\n `PGlite data dir is already in use at ${dataDir}. Close the other Eliza process, or point PGLITE_DATA_DIR at a different directory before retrying.`,\n { cause, dataDir }\n );\n }\n\n private createManualResetRequiredError(dataDir: string, cause: unknown): Error {\n const errorText = this.getErrorText(cause);\n const corruptCause = createPgliteInitError(\n PGLITE_ERROR_CODES.CORRUPT_DATA,\n `PGlite data dir at ${dataDir} appears corrupt or unreadable: ${errorText}`,\n { cause, dataDir }\n );\n return createPgliteInitError(\n PGLITE_ERROR_CODES.MANUAL_RESET_REQUIRED,\n `PGlite initialization failed for ${dataDir}: ${errorText}. Stop Eliza, then rename or delete only this directory before retrying: ${dataDir}`,\n { cause: corruptCause, dataDir }\n );\n }\n\n private async queryMigrationsSchema(): Promise<void> {\n await this.client.query(\"CREATE SCHEMA IF NOT EXISTS migrations\");\n this.initialized = true;\n }\n\n /**\n * Ensure the Electric Sync stream is started. Idempotent — safe to call\n * on every database operation. The first call after PGlite is initialized\n * and after migrations have created the target tables will start the sync\n * stream; subsequent calls are no-ops.\n *\n * This is deliberately separate from {@link initialize} because the Drizzle\n * migrations that create the target tables run AFTER plugin init completes.\n * Starting sync during init would try to insert into non-existent tables.\n */\n public async ensureSync(): Promise<void> {\n // Already started or PGlite not initialized yet — no-op.\n if (this.syncUnsubscribe) return;\n if (!this.initialized) return;\n // startSync() handles its own guards: missing syncUrl → \"disabled\",\n // missing agentId → \"error\", double-call → no-op. It also resets\n // syncStatus/syncError on entry, so calling it after a transient\n // error safely retries the sync stream.\n await this.startSync();\n }\n\n /**\n * Access the PGlite live query namespace for reactive queries that\n * push updated results whenever the underlying tables change. Useful\n * for dashboard health endpoints and real-time monitoring.\n *\n * Returns the {@link https://pglite.dev/docs/live-queries | pg.live}\n * namespace, which provides:\n * - `live.query(sql, params, callback)` — simple live query\n * - `live.incrementalQuery(sql, params, key, callback)` — diff-based\n * - `live.changes(sql, params, key, callback)` — raw change stream\n *\n * Returns null when PGlite extensions are disabled.\n */\n public liveQuery(): LiveNamespace | null {\n // Cast through unknown because the PGlite type doesn't declare the\n // `live` namespace added by the extension at runtime.\n const clientWithLive = this.client as PGlite & {\n live?: LiveNamespace;\n };\n return clientWithLive.live ?? null;\n }\n\n /**\n * Force-reset the Electric Sync stream: unsubscribe, drop all internal\n * sync state from the `electric` schema, and restart from scratch.\n *\n * Use this when operators diagnose a split-brain scenario (local PGlite\n * has diverged from the source Postgres) or when the sync stream is\n * stuck in an unrecoverable error state. The local data in the synced\n * tables is preserved — only the Electric metadata tables are dropped,\n * forcing a full re-sync that reconstructs state from the source.\n *\n * Returns the sync status after the reset. When sync is not configured\n * (no ELIZA_ELECTRIC_SYNC_URL), returns null.\n */\n public async forceResync(): Promise<{\n status: PgliteSyncStatus;\n error: string | null;\n tables: PgliteSyncTableStatus;\n synced: string[];\n } | null> {\n // Serialize the full forceResync operation so concurrent calls don't\n // race into unsubscribe + DROP SCHEMA before the extension has drained.\n if (this.forceResyncMutex) return this.forceResyncMutex;\n this.forceResyncMutex = this.forceResyncInternal();\n try {\n return await this.forceResyncMutex;\n } finally {\n this.forceResyncMutex = null;\n }\n }\n\n private async forceResyncInternal(): Promise<{\n status: PgliteSyncStatus;\n error: string | null;\n tables: PgliteSyncTableStatus;\n synced: string[];\n } | null> {\n const syncUrl = this.syncUrl ?? process.env.ELIZA_ELECTRIC_SYNC_URL ?? null;\n if (!syncUrl) return null;\n if (!this.initialized) return null;\n\n // 1. Unsubscribe the current sync stream.\n if (this.syncUnsubscribe) {\n try {\n this.syncUnsubscribe();\n } catch {}\n this.syncUnsubscribe = null;\n // Let the sync extension drain in-flight network operations before we\n // drop the schema it depends on. A single setTimeout(0) is insufficient\n // — the extension uses network I/O whose abort + final teardown can take\n // multiple event-loop ticks. A modest delay prevents \"electric.\n // subscriptions_metadata does not exist\" when DROP CASCADE removes it\n // while the extension is still writing teardown bookmarks.\n await new Promise((r) => setTimeout(r, 50));\n }\n\n // 2. Drop the Electric metadata schema so the sync stream loses its\n // last-known offset and shape state. CASCADE removes all dependent\n // objects (tables, functions, sequences) that the electricSync\n // extension created in this schema.\n try {\n await this.client.query(\"DROP SCHEMA IF EXISTS electric CASCADE\");\n logger.info({ src: \"plugin:sql\", syncUrl }, \"Dropped electric schema — sync state reset\");\n } catch (err) {\n logger.warn(\n { src: \"plugin:sql\", error: this.getErrorText(err) },\n \"Failed to drop electric schema during force re-sync — continuing\"\n );\n }\n\n // 3. Start a fresh sync stream. startSyncInternal() resets\n // syncTableStates, syncedTables, syncStatus and syncError\n // itself, so we don't need a separate state reset here.\n // (A redundant reset races with concurrent forceResync calls.)\n await this.startSync();\n\n return this.getSyncStatus();\n }\n\n /**\n * Start the Electric Sync stream after PGlite is initialized.\n * Uses the official multi-table {@link https://pglite.dev/docs/sync#multi-table-sync | syncShapesToTables}\n * API so all shape updates that happened in a single Postgres transaction\n * are applied in a single PGlite transaction, preserving consistency\n * across all runtime tables.\n *\n * Each shape is filtered by agent_id so that in a shared-Neon deployment\n * an agent only syncs its own data — preserving per-agent physical isolation\n * even though the source Postgres is multi-tenant.\n *\n * Sync failures are non-fatal: the agent runs on its local PGlite\n * regardless of sync health. Per-table error state is tracked so\n * operators can diagnose individual table issues without assuming\n * the entire sync is broken.\n */\n private async startSync(): Promise<void> {\n const syncUrl = this.syncUrl ?? process.env.ELIZA_ELECTRIC_SYNC_URL ?? null;\n if (!syncUrl) {\n this.syncStatus = \"disabled\";\n return;\n }\n\n // Guard: don't start sync during shutdown — close() is tearing down.\n if (this.shuttingDown) return;\n\n // Serialize concurrent startSync() calls. forceResync() unsets\n // syncUnsubscribe before calling startSync(), so the old guard was\n // insufficient — two forceResync()s could race past it. A promise\n // mutex ensures only one call to syncShapesToTables at a time.\n if (this.startSyncMutex) return this.startSyncMutex;\n this.startSyncMutex = this.startSyncInternal(syncUrl);\n try {\n return await this.startSyncMutex;\n } finally {\n this.startSyncMutex = null;\n }\n }\n\n /** Internal body of startSync, extracted so the mutex wraps only the\n * syncShapesToTables call, not the early-return guards. */\n private async startSyncInternal(syncUrl: string): Promise<void> {\n // Guard against re-entry via the old syncUnsubscribe path.\n if (this.syncUnsubscribe) {\n return;\n }\n\n // Set sync status now that we're past the mutex and actually starting.\n this.syncStatus = \"syncing\";\n this.syncError = null;\n\n try {\n // TypeScript: pglite-sync adds an `electric` namespace on the PGlite\n // instance when the electricSync() extension is registered.\n // The official API: https://pglite.dev/docs/sync#multitable-sync\n const clientWithElectric = this.client as PGlite & {\n electric?: {\n syncShapesToTables?: (opts: {\n shapes: Record<\n string,\n {\n shape: { url: string; params?: Record<string, string> };\n table: string;\n primaryKey: string[];\n }\n >;\n key: string;\n onInitialSync?: () => void;\n onError?: (err: Error) => void;\n }) => { isUpToDate: boolean; unsubscribe: () => void };\n };\n };\n\n if (!clientWithElectric.electric?.syncShapesToTables) {\n const msg =\n \"electricSync extension registered but pg.electric.syncShapesToTables not available\";\n logger.warn({ src: \"plugin:sql\", syncUrl }, msg);\n this.syncStatus = \"error\";\n this.syncError = msg;\n return;\n }\n\n // Per-agent WHERE filter: in a shared-Neon deployment the source\n // Postgres holds all agents' rows. The `agent_id` column scopes every\n // table, so each PGlite syncs only the rows that belong to its agent.\n // Refuse to sync without an agentId — syncing all rows would silently\n // leak every agent's data into the local PGlite.\n const agentId = this.agentId ?? process.env.AGENT_ID ?? null;\n if (!agentId) {\n const msg =\n \"ELIZA_ELECTRIC_SYNC_URL is configured but agentId is unknown — refusing to sync without per-agent filtering\";\n logger.error({ src: \"plugin:sql\", syncUrl }, msg);\n this.syncStatus = \"error\";\n this.syncError = msg;\n return;\n }\n\n // Electric Cloud does NOT support $1 positional placeholders — the\n // `where` clause must use literal SQL values. agentId is a UUID,\n // validated explicitly so direct interpolation is safe.\n if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(agentId)) {\n const msg = `agentId is not a valid UUID: ${agentId}`;\n logger.error({ src: \"plugin:sql\", syncUrl }, msg);\n this.syncStatus = \"error\";\n this.syncError = msg;\n return;\n }\n const where = `agent_id = '${agentId}'`;\n const agentWhere = `id = '${agentId}'`;\n\n // Derive the shape definitions from SYNCED_TABLE_NAMES so the read path\n // stays in sync with the write-back notification path. Per-table\n // override: agents filters by id (literal UUID, not $1 placeholder —\n // Electric Cloud requires literal values in WHERE clauses).\n const tables = SYNCED_TABLE_NAMES.map((name) => ({\n key: name,\n table: name,\n pk: [\"id\"] as string[],\n where: name === \"agents\" ? agentWhere : where,\n params: {} as Record<string, string>,\n }));\n\n // Initialize per-table state as \"pending\".\n this.syncTableStates = {};\n for (const { key } of tables) {\n this.syncTableStates[key] = { state: \"pending\" };\n }\n this.syncedTables = [];\n\n // Build the shapes record as expected by syncShapesToTables.\n // https://pglite.dev/docs/sync#syncshapestotables-api\n const shapes: Record<\n string,\n {\n shape: { url: string; params: Record<string, string> };\n table: string;\n primaryKey: string[];\n }\n > = {};\n for (const { key, table, pk, where: tableWhere, params: tableParams } of tables) {\n shapes[key] = {\n shape: {\n url: syncUrl,\n params: { table, where: tableWhere, ...tableParams },\n },\n table,\n primaryKey: pk,\n };\n }\n\n // Per-agent sync key so different agents' sync streams don't collide\n // and resume-from-last-offset works across container restarts.\n const syncKey = agentId;\n\n // Track which tables have completed initial sync. The onInitialSync\n // callback fires once when ALL shapes are synced.\n let initialSyncComplete = false;\n\n const sync = clientWithElectric.electric.syncShapesToTables({\n shapes,\n key: syncKey,\n onInitialSync: () => {\n // Guard: if the manager is shutting down, don't touch\n // PGlite or internal state — close() is running.\n if (this.shuttingDown) return;\n initialSyncComplete = true;\n // Mark all tables as synced.\n for (const { key } of tables) {\n this.syncTableStates[key] = { state: \"synced\" };\n }\n this.syncedTables = tables.map((t) => t.key);\n this.syncStatus = \"synced\";\n this.syncError = null;\n logger.info(\n { src: \"plugin:sql\", syncedTables: this.syncedTables },\n `Electric Sync initial sync complete for all ${tables.length} tables`\n );\n },\n onError: (err: Error) => {\n // Guard: if the manager is shutting down, the PGlite\n // instance may already be closed — don't touch state.\n if (this.shuttingDown) return;\n // Sync errors are warnings, not fatal — the agent runs on\n // local PGlite regardless. Track the error for diagnostics\n // but don't declare every table broken.\n this.syncError = err.message;\n if (!initialSyncComplete) {\n // Before initial sync: all pending tables that haven't\n // individually errored stay pending.\n this.syncStatus = \"error\";\n }\n // After initial sync: the existing synced data is fine;\n // just log the stream disruption.\n logger.error(\n { src: \"plugin:sql\", error: err.message },\n \"Electric Sync stream error — agent continues on local PGlite\"\n );\n },\n });\n\n this.syncUnsubscribe = () => sync.unsubscribe();\n\n // If isUpToDate is already true after syncShapesToTables returns,\n // the initial sync happened synchronously (e.g., all tables empty\n // or caught up instantly). Fire onInitialSync manually.\n if (sync.isUpToDate && !initialSyncComplete && !this.shuttingDown) {\n for (const { key } of tables) {\n this.syncTableStates[key] = { state: \"synced\" };\n }\n this.syncedTables = tables.map((t) => t.key);\n this.syncStatus = \"synced\";\n }\n\n logger.info(\n {\n src: \"plugin:sql\",\n syncUrl,\n agentId,\n syncKey,\n status: this.syncStatus,\n tables: tables.length,\n syncedTables: this.syncedTables,\n },\n \"Electric Sync client started for all core tables\"\n );\n } catch (err) {\n this.syncStatus = \"error\";\n this.syncError = err instanceof Error ? err.message : String(err);\n logger.error(\n { src: \"plugin:sql\", error: this.syncError },\n \"Failed to start Electric Sync client — agent continues on local PGlite\"\n );\n }\n }\n\n private async initializeInternal(): Promise<void> {\n try {\n await this.queryMigrationsSchema();\n // Sync is deferred to ensureSync() — called lazily from\n // withDatabase() after migrations have created the target tables.\n return;\n } catch (initialError) {\n const dataDir = this.getDataDir();\n if (!this.isFileBackedDataDir(dataDir)) {\n throw initialError;\n }\n\n const pidStatus = this.reconcilePglitePidFile(dataDir);\n if (\n pidStatus === \"active\" ||\n pidStatus === \"active-unconfirmed\" ||\n pidStatus === \"check-failed\"\n ) {\n throw this.createActiveLockError(dataDir, initialError);\n }\n\n if (pidStatus === \"cleared-stale\" || pidStatus === \"cleared-malformed\") {\n logger.warn(\n {\n src: \"plugin:sql\",\n dataDir,\n error: this.getErrorText(initialError),\n },\n \"Retrying PGlite initialization after clearing postmaster.pid\"\n );\n try {\n await this.client.close();\n } catch {}\n this.client = this.createClient(this.options);\n\n try {\n await this.queryMigrationsSchema();\n // Sync deferred — will be started by ensureSync() on first DB op.\n return;\n } catch (retryError) {\n logger.error(\n {\n src: \"plugin:sql\",\n dataDir,\n error: this.getErrorText(retryError),\n },\n \"PGlite initialization still failed after clearing postmaster.pid\"\n );\n throw this.createManualResetRequiredError(dataDir, retryError);\n }\n }\n\n logger.error(\n {\n src: \"plugin:sql\",\n dataDir,\n error: this.getErrorText(initialError),\n },\n \"PGlite initialization failed; manual reset required\"\n );\n throw this.createManualResetRequiredError(dataDir, initialError);\n }\n }\n}\n",
62
+ "var __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __typeError = (msg) => {\n throw TypeError(msg);\n};\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\nvar __objRest = (source, exclude) => {\n var target = {};\n for (var prop in source)\n if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)\n target[prop] = source[prop];\n if (source != null && __getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(source)) {\n if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))\n target[prop] = source[prop];\n }\n return target;\n};\nvar __accessCheck = (obj, member, msg) => member.has(obj) || __typeError(\"Cannot \" + msg);\nvar __privateGet = (obj, member, getter) => (__accessCheck(obj, member, \"read from private field\"), getter ? getter.call(obj) : member.get(obj));\nvar __privateAdd = (obj, member, value) => member.has(obj) ? __typeError(\"Cannot add the same private member more than once\") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);\nvar __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, \"write to private field\"), setter ? setter.call(obj, value) : member.set(obj, value), value);\nvar __privateMethod = (obj, member, method) => (__accessCheck(obj, member, \"access private method\"), method);\nvar __privateWrapper = (obj, member, setter, getter) => ({\n set _(value) {\n __privateSet(obj, member, value, setter);\n },\n get _() {\n return __privateGet(obj, member, getter);\n }\n});\n\n// src/error.ts\nvar FetchError = class _FetchError extends Error {\n constructor(status, text, json, headers, url, message) {\n super(\n message || `HTTP Error ${status} at ${url}: ${text != null ? text : JSON.stringify(json)}`\n );\n this.url = url;\n this.name = `FetchError`;\n this.status = status;\n this.text = text;\n this.json = json;\n this.headers = headers;\n }\n static async fromResponse(response, url) {\n const status = response.status;\n const headers = Object.fromEntries([...response.headers.entries()]);\n let text = void 0;\n let json = void 0;\n const contentType = response.headers.get(`content-type`);\n if (!response.bodyUsed) {\n if (contentType && contentType.includes(`application/json`)) {\n json = await response.json();\n } else {\n text = await response.text();\n }\n }\n return new _FetchError(status, text, json, headers, url);\n }\n};\nvar FetchBackoffAbortError = class extends Error {\n constructor() {\n super(`Fetch with backoff aborted`);\n this.name = `FetchBackoffAbortError`;\n }\n};\nvar MissingShapeUrlError = class extends Error {\n constructor() {\n super(`Invalid shape options: missing required url parameter`);\n this.name = `MissingShapeUrlError`;\n }\n};\nvar InvalidSignalError = class extends Error {\n constructor() {\n super(`Invalid signal option. It must be an instance of AbortSignal.`);\n this.name = `InvalidSignalError`;\n }\n};\nvar MissingShapeHandleError = class extends Error {\n constructor() {\n super(\n `shapeHandle is required if this isn't an initial fetch (i.e. offset > -1)`\n );\n this.name = `MissingShapeHandleError`;\n }\n};\nvar ReservedParamError = class extends Error {\n constructor(reservedParams) {\n super(\n `Cannot use reserved Electric parameter names in custom params: ${reservedParams.join(`, `)}`\n );\n this.name = `ReservedParamError`;\n }\n};\nvar ParserNullValueError = class extends Error {\n constructor(columnName) {\n super(`Column \"${columnName != null ? columnName : `unknown`}\" does not allow NULL values`);\n this.name = `ParserNullValueError`;\n }\n};\nvar MissingHeadersError = class extends Error {\n constructor(url, missingHeaders) {\n let msg = `The response for the shape request to ${url} didn't include the following required headers:\n`;\n missingHeaders.forEach((h) => {\n msg += `- ${h}\n`;\n });\n msg += `\nThis is often due to a proxy not setting CORS correctly so that all Electric headers can be read by the client.`;\n msg += `\nFor more information visit the troubleshooting guide: /docs/guides/troubleshooting/missing-headers`;\n super(msg);\n }\n};\nvar StaleCacheError = class extends Error {\n constructor(message) {\n super(message);\n this.name = `StaleCacheError`;\n }\n};\n\n// src/parser.ts\nvar parseNumber = (value) => Number(value);\nvar parseBool = (value) => value === `true` || value === `t`;\nvar parseBigInt = (value) => BigInt(value);\nvar parseJson = (value) => JSON.parse(value);\nvar identityParser = (v) => v;\nvar defaultParser = {\n int2: parseNumber,\n int4: parseNumber,\n int8: parseBigInt,\n bool: parseBool,\n float4: parseNumber,\n float8: parseNumber,\n json: parseJson,\n jsonb: parseJson\n};\nfunction pgArrayParser(value, parser) {\n let i = 0;\n let char = null;\n let str = ``;\n let quoted = false;\n let last = 0;\n let p = void 0;\n function extractValue(x, start, end) {\n let val = x.slice(start, end);\n val = val === `NULL` ? null : val;\n return parser ? parser(val) : val;\n }\n function loop(x) {\n const xs = [];\n for (; i < x.length; i++) {\n char = x[i];\n if (quoted) {\n if (char === `\\\\`) {\n str += x[++i];\n } else if (char === `\"`) {\n xs.push(parser ? parser(str) : str);\n str = ``;\n quoted = x[i + 1] === `\"`;\n last = i + 2;\n } else {\n str += char;\n }\n } else if (char === `\"`) {\n quoted = true;\n } else if (char === `{`) {\n last = ++i;\n xs.push(loop(x));\n } else if (char === `}`) {\n quoted = false;\n last < i && xs.push(extractValue(x, last, i));\n last = i + 1;\n break;\n } else if (char === `,` && p !== `}` && p !== `\"`) {\n xs.push(extractValue(x, last, i));\n last = i + 1;\n }\n p = char;\n }\n last < i && xs.push(xs.push(extractValue(x, last, i + 1)));\n return xs;\n }\n return loop(value)[0];\n}\nvar MessageParser = class {\n constructor(parser, transformer) {\n this.parser = __spreadValues(__spreadValues({}, defaultParser), parser);\n this.transformer = transformer;\n }\n parse(messages, schema) {\n return JSON.parse(messages, (key, value) => {\n if ((key === `value` || key === `old_value`) && typeof value === `object` && value !== null) {\n return this.transformMessageValue(value, schema);\n }\n return value;\n });\n }\n /**\n * Parse an array of ChangeMessages from a snapshot response.\n * Applies type parsing and transformations to the value and old_value properties.\n */\n parseSnapshotData(messages, schema) {\n return messages.map((message) => {\n const msg = message;\n if (msg.value && typeof msg.value === `object` && msg.value !== null) {\n msg.value = this.transformMessageValue(msg.value, schema);\n }\n if (msg.old_value && typeof msg.old_value === `object` && msg.old_value !== null) {\n msg.old_value = this.transformMessageValue(msg.old_value, schema);\n }\n return msg;\n });\n }\n /**\n * Transform a message value or old_value object by parsing its columns.\n */\n transformMessageValue(value, schema) {\n const row = value;\n Object.keys(row).forEach((key) => {\n row[key] = this.parseRow(key, row[key], schema);\n });\n return this.transformer ? this.transformer(row) : row;\n }\n // Parses the message values using the provided parser based on the schema information\n parseRow(key, value, schema) {\n var _b;\n const columnInfo = schema[key];\n if (!columnInfo) {\n return value;\n }\n const _a = columnInfo, { type: typ, dims: dimensions } = _a, additionalInfo = __objRest(_a, [\"type\", \"dims\"]);\n const typeParser = (_b = this.parser[typ]) != null ? _b : identityParser;\n const parser = makeNullableParser(typeParser, columnInfo, key);\n if (dimensions && dimensions > 0) {\n const nullablePgArrayParser = makeNullableParser(\n (value2, _) => pgArrayParser(value2, parser),\n columnInfo,\n key\n );\n return nullablePgArrayParser(value);\n }\n return parser(value, additionalInfo);\n }\n};\nfunction makeNullableParser(parser, columnInfo, columnName) {\n var _a;\n const isNullable = !((_a = columnInfo.not_null) != null ? _a : false);\n return (value) => {\n if (value === null) {\n if (!isNullable) {\n throw new ParserNullValueError(columnName != null ? columnName : `unknown`);\n }\n return null;\n }\n return parser(value, columnInfo);\n };\n}\n\n// src/column-mapper.ts\nfunction quoteIdentifier(identifier) {\n const escaped = identifier.replace(/\"/g, `\"\"`);\n return `\"${escaped}\"`;\n}\nfunction snakeToCamel(str) {\n var _a, _b, _c, _d;\n const leadingUnderscores = (_b = (_a = str.match(/^_+/)) == null ? void 0 : _a[0]) != null ? _b : ``;\n const withoutLeading = str.slice(leadingUnderscores.length);\n const trailingUnderscores = (_d = (_c = withoutLeading.match(/_+$/)) == null ? void 0 : _c[0]) != null ? _d : ``;\n const core = trailingUnderscores ? withoutLeading.slice(\n 0,\n withoutLeading.length - trailingUnderscores.length\n ) : withoutLeading;\n const normalized = core.toLowerCase();\n const camelCased = normalized.replace(/_+([a-z])/g, (match, letter) => {\n const extraUnderscores = `_`.repeat(match.length - 2);\n return extraUnderscores + letter.toUpperCase();\n });\n return leadingUnderscores + camelCased + trailingUnderscores;\n}\nfunction camelToSnake(str) {\n return str.replace(/([a-z_])([A-Z])/g, `$1_$2`).replace(/([A-Z]+)([A-Z][a-z])/g, `$1_$2`).toLowerCase();\n}\nfunction createColumnMapper(mapping) {\n const reverseMapping = {};\n for (const [dbName, appName] of Object.entries(mapping)) {\n reverseMapping[appName] = dbName;\n }\n return {\n decode: (dbColumnName) => {\n var _a;\n return (_a = mapping[dbColumnName]) != null ? _a : dbColumnName;\n },\n encode: (appColumnName) => {\n var _a;\n return (_a = reverseMapping[appColumnName]) != null ? _a : appColumnName;\n }\n };\n}\nfunction encodeWhereClause(whereClause, encode) {\n if (!whereClause || !encode) return whereClause != null ? whereClause : ``;\n const sqlKeywords = /* @__PURE__ */ new Set([\n `SELECT`,\n `FROM`,\n `WHERE`,\n `AND`,\n `OR`,\n `NOT`,\n `IN`,\n `IS`,\n `NULL`,\n `NULLS`,\n `FIRST`,\n `LAST`,\n `TRUE`,\n `FALSE`,\n `LIKE`,\n `ILIKE`,\n `BETWEEN`,\n `ASC`,\n `DESC`,\n `LIMIT`,\n `OFFSET`,\n `ORDER`,\n `BY`,\n `GROUP`,\n `HAVING`,\n `DISTINCT`,\n `AS`,\n `ON`,\n `JOIN`,\n `LEFT`,\n `RIGHT`,\n `INNER`,\n `OUTER`,\n `CROSS`,\n `CASE`,\n `WHEN`,\n `THEN`,\n `ELSE`,\n `END`,\n `CAST`,\n `LOWER`,\n `UPPER`,\n `COALESCE`,\n `NULLIF`\n ]);\n const quotedRanges = [];\n let pos = 0;\n while (pos < whereClause.length) {\n const ch = whereClause[pos];\n if (ch === `'` || ch === `\"`) {\n const start = pos;\n const quoteChar = ch;\n pos++;\n while (pos < whereClause.length) {\n if (whereClause[pos] === quoteChar) {\n if (whereClause[pos + 1] === quoteChar) {\n pos += 2;\n } else {\n pos++;\n break;\n }\n } else {\n pos++;\n }\n }\n quotedRanges.push({ start, end: pos });\n } else {\n pos++;\n }\n }\n const isInQuotedString = (pos2) => {\n return quotedRanges.some((range) => pos2 >= range.start && pos2 < range.end);\n };\n const identifierPattern = new RegExp(\"(?<![a-zA-Z0-9_])([a-zA-Z_][a-zA-Z0-9_]*)(?![a-zA-Z0-9_])\", \"g\");\n return whereClause.replace(identifierPattern, (match, _p1, offset) => {\n if (isInQuotedString(offset)) {\n return match;\n }\n if (sqlKeywords.has(match.toUpperCase())) {\n return match;\n }\n if (match.startsWith(`$`)) {\n return match;\n }\n const encoded = encode(match);\n return encoded;\n });\n}\nfunction snakeCamelMapper(schema) {\n if (schema) {\n const mapping = {};\n for (const dbColumn of Object.keys(schema)) {\n mapping[dbColumn] = snakeToCamel(dbColumn);\n }\n return createColumnMapper(mapping);\n }\n return {\n decode: (dbColumnName) => {\n return snakeToCamel(dbColumnName);\n },\n encode: (appColumnName) => {\n return camelToSnake(appColumnName);\n }\n };\n}\n\n// src/helpers.ts\nfunction isChangeMessage(message) {\n return message != null && `key` in message;\n}\nfunction isControlMessage(message) {\n return message != null && `headers` in message && `control` in message.headers;\n}\nfunction isUpToDateMessage(message) {\n return isControlMessage(message) && message.headers.control === `up-to-date`;\n}\nfunction getOffset(message) {\n if (message.headers.control != `up-to-date`) return;\n const lsn = message.headers.global_last_seen_lsn;\n return lsn ? `${lsn}_0` : void 0;\n}\nfunction bigintReplacer(_key, value) {\n return typeof value === `bigint` ? value.toString() : value;\n}\nfunction bigintSafeStringify(value) {\n return JSON.stringify(value, bigintReplacer);\n}\nfunction canonicalBigintSafeStringify(value) {\n return JSON.stringify(canonicalize(value));\n}\nfunction canonicalize(value) {\n if (typeof value === `bigint`) return value.toString();\n if (value === null || typeof value !== `object`) return value;\n if (Array.isArray(value)) return value.map(canonicalize);\n const sorted = {};\n for (const k of Object.keys(value).sort()) {\n sorted[k] = canonicalize(value[k]);\n }\n return sorted;\n}\nfunction isVisibleInSnapshot(txid, snapshot) {\n const xid = BigInt(txid);\n const xmin = BigInt(snapshot.xmin);\n const xmax = BigInt(snapshot.xmax);\n const xip = snapshot.xip_list.map(BigInt);\n return xid < xmin || xid < xmax && !xip.includes(xid);\n}\n\n// src/constants.ts\nvar LIVE_CACHE_BUSTER_HEADER = `electric-cursor`;\nvar SHAPE_HANDLE_HEADER = `electric-handle`;\nvar CHUNK_LAST_OFFSET_HEADER = `electric-offset`;\nvar SHAPE_SCHEMA_HEADER = `electric-schema`;\nvar CHUNK_UP_TO_DATE_HEADER = `electric-up-to-date`;\nvar COLUMNS_QUERY_PARAM = `columns`;\nvar LIVE_CACHE_BUSTER_QUERY_PARAM = `cursor`;\nvar EXPIRED_HANDLE_QUERY_PARAM = `expired_handle`;\nvar SHAPE_HANDLE_QUERY_PARAM = `handle`;\nvar LIVE_QUERY_PARAM = `live`;\nvar OFFSET_QUERY_PARAM = `offset`;\nvar TABLE_QUERY_PARAM = `table`;\nvar WHERE_QUERY_PARAM = `where`;\nvar REPLICA_PARAM = `replica`;\nvar WHERE_PARAMS_PARAM = `params`;\nvar EXPERIMENTAL_LIVE_SSE_QUERY_PARAM = `experimental_live_sse`;\nvar LIVE_SSE_QUERY_PARAM = `live_sse`;\nvar FORCE_DISCONNECT_AND_REFRESH = `force-disconnect-and-refresh`;\nvar PAUSE_STREAM = `pause-stream`;\nvar SYSTEM_WAKE = `system-wake`;\nvar LOG_MODE_QUERY_PARAM = `log`;\nvar SUBSET_PARAM_WHERE = `subset__where`;\nvar SUBSET_PARAM_LIMIT = `subset__limit`;\nvar SUBSET_PARAM_OFFSET = `subset__offset`;\nvar SUBSET_PARAM_ORDER_BY = `subset__order_by`;\nvar SUBSET_PARAM_WHERE_PARAMS = `subset__params`;\nvar SUBSET_PARAM_WHERE_EXPR = `subset__where_expr`;\nvar SUBSET_PARAM_ORDER_BY_EXPR = `subset__order_by_expr`;\nvar CACHE_BUSTER_QUERY_PARAM = `cache-buster`;\nvar ELECTRIC_PROTOCOL_QUERY_PARAMS = [\n LIVE_QUERY_PARAM,\n LIVE_SSE_QUERY_PARAM,\n EXPERIMENTAL_LIVE_SSE_QUERY_PARAM,\n SHAPE_HANDLE_QUERY_PARAM,\n OFFSET_QUERY_PARAM,\n LIVE_CACHE_BUSTER_QUERY_PARAM,\n EXPIRED_HANDLE_QUERY_PARAM,\n LOG_MODE_QUERY_PARAM,\n SUBSET_PARAM_WHERE,\n SUBSET_PARAM_LIMIT,\n SUBSET_PARAM_OFFSET,\n SUBSET_PARAM_ORDER_BY,\n SUBSET_PARAM_WHERE_PARAMS,\n SUBSET_PARAM_WHERE_EXPR,\n SUBSET_PARAM_ORDER_BY_EXPR,\n CACHE_BUSTER_QUERY_PARAM\n];\n\n// src/fetch.ts\nvar HTTP_RETRY_STATUS_CODES = [429];\nvar BackoffDefaults = {\n initialDelay: 1e3,\n maxDelay: 32e3,\n multiplier: 2,\n maxRetries: Infinity\n // Retry forever - clients may go offline and come back\n};\nfunction parseRetryAfterHeader(retryAfter) {\n if (!retryAfter) return 0;\n const retryAfterSec = Number(retryAfter);\n if (Number.isFinite(retryAfterSec) && retryAfterSec > 0) {\n return retryAfterSec * 1e3;\n }\n const retryDate = Date.parse(retryAfter);\n if (!isNaN(retryDate)) {\n const deltaMs = retryDate - Date.now();\n return Math.max(0, Math.min(deltaMs, 36e5));\n }\n return 0;\n}\nfunction createFetchWithBackoff(fetchClient, backoffOptions = BackoffDefaults) {\n const {\n initialDelay,\n maxDelay,\n multiplier,\n debug = false,\n onFailedAttempt,\n maxRetries = Infinity\n } = backoffOptions;\n return async (...args) => {\n var _a;\n const url = args[0];\n const options = args[1];\n let delay = initialDelay;\n let attempt = 0;\n while (true) {\n try {\n const result = await fetchClient(...args);\n if (result.ok) {\n return result;\n }\n const err = await FetchError.fromResponse(result, url.toString());\n throw err;\n } catch (e) {\n onFailedAttempt == null ? void 0 : onFailedAttempt();\n if ((_a = options == null ? void 0 : options.signal) == null ? void 0 : _a.aborted) {\n throw new FetchBackoffAbortError();\n } else if (e instanceof FetchError && !HTTP_RETRY_STATUS_CODES.includes(e.status) && e.status >= 400 && e.status < 500) {\n throw e;\n } else {\n attempt++;\n if (attempt > maxRetries) {\n if (debug) {\n console.log(\n `Max retries reached (${attempt}/${maxRetries}), giving up`\n );\n }\n throw e;\n }\n const serverMinimumMs = e instanceof FetchError && e.headers ? parseRetryAfterHeader(e.headers[`retry-after`]) : 0;\n const jitter = Math.random() * delay;\n const clientBackoffMs = Math.min(jitter, maxDelay);\n const waitMs = Math.max(serverMinimumMs, clientBackoffMs);\n if (debug) {\n const source = serverMinimumMs > 0 ? `server+client` : `client`;\n console.log(\n `Retry attempt #${attempt} after ${waitMs}ms (${source}, serverMin=${serverMinimumMs}ms, clientBackoff=${clientBackoffMs}ms)`\n );\n }\n await new Promise((resolve) => setTimeout(resolve, waitMs));\n delay = Math.min(delay * multiplier, maxDelay);\n }\n }\n }\n };\n}\nvar NO_BODY_STATUS_CODES = [201, 204, 205];\nfunction createFetchWithConsumedMessages(fetchClient) {\n return async (...args) => {\n var _a, _b;\n const url = args[0];\n const res = await fetchClient(...args);\n try {\n if (res.status < 200 || NO_BODY_STATUS_CODES.includes(res.status)) {\n return res;\n }\n const text = await res.text();\n return new Response(text, res);\n } catch (err) {\n if ((_b = (_a = args[1]) == null ? void 0 : _a.signal) == null ? void 0 : _b.aborted) {\n throw new FetchBackoffAbortError();\n }\n throw new FetchError(\n res.status,\n void 0,\n void 0,\n Object.fromEntries([...res.headers.entries()]),\n url.toString(),\n err instanceof Error ? err.message : typeof err === `string` ? err : `failed to read body`\n );\n }\n };\n}\nvar ChunkPrefetchDefaults = {\n maxChunksToPrefetch: 2\n};\nfunction createFetchWithChunkBuffer(fetchClient, prefetchOptions = ChunkPrefetchDefaults) {\n const { maxChunksToPrefetch } = prefetchOptions;\n let prefetchQueue;\n const prefetchClient = async (...args) => {\n const url = args[0].toString();\n const method = getRequestMethod(args[0], args[1]);\n if (method !== `GET`) {\n prefetchQueue == null ? void 0 : prefetchQueue.abort();\n prefetchQueue = void 0;\n return fetchClient(...args);\n }\n const prefetchedRequest = prefetchQueue == null ? void 0 : prefetchQueue.consume(...args);\n if (prefetchedRequest) {\n return prefetchedRequest;\n }\n prefetchQueue == null ? void 0 : prefetchQueue.abort();\n prefetchQueue = void 0;\n const response = await fetchClient(...args);\n const nextUrl = getNextChunkUrl(url, response);\n if (nextUrl) {\n prefetchQueue = new PrefetchQueue({\n fetchClient,\n maxPrefetchedRequests: maxChunksToPrefetch,\n url: nextUrl,\n requestInit: args[1]\n });\n }\n return response;\n };\n return prefetchClient;\n}\nvar requiredElectricResponseHeaders = [\n CHUNK_LAST_OFFSET_HEADER,\n SHAPE_HANDLE_HEADER\n];\nvar requiredLiveResponseHeaders = [LIVE_CACHE_BUSTER_HEADER];\nvar requiredNonLiveResponseHeaders = [SHAPE_SCHEMA_HEADER];\nfunction createFetchWithResponseHeadersCheck(fetchClient) {\n return async (...args) => {\n const response = await fetchClient(...args);\n if (response.ok) {\n const headers = response.headers;\n const missingHeaders = [];\n const addMissingHeaders = (requiredHeaders) => missingHeaders.push(...requiredHeaders.filter((h) => !headers.has(h)));\n const input = args[0];\n const urlString = input.toString();\n const url = new URL(urlString);\n const isSnapshotRequest = [\n SUBSET_PARAM_WHERE,\n SUBSET_PARAM_WHERE_PARAMS,\n SUBSET_PARAM_LIMIT,\n SUBSET_PARAM_OFFSET,\n SUBSET_PARAM_ORDER_BY\n ].some((p) => url.searchParams.has(p));\n if (isSnapshotRequest) {\n return response;\n }\n addMissingHeaders(requiredElectricResponseHeaders);\n if (url.searchParams.get(LIVE_QUERY_PARAM) === `true`) {\n addMissingHeaders(requiredLiveResponseHeaders);\n }\n if (!url.searchParams.has(LIVE_QUERY_PARAM) || url.searchParams.get(LIVE_QUERY_PARAM) === `false`) {\n addMissingHeaders(requiredNonLiveResponseHeaders);\n }\n if (missingHeaders.length > 0) {\n throw new MissingHeadersError(urlString, missingHeaders);\n }\n }\n return response;\n };\n}\nvar _fetchClient, _maxPrefetchedRequests, _prefetchQueue, _queueHeadUrl, _queueTailUrl, _PrefetchQueue_instances, prefetch_fn;\nvar PrefetchQueue = class {\n constructor(options) {\n __privateAdd(this, _PrefetchQueue_instances);\n __privateAdd(this, _fetchClient);\n __privateAdd(this, _maxPrefetchedRequests);\n __privateAdd(this, _prefetchQueue, /* @__PURE__ */ new Map());\n __privateAdd(this, _queueHeadUrl);\n __privateAdd(this, _queueTailUrl);\n var _a;\n __privateSet(this, _fetchClient, (_a = options.fetchClient) != null ? _a : (...args) => fetch(...args));\n __privateSet(this, _maxPrefetchedRequests, options.maxPrefetchedRequests);\n __privateSet(this, _queueHeadUrl, options.url.toString());\n __privateSet(this, _queueTailUrl, __privateGet(this, _queueHeadUrl));\n __privateMethod(this, _PrefetchQueue_instances, prefetch_fn).call(this, options.url, options.requestInit);\n }\n abort() {\n __privateGet(this, _prefetchQueue).forEach(([_, aborter]) => aborter.abort());\n __privateGet(this, _prefetchQueue).clear();\n }\n consume(...args) {\n const url = args[0].toString();\n const entry = __privateGet(this, _prefetchQueue).get(url);\n if (!entry || url !== __privateGet(this, _queueHeadUrl)) return;\n const [request, aborter] = entry;\n if (aborter.signal.aborted) {\n __privateGet(this, _prefetchQueue).delete(url);\n return;\n }\n __privateGet(this, _prefetchQueue).delete(url);\n request.then((response) => {\n const nextUrl = getNextChunkUrl(url, response);\n __privateSet(this, _queueHeadUrl, nextUrl);\n if (__privateGet(this, _queueTailUrl) && !__privateGet(this, _prefetchQueue).has(__privateGet(this, _queueTailUrl))) {\n __privateMethod(this, _PrefetchQueue_instances, prefetch_fn).call(this, __privateGet(this, _queueTailUrl), args[1]);\n }\n }).catch(() => {\n });\n return request;\n }\n};\n_fetchClient = new WeakMap();\n_maxPrefetchedRequests = new WeakMap();\n_prefetchQueue = new WeakMap();\n_queueHeadUrl = new WeakMap();\n_queueTailUrl = new WeakMap();\n_PrefetchQueue_instances = new WeakSet();\nprefetch_fn = function(...args) {\n var _a, _b;\n const url = args[0].toString();\n if (__privateGet(this, _prefetchQueue).size >= __privateGet(this, _maxPrefetchedRequests)) return;\n const aborter = new AbortController();\n try {\n const { signal, cleanup } = chainAborter(aborter, (_a = args[1]) == null ? void 0 : _a.signal);\n const request = __privateGet(this, _fetchClient).call(this, url, __spreadProps(__spreadValues({}, (_b = args[1]) != null ? _b : {}), { signal }));\n __privateGet(this, _prefetchQueue).set(url, [request, aborter]);\n request.then((response) => {\n if (!response.ok || aborter.signal.aborted) return;\n const nextUrl = getNextChunkUrl(url, response);\n if (!nextUrl || nextUrl === url) {\n __privateSet(this, _queueTailUrl, void 0);\n return;\n }\n __privateSet(this, _queueTailUrl, nextUrl);\n return __privateMethod(this, _PrefetchQueue_instances, prefetch_fn).call(this, nextUrl, args[1]);\n }).catch(() => {\n }).finally(cleanup);\n } catch (_) {\n }\n};\nfunction getNextChunkUrl(url, res) {\n const shapeHandle = res.headers.get(SHAPE_HANDLE_HEADER);\n const lastOffset = res.headers.get(CHUNK_LAST_OFFSET_HEADER);\n const isUpToDate = res.headers.has(CHUNK_UP_TO_DATE_HEADER);\n if (!shapeHandle || !lastOffset || isUpToDate) return;\n const nextUrl = new URL(url);\n if (nextUrl.searchParams.has(LIVE_QUERY_PARAM)) return;\n const expiredHandle = nextUrl.searchParams.get(EXPIRED_HANDLE_QUERY_PARAM);\n if (expiredHandle && shapeHandle === expiredHandle) {\n console.warn(\n `[Electric] Received stale cached response with expired shape handle. This should not happen and indicates a proxy/CDN caching misconfiguration. The response contained handle \"${shapeHandle}\" which was previously marked as expired. Check that your proxy includes all query parameters (especially 'handle' and 'offset') in its cache key. Skipping prefetch to prevent infinite 409 loop.`\n );\n return;\n }\n nextUrl.searchParams.set(SHAPE_HANDLE_QUERY_PARAM, shapeHandle);\n nextUrl.searchParams.set(OFFSET_QUERY_PARAM, lastOffset);\n nextUrl.searchParams.sort();\n return nextUrl.toString();\n}\nfunction chainAborter(aborter, sourceSignal) {\n let cleanup = noop;\n if (!sourceSignal) {\n } else if (sourceSignal.aborted) {\n aborter.abort();\n } else {\n const abortParent = () => aborter.abort();\n sourceSignal.addEventListener(`abort`, abortParent, {\n once: true,\n signal: aborter.signal\n });\n cleanup = () => sourceSignal.removeEventListener(`abort`, abortParent);\n }\n return {\n signal: aborter.signal,\n cleanup\n };\n}\nfunction noop() {\n}\nfunction getRequestMethod(input, init) {\n if (init == null ? void 0 : init.method) {\n return init.method.toUpperCase();\n }\n if (typeof Request !== `undefined` && input instanceof Request) {\n return input.method.toUpperCase();\n }\n return `GET`;\n}\n\n// src/expression-compiler.ts\nfunction compileExpression(expr, columnMapper) {\n switch (expr.type) {\n case `ref`: {\n const mappedColumn = columnMapper ? columnMapper(expr.column) : expr.column;\n return quoteIdentifier(mappedColumn);\n }\n case `val`:\n return `$${expr.paramIndex}`;\n case `func`:\n return compileFunction(expr, columnMapper);\n default: {\n const _exhaustive = expr;\n throw new Error(`Unknown expression type: ${JSON.stringify(_exhaustive)}`);\n }\n }\n}\nfunction compileFunction(expr, columnMapper) {\n const args = expr.args.map((arg) => compileExpression(arg, columnMapper));\n switch (expr.name) {\n // Binary comparison operators\n case `eq`:\n return `${args[0]} = ${args[1]}`;\n case `gt`:\n return `${args[0]} > ${args[1]}`;\n case `gte`:\n return `${args[0]} >= ${args[1]}`;\n case `lt`:\n return `${args[0]} < ${args[1]}`;\n case `lte`:\n return `${args[0]} <= ${args[1]}`;\n // Logical operators\n case `and`:\n return args.map((a) => `(${a})`).join(` AND `);\n case `or`:\n return args.map((a) => `(${a})`).join(` OR `);\n case `not`:\n return `NOT (${args[0]})`;\n // Special operators\n case `in`:\n return `${args[0]} = ANY(${args[1]})`;\n case `like`:\n return `${args[0]} LIKE ${args[1]}`;\n case `ilike`:\n return `${args[0]} ILIKE ${args[1]}`;\n case `isNull`:\n case `isUndefined`:\n return `${args[0]} IS NULL`;\n // String functions\n case `upper`:\n return `UPPER(${args[0]})`;\n case `lower`:\n return `LOWER(${args[0]})`;\n case `length`:\n return `LENGTH(${args[0]})`;\n case `concat`:\n return `CONCAT(${args.join(`, `)})`;\n // Other functions\n case `coalesce`:\n return `COALESCE(${args.join(`, `)})`;\n default:\n throw new Error(`Unknown function: ${expr.name}`);\n }\n}\nfunction compileOrderBy(clauses, columnMapper) {\n return clauses.map((clause) => {\n const mappedColumn = columnMapper ? columnMapper(clause.column) : clause.column;\n let sql = quoteIdentifier(mappedColumn);\n if (clause.direction === `desc`) sql += ` DESC`;\n if (clause.nulls === `first`) sql += ` NULLS FIRST`;\n if (clause.nulls === `last`) sql += ` NULLS LAST`;\n return sql;\n }).join(`, `);\n}\n\n// ../../node_modules/.pnpm/@microsoft+fetch-event-source@2.0.1_patch_hash=46f4e76dd960e002a542732bb4323817a24fce1673cb71e2f458fe09776fa188/node_modules/@microsoft/fetch-event-source/lib/esm/parse.js\nasync function getBytes(stream, onChunk) {\n const reader = stream.getReader();\n let result;\n while (!(result = await reader.read()).done) {\n onChunk(result.value);\n }\n}\nfunction getLines(onLine) {\n let buffer;\n let position;\n let fieldLength;\n let discardTrailingNewline = false;\n return function onChunk(arr) {\n if (buffer === void 0) {\n buffer = arr;\n position = 0;\n fieldLength = -1;\n } else {\n buffer = concat(buffer, arr);\n }\n const bufLength = buffer.length;\n let lineStart = 0;\n while (position < bufLength) {\n if (discardTrailingNewline) {\n if (buffer[position] === 10) {\n lineStart = ++position;\n }\n discardTrailingNewline = false;\n }\n let lineEnd = -1;\n for (; position < bufLength && lineEnd === -1; ++position) {\n switch (buffer[position]) {\n case 58:\n if (fieldLength === -1) {\n fieldLength = position - lineStart;\n }\n break;\n case 13:\n discardTrailingNewline = true;\n case 10:\n lineEnd = position;\n break;\n }\n }\n if (lineEnd === -1) {\n break;\n }\n onLine(buffer.subarray(lineStart, lineEnd), fieldLength);\n lineStart = position;\n fieldLength = -1;\n }\n if (lineStart === bufLength) {\n buffer = void 0;\n } else if (lineStart !== 0) {\n buffer = buffer.subarray(lineStart);\n position -= lineStart;\n }\n };\n}\nfunction getMessages(onId, onRetry, onMessage) {\n let message = newMessage();\n const decoder = new TextDecoder();\n return function onLine(line, fieldLength) {\n if (line.length === 0) {\n onMessage === null || onMessage === void 0 ? void 0 : onMessage(message);\n message = newMessage();\n } else if (fieldLength > 0) {\n const field = decoder.decode(line.subarray(0, fieldLength));\n const valueOffset = fieldLength + (line[fieldLength + 1] === 32 ? 2 : 1);\n const value = decoder.decode(line.subarray(valueOffset));\n switch (field) {\n case \"data\":\n message.data = message.data ? message.data + \"\\n\" + value : value;\n break;\n case \"event\":\n message.event = value;\n break;\n case \"id\":\n onId(message.id = value);\n break;\n case \"retry\":\n const retry = parseInt(value, 10);\n if (!isNaN(retry)) {\n onRetry(message.retry = retry);\n }\n break;\n }\n }\n };\n}\nfunction concat(a, b) {\n const res = new Uint8Array(a.length + b.length);\n res.set(a);\n res.set(b, a.length);\n return res;\n}\nfunction newMessage() {\n return {\n data: \"\",\n event: \"\",\n id: \"\",\n retry: void 0\n };\n}\n\n// ../../node_modules/.pnpm/@microsoft+fetch-event-source@2.0.1_patch_hash=46f4e76dd960e002a542732bb4323817a24fce1673cb71e2f458fe09776fa188/node_modules/@microsoft/fetch-event-source/lib/esm/fetch.js\nvar __rest = function(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\nvar EventStreamContentType = \"text/event-stream\";\nvar DefaultRetryInterval = 1e3;\nvar LastEventId = \"last-event-id\";\nfunction fetchEventSource(input, _a) {\n var { signal: inputSignal, headers: inputHeaders, onopen: inputOnOpen, onmessage, onclose, onerror, openWhenHidden, fetch: inputFetch } = _a, rest = __rest(_a, [\"signal\", \"headers\", \"onopen\", \"onmessage\", \"onclose\", \"onerror\", \"openWhenHidden\", \"fetch\"]);\n return new Promise((resolve, reject) => {\n const headers = Object.assign({}, inputHeaders);\n if (!headers.accept) {\n headers.accept = EventStreamContentType;\n }\n let curRequestController;\n function onVisibilityChange() {\n curRequestController.abort();\n if (typeof document !== \"undefined\" && !document.hidden) {\n create();\n }\n }\n if (typeof document !== \"undefined\" && !openWhenHidden) {\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n }\n let retryInterval = DefaultRetryInterval;\n let retryTimer = 0;\n function dispose() {\n if (typeof document !== \"undefined\") {\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n }\n clearTimeout(retryTimer);\n curRequestController.abort();\n }\n inputSignal === null || inputSignal === void 0 ? void 0 : inputSignal.addEventListener(\"abort\", () => {\n dispose();\n });\n const fetch2 = inputFetch !== null && inputFetch !== void 0 ? inputFetch : window.fetch;\n const onopen = inputOnOpen !== null && inputOnOpen !== void 0 ? inputOnOpen : defaultOnOpen;\n async function create() {\n var _a2;\n curRequestController = new AbortController();\n const sig = inputSignal.aborted ? inputSignal : curRequestController.signal;\n try {\n const response = await fetch2(input, Object.assign(Object.assign({}, rest), { headers, signal: sig }));\n await onopen(response);\n await getBytes(response.body, getLines(getMessages((id) => {\n if (id) {\n headers[LastEventId] = id;\n } else {\n delete headers[LastEventId];\n }\n }, (retry) => {\n retryInterval = retry;\n }, onmessage)));\n onclose === null || onclose === void 0 ? void 0 : onclose();\n dispose();\n resolve();\n } catch (err) {\n if (sig.aborted) {\n dispose();\n reject(err);\n } else if (!curRequestController.signal.aborted) {\n try {\n const interval = (_a2 = onerror === null || onerror === void 0 ? void 0 : onerror(err)) !== null && _a2 !== void 0 ? _a2 : retryInterval;\n clearTimeout(retryTimer);\n retryTimer = setTimeout(create, interval);\n } catch (innerErr) {\n dispose();\n reject(innerErr);\n }\n }\n }\n }\n create();\n });\n}\nfunction defaultOnOpen(response) {\n const contentType = response.headers.get(\"content-type\");\n if (!(contentType === null || contentType === void 0 ? void 0 : contentType.startsWith(EventStreamContentType))) {\n throw new Error(`Expected content-type to be ${EventStreamContentType}, Actual: ${contentType}`);\n }\n}\n\n// src/expired-shapes-cache.ts\nvar ExpiredShapesCache = class {\n constructor() {\n this.data = {};\n this.max = 250;\n this.storageKey = `electric_expired_shapes`;\n this.load();\n }\n getExpiredHandle(shapeUrl) {\n const entry = this.data[shapeUrl];\n if (entry) {\n entry.lastUsed = Date.now();\n this.save();\n return entry.expiredHandle;\n }\n return null;\n }\n markExpired(shapeUrl, handle) {\n this.data[shapeUrl] = { expiredHandle: handle, lastUsed: Date.now() };\n const keys = Object.keys(this.data);\n if (keys.length > this.max) {\n const oldest = keys.reduce(\n (min, k) => this.data[k].lastUsed < this.data[min].lastUsed ? k : min\n );\n delete this.data[oldest];\n }\n this.save();\n }\n save() {\n if (typeof localStorage === `undefined`) return;\n try {\n localStorage.setItem(this.storageKey, JSON.stringify(this.data));\n } catch (e) {\n }\n }\n load() {\n if (typeof localStorage === `undefined`) return;\n try {\n const stored = localStorage.getItem(this.storageKey);\n if (stored) {\n this.data = JSON.parse(stored);\n }\n } catch (e) {\n this.data = {};\n }\n }\n clear() {\n this.data = {};\n this.save();\n }\n delete(shapeUrl) {\n delete this.data[shapeUrl];\n this.save();\n }\n};\nvar expiredShapesCache = new ExpiredShapesCache();\n\n// src/up-to-date-tracker.ts\nvar UpToDateTracker = class {\n constructor() {\n this.data = {};\n this.storageKey = `electric_up_to_date_tracker`;\n this.cacheTTL = 6e4;\n // 60s to match typical CDN s-maxage cache duration\n this.maxEntries = 250;\n this.writeThrottleMs = 6e4;\n // Throttle localStorage writes to once per 60s\n this.lastWriteTime = 0;\n this.load();\n this.cleanup();\n }\n /**\n * Records that a shape received an up-to-date message with a specific cursor.\n * This timestamp and cursor are used to detect cache replay scenarios.\n * Updates in-memory immediately, but throttles localStorage writes.\n */\n recordUpToDate(shapeKey, cursor) {\n this.data[shapeKey] = {\n timestamp: Date.now(),\n cursor\n };\n const keys = Object.keys(this.data);\n if (keys.length > this.maxEntries) {\n const oldest = keys.reduce(\n (min, k) => this.data[k].timestamp < this.data[min].timestamp ? k : min\n );\n delete this.data[oldest];\n }\n this.scheduleSave();\n }\n /**\n * Schedules a throttled save to localStorage.\n * Writes immediately if enough time has passed, otherwise schedules for later.\n */\n scheduleSave() {\n const now = Date.now();\n const timeSinceLastWrite = now - this.lastWriteTime;\n if (timeSinceLastWrite >= this.writeThrottleMs) {\n this.lastWriteTime = now;\n this.save();\n } else if (!this.pendingSaveTimer) {\n const delay = this.writeThrottleMs - timeSinceLastWrite;\n this.pendingSaveTimer = setTimeout(() => {\n this.lastWriteTime = Date.now();\n this.pendingSaveTimer = void 0;\n this.save();\n }, delay);\n }\n }\n /**\n * Checks if we should enter replay mode for this shape.\n * Returns the last seen cursor if there's a recent up-to-date (< 60s),\n * which means we'll likely be replaying cached responses.\n * Returns null if no recent up-to-date exists.\n */\n shouldEnterReplayMode(shapeKey) {\n const entry = this.data[shapeKey];\n if (!entry) {\n return null;\n }\n const age = Date.now() - entry.timestamp;\n if (age >= this.cacheTTL) {\n return null;\n }\n return entry.cursor;\n }\n /**\n * Cleans up expired entries from the cache.\n * Called on initialization and can be called periodically.\n */\n cleanup() {\n const now = Date.now();\n const keys = Object.keys(this.data);\n let modified = false;\n for (const key of keys) {\n const age = now - this.data[key].timestamp;\n if (age > this.cacheTTL) {\n delete this.data[key];\n modified = true;\n }\n }\n if (modified) {\n this.save();\n }\n }\n save() {\n if (typeof localStorage === `undefined`) return;\n try {\n localStorage.setItem(this.storageKey, JSON.stringify(this.data));\n } catch (e) {\n }\n }\n load() {\n if (typeof localStorage === `undefined`) return;\n try {\n const stored = localStorage.getItem(this.storageKey);\n if (stored) {\n this.data = JSON.parse(stored);\n }\n } catch (e) {\n this.data = {};\n }\n }\n /**\n * Clears all tracked up-to-date timestamps.\n * Useful for testing or manual cache invalidation.\n */\n clear() {\n this.data = {};\n if (this.pendingSaveTimer) {\n clearTimeout(this.pendingSaveTimer);\n this.pendingSaveTimer = void 0;\n }\n this.save();\n }\n delete(shapeKey) {\n delete this.data[shapeKey];\n this.save();\n }\n};\nvar upToDateTracker = new UpToDateTracker();\n\n// src/snapshot-tracker.ts\nvar _SnapshotTracker_instances, detachFromReverseIndexes_fn, addToSet_fn, removeFromSet_fn;\nvar SnapshotTracker = class {\n constructor() {\n __privateAdd(this, _SnapshotTracker_instances);\n this.activeSnapshots = /* @__PURE__ */ new Map();\n this.xmaxSnapshots = /* @__PURE__ */ new Map();\n this.snapshotsByDatabaseLsn = /* @__PURE__ */ new Map();\n }\n /**\n * Add a new snapshot for tracking\n */\n addSnapshot(metadata, keys) {\n __privateMethod(this, _SnapshotTracker_instances, detachFromReverseIndexes_fn).call(this, metadata.snapshot_mark);\n const xmax = BigInt(metadata.xmax);\n const databaseLsn = BigInt(metadata.database_lsn);\n this.activeSnapshots.set(metadata.snapshot_mark, {\n xmin: BigInt(metadata.xmin),\n xmax,\n xip_list: metadata.xip_list.map(BigInt),\n keys,\n databaseLsn\n });\n __privateMethod(this, _SnapshotTracker_instances, addToSet_fn).call(this, this.xmaxSnapshots, xmax, metadata.snapshot_mark);\n __privateMethod(this, _SnapshotTracker_instances, addToSet_fn).call(this, this.snapshotsByDatabaseLsn, databaseLsn, metadata.snapshot_mark);\n }\n /**\n * Remove a snapshot from tracking\n */\n removeSnapshot(snapshotMark) {\n __privateMethod(this, _SnapshotTracker_instances, detachFromReverseIndexes_fn).call(this, snapshotMark);\n this.activeSnapshots.delete(snapshotMark);\n }\n /**\n * Check if a change message should be filtered because its already in an active snapshot\n * Returns true if the message should be filtered out (not processed)\n */\n shouldRejectMessage(message) {\n const txids = message.headers.txids || [];\n if (txids.length === 0) return false;\n const xid = Math.max(...txids);\n for (const [xmax, snapshots] of this.xmaxSnapshots.entries()) {\n if (xid >= xmax) {\n for (const snapshot of snapshots) {\n this.removeSnapshot(snapshot);\n }\n }\n }\n return [...this.activeSnapshots.values()].some(\n (x) => x.keys.has(message.key) && isVisibleInSnapshot(xid, x)\n );\n }\n lastSeenUpdate(newDatabaseLsn) {\n for (const [dbLsn, snapshots] of this.snapshotsByDatabaseLsn.entries()) {\n if (dbLsn <= newDatabaseLsn) {\n for (const snapshot of snapshots) {\n this.removeSnapshot(snapshot);\n }\n }\n }\n }\n};\n_SnapshotTracker_instances = new WeakSet();\ndetachFromReverseIndexes_fn = function(snapshotMark) {\n const existing = this.activeSnapshots.get(snapshotMark);\n if (!existing) return;\n __privateMethod(this, _SnapshotTracker_instances, removeFromSet_fn).call(this, this.xmaxSnapshots, existing.xmax, snapshotMark);\n __privateMethod(this, _SnapshotTracker_instances, removeFromSet_fn).call(this, this.snapshotsByDatabaseLsn, existing.databaseLsn, snapshotMark);\n};\naddToSet_fn = function(map, key, value) {\n const set = map.get(key);\n if (set) {\n set.add(value);\n } else {\n map.set(key, /* @__PURE__ */ new Set([value]));\n }\n};\nremoveFromSet_fn = function(map, key, value) {\n const set = map.get(key);\n if (!set) return;\n set.delete(value);\n if (set.size === 0) map.delete(key);\n};\n\n// src/shape-stream-state.ts\nvar ShapeStreamState = class {\n // --- Derived booleans ---\n get isUpToDate() {\n return false;\n }\n // --- Per-state field defaults ---\n get staleCacheBuster() {\n return void 0;\n }\n get staleCacheRetryCount() {\n return 0;\n }\n get sseFallbackToLongPolling() {\n return false;\n }\n get consecutiveShortSseConnections() {\n return 0;\n }\n get replayCursor() {\n return void 0;\n }\n // --- Default no-op methods ---\n canEnterReplayMode() {\n return false;\n }\n enterReplayMode(_cursor) {\n return this;\n }\n shouldUseSse(_opts) {\n return false;\n }\n handleSseConnectionClosed(_input) {\n return {\n state: this,\n fellBackToLongPolling: false,\n wasShortConnection: false\n };\n }\n // --- URL param application ---\n /** Adds state-specific query parameters to the fetch URL. */\n applyUrlParams(_url, _context) {\n }\n // --- Default response/message handlers (Paused/Error never receive these) ---\n handleResponseMetadata(_input) {\n return { action: `ignored`, state: this };\n }\n handleMessageBatch(_input) {\n return { state: this, suppressBatch: false, becameUpToDate: false };\n }\n pause() {\n return new PausedState(this);\n }\n toErrorState(error) {\n return new ErrorState(this, error);\n }\n markMustRefetch(handle) {\n return new InitialState({\n handle,\n offset: `-1`,\n liveCacheBuster: ``,\n lastSyncedAt: this.lastSyncedAt,\n schema: void 0\n });\n }\n};\nvar _shared;\nvar ActiveState = class extends ShapeStreamState {\n constructor(shared) {\n super();\n __privateAdd(this, _shared);\n __privateSet(this, _shared, shared);\n }\n get handle() {\n return __privateGet(this, _shared).handle;\n }\n get offset() {\n return __privateGet(this, _shared).offset;\n }\n get schema() {\n return __privateGet(this, _shared).schema;\n }\n get liveCacheBuster() {\n return __privateGet(this, _shared).liveCacheBuster;\n }\n get lastSyncedAt() {\n return __privateGet(this, _shared).lastSyncedAt;\n }\n /** Expose shared fields to subclasses for spreading into new instances. */\n get currentFields() {\n return __privateGet(this, _shared);\n }\n // --- URL param application ---\n applyUrlParams(url, _context) {\n url.searchParams.set(OFFSET_QUERY_PARAM, __privateGet(this, _shared).offset);\n if (__privateGet(this, _shared).handle) {\n url.searchParams.set(SHAPE_HANDLE_QUERY_PARAM, __privateGet(this, _shared).handle);\n }\n }\n // --- Helpers for subclass handleResponseMetadata implementations ---\n /** Extracts updated SharedStateFields from response headers. */\n parseResponseFields(input) {\n var _a, _b, _c;\n const responseHandle = input.responseHandle;\n const handle = responseHandle && responseHandle !== input.expiredHandle ? responseHandle : __privateGet(this, _shared).handle;\n const offset = (_a = input.responseOffset) != null ? _a : __privateGet(this, _shared).offset;\n const liveCacheBuster = (_b = input.responseCursor) != null ? _b : __privateGet(this, _shared).liveCacheBuster;\n const schema = (_c = __privateGet(this, _shared).schema) != null ? _c : input.responseSchema;\n const lastSyncedAt = input.status === 204 ? input.now : __privateGet(this, _shared).lastSyncedAt;\n return { handle, offset, schema, liveCacheBuster, lastSyncedAt };\n }\n /**\n * Stale detection. Returns a transition if the response is stale,\n * or null if it is not stale and the caller should proceed normally.\n */\n checkStaleResponse(input) {\n const responseHandle = input.responseHandle;\n const expiredHandle = input.expiredHandle;\n if (!responseHandle || responseHandle !== expiredHandle) {\n return null;\n }\n const retryCount = this.staleCacheRetryCount + 1;\n return {\n action: `stale-retry`,\n state: new StaleRetryState(__spreadProps(__spreadValues({}, this.currentFields), {\n staleCacheBuster: input.createCacheBuster(),\n staleCacheRetryCount: retryCount\n })),\n exceededMaxRetries: retryCount > input.maxStaleCacheRetries\n };\n }\n // --- handleMessageBatch: template method with onUpToDate override point ---\n handleMessageBatch(input) {\n if (!input.hasMessages || !input.hasUpToDateMessage) {\n return { state: this, suppressBatch: false, becameUpToDate: false };\n }\n let offset = __privateGet(this, _shared).offset;\n if (input.isSse && input.upToDateOffset) {\n offset = input.upToDateOffset;\n }\n const shared = {\n handle: __privateGet(this, _shared).handle,\n offset,\n schema: __privateGet(this, _shared).schema,\n liveCacheBuster: __privateGet(this, _shared).liveCacheBuster,\n lastSyncedAt: input.now\n };\n return this.onUpToDate(shared, input);\n }\n /** Override point for up-to-date handling. Default → LiveState. */\n onUpToDate(shared, _input) {\n return {\n state: new LiveState(shared),\n suppressBatch: false,\n becameUpToDate: true\n };\n }\n};\n_shared = new WeakMap();\nvar FetchingState = class extends ActiveState {\n handleResponseMetadata(input) {\n const staleResult = this.checkStaleResponse(input);\n if (staleResult) return staleResult;\n const shared = this.parseResponseFields(input);\n if (input.status === 204) {\n return {\n action: `accepted`,\n state: new LiveState(shared, { sseFallbackToLongPolling: true })\n };\n }\n return { action: `accepted`, state: new SyncingState(shared) };\n }\n canEnterReplayMode() {\n return true;\n }\n enterReplayMode(cursor) {\n return new ReplayingState(__spreadProps(__spreadValues({}, this.currentFields), {\n replayCursor: cursor\n }));\n }\n};\nvar InitialState = class _InitialState extends FetchingState {\n constructor(shared) {\n super(shared);\n this.kind = `initial`;\n }\n withHandle(handle) {\n return new _InitialState(__spreadProps(__spreadValues({}, this.currentFields), { handle }));\n }\n};\nvar SyncingState = class _SyncingState extends FetchingState {\n constructor(shared) {\n super(shared);\n this.kind = `syncing`;\n }\n withHandle(handle) {\n return new _SyncingState(__spreadProps(__spreadValues({}, this.currentFields), { handle }));\n }\n};\nvar _staleCacheBuster, _staleCacheRetryCount;\nvar _StaleRetryState = class _StaleRetryState extends FetchingState {\n constructor(fields) {\n const _a = fields, { staleCacheBuster, staleCacheRetryCount } = _a, shared = __objRest(_a, [\"staleCacheBuster\", \"staleCacheRetryCount\"]);\n super(shared);\n this.kind = `stale-retry`;\n __privateAdd(this, _staleCacheBuster);\n __privateAdd(this, _staleCacheRetryCount);\n __privateSet(this, _staleCacheBuster, staleCacheBuster);\n __privateSet(this, _staleCacheRetryCount, staleCacheRetryCount);\n }\n get staleCacheBuster() {\n return __privateGet(this, _staleCacheBuster);\n }\n get staleCacheRetryCount() {\n return __privateGet(this, _staleCacheRetryCount);\n }\n // StaleRetryState must not enter replay mode — it would lose the retry count\n canEnterReplayMode() {\n return false;\n }\n withHandle(handle) {\n return new _StaleRetryState(__spreadProps(__spreadValues({}, this.currentFields), {\n handle,\n staleCacheBuster: __privateGet(this, _staleCacheBuster),\n staleCacheRetryCount: __privateGet(this, _staleCacheRetryCount)\n }));\n }\n applyUrlParams(url, context) {\n super.applyUrlParams(url, context);\n url.searchParams.set(CACHE_BUSTER_QUERY_PARAM, __privateGet(this, _staleCacheBuster));\n }\n};\n_staleCacheBuster = new WeakMap();\n_staleCacheRetryCount = new WeakMap();\nvar StaleRetryState = _StaleRetryState;\nvar _consecutiveShortSseConnections, _sseFallbackToLongPolling;\nvar _LiveState = class _LiveState extends ActiveState {\n constructor(shared, sseState) {\n var _a, _b;\n super(shared);\n this.kind = `live`;\n __privateAdd(this, _consecutiveShortSseConnections);\n __privateAdd(this, _sseFallbackToLongPolling);\n __privateSet(this, _consecutiveShortSseConnections, (_a = sseState == null ? void 0 : sseState.consecutiveShortSseConnections) != null ? _a : 0);\n __privateSet(this, _sseFallbackToLongPolling, (_b = sseState == null ? void 0 : sseState.sseFallbackToLongPolling) != null ? _b : false);\n }\n get isUpToDate() {\n return true;\n }\n get consecutiveShortSseConnections() {\n return __privateGet(this, _consecutiveShortSseConnections);\n }\n get sseFallbackToLongPolling() {\n return __privateGet(this, _sseFallbackToLongPolling);\n }\n withHandle(handle) {\n return new _LiveState(__spreadProps(__spreadValues({}, this.currentFields), { handle }), this.sseState);\n }\n applyUrlParams(url, context) {\n super.applyUrlParams(url, context);\n if (!context.isSnapshotRequest) {\n url.searchParams.set(LIVE_CACHE_BUSTER_QUERY_PARAM, this.liveCacheBuster);\n if (context.canLongPoll) {\n url.searchParams.set(LIVE_QUERY_PARAM, `true`);\n }\n }\n }\n get sseState() {\n return {\n consecutiveShortSseConnections: __privateGet(this, _consecutiveShortSseConnections),\n sseFallbackToLongPolling: __privateGet(this, _sseFallbackToLongPolling)\n };\n }\n handleResponseMetadata(input) {\n const staleResult = this.checkStaleResponse(input);\n if (staleResult) return staleResult;\n const shared = this.parseResponseFields(input);\n return {\n action: `accepted`,\n state: new _LiveState(shared, this.sseState)\n };\n }\n onUpToDate(shared, _input) {\n return {\n state: new _LiveState(shared, this.sseState),\n suppressBatch: false,\n becameUpToDate: true\n };\n }\n shouldUseSse(opts) {\n return opts.liveSseEnabled && !opts.isRefreshing && !opts.resumingFromPause && !__privateGet(this, _sseFallbackToLongPolling);\n }\n handleSseConnectionClosed(input) {\n let nextConsecutiveShort = __privateGet(this, _consecutiveShortSseConnections);\n let nextFallback = __privateGet(this, _sseFallbackToLongPolling);\n let fellBackToLongPolling = false;\n let wasShortConnection = false;\n if (input.connectionDuration < input.minConnectionDuration && !input.wasAborted) {\n wasShortConnection = true;\n nextConsecutiveShort = nextConsecutiveShort + 1;\n if (nextConsecutiveShort >= input.maxShortConnections) {\n nextFallback = true;\n fellBackToLongPolling = true;\n }\n } else if (input.connectionDuration >= input.minConnectionDuration) {\n nextConsecutiveShort = 0;\n }\n return {\n state: new _LiveState(this.currentFields, {\n consecutiveShortSseConnections: nextConsecutiveShort,\n sseFallbackToLongPolling: nextFallback\n }),\n fellBackToLongPolling,\n wasShortConnection\n };\n }\n};\n_consecutiveShortSseConnections = new WeakMap();\n_sseFallbackToLongPolling = new WeakMap();\nvar LiveState = _LiveState;\nvar _replayCursor;\nvar _ReplayingState = class _ReplayingState extends ActiveState {\n constructor(fields) {\n const _a = fields, { replayCursor } = _a, shared = __objRest(_a, [\"replayCursor\"]);\n super(shared);\n this.kind = `replaying`;\n __privateAdd(this, _replayCursor);\n __privateSet(this, _replayCursor, replayCursor);\n }\n get replayCursor() {\n return __privateGet(this, _replayCursor);\n }\n withHandle(handle) {\n return new _ReplayingState(__spreadProps(__spreadValues({}, this.currentFields), {\n handle,\n replayCursor: __privateGet(this, _replayCursor)\n }));\n }\n handleResponseMetadata(input) {\n const staleResult = this.checkStaleResponse(input);\n if (staleResult) return staleResult;\n const shared = this.parseResponseFields(input);\n return {\n action: `accepted`,\n state: new _ReplayingState(__spreadProps(__spreadValues({}, shared), {\n replayCursor: __privateGet(this, _replayCursor)\n }))\n };\n }\n onUpToDate(shared, input) {\n const suppressBatch = !input.isSse && __privateGet(this, _replayCursor) === input.currentCursor;\n return {\n state: new LiveState(shared),\n suppressBatch,\n becameUpToDate: true\n };\n }\n};\n_replayCursor = new WeakMap();\nvar ReplayingState = _ReplayingState;\nvar PausedState = class _PausedState extends ShapeStreamState {\n constructor(previousState) {\n super();\n this.kind = `paused`;\n this.previousState = previousState instanceof _PausedState ? previousState.previousState : previousState;\n }\n get handle() {\n return this.previousState.handle;\n }\n get offset() {\n return this.previousState.offset;\n }\n get schema() {\n return this.previousState.schema;\n }\n get liveCacheBuster() {\n return this.previousState.liveCacheBuster;\n }\n get lastSyncedAt() {\n return this.previousState.lastSyncedAt;\n }\n get isUpToDate() {\n return this.previousState.isUpToDate;\n }\n get staleCacheBuster() {\n return this.previousState.staleCacheBuster;\n }\n get staleCacheRetryCount() {\n return this.previousState.staleCacheRetryCount;\n }\n get sseFallbackToLongPolling() {\n return this.previousState.sseFallbackToLongPolling;\n }\n get consecutiveShortSseConnections() {\n return this.previousState.consecutiveShortSseConnections;\n }\n get replayCursor() {\n return this.previousState.replayCursor;\n }\n handleResponseMetadata(input) {\n const transition = this.previousState.handleResponseMetadata(input);\n if (transition.action === `accepted`) {\n return { action: `accepted`, state: new _PausedState(transition.state) };\n }\n if (transition.action === `ignored`) {\n return { action: `ignored`, state: this };\n }\n if (transition.action === `stale-retry`) {\n return {\n action: `stale-retry`,\n state: new _PausedState(transition.state),\n exceededMaxRetries: transition.exceededMaxRetries\n };\n }\n const _exhaustive = transition;\n throw new Error(\n `PausedState.handleResponseMetadata: unhandled transition action \"${_exhaustive.action}\"`\n );\n }\n withHandle(handle) {\n return new _PausedState(this.previousState.withHandle(handle));\n }\n applyUrlParams(url, context) {\n this.previousState.applyUrlParams(url, context);\n }\n pause() {\n return this;\n }\n resume() {\n return this.previousState;\n }\n};\nvar ErrorState = class _ErrorState extends ShapeStreamState {\n constructor(previousState, error) {\n super();\n this.kind = `error`;\n this.previousState = previousState instanceof _ErrorState ? previousState.previousState : previousState;\n this.error = error;\n }\n get handle() {\n return this.previousState.handle;\n }\n get offset() {\n return this.previousState.offset;\n }\n get schema() {\n return this.previousState.schema;\n }\n get liveCacheBuster() {\n return this.previousState.liveCacheBuster;\n }\n get lastSyncedAt() {\n return this.previousState.lastSyncedAt;\n }\n get isUpToDate() {\n return this.previousState.isUpToDate;\n }\n get staleCacheBuster() {\n return this.previousState.staleCacheBuster;\n }\n get staleCacheRetryCount() {\n return this.previousState.staleCacheRetryCount;\n }\n get sseFallbackToLongPolling() {\n return this.previousState.sseFallbackToLongPolling;\n }\n get consecutiveShortSseConnections() {\n return this.previousState.consecutiveShortSseConnections;\n }\n get replayCursor() {\n return this.previousState.replayCursor;\n }\n withHandle(handle) {\n return new _ErrorState(this.previousState.withHandle(handle), this.error);\n }\n applyUrlParams(url, context) {\n this.previousState.applyUrlParams(url, context);\n }\n retry() {\n return this.previousState;\n }\n reset(handle) {\n return this.previousState.markMustRefetch(handle);\n }\n};\nfunction createInitialState(opts) {\n return new InitialState({\n handle: opts.handle,\n offset: opts.offset,\n liveCacheBuster: ``,\n lastSyncedAt: void 0,\n schema: void 0\n });\n}\n\n// src/pause-lock.ts\nvar _holders, _onAcquired, _onReleased;\nvar PauseLock = class {\n constructor(callbacks) {\n __privateAdd(this, _holders, /* @__PURE__ */ new Set());\n __privateAdd(this, _onAcquired);\n __privateAdd(this, _onReleased);\n __privateSet(this, _onAcquired, callbacks.onAcquired);\n __privateSet(this, _onReleased, callbacks.onReleased);\n }\n /**\n * Acquire the lock for a given reason. Idempotent — acquiring the same\n * reason twice is a no-op (but logs a warning since it likely indicates\n * a caller bug).\n *\n * Fires `onAcquired` when the first reason is acquired (transition from\n * unlocked to locked).\n */\n acquire(reason) {\n if (__privateGet(this, _holders).has(reason)) {\n console.warn(\n `[Electric] PauseLock: \"${reason}\" already held \\u2014 ignoring duplicate acquire`\n );\n return;\n }\n const wasUnlocked = __privateGet(this, _holders).size === 0;\n __privateGet(this, _holders).add(reason);\n if (wasUnlocked) {\n __privateGet(this, _onAcquired).call(this);\n }\n }\n /**\n * Release the lock for a given reason. Releasing a reason that isn't\n * held logs a warning (likely indicates an acquire/release mismatch).\n *\n * Fires `onReleased` when the last reason is released (transition from\n * locked to unlocked).\n */\n release(reason) {\n if (!__privateGet(this, _holders).delete(reason)) {\n console.warn(\n `[Electric] PauseLock: \"${reason}\" not held \\u2014 ignoring release (possible acquire/release mismatch)`\n );\n return;\n }\n if (__privateGet(this, _holders).size === 0) {\n __privateGet(this, _onReleased).call(this);\n }\n }\n /**\n * Whether the lock is currently held by any reason.\n */\n get isPaused() {\n return __privateGet(this, _holders).size > 0;\n }\n /**\n * Check if a specific reason is holding the lock.\n */\n isHeldBy(reason) {\n return __privateGet(this, _holders).has(reason);\n }\n /**\n * Release all reasons matching a prefix. Does NOT fire `onReleased` —\n * this is for cleanup/reset paths where the stream state is being\n * managed separately.\n *\n * This preserves reasons with different prefixes (e.g., 'visibility'\n * is preserved when clearing 'snapshot-*' reasons).\n */\n releaseAllMatching(prefix) {\n for (const reason of __privateGet(this, _holders)) {\n if (reason.startsWith(prefix)) {\n __privateGet(this, _holders).delete(reason);\n }\n }\n }\n};\n_holders = new WeakMap();\n_onAcquired = new WeakMap();\n_onReleased = new WeakMap();\n\n// src/client.ts\nvar RESERVED_PARAMS = /* @__PURE__ */ new Set([\n LIVE_CACHE_BUSTER_QUERY_PARAM,\n SHAPE_HANDLE_QUERY_PARAM,\n LIVE_QUERY_PARAM,\n OFFSET_QUERY_PARAM,\n CACHE_BUSTER_QUERY_PARAM\n]);\nvar TROUBLESHOOTING_URL = `https://electric-sql.com/docs/guides/troubleshooting`;\nfunction createCacheBuster() {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n}\nasync function resolveValue(value) {\n if (typeof value === `function`) {\n return value();\n }\n return value;\n}\nasync function toInternalParams(params) {\n const entries = Object.entries(params);\n const resolvedEntries = await Promise.all(\n entries.map(async ([key, value]) => {\n if (value === void 0) return [key, void 0];\n const resolvedValue = await resolveValue(value);\n return [\n key,\n Array.isArray(resolvedValue) ? resolvedValue.join(`,`) : resolvedValue\n ];\n })\n );\n return Object.fromEntries(\n resolvedEntries.filter(([_, value]) => value !== void 0)\n );\n}\nasync function resolveHeaders(headers) {\n if (!headers) return {};\n const entries = Object.entries(headers);\n const resolvedEntries = await Promise.all(\n entries.map(async ([key, value]) => [key, await resolveValue(value)])\n );\n return Object.fromEntries(resolvedEntries);\n}\nfunction canonicalShapeKey(url) {\n const cleanUrl = new URL(url.origin + url.pathname);\n for (const [key, value] of url.searchParams) {\n if (!ELECTRIC_PROTOCOL_QUERY_PARAMS.includes(key)) {\n cleanUrl.searchParams.append(key, value);\n }\n }\n cleanUrl.searchParams.sort();\n return cleanUrl.toString();\n}\nvar _error, _fetchClient2, _sseFetchClient, _messageParser, _subscribers, _started, _syncState, _connected, _mode, _onError, _requestAbortController, _refreshCount, _snapshotCounter, _ShapeStream_instances, isRefreshing_get, _tickPromise, _tickPromiseResolver, _tickPromiseRejecter, _messageChain, _isPublishing, _snapshotTracker, _pauseLock, _currentFetchUrl, _lastSseConnectionStartTime, _minSseConnectionDuration, _maxShortSseConnections, _sseBackoffBaseDelay, _sseBackoffMaxDelay, _unsubscribeFromVisibilityChanges, _unsubscribeFromWakeDetection, _maxStaleCacheRetries, _recentRequestEntries, _fastLoopWindowMs, _fastLoopThreshold, _fastLoopBackoffBaseMs, _fastLoopBackoffMaxMs, _fastLoopConsecutiveCount, _fastLoopMaxCount, _pendingRequestShapeCacheBuster, _maxSnapshotRetries, _expiredShapeRecoveryKey, _pendingSelfHealCheck, _consecutiveErrorRetries, _maxConsecutiveErrorRetries, _onErrorBackoff, start_fn, teardown_fn, backoffOnErrorRetry_fn, requestShape_fn, checkFastLoop_fn, constructUrl_fn, createAbortListener_fn, onInitialResponse_fn, onMessages_fn, fetchShape_fn, requestShapeLongPoll_fn, requestShapeSSE_fn, nextTick_fn, publish_fn, sendErrorToSubscribers_fn, hasBrowserVisibilityAPI_fn, subscribeToVisibilityChanges_fn, subscribeToWakeDetection_fn, reset_fn, fetchSnapshotWithRetry_fn, buildSubsetBody_fn;\nvar ShapeStream = class {\n constructor(options) {\n __privateAdd(this, _ShapeStream_instances);\n __privateAdd(this, _error, null);\n __privateAdd(this, _fetchClient2);\n __privateAdd(this, _sseFetchClient);\n __privateAdd(this, _messageParser);\n __privateAdd(this, _subscribers, /* @__PURE__ */ new Map());\n __privateAdd(this, _started, false);\n __privateAdd(this, _syncState);\n __privateAdd(this, _connected, false);\n __privateAdd(this, _mode);\n __privateAdd(this, _onError);\n __privateAdd(this, _requestAbortController);\n __privateAdd(this, _refreshCount, 0);\n __privateAdd(this, _snapshotCounter, 0);\n __privateAdd(this, _tickPromise);\n __privateAdd(this, _tickPromiseResolver);\n __privateAdd(this, _tickPromiseRejecter);\n __privateAdd(this, _messageChain, Promise.resolve([]));\n // promise chain for incoming messages\n // Tracks when subscriber callbacks are actively being delivered from\n // #messageChain. requestSnapshot can inject a nested batch from inside a\n // subscriber; in that reentrant case #publish uses this as an intentional\n // escape hatch to deliver the nested snapshot batch immediately rather than\n // queueing it behind the subscriber that is awaiting it.\n __privateAdd(this, _isPublishing, false);\n __privateAdd(this, _snapshotTracker, new SnapshotTracker());\n __privateAdd(this, _pauseLock);\n __privateAdd(this, _currentFetchUrl);\n // Current fetch URL for computing shape key\n __privateAdd(this, _lastSseConnectionStartTime);\n __privateAdd(this, _minSseConnectionDuration, 1e3);\n // Minimum expected SSE connection duration (1 second)\n __privateAdd(this, _maxShortSseConnections, 3);\n // Fall back to long polling after this many short connections\n __privateAdd(this, _sseBackoffBaseDelay, 100);\n // Base delay for exponential backoff (ms)\n __privateAdd(this, _sseBackoffMaxDelay, 5e3);\n // Maximum delay cap (ms)\n __privateAdd(this, _unsubscribeFromVisibilityChanges);\n __privateAdd(this, _unsubscribeFromWakeDetection);\n __privateAdd(this, _maxStaleCacheRetries, 3);\n // Fast-loop detection: track recent non-live requests to detect tight retry\n // loops caused by proxy/CDN misconfiguration or stale client-side caches\n __privateAdd(this, _recentRequestEntries, []);\n __privateAdd(this, _fastLoopWindowMs, 500);\n __privateAdd(this, _fastLoopThreshold, 5);\n __privateAdd(this, _fastLoopBackoffBaseMs, 100);\n __privateAdd(this, _fastLoopBackoffMaxMs, 5e3);\n __privateAdd(this, _fastLoopConsecutiveCount, 0);\n __privateAdd(this, _fastLoopMaxCount, 5);\n __privateAdd(this, _pendingRequestShapeCacheBuster);\n __privateAdd(this, _maxSnapshotRetries, 5);\n __privateAdd(this, _expiredShapeRecoveryKey, null);\n __privateAdd(this, _pendingSelfHealCheck, null);\n __privateAdd(this, _consecutiveErrorRetries, 0);\n __privateAdd(this, _maxConsecutiveErrorRetries, 50);\n __privateAdd(this, _onErrorBackoff);\n var _a, _b, _c, _d;\n this.options = __spreadValues({ subscribe: true }, options);\n validateOptions(this.options);\n __privateSet(this, _syncState, createInitialState({\n offset: (_a = this.options.offset) != null ? _a : `-1`,\n handle: this.options.handle\n }));\n __privateSet(this, _pauseLock, new PauseLock({\n onAcquired: () => {\n var _a2;\n __privateSet(this, _syncState, __privateGet(this, _syncState).pause());\n if (__privateGet(this, _started)) {\n (_a2 = __privateGet(this, _requestAbortController)) == null ? void 0 : _a2.abort(PAUSE_STREAM);\n }\n },\n onReleased: () => {\n var _a2;\n if (!__privateGet(this, _started)) return;\n if ((_a2 = this.options.signal) == null ? void 0 : _a2.aborted) return;\n __privateMethod(this, _ShapeStream_instances, start_fn).call(this).catch(() => {\n });\n }\n }));\n let transformer;\n if (options.columnMapper) {\n const applyColumnMapper = (row) => {\n const result = {};\n for (const [dbKey, value] of Object.entries(row)) {\n const appKey = options.columnMapper.decode(dbKey);\n result[appKey] = value;\n }\n return result;\n };\n transformer = options.transformer ? (row) => options.transformer(applyColumnMapper(row)) : applyColumnMapper;\n } else {\n transformer = options.transformer;\n }\n __privateSet(this, _messageParser, new MessageParser(options.parser, transformer));\n __privateSet(this, _onError, this.options.onError);\n __privateSet(this, _mode, (_b = this.options.log) != null ? _b : `full`);\n const baseFetchClient = (_c = options.fetchClient) != null ? _c : (...args) => fetch(...args);\n const backOffOpts = __spreadProps(__spreadValues({}, (_d = options.backoffOptions) != null ? _d : BackoffDefaults), {\n onFailedAttempt: () => {\n var _a2, _b2;\n __privateSet(this, _connected, false);\n (_b2 = (_a2 = options.backoffOptions) == null ? void 0 : _a2.onFailedAttempt) == null ? void 0 : _b2.call(_a2);\n }\n });\n __privateSet(this, _onErrorBackoff, {\n initialDelay: backOffOpts.initialDelay,\n maxDelay: backOffOpts.maxDelay,\n multiplier: backOffOpts.multiplier\n });\n const fetchWithBackoffClient = createFetchWithBackoff(\n baseFetchClient,\n backOffOpts\n );\n __privateSet(this, _sseFetchClient, createFetchWithResponseHeadersCheck(\n createFetchWithChunkBuffer(fetchWithBackoffClient)\n ));\n __privateSet(this, _fetchClient2, createFetchWithConsumedMessages(__privateGet(this, _sseFetchClient)));\n __privateMethod(this, _ShapeStream_instances, subscribeToVisibilityChanges_fn).call(this);\n }\n get shapeHandle() {\n return __privateGet(this, _syncState).handle;\n }\n get error() {\n return __privateGet(this, _error);\n }\n get isUpToDate() {\n return __privateGet(this, _syncState).isUpToDate;\n }\n get lastOffset() {\n return __privateGet(this, _syncState).offset;\n }\n get mode() {\n return __privateGet(this, _mode);\n }\n subscribe(callback, onError = () => {\n }) {\n const subscriptionId = {};\n __privateGet(this, _subscribers).set(subscriptionId, [callback, onError]);\n if (!__privateGet(this, _started)) __privateMethod(this, _ShapeStream_instances, start_fn).call(this);\n return () => {\n __privateGet(this, _subscribers).delete(subscriptionId);\n };\n }\n unsubscribeAll() {\n var _a, _b;\n __privateGet(this, _subscribers).clear();\n (_a = __privateGet(this, _unsubscribeFromVisibilityChanges)) == null ? void 0 : _a.call(this);\n (_b = __privateGet(this, _unsubscribeFromWakeDetection)) == null ? void 0 : _b.call(this);\n }\n /** Unix time at which we last synced. Undefined until first successful up-to-date. */\n lastSyncedAt() {\n return __privateGet(this, _syncState).lastSyncedAt;\n }\n /** Time elapsed since last sync (in ms). Infinity if we did not yet sync. */\n lastSynced() {\n if (__privateGet(this, _syncState).lastSyncedAt === void 0) return Infinity;\n return Date.now() - __privateGet(this, _syncState).lastSyncedAt;\n }\n /** Indicates if we are connected to the Electric sync service. */\n isConnected() {\n return __privateGet(this, _connected);\n }\n /** True during initial fetch. False afterwards. */\n isLoading() {\n return !__privateGet(this, _syncState).isUpToDate;\n }\n hasStarted() {\n return __privateGet(this, _started);\n }\n isPaused() {\n return __privateGet(this, _pauseLock).isPaused;\n }\n /**\n * Refreshes the shape stream.\n * This preemptively aborts any ongoing long poll and reconnects without\n * long polling, ensuring that the stream receives an up to date message with the\n * latest LSN from Postgres at that point in time.\n */\n async forceDisconnectAndRefresh() {\n var _a, _b;\n __privateWrapper(this, _refreshCount)._++;\n try {\n if (__privateGet(this, _syncState).isUpToDate && !((_a = __privateGet(this, _requestAbortController)) == null ? void 0 : _a.signal.aborted)) {\n (_b = __privateGet(this, _requestAbortController)) == null ? void 0 : _b.abort(FORCE_DISCONNECT_AND_REFRESH);\n }\n await __privateMethod(this, _ShapeStream_instances, nextTick_fn).call(this);\n } finally {\n __privateWrapper(this, _refreshCount)._--;\n }\n }\n /**\n * Request a snapshot for subset of data and inject it into the subscribed data stream.\n *\n * Only available when mode is `changes_only`.\n * Returns the insertion point & the data, but more importantly injects the data\n * into the subscribed data stream. Returned value is unlikely to be useful for the caller,\n * unless the caller has complicated additional logic.\n *\n * Data will be injected in a way that's also tracking further incoming changes, and it'll\n * skip the ones that are already in the snapshot.\n *\n * @param opts - The options for the snapshot request.\n * @returns The metadata and the data for the snapshot.\n */\n async requestSnapshot(opts) {\n if (__privateGet(this, _mode) === `full`) {\n throw new Error(\n `Snapshot requests are not supported in ${__privateGet(this, _mode)} mode, as the consumer is guaranteed to observe all data`\n );\n }\n if (!__privateGet(this, _started)) {\n __privateMethod(this, _ShapeStream_instances, start_fn).call(this).catch(() => {\n });\n }\n const snapshotReason = `snapshot-${++__privateWrapper(this, _snapshotCounter)._}`;\n __privateGet(this, _pauseLock).acquire(snapshotReason);\n const snapshotWarnTimer = setTimeout(() => {\n console.warn(\n `[Electric] Snapshot \"${snapshotReason}\" has held the pause lock for 30s \\u2014 possible hung request or leaked lock. Current holders: ${[.../* @__PURE__ */ new Set([snapshotReason])].join(`, `)}`,\n new Error(`stack trace`)\n );\n }, 3e4);\n try {\n const { metadata, data, responseOffset, responseHandle } = await this.fetchSnapshot(opts);\n const dataWithEndBoundary = data.concat([\n { headers: __spreadValues({ control: `snapshot-end` }, metadata) },\n { headers: __spreadValues({ control: `subset-end` }, opts) }\n ]);\n __privateGet(this, _snapshotTracker).addSnapshot(\n metadata,\n new Set(data.map((message) => message.key))\n );\n await __privateMethod(this, _ShapeStream_instances, onMessages_fn).call(this, dataWithEndBoundary, false, {\n allowReentrantPublishBypass: true\n });\n if (responseOffset !== null || responseHandle !== null) {\n const transition = __privateGet(this, _syncState).handleResponseMetadata({\n status: 200,\n responseHandle,\n responseOffset,\n responseCursor: null,\n expiredHandle: null,\n now: Date.now(),\n maxStaleCacheRetries: __privateGet(this, _maxStaleCacheRetries),\n createCacheBuster\n });\n if (transition.action === `accepted`) {\n __privateSet(this, _syncState, transition.state);\n } else {\n console.warn(\n `[Electric] Snapshot response metadata was not accepted by state \"${__privateGet(this, _syncState).kind}\" (action: ${transition.action}). Stream offset was not advanced from snapshot.`,\n new Error(`stack trace`)\n );\n }\n }\n return {\n metadata,\n data\n };\n } finally {\n clearTimeout(snapshotWarnTimer);\n __privateGet(this, _pauseLock).release(snapshotReason);\n }\n }\n /**\n * Fetch a snapshot for subset of data.\n * Returns the metadata and the data, but does not inject it into the subscribed data stream.\n *\n * By default, uses GET to send subset parameters as query parameters. This may hit URL length\n * limits (HTTP 414) with large WHERE clauses or many parameters. Set `method: 'POST'` or use\n * `subsetMethod: 'POST'` on the stream to send parameters in the request body instead.\n *\n * @param opts - The options for the snapshot request.\n * @returns The metadata, data, and the response's offset/handle for state advancement.\n */\n async fetchSnapshot(opts) {\n return __privateMethod(this, _ShapeStream_instances, fetchSnapshotWithRetry_fn).call(this, opts, 0);\n }\n};\n_error = new WeakMap();\n_fetchClient2 = new WeakMap();\n_sseFetchClient = new WeakMap();\n_messageParser = new WeakMap();\n_subscribers = new WeakMap();\n_started = new WeakMap();\n_syncState = new WeakMap();\n_connected = new WeakMap();\n_mode = new WeakMap();\n_onError = new WeakMap();\n_requestAbortController = new WeakMap();\n_refreshCount = new WeakMap();\n_snapshotCounter = new WeakMap();\n_ShapeStream_instances = new WeakSet();\nisRefreshing_get = function() {\n return __privateGet(this, _refreshCount) > 0;\n};\n_tickPromise = new WeakMap();\n_tickPromiseResolver = new WeakMap();\n_tickPromiseRejecter = new WeakMap();\n_messageChain = new WeakMap();\n_isPublishing = new WeakMap();\n_snapshotTracker = new WeakMap();\n_pauseLock = new WeakMap();\n_currentFetchUrl = new WeakMap();\n_lastSseConnectionStartTime = new WeakMap();\n_minSseConnectionDuration = new WeakMap();\n_maxShortSseConnections = new WeakMap();\n_sseBackoffBaseDelay = new WeakMap();\n_sseBackoffMaxDelay = new WeakMap();\n_unsubscribeFromVisibilityChanges = new WeakMap();\n_unsubscribeFromWakeDetection = new WeakMap();\n_maxStaleCacheRetries = new WeakMap();\n_recentRequestEntries = new WeakMap();\n_fastLoopWindowMs = new WeakMap();\n_fastLoopThreshold = new WeakMap();\n_fastLoopBackoffBaseMs = new WeakMap();\n_fastLoopBackoffMaxMs = new WeakMap();\n_fastLoopConsecutiveCount = new WeakMap();\n_fastLoopMaxCount = new WeakMap();\n_pendingRequestShapeCacheBuster = new WeakMap();\n_maxSnapshotRetries = new WeakMap();\n_expiredShapeRecoveryKey = new WeakMap();\n_pendingSelfHealCheck = new WeakMap();\n_consecutiveErrorRetries = new WeakMap();\n_maxConsecutiveErrorRetries = new WeakMap();\n_onErrorBackoff = new WeakMap();\nstart_fn = async function() {\n var _a, _b, _c;\n __privateSet(this, _started, true);\n __privateMethod(this, _ShapeStream_instances, subscribeToWakeDetection_fn).call(this);\n try {\n await __privateMethod(this, _ShapeStream_instances, requestShape_fn).call(this);\n } catch (err) {\n __privateSet(this, _error, err);\n if (err instanceof Error) {\n __privateSet(this, _syncState, __privateGet(this, _syncState).toErrorState(err));\n }\n if (__privateGet(this, _onError)) {\n const retryOpts = await __privateGet(this, _onError).call(this, err);\n const isRetryable = !(err instanceof MissingHeadersError);\n if (retryOpts && typeof retryOpts === `object` && isRetryable) {\n if (retryOpts.params) {\n this.options.params = __spreadValues(__spreadValues({}, (_a = this.options.params) != null ? _a : {}), retryOpts.params);\n }\n if (retryOpts.headers) {\n this.options.headers = __spreadValues(__spreadValues({}, (_b = this.options.headers) != null ? _b : {}), retryOpts.headers);\n }\n __privateWrapper(this, _consecutiveErrorRetries)._++;\n if (__privateGet(this, _consecutiveErrorRetries) > __privateGet(this, _maxConsecutiveErrorRetries)) {\n console.warn(\n `[Electric] onError retry loop exhausted after ${__privateGet(this, _maxConsecutiveErrorRetries)} consecutive retries. The error was never resolved by the onError handler. Error: ${err instanceof Error ? err.message : String(err)}`,\n new Error(`stack trace`)\n );\n if (err instanceof Error) {\n __privateMethod(this, _ShapeStream_instances, sendErrorToSubscribers_fn).call(this, err);\n }\n __privateMethod(this, _ShapeStream_instances, teardown_fn).call(this);\n return;\n }\n __privateSet(this, _error, null);\n if (__privateGet(this, _syncState) instanceof ErrorState) {\n __privateSet(this, _syncState, __privateGet(this, _syncState).retry());\n }\n __privateSet(this, _fastLoopConsecutiveCount, 0);\n __privateSet(this, _recentRequestEntries, []);\n await __privateMethod(this, _ShapeStream_instances, backoffOnErrorRetry_fn).call(this, __privateGet(this, _consecutiveErrorRetries));\n if ((_c = this.options.signal) == null ? void 0 : _c.aborted) {\n __privateMethod(this, _ShapeStream_instances, teardown_fn).call(this);\n return;\n }\n __privateSet(this, _started, false);\n return __privateMethod(this, _ShapeStream_instances, start_fn).call(this);\n }\n if (err instanceof Error) {\n __privateMethod(this, _ShapeStream_instances, sendErrorToSubscribers_fn).call(this, err);\n }\n __privateMethod(this, _ShapeStream_instances, teardown_fn).call(this);\n return;\n }\n if (err instanceof Error) {\n __privateMethod(this, _ShapeStream_instances, sendErrorToSubscribers_fn).call(this, err);\n }\n __privateMethod(this, _ShapeStream_instances, teardown_fn).call(this);\n throw err;\n }\n __privateMethod(this, _ShapeStream_instances, teardown_fn).call(this);\n};\nteardown_fn = function() {\n var _a, _b;\n __privateSet(this, _connected, false);\n (_a = __privateGet(this, _tickPromiseRejecter)) == null ? void 0 : _a.call(this);\n (_b = __privateGet(this, _unsubscribeFromWakeDetection)) == null ? void 0 : _b.call(this);\n};\nbackoffOnErrorRetry_fn = async function(retryAttempt) {\n const { initialDelay, maxDelay, multiplier } = __privateGet(this, _onErrorBackoff);\n const cappedDelay = Math.min(\n maxDelay,\n initialDelay * Math.pow(multiplier, retryAttempt - 1)\n // 1-indexed: first retry uses multiplier^0\n );\n const delayMs = Math.floor(Math.random() * cappedDelay);\n const signal = this.options.signal;\n if (delayMs <= 0 || (signal == null ? void 0 : signal.aborted)) return;\n await new Promise((resolve) => {\n let settled = false;\n const done = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n signal == null ? void 0 : signal.removeEventListener(`abort`, done);\n resolve();\n };\n const timer = setTimeout(done, delayMs);\n signal == null ? void 0 : signal.addEventListener(`abort`, done, { once: true });\n if (signal == null ? void 0 : signal.aborted) done();\n });\n};\nrequestShape_fn = async function(requestShapeCacheBuster) {\n var _a, _b, _c;\n if ((_a = this.options.signal) == null ? void 0 : _a.aborted) {\n __privateMethod(this, _ShapeStream_instances, teardown_fn).call(this);\n return;\n }\n if (__privateGet(this, _syncState) instanceof ErrorState) {\n throw __privateGet(this, _syncState).error;\n }\n const activeCacheBuster = requestShapeCacheBuster != null ? requestShapeCacheBuster : __privateGet(this, _pendingRequestShapeCacheBuster);\n if (__privateGet(this, _pauseLock).isPaused) {\n if (activeCacheBuster) {\n __privateSet(this, _pendingRequestShapeCacheBuster, activeCacheBuster);\n }\n return;\n }\n if (!this.options.subscribe && (((_b = this.options.signal) == null ? void 0 : _b.aborted) || __privateGet(this, _syncState).isUpToDate)) {\n return;\n }\n if (!__privateGet(this, _syncState).isUpToDate) {\n await __privateMethod(this, _ShapeStream_instances, checkFastLoop_fn).call(this);\n } else {\n __privateSet(this, _fastLoopConsecutiveCount, 0);\n __privateSet(this, _recentRequestEntries, []);\n }\n let resumingFromPause = false;\n if (__privateGet(this, _syncState) instanceof PausedState) {\n resumingFromPause = true;\n __privateSet(this, _syncState, __privateGet(this, _syncState).resume());\n }\n const { url, signal } = this.options;\n const { fetchUrl, requestHeaders } = await __privateMethod(this, _ShapeStream_instances, constructUrl_fn).call(this, url, resumingFromPause);\n if (activeCacheBuster) {\n fetchUrl.searchParams.set(CACHE_BUSTER_QUERY_PARAM, activeCacheBuster);\n fetchUrl.searchParams.sort();\n }\n const abortListener = await __privateMethod(this, _ShapeStream_instances, createAbortListener_fn).call(this, signal);\n const requestAbortController = __privateGet(this, _requestAbortController);\n if (__privateGet(this, _pauseLock).isPaused) {\n if (abortListener && signal) {\n signal.removeEventListener(`abort`, abortListener);\n }\n if (activeCacheBuster) {\n __privateSet(this, _pendingRequestShapeCacheBuster, activeCacheBuster);\n }\n __privateSet(this, _requestAbortController, void 0);\n return;\n }\n __privateSet(this, _pendingRequestShapeCacheBuster, void 0);\n try {\n await __privateMethod(this, _ShapeStream_instances, fetchShape_fn).call(this, {\n fetchUrl,\n requestAbortController,\n headers: requestHeaders,\n resumingFromPause\n });\n } catch (e) {\n const abortReason = requestAbortController.signal.reason;\n const isRestartAbort = requestAbortController.signal.aborted && (abortReason === FORCE_DISCONNECT_AND_REFRESH || abortReason === SYSTEM_WAKE);\n if ((e instanceof FetchError || e instanceof FetchBackoffAbortError) && isRestartAbort) {\n return __privateMethod(this, _ShapeStream_instances, requestShape_fn).call(this);\n }\n if (e instanceof FetchBackoffAbortError) {\n return;\n }\n if (e instanceof StaleCacheError) {\n return __privateMethod(this, _ShapeStream_instances, requestShape_fn).call(this);\n }\n if (!(e instanceof FetchError)) throw e;\n if (e.status == 409) {\n if (__privateGet(this, _syncState).handle) {\n const shapeKey = canonicalShapeKey(fetchUrl);\n expiredShapesCache.markExpired(shapeKey, __privateGet(this, _syncState).handle);\n }\n const newShapeHandle = e.headers[SHAPE_HANDLE_HEADER];\n if (!newShapeHandle) {\n console.warn(\n `[Electric] Received 409 response without a shape handle header. This likely indicates a proxy or CDN stripping required headers.`\n );\n }\n const nextRequestShapeCacheBuster = createCacheBuster();\n __privateMethod(this, _ShapeStream_instances, reset_fn).call(this, newShapeHandle);\n await __privateMethod(this, _ShapeStream_instances, publish_fn).call(this, [{ headers: { control: `must-refetch` } }]);\n return __privateMethod(this, _ShapeStream_instances, requestShape_fn).call(this, nextRequestShapeCacheBuster);\n } else {\n throw e;\n }\n } finally {\n if (abortListener && signal) {\n signal.removeEventListener(`abort`, abortListener);\n }\n __privateSet(this, _requestAbortController, void 0);\n }\n (_c = __privateGet(this, _tickPromiseResolver)) == null ? void 0 : _c.call(this);\n return __privateMethod(this, _ShapeStream_instances, requestShape_fn).call(this);\n};\ncheckFastLoop_fn = async function() {\n const now = Date.now();\n const currentOffset = __privateGet(this, _syncState).offset;\n __privateSet(this, _recentRequestEntries, __privateGet(this, _recentRequestEntries).filter(\n (e) => now - e.timestamp < __privateGet(this, _fastLoopWindowMs)\n ));\n __privateGet(this, _recentRequestEntries).push({ timestamp: now, offset: currentOffset });\n const sameOffsetCount = __privateGet(this, _recentRequestEntries).filter(\n (e) => e.offset === currentOffset\n ).length;\n if (sameOffsetCount < __privateGet(this, _fastLoopThreshold)) return;\n __privateWrapper(this, _fastLoopConsecutiveCount)._++;\n if (__privateGet(this, _fastLoopConsecutiveCount) >= __privateGet(this, _fastLoopMaxCount)) {\n throw new FetchError(\n 502,\n void 0,\n void 0,\n {},\n this.options.url,\n `Client is stuck in a fast retry loop (${__privateGet(this, _fastLoopThreshold)} requests in ${__privateGet(this, _fastLoopWindowMs)}ms at the same offset, repeated ${__privateGet(this, _fastLoopMaxCount)} times). Client-side caches were cleared automatically on first detection, but the loop persists. This usually indicates a proxy or CDN misconfiguration. Common causes:\n - Proxy is not including query parameters (handle, offset) in its cache key\n - CDN is serving stale 409 responses\n - Proxy is stripping required Electric headers from responses\nFor more information visit the troubleshooting guide: ${TROUBLESHOOTING_URL}`\n );\n }\n if (__privateGet(this, _fastLoopConsecutiveCount) === 1) {\n console.warn(\n `[Electric] Detected fast retry loop (${__privateGet(this, _fastLoopThreshold)} requests in ${__privateGet(this, _fastLoopWindowMs)}ms at the same offset). Clearing client-side caches and resetting stream to recover. If this persists, check that your proxy includes all query parameters (especially 'handle' and 'offset') in its cache key, and that required Electric headers are forwarded to the client. For more information visit the troubleshooting guide: ${TROUBLESHOOTING_URL}`,\n new Error(`stack trace`)\n );\n if (__privateGet(this, _currentFetchUrl)) {\n const shapeKey = canonicalShapeKey(__privateGet(this, _currentFetchUrl));\n expiredShapesCache.delete(shapeKey);\n upToDateTracker.delete(shapeKey);\n } else {\n expiredShapesCache.clear();\n upToDateTracker.clear();\n }\n __privateMethod(this, _ShapeStream_instances, reset_fn).call(this);\n __privateSet(this, _recentRequestEntries, []);\n return;\n }\n const maxDelay = Math.min(\n __privateGet(this, _fastLoopBackoffMaxMs),\n __privateGet(this, _fastLoopBackoffBaseMs) * Math.pow(2, __privateGet(this, _fastLoopConsecutiveCount))\n );\n const delayMs = Math.floor(Math.random() * maxDelay);\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n __privateSet(this, _recentRequestEntries, []);\n};\nconstructUrl_fn = async function(url, resumingFromPause, subsetParams) {\n var _a, _b, _c, _d, _e, _f;\n const [requestHeaders, params] = await Promise.all([\n resolveHeaders(this.options.headers),\n this.options.params ? toInternalParams(convertWhereParamsToObj(this.options.params)) : void 0\n ]);\n if (params) validateParams(params);\n const fetchUrl = new URL(url);\n if (params) {\n if (params.table) setQueryParam(fetchUrl, TABLE_QUERY_PARAM, params.table);\n if (params.where && typeof params.where === `string`) {\n const encodedWhere = encodeWhereClause(\n params.where,\n (_a = this.options.columnMapper) == null ? void 0 : _a.encode\n );\n setQueryParam(fetchUrl, WHERE_QUERY_PARAM, encodedWhere);\n }\n if (params.columns) {\n const originalColumns = await resolveValue((_b = this.options.params) == null ? void 0 : _b.columns);\n if (Array.isArray(originalColumns)) {\n let encodedColumns = originalColumns.map(String);\n if (this.options.columnMapper) {\n encodedColumns = encodedColumns.map(\n this.options.columnMapper.encode\n );\n }\n const serializedColumns = encodedColumns.map(quoteIdentifier).join(`,`);\n setQueryParam(fetchUrl, COLUMNS_QUERY_PARAM, serializedColumns);\n } else {\n setQueryParam(fetchUrl, COLUMNS_QUERY_PARAM, params.columns);\n }\n }\n if (params.replica) setQueryParam(fetchUrl, REPLICA_PARAM, params.replica);\n if (params.params)\n setQueryParam(fetchUrl, WHERE_PARAMS_PARAM, params.params);\n const customParams = __spreadValues({}, params);\n delete customParams.table;\n delete customParams.where;\n delete customParams.columns;\n delete customParams.replica;\n delete customParams.params;\n for (const [key, value] of Object.entries(customParams)) {\n setQueryParam(fetchUrl, key, value);\n }\n }\n if (subsetParams) {\n if (subsetParams.whereExpr) {\n const compiledWhere = compileExpression(\n subsetParams.whereExpr,\n (_c = this.options.columnMapper) == null ? void 0 : _c.encode\n );\n setQueryParam(fetchUrl, SUBSET_PARAM_WHERE, compiledWhere);\n fetchUrl.searchParams.set(\n SUBSET_PARAM_WHERE_EXPR,\n JSON.stringify(subsetParams.whereExpr)\n );\n } else if (subsetParams.where && typeof subsetParams.where === `string`) {\n const encodedWhere = encodeWhereClause(\n subsetParams.where,\n (_d = this.options.columnMapper) == null ? void 0 : _d.encode\n );\n setQueryParam(fetchUrl, SUBSET_PARAM_WHERE, encodedWhere);\n }\n if (subsetParams.params)\n fetchUrl.searchParams.set(\n SUBSET_PARAM_WHERE_PARAMS,\n bigintSafeStringify(subsetParams.params)\n );\n if (subsetParams.limit !== void 0)\n setQueryParam(fetchUrl, SUBSET_PARAM_LIMIT, subsetParams.limit);\n if (subsetParams.offset !== void 0)\n setQueryParam(fetchUrl, SUBSET_PARAM_OFFSET, subsetParams.offset);\n if (subsetParams.orderByExpr) {\n const compiledOrderBy = compileOrderBy(\n subsetParams.orderByExpr,\n (_e = this.options.columnMapper) == null ? void 0 : _e.encode\n );\n setQueryParam(fetchUrl, SUBSET_PARAM_ORDER_BY, compiledOrderBy);\n fetchUrl.searchParams.set(\n SUBSET_PARAM_ORDER_BY_EXPR,\n JSON.stringify(subsetParams.orderByExpr)\n );\n } else if (subsetParams.orderBy && typeof subsetParams.orderBy === `string`) {\n const encodedOrderBy = encodeWhereClause(\n subsetParams.orderBy,\n (_f = this.options.columnMapper) == null ? void 0 : _f.encode\n );\n setQueryParam(fetchUrl, SUBSET_PARAM_ORDER_BY, encodedOrderBy);\n }\n }\n __privateGet(this, _syncState).applyUrlParams(fetchUrl, {\n isSnapshotRequest: subsetParams !== void 0,\n // Don't long-poll when resuming from pause or refreshing — avoids\n // a 20s hold during which `isConnected` would be false\n canLongPoll: !__privateGet(this, _ShapeStream_instances, isRefreshing_get) && !resumingFromPause\n });\n fetchUrl.searchParams.set(LOG_MODE_QUERY_PARAM, __privateGet(this, _mode));\n const shapeKey = canonicalShapeKey(fetchUrl);\n const expiredHandle = expiredShapesCache.getExpiredHandle(shapeKey);\n if (expiredHandle) {\n fetchUrl.searchParams.set(EXPIRED_HANDLE_QUERY_PARAM, expiredHandle);\n }\n fetchUrl.searchParams.sort();\n return {\n fetchUrl,\n requestHeaders\n };\n};\ncreateAbortListener_fn = async function(signal) {\n var _a;\n __privateSet(this, _requestAbortController, new AbortController());\n if (signal) {\n const abortListener = () => {\n var _a2;\n (_a2 = __privateGet(this, _requestAbortController)) == null ? void 0 : _a2.abort(signal.reason);\n };\n signal.addEventListener(`abort`, abortListener, { once: true });\n if (signal.aborted) {\n (_a = __privateGet(this, _requestAbortController)) == null ? void 0 : _a.abort(signal.reason);\n }\n return abortListener;\n }\n};\nonInitialResponse_fn = async function(response) {\n var _a, _b, _c;\n const { headers, status } = response;\n const shapeHandle = headers.get(SHAPE_HANDLE_HEADER);\n const shapeKey = __privateGet(this, _currentFetchUrl) ? canonicalShapeKey(__privateGet(this, _currentFetchUrl)) : null;\n const expiredHandle = shapeKey ? expiredShapesCache.getExpiredHandle(shapeKey) : null;\n if (__privateGet(this, _pendingSelfHealCheck)) {\n const { shapeKey: healedKey, staleHandle } = __privateGet(this, _pendingSelfHealCheck);\n __privateSet(this, _pendingSelfHealCheck, null);\n if (shapeKey === healedKey && shapeHandle === staleHandle) {\n console.warn(\n `[Electric] Self-healing retry received the same handle \"${staleHandle}\" that was just marked expired. This means your proxy/CDN is serving a stale cached response and ignoring cache-buster query params. The client will proceed with this stale data to avoid a permanent failure, but it may be out of date until the cache refreshes. Fix: configure your proxy/CDN to include all query parameters (especially 'handle' and 'offset') in its cache key. For more information visit the troubleshooting guide: ${TROUBLESHOOTING_URL}`,\n new Error(`stack trace`)\n );\n }\n }\n const transition = __privateGet(this, _syncState).handleResponseMetadata({\n status,\n responseHandle: shapeHandle,\n responseOffset: headers.get(CHUNK_LAST_OFFSET_HEADER),\n responseCursor: headers.get(LIVE_CACHE_BUSTER_HEADER),\n responseSchema: getSchemaFromHeaders(headers),\n expiredHandle,\n now: Date.now(),\n maxStaleCacheRetries: __privateGet(this, _maxStaleCacheRetries),\n createCacheBuster\n });\n __privateSet(this, _syncState, transition.state);\n if (status === 204) {\n __privateSet(this, _expiredShapeRecoveryKey, null);\n }\n if (transition.action === `accepted` && status === 204) {\n __privateSet(this, _consecutiveErrorRetries, 0);\n }\n if (transition.action === `stale-retry`) {\n await ((_a = response.body) == null ? void 0 : _a.cancel());\n if (transition.exceededMaxRetries) {\n if (shapeKey) {\n expiredShapesCache.delete(shapeKey);\n if (__privateGet(this, _expiredShapeRecoveryKey) !== shapeKey) {\n console.warn(\n `[Electric] Stale cache retries exhausted (${__privateGet(this, _maxStaleCacheRetries)} attempts). Clearing expired handle entry and attempting self-healing retry without the expired_handle parameter. For more information visit the troubleshooting guide: ${TROUBLESHOOTING_URL}`,\n new Error(`stack trace`)\n );\n __privateSet(this, _expiredShapeRecoveryKey, shapeKey);\n if (shapeHandle) {\n __privateSet(this, _pendingSelfHealCheck, {\n shapeKey,\n staleHandle: shapeHandle\n });\n }\n __privateMethod(this, _ShapeStream_instances, reset_fn).call(this);\n throw new StaleCacheError(\n `Expired handle entry evicted for self-healing retry`\n );\n }\n }\n throw new FetchError(\n 502,\n void 0,\n void 0,\n {},\n (_c = (_b = __privateGet(this, _currentFetchUrl)) == null ? void 0 : _b.toString()) != null ? _c : ``,\n `CDN continues serving stale cached responses after ${__privateGet(this, _maxStaleCacheRetries)} retry attempts. This indicates a severe proxy/CDN misconfiguration. Check that your proxy includes all query parameters (especially 'handle' and 'offset') in its cache key. For more information visit the troubleshooting guide: ${TROUBLESHOOTING_URL}`\n );\n }\n console.warn(\n `[Electric] Received stale cached response with expired shape handle. This should not happen and indicates a proxy/CDN caching misconfiguration. The response contained handle \"${shapeHandle}\" which was previously marked as expired. Check that your proxy includes all query parameters (especially 'handle' and 'offset') in its cache key. For more information visit the troubleshooting guide: ${TROUBLESHOOTING_URL} Retrying with a random cache buster to bypass the stale cache (attempt ${__privateGet(this, _syncState).staleCacheRetryCount}/${__privateGet(this, _maxStaleCacheRetries)}).`,\n new Error(`stack trace`)\n );\n throw new StaleCacheError(\n `Received stale cached response with expired handle \"${shapeHandle}\". This indicates a proxy/CDN caching misconfiguration. Check that your proxy includes all query parameters (especially 'handle' and 'offset') in its cache key.`\n );\n }\n if (transition.action === `ignored`) {\n console.warn(\n `[Electric] Response was ignored by state \"${__privateGet(this, _syncState).kind}\". The response body will be skipped. This may indicate a proxy/CDN caching issue or a client state machine bug.`,\n new Error(`stack trace`)\n );\n return false;\n }\n return true;\n};\nonMessages_fn = async function(batch, isSseMessage = false, opts = {}) {\n if (!Array.isArray(batch)) {\n console.warn(\n `[Electric] #onMessages called with non-array argument (${typeof batch}). This is a client bug \\u2014 please report it.`,\n new Error(`stack trace`)\n );\n return;\n }\n if (batch.length === 0) return;\n __privateSet(this, _consecutiveErrorRetries, 0);\n const lastMessage = batch[batch.length - 1];\n const hasUpToDateMessage = isUpToDateMessage(lastMessage);\n const upToDateOffset = hasUpToDateMessage ? getOffset(lastMessage) : void 0;\n const transition = __privateGet(this, _syncState).handleMessageBatch({\n hasMessages: true,\n hasUpToDateMessage,\n isSse: isSseMessage,\n upToDateOffset,\n now: Date.now(),\n currentCursor: __privateGet(this, _syncState).liveCacheBuster\n });\n __privateSet(this, _syncState, transition.state);\n if (hasUpToDateMessage) {\n if (transition.suppressBatch) {\n return;\n }\n if (__privateGet(this, _currentFetchUrl)) {\n const shapeKey = canonicalShapeKey(__privateGet(this, _currentFetchUrl));\n upToDateTracker.recordUpToDate(\n shapeKey,\n __privateGet(this, _syncState).liveCacheBuster\n );\n __privateSet(this, _expiredShapeRecoveryKey, null);\n }\n }\n const messagesToProcess = batch.filter((message) => {\n if (isChangeMessage(message)) {\n return !__privateGet(this, _snapshotTracker).shouldRejectMessage(message);\n }\n return true;\n });\n await __privateMethod(this, _ShapeStream_instances, publish_fn).call(this, messagesToProcess, {\n allowReentrantBypass: opts.allowReentrantPublishBypass\n });\n};\nfetchShape_fn = async function(opts) {\n var _a;\n __privateSet(this, _currentFetchUrl, opts.fetchUrl);\n if (!__privateGet(this, _syncState).isUpToDate && __privateGet(this, _syncState).canEnterReplayMode()) {\n const shapeKey = canonicalShapeKey(opts.fetchUrl);\n const lastSeenCursor = upToDateTracker.shouldEnterReplayMode(shapeKey);\n if (lastSeenCursor) {\n __privateSet(this, _syncState, __privateGet(this, _syncState).enterReplayMode(lastSeenCursor));\n }\n }\n const useSse = (_a = this.options.liveSse) != null ? _a : this.options.experimentalLiveSse;\n if (__privateGet(this, _syncState).shouldUseSse({\n liveSseEnabled: !!useSse,\n isRefreshing: __privateGet(this, _ShapeStream_instances, isRefreshing_get),\n resumingFromPause: !!opts.resumingFromPause\n })) {\n opts.fetchUrl.searchParams.set(EXPERIMENTAL_LIVE_SSE_QUERY_PARAM, `true`);\n opts.fetchUrl.searchParams.set(LIVE_SSE_QUERY_PARAM, `true`);\n return __privateMethod(this, _ShapeStream_instances, requestShapeSSE_fn).call(this, opts);\n }\n return __privateMethod(this, _ShapeStream_instances, requestShapeLongPoll_fn).call(this, opts);\n};\nrequestShapeLongPoll_fn = async function(opts) {\n var _a;\n const { fetchUrl, requestAbortController, headers } = opts;\n const response = await __privateGet(this, _fetchClient2).call(this, fetchUrl.toString(), {\n signal: requestAbortController.signal,\n headers\n });\n __privateSet(this, _connected, true);\n const shouldProcessBody = await __privateMethod(this, _ShapeStream_instances, onInitialResponse_fn).call(this, response);\n if (!shouldProcessBody) return;\n const schema = __privateGet(this, _syncState).schema;\n const res = await response.text();\n const messages = res || `[]`;\n const batch = __privateGet(this, _messageParser).parse(messages, schema);\n if (!Array.isArray(batch)) {\n const preview = (_a = bigintSafeStringify(batch)) == null ? void 0 : _a.slice(0, 200);\n throw new FetchError(\n response.status,\n `Received non-array response body from shape endpoint. This may indicate a proxy or CDN is returning an unexpected response. Expected a JSON array, got ${typeof batch}: ${preview}`,\n void 0,\n Object.fromEntries(response.headers.entries()),\n fetchUrl.toString()\n );\n }\n await __privateMethod(this, _ShapeStream_instances, onMessages_fn).call(this, batch);\n};\nrequestShapeSSE_fn = async function(opts) {\n const { fetchUrl, requestAbortController, headers } = opts;\n const fetch2 = __privateGet(this, _sseFetchClient);\n __privateSet(this, _lastSseConnectionStartTime, Date.now());\n const sseHeaders = __spreadProps(__spreadValues({}, headers), {\n Accept: `text/event-stream`\n });\n let ignoredStaleResponse = false;\n try {\n let buffer = [];\n await fetchEventSource(fetchUrl.toString(), {\n headers: sseHeaders,\n fetch: fetch2,\n onopen: async (response) => {\n __privateSet(this, _connected, true);\n const shouldProcessBody = await __privateMethod(this, _ShapeStream_instances, onInitialResponse_fn).call(this, response);\n if (!shouldProcessBody) {\n ignoredStaleResponse = true;\n throw new Error(`stale response ignored`);\n }\n },\n onmessage: (event) => {\n if (event.data) {\n const schema = __privateGet(this, _syncState).schema;\n const message = __privateGet(this, _messageParser).parse(\n event.data,\n schema\n );\n buffer.push(message);\n if (isUpToDateMessage(message)) {\n __privateMethod(this, _ShapeStream_instances, onMessages_fn).call(this, buffer, true);\n buffer = [];\n }\n }\n },\n onerror: (error) => {\n throw error;\n },\n signal: requestAbortController.signal\n });\n } catch (error) {\n if (ignoredStaleResponse) {\n return;\n }\n if (requestAbortController.signal.aborted) {\n throw new FetchBackoffAbortError();\n }\n if (error instanceof FetchError || error instanceof StaleCacheError || error instanceof MissingHeadersError) {\n throw error;\n }\n } finally {\n const connectionDuration = Date.now() - __privateGet(this, _lastSseConnectionStartTime);\n const wasAborted = requestAbortController.signal.aborted;\n const transition = __privateGet(this, _syncState).handleSseConnectionClosed({\n connectionDuration,\n wasAborted,\n minConnectionDuration: __privateGet(this, _minSseConnectionDuration),\n maxShortConnections: __privateGet(this, _maxShortSseConnections)\n });\n __privateSet(this, _syncState, transition.state);\n if (transition.fellBackToLongPolling) {\n console.warn(\n `[Electric] SSE connections are closing immediately (possibly due to proxy buffering or misconfiguration). Falling back to long polling. Your proxy must support streaming SSE responses (not buffer the complete response). Configuration: Nginx add 'X-Accel-Buffering: no', Caddy add 'flush_interval -1' to reverse_proxy. Note: Do NOT disable caching entirely - Electric uses cache headers to enable request collapsing for efficiency.`,\n new Error(`stack trace`)\n );\n } else if (transition.wasShortConnection) {\n const maxDelay = Math.min(\n __privateGet(this, _sseBackoffMaxDelay),\n __privateGet(this, _sseBackoffBaseDelay) * Math.pow(2, __privateGet(this, _syncState).consecutiveShortSseConnections)\n );\n const delayMs = Math.floor(Math.random() * maxDelay);\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n }\n};\nnextTick_fn = async function() {\n if (__privateGet(this, _pauseLock).isPaused) {\n throw new Error(\n `Cannot wait for next tick while PauseLock is held \\u2014 this would deadlock because the request loop is paused`\n );\n }\n if (__privateGet(this, _tickPromise)) {\n return __privateGet(this, _tickPromise);\n }\n __privateSet(this, _tickPromise, new Promise((resolve, reject) => {\n __privateSet(this, _tickPromiseResolver, resolve);\n __privateSet(this, _tickPromiseRejecter, reject);\n }));\n __privateGet(this, _tickPromise).finally(() => {\n __privateSet(this, _tickPromise, void 0);\n __privateSet(this, _tickPromiseResolver, void 0);\n __privateSet(this, _tickPromiseRejecter, void 0);\n });\n return __privateGet(this, _tickPromise);\n};\npublish_fn = async function(messages, opts = {}) {\n const deliver = () => Promise.all(\n Array.from(__privateGet(this, _subscribers).values()).map(async ([callback, __]) => {\n try {\n await callback(messages);\n } catch (err) {\n queueMicrotask(() => {\n throw err;\n });\n }\n })\n );\n if (__privateGet(this, _isPublishing) && opts.allowReentrantBypass) {\n return deliver();\n }\n __privateSet(this, _messageChain, __privateGet(this, _messageChain).then(async () => {\n __privateSet(this, _isPublishing, true);\n try {\n return await deliver();\n } finally {\n __privateSet(this, _isPublishing, false);\n }\n }));\n return __privateGet(this, _messageChain);\n};\nsendErrorToSubscribers_fn = function(error) {\n __privateGet(this, _subscribers).forEach(([_, errorFn]) => {\n errorFn == null ? void 0 : errorFn(error);\n });\n};\nhasBrowserVisibilityAPI_fn = function() {\n return typeof document === `object` && typeof document.hidden === `boolean` && typeof document.addEventListener === `function`;\n};\nsubscribeToVisibilityChanges_fn = function() {\n if (__privateMethod(this, _ShapeStream_instances, hasBrowserVisibilityAPI_fn).call(this)) {\n const visibilityHandler = () => {\n if (document.hidden) {\n __privateGet(this, _pauseLock).acquire(`visibility`);\n } else {\n __privateGet(this, _pauseLock).release(`visibility`);\n }\n };\n document.addEventListener(`visibilitychange`, visibilityHandler);\n __privateSet(this, _unsubscribeFromVisibilityChanges, () => {\n document.removeEventListener(`visibilitychange`, visibilityHandler);\n __privateSet(this, _unsubscribeFromVisibilityChanges, void 0);\n });\n }\n};\n/**\n * Detects system wake from sleep using timer gap detection.\n * When the system sleeps, setInterval timers are paused. On wake,\n * the elapsed wall-clock time since the last tick will be much larger\n * than the interval period, indicating the system was asleep.\n *\n * Only active in non-browser environments (Bun, Node.js) where\n * `document.visibilitychange` is not available. In browsers,\n * `#subscribeToVisibilityChanges` handles this instead. Without wake\n * detection, in-flight HTTP requests (long-poll or SSE) may hang until\n * the OS TCP timeout.\n */\nsubscribeToWakeDetection_fn = function() {\n if (__privateMethod(this, _ShapeStream_instances, hasBrowserVisibilityAPI_fn).call(this)) return;\n if (__privateGet(this, _unsubscribeFromWakeDetection)) return;\n const INTERVAL_MS = 2e3;\n const WAKE_THRESHOLD_MS = 4e3;\n let lastTickTime = Date.now();\n const timer = setInterval(() => {\n const now = Date.now();\n const elapsed = now - lastTickTime;\n lastTickTime = now;\n if (elapsed > INTERVAL_MS + WAKE_THRESHOLD_MS) {\n if (!__privateGet(this, _pauseLock).isPaused && __privateGet(this, _requestAbortController)) {\n __privateWrapper(this, _refreshCount)._++;\n __privateGet(this, _requestAbortController).abort(SYSTEM_WAKE);\n queueMicrotask(() => {\n __privateWrapper(this, _refreshCount)._--;\n });\n }\n }\n }, INTERVAL_MS);\n if (typeof timer === `object` && `unref` in timer) {\n timer.unref();\n }\n __privateSet(this, _unsubscribeFromWakeDetection, () => {\n clearInterval(timer);\n __privateSet(this, _unsubscribeFromWakeDetection, void 0);\n });\n};\n/**\n * Resets the state of the stream, optionally with a provided\n * shape handle\n */\nreset_fn = function(handle) {\n __privateSet(this, _syncState, __privateGet(this, _syncState).markMustRefetch(handle));\n __privateSet(this, _connected, false);\n __privateGet(this, _pauseLock).releaseAllMatching(`snapshot`);\n};\nfetchSnapshotWithRetry_fn = async function(opts, retryCount, cacheBuster) {\n var _a, _b, _c;\n const method = (_b = (_a = opts.method) != null ? _a : this.options.subsetMethod) != null ? _b : `GET`;\n const usePost = method === `POST`;\n let fetchUrl;\n let fetchOptions;\n if (usePost) {\n const result = await __privateMethod(this, _ShapeStream_instances, constructUrl_fn).call(this, this.options.url, true);\n fetchUrl = result.fetchUrl;\n fetchOptions = {\n method: `POST`,\n headers: __spreadProps(__spreadValues({}, result.requestHeaders), {\n \"Content-Type\": `application/json`\n }),\n body: bigintSafeStringify(__privateMethod(this, _ShapeStream_instances, buildSubsetBody_fn).call(this, opts))\n };\n } else {\n const result = await __privateMethod(this, _ShapeStream_instances, constructUrl_fn).call(this, this.options.url, true, opts);\n fetchUrl = result.fetchUrl;\n fetchOptions = { headers: result.requestHeaders };\n }\n if (cacheBuster) {\n fetchUrl.searchParams.set(CACHE_BUSTER_QUERY_PARAM, cacheBuster);\n fetchUrl.searchParams.sort();\n }\n const usedHandle = __privateGet(this, _syncState).handle;\n let response;\n try {\n response = await __privateGet(this, _fetchClient2).call(this, fetchUrl.toString(), fetchOptions);\n } catch (e) {\n if (e instanceof FetchError && e.status === 409) {\n const nextRetryCount = retryCount + 1;\n if (nextRetryCount > __privateGet(this, _maxSnapshotRetries)) {\n throw new FetchError(\n 502,\n void 0,\n void 0,\n {},\n fetchUrl.toString(),\n `Snapshot request stuck in 409 retry loop after ${__privateGet(this, _maxSnapshotRetries)} attempts. This indicates a proxy/CDN misconfiguration. For more information visit the troubleshooting guide: ${TROUBLESHOOTING_URL}`\n );\n }\n if (usedHandle) {\n const shapeKey = canonicalShapeKey(fetchUrl);\n expiredShapesCache.markExpired(shapeKey, usedHandle);\n }\n const nextHandle = e.headers[SHAPE_HANDLE_HEADER];\n if (nextHandle) {\n __privateSet(this, _syncState, __privateGet(this, _syncState).withHandle(nextHandle));\n } else {\n console.warn(\n `[Electric] Received 409 response without a shape handle header. This likely indicates a proxy or CDN stripping required headers.`\n );\n }\n const nextCacheBuster = createCacheBuster();\n return __privateMethod(this, _ShapeStream_instances, fetchSnapshotWithRetry_fn).call(this, opts, nextRetryCount, nextCacheBuster);\n }\n throw e;\n }\n if (!response.ok) {\n throw await FetchError.fromResponse(response, fetchUrl.toString());\n }\n const schema = (_c = __privateGet(this, _syncState).schema) != null ? _c : getSchemaFromHeaders(response.headers, {\n required: true,\n url: fetchUrl.toString()\n });\n const { metadata, data: rawData } = await response.json();\n const data = __privateGet(this, _messageParser).parseSnapshotData(\n rawData,\n schema\n );\n const responseOffset = response.headers.get(CHUNK_LAST_OFFSET_HEADER) || null;\n const responseHandle = response.headers.get(SHAPE_HANDLE_HEADER);\n return { metadata, data, responseOffset, responseHandle };\n};\nbuildSubsetBody_fn = function(opts) {\n var _a, _b, _c, _d;\n const body = {};\n if (opts.whereExpr) {\n body.where = compileExpression(\n opts.whereExpr,\n (_a = this.options.columnMapper) == null ? void 0 : _a.encode\n );\n body.where_expr = opts.whereExpr;\n } else if (opts.where && typeof opts.where === `string`) {\n body.where = encodeWhereClause(\n opts.where,\n (_b = this.options.columnMapper) == null ? void 0 : _b.encode\n );\n }\n if (opts.params) {\n body.params = opts.params;\n }\n if (opts.limit !== void 0) {\n body.limit = opts.limit;\n }\n if (opts.offset !== void 0) {\n body.offset = opts.offset;\n }\n if (opts.orderByExpr) {\n body.order_by = compileOrderBy(\n opts.orderByExpr,\n (_c = this.options.columnMapper) == null ? void 0 : _c.encode\n );\n body.order_by_expr = opts.orderByExpr;\n } else if (opts.orderBy && typeof opts.orderBy === `string`) {\n body.order_by = encodeWhereClause(\n opts.orderBy,\n (_d = this.options.columnMapper) == null ? void 0 : _d.encode\n );\n }\n return body;\n};\nShapeStream.Replica = {\n FULL: `full`,\n DEFAULT: `default`\n};\nfunction getSchemaFromHeaders(headers, options) {\n const schemaHeader = headers.get(SHAPE_SCHEMA_HEADER);\n if (!schemaHeader) {\n if ((options == null ? void 0 : options.required) && (options == null ? void 0 : options.url)) {\n throw new MissingHeadersError(options.url, [SHAPE_SCHEMA_HEADER]);\n }\n return {};\n }\n return JSON.parse(schemaHeader);\n}\nfunction validateParams(params) {\n if (!params) return;\n const reservedParams = Object.keys(params).filter(\n (key) => RESERVED_PARAMS.has(key)\n );\n if (reservedParams.length > 0) {\n throw new ReservedParamError(reservedParams);\n }\n}\nvar didWarnOnHttp = false;\nfunction getNodeEnvSafely() {\n var _a;\n return typeof process !== `undefined` ? (_a = process.env) == null ? void 0 : _a.NODE_ENV : void 0;\n}\nfunction resolveUrlMaybe(url, base) {\n try {\n return new URL(url, base);\n } catch (e) {\n return void 0;\n }\n}\nfunction isBrowserEnvironment() {\n return typeof window !== `undefined`;\n}\nfunction getWindowLocationHref() {\n if (isBrowserEnvironment() && typeof window.location !== `undefined`) {\n return window.location.href;\n }\n return void 0;\n}\nfunction validateOptions(options) {\n var _a;\n if (!options.url) {\n throw new MissingShapeUrlError();\n }\n if (options.signal && !(options.signal instanceof AbortSignal)) {\n throw new InvalidSignalError();\n }\n if (options.offset !== void 0 && options.offset !== `-1` && options.offset !== `now` && !options.handle) {\n throw new MissingShapeHandleError();\n }\n validateParams(options.params);\n const nodeEnv = getNodeEnvSafely();\n const warnOnHttp = (_a = options.warnOnHttp) != null ? _a : nodeEnv !== `test`;\n if (warnOnHttp && !didWarnOnHttp && isBrowserEnvironment()) {\n if (typeof console !== `undefined`) {\n const baseUrl = getWindowLocationHref();\n const resolvedUrl = resolveUrlMaybe(options.url, baseUrl);\n const isHttp = (resolvedUrl == null ? void 0 : resolvedUrl.protocol) === `http:`;\n if (isHttp) {\n didWarnOnHttp = true;\n console.warn(\n `[Electric] Using HTTP (not HTTPS) typically limits browsers to ~6 concurrent connections per origin under HTTP/1.1. This can cause slow shapes and app freezes with multiple shapes. Use HTTPS for HTTP/2 support. See: https://electric-sql.com/r/electric-http2`\n );\n }\n }\n }\n return;\n}\nfunction _resetHttpWarningForTesting() {\n didWarnOnHttp = false;\n}\nfunction setQueryParam(url, key, value) {\n if (value === void 0 || value == null) {\n return;\n } else if (typeof value === `string`) {\n url.searchParams.set(key, value);\n } else if (typeof value === `object`) {\n for (const [k, v] of Object.entries(value)) {\n url.searchParams.set(`${key}[${k}]`, v);\n }\n } else {\n url.searchParams.set(key, value.toString());\n }\n}\nfunction convertWhereParamsToObj(allPgParams) {\n if (Array.isArray(allPgParams.params)) {\n return __spreadProps(__spreadValues({}, allPgParams), {\n params: Object.fromEntries(allPgParams.params.map((v, i) => [i + 1, v]))\n });\n }\n return allPgParams;\n}\n\n// src/shape.ts\nvar _data, _subscribers2, _insertedKeys, _requestedSubSnapshots, _reexecuteSnapshotsPending, _status, _error2, _Shape_instances, process_fn, reexecuteSnapshots_fn, surfaceReexecuteError_fn, awaitUpToDate_fn, updateShapeStatus_fn, handleError_fn, notify_fn;\nvar Shape = class {\n constructor(stream) {\n __privateAdd(this, _Shape_instances);\n __privateAdd(this, _data, /* @__PURE__ */ new Map());\n __privateAdd(this, _subscribers2, /* @__PURE__ */ new Map());\n __privateAdd(this, _insertedKeys, /* @__PURE__ */ new Set());\n __privateAdd(this, _requestedSubSnapshots, /* @__PURE__ */ new Set());\n __privateAdd(this, _reexecuteSnapshotsPending, false);\n __privateAdd(this, _status, `syncing`);\n __privateAdd(this, _error2, false);\n this.stream = stream;\n this.stream.subscribe(\n __privateMethod(this, _Shape_instances, process_fn).bind(this),\n __privateMethod(this, _Shape_instances, handleError_fn).bind(this)\n );\n }\n get isUpToDate() {\n return __privateGet(this, _status) === `up-to-date`;\n }\n get lastOffset() {\n return this.stream.lastOffset;\n }\n get handle() {\n return this.stream.shapeHandle;\n }\n get rows() {\n return this.value.then((v) => Array.from(v.values()));\n }\n get currentRows() {\n return Array.from(this.currentValue.values());\n }\n get value() {\n return new Promise((resolve, reject) => {\n if (this.stream.isUpToDate) {\n resolve(this.currentValue);\n } else {\n const unsubscribe = this.subscribe(({ value }) => {\n unsubscribe();\n if (__privateGet(this, _error2)) reject(__privateGet(this, _error2));\n resolve(value);\n });\n }\n });\n }\n get currentValue() {\n return __privateGet(this, _data);\n }\n get error() {\n return __privateGet(this, _error2);\n }\n /** Unix time at which we last synced. Undefined when `isLoading` is true. */\n lastSyncedAt() {\n return this.stream.lastSyncedAt();\n }\n /** Time elapsed since last sync (in ms). Infinity if we did not yet sync. */\n lastSynced() {\n return this.stream.lastSynced();\n }\n /** True during initial fetch. False afterwise. */\n isLoading() {\n return this.stream.isLoading();\n }\n /** Indicates if we are connected to the Electric sync service. */\n isConnected() {\n return this.stream.isConnected();\n }\n /** Current log mode of the underlying stream */\n get mode() {\n return this.stream.mode;\n }\n /**\n * Request a snapshot for subset of data. Only available when mode is changes_only.\n * Returns void; data will be emitted via the stream and processed by this Shape.\n */\n async requestSnapshot(params) {\n const key = canonicalBigintSafeStringify(params);\n __privateGet(this, _requestedSubSnapshots).add(key);\n await __privateMethod(this, _Shape_instances, awaitUpToDate_fn).call(this);\n await this.stream.requestSnapshot(params);\n }\n subscribe(callback) {\n const subscriptionId = {};\n __privateGet(this, _subscribers2).set(subscriptionId, callback);\n return () => {\n __privateGet(this, _subscribers2).delete(subscriptionId);\n };\n }\n unsubscribeAll() {\n __privateGet(this, _subscribers2).clear();\n }\n get numSubscribers() {\n return __privateGet(this, _subscribers2).size;\n }\n};\n_data = new WeakMap();\n_subscribers2 = new WeakMap();\n_insertedKeys = new WeakMap();\n_requestedSubSnapshots = new WeakMap();\n_reexecuteSnapshotsPending = new WeakMap();\n_status = new WeakMap();\n_error2 = new WeakMap();\n_Shape_instances = new WeakSet();\nprocess_fn = function(messages) {\n let shouldNotify = false;\n messages.forEach((message) => {\n if (isChangeMessage(message)) {\n const wasUpToDate = __privateGet(this, _status) === `up-to-date`;\n __privateMethod(this, _Shape_instances, updateShapeStatus_fn).call(this, `syncing`);\n if (this.mode === `full`) {\n switch (message.headers.operation) {\n case `insert`:\n __privateGet(this, _data).set(message.key, message.value);\n if (wasUpToDate) shouldNotify = true;\n break;\n case `update`:\n __privateGet(this, _data).set(message.key, __spreadValues(__spreadValues({}, __privateGet(this, _data).get(message.key)), message.value));\n if (wasUpToDate) shouldNotify = true;\n break;\n case `delete`:\n __privateGet(this, _data).delete(message.key);\n if (wasUpToDate) shouldNotify = true;\n break;\n }\n } else {\n switch (message.headers.operation) {\n case `insert`:\n __privateGet(this, _insertedKeys).add(message.key);\n __privateGet(this, _data).set(message.key, message.value);\n if (wasUpToDate) shouldNotify = true;\n break;\n case `update`:\n if (__privateGet(this, _insertedKeys).has(message.key)) {\n __privateGet(this, _data).set(message.key, __spreadValues(__spreadValues({}, __privateGet(this, _data).get(message.key)), message.value));\n if (wasUpToDate) shouldNotify = true;\n }\n break;\n case `delete`:\n if (__privateGet(this, _insertedKeys).has(message.key)) {\n __privateGet(this, _data).delete(message.key);\n __privateGet(this, _insertedKeys).delete(message.key);\n if (wasUpToDate) shouldNotify = true;\n }\n break;\n }\n }\n }\n if (isControlMessage(message)) {\n switch (message.headers.control) {\n case `up-to-date`:\n if (__privateMethod(this, _Shape_instances, updateShapeStatus_fn).call(this, `up-to-date`)) shouldNotify = true;\n if (__privateGet(this, _reexecuteSnapshotsPending)) {\n __privateSet(this, _reexecuteSnapshotsPending, false);\n void __privateMethod(this, _Shape_instances, reexecuteSnapshots_fn).call(this);\n }\n break;\n case `must-refetch`:\n __privateGet(this, _data).clear();\n __privateGet(this, _insertedKeys).clear();\n __privateSet(this, _error2, false);\n __privateMethod(this, _Shape_instances, updateShapeStatus_fn).call(this, `syncing`);\n __privateSet(this, _reexecuteSnapshotsPending, true);\n break;\n }\n }\n });\n if (shouldNotify) __privateMethod(this, _Shape_instances, notify_fn).call(this);\n};\nreexecuteSnapshots_fn = async function() {\n try {\n await __privateMethod(this, _Shape_instances, awaitUpToDate_fn).call(this);\n } catch (e) {\n __privateMethod(this, _Shape_instances, surfaceReexecuteError_fn).call(this, e);\n return;\n }\n const results = await Promise.all(\n Array.from(__privateGet(this, _requestedSubSnapshots)).map(async (jsonParams) => {\n try {\n const snapshot = JSON.parse(jsonParams);\n await this.stream.requestSnapshot(snapshot);\n return void 0;\n } catch (e) {\n return e;\n }\n })\n );\n const firstError = results.find((e) => e !== void 0);\n if (firstError !== void 0) __privateMethod(this, _Shape_instances, surfaceReexecuteError_fn).call(this, firstError);\n};\nsurfaceReexecuteError_fn = function(e) {\n if (e instanceof FetchError) {\n __privateSet(this, _error2, e);\n } else if (e instanceof Error) {\n __privateSet(this, _error2, new FetchError(0, e.message, void 0, {}, ``, e.message));\n } else {\n __privateSet(this, _error2, new FetchError(0, String(e), void 0, {}, ``, String(e)));\n }\n __privateMethod(this, _Shape_instances, notify_fn).call(this);\n};\nawaitUpToDate_fn = async function() {\n if (__privateGet(this, _error2)) throw __privateGet(this, _error2);\n if (this.stream.isUpToDate) return;\n if (this.stream.error) throw this.stream.error;\n await new Promise((resolve, reject) => {\n let settled = false;\n let interval;\n let unsub;\n const done = (action) => {\n if (settled) return;\n settled = true;\n clearInterval(interval);\n unsub == null ? void 0 : unsub();\n action();\n };\n const check = () => {\n if (this.stream.isUpToDate) return done(resolve);\n const streamError = this.stream.error;\n if (streamError) return done(() => reject(streamError));\n if (__privateGet(this, _error2)) {\n const err = __privateGet(this, _error2);\n return done(() => reject(err));\n }\n };\n interval = setInterval(check, 10);\n unsub = this.stream.subscribe(\n () => check(),\n (err) => done(() => reject(err))\n );\n check();\n });\n};\nupdateShapeStatus_fn = function(status) {\n const stateChanged = __privateGet(this, _status) !== status;\n __privateSet(this, _status, status);\n return stateChanged && status === `up-to-date`;\n};\nhandleError_fn = function(e) {\n if (e instanceof FetchError) {\n __privateSet(this, _error2, e);\n __privateMethod(this, _Shape_instances, notify_fn).call(this);\n }\n};\nnotify_fn = function() {\n __privateGet(this, _subscribers2).forEach((callback) => {\n callback({ value: this.currentValue, rows: this.currentRows });\n });\n};\nexport {\n BackoffDefaults,\n ELECTRIC_PROTOCOL_QUERY_PARAMS,\n FetchBackoffAbortError,\n FetchError,\n Shape,\n ShapeStream,\n _resetHttpWarningForTesting,\n camelToSnake,\n canonicalShapeKey,\n compileExpression,\n compileOrderBy,\n createColumnMapper,\n isChangeMessage,\n isControlMessage,\n isVisibleInSnapshot,\n resolveValue,\n snakeCamelMapper,\n snakeToCamel\n};\n//# sourceMappingURL=index.mjs.map",
63
+ "var __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __reflectGet = Reflect.get;\nvar __typeError = (msg) => {\n throw TypeError(msg);\n};\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b || (b = {}))\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\nvar __accessCheck = (obj, member, msg) => member.has(obj) || __typeError(\"Cannot \" + msg);\nvar __privateGet = (obj, member, getter) => (__accessCheck(obj, member, \"read from private field\"), getter ? getter.call(obj) : member.get(obj));\nvar __privateAdd = (obj, member, value) => member.has(obj) ? __typeError(\"Cannot add the same private member more than once\") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);\nvar __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, \"write to private field\"), setter ? setter.call(obj, value) : member.set(obj, value), value);\nvar __privateMethod = (obj, member, method) => (__accessCheck(obj, member, \"access private method\"), method);\nvar __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);\nvar __async = (__this, __arguments, generator) => {\n return new Promise((resolve, reject) => {\n var fulfilled = (value) => {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n };\n var rejected = (value) => {\n try {\n step(generator.throw(value));\n } catch (e) {\n reject(e);\n }\n };\n var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);\n step((generator = generator.apply(__this, __arguments)).next());\n });\n};\n\n// src/match.ts\nimport {\n isChangeMessage\n} from \"@electric-sql/client\";\nfunction matchStream(stream, operations, matchFn, timeout = 6e4) {\n return new Promise((resolve, reject) => {\n const unsubscribe = stream.subscribe(\n (messages) => {\n const message = messages.filter(\n (msg) => isChangeMessage(msg)\n ).find((message2) => {\n const operation = message2.headers.operation;\n return operations.includes(operation) && matchFn(message2);\n });\n if (message) {\n return finish(message);\n }\n }\n );\n const timeoutId = setTimeout(() => {\n const msg = `matchStream timed out after ${timeout}ms`;\n console.error(msg);\n reject(msg);\n }, timeout);\n function finish(message) {\n clearTimeout(timeoutId);\n unsubscribe();\n return resolve(message);\n }\n });\n}\nfunction matchBy(column, value) {\n return (message) => message.value[column] === value;\n}\n\n// src/bigint-utils.ts\nfunction bigIntMax(nums) {\n return BigInt(nums.reduce((m, e) => e > m ? e : m));\n}\nfunction bigIntMin(nums) {\n return BigInt(nums.reduce((m, e) => e < m ? e : m));\n}\nfunction bigIntCompare(a, b) {\n return a > b ? 1 : a < b ? -1 : 0;\n}\n\n// src/multi-shape-stream.ts\nimport {\n ShapeStream,\n isChangeMessage as isChangeMessage2,\n isControlMessage\n} from \"@electric-sql/client\";\nvar _shapes, _started, _checkForUpdatesTimeout, _lastDataLsns, _lastUpToDateLsns, _subscribers, _MultiShapeStream_instances, start_fn, scheduleCheckForUpdates_fn, checkForUpdates_fn, onError_fn, shapeEntries_fn;\nvar MultiShapeStream = class {\n constructor(options) {\n __privateAdd(this, _MultiShapeStream_instances);\n __privateAdd(this, _shapes);\n __privateAdd(this, _started, false);\n __privateAdd(this, _checkForUpdatesTimeout);\n // We keep track of the last lsn of data and up-to-date messages for each shape\n // so that we can skip checkForUpdates if the lsn of the up-to-date message is\n // greater than the last lsn of data.\n __privateAdd(this, _lastDataLsns);\n __privateAdd(this, _lastUpToDateLsns);\n __privateAdd(this, _subscribers, /* @__PURE__ */ new Map());\n const {\n start = true,\n // By default we start the multi-shape stream\n checkForUpdatesAfterMs = 100,\n // Force a check for updates after 100ms\n shapes\n } = options;\n this.checkForUpdatesAfterMs = checkForUpdatesAfterMs;\n __privateSet(this, _shapes, Object.fromEntries(\n Object.entries(shapes).map(([key, shape]) => [\n key,\n shape instanceof ShapeStream ? shape : new ShapeStream(__spreadProps(__spreadValues({}, shape), {\n start: false\n }))\n ])\n ));\n __privateSet(this, _lastDataLsns, Object.fromEntries(\n Object.entries(shapes).map(([key]) => [key, BigInt(-1)])\n ));\n __privateSet(this, _lastUpToDateLsns, Object.fromEntries(\n Object.entries(shapes).map(([key]) => [key, BigInt(-1)])\n ));\n if (start) __privateMethod(this, _MultiShapeStream_instances, start_fn).call(this);\n }\n _publish(messages) {\n return __async(this, null, function* () {\n yield Promise.all(\n Array.from(__privateGet(this, _subscribers).values()).map((_0) => __async(this, [_0], function* ([callback, __]) {\n try {\n yield callback(messages);\n } catch (err) {\n queueMicrotask(() => {\n throw err;\n });\n }\n }))\n );\n });\n }\n /**\n * The ShapeStreams that are being subscribed to.\n */\n get shapes() {\n return __privateGet(this, _shapes);\n }\n subscribe(callback, onError) {\n const subscriptionId = Math.random();\n __privateGet(this, _subscribers).set(subscriptionId, [callback, onError]);\n if (!__privateGet(this, _started)) __privateMethod(this, _MultiShapeStream_instances, start_fn).call(this);\n return () => {\n __privateGet(this, _subscribers).delete(subscriptionId);\n };\n }\n unsubscribeAll() {\n __privateGet(this, _subscribers).clear();\n }\n /** Unix time at which we last synced. Undefined when `isLoading` is true. */\n lastSyncedAt() {\n const shapeEntries = __privateMethod(this, _MultiShapeStream_instances, shapeEntries_fn).call(this);\n if (shapeEntries.length === 0) return;\n return shapeEntries.reduce((minLastSyncedAt, [_, shape]) => {\n var _a;\n return Math.min(minLastSyncedAt, (_a = shape.lastSyncedAt()) != null ? _a : Infinity);\n }, Infinity);\n }\n /** Time elapsed since last sync (in ms). Infinity if we did not yet sync. */\n lastSynced() {\n const lastSyncedAt = this.lastSyncedAt();\n if (lastSyncedAt === void 0) return Infinity;\n return Date.now() - lastSyncedAt;\n }\n /** Indicates if we are connected to the Electric sync service. */\n isConnected() {\n return __privateMethod(this, _MultiShapeStream_instances, shapeEntries_fn).call(this).every(([_, shape]) => shape.isConnected());\n }\n /** True during initial fetch. False afterwise. */\n isLoading() {\n return __privateMethod(this, _MultiShapeStream_instances, shapeEntries_fn).call(this).some(([_, shape]) => shape.isLoading());\n }\n get isUpToDate() {\n return __privateMethod(this, _MultiShapeStream_instances, shapeEntries_fn).call(this).every(([_, shape]) => shape.isUpToDate);\n }\n};\n_shapes = new WeakMap();\n_started = new WeakMap();\n_checkForUpdatesTimeout = new WeakMap();\n_lastDataLsns = new WeakMap();\n_lastUpToDateLsns = new WeakMap();\n_subscribers = new WeakMap();\n_MultiShapeStream_instances = new WeakSet();\nstart_fn = function() {\n if (__privateGet(this, _started)) throw new Error(`Cannot start multi-shape stream twice`);\n for (const [key, shape] of __privateMethod(this, _MultiShapeStream_instances, shapeEntries_fn).call(this)) {\n if (shape.hasStarted()) {\n throw new Error(`Shape ${key} already started`);\n }\n shape.subscribe(\n (messages) => __async(this, null, function* () {\n const upToDateLsns = messages.filter(isControlMessage).map(\n ({ headers }) => typeof headers.global_last_seen_lsn === `string` ? BigInt(headers.global_last_seen_lsn) : BigInt(0)\n );\n if (upToDateLsns.length > 0) {\n const maxUpToDateLsn = bigIntMax(upToDateLsns);\n const lastMaxUpToDateLsn = __privateGet(this, _lastUpToDateLsns)[key];\n if (maxUpToDateLsn > lastMaxUpToDateLsn) {\n __privateGet(this, _lastUpToDateLsns)[key] = maxUpToDateLsn;\n }\n }\n const dataLsns = messages.filter(isChangeMessage2).map(\n ({ headers }) => typeof headers.lsn === `string` ? BigInt(headers.lsn) : BigInt(0)\n );\n if (dataLsns.length > 0) {\n const maxDataLsn = bigIntMax(dataLsns);\n const lastMaxDataLsn = __privateGet(this, _lastDataLsns)[key];\n if (maxDataLsn > lastMaxDataLsn) {\n __privateGet(this, _lastDataLsns)[key] = maxDataLsn;\n }\n __privateMethod(this, _MultiShapeStream_instances, scheduleCheckForUpdates_fn).call(this);\n }\n const multiShapeMessages = messages.map(\n (message) => __spreadProps(__spreadValues({}, message), {\n shape: key\n })\n );\n yield this._publish(multiShapeMessages);\n }),\n (error) => __privateMethod(this, _MultiShapeStream_instances, onError_fn).call(this, error)\n );\n }\n __privateSet(this, _started, true);\n};\nscheduleCheckForUpdates_fn = function() {\n var _a;\n (_a = __privateGet(this, _checkForUpdatesTimeout)) != null ? _a : __privateSet(this, _checkForUpdatesTimeout, setTimeout(() => {\n __privateMethod(this, _MultiShapeStream_instances, checkForUpdates_fn).call(this);\n __privateSet(this, _checkForUpdatesTimeout, void 0);\n }, this.checkForUpdatesAfterMs));\n};\ncheckForUpdates_fn = function() {\n return __async(this, null, function* () {\n const maxDataLsn = bigIntMax(Object.values(__privateGet(this, _lastDataLsns)));\n const refreshPromises = __privateMethod(this, _MultiShapeStream_instances, shapeEntries_fn).call(this).filter(([key]) => {\n const lastUpToDateLsn = __privateGet(this, _lastUpToDateLsns)[key];\n return lastUpToDateLsn < maxDataLsn;\n }).map(([_, shape]) => {\n return shape.forceDisconnectAndRefresh();\n });\n yield Promise.all(refreshPromises);\n });\n};\nonError_fn = function(error) {\n __privateGet(this, _subscribers).forEach(([_, errorFn]) => {\n errorFn == null ? void 0 : errorFn(error);\n });\n};\n/**\n * Returns an array of the shape entries.\n * Ensures that the shape entries are typed, as `Object.entries`\n * will not type the entries correctly.\n */\nshapeEntries_fn = function() {\n return Object.entries(__privateGet(this, _shapes));\n};\nvar _changeMessages, _completeLsns, _TransactionalMultiShapeStream_instances, getLowestCompleteLsn_fn, accumulate_fn;\nvar _TransactionalMultiShapeStream = class _TransactionalMultiShapeStream extends MultiShapeStream {\n constructor(options) {\n super(options);\n __privateAdd(this, _TransactionalMultiShapeStream_instances);\n __privateAdd(this, _changeMessages, /* @__PURE__ */ new Map());\n __privateAdd(this, _completeLsns);\n __privateSet(this, _completeLsns, Object.fromEntries(\n Object.entries(options.shapes).map(([key]) => [key, BigInt(-1)])\n ));\n }\n _publish(messages) {\n return __async(this, null, function* () {\n __privateMethod(this, _TransactionalMultiShapeStream_instances, accumulate_fn).call(this, messages);\n const lowestCompleteLsn = __privateMethod(this, _TransactionalMultiShapeStream_instances, getLowestCompleteLsn_fn).call(this);\n const lsnsToPublish = [...__privateGet(this, _changeMessages).keys()].filter(\n (lsn) => lsn <= lowestCompleteLsn\n );\n const messagesToPublish = lsnsToPublish.sort((a, b) => bigIntCompare(a, b)).map(\n (lsn) => {\n var _a;\n return (_a = __privateGet(this, _changeMessages).get(lsn)) == null ? void 0 : _a.sort((a, b) => {\n const { headers: aHeaders } = a;\n const { headers: bHeaders } = b;\n if (typeof aHeaders.op_position !== `number` || typeof bHeaders.op_position !== `number`) {\n return 0;\n }\n return aHeaders.op_position - bHeaders.op_position;\n });\n }\n ).filter((messages2) => messages2 !== void 0).flat();\n lsnsToPublish.forEach((lsn) => {\n __privateGet(this, _changeMessages).delete(lsn);\n });\n if (messagesToPublish.length > 0) {\n yield __superGet(_TransactionalMultiShapeStream.prototype, this, \"_publish\").call(this, messagesToPublish);\n }\n });\n }\n};\n_changeMessages = new WeakMap();\n_completeLsns = new WeakMap();\n_TransactionalMultiShapeStream_instances = new WeakSet();\ngetLowestCompleteLsn_fn = function() {\n return bigIntMin(Object.values(__privateGet(this, _completeLsns)));\n};\naccumulate_fn = function(messages) {\n const isUpToDate = this.isUpToDate;\n messages.forEach((message) => {\n var _a;\n const { shape, headers } = message;\n if (isChangeMessage2(message)) {\n const lsn = typeof headers.lsn === `string` ? BigInt(headers.lsn) : BigInt(0);\n if (!__privateGet(this, _changeMessages).has(lsn)) {\n __privateGet(this, _changeMessages).set(lsn, []);\n }\n (_a = __privateGet(this, _changeMessages).get(lsn)) == null ? void 0 : _a.push(message);\n if (isUpToDate && // All shapes must be up to date\n typeof headers.last === `boolean` && headers.last === true) {\n __privateGet(this, _completeLsns)[shape] = bigIntMax([\n __privateGet(this, _completeLsns)[shape],\n lsn\n ]);\n }\n } else if (isControlMessage(message)) {\n if (headers.control === `up-to-date`) {\n if (typeof headers.global_last_seen_lsn !== `string`) {\n throw new Error(`global_last_seen_lsn is not a number`);\n }\n __privateGet(this, _completeLsns)[shape] = bigIntMax([\n __privateGet(this, _completeLsns)[shape],\n BigInt(headers.global_last_seen_lsn)\n ]);\n }\n }\n });\n};\nvar TransactionalMultiShapeStream = _TransactionalMultiShapeStream;\nexport {\n MultiShapeStream,\n TransactionalMultiShapeStream,\n matchBy,\n matchStream\n};\n//# sourceMappingURL=index.mjs.map",
64
+ "import{isChangeMessage as se,isControlMessage as ae}from\"@electric-sql/client\";import{MultiShapeStream as oe}from\"@electric-sql/experimental\";var ne=\"subscriptions_metadata\";async function Y({pg:n,metadataSchema:o,subscriptionKey:e}){let a=await n.query(`\n SELECT key, shape_metadata, last_lsn\n FROM ${B(o)}\n WHERE key = $1\n `,[e]);if(a.rows.length===0)return null;if(a.rows.length>1)throw new Error(`Multiple subscriptions found for key: ${e}`);let p=a.rows[0];if(typeof p.last_lsn==\"string\")return{...p,last_lsn:BigInt(p.last_lsn)};throw new Error(`Invalid last_lsn type: ${typeof p.last_lsn}`)}async function V({pg:n,metadataSchema:o,subscriptionKey:e,shapeMetadata:a,lastLsn:p,debug:b}){b&&console.log(\"updating subscription state\",e,a,p),await n.query(`\n INSERT INTO ${B(o)}\n (key, shape_metadata, last_lsn)\n VALUES\n ($1, $2, $3)\n ON CONFLICT(key)\n DO UPDATE SET\n shape_metadata = EXCLUDED.shape_metadata,\n last_lsn = EXCLUDED.last_lsn;\n `,[e,a,p.toString()])}async function J({pg:n,metadataSchema:o,subscriptionKey:e}){await n.query(`DELETE FROM ${B(o)} WHERE key = $1`,[e])}async function z({pg:n,metadataSchema:o}){await n.exec(`\n SET ${o}.syncing = false;\n CREATE SCHEMA IF NOT EXISTS \"${o}\";\n CREATE TABLE IF NOT EXISTS ${B(o)} (\n key TEXT PRIMARY KEY,\n shape_metadata JSONB NOT NULL,\n last_lsn TEXT NOT NULL\n );\n `)}function B(n){return`\"${n}\".\"${ne}\"`}async function Q({pg:n,table:o,schema:e=\"public\",message:a,mapColumns:p,primaryKey:b,debug:m}){let u=p?U(p,a):a.value;switch(a.headers.operation){case\"insert\":{m&&console.log(\"inserting\",u);let f=Object.keys(u);return await n.query(`\n INSERT INTO \"${e}\".\"${o}\"\n (${f.map(s=>'\"'+s+'\"').join(\", \")})\n VALUES\n (${f.map((s,y)=>\"$\"+(y+1)).join(\", \")})\n `,f.map(s=>u[s]))}case\"update\":{m&&console.log(\"updating\",u);let f=Object.keys(u).filter(s=>!b.includes(s));return f.length===0?void 0:await n.query(`\n UPDATE \"${e}\".\"${o}\"\n SET ${f.map((s,y)=>'\"'+s+'\" = $'+(y+1)).join(\", \")}\n WHERE ${b.map((s,y)=>'\"'+s+'\" = $'+(f.length+y+1)).join(\" AND \")}\n `,[...f.map(s=>u[s]),...b.map(s=>u[s])])}case\"delete\":return m&&console.log(\"deleting\",u),await n.query(`\n DELETE FROM \"${e}\".\"${o}\"\n WHERE ${b.map((f,s)=>'\"'+f+'\" = $'+(s+1)).join(\" AND \")}\n `,[...b.map(f=>u[f])])}}async function G({pg:n,table:o,schema:e=\"public\",messages:a,mapColumns:p,debug:b}){let m=a.map(t=>p?U(p,t):t.value);b&&console.log(\"inserting\",m);let u=Object.keys(m[0]),f=t=>{if(t===null)return 0;if(t instanceof ArrayBuffer)return t.byteLength;if(t instanceof Blob)return t.size;if(t instanceof Uint8Array||t instanceof DataView||ArrayBuffer.isView(t))return t.byteLength;switch(typeof t){case\"string\":return t.length;case\"number\":return 8;case\"boolean\":return 1;default:return t instanceof Date?8:t?.toString()?.length||0}},s=t=>u.reduce((d,_)=>{let g=t[_];if(g===null)return d;if(Array.isArray(g)){if(g.length===0)return d;let w=g[0];switch(typeof w){case\"number\":return d+g.length*8;case\"string\":return d+g.reduce((P,$)=>P+$.length,0);case\"boolean\":return d+g.length;default:return w instanceof Date?d+g.length*8:d+g.reduce((P,$)=>P+f($),0)}}return d+f(g)},0),y=32e3,I=50*1024*1024,O=async t=>{let d=`\n INSERT INTO \"${e}\".\"${o}\"\n (${u.map(g=>`\"${g}\"`).join(\", \")})\n VALUES\n ${t.map((g,w)=>`(${u.map((P,$)=>\"$\"+(w*u.length+$+1)).join(\", \")})`).join(\", \")}\n `,_=t.flatMap(g=>u.map(w=>g[w]));await n.query(d,_)},r=[],h=0,N=0;for(let t=0;t<m.length;t++){let d=m[t],_=s(d),g=u.length;r.length>0&&(h+_>I||N+g>y)&&(b&&h+_>I&&console.log(\"batch size limit exceeded, executing batch\"),b&&N+g>y&&console.log(\"batch params limit exceeded, executing batch\"),await O(r),r=[],h=0,N=0),r.push(d),h+=_,N+=g}r.length>0&&await O(r),b&&console.log(`Inserted ${a.length} rows using INSERT`)}async function Z({pg:n,table:o,schema:e=\"public\",messages:a,mapColumns:p,debug:b}){b&&console.log(\"applying messages with json_to_recordset\");let m=a.map(s=>p?U(p,s):s.value),u=(await n.query(`\n SELECT column_name, udt_name, data_type\n FROM information_schema.columns\n WHERE table_name = $1 AND table_schema = $2\n `,[o,e])).rows.filter(s=>Object.prototype.hasOwnProperty.call(m[0],s.column_name)),f=1e4;for(let s=0;s<m.length;s+=f){let y=m.slice(s,s+f);await n.query(`\n INSERT INTO \"${e}\".\"${o}\"\n SELECT x.* from json_to_recordset($1) as x(${u.map(I=>`${I.column_name} ${I.udt_name.replace(/^_/,\"\")}`+(I.data_type===\"ARRAY\"?\"[]\":\"\")).join(\", \")})\n `,[y])}b&&console.log(`Inserted ${a.length} rows using json_to_recordset`)}async function F({pg:n,table:o,schema:e=\"public\",messages:a,mapColumns:p,debug:b}){b&&console.log(\"applying messages with COPY\");let m=a.map(y=>p?U(p,y):y.value),u=Object.keys(m[0]),f=m.map(y=>u.map(I=>{let O=y[I];return typeof O==\"string\"&&(O.includes(\",\")||O.includes('\"')||O.includes(`\n`))?`\"${O.replace(/\"/g,'\"\"')}\"`:O===null?\"\\\\N\":O}).join(\",\")).join(`\n`),s=new Blob([f],{type:\"text/csv\"});await n.query(`\n COPY \"${e}\".\"${o}\" (${u.map(y=>`\"${y}\"`).join(\", \")})\n FROM '/dev/blob'\n WITH (FORMAT csv, NULL '\\\\N')\n `,[],{blob:s}),b&&console.log(`Inserted ${a.length} rows using COPY`)}function U(n,o){if(typeof n==\"function\")return n(o);let e={};for(let[a,p]of Object.entries(n))e[a]=o.value[p];return e}async function re(n,o){let e=o?.debug??!1,a=o?.metadataSchema??\"electric\",p=[],b=new Map,m=!1,u=async()=>{m||(m=!0,await z({pg:n,metadataSchema:a}))},f=async({key:r,shapes:h,useCopy:N=!1,initialInsertMethod:t=\"insert\",onInitialSync:d,onError:_})=>{let g=!1;await u(),Object.values(h).filter(i=>!i.onMustRefetch).forEach(i=>{if(b.has(i.table))throw new Error(\"Already syncing shape for table \"+i.table);b.set(i.table)});let w=null;r!==null&&(w=await Y({pg:n,metadataSchema:a,subscriptionKey:r}),e&&w&&console.log(\"resuming from subscription state\",w));let P=w===null;N&&t===\"insert\"&&(t=\"csv\",console.warn(\"The useCopy option is deprecated and will be removed in a future version. Use initialInsertMethod instead.\"));let $=!P||t===\"insert\",K=!1,v=new Map(Object.keys(h).map(i=>[i,new Map])),k=new Map(Object.keys(h).map(i=>[i,BigInt(-1)])),x=new Set,W=w?.last_lsn??BigInt(-1),D=new AbortController;Object.values(h).filter(i=>!!i.shape.signal).forEach(i=>{i.shape.signal.addEventListener(\"abort\",()=>D.abort(),{once:!0})});let R=new oe({shapes:Object.fromEntries(Object.entries(h).map(([i,L])=>{let S=w?.shape_metadata[i];return[i,{...L.shape,...S?{offset:S.offset,handle:S.handle}:{},signal:D.signal}]}))}),ee={json:Z,csv:F,useCopy:F,insert:G},te=async i=>{let L=new Map(Object.keys(h).map(S=>[S,[]]));for(let[S,M]of v.entries()){let c=L.get(S);for(let l of M.keys())if(l<=i){for(let T of M.get(l))c.push(T);M.delete(l)}}await n.transaction(async S=>{e&&console.time(\"commit\"),await S.exec(`SET LOCAL ${a}.syncing = true;`);for(let[M,c]of L.entries()){let l=h[M],T=c;if(x.has(M)){if(e&&console.log(\"truncating table\",l.table),l.onMustRefetch)await l.onMustRefetch(S);else{let E=l.schema||\"public\";await S.exec(`DELETE FROM \"${E}\".\"${l.table}\";`)}x.delete(M)}if(!$){let E=[],A=[],H=!1;for(let q of T)!H&&q.headers.operation===\"insert\"?E.push(q):(H=!0,A.push(q));E.length>0&&t===\"csv\"&&A.unshift(E.pop()),T=A,E.length>0&&(await ee[t]({pg:S,table:l.table,schema:l.schema,messages:E,mapColumns:l.mapColumns,debug:e}),$=!0)}let C=[],j=null,X=T.length;for(let E=0;E<X;E++){let A=T[E];A.headers.operation===\"insert\"?C.push(A):j=A,(j||E===X-1)&&(C.length>0&&(await G({pg:S,table:l.table,schema:l.schema,messages:C,mapColumns:l.mapColumns,debug:e}),C.length=0),j&&(await Q({pg:S,table:l.table,schema:l.schema,message:j,mapColumns:l.mapColumns,primaryKey:l.primaryKey,debug:e}),j=null))}}r&&await V({pg:S,metadataSchema:a,subscriptionKey:r,shapeMetadata:Object.fromEntries(Object.keys(h).map(M=>[M,{handle:R.shapes[M].shapeHandle,offset:R.shapes[M].lastOffset}])),lastLsn:i,debug:e}),g&&await S.rollback()}),e&&console.timeEnd(\"commit\"),d&&!K&&R.isUpToDate&&(d(),K=!0)};return R.subscribe(async i=>{if(g)return;e&&console.log(\"received messages\",i.length),i.forEach(c=>{let l=k.get(c.shape)??BigInt(-1);if(se(c)){let T=v.get(c.shape),C=typeof c.headers.lsn==\"string\"?BigInt(c.headers.lsn):BigInt(0);if(C<=l)return;let j=c.headers.last??!1;T.has(C)||T.set(C,[]),T.get(C).push(c),j&&k.set(c.shape,C)}else if(ae(c))switch(c.headers.control){case\"up-to-date\":{if(e&&console.log(\"received up-to-date\",c),typeof c.headers.global_last_seen_lsn!=\"string\")throw new Error(\"global_last_seen_lsn is not a string\");let T=BigInt(c.headers.global_last_seen_lsn);if(T<=l)return;k.set(c.shape,T);break}case\"must-refetch\":{e&&console.log(\"received must-refetch\",c),v.get(c.shape).clear(),k.set(c.shape,BigInt(-1)),x.add(c.shape);break}}});let L=Array.from(k.values()).reduce((c,l)=>l<c?l:c),S=L>W,M=L>=W&&x.size>0;(S||M)&&(te(L),await new Promise(c=>setTimeout(c)))},_),p.push({stream:R,aborter:D}),{unsubscribe:()=>{e&&console.log(\"unsubscribing\"),g=!0,R.unsubscribeAll(),D.abort();for(let i of Object.values(h))b.delete(i.table)},get isUpToDate(){return R.isUpToDate},streams:Object.fromEntries(Object.keys(h).map(i=>[i,R.shapes[i]]))}};return{namespaceObj:{initMetadataTables:u,syncShapesToTables:f,syncShapeToTable:async r=>{let h=await f({shapes:{shape:{shape:r.shape,table:r.table,schema:r.schema,mapColumns:r.mapColumns,primaryKey:r.primaryKey,onMustRefetch:r.onMustRefetch}},key:r.shapeKey,useCopy:r.useCopy,initialInsertMethod:r.initialInsertMethod,onInitialSync:r.onInitialSync,onError:r.onError});return{unsubscribe:h.unsubscribe,get isUpToDate(){return h.isUpToDate},stream:h.streams.shape}},deleteSubscription:async r=>{await J({pg:n,metadataSchema:a,subscriptionKey:r})}},close:async()=>{for(let{stream:r,aborter:h}of p)r.unsubscribeAll(),h.abort()}}}function ye(n){return{name:\"Postgres Sync\",setup:async o=>{let{namespaceObj:e,close:a}=await re(o,n);return{namespaceObj:e,close:a}}}}export{ye as electricSync};\n//# sourceMappingURL=index.js.map",
65
+ "/**\n * WriteBackService — implements Electric's Pattern 1 (Online Writes).\n *\n * When an agent writes to its local PGlite, this service asynchronously\n * forwards the write to the cloud API, which inserts it into the central\n * Postgres. Electric then syncs the confirmed row back to PGlite via the\n * existing syncShapesToTables read path, completing the round-trip.\n *\n * Writes are fire-and-forget — the agent never blocks on the HTTP POST.\n * A small in-memory queue batches writes that arrive while a flush is\n * in-flight, avoiding duplicate concurrent POSTs. Writes that fail are\n * retried up to MAX_RETRIES times, then dropped with a warning log.\n *\n * Configured via:\n * ELIZA_CLOUD_WRITE_BASE_URL — base URL of the cloud API, e.g.\n * https://api.elizacloud.ai. The agentId is appended at runtime:\n * {base}/api/v1/eliza/agents/{agentId}/write\n * ELIZA_CLOUD_SERVICE_KEY — X-Service-Key value (WAIFU_SERVICE_KEY)\n *\n * If neither env var is set, the service is a no-op.\n */\n\nimport { logger } from \"@elizaos/core\";\n\nconst MAX_BATCH = 100;\nconst FLUSH_DEBOUNCE_MS = 200;\nconst MAX_RETRIES = 5;\n\ninterface PendingWrite {\n table: string;\n operation: \"insert\" | \"upsert\" | \"delete\";\n row: Record<string, unknown>;\n writeId: string;\n retries: number;\n}\n\nexport interface WriteBackOptions {\n /** Base URL of the cloud API. AgentId is appended at runtime. */\n writeBaseUrl?: string | null;\n /** Agent UUID for constructing the write endpoint URL. */\n agentId?: string | null;\n /** X-Service-Key value for authentication. */\n serviceKey?: string | null;\n}\n\nfunction buildWriteUrl(baseUrl: string, agentId: string): string {\n const base = baseUrl.replace(/\\/+$/, \"\");\n return `${base}/api/v1/eliza/agents/${agentId}/write`;\n}\n\nexport class WriteBackService {\n private writeUrl: string | null;\n private serviceKey: string | null;\n private queue: PendingWrite[] = [];\n private flushing = false;\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n /** Incrementing counter ensures unique writeIds even without crypto. */\n private writeCounter = 0;\n\n constructor(opts: WriteBackOptions = {}) {\n const baseUrl = opts.writeBaseUrl ?? process.env.ELIZA_CLOUD_WRITE_BASE_URL ?? null;\n const key = opts.serviceKey ?? process.env.ELIZA_CLOUD_SERVICE_KEY ?? null;\n const agentId = opts.agentId ?? process.env.AGENT_ID ?? null;\n\n if (baseUrl && agentId && key) {\n this.writeUrl = buildWriteUrl(baseUrl, agentId);\n this.serviceKey = key;\n } else {\n this.writeUrl = null;\n this.serviceKey = null;\n }\n }\n\n /** Whether the service is configured and active. */\n get enabled(): boolean {\n return !!this.writeUrl && !!this.serviceKey;\n }\n\n /**\n * Enqueue a write to be forwarded to the cloud API.\n * Returns immediately; the write is flushed asynchronously.\n */\n enqueue(\n table: string,\n operation: \"insert\" | \"upsert\" | \"delete\",\n row: Record<string, unknown>\n ): void {\n if (!this.enabled) return;\n\n this.writeCounter++;\n const writeId = `${Date.now()}-${this.writeCounter}`;\n\n this.queue.push({ table, operation, row, writeId, retries: 0 });\n\n if (this.queue.length >= MAX_BATCH) {\n this.scheduleFlush(0);\n } else {\n this.scheduleFlush(FLUSH_DEBOUNCE_MS);\n }\n }\n\n /**\n * Flush all pending writes synchronously. Waits for any in-progress\n * drain to complete, then picks up any remaining items.\n * Used during shutdown to drain the queue before the agent exits.\n */\n async flush(): Promise<void> {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n // Wait for in-progress drain, then drain any stragglers.\n while (this.queue.length > 0) {\n if (!this.flushing) {\n await this.drainQueue();\n }\n // Brief yield to let an in-progress drain complete.\n await new Promise((r) => setTimeout(r, 10));\n }\n // One final drain in case items were added during the yield.\n if (!this.flushing) {\n await this.drainQueue();\n }\n }\n\n private scheduleFlush(delayMs: number): void {\n if (this.flushTimer) return;\n this.flushTimer = setTimeout(() => {\n this.flushTimer = null;\n this.drainQueue().catch(() => {\n // Errors logged inside drainQueue / sendBatch.\n });\n }, delayMs);\n }\n\n private async drainQueue(): Promise<void> {\n if (this.flushing) return;\n if (this.queue.length === 0) return;\n if (!this.enabled) {\n this.queue = [];\n return;\n }\n\n this.flushing = true;\n\n try {\n while (this.queue.length > 0) {\n const batch = this.queue.splice(0, MAX_BATCH);\n await this.sendBatch(batch);\n }\n } finally {\n this.flushing = false;\n if (this.queue.length > 0) {\n this.scheduleFlush(0);\n }\n }\n }\n\n private async sendBatch(batch: PendingWrite[]): Promise<void> {\n // Guard: only called from drainQueue which checks this.enabled, but\n // this avoids the non-null assertions that Biome flags.\n if (!this.writeUrl || !this.serviceKey) {\n logger.warn(\n { src: \"plugin:sql\" },\n \"WriteBackService: sendBatch called while not configured — dropping batch\"\n );\n return;\n }\n\n try {\n const response = await fetch(this.writeUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Service-Key\": this.serviceKey,\n },\n body: JSON.stringify({ writes: batch }),\n signal: AbortSignal.timeout(30_000),\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n logger.warn(\n { src: \"plugin:sql\", status: response.status },\n `WriteBackService: cloud API returned ${response.status}: ${text.slice(0, 200)}`\n );\n this.requeueOrDrop(batch);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n logger.warn(\n { src: \"plugin:sql\", error: msg },\n \"WriteBackService: failed to send write batch — retrying\"\n );\n this.requeueOrDrop(batch);\n }\n }\n\n private requeueOrDrop(batch: PendingWrite[]): void {\n const toRetry: PendingWrite[] = [];\n for (const write of batch) {\n write.retries++;\n if (write.retries <= MAX_RETRIES) {\n toRetry.push(write);\n } else {\n logger.warn(\n {\n src: \"plugin:sql\",\n table: write.table,\n writeId: write.writeId,\n retries: write.retries,\n },\n \"WriteBackService: dropping write after max retries\"\n );\n }\n }\n if (toRetry.length > 0) {\n // Re-queue at the front so older writes retry first.\n this.queue.unshift(...toRetry);\n }\n }\n}\n",
66
+ "export const PGLITE_ERROR_CODES = {\n ACTIVE_LOCK: \"ELIZA_PGLITE_DATA_DIR_IN_USE\",\n CORRUPT_DATA: \"ELIZA_PGLITE_CORRUPT_DATA\",\n MANUAL_RESET_REQUIRED: \"ELIZA_PGLITE_MANUAL_RESET_REQUIRED\",\n} as const;\n\nexport type PgliteErrorCode = (typeof PGLITE_ERROR_CODES)[keyof typeof PGLITE_ERROR_CODES];\n\nexport class PgliteInitError extends Error {\n public readonly code: PgliteErrorCode;\n public readonly dataDir?: string;\n\n constructor(\n code: PgliteErrorCode,\n message: string,\n options?: { cause?: unknown; dataDir?: string }\n ) {\n super(message, { cause: options?.cause });\n this.name = \"PgliteInitError\";\n this.code = code;\n this.dataDir = options?.dataDir;\n }\n}\n\nexport function createPgliteInitError(\n code: PgliteErrorCode,\n message: string,\n options?: { cause?: unknown; dataDir?: string }\n): PgliteInitError {\n return new PgliteInitError(code, message, options);\n}\n\nexport function getPgliteErrorCode(err: unknown): PgliteErrorCode | null {\n const seen = new Set<unknown>();\n let current: unknown = err;\n\n while (current && !seen.has(current)) {\n seen.add(current);\n if (\n typeof current === \"object\" &&\n current !== null &&\n \"code\" in current &&\n typeof (current as { code?: unknown }).code === \"string\"\n ) {\n const code = (current as { code: string }).code;\n if (\n code === PGLITE_ERROR_CODES.ACTIVE_LOCK ||\n code === PGLITE_ERROR_CODES.CORRUPT_DATA ||\n code === PGLITE_ERROR_CODES.MANUAL_RESET_REQUIRED\n ) {\n return code;\n }\n }\n\n if (current instanceof Error) {\n current = (current as Error & { cause?: unknown }).cause;\n continue;\n }\n\n if (typeof current === \"object\" && current !== null && \"cause\" in current) {\n current = (current as { cause?: unknown }).cause;\n continue;\n }\n\n break;\n }\n\n return null;\n}\n\nexport function isFatalPgliteErrorCode(code: unknown): code is PgliteErrorCode {\n return (\n code === PGLITE_ERROR_CODES.ACTIVE_LOCK ||\n code === PGLITE_ERROR_CODES.CORRUPT_DATA ||\n code === PGLITE_ERROR_CODES.MANUAL_RESET_REQUIRED\n );\n}\n",
67
+ "import {\n ChannelType,\n type IAgentRuntime,\n type JsonValue,\n type Memory,\n type MemoryMetadata,\n type MemoryStorageProvider,\n type Room,\n Service,\n type ServiceTypeName,\n type UUID,\n type World,\n} from \"@elizaos/core\";\nimport { stringToUuid } from \"../utils/string-to-uuid\";\n\n/** Plugin-registered service; widen core ServiceTypeName for dynamic keys. */\nconst ENTITY_RESOLUTION_SERVICE = \"entity_resolution\" as ServiceTypeName;\n\ntype LongTermMemoryRecord = Awaited<ReturnType<MemoryStorageProvider[\"storeLongTermMemory\"]>>;\ntype LongTermMemoryInput = Parameters<MemoryStorageProvider[\"storeLongTermMemory\"]>[0];\ntype LongTermMemoryCategory = LongTermMemoryRecord[\"category\"];\ntype SessionSummaryRecord = Awaited<ReturnType<MemoryStorageProvider[\"storeSessionSummary\"]>>;\ntype SessionSummaryInput = Parameters<MemoryStorageProvider[\"storeSessionSummary\"]>[0];\ntype UnknownRecord = Record<string, unknown>;\ntype JsonRecord = Record<string, JsonValue>;\n\ntype EntityLink = {\n entityA: UUID;\n entityB: UUID;\n status?: string;\n};\n\ntype EntityResolutionService = {\n getConfirmedLinks: (entityId: UUID) => Promise<EntityLink[]>;\n};\n\nfunction isEntityResolutionService(service: unknown): service is EntityResolutionService {\n return (\n typeof service === \"object\" &&\n service !== null &&\n typeof (service as { getConfirmedLinks?: unknown }).getConfirmedLinks === \"function\"\n );\n}\n\ntype AdvancedMemoryEnvelope = {\n kind: \"long_term_memory\" | \"session_summary\";\n originalEntityId?: UUID;\n anchorEntityId?: UUID;\n category?: LongTermMemoryCategory;\n confidence?: number;\n source?: string;\n semanticMetadata?: JsonRecord;\n messageCount?: number;\n lastMessageOffset?: number;\n startTime?: string;\n endTime?: string;\n topics?: string[];\n summaryMetadata?: JsonRecord;\n updatedAt?: string;\n lastAccessedAt?: string;\n accessCount?: number;\n};\n\nconst LONG_TERM_MEMORY_TABLE = \"long_term_memories\";\nconst SESSION_SUMMARY_TABLE = \"session_summaries\";\nconst ADVANCED_MEMORY_SOURCE = \"advanced-memory\";\n\nfunction isRecord(value: unknown): value is UnknownRecord {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction asRecord(value: unknown): UnknownRecord | null {\n return isRecord(value) ? value : null;\n}\n\nfunction toJsonValue(value: unknown): JsonValue | undefined {\n if (value === null) return null;\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"boolean\") {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value\n .map((entry) => toJsonValue(entry))\n .filter((entry): entry is JsonValue => entry !== undefined);\n }\n\n if (isRecord(value)) {\n const entries = Object.entries(value)\n .map(([key, entry]) => {\n const jsonValue = toJsonValue(entry);\n return jsonValue === undefined ? null : ([key, jsonValue] as const);\n })\n .filter((entry): entry is readonly [string, JsonValue] => entry !== null);\n return Object.fromEntries(entries) as JsonRecord;\n }\n\n return undefined;\n}\n\nfunction toJsonRecord(value: unknown): JsonRecord | undefined {\n const jsonValue = toJsonValue(value);\n return isRecord(jsonValue) ? (jsonValue as JsonRecord) : undefined;\n}\n\nfunction buildCustomMemoryMetadata(params: {\n scope: \"shared\" | \"room\";\n timestamp: number;\n source?: string;\n advancedMemory: JsonRecord;\n existing?: UnknownRecord | null;\n}): MemoryMetadata {\n const metadata: MemoryMetadata = {\n ...(params.existing ?? {}),\n type: \"custom\",\n scope: params.scope,\n timestamp: params.timestamp,\n advancedMemory: params.advancedMemory,\n };\n\n if (params.source) {\n metadata.source = params.source;\n }\n\n return metadata;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nfunction asNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction asStringArray(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const values = value.filter((entry): entry is string => typeof entry === \"string\");\n return values.length > 0 ? values : undefined;\n}\n\nfunction toDate(value: unknown, fallback?: Date): Date {\n if (value instanceof Date && Number.isFinite(value.getTime())) {\n return value;\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n const parsed = new Date(value);\n if (Number.isFinite(parsed.getTime())) return parsed;\n }\n if (typeof value === \"string\" && value.trim().length > 0) {\n const parsed = new Date(value);\n if (Number.isFinite(parsed.getTime())) return parsed;\n }\n return fallback ?? new Date();\n}\n\nfunction getMemoryText(memory: Memory): string {\n return typeof memory.content.text === \"string\" ? memory.content.text : \"\";\n}\n\nfunction getAdvancedMemoryEnvelope(memory: Memory): AdvancedMemoryEnvelope | null {\n const metadata = asRecord(memory.metadata);\n const advancedMemory = asRecord(metadata?.advancedMemory);\n if (!advancedMemory) {\n return null;\n }\n const kind = asString(advancedMemory.kind);\n if (kind !== \"long_term_memory\" && kind !== \"session_summary\") {\n return null;\n }\n\n return {\n kind,\n originalEntityId: asString(advancedMemory.originalEntityId) as UUID | undefined,\n anchorEntityId: asString(advancedMemory.anchorEntityId) as UUID | undefined,\n category: asString(advancedMemory.category) as LongTermMemoryCategory | undefined,\n confidence: asNumber(advancedMemory.confidence),\n source: asString(advancedMemory.source),\n semanticMetadata: toJsonRecord(advancedMemory.semanticMetadata),\n messageCount: asNumber(advancedMemory.messageCount),\n lastMessageOffset: asNumber(advancedMemory.lastMessageOffset),\n startTime: asString(advancedMemory.startTime),\n endTime: asString(advancedMemory.endTime),\n topics: asStringArray(advancedMemory.topics),\n summaryMetadata: toJsonRecord(advancedMemory.summaryMetadata),\n updatedAt: asString(advancedMemory.updatedAt),\n lastAccessedAt: asString(advancedMemory.lastAccessedAt),\n accessCount: asNumber(advancedMemory.accessCount),\n };\n}\n\nexport class AdvancedMemoryStorageService extends Service implements MemoryStorageProvider {\n static serviceType = \"memoryStorage\" as const;\n\n capabilityDescription = \"Persistent advanced-memory storage backed by SQL memory tables\";\n\n static async start(runtime: IAgentRuntime): Promise<Service> {\n const service = new AdvancedMemoryStorageService();\n await service.initialize(runtime);\n return service;\n }\n\n async initialize(runtime: IAgentRuntime): Promise<void> {\n this.runtime = runtime;\n }\n\n async stop(): Promise<void> {}\n\n private getMemoryWorldId(): UUID {\n return stringToUuid(`advanced-memory:world:${this.runtime.agentId}`);\n }\n\n private getLongTermRoomId(entityId: UUID): UUID {\n return stringToUuid(`advanced-memory:long-term:${this.runtime.agentId}:${entityId}`);\n }\n\n private async ensureMemoryWorld(): Promise<UUID> {\n const worldId = this.getMemoryWorldId();\n const world: World = {\n id: worldId,\n agentId: this.runtime.agentId,\n name: \"Advanced Memory\",\n metadata: {\n purpose: ADVANCED_MEMORY_SOURCE,\n },\n createdAt: new Date(),\n } as World & { createdAt: Date };\n await this.runtime.ensureWorldExists(world);\n return worldId;\n }\n\n private async ensureLongTermRoom(entityId: UUID, worldId: UUID): Promise<UUID> {\n const roomId = this.getLongTermRoomId(entityId);\n const room: Room = {\n id: roomId,\n agentId: this.runtime.agentId,\n worldId,\n source: ADVANCED_MEMORY_SOURCE,\n type: ChannelType.SELF,\n name: `Advanced Memory ${entityId.slice(0, 8)}`,\n metadata: {\n purpose: \"long_term_memory\",\n entityId,\n },\n createdAt: new Date(),\n } as Room & { createdAt: Date };\n await this.runtime.ensureRoomExists(room);\n return roomId;\n }\n\n private async getEntityResolutionService(): Promise<EntityResolutionService | null> {\n const existing = this.runtime.getService(ENTITY_RESOLUTION_SERVICE);\n if (isEntityResolutionService(existing)) {\n return existing;\n }\n if (!this.runtime.hasService(ENTITY_RESOLUTION_SERVICE)) {\n return null;\n }\n try {\n const loaded = await this.runtime.getServiceLoadPromise(ENTITY_RESOLUTION_SERVICE);\n return isEntityResolutionService(loaded) ? loaded : null;\n } catch {\n return null;\n }\n }\n\n private async getIdentityGroup(entityId: UUID): Promise<Set<UUID>> {\n const resolution = await this.getEntityResolutionService();\n if (!resolution) {\n return new Set<UUID>([entityId]);\n }\n\n const group = new Set<UUID>([entityId]);\n const queue: UUID[] = [entityId];\n\n while (queue.length > 0) {\n const current = queue.shift() as UUID;\n const links = await resolution.getConfirmedLinks(current);\n for (const link of links) {\n const other = link.entityA === current ? link.entityB : link.entityA;\n if (!group.has(other)) {\n group.add(other);\n queue.push(other);\n }\n }\n }\n\n return group;\n }\n\n private async getAnchorEntityId(entityId: UUID): Promise<UUID> {\n const group = await this.getIdentityGroup(entityId);\n return Array.from(group).sort()[0] as UUID;\n }\n\n private parseLongTermMemory(memory: Memory): LongTermMemoryRecord | null {\n const envelope = getAdvancedMemoryEnvelope(memory);\n if (envelope?.kind !== \"long_term_memory\" || !memory.id || !memory.agentId) {\n return null;\n }\n\n return {\n id: memory.id,\n agentId: memory.agentId,\n entityId: envelope.originalEntityId ?? envelope.anchorEntityId ?? (memory.entityId as UUID),\n category: (envelope.category ?? \"semantic\") as LongTermMemoryCategory,\n content: getMemoryText(memory),\n metadata: envelope.semanticMetadata,\n embedding: Array.isArray(memory.embedding) ? memory.embedding : undefined,\n confidence: envelope.confidence,\n source: envelope.source,\n createdAt: toDate(memory.createdAt),\n updatedAt: toDate(envelope.updatedAt, toDate(memory.createdAt)),\n lastAccessedAt: envelope.lastAccessedAt ? toDate(envelope.lastAccessedAt) : undefined,\n accessCount: envelope.accessCount ?? 0,\n };\n }\n\n private parseSessionSummary(memory: Memory): SessionSummaryRecord | null {\n const envelope = getAdvancedMemoryEnvelope(memory);\n if (envelope?.kind !== \"session_summary\" || !memory.id || !memory.agentId || !memory.roomId) {\n return null;\n }\n\n return {\n id: memory.id,\n agentId: memory.agentId,\n roomId: memory.roomId,\n entityId: envelope.originalEntityId ?? (memory.entityId as UUID | undefined),\n summary: getMemoryText(memory),\n messageCount: envelope.messageCount ?? 0,\n lastMessageOffset: envelope.lastMessageOffset ?? 0,\n startTime: toDate(envelope.startTime, toDate(memory.createdAt)),\n endTime: toDate(envelope.endTime, toDate(memory.createdAt)),\n topics: envelope.topics,\n metadata: envelope.summaryMetadata,\n embedding: Array.isArray(memory.embedding) ? memory.embedding : undefined,\n createdAt: toDate(memory.createdAt),\n updatedAt: toDate(envelope.updatedAt, toDate(memory.createdAt)),\n };\n }\n\n private sortLongTermMemories(memories: LongTermMemoryRecord[]): LongTermMemoryRecord[] {\n return [...memories].sort((left, right) => {\n const leftUpdated = left.updatedAt.getTime();\n const rightUpdated = right.updatedAt.getTime();\n if (rightUpdated !== leftUpdated) {\n return rightUpdated - leftUpdated;\n }\n const leftConfidence = left.confidence ?? 0;\n const rightConfidence = right.confidence ?? 0;\n if (rightConfidence !== leftConfidence) {\n return rightConfidence - leftConfidence;\n }\n return right.createdAt.getTime() - left.createdAt.getTime();\n });\n }\n\n private sortSessionSummaries(summaries: SessionSummaryRecord[]): SessionSummaryRecord[] {\n return [...summaries].sort((left, right) => {\n const leftUpdated = left.updatedAt.getTime();\n const rightUpdated = right.updatedAt.getTime();\n if (rightUpdated !== leftUpdated) {\n return rightUpdated - leftUpdated;\n }\n return right.createdAt.getTime() - left.createdAt.getTime();\n });\n }\n\n async storeLongTermMemory(memory: LongTermMemoryInput): Promise<LongTermMemoryRecord> {\n const now = new Date();\n const anchorEntityId = await this.getAnchorEntityId(memory.entityId);\n const worldId = await this.ensureMemoryWorld();\n const roomId = await this.ensureLongTermRoom(anchorEntityId, worldId);\n const advancedMemory = toJsonRecord({\n kind: \"long_term_memory\",\n originalEntityId: memory.entityId,\n anchorEntityId,\n category: memory.category,\n confidence: memory.confidence,\n source: memory.source,\n semanticMetadata: memory.metadata,\n updatedAt: now.toISOString(),\n accessCount: 0,\n });\n if (!advancedMemory) {\n throw new Error(\"Long-term memory metadata is not JSON-serializable\");\n }\n const id = await this.runtime.createMemory(\n {\n agentId: this.runtime.agentId,\n entityId: anchorEntityId,\n roomId,\n worldId,\n content: { text: memory.content },\n metadata: buildCustomMemoryMetadata({\n scope: \"shared\",\n timestamp: now.getTime(),\n source: memory.source,\n advancedMemory,\n }),\n embedding: memory.embedding,\n createdAt: now.getTime(),\n unique: false,\n },\n LONG_TERM_MEMORY_TABLE,\n false\n );\n\n const stored = await this.runtime.getMemoryById(id);\n const parsed = stored ? this.parseLongTermMemory(stored) : null;\n if (!parsed) {\n throw new Error(\"Failed to persist long-term memory\");\n }\n return parsed;\n }\n\n async getLongTermMemories(\n agentId: UUID,\n entityId: UUID,\n opts?: { category?: LongTermMemoryCategory; limit?: number }\n ): Promise<LongTermMemoryRecord[]> {\n const group = await this.getIdentityGroup(entityId);\n const roomIds = Array.from(group).map((memberEntityId) =>\n this.getLongTermRoomId(memberEntityId)\n );\n if (roomIds.length === 0) {\n return [];\n }\n\n const memories = await this.runtime.getMemoriesByRoomIds({\n tableName: LONG_TERM_MEMORY_TABLE,\n roomIds,\n limit: Math.max((opts?.limit ?? 20) * roomIds.length * 4, 80),\n });\n\n const filtered = memories\n .filter((memory) => memory.agentId === agentId)\n .map((memory) => this.parseLongTermMemory(memory))\n .filter((memory): memory is LongTermMemoryRecord => memory !== null)\n .filter((memory) => (opts?.category ? memory.category === opts.category : true));\n\n return this.sortLongTermMemories(filtered).slice(0, opts?.limit ?? 20);\n }\n\n async updateLongTermMemory(\n id: UUID,\n agentId: UUID,\n entityId: UUID,\n updates: Partial<Omit<LongTermMemoryRecord, \"id\" | \"agentId\" | \"entityId\" | \"createdAt\">>\n ): Promise<void> {\n const existing = await this.runtime.getMemoryById(id);\n const parsed = existing ? this.parseLongTermMemory(existing) : null;\n if (!existing || !parsed || existing.agentId !== agentId) {\n throw new Error(`Long-term memory ${id} not found`);\n }\n\n const allowedGroup = await this.getIdentityGroup(entityId);\n if (!allowedGroup.has(parsed.entityId)) {\n throw new Error(`Long-term memory ${id} does not belong to entity ${entityId}`);\n }\n\n const currentEnvelope = getAdvancedMemoryEnvelope(existing);\n const updatedAt = new Date();\n const advancedMemory = toJsonRecord({\n ...(currentEnvelope ?? {}),\n kind: \"long_term_memory\",\n originalEntityId: currentEnvelope?.originalEntityId ?? entityId,\n anchorEntityId: parsed.entityId,\n category: updates.category ?? parsed.category,\n confidence: updates.confidence ?? parsed.confidence,\n source: updates.source ?? parsed.source,\n semanticMetadata: updates.metadata ?? parsed.metadata,\n updatedAt: updatedAt.toISOString(),\n lastAccessedAt: updates.lastAccessedAt?.toISOString(),\n accessCount: updates.accessCount ?? parsed.accessCount ?? 0,\n });\n if (!advancedMemory) {\n throw new Error(\"Updated long-term memory metadata is not JSON-serializable\");\n }\n await this.runtime.updateMemory({\n id,\n content: {\n text: updates.content ?? parsed.content,\n },\n metadata: buildCustomMemoryMetadata({\n existing: asRecord(existing.metadata),\n scope: \"shared\",\n timestamp: updatedAt.getTime(),\n source: updates.source ?? parsed.source,\n advancedMemory,\n }),\n ...(updates.embedding ? { embedding: updates.embedding } : {}),\n });\n }\n\n async deleteLongTermMemory(id: UUID, agentId: UUID, entityId: UUID): Promise<void> {\n const existing = await this.runtime.getMemoryById(id);\n const parsed = existing ? this.parseLongTermMemory(existing) : null;\n if (!existing || !parsed || existing.agentId !== agentId) {\n throw new Error(`Long-term memory ${id} not found`);\n }\n const allowedGroup = await this.getIdentityGroup(entityId);\n if (!allowedGroup.has(parsed.entityId)) {\n throw new Error(`Long-term memory ${id} does not belong to entity ${entityId}`);\n }\n await this.runtime.deleteMemory(id);\n }\n\n async storeSessionSummary(summary: SessionSummaryInput): Promise<SessionSummaryRecord> {\n const now = new Date();\n const advancedMemory = toJsonRecord({\n kind: \"session_summary\",\n originalEntityId: summary.entityId,\n messageCount: summary.messageCount,\n lastMessageOffset: summary.lastMessageOffset,\n startTime: summary.startTime.toISOString(),\n endTime: summary.endTime.toISOString(),\n topics: summary.topics,\n summaryMetadata: summary.metadata,\n updatedAt: now.toISOString(),\n });\n if (!advancedMemory) {\n throw new Error(\"Session summary metadata is not JSON-serializable\");\n }\n const id = await this.runtime.createMemory(\n {\n agentId: this.runtime.agentId,\n entityId: summary.entityId ?? this.runtime.agentId,\n roomId: summary.roomId,\n worldId: this.getMemoryWorldId(),\n content: { text: summary.summary },\n metadata: buildCustomMemoryMetadata({\n scope: \"room\",\n timestamp: now.getTime(),\n advancedMemory,\n }),\n embedding: summary.embedding,\n createdAt: now.getTime(),\n unique: false,\n },\n SESSION_SUMMARY_TABLE,\n false\n );\n\n const stored = await this.runtime.getMemoryById(id);\n const parsed = stored ? this.parseSessionSummary(stored) : null;\n if (!parsed) {\n throw new Error(\"Failed to persist session summary\");\n }\n return parsed;\n }\n\n async getCurrentSessionSummary(\n agentId: UUID,\n roomId: UUID\n ): Promise<SessionSummaryRecord | null> {\n const summaries = await this.getSessionSummaries(agentId, roomId, 1);\n return summaries[0] ?? null;\n }\n\n async updateSessionSummary(\n id: UUID,\n agentId: UUID,\n roomId: UUID,\n updates: Partial<\n Omit<SessionSummaryRecord, \"id\" | \"agentId\" | \"roomId\" | \"createdAt\" | \"updatedAt\">\n >\n ): Promise<void> {\n const existing = await this.runtime.getMemoryById(id);\n const parsed = existing ? this.parseSessionSummary(existing) : null;\n if (!existing || !parsed || existing.agentId !== agentId || existing.roomId !== roomId) {\n throw new Error(`Session summary ${id} not found`);\n }\n\n const currentEnvelope = getAdvancedMemoryEnvelope(existing);\n const updatedAt = new Date();\n const advancedMemory = toJsonRecord({\n ...(currentEnvelope ?? {}),\n kind: \"session_summary\",\n originalEntityId: currentEnvelope?.originalEntityId ?? parsed.entityId,\n messageCount: updates.messageCount ?? parsed.messageCount,\n lastMessageOffset: updates.lastMessageOffset ?? parsed.lastMessageOffset,\n startTime: (updates.startTime ?? parsed.startTime).toISOString(),\n endTime: (updates.endTime ?? parsed.endTime).toISOString(),\n topics: updates.topics ?? parsed.topics,\n summaryMetadata: updates.metadata ?? parsed.metadata,\n updatedAt: updatedAt.toISOString(),\n });\n if (!advancedMemory) {\n throw new Error(\"Updated session summary metadata is not JSON-serializable\");\n }\n await this.runtime.updateMemory({\n id,\n content: {\n text: updates.summary ?? parsed.summary,\n },\n metadata: buildCustomMemoryMetadata({\n existing: asRecord(existing.metadata),\n scope: \"room\",\n timestamp: updatedAt.getTime(),\n advancedMemory,\n }),\n ...(updates.embedding ? { embedding: updates.embedding } : {}),\n });\n }\n\n async getSessionSummaries(\n agentId: UUID,\n roomId: UUID,\n limit = 5\n ): Promise<SessionSummaryRecord[]> {\n if (limit <= 0) {\n return [];\n }\n const memories = await this.runtime.getMemories({\n agentId,\n roomId,\n tableName: SESSION_SUMMARY_TABLE,\n count: Math.max(limit * 4, 20),\n unique: false,\n });\n\n return this.sortSessionSummaries(\n memories\n .map((memory) => this.parseSessionSummary(memory))\n .filter((memory): memory is SessionSummaryRecord => memory !== null)\n ).slice(0, limit);\n }\n}\n",
68
+ "import type { UUID } from \"@elizaos/core\";\n\nconst UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nfunction hashSegment(input: string, seed: number): number {\n let hash = seed >>> 0;\n for (let index = 0; index < input.length; index += 1) {\n hash ^= input.charCodeAt(index);\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n}\n\nexport function stringToUuid(target: string | number): UUID {\n const value = typeof target === \"number\" ? target.toString() : target;\n\n if (typeof value !== \"string\") {\n throw new TypeError(\"Value must be string\");\n }\n\n if (UUID_PATTERN.test(value)) {\n return value as UUID;\n }\n\n const input = encodeURIComponent(value);\n const hex = [\n hashSegment(input, 0x811c9dc5),\n hashSegment(input, 0x9e3779b1),\n hashSegment(input, 0x85ebca6b),\n hashSegment(input, 0xc2b2ae35),\n ]\n .map((part) => part.toString(16).padStart(8, \"0\"))\n .join(\"\")\n .slice(0, 32)\n .split(\"\");\n\n hex[12] = \"0\";\n hex[16] = ((Number.parseInt(hex[16] ?? \"0\", 16) & 0x3) | 0x8).toString(16);\n\n return `${hex.slice(0, 8).join(\"\")}-${hex.slice(8, 12).join(\"\")}-${hex\n .slice(12, 16)\n .join(\"\")}-${hex.slice(16, 20).join(\"\")}-${hex.slice(20, 32).join(\"\")}` as UUID;\n}\n",
69
+ "import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport dotenv from \"dotenv\";\n\nexport function expandTildePath(filepath: string): string {\n if (filepath.startsWith(\"~\")) {\n return path.join(process.cwd(), filepath.slice(1));\n }\n return filepath;\n}\n\nexport function resolveEnvFile(startDir: string = process.cwd()): string {\n let currentDir = startDir;\n\n while (true) {\n const candidate = path.join(currentDir, \".env\");\n if (existsSync(candidate)) {\n return candidate;\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n break;\n }\n currentDir = parentDir;\n }\n\n return path.join(startDir, \".env\");\n}\n\nexport function resolvePgliteDir(dir?: string, fallbackDir?: string): string {\n const envPath = resolveEnvFile();\n if (existsSync(envPath)) {\n dotenv.config({ path: envPath });\n }\n\n let monoPath: string | undefined;\n if (existsSync(path.join(process.cwd(), \"packages\", \"core\"))) {\n monoPath = process.cwd();\n } else {\n const twoUp = path.resolve(process.cwd(), \"../..\"); // assuming running from package\n if (existsSync(path.join(twoUp, \"packages\", \"core\"))) {\n monoPath = twoUp;\n }\n }\n\n const base =\n dir ??\n process.env.PGLITE_DATA_DIR ??\n fallbackDir ??\n (monoPath ? path.join(monoPath, \".eliza\", \".elizadb\") : undefined) ??\n path.join(process.cwd(), \".eliza\", \".elizadb\");\n\n return expandTildePath(base);\n}\n\nexport function sanitizeJsonObject(value: unknown, seen: WeakSet<object> = new WeakSet()): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === \"string\") {\n const nullChar = String.fromCharCode(0);\n const nullCharRegex = new RegExp(nullChar, \"g\");\n return value\n .replace(nullCharRegex, \"\")\n .replace(/\\\\(?![\"\\\\/bfnrtu])/g, \"\\\\\\\\\")\n .replace(/\\\\u(?![0-9a-fA-F]{4})/g, \"\\\\\\\\u\");\n }\n\n if (typeof value === \"object\") {\n if (seen.has(value as object)) {\n return null;\n }\n seen.add(value as object);\n\n if (Array.isArray(value)) {\n return value.map((item) => sanitizeJsonObject(item, seen));\n }\n\n const result: Record<string, unknown> = {};\n const nullChar = String.fromCharCode(0);\n const nullCharRegex = new RegExp(nullChar, \"g\");\n for (const [key, val] of Object.entries(value)) {\n const sanitizedKey =\n typeof key === \"string\"\n ? key.replace(nullCharRegex, \"\").replace(/\\\\u(?![0-9a-fA-F]{4})/g, \"\\\\\\\\u\")\n : key;\n result[sanitizedKey] = sanitizeJsonObject(val, seen);\n }\n return result;\n }\n\n return value;\n}\n",
70
+ "import type { UUID } from \"@elizaos/core\";\n\nexport interface ConnectorPasswordManagerReference {\n readonly source: \"1password\" | \"protonpass\";\n readonly path: string;\n}\n\nexport interface ConnectorCredentialVault {\n set(key: string, value: string, opts?: { sensitive?: boolean; caller?: string }): Promise<void>;\n setReference?(key: string, ref: ConnectorPasswordManagerReference): Promise<void>;\n get(key: string): Promise<string>;\n reveal?(key: string, caller?: string): Promise<string>;\n has(key: string): Promise<boolean>;\n remove(key: string): Promise<void>;\n}\n\nexport interface ConnectorCredentialStore {\n putSecret(params: {\n vaultRef?: string;\n agentId: UUID;\n provider: string;\n accountId: UUID;\n credentialType: string;\n value: string;\n caller?: string;\n }): Promise<string>;\n putReference(params: {\n vaultRef?: string;\n agentId: UUID;\n provider: string;\n accountId: UUID;\n credentialType: string;\n reference: ConnectorPasswordManagerReference;\n }): Promise<string>;\n get(vaultRef: string, options?: { reveal?: boolean; caller?: string }): Promise<string>;\n has(vaultRef: string): Promise<boolean>;\n remove(vaultRef: string): Promise<void>;\n}\n\nexport function buildConnectorCredentialVaultRef(params: {\n agentId: UUID;\n provider: string;\n accountId: UUID;\n credentialType: string;\n}): string {\n return [\n \"connector\",\n normalizeVaultSegment(params.agentId),\n normalizeVaultSegment(params.provider),\n normalizeVaultSegment(params.accountId),\n normalizeVaultSegment(params.credentialType),\n ].join(\".\");\n}\n\nexport function createConnectorCredentialStore(\n vault: ConnectorCredentialVault\n): ConnectorCredentialStore {\n return {\n async putSecret(params) {\n const vaultRef = params.vaultRef ?? buildConnectorCredentialVaultRef(params);\n await vault.set(vaultRef, params.value, { sensitive: true, caller: params.caller });\n return vaultRef;\n },\n async putReference(params) {\n if (!vault.setReference) {\n throw new Error(\"Connector credential vault does not support password-manager references\");\n }\n const vaultRef = params.vaultRef ?? buildConnectorCredentialVaultRef(params);\n await vault.setReference(vaultRef, params.reference);\n return vaultRef;\n },\n async get(vaultRef, options) {\n if (options?.reveal && vault.reveal) {\n return vault.reveal(vaultRef, options.caller);\n }\n return vault.get(vaultRef);\n },\n async has(vaultRef) {\n return vault.has(vaultRef);\n },\n async remove(vaultRef) {\n await vault.remove(vaultRef);\n },\n };\n}\n\nfunction normalizeVaultSegment(value: string): string {\n const normalized = value\n .trim()\n .replace(/[^a-zA-Z0-9_-]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n return (normalized || \"unknown\").slice(0, 64);\n}\n"
71
+ ],
72
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IACA,oBACA,gBAOa;AAAA;AAAA,EARb;AAAA,EACA;AAAA,EAOa,aAAa,uBAAQ,UAAU;AAAA,IAC1C,IAAI,oBAAK,IAAI,EAAE,WAAW,EAAE,cAAc;AAAA,IAC1C,SAAS,uBAAQ,SAAS,EAAE,QAAQ,IAAI,EAAE,QAAQ;AAAA,IAClD,WAAW,oBAAK,WAAW;AAAA,IAC3B,WAAW,yBAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,6BAAU,EAAE,QAAQ;AAAA,IAEvF,WAAW,yBAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,6BAAU,EAAE,QAAQ;AAAA,IAGvF,MAAM,oBAAK,MAAM,EAAE,QAAQ;AAAA,IAC3B,UAAU,oBAAK,UAAU;AAAA,IACzB,QAAQ,oBAAK,QAAQ,EAAE,QAAQ,EAAE;AAAA,IACjC,KAAK,qBAAM,KAAK,EAAE,MAAyB,EAAE,QAAQ,mCAAgB;AAAA,IACrE,iBAAiB,qBAAM,kBAAkB,EACtC,MAA0B,EAC1B,QAAQ,mCAAgB,EACxB,QAAQ;AAAA,IACX,cAAc,qBAAM,eAAe,EAAE,MAAgB,EAAE,QAAQ,mCAAgB,EAAE,QAAQ;AAAA,IACzF,QAAQ,qBAAM,QAAQ,EAAE,MAAgB,EAAE,QAAQ,mCAAgB,EAAE,QAAQ;AAAA,IAC5E,YAAY,qBAAM,YAAY,EAAE,MAAgB,EAAE,QAAQ,mCAAgB,EAAE,QAAQ;AAAA,IACpF,WAAW,qBAAM,WAAW,EACzB,MAAuD,EACvD,QAAQ,mCAAgB,EACxB,QAAQ;AAAA,IACX,SAAS,qBAAM,SAAS,EAAE,MAAgB,EAAE,QAAQ,mCAAgB,EAAE,QAAQ;AAAA,IAC9E,UAAU,qBAAM,UAAU,EACvB,MAGE,EACF,QAAQ,mCAAgB,EACxB,QAAQ;AAAA,IACX,OAAO,qBAAM,OAAO,EACjB,MAIE,EACF,QAAQ,mCAAgB,EACxB,QAAQ;AAAA,EACb,CAAC;AAAA;;;ICjDD,sBACA,kBAQa;AAAA;AAAA,EATb;AAAA,EACA;AAAA,EAQa,cAAc,yBAAQ,WAAW;AAAA,IAC5C,IAAI,sBAAK,IAAI,EAAE,WAAW;AAAA,IAC1B,WAAW,2BAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,+BAAU,EAAE,QAAQ;AAAA,IACvF,WAAW,2BAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,+BAAU,EAAE,QAAQ;AAAA,EACzF,CAAC;AAAA;;;ACDM,SAAS,KAAK,CAAC,SAA4C;AAAA,EAChE,OAAO,QAAQ;AAAA;AAGV,SAAS,MAAS,CAAC,QAA6B,UAAQ,GAAkB;AAAA,EAC/E,OAAO,OAAO,KAAK;AAAA;;;ACCrB,SAAS,OAAU,CAAC,QAAkC;AAAA,EACpD,OAAO,OAAO;AAAA;AAgBhB,eAAsB,kBAAkB,CAAC,SAA0C;AAAA,EACjF,MAAM,KAAK,MAAM,OAAO;AAAA,EAGxB,IAAI;AAAA,IACF,MAAM,GAAG,QAAQ,yDAAoC;AAAA,IACrD,MAAM;AAAA,IAEN,mBAAO,MAAM,uEAAsE;AAAA,IACnF;AAAA;AAAA,EAKF,IAAI,wBAAwB;AAAA,EAC5B,IAAI;AAAA,IACF,MAAM,iBAAiB,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,KAKvC;AAAA,IAED,IAAI,eAAe,QAAQ,eAAe,KAAK,SAAS,GAAG;AAAA,MAEzD,wBAAwB;AAAA,MACxB,mBAAO,MAAM,kEAAiE;AAAA,IAChF;AAAA,IACA,MAAM;AAAA,IAEN,mBAAO,MAAM,yEAAwE;AAAA,IACrF;AAAA;AAAA,EAMF,IAAI,uBAAuB;AAAA,IACzB,MAAM,uBAAuB,QAAQ,IAAI,0BAA0B;AAAA,IAEnE,IAAI,sBAAsB;AAAA,MAGxB,mBAAO,MAAM,oEAAmE;AAAA,MAChF;AAAA,IACF;AAAA,IAGA,mBAAO,MAAM,gEAA+D;AAAA,IAE5E,IAAI;AAAA,MACF,MAAM,gBAAgB,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAQtC;AAAA,MAED,IAAI,cAAc,QAAQ,cAAc,KAAK,SAAS,GAAG;AAAA,QACvD,WAAW,OAAO,cAAc,MAAM;AAAA,UACpC,MAAM,YAAY,IAAI;AAAA,UACtB,IAAI;AAAA,YACF,MAAM,GAAG,QAAQ,yBAAI,IAAI,gBAAgB,uCAAuC,CAAC;AAAA,YACjF,MAAM;AAAA,QAGV;AAAA,QACA,mBAAO,MAAM,wCAAuC,cAAc,KAAK,gBAAgB;AAAA,MACzF,EAAO;AAAA,QACL,mBAAO,MAAM,8CAA6C;AAAA;AAAA,MAE5D,MAAM;AAAA,MACN,mBAAO,MAAM,6CAA4C;AAAA;AAAA,IAG3D;AAAA,EACF;AAAA,EAEA,mBAAO,KAAK,6DAA4D;AAAA,EAExE,IAAI;AAAA,IAGF,mBAAO,MAAM,0DAAyD;AAAA,IACtE,IAAI;AAAA,MACF,MAAM,GAAG,QACP,qGACF;AAAA,MACA,mBAAO,MAAM,sCAAqC;AAAA,MAClD,OAAO,QAAQ;AAAA,MAEf,mBAAO,MAAM,qEAAoE;AAAA;AAAA,IAKnF,mBAAO,MAAM,6DAA4D;AAAA,IACzE,IAAI;AAAA,MACF,MAAM,gBAAgB,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAQtC;AAAA,MAED,IAAI,cAAc,QAAQ,cAAc,KAAK,SAAS,GAAG;AAAA,QACvD,WAAW,OAAO,cAAc,MAAM;AAAA,UACpC,MAAM,YAAY,IAAI;AAAA,UACtB,IAAI;AAAA,YACF,MAAM,GAAG,QAAQ,yBAAI,IAAI,gBAAgB,uCAAuC,CAAC;AAAA,YACjF,mBAAO,MAAM,iCAAgC,WAAW;AAAA,YACxD,OAAO,QAAQ;AAAA,YACf,mBAAO,MAAM,0CAAyC,WAAW;AAAA;AAAA,QAErE;AAAA,MACF,EAAO;AAAA,QACL,mBAAO,MAAM,0CAAyC;AAAA;AAAA,MAExD,OAAO,QAAQ;AAAA,MACf,mBAAO,MAAM,8DAA6D;AAAA;AAAA,IAQ5E,mBAAO,MAAM,6EAA4E;AAAA,IAEzF,MAAM,kBAAkB,CAAC,YAAY,UAAU,OAAO;AAAA,IAEtD,WAAW,aAAa,iBAAiB;AAAA,MACvC,IAAI;AAAA,QAEF,MAAM,gBAAgB,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA,+BAIhB;AAAA;AAAA;AAAA,SAGtB;AAAA,QAED,MAAM,UAAU,QAAuB,aAAa;AAAA,QACpD,MAAM,gBAAgB,QAAQ,KAAK,CAAC,MAAM,EAAE,gBAAgB,WAAW;AAAA,QACvE,MAAM,gBAAgB,QAAQ,KAAK,CAAC,MAAM,EAAE,gBAAgB,UAAU;AAAA,QACtE,MAAM,kBAAkB,QAAQ,KAAK,CAAC,MAAM,EAAE,gBAAgB,mBAAmB;AAAA,QAGjF,MAAM,WAAW,iBAAiB;AAAA,QAClC,MAAM,gBAAgB,gBAAgB,cAAc;AAAA,QAEpD,IAAI,YAAY,CAAC,iBAAiB;AAAA,UAEhC,mBAAO,MACL,0BAAyB,aAAa,uCACxC;AAAA,UACA,MAAM,GAAG,QACP,yBAAI,IACF,gBAAgB,6BAA6B,uCAC/C,CACF;AAAA,UACA,mBAAO,MAAM,yBAAwB,aAAa,mCAAmC;AAAA,UAGrF,IAAI,SAAS,cAAc,QAAQ;AAAA,YAIjC,IAAI;AAAA,cACF,mBAAO,MACL,gDAA+C,gCACjD;AAAA,cACA,MAAM,GAAG,QACP,yBAAI,IAAI,gBAAgB,0DAA0D,CACpF;AAAA,cACA,mBAAO,MAAM,0CAAyC;AAAA,cACtD,MAAM;AAAA,cACN,mBAAO,MACL,kDAAiD,6BACnD;AAAA;AAAA,YAGF,IAAI;AAAA,cACF,mBAAO,MACL,4BAA2B,kDAC7B;AAAA,cAGA,MAAM,GAAG,QACP,yBAAI,IAAI;AAAA,iCACS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAShB,CACH;AAAA,cACA,mBAAO,MAAM,2BAA0B,qCAAqC;AAAA,cAC5E,OAAO,cAAc;AAAA,cACrB,mBAAO,KACL,oCAAmC,wCAAwC,cAC7E;AAAA;AAAA,UAEJ;AAAA,UAIA,IAAI,cAAc,YAAY;AAAA,YAC5B,MAAM,kBAAkB,MAAM,GAAG,QAC/B,yBAAI,IACF,kCAAkC,8CACpC,CACF;AAAA,YACA,MAAM,YAAY,gBAAgB,KAAK,IAAI;AAAA,YAC3C,IAAI,aAAa,SAAS,WAAW,EAAE,IAAI,GAAG;AAAA,cAC5C,mBAAO,KACL,kBAAiB,iBAAiB,oEACpC;AAAA,cACA,MAAM,GAAG,QACP,yBAAI,IAAI,gBAAgB,8CAA8C,CACxE;AAAA,cACA,mBAAO,MACL,yBAAwB,mDAAmD,WAC7E;AAAA,YACF;AAAA,YAGA,mBAAO,MAAM,wBAAuB,yCAAyC;AAAA,YAC7E,MAAM,GAAG,QACP,yBAAI,IAAI,gBAAgB,0DAA0D,CACpF;AAAA,YACA,mBAAO,MAAM,qBAAoB,sCAAsC;AAAA,UACzE;AAAA,QACF,EAAO,SAAI,YAAY,iBAAiB;AAAA,UAEtC,mBAAO,MAAM,iBAAgB,wCAAwC,kBAAkB;AAAA,UACvF,MAAM,GAAG,QACP,yBAAI,IAAI,gBAAgB,2BAA2B,wBAAwB,CAC7E;AAAA,UACA,mBAAO,MAAM,yBAAwB,aAAa,eAAe;AAAA,QACnE,EAAO,SAAI,CAAC,YAAY,iBAAiB;AAAA,UAGvC,IAAI,gBAAgB,cAAc,QAAQ;AAAA,YACxC,mBAAO,MACL,iBAAgB,0EAClB;AAAA,YAIA,mBAAO,MACL,gDAA+C,gCACjD;AAAA,YACA,MAAM,GAAG,QACP,yBAAI,IAAI,gBAAgB,0DAA0D,CACpF;AAAA,YACA,mBAAO,MAAM,0CAAyC;AAAA,YAItD,mBAAO,MACL,4BAA2B,+EAC7B;AAAA,YACA,MAAM,GAAG,QACP,yBAAI,IAAI;AAAA,6BACO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAOhB,CACD;AAAA,YACA,mBAAO,MAAM,2BAA0B,qCAAqC;AAAA,UAC9E,EAAO;AAAA,YACL,mBAAO,MAAM,iBAAgB,oDAAoD;AAAA;AAAA,QAErF,EAAO;AAAA,UACL,mBAAO,MAAM,iBAAgB,sCAAsC;AAAA;AAAA,QAErE,OAAO,OAAO;AAAA,QACd,mBAAO,KAAK,kCAAiC,wBAAwB,OAAO;AAAA;AAAA,IAEhF;AAAA,IAKA,mBAAO,MAAM,uEAAsE;AAAA,IACnF,IAAI;AAAA,MACF,MAAM,wBAAwB,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAgB9C;AAAA,MAED,MAAM,gBAAgB,sBAAsB,QAAQ,CAAC;AAAA,MACrD,mBAAO,MAAM,uBAAsB,cAAc,sCAAsC;AAAA,MAEvF,WAAW,OAAO,eAAe;AAAA,QAC/B,MAAM,YAAY,IAAI;AAAA,QACtB,IAAI;AAAA,UACF,MAAM,GAAG,QACP,yBAAI,IAAI,gBAAgB,oDAAoD,CAC9E;AAAA,UACA,mBAAO,MAAM,wCAAuC,WAAW;AAAA,UAC/D,OAAO,QAAQ;AAAA,UACf,mBAAO,MAAM,+CAA8C,WAAW;AAAA;AAAA,MAE1E;AAAA,MACA,OAAO,QAAQ;AAAA,MACf,mBAAO,MAAM,2EAA0E;AAAA;AAAA,IAKzF,mBAAO,MAAM,8DAA6D;AAAA,IAC1E,IAAI;AAAA,MACF,MAAM,sBAAsB,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAO5C;AAAA,MAED,MAAM,gBAAgB,QAAuB,mBAAmB;AAAA,MAChE,MAAM,aAAa,cAAc,KAAK,CAAC,MAAM,EAAE,gBAAgB,UAAU;AAAA,MACzE,MAAM,cAAc,cAAc,KAAK,CAAC,MAAM,EAAE,gBAAgB,WAAW;AAAA,MAE3E,IAAI,cAAc,CAAC,aAAa;AAAA,QAE9B,mBAAO,MAAM,wDAAuD;AAAA,QACpE,MAAM,GAAG,QAAQ,yBAAI,IAAI,8DAA8D,CAAC;AAAA,QACxF,mBAAO,MAAM,mDAAkD;AAAA,MACjE,EAAO,SAAI,cAAc,aAAa;AAAA,QAEpC,mBAAO,MAAM,uEAAsE;AAAA,QACnF,MAAM,GAAG,QAAQ,yBAAI,IAAI,qDAAqD,CAAC;AAAA,QAC/E,mBAAO,MAAM,uCAAsC;AAAA,MACrD,EAAO;AAAA,QACL,mBAAO,MAAM,6EAA4E;AAAA;AAAA,MAE3F,OAAO,QAAQ;AAAA,MACf,mBAAO,MAAM,uDAAsD;AAAA;AAAA,IAKrE,mBAAO,MAAM,+DAA8D;AAAA,IAC3E,IAAI;AAAA,MACF,MAAM,oBAAoB,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,OAK1C;AAAA,MAED,IAAI,kBAAkB,QAAQ,kBAAkB,KAAK,SAAS,GAAG;AAAA,QAE/D,mBAAO,MAAM,gDAA+C;AAAA,QAC5D,MAAM,GAAG,QACP,yBAAI,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAMT,CACD;AAAA,QAGA,mBAAO,MAAM,mDAAkD;AAAA,QAC/D,MAAM,GAAG,QACP,yBAAI,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,SAKT,CACD;AAAA,QACA,mBAAO,MAAM,+CAA8C;AAAA,QAG3D,mBAAO,MAAM,iDAAgD;AAAA,QAC7D,MAAM,GAAG,QAAQ,yBAAI,IAAI,uCAAuC,CAAC;AAAA,QACjE,mBAAO,MAAM,6CAA4C;AAAA,MAC3D,EAAO;AAAA,QACL,mBAAO,MAAM,gDAA+C;AAAA;AAAA,MAE9D,OAAO,OAAO;AAAA,MACd,mBAAO,KAAK,sDAAqD,OAAO;AAAA;AAAA,IAK1E,mBAAO,MAAM,sDAAqD;AAAA,IAClE,IAAI;AAAA,MACF,MAAM,eAAe,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAMrC;AAAA,MAED,MAAM,SAAS,QAAsB,YAAY;AAAA,MACjD,MAAM,kBAAkB,OAAO,KAAK,CAAC,MAAM,EAAE,eAAe,eAAe;AAAA,MAC3E,MAAM,yBAAyB,OAAO,KAAK,CAAC,MAAM,EAAE,eAAe,uBAAuB;AAAA,MAE1F,IAAI,mBAAmB,CAAC,wBAAwB;AAAA,QAE9C,mBAAO,MAAM,kEAAiE;AAAA,QAC9E,MAAM,GAAG,QAAQ,yBAAI,IAAI,+DAA+D,CAAC;AAAA,QACzF,mBAAO,MAAM,6DAA4D;AAAA,QAGzE,mBAAO,MACL,gFACF;AAAA,QACA,MAAM,GAAG,QACP,yBAAI,IACF,sFACF,CACF;AAAA,QACA,mBAAO,MAAM,2EAA0E;AAAA,MACzF,EAAO,SAAI,CAAC,mBAAmB,CAAC,wBAAwB;AAAA,QAEtD,mBAAO,MAAM,iDAAgD;AAAA,MAC/D,EAAO,SAAI,wBAAwB;AAAA,QAEjC,mBAAO,MAAM,yDAAwD;AAAA,QACrE,MAAM,gBAAgB,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAOtC;AAAA,QAED,MAAM,UAAU,QAAuB,aAAa;AAAA,QACpD,MAAM,cAAc,QAAQ,KAAK,CAAC,MAAM,EAAE,gBAAgB,WAAW;AAAA,QACrE,MAAM,qBAAqB,QAAQ,KAAK,CAAC,MAAM,EAAE,gBAAgB,mBAAmB;AAAA,QAEpF,IAAI,eAAe,CAAC,oBAAoB;AAAA,UAEtC,mBAAO,MACL,gFACF;AAAA,UACA,MAAM,GAAG,QACP,yBAAI,IACF,sFACF,CACF;AAAA,UACA,mBAAO,MAAM,2EAA0E;AAAA,QACzF,EAAO,SAAI,CAAC,eAAe,CAAC,oBAAoB;AAAA,UAE9C,mBAAO,MACL,oFACF;AAAA,UACA,MAAM,GAAG,QAAQ,sEAAiD;AAAA,UAClE,mBAAO,MAAM,+CAA8C;AAAA,QAC7D,EAAO;AAAA,UACL,mBAAO,MAAM,gEAA+D;AAAA;AAAA,MAEhF;AAAA,MACA,OAAO,QAAQ;AAAA,MACf,mBAAO,MAAM,2DAA0D;AAAA;AAAA,IAKzE,mBAAO,MAAM,sDAAqD;AAAA,IAClE,IAAI;AAAA,MACF,MAAM,gBAAgB,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAOtC;AAAA,MAED,MAAM,UAAU,QAAuB;AAAA,QACrC,MAAM,cAAc,QAAQ,CAAC;AAAA,MAC/B,CAAC;AAAA,MACD,MAAM,YAAY,QAAQ,KAAK,CAAC,MAAM,EAAE,gBAAgB,SAAS;AAAA,MACjE,MAAM,cAAc,QAAQ,KAAK,CAAC,MAAM,EAAE,gBAAgB,WAAW;AAAA,MAErE,IAAI,aAAa,CAAC,aAAa;AAAA,QAE7B,mBAAO,MAAM,qEAAoE;AAAA,QACjF,MAAM,GAAG,QACP,yBAAI,IAAI,2EAA2E,CACrF;AAAA,QACA,mBAAO,MAAM,gEAA+D;AAAA,MAC9E,EAAO,SAAI,CAAC,aAAa,CAAC,aAAa;AAAA,QAErC,mBAAO,MACL,uFACF;AAAA,QACA,MAAM,GAAG,QAAQ,qEAAgD;AAAA,QACjE,mBAAO,MAAM,8CAA6C;AAAA,MAC5D,EAAO;AAAA,QACL,mBAAO,MAAM,iEAAgE;AAAA;AAAA,MAE/E,OAAO,QAAQ;AAAA,MACf,mBAAO,MAAM,4DAA2D;AAAA;AAAA,IAK1E,mBAAO,MAAM,+DAA8D;AAAA,IAC3E,IAAI;AAAA,MACF,MAAM,gBAAgB,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAWtC;AAAA,MAED,MAAM,gBAAgB,cAAc,QAAQ,CAAC;AAAA,MAC7C,mBAAO,MAAM,uBAAsB,cAAc,wBAAwB;AAAA,MAEzE,WAAW,OAAO,eAAe;AAAA,QAC/B,MAAM,YAAY,IAAI;AAAA,QACtB,IAAI;AAAA,UACF,MAAM,GAAG,QAAQ,yBAAI,IAAI,yBAAyB,YAAY,CAAC;AAAA,UAC/D,mBAAO,MAAM,+BAA8B,WAAW;AAAA,UACtD,OAAO,QAAQ;AAAA,UACf,mBAAO,MAAM,sCAAqC,WAAW;AAAA;AAAA,MAEjE;AAAA,MACA,OAAO,QAAQ;AAAA,MACf,mBAAO,MAAM,iEAAgE;AAAA;AAAA,IAS/E,mBAAO,MAAM,iEAAgE;AAAA,IAE7E,MAAM,gBAAgB;AAAA,MAEpB,EAAE,OAAO,SAAS,MAAM,WAAW,IAAI,WAAW;AAAA,MAClD,EAAE,OAAO,SAAS,MAAM,WAAW,IAAI,WAAW;AAAA,MAClD,EAAE,OAAO,SAAS,MAAM,aAAa,IAAI,aAAa;AAAA,MACtD,EAAE,OAAO,SAAS,MAAM,aAAa,IAAI,aAAa;AAAA,MAGtD,EAAE,OAAO,UAAU,MAAM,WAAW,IAAI,WAAW;AAAA,MACnD,EAAE,OAAO,UAAU,MAAM,aAAa,IAAI,aAAa;AAAA,MAGvD,EAAE,OAAO,YAAY,MAAM,aAAa,IAAI,aAAa;AAAA,MACzD,EAAE,OAAO,YAAY,MAAM,YAAY,IAAI,YAAY;AAAA,MACvD,EAAE,OAAO,YAAY,MAAM,WAAW,IAAI,WAAW;AAAA,MACrD,EAAE,OAAO,YAAY,MAAM,UAAU,IAAI,UAAU;AAAA,MACnD,EAAE,OAAO,YAAY,MAAM,WAAW,IAAI,WAAW;AAAA,MAGrD,EAAE,OAAO,cAAc,MAAM,YAAY,IAAI,YAAY;AAAA,MACzD,EAAE,OAAO,cAAc,MAAM,WAAW,IAAI,WAAW;AAAA,MACvD,EAAE,OAAO,cAAc,MAAM,UAAU,IAAI,UAAU;AAAA,MACrD,EAAE,OAAO,cAAc,MAAM,WAAW,IAAI,WAAW;AAAA,MACvD,EAAE,OAAO,cAAc,MAAM,kBAAkB,IAAI,mBAAmB;AAAA,MACtE,EAAE,OAAO,cAAc,MAAM,aAAa,IAAI,aAAa;AAAA,MAG3D,EAAE,OAAO,gBAAgB,MAAM,YAAY,IAAI,YAAY;AAAA,MAC3D,EAAE,OAAO,gBAAgB,MAAM,UAAU,IAAI,UAAU;AAAA,MACvD,EAAE,OAAO,gBAAgB,MAAM,WAAW,IAAI,WAAW;AAAA,MACzD,EAAE,OAAO,gBAAgB,MAAM,aAAa,IAAI,aAAa;AAAA,MAC7D,EAAE,OAAO,gBAAgB,MAAM,aAAa,IAAI,aAAa;AAAA,MAG7D;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,QACN,IAAI;AAAA,MACN;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,QACN,IAAI;AAAA,MACN;AAAA,MACA,EAAE,OAAO,iBAAiB,MAAM,WAAW,IAAI,WAAW;AAAA,MAC1D,EAAE,OAAO,iBAAiB,MAAM,aAAa,IAAI,aAAa;AAAA,MAG9D,EAAE,OAAO,QAAQ,MAAM,YAAY,IAAI,YAAY;AAAA,MACnD,EAAE,OAAO,QAAQ,MAAM,UAAU,IAAI,UAAU;AAAA,MAC/C,EAAE,OAAO,QAAQ,MAAM,aAAa,IAAI,aAAa;AAAA,MAGrD,EAAE,OAAO,SAAS,MAAM,UAAU,IAAI,UAAU;AAAA,MAChD,EAAE,OAAO,SAAS,MAAM,WAAW,IAAI,WAAW;AAAA,MAClD,EAAE,OAAO,SAAS,MAAM,YAAY,IAAI,YAAY;AAAA,MACpD,EAAE,OAAO,SAAS,MAAM,aAAa,IAAI,aAAa;AAAA,MACtD,EAAE,OAAO,SAAS,MAAM,aAAa,IAAI,aAAa;AAAA,MAGtD,EAAE,OAAO,UAAU,MAAM,aAAa,IAAI,aAAa;AAAA,MACvD,EAAE,OAAO,UAAU,MAAM,aAAa,IAAI,aAAa;AAAA,MAGvD,EAAE,OAAO,YAAY,MAAM,WAAW,IAAI,WAAW;AAAA,MACrD,EAAE,OAAO,YAAY,MAAM,aAAa,IAAI,aAAa;AAAA,MAGzD,EAAE,OAAO,cAAc,MAAM,YAAY,IAAI,YAAY;AAAA,MACzD,EAAE,OAAO,cAAc,MAAM,aAAa,IAAI,aAAa;AAAA,MAG3D,EAAE,OAAO,SAAS,MAAM,WAAW,IAAI,WAAW;AAAA,MAClD,EAAE,OAAO,SAAS,MAAM,aAAa,IAAI,aAAa;AAAA,MACtD,EAAE,OAAO,SAAS,MAAM,aAAa,IAAI,aAAa;AAAA,IACxD;AAAA,IAEA,WAAW,UAAU,eAAe;AAAA,MAClC,IAAI;AAAA,QAEF,MAAM,oBAAoB,MAAM,GAAG,QAAQ;AAAA;AAAA,2DAEQ,OAAO;AAAA,SACzD;AAAA,QAED,IAAI,CAAC,kBAAkB,QAAQ,kBAAkB,KAAK,WAAW,GAAG;AAAA,UAElE;AAAA,QACF;AAAA,QAGA,MAAM,gBAAgB,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA,+BAIhB,OAAO;AAAA,kCACJ,OAAO,SAAS,OAAO;AAAA;AAAA,SAEhD;AAAA,QAED,MAAM,UAAU,QAAuB,aAAa;AAAA,QACpD,MAAM,eAAe,QAAQ,KAAK,CAAC,MAAM,EAAE,gBAAgB,OAAO,IAAI;AAAA,QACtE,MAAM,eAAe,QAAQ,KAAK,CAAC,MAAM,EAAE,gBAAgB,OAAO,EAAE;AAAA,QAEpE,IAAI,gBAAgB,CAAC,cAAc;AAAA,UAEjC,mBAAO,MAAM,0BAAyB,OAAO,SAAS,OAAO,WAAW,OAAO,OAAO;AAAA,UACtF,MAAM,GAAG,QACP,yBAAI,IACF,gBAAgB,OAAO,yBAAyB,OAAO,aAAa,OAAO,KAC7E,CACF;AAAA,UACA,mBAAO,MAAM,yBAAwB,OAAO,SAAS,OAAO,UAAU,OAAO,IAAI;AAAA,QACnF,EAAO,SAAI,gBAAgB,cAAc;AAAA,UAEvC,mBAAO,MACL,8CAA6C,OAAO,SAAS,OAAO,SACtE;AAAA,UACA,MAAM,GAAG,QACP,yBAAI,IAAI,gBAAgB,OAAO,uBAAuB,OAAO,eAAe,CAC9E;AAAA,UACA,mBAAO,MAAM,yBAAwB,OAAO,SAAS,OAAO,MAAM;AAAA,QACpE;AAAA,QAEA,OAAO,OAAO;AAAA,QAEd,mBAAO,MAAM,mCAAkC,OAAO,SAAS,OAAO,SAAS,OAAO;AAAA;AAAA,IAE1F;AAAA,IAEA,mBAAO,MAAM,+DAA8D;AAAA,IAE3E,mBAAO,KAAK,iFAAgF;AAAA,IAC5F,OAAO,OAAO;AAAA,IAEd,mBAAO,MAAM,iCAAiC,OAAO,KAAK,CAAC;AAAA,IAC3D,MAAM;AAAA;AAAA;AAAA,IA5uBV,aACA;AAAA;AAAA,EADA;AAAA,EACA;AAAA;;;ACKA,eAAsB,mBAAmB,CAAC,SAA0C;AAAA,EAClF,MAAM,KAAK,MAAM,OAAO;AAAA,EAExB,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAMhB;AAAA,EAED,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAchB;AAAA,EAED,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA2ChB;AAAA,EAED,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAuBhB;AAAA,EAED,oBAAO,KAAK,EAAE,KAAK,aAAa,GAAG,oCAAoC;AAAA,EACvE,MAAM,iBAAiB,OAAO;AAAA;AAGhC,eAAsB,oBAAoB,CACxC,SACA,UACiB;AAAA,EACjB,MAAM,KAAK,MAAM,OAAO;AAAA,EAGxB,MAAM,GACH,OAAO,WAAW,EAClB,OAAO;AAAA,IACN,IAAI;AAAA,EACN,CAAC,EACA,oBAAoB;AAAA,EAEvB,oBAAO,KAAK,EAAE,KAAK,cAAc,UAAU,SAAS,MAAM,GAAG,CAAC,EAAE,GAAG,uBAAuB;AAAA,EAC1F,OAAO;AAAA;AAGT,eAAsB,gBAAgB,CAAC,SAA2B,UAAiC;AAAA,EACjG,IAAI,CAAC,0BAAa,QAAQ,GAAG;AAAA,IAC3B,MAAM,IAAI,MAAM,6BAA6B,iCAAiC;AAAA,EAChF;AAAA,EAEA,MAAM,KAAK,MAAM,OAAO;AAAA,EACxB,MAAM,UAAU,MAAM,GAAG,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,wBAAG,YAAY,IAAI,QAAQ,CAAC;AAAA,EAEtF,IAAI,QAAQ,WAAW,GAAG;AAAA,IACxB,MAAM,IAAI,MAAM,UAAU,yBAAyB;AAAA,EACrD;AAAA,EAEA,oBAAO,KAAK,EAAE,KAAK,cAAc,UAAU,SAAS,MAAM,GAAG,CAAC,EAAE,GAAG,wBAAwB;AAAA;AAG7F,eAAsB,mBAAmB,CACvC,SACA,SACA,UACe;AAAA,EACf,IAAI,CAAC,WAAW,CAAC,UAAU;AAAA,IACzB,oBAAO,KACL,oEAAoE,yBAAyB,WAC/F;AAAA,IACA;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,MAAM,OAAO;AAAA,EAGxB,MAAM,SAAS,MAAM,GAAG,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,wBAAG,WAAW,IAAI,OAAO,CAAC;AAAA,EAElF,IAAI,OAAO,SAAS,GAAG;AAAA,IACrB,MAAM,QAAQ,OAAO;AAAA,IACrB,MAAM,kBAAkB,MAAM;AAAA,IAE9B,IAAI,oBAAoB,UAAU;AAAA,MAChC,oBAAO,MACL,EAAE,KAAK,cAAc,WAAW,MAAM,KAAK,GAC3C,0CACF;AAAA,IACF,EAAO;AAAA,MAEL,MAAM,GAAG,OAAO,UAAU,EAAE,IAAI,EAAE,WAAW,SAAS,CAAC,EAAE,MAAM,wBAAG,WAAW,IAAI,OAAO,CAAC;AAAA,MAEzF,IAAI,oBAAoB,MAAM;AAAA,QAC5B,oBAAO,KAAK,EAAE,KAAK,cAAc,WAAW,MAAM,KAAK,GAAG,0BAA0B;AAAA,MACtF,EAAO;AAAA,QACL,oBAAO,KAAK,EAAE,KAAK,cAAc,WAAW,MAAM,KAAK,GAAG,sBAAsB;AAAA;AAAA;AAAA,EAGtF,EAAO;AAAA,IACL,oBAAO,MAAM,EAAE,KAAK,cAAc,QAAQ,GAAG,0BAA0B;AAAA;AAAA;AAO3E,eAAsB,mBAAmB,CAAC,SAA0C;AAAA,EAClF,MAAM,KAAK,MAAM,OAAO;AAAA,EAExB,IAAI;AAAA,IACF,MAAM,GAAG,QAAQ,0DAAqC;AAAA,IACtD,oBAAO,KAAK,EAAE,KAAK,aAAa,GAAG,2BAA2B;AAAA,IAC9D,OAAO,OAAO;AAAA,IACd,oBAAO,KAAK,EAAE,KAAK,cAAc,OAAO,OAAO,KAAK,EAAE,GAAG,oCAAoC;AAAA;AAAA;AAIjG,eAAsB,YAAY,CAAC,SAA0C;AAAA,EAC3E,MAAM,KAAK,MAAM,OAAO;AAAA,EAExB,IAAI;AAAA,IACF,MAAM,cAAc,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,KAKpC;AAAA,IAED,MAAM,aAAa,YAAY,KAAK,IAAI;AAAA,IAExC,IAAI,CAAC,YAAY;AAAA,MACf,oBAAO,MAAM,EAAE,KAAK,aAAa,GAAG,qCAAqC;AAAA,MACzE;AAAA,IACF;AAAA,IAEA,oBAAO,KACL,EAAE,KAAK,aAAa,GACpB,gFACF;AAAA,IAEA,IAAI;AAAA,MACF,MAAM,mBAAmB,OAAO;AAAA,MAChC,OAAO,iBAAiB;AAAA,MACxB,oBAAO,MACL,EAAE,KAAK,aAAa,GACpB,+DACF;AAAA;AAAA,IAGF,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAuBhB;AAAA,IAED,MAAM,eAAe,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,KAKrC;AAAA,IAED,WAAW,OAAO,aAAa,QAAQ,CAAC,GAAG;AAAA,MACzC,MAAM,aAAa,IAAI;AAAA,MACvB,MAAM,YAAY,IAAI;AAAA,MAEtB,IAAI;AAAA,QACF,MAAM,GAAG,QAAQ,6DAAwC,eAAe,YAAY;AAAA,QACpF,oBAAO,MAAM,EAAE,KAAK,cAAc,YAAY,UAAU,GAAG,uBAAuB;AAAA,QAClF,OAAO,OAAO;AAAA,QACd,oBAAO,KACL,EAAE,KAAK,cAAc,YAAY,WAAW,OAAO,OAAO,KAAK,EAAE,GACjE,gCACF;AAAA;AAAA,IAEJ;AAAA,IAEA,MAAM,GAAG,QAAQ,wFAAmE;AAAA,IAEpF,oBAAO,KACL,EAAE,KAAK,aAAa,GACpB,oEACF;AAAA,IAEA,oBAAO,KAAK,EAAE,KAAK,aAAa,GAAG,2BAA2B;AAAA,IAC9D,MAAM,GAAG,QAAQ,gDAA2B;AAAA,IAE5C,MAAM,GAAG,QAAQ,mFAA8D;AAAA,IAC/E,MAAM,GAAG,QAAQ,0FAAqE;AAAA,IACtF,MAAM,GAAG,QAAQ,6EAAwD;AAAA,IACzE,oBAAO,KAAK,EAAE,KAAK,aAAa,GAAG,2BAA2B;AAAA,IAE9D,oBAAO,KAAK,EAAE,KAAK,aAAa,GAAG,yDAAyD;AAAA,IAC5F,OAAO,OAAO;AAAA,IACd,oBAAO,MAAM,EAAE,KAAK,cAAc,OAAO,OAAO,KAAK,EAAE,GAAG,uBAAuB;AAAA,IACjF,MAAM;AAAA;AAAA;AAIV,eAAsB,gBAAgB,CAAC,SAA0C;AAAA,EAC/E,MAAM,KAAK,MAAM,OAAO;AAAA,EAExB,oBAAO,KAAK,8DAA8D;AAAA,EAE1E,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAoBhB;AAAA,EAED,oBAAO,KAAK,mDAAmD;AAAA,EAG/D,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA2JhB;AAAA,EAED,oBAAO,KAAK,sDAAsD;AAAA,EAElE,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAqChB;AAAA,EAED,oBAAO,KAAK,gEAAgE;AAAA,EAE5E,oBAAO,KAAK,0DAA0D;AAAA;AAGxE,eAAsB,yBAAyB,CAAC,SAA0C;AAAA,EACxF,MAAM,KAAK,MAAM,OAAO;AAAA,EAExB,IAAI;AAAA,IACF,MAAM,GAAG,QAAQ,iEAA4C;AAAA,IAC7D,oBAAO,KAAK,wDAAwD;AAAA,IACpE,OAAO,OAAO;AAAA,IACd,oBAAO,KAAK,2DAA2D,OAAO,KAAK,CAAC;AAAA;AAAA;AAIxF,eAAsB,kBAAkB,CAAC,SAA0C;AAAA,EACjF,MAAM,KAAK,MAAM,OAAO;AAAA,EAExB,oBAAO,KAAK,4DAA4D;AAAA,EAExE,IAAI;AAAA,IACF,MAAM,eAAe,MAAM,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,KAKrC;AAAA,IAED,WAAW,OAAO,aAAa,QAAQ,CAAC,GAAG;AAAA,MACzC,MAAM,aAAa,IAAI;AAAA,MACvB,MAAM,YAAY,IAAI;AAAA,MAEtB,IAAI;AAAA,QACF,MAAM,GAAG,QACP,yBAAI,IAAI,qDAAqD,gBAAgB,YAAY,CAC3F;AAAA,QACA,oBAAO,MACL,qDAAqD,cAAc,WACrE;AAAA,QACA,OAAO,QAAQ;AAAA,QACf,oBAAO,MAAM,oCAAoC,cAAc,WAAW;AAAA;AAAA,IAE9E;AAAA,IAEA,MAAM,GAAG,QAAQ,0FAAqE;AAAA,IACtF,MAAM,GAAG,QAAQ,0FAAqE;AAAA,IACtF,MAAM,GAAG,QAAQ,6EAAwD;AAAA,IAEzE,oBAAO,KAAK,qEAAqE;AAAA,IACjF,OAAO,OAAO;AAAA,IACd,oBAAO,MAAM,6CAA6C,OAAO,KAAK,CAAC;AAAA,IACvE,MAAM;AAAA;AAAA;AAAA,IAhkBV,cACA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EAHA;AAAA,EACA;AAAA;;;ACsBO,SAAS,YAAY,CAAC,KAAqB;AAAA,EAEhD,MAAM,KAAK,aAAa,KAAK,IAAI;AAAA,EACjC,MAAM,KAAK,aAAa,KAAK,IAAI;AAAA,EACjC,MAAM,KAAK,aAAa,KAAK,MAAM;AAAA,EACnC,MAAM,KAAK,aAAa,KAAK,MAAM;AAAA,EAEnC,OAAO,KAAK,KAAK,KAAK;AAAA;AAGxB,SAAS,YAAY,CAAC,KAAa,MAAsB;AAAA,EACvD,IAAI,OAAO;AAAA,EACX,SAAS,IAAI,EAAG,IAAI,IAAI,QAAQ,KAAK;AAAA,IACnC,OAAQ,OAAO,KAAM,IAAI,WAAW,CAAC;AAAA,EACvC;AAAA,EACA,QAAQ,SAAS,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAAA;AAsC3C,SAAS,cAAc,CAAC,KAAqB;AAAA,EAElD,MAAM,OAAO,aAAa,GAAG;AAAA,EAG7B,IAAI,SAAS,OAAO,KAAK,KAAK,MAAM,GAAG,EAAE,GAAG;AAAA,EAI5C,MAAM,aAAa;AAAA,EACnB,SAAS,SAAS;AAAA,EAGlB,IAAI,WAAW,IAAI;AAAA,IACjB,SAAS;AAAA,EACX;AAAA,EAEA,OAAO;AAAA;;;ACPF,SAAS,gBAAgB,CAAC,YAA4B;AAAA,EAE3D,IAAI,aAAa,WACd,QAAQ,aAAa,EAAE,EACvB,QAAQ,YAAY,EAAE,EACtB,YAAY;AAAA,EAGf,aAAa,oBAAoB,UAAU;AAAA,EAG3C,MAAM,WAAW,CAAC,UAAU,cAAc,sBAAsB,YAAY;AAAA,EAC5E,IAAI,CAAC,cAAc,SAAS,SAAS,UAAU,GAAG;AAAA,IAEhD,aAAa,UAAU,oBAAoB,WAAW,YAAY,CAAC;AAAA,EACrE;AAAA,EAGA,IAAI,CAAC,SAAS,KAAK,UAAU,GAAG;AAAA,IAC9B,aAAa,KAAK;AAAA,EACpB;AAAA,EAGA,IAAI,WAAW,SAAS,IAAI;AAAA,IAC1B,aAAa,WAAW,UAAU,GAAG,EAAE;AAAA,EACzC;AAAA,EAEA,OAAO;AAAA;AAOT,SAAS,mBAAmB,CAAC,OAAuB;AAAA,EAClD,MAAM,QAAkB,CAAC;AAAA,EACzB,IAAI,oBAAoB;AAAA,EAExB,SAAS,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK;AAAA,IACrC,MAAM,OAAO,MAAM;AAAA,IAEnB,IAAI,WAAW,KAAK,IAAI,GAAG;AAAA,MACzB,MAAM,KAAK,IAAI;AAAA,MACf,oBAAoB;AAAA,IACtB,EAAO,SAAI,CAAC,mBAAmB;AAAA,MAE7B,MAAM,KAAK,GAAG;AAAA,MACd,oBAAoB;AAAA,IACtB;AAAA,EAEF;AAAA,EAGA,MAAM,SAAS,MAAM,KAAK,EAAE;AAAA,EAG5B,IAAI,QAAQ;AAAA,EACZ,IAAI,MAAM,OAAO;AAAA,EAEjB,OAAO,QAAQ,OAAO,OAAO,WAAW,KAAK;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,OAAO,MAAM,SAAS,OAAO,MAAM,OAAO,KAAK;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,OAAO,OAAO,MAAM,OAAO,GAAG;AAAA;AAAA,IAzJhC,cACA;AAAA;AAAA,EADA;AAAA,EACA;AAAA;;;AC2BA,SAAS,QAAU,CAAC,QAAkC;AAAA,EACpD,OAAO,OAAO;AAAA;AAAA;AAQT,MAAM,qBAAqB;AAAA,EACZ;AAAA,EAApB,WAAW,CAAS,IAAe;AAAA,IAAf;AAAA;AAAA,OAOd,iBAAgB,CAAC,aAAqB,UAAmC;AAAA,IAC7E,oBAAO,KAAK,EAAE,KAAK,cAAc,WAAW,GAAG,iCAAiC;AAAA,IAEhF,MAAM,SAAsC,CAAC;AAAA,IAC7C,MAAM,UAAkC,CAAC;AAAA,IACzC,MAAM,QAAoC,CAAC;AAAA,IAG3C,MAAM,YAAY,MAAM,KAAK,UAAU,UAAU;AAAA,IAEjD,WAAW,aAAa,WAAW;AAAA,MACjC,MAAM,YAAY,UAAU;AAAA,MAC5B,MAAM,cAAc,UAAU,gBAAgB;AAAA,MAE9C,oBAAO,MAAM,EAAE,KAAK,cAAc,aAAa,UAAU,GAAG,qBAAqB;AAAA,MAGjF,MAAM,UAAU,MAAM,KAAK,WAAW,aAAa,SAAS;AAAA,MAC5D,MAAM,gBAA8C,CAAC;AAAA,MACrD,MAAM,yBAAiE,CAAC;AAAA,MAExE,WAAW,OAAO,SAAS;AAAA,QACzB,cAAc,IAAI,eAAe;AAAA,UAC/B,MAAM,IAAI;AAAA,UACV,MAAM,IAAI;AAAA,UACV,YAAY,IAAI,cAAc;AAAA,UAC9B,SAAS,IAAI,gBAAgB;AAAA,UAC7B,SAAS,IAAI,iBACT,KAAK,aAAa,IAAI,gBAAgB,IAAI,SAAS,IACnD;AAAA,QACN;AAAA,MACF;AAAA,MAGA,MAAM,UAAU,MAAM,KAAK,WAAW,aAAa,SAAS;AAAA,MAC5D,MAAM,gBAA6C,CAAC;AAAA,MAEpD,WAAW,OAAO,SAAS;AAAA,QACzB,IAAI,CAAC,IAAI,cAAc,CAAC,IAAI,sBAAsB;AAAA,UAGhD,IAAI,IAAI,WAAW,MAAM,QAAQ,IAAI,OAAO,KAAK,IAAI,QAAQ,SAAS,GAAG;AAAA,YACvE,cAAc,IAAI,QAAQ;AAAA,cACxB,MAAM,IAAI;AAAA,cACV,SAAS,IAAI,QAAQ,IAAI,CAAC,SAAS;AAAA,gBACjC,YAAY;AAAA,gBACZ,cAAc;AAAA,cAChB,EAAE;AAAA,cACF,UAAU,IAAI;AAAA,cACd,QAAQ,IAAI,UAAU;AAAA,YACxB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MAGA,MAAM,cAAc,MAAM,KAAK,eAAe,aAAa,SAAS;AAAA,MACpE,MAAM,oBAAsD,CAAC;AAAA,MAE7D,WAAW,MAAM,aAAa;AAAA,QAC5B,kBAAkB,GAAG,QAAQ;AAAA,UAC3B,MAAM,GAAG;AAAA,UACT,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,SAAS,GAAG;AAAA,UACZ,UAAU,GAAG,wBAAwB;AAAA,UACrC,aAAa,CAAC,GAAG,WAAW;AAAA,UAC5B,WAAW,CAAC,GAAG,mBAAmB;AAAA,UAClC,UAAU,GAAG,YAAY,YAAY,KAAK;AAAA,UAC1C,UAAU,GAAG,YAAY,YAAY,KAAK;AAAA,QAC5C;AAAA,MACF;AAAA,MAGA,MAAM,cAAc,MAAM,KAAK,eAAe,aAAa,SAAS;AAAA,MACpE,MAAM,oBAAsD,CAAC;AAAA,MAE7D,WAAW,MAAM,aAAa;AAAA,QAC5B,kBAAkB,GAAG,QAAQ;AAAA,UAC3B,MAAM,GAAG;AAAA,UACT,SAAS,GAAG;AAAA,QACd;AAAA,MACF;AAAA,MAGA,MAAM,oBAAoB,MAAM,KAAK,qBAAqB,aAAa,SAAS;AAAA,MAEhF,WAAW,OAAO,mBAAmB;AAAA,QACnC,uBAAuB,IAAI,QAAQ;AAAA,UACjC,MAAM,IAAI;AAAA,UACV,SAAS,IAAI;AAAA,UACb,kBAAkB;AAAA,QACpB;AAAA,MACF;AAAA,MAGA,MAAM,mBAAmB,MAAM,KAAK,oBAAoB,aAAa,SAAS;AAAA,MAC9E,MAAM,eAAsD,CAAC;AAAA,MAE7D,WAAW,UAAS,kBAAkB;AAAA,QACpC,aAAa,OAAM,QAAQ;AAAA,UACzB,MAAM,OAAM;AAAA,UACZ,OAAO,OAAM;AAAA,QACf;AAAA,MACF;AAAA,MAGA,OAAO,GAAG,eAAe,eAAe;AAAA,QACtC,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,QACT,aAAa;AAAA,QACb,sBAAsB;AAAA,QACtB,mBAAmB;AAAA,QACnB,kBAAkB;AAAA,MACpB;AAAA,MAGA,IAAI,eAAe,gBAAgB,UAAU;AAAA,QAC3C,QAAQ,eAAe;AAAA,MACzB;AAAA,IACF;AAAA,IAGA,MAAM,cAAc,MAAM,KAAK,SAAS,UAAU;AAAA,IAClD,WAAW,YAAY,aAAa;AAAA,MAClC,MAAM,MAAM,GAAG,SAAS,UAAU,SAAS;AAAA,MAC3C,IAAI,CAAC,MAAM,MAAM;AAAA,QACf,MAAM,OAAO;AAAA,UACX,MAAM,SAAS;AAAA,UACf,QAAQ,SAAS;AAAA,UACjB,QAAQ,CAAC;AAAA,QACX;AAAA,MACF;AAAA,MACA,MAAM,KAAK,OAAO,KAAK,SAAS,KAAK;AAAA,IACvC;AAAA,IAEA,oBAAO,KACL,EAAE,KAAK,cAAc,YAAY,OAAO,KAAK,MAAM,EAAE,OAAO,GAC5D,iCACF;AAAA,IAEA,OAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,QACL,SAAS,CAAC;AAAA,QACV,QAAQ,CAAC;AAAA,QACT,SAAS,CAAC;AAAA,MACZ;AAAA,IACF;AAAA;AAAA,OAMY,UAAS,CAAC,YAA6C;AAAA,IACnE,MAAM,SAAS,MAAM,KAAK,GAAG,QAC3B;AAAA;AAAA;AAAA;AAAA,iCAI2B;AAAA;AAAA,8BAG7B;AAAA,IACA,OAAO,SAAsB,MAAM;AAAA;AAAA,OAMvB,WAAU,CAAC,YAAoB,WAA6C;AAAA,IACxF,MAAM,SAAS,MAAM,KAAK,GAAG,QAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAqCyB;AAAA,gCACC;AAAA,4BAE5B;AAAA,IACA,OAAO,SAAuB,MAAM;AAAA;AAAA,OAMxB,WAAU,CAAC,YAAoB,WAA4C;AAAA,IACvF,MAAM,SAAS,MAAM,KAAK,GAAG,QAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAmBwB;AAAA,8BACA,WAC1B;AAAA,IACA,OAAO,SAAsB,MAAM;AAAA;AAAA,OAMvB,eAAc,CAC1B,YACA,WAC8B;AAAA,IAC9B,MAAM,SAAS,MAAM,KAAK,GAAG,QAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCA8B0B;AAAA,gCACA,WAC5B;AAAA,IACA,OAAO,SAA2B,MAAM;AAAA;AAAA,OAM5B,eAAc,CAC1B,YACA,WAC8B;AAAA,IAC9B,MAAM,SAAS,MAAM,KAAK,GAAG,QAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAa0B;AAAA,gCACA,WAC5B;AAAA,IACA,OAAO,SAA2B,MAAM;AAAA;AAAA,OAM5B,qBAAoB,CAChC,YACA,WACoC;AAAA,IACpC,MAAM,SAAS,MAAM,KAAK,GAAG,QAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAa0B;AAAA,gCACA,WAC5B;AAAA,IACA,OAAO,SAAiC,MAAM;AAAA;AAAA,OAMlC,oBAAmB,CAC/B,YACA,WACmC;AAAA,IACnC,MAAM,SAAS,MAAM,KAAK,GAAG,QAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAO0B;AAAA,gCACA,WAC5B;AAAA,IACA,OAAO,SAAgC,MAAM;AAAA;AAAA,OAMjC,SAAQ,CAAC,YAA4C;AAAA,IACjE,MAAM,SAAS,MAAM,KAAK,GAAG,QAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAQwB;AAAA,4CAE1B;AAAA,IACA,OAAO,SAAqB,MAAM;AAAA;AAAA,EAM5B,YAAY,CAAC,cAAsB,UAAsC;AAAA,IAC/E,IAAI,CAAC;AAAA,MAAc;AAAA,IAGnB,MAAM,QAAQ,aAAa,MAAM,WAAW;AAAA,IAC5C,IAAI,OAAO;AAAA,MACT,OAAO,IAAI,MAAM;AAAA,IACnB;AAAA,IAGA,IAAI,aAAa,SAAS,UAAU,GAAG;AAAA,MACrC;AAAA,IACF;AAAA,IAGA,IAAI,aAAa,WAAW;AAAA,MAC1B,IAAI,iBAAiB;AAAA,QAAQ,OAAO;AAAA,MACpC,IAAI,iBAAiB;AAAA,QAAS,OAAO;AAAA,IACvC;AAAA,IAGA,OAAO;AAAA;AAAA,OAQH,kBAAiB,CAAC,YAAsC;AAAA,IAC5D,MAAM,aACJ,eAAe,wBAAwB,WAAW,iBAAiB,UAAU;AAAA,IAE/E,MAAM,SAAS,MAAM,KAAK,GAAG,QAC3B;AAAA;AAAA,iCAE2B;AAAA,0CAE7B;AAAA,IAEA,MAAM,WAAW,OAAO,KAAK;AAAA,IAC7B,MAAM,QAAQ,SAAU,YAAa,SAAS,SAAqB,KAAK,EAAE;AAAA,IAC1E,OAAO,QAAQ;AAAA;AAEnB;AAAA,IAleA,cACA;AAAA;AAAA,EACA;AAAA,EAFA;AAAA,EACA;AAAA;;;;;;;;ACaA,SAAS,aAAa,CAAC,MAAkC;AAAA,EACvD,IAAI,CAAC;AAAA,IAAM,OAAO;AAAA,EAElB,MAAM,aAAa,KAAK,YAAY,EAAE,KAAK;AAAA,EAG3C,IAAI,eAAe,iCAAiC,eAAe,4BAA4B;AAAA,IAC7F,OAAO;AAAA,EACT;AAAA,EAIA,IAAI,eAAe,UAAU;AAAA,IAC3B,OAAO;AAAA,EACT;AAAA,EACA,IAAI,eAAe,aAAa;AAAA,IAC9B,OAAO;AAAA,EACT;AAAA,EACA,IAAI,eAAe,eAAe;AAAA,IAChC,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,WAAW,WAAW,SAAS,KAAK,WAAW,WAAW,SAAS,GAAG;AAAA,IAExE,MAAM,QAAQ,WAAW,MAAM,yBAAyB;AAAA,IACxD,IAAI,OAAO;AAAA,MACT,OAAO,WAAW,MAAM,KAAK,MAAM,KAAK,IAAI,MAAM,OAAO;AAAA,IAC3D;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,WAAW,WAAW,mBAAmB,GAAG;AAAA,IAC9C,OAAO,WAAW,QAAQ,qBAAqB,SAAS;AAAA,EAC1D;AAAA,EAGA,IAAI,eAAe,YAAY,eAAe,SAAS;AAAA,IACrD,OAAO;AAAA,EACT;AAAA,EAEA,OAAO;AAAA;AAOT,SAAS,cAAc,CAAC,WAAwB,WAAiC;AAAA,EAE/E,IAAI,UAAU,aAAa,UAAU;AAAA,IAAU,OAAO;AAAA,EACtD,IAAI,UAAU,WAAW,UAAU;AAAA,IAAQ,OAAO;AAAA,EAClD,IAAI,UAAU,UAAU,UAAU;AAAA,IAAO,OAAO;AAAA,EAChD,IAAI,UAAU,iBAAiB,UAAU;AAAA,IAAc,OAAO;AAAA,EAG9D,MAAM,cAAc,UAAU,WAAW,CAAC;AAAA,EAC1C,MAAM,cAAc,UAAU,WAAW,CAAC;AAAA,EAE1C,IAAI,YAAY,WAAW,YAAY;AAAA,IAAQ,OAAO;AAAA,EAEtD,SAAS,IAAI,EAAG,IAAI,YAAY,QAAQ,KAAK;AAAA,IAC3C,MAAM,UAAU,YAAY;AAAA,IAC5B,MAAM,UAAU,YAAY;AAAA,IAG5B,IAAI,OAAO,YAAY,YAAY,OAAO,YAAY,UAAU;AAAA,MAC9D,IAAI,YAAY;AAAA,QAAS,OAAO;AAAA,IAClC,EAAO,SAAI,OAAO,YAAY,YAAY,OAAO,YAAY,UAAU;AAAA,MAErE,IAAI,QAAQ,eAAe,QAAQ;AAAA,QAAY,OAAO;AAAA,MACtD,IAAI,QAAQ,iBAAiB,QAAQ;AAAA,QAAc,OAAO;AAAA,MAC1D,IAAI,QAAQ,QAAQ,QAAQ;AAAA,QAAK,OAAO;AAAA,MACxC,IAAI,QAAQ,UAAU,QAAQ;AAAA,QAAO,OAAO;AAAA,IAC9C,EAAO;AAAA,MAEL,OAAO;AAAA;AAAA,EAEX;AAAA,EAEA,OAAO;AAAA;AAiFT,eAAsB,aAAa,CACjC,kBACA,iBACqB;AAAA,EACrB,MAAM,OAAmB;AAAA,IACvB,QAAQ;AAAA,MACN,SAAS,CAAC;AAAA,MACV,SAAS,CAAC;AAAA,MACV,UAAU,CAAC;AAAA,IACb;AAAA,IACA,SAAS;AAAA,MACP,OAAO,CAAC;AAAA,MACR,SAAS,CAAC;AAAA,MACV,UAAU,CAAC;AAAA,IACb;AAAA,IACA,SAAS;AAAA,MACP,SAAS,CAAC;AAAA,MACV,SAAS,CAAC;AAAA,MACV,SAAS,CAAC;AAAA,IACZ;AAAA,IACA,aAAa;AAAA,MACX,SAAS,CAAC;AAAA,MACV,SAAS,CAAC;AAAA,MACV,SAAS,CAAC;AAAA,IACZ;AAAA,IACA,mBAAmB;AAAA,MACjB,SAAS,CAAC;AAAA,MACV,SAAS,CAAC;AAAA,IACZ;AAAA,IACA,kBAAkB;AAAA,MAChB,SAAS,CAAC;AAAA,MACV,SAAS,CAAC;AAAA,IACZ;AAAA,EACF;AAAA,EAGA,IAAI,CAAC,kBAAkB;AAAA,IACrB,KAAK,OAAO,UAAU,OAAO,KAAK,gBAAgB,MAAM;AAAA,IAGxD,WAAW,aAAa,gBAAgB,QAAQ;AAAA,MAC9C,MAAM,QAAQ,gBAAgB,OAAO;AAAA,MAGrC,IAAI,MAAM,SAAS;AAAA,QACjB,WAAW,aAAa,MAAM,SAAS;AAAA,UACrC,KAAK,QAAQ,QAAQ,KAAK;AAAA,eACrB,MAAM,QAAQ;AAAA,YACjB,OAAO;AAAA,UACT,CAAoC;AAAA,QACtC;AAAA,MACF;AAAA,MAGA,IAAI,MAAM,aAAa;AAAA,QACrB,WAAW,UAAU,MAAM,aAAa;AAAA,UACtC,KAAK,YAAY,QAAQ,KAAK,MAAM,YAAY,OAAO;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAAA,IAEA,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,iBAAiB,UAAU,CAAC;AAAA,EAC/C,MAAM,aAAa,gBAAgB,UAAU,CAAC;AAAA,EAG9C,WAAW,aAAa,YAAY;AAAA,IAClC,IAAI,EAAE,aAAa,aAAa;AAAA,MAC9B,KAAK,OAAO,QAAQ,KAAK,SAAS;AAAA,MAElC,MAAM,QAAQ,WAAW;AAAA,MAGzB,IAAI,MAAM,SAAS;AAAA,QACjB,WAAW,aAAa,MAAM,SAAS;AAAA,UACrC,KAAK,QAAQ,QAAQ,KAAK;AAAA,eACrB,MAAM,QAAQ;AAAA,YACjB,OAAO;AAAA,UACT,CAAoC;AAAA,QACtC;AAAA,MACF;AAAA,MAGA,IAAI,MAAM,mBAAmB;AAAA,QAC3B,WAAW,UAAU,MAAM,mBAAmB;AAAA,UAC5C,KAAK,kBAAkB,QAAQ,KAAK;AAAA,eAC/B,MAAM,kBAAkB;AAAA,YAC3B,OAAO;AAAA,UACT,CAA+C;AAAA,QACjD;AAAA,MACF;AAAA,MAGA,IAAI,MAAM,kBAAkB;AAAA,QAC1B,WAAW,aAAa,MAAM,kBAAkB;AAAA,UAC9C,KAAK,iBAAiB,QAAQ,KAAK;AAAA,eAC9B,MAAM,iBAAiB;AAAA,YAC1B,OAAO;AAAA,UACT,CAA8C;AAAA,QAChD;AAAA,MACF;AAAA,MAGA,IAAI,MAAM,aAAa;AAAA,QACrB,WAAW,UAAU,MAAM,aAAa;AAAA,UACtC,KAAK,YAAY,QAAQ,KAAK,MAAM,YAAY,OAAO;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAGA,WAAW,aAAa,YAAY;AAAA,IAClC,IAAI,EAAE,aAAa,aAAa;AAAA,MAC9B,KAAK,OAAO,QAAQ,KAAK,SAAS;AAAA,IACpC;AAAA,EACF;AAAA,EAGA,WAAW,aAAa,YAAY;AAAA,IAClC,IAAI,aAAa,YAAY;AAAA,MAC3B,MAAM,YAAY,WAAW;AAAA,MAC7B,MAAM,YAAY,WAAW;AAAA,MAI7B,MAAM,gBAAgB,KAAK,UAAU;AAAA,QACnC,SAAS,UAAU,WAAW,CAAC;AAAA,QAC/B,SAAS,UAAU,WAAW,CAAC;AAAA,QAC/B,aAAa,UAAU,eAAe,CAAC;AAAA,QACvC,mBAAmB,UAAU,qBAAqB,CAAC;AAAA,QACnD,kBAAkB,UAAU,oBAAoB,CAAC;AAAA,MACnD,CAAC;AAAA,MAED,MAAM,gBAAgB,KAAK,UAAU;AAAA,QACnC,SAAS,UAAU,WAAW,CAAC;AAAA,QAC/B,SAAS,UAAU,WAAW,CAAC;AAAA,QAC/B,aAAa,UAAU,eAAe,CAAC;AAAA,QACvC,mBAAmB,UAAU,qBAAqB,CAAC;AAAA,QACnD,kBAAkB,UAAU,oBAAoB,CAAC;AAAA,MACnD,CAAC;AAAA,MAGD,IAAI,kBAAkB,eAAe;AAAA,QACnC;AAAA,MACF;AAAA,MAGA,MAAM,cAAc,UAAU,WAAW,CAAC;AAAA,MAC1C,MAAM,cAAc,UAAU,WAAW,CAAC;AAAA,MAG1C,WAAW,WAAW,aAAa;AAAA,QACjC,IAAI,EAAE,WAAW,cAAc;AAAA,UAC7B,KAAK,QAAQ,MAAM,KAAK;AAAA,YACtB,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,YAAY,YAAY;AAAA,UAC1B,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MAGA,WAAW,WAAW,aAAa;AAAA,QACjC,IAAI,EAAE,WAAW,cAAc;AAAA,UAC7B,KAAK,QAAQ,QAAQ,KAAK;AAAA,YACxB,OAAO;AAAA,YACP,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MAGA,WAAW,WAAW,aAAa;AAAA,QACjC,IAAI,WAAW,aAAa;AAAA,UAC1B,MAAM,UAAU,YAAY;AAAA,UAC5B,MAAM,UAAU,YAAY;AAAA,UAI5B,MAAM,cAAc,cAAc,QAAQ,IAAI,MAAM,cAAc,QAAQ,IAAI;AAAA,UAC9E,MAAM,aACJ,eACA,QAAQ,YAAY,QAAQ,WAC5B,QAAQ,YAAY,QAAQ,WAC5B,QAAQ,eAAe,QAAQ;AAAA,UAEjC,IAAI,YAAY;AAAA,YACd,KAAK,QAAQ,SAAS,KAAK;AAAA,cACzB,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,IAAI;AAAA,cACN;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,MAGA,MAAM,cAAc,UAAU,WAAW,CAAC;AAAA,MAC1C,MAAM,cAAc,UAAU,WAAW,CAAC;AAAA,MAG1C,WAAW,aAAa,aAAa;AAAA,QACnC,IAAI,EAAE,aAAa,cAAc;AAAA,UAE/B,KAAK,QAAQ,QAAQ,KAAK;AAAA,eACrB,YAAY;AAAA,YACf,OAAO;AAAA,UACT,CAAoC;AAAA,QACtC,EAAO;AAAA,UAEL,MAAM,YAAY,YAAY;AAAA,UAC9B,MAAM,YAAY,YAAY;AAAA,UAG9B,MAAM,eAAe,eAAe,WAAW,SAAS;AAAA,UAExD,IAAI,cAAc;AAAA,YAEhB,KAAK,QAAQ,QAAQ,KAAK;AAAA,cACxB,KAAK;AAAA,mBACA;AAAA,gBACH,OAAO;AAAA,gBACP,MAAM;AAAA,cACR;AAAA,cACA,KAAK;AAAA,mBACA;AAAA,gBACH,OAAO;AAAA,gBACP,MAAM;AAAA,cACR;AAAA,YACF,CAAC;AAAA,UACH;AAAA;AAAA,MAEJ;AAAA,MAGA,WAAW,aAAa,aAAa;AAAA,QACnC,IAAI,EAAE,aAAa,cAAc;AAAA,UAC/B,KAAK,QAAQ,QAAQ,KAAK;AAAA,eACrB,YAAY;AAAA,YACf,OAAO;AAAA,UACT,CAAoC;AAAA,QACtC;AAAA,MACF;AAAA,MAGA,MAAM,wBAAwB,UAAU,qBAAqB,CAAC;AAAA,MAC9D,MAAM,wBAAwB,UAAU,qBAAqB,CAAC;AAAA,MAG9D,WAAW,UAAU,uBAAuB;AAAA,QAC1C,IAAI,EAAE,UAAU,wBAAwB;AAAA,UACtC,KAAK,kBAAkB,QAAQ,KAAK;AAAA,eAC/B,sBAAsB;AAAA,YACzB,OAAO;AAAA,UACT,CAA+C;AAAA,QACjD;AAAA,MACF;AAAA,MAGA,WAAW,UAAU,uBAAuB;AAAA,QAC1C,IAAI,EAAE,UAAU,wBAAwB;AAAA,UACtC,KAAK,kBAAkB,QAAQ,KAAK;AAAA,eAC/B,sBAAsB;AAAA,YACzB,OAAO;AAAA,UACT,CAA+C;AAAA,QACjD;AAAA,MACF;AAAA,MAGA,MAAM,uBAAuB,UAAU,oBAAoB,CAAC;AAAA,MAC5D,MAAM,uBAAuB,UAAU,oBAAoB,CAAC;AAAA,MAG5D,WAAW,aAAa,sBAAsB;AAAA,QAC5C,IAAI,EAAE,aAAa,uBAAuB;AAAA,UACxC,KAAK,iBAAiB,QAAQ,KAAK;AAAA,eAC9B,qBAAqB;AAAA,YACxB,OAAO;AAAA,UACT,CAA8C;AAAA,QAChD;AAAA,MACF;AAAA,MAGA,WAAW,aAAa,sBAAsB;AAAA,QAC5C,IAAI,EAAE,aAAa,uBAAuB;AAAA,UACxC,KAAK,iBAAiB,QAAQ,KAAK;AAAA,eAC9B,qBAAqB;AAAA,YACxB,OAAO;AAAA,UACT,CAA8C;AAAA,QAChD;AAAA,MACF;AAAA,MAGA,MAAM,UAAU,UAAU,eAAe,CAAC;AAAA,MAC1C,MAAM,UAAU,UAAU,eAAe,CAAC;AAAA,MAG1C,WAAW,UAAU,SAAS;AAAA,QAC5B,IAAI,EAAE,UAAU,UAAU;AAAA,UAExB,KAAK,YAAY,QAAQ,KAAK,QAAQ,OAAO;AAAA,QAC/C,EAAO;AAAA,UAEL,MAAM,SAAS,QAAQ;AAAA,UACvB,MAAM,SAAS,QAAQ;AAAA,UAGvB,MAAM,eAAe,OAAO,YAAY;AAAA,UACxC,MAAM,eAAe,OAAO,YAAY;AAAA,UACxC,MAAM,eAAe,OAAO,YAAY;AAAA,UACxC,MAAM,eAAe,OAAO,YAAY;AAAA,UAExC,IAAI,iBAAiB,gBAAgB,iBAAiB,cAAc;AAAA,YAElE,KAAK,YAAY,QAAQ,KAAK;AAAA,cAC5B,KAAK;AAAA,cACL,KAAK;AAAA,YACP,CAAC;AAAA,UACH;AAAA;AAAA,MAEJ;AAAA,MAGA,WAAW,UAAU,SAAS;AAAA,QAC5B,IAAI,EAAE,UAAU,UAAU;AAAA,UACxB,MAAM,SAAS,QAAQ;AAAA,UACvB,KAAK,YAAY,QAAQ,KAAK;AAAA,eACzB;AAAA,YACH,WAAW;AAAA,UACb,CAAqB;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAMF,SAAS,cAAc,CAAC,MAA2B;AAAA,EACxD,OACE,KAAK,OAAO,QAAQ,SAAS,KAC7B,KAAK,OAAO,QAAQ,SAAS,KAC7B,KAAK,OAAO,SAAS,SAAS,KAC9B,KAAK,QAAQ,MAAM,SAAS,KAC5B,KAAK,QAAQ,QAAQ,SAAS,KAC9B,KAAK,QAAQ,SAAS,SAAS,KAC/B,KAAK,QAAQ,QAAQ,SAAS,KAC9B,KAAK,QAAQ,QAAQ,SAAS,KAC9B,KAAK,QAAQ,QAAQ,SAAS,KAC9B,KAAK,YAAY,QAAQ,SAAS,KAClC,KAAK,YAAY,QAAQ,SAAS,KAClC,KAAK,YAAY,QAAQ,SAAS,KAClC,KAAK,kBAAkB,QAAQ,SAAS,KACxC,KAAK,kBAAkB,QAAQ,SAAS,KACxC,KAAK,iBAAiB,QAAQ,SAAS,KACvC,KAAK,iBAAiB,QAAQ,SAAS;AAAA;;;ACrf3C,SAAS,sBAAsB,CAAC,QAAgE;AAAA,EAC9F,OACE,YAAY,WACX,OAAQ,OAAkC,aAAa,aACrD,OAAkC,aAAa;AAAA;AAOtD,SAAS,kBAAkB,CAAC,KAAqB;AAAA,EAC/C,OAAO,IAAI,QAAQ,MAAM,IAAI;AAAA;AAG/B,SAAS,aAAa,CAAC,SAA0B;AAAA,EAC/C,OAAO,QAAQ,MAAM,uBAAuB,MAAM;AAAA;AAGpD,SAAS,gBAAgB,CAAC,OAAuB,SAAyB;AAAA,EACxE,UAAU,QAAQ,MAAM,GAAG,EAAE;AAAA,EAC7B,MAAM,SAAS,MACZ,IAAI,CAAC,UAAU;AAAA,IACd,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU;AAAA,MAC1D,OAAO,MAAM,SAAS;AAAA,IACxB,EAAO,SAAI,OAAO,UAAU,WAAW;AAAA,MACrC,OAAO,QAAQ,SAAS;AAAA,IAC1B,EAAO,SAAI,MAAM,QAAQ,KAAK,GAAG;AAAA,MAC/B,OAAO,iBAAiB,OAAO,OAAO;AAAA,IACxC,EAAO,SAAI,iBAAiB,MAAM;AAAA,MAChC,IAAI,YAAY,QAAQ;AAAA,QACtB,OAAO,IAAI,MAAM,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,MAC5C,EAAO,SAAI,YAAY,aAAa;AAAA,QAClC,OAAO,IAAI,MAAM,YAAY,EAAE,QAAQ,KAAK,GAAG,EAAE,MAAM,GAAG,EAAE;AAAA,MAC9D,EAAO;AAAA,QACL,OAAO,IAAI,MAAM,YAAY;AAAA;AAAA,IAEjC,EAAO,SAAI,OAAO,UAAU,UAAU;AAAA,MACpC,OAAO,IAAI,KAAK,UAAU,KAAK,EAAE,WAAW,KAAK,MAAK;AAAA,IACxD;AAAA,IAEA,OAAO,IAAI;AAAA,GACZ,EACA,KAAK,GAAG;AAAA,EAEX,OAAO,IAAI;AAAA;AAab,SAAS,uBAAuB,CAAC,QAAkC;AAAA,EACjE,MAAM,SAAoB,CAAC;AAAA,EAG3B,MAAM,WAAU,OAAO,OAAO,MAAM;AAAA,EACpC,SAAQ,QAAQ,CAAC,MAAe;AAAA,IAE9B,IAAI,wBAAG,GAAG,wBAAO,GAAG;AAAA,MAClB,OAAO,KAAK,CAAC;AAAA,IACf;AAAA,GACD;AAAA,EAED,OAAO;AAAA;AAOT,eAAsB,gBAAgB,CAAC,QAAgD;AAAA,EACrF,MAAM,UAAU,IAAI,2BAAU,EAAE,QAAQ,UAAU,CAAC;AAAA,EACnD,MAAM,SAAsC,CAAC;AAAA,EAC7C,MAAM,UAAkC,CAAC;AAAA,EACzC,MAAM,QAAoC,CAAC;AAAA,EAG3C,MAAM,WAAW,wBAAwB,MAAM;AAAA,EAG/C,WAAW,SAAS,UAAU;AAAA,IAC5B,MAAM,SAAS,gCAAe,KAAK;AAAA,IACnC;AAAA,MACE,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,IAEJ,MAAM,gBAA8C,CAAC;AAAA,IACrD,MAAM,gBAA6C,CAAC;AAAA,IACpD,MAAM,oBAAsD,CAAC;AAAA,IAC7D,MAAM,oBAAsD,CAAC;AAAA,IAC7D,MAAM,yBAAiE,CAAC;AAAA,IACxE,MAAM,eAAsD,CAAC;AAAA,IAG7D,QAAQ,QAAQ,CAAC,WAAqB;AAAA,MACpC,MAAM,OAAO,OAAO;AAAA,MACpB,MAAM,UAAU,OAAO;AAAA,MACvB,MAAM,cAAa,OAAO;AAAA,MAC1B,MAAM,UAAU,OAAO,WAAW;AAAA,MAClC,MAAM,iBAAiB,QAAQ,YAAY;AAAA,MAE3C,MAAM,cAA4B;AAAA,QAChC;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,MAGA,IAAI,OAAO,YAAY,WAAW;AAAA,QAChC,IAAI,wBAAG,OAAO,SAAS,wBAAG,GAAG;AAAA,UAC3B,YAAY,UAAU,SAAS,OAAO,SAAS,SAAS;AAAA,QAC1D,EAAO;AAAA,UACL,IAAI,OAAO,OAAO,YAAY,UAAU;AAAA,YACtC,YAAY,UAAU,IAAI,mBAAmB,OAAO,OAAO;AAAA,UAC7D,EAAO;AAAA,YACL,IAAI,mBAAmB,WAAW,mBAAmB,QAAQ;AAAA,cAC3D,YAAY,UAAU,IAAI,KAAK,UAAU,OAAO,OAAO,OAAO;AAAA,YAChE,EAAO,SAAI,OAAO,mBAAmB,MAAM;AAAA,cACzC,IAAI,mBAAmB,QAAQ;AAAA,gBAC7B,YAAY,UAAU,IAAI,OAAO,QAAQ,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,cACpE,EAAO,SAAI,mBAAmB,aAAa;AAAA,gBACzC,YAAY,UAAU,IAAI,OAAO,QAAQ,YAAY,EAAE,QAAQ,KAAK,GAAG,EAAE,MAAM,GAAG,EAAE;AAAA,cACtF,EAAO;AAAA,gBACL,YAAY,UAAU,IAAI,OAAO,QAAQ,YAAY;AAAA;AAAA,YAEzD,EAAO,SAAI,cAAc,cAAc,KAAK,MAAM,QAAQ,OAAO,OAAO,GAAG;AAAA,cACzE,YAAY,UAAU,IAAI,iBAAiB,OAAO,SAA2B,cAAc;AAAA,YAC7F,EAAO;AAAA,cAGL,YAAY,UAAU,OAAO;AAAA;AAAA;AAAA;AAAA,MAIrC;AAAA,MAMA,MAAM,eAAe,uBAAuB,MAAM,IAAI,OAAO,SAAS;AAAA,MACtE,IAAI,uBAAuB,MAAM,KAAK,OAAO,YAAY,cAAc,YAAY;AAAA,QACjF,uBAAuB,aAAa,cAAc;AAAA,UAChD,MAAM,aAAa;AAAA,UACnB,SAAS,CAAC,IAAI;AAAA,UACd,kBAAkB,aAAa,eAAe;AAAA,QAChD;AAAA,MACF;AAAA,MAEA,cAAc,QAAQ;AAAA,KACvB;AAAA,IASD,YAAY,QAAQ,CAAC,OAA0B;AAAA,MAC7C,MAAM,cAAc,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,MAChD,MAAM,OAAO,GAAG,QAAQ;AAAA,MAExB,kBAAkB,QAAQ;AAAA,QACxB;AAAA,QACA,SAAS;AAAA,MACX;AAAA,KACD;AAAA,IAUD,kBAAkB,QAAQ,CAAC,QAAiC;AAAA,MAC1D,MAAM,cAAc,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,MACjD,MAAM,OAAO,IAAI,QAAQ,GAAG,aAAa,YAAY,KAAK,GAAG;AAAA,MAE7D,uBAAuB,QAAQ;AAAA,QAC7B;AAAA,QACA,SAAS;AAAA,QACT,kBAAkB,IAAI;AAAA,MACxB;AAAA,KACD;AAAA,IAkBD,YAAY,QAAQ,CAAC,OAA0B;AAAA,MAC7C,MAAM,YAAY,GAAG,UAAU;AAAA,MAC/B,MAAM,cAAc,UAAU,QAAQ,IAAI,CAAC,OAAO,GAAG,IAAI;AAAA,MACzD,MAAM,YAAY,UAAU,eAAe,IAAI,CAAC,OAAO,GAAG,IAAI;AAAA,MAC9D,MAAM,UAAU,gCAAe,UAAU,YAAY,EAAE;AAAA,MACvD,MAAM,WAAW,gCAAe,UAAU,YAAY,EAAE,UAAU;AAAA,MAElE,MAAM,OAAO,GAAG,QAAQ;AAAA,MAExB,kBAAkB,QAAQ;AAAA,QACxB;AAAA,QACA,WAAW;AAAA,QACX,YAAY;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,GAAG,YAAY;AAAA,QACzB,UAAU,GAAG,YAAY;AAAA,MAC3B;AAAA,KACD;AAAA,IAwBA,QAA2B,QAAQ,CAAC,QAAsB;AAAA,MACzD,MAAM,YAAY,IAAI,OAAO;AAAA,MAC7B,MAAM,eAA8B,UAAU,IAAI,CAAC,QAAQ;AAAA,QACzD,IAAI,wBAAG,KAAK,wBAAG,GAAG;AAAA,UAChB,OAAO;AAAA,YACL,YAAY,QAAQ,WAAW,GAAG,EAAE;AAAA,YACpC,cAAc;AAAA,UAChB;AAAA,QACF,EAAO;AAAA,UACL,MAAM,WAAwB;AAAA,YAC5B,YAAY,IAAI;AAAA,YAChB,cAAc;AAAA,YACd,KAAK,IAAI,eAAe,IAAI,YAAY,UAAU;AAAA,UACpD;AAAA,UAEA,IAAI,IAAI,aAAa,OAAO;AAAA,YAC1B,SAAS,QAAQ,IAAI,YAAY;AAAA,UACnC;AAAA,UACA,OAAO;AAAA;AAAA,OAEV;AAAA,MAED,MAAM,OACJ,IAAI,OAAO,QAAQ,GAAG,aAAa,aAAa,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,GAAG;AAAA,MAEnF,cAAc,QAAQ;AAAA,QACpB;AAAA,QACA,SAAS;AAAA,QACT,UAAU,IAAI,OAAO,UAAU;AAAA,QAC/B,QAAQ,IAAI,OAAO,UAAU;AAAA,MAC/B;AAAA,KACD;AAAA,IASD,IAAI,QAAQ;AAAA,MACV,OAAO,QAAQ,CAAC,WAAwB;AAAA,QACtC,MAAM,YAAY,OAAM;AAAA,QACxB,aAAa,aAAa;AAAA,UACxB,MAAM;AAAA,UACN,OAAO,QAAQ,WAAW,OAAM,KAAK,EAAE;AAAA,QACzC;AAAA,OACD;AAAA,IACH;AAAA,IAGA,OAAO,GAAG,eAAe,YAAY,eAAe;AAAA,MAClD,MAAM;AAAA,MACN,QAAQ,eAAe;AAAA,MACvB,SAAS;AAAA,MACT,SAAS;AAAA,MACT,aAAa;AAAA,MACb,sBAAsB;AAAA,MACtB,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,IACpB;AAAA,IAGA,IAAI,eAAe,gBAAgB,UAAU;AAAA,MAC3C,QAAQ,eAAe;AAAA,IACzB;AAAA,EACF;AAAA,EAGA,MAAM,WAA2B;AAAA,IAC/B,SAAS;AAAA,IACT,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,QAAQ,CAAC;AAAA,MACT,SAAS,CAAC;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAOF,SAAS,YAAY,CAAC,UAAkC;AAAA,EAC7D,MAAM,UAAU,KAAK,UAAU,QAAQ;AAAA,EACvC,OAAO,aAAa,OAAO;AAAA;AAwBtB,SAAS,UAAU,CACxB,kBACA,iBACS;AAAA,EAET,IAAI,CAAC,kBAAkB;AAAA,IACrB,OAAO,OAAO,KAAK,gBAAgB,MAAM,EAAE,SAAS;AAAA,EACtD;AAAA,EAIA,MAAM,WAAW,aAAa,gBAAgB;AAAA,EAC9C,MAAM,WAAW,aAAa,eAAe;AAAA,EAE7C,OAAO,aAAa;AAAA;AAAA,IA/atB,sBACA,kBAuFM,oBAEA,WAAW,CAAC,OAAU,YAAgC;AAAA,EAC1D,OAAO,mBAAmB,WAAW,KAAG,EAAE;AAAA;AAAA;AAAA,EA3F5C;AAAA,EACA;AAAA,EAuFM,qBAAqB,IAAI,2BAAU,EAAE,QAAQ,UAAU,CAAC;AAAA;;;ACpDvD,SAAS,gBAAgB,CAAC,MAAiC;AAAA,EAChE,MAAM,SAAwB;AAAA,IAC5B,aAAa;AAAA,IACb,gBAAgB,CAAC;AAAA,IACjB,iBAAiB,CAAC;AAAA,IAClB,kBAAkB,CAAC;AAAA,IACnB,aAAa,CAAC;AAAA,IACd,UAAU,CAAC;AAAA,IACX,sBAAsB;AAAA,EACxB;AAAA,EAGA,IAAI,KAAK,OAAO,QAAQ,SAAS,GAAG;AAAA,IAClC,OAAO,cAAc;AAAA,IACrB,OAAO,uBAAuB;AAAA,IAC9B,OAAO,iBAAiB,CAAC,GAAG,KAAK,OAAO,OAAO;AAAA,IAC/C,WAAW,SAAS,KAAK,OAAO,SAAS;AAAA,MACvC,OAAO,SAAS,KAAK,UAAU,0CAA0C;AAAA,IAC3E;AAAA,EACF;AAAA,EAGA,IAAI,KAAK,QAAQ,QAAQ,SAAS,GAAG;AAAA,IACnC,OAAO,cAAc;AAAA,IACrB,OAAO,uBAAuB;AAAA,IAC9B,WAAW,OAAO,KAAK,QAAQ,SAAS;AAAA,MACtC,OAAO,gBAAgB,KAAK,GAAG,IAAI,SAAS,IAAI,QAAQ;AAAA,MACxD,OAAO,SAAS,KAAK,WAAW,IAAI,qBAAqB,IAAI,wBAAwB;AAAA,IACvF;AAAA,EACF;AAAA,EAGA,WAAW,YAAY,KAAK,QAAQ,UAAU;AAAA,IAC5C,MAAM,OAAO,SAAS,QAAQ;AAAA,IAC9B,MAAM,KAAK,SAAS,QAAQ;AAAA,IAE5B,IAAI,CAAC,QAAQ,CAAC;AAAA,MAAI;AAAA,IAGlB,IAAI,KAAK,SAAS,GAAG,MAAM;AAAA,MACzB,MAAM,gBAAgB,+BAA+B,KAAK,MAAM,GAAG,IAAI;AAAA,MAEvE,IAAI,eAAe;AAAA,QACjB,OAAO,cAAc;AAAA,QACrB,OAAO,uBAAuB;AAAA,QAC9B,OAAO,YAAY,KAAK;AAAA,UACtB,OAAO,SAAS;AAAA,UAChB,QAAQ,SAAS;AAAA,UACjB,MAAM,KAAK;AAAA,UACX,IAAI,GAAG;AAAA,QACT,CAAC;AAAA,QACD,OAAO,iBAAiB,KAAK,SAAS,KAAK;AAAA,QAC3C,OAAO,SAAS,KACd,WAAW,SAAS,qBAAqB,SAAS,6BAA6B,KAAK,aAAa,GAAG,YAClG,wEACJ;AAAA,MACF;AAAA,IACF;AAAA,IAGA,IAAI,CAAC,KAAK,WAAW,GAAG,WAAW,CAAC,GAAG,SAAS;AAAA,MAC9C,OAAO,cAAc;AAAA,MACrB,OAAO,uBAAuB;AAAA,MAC9B,OAAO,SAAS,KACd,WAAW,SAAS,qBAAqB,SAAS,0DAChD,mDACJ;AAAA,IACF;AAAA,EACF;AAAA,EAGA,WAAW,SAAS,KAAK,QAAQ,OAAO;AAAA,IACtC,IAAI,MAAM,WAAW,WAAW,CAAC,MAAM,WAAW,SAAS;AAAA,MAGzD,OAAO,SAAS,KACd,WAAW,MAAM,oCAAoC,MAAM,iDACzD,4CACJ;AAAA,IAEF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAOT,SAAS,cAAa,CAAC,MAAkC;AAAA,EACvD,IAAI,CAAC;AAAA,IAAM,OAAO;AAAA,EAElB,MAAM,aAAa,KAAK,YAAY,EAAE,KAAK;AAAA,EAG3C,IACE,eAAe,iCACf,eAAe,8BACf,eAAe,eACf;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAIA,IAAI,eAAe,UAAU;AAAA,IAC3B,OAAO;AAAA,EACT;AAAA,EACA,IAAI,eAAe,aAAa;AAAA,IAC9B,OAAO;AAAA,EACT;AAAA,EACA,IAAI,eAAe,eAAe;AAAA,IAChC,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,WAAW,WAAW,SAAS,KAAK,WAAW,WAAW,SAAS,GAAG;AAAA,IAExE,MAAM,QAAQ,WAAW,MAAM,yBAAyB;AAAA,IACxD,IAAI,OAAO;AAAA,MACT,OAAO,WAAW,MAAM,KAAK,MAAM,KAAK,IAAI,MAAM,OAAO;AAAA,IAC3D;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,WAAW,WAAW,mBAAmB,GAAG;AAAA,IAC9C,OAAO,WAAW,QAAQ,qBAAqB,SAAS;AAAA,EAC1D;AAAA,EAGA,IAAI,eAAe,YAAY,eAAe,SAAS;AAAA,IACrD,OAAO;AAAA,EACT;AAAA,EAEA,OAAO;AAAA;AAOT,SAAS,8BAA8B,CAAC,UAAkB,QAAyB;AAAA,EAEjF,MAAM,iBAAiB,eAAc,QAAQ;AAAA,EAC7C,MAAM,eAAe,eAAc,MAAM;AAAA,EAGzC,IAAI,mBAAmB,cAAc;AAAA,IACnC,OAAO;AAAA,EACT;AAAA,EAGA,MAAM,kBAA4C;AAAA,IAChD,UAAU,CAAC,WAAW,UAAU,WAAW,QAAQ,kBAAkB;AAAA,IACrE,SAAS,CAAC,UAAU,WAAW,QAAQ,kBAAkB;AAAA,IACzD,QAAQ,CAAC,SAAS;AAAA,IAClB,MAAM,CAAC,kBAAkB;AAAA,IACzB,SAAS,CAAC,MAAM;AAAA,IAChB,MAAM,CAAC,WAAW,MAAM;AAAA,IACxB,QAAQ,CAAC,MAAM;AAAA,IACf,MAAM,CAAC,QAAQ;AAAA,IAEf,MAAM,CAAC,QAAQ,SAAS;AAAA,IAExB,WAAW,CAAC,WAAW;AAAA,IAEvB,MAAM,CAAC,WAAW;AAAA,IAClB,MAAM,CAAC,QAAQ;AAAA,EACjB;AAAA,EAEA,MAAM,WAAW,eAAe,MAAM,GAAG,EAAE;AAAA,EAC3C,MAAM,SAAS,aAAa,MAAM,GAAG,EAAE;AAAA,EAGvC,IAAI,aAAa,QAAQ;AAAA,IACvB,OAAO;AAAA,EACT;AAAA,EAGA,MAAM,SAAS,gBAAgB;AAAA,EAC/B,IAAI,QAAQ,SAAS,MAAM,GAAG;AAAA,IAC5B,OAAO;AAAA,EACT;AAAA,EAGA,OAAO;AAAA;AAOT,eAAsB,oBAAoB,CACxC,kBACA,iBACA,MACmB;AAAA,EACnB,MAAM,aAAuB,CAAC;AAAA,EAG9B,IAAI,CAAC,MAAM;AAAA,IACT,QAAQ,kCAAkB;AAAA,IAC1B,OAAO,MAAM,eAAc,kBAAkB,eAAe;AAAA,EAC9D;AAAA,EAGA,MAAM,gBAAgB,iBAAiB,IAAI;AAAA,EAG3C,IAAI,cAAc,SAAS,SAAS,GAAG;AAAA,IACrC,oBAAO,KACL,EAAE,KAAK,cAAc,UAAU,cAAc,SAAS,GACtD,oCACF;AAAA,EACF;AAAA,EAGA,MAAM,kBAAkB,IAAI;AAAA,EAC5B,WAAW,aAAa,KAAK,OAAO,SAAS;AAAA,IAC3C,MAAM,QAAQ,gBAAgB,OAAO;AAAA,IACrC,IAAI,OAAO;AAAA,MACT,MAAM,SAAS,MAAM,UAAU;AAAA,MAC/B,IAAI,WAAW,UAAU;AAAA,QACvB,gBAAgB,IAAI,MAAM;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA,EAGA,WAAW,UAAU,iBAAiB;AAAA,IACpC,WAAW,KAAK,gCAAgC,UAAU;AAAA,EAC5D;AAAA,EAGA,MAAM,wBAAkC,CAAC;AAAA,EACzC,MAAM,uBAAiC,CAAC;AAAA,EAExC,WAAW,aAAa,KAAK,OAAO,SAAS;AAAA,IAC3C,MAAM,QAAQ,gBAAgB,OAAO;AAAA,IACrC,IAAI,OAAO;AAAA,MACT,QAAQ,UAAU,WAAW,uBAAuB,WAAW,KAAK;AAAA,MACpE,sBAAsB,KAAK,QAAQ;AAAA,MACnC,qBAAqB,KAAK,GAAG,MAAM;AAAA,IACrC;AAAA,EACF;AAAA,EAGA,WAAW,KAAK,GAAG,qBAAqB;AAAA,EAIxC,MAAM,YAAY,IAAI;AAAA,EACtB,MAAM,sBAAgC,CAAC;AAAA,EAEvC,WAAW,SAAS,sBAAsB;AAAA,IAExC,MAAM,QAAQ,MAAM,MAAM,0BAA0B;AAAA,IACpD,IAAI,OAAO;AAAA,MACT,MAAM,iBAAiB,MAAM;AAAA,MAC7B,IAAI,CAAC,UAAU,IAAI,cAAc,GAAG;AAAA,QAClC,UAAU,IAAI,cAAc;AAAA,QAC5B,oBAAoB,KAAK,KAAK;AAAA,MAChC;AAAA,IACF,EAAO;AAAA,MACL,oBAAoB,KAAK,KAAK;AAAA;AAAA,EAElC;AAAA,EAEA,WAAW,KAAK,GAAG,mBAAmB;AAAA,EAKtC,WAAW,aAAa,KAAK,OAAO,SAAS;AAAA,IAC3C,OAAO,QAAQ,QAAQ,UAAU,SAAS,GAAG,IAAI,UAAU,MAAM,GAAG,IAAI,CAAC,UAAU,SAAS;AAAA,IAC5F,WAAW,KAAK,yBAAyB,YAAY,gBAAgB;AAAA,EACvE;AAAA,EAIA,WAAW,SAAS,KAAK,QAAQ,OAAO;AAAA,IACtC,WAAW,KAAK,qBAAqB,MAAM,OAAO,MAAM,QAAQ,MAAM,UAAU,CAAC;AAAA,EACnF;AAAA,EAGA,WAAW,WAAW,KAAK,QAAQ,SAAS;AAAA,IAC1C,WAAW,KAAK,sBAAsB,QAAQ,OAAO,QAAQ,MAAM,CAAC;AAAA,EACtE;AAAA,EAGA,WAAW,YAAY,KAAK,QAAQ,UAAU;AAAA,IAC5C,MAAM,kBAAkB,uBACtB,SAAS,OACT,SAAS,QACT,SAAS,OACX;AAAA,IACA,WAAW,KAAK,GAAG,eAAe;AAAA,EACpC;AAAA,EAGA,WAAW,WAAS,KAAK,QAAQ,SAAS;AAAA,IACxC,WAAW,KAAK,qBAAqB,OAAK,CAAC;AAAA,EAC7C;AAAA,EAGA,WAAW,gBAAgB,KAAK,QAAQ,SAAS;AAAA,IAC/C,WAAW,KAAK,qBAAqB,aAAa,GAAG,CAAC;AAAA,EACxD;AAAA,EAGA,WAAW,WAAS,KAAK,QAAQ,SAAS;AAAA,IACxC,WAAW,KAAK,uBAAuB,OAAK,CAAC;AAAA,EAC/C;AAAA,EAGA,WAAW,gBAAgB,KAAK,QAAQ,SAAS;AAAA,IAC/C,WAAW,KAAK,uBAAuB,aAAa,GAAG,CAAC;AAAA,EAC1D;AAAA,EAGA,WAAW,cAAc,KAAK,kBAAkB,SAAS;AAAA,IAEvD,MAAM,aAAa,KAAK,OAAO,QAAQ,KAAK,CAAC,cAAc;AAAA,MACzD,OAAO,QAAQ,SAAS,UAAU,SAAS,GAAG,IAC1C,UAAU,MAAM,GAAG,IACnB,CAAC,UAAU,SAAS;AAAA,MACxB,MAAM,kBACH,WAA2D,SAAS;AAAA,MACvE,OAAO,kBAAkB,uBAAuB,gBAAgB,SAAS,GAAG,IACxE,gBAAgB,MAAM,GAAG,IACzB,CAAC,UAAU,eAAe;AAAA,MAC9B,OAAO,UAAU,uBAAuB,WAAW;AAAA,KACpD;AAAA,IAED,IAAI,CAAC,YAAY;AAAA,MACf,WAAW,KAAK,kCAAkC,UAAU,CAAC;AAAA,IAC/D;AAAA,EACF;AAAA,EAGA,WAAW,cAAc,KAAK,kBAAkB,SAAS;AAAA,IACvD,WAAW,KAAK,gCAAgC,UAAU,CAAC;AAAA,EAC7D;AAAA,EAGA,WAAW,cAAc,KAAK,iBAAiB,SAAS;AAAA,IAEtD,MAAM,aAAa,KAAK,OAAO,QAAQ,KAAK,CAAC,cAAc;AAAA,MACzD,OAAO,QAAQ,SAAS,UAAU,SAAS,GAAG,IAC1C,UAAU,MAAM,GAAG,IACnB,CAAC,UAAU,SAAS;AAAA,MACxB,MAAM,kBACH,WAA0D,SAAS;AAAA,MACtE,OAAO,kBAAkB,uBAAuB,gBAAgB,SAAS,GAAG,IACxE,gBAAgB,MAAM,GAAG,IACzB,CAAC,UAAU,eAAe;AAAA,MAC9B,OAAO,UAAU,uBAAuB,WAAW;AAAA,KACpD;AAAA,IAED,IAAI,CAAC,YAAY;AAAA,MACf,WAAW,KAAK,iCAAiC,UAAU,CAAC;AAAA,IAC9D;AAAA,EACF;AAAA,EAGA,WAAW,cAAc,KAAK,iBAAiB,SAAS;AAAA,IACtD,WAAW,KAAK,+BAA+B,UAAU,CAAC;AAAA,EAC5D;AAAA,EAGA,WAAW,MAAM,KAAK,YAAY,SAAS;AAAA,IACzC,WAAW,KAAK,0BAA0B,EAAE,CAAC;AAAA,EAC/C;AAAA,EAGA,WAAW,aAAa,KAAK,YAAY,SAAS;AAAA,IAChD,WAAW,KAAK,0BAA0B,UAAU,GAAG,CAAC;AAAA,EAC1D;AAAA,EAGA,WAAW,MAAM,KAAK,YAAY,SAAS;AAAA,IAGzC,MAAM,YAAY,GAAG,aAAa;AAAA,IAClC,MAAM,aAAa,GAAG,cAAc;AAAA,IAEpC,MAAM,aAAa,KAAK,OAAO,QAAQ,KAAK,CAAC,cAAc;AAAA,MAEzD,OAAO,eAAe,gBAAgB,UAAU,SAAS,GAAG,IACxD,UAAU,MAAM,GAAG,IACnB,CAAC,UAAU,SAAS;AAAA,MAGxB,OAAO,iBAAiB,aAAa,kBAAkB;AAAA,KACxD;AAAA,IAED,IAAI,CAAC,YAAY;AAAA,MACf,WAAW,KAAK,4BAA4B,EAAE,CAAC;AAAA,IACjD;AAAA,EACF;AAAA,EAGA,WAAW,aAAa,KAAK,YAAY,SAAS;AAAA,IAChD,WAAW,KAAK,4BAA4B,UAAU,GAAG,CAAC;AAAA,EAC5D;AAAA,EAEA,OAAO;AAAA;AAOT,SAAS,sBAAsB,CAC7B,eACA,OACwC;AAAA,EACxC,OAAO,QAAQ,aAAa,cAAc,SAAS,GAAG,IAClD,cAAc,MAAM,GAAG,IACvB,CAAC,UAAU,aAAa;AAAA,EAC5B,MAAM,UAAoB,CAAC;AAAA,EAC3B,MAAM,SAAmB,CAAC;AAAA,EAG1B,YAAY,SAAS,WAAW,OAAO,QAAQ,MAAM,WAAW,CAAC,CAAC,GAAG;AAAA,IACnE,QAAQ,KAAK,yBAAyB,SAAS,MAAM,CAAC;AAAA,EACxD;AAAA,EAGA,MAAM,cAAc,MAAM,wBAAwB,CAAC;AAAA,EACnD,YAAY,QAAQ,UAAU,OAAO,QAAQ,WAAW,GAAG;AAAA,IACzD,MAAM,KAAK;AAAA,IACX,IAAI,GAAG,WAAW,GAAG,QAAQ,SAAS,GAAG;AAAA,MACvC,QAAQ,KACN,eAAe,wBAAwB,GAAG,QAAQ,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,KAAK,IAAI,IAClF;AAAA,IACF;AAAA,EACF;AAAA,EAGA,MAAM,oBAAoB,MAAM,qBAAqB,CAAC;AAAA,EACtD,YAAY,QAAQ,UAAU,OAAO,QAAQ,iBAAiB,GAAG;AAAA,IAC/D,MAAM,KAAK;AAAA,IACX,IAAI,GAAG,WAAW,GAAG,QAAQ,SAAS,GAAG;AAAA,MACvC,MAAM,YAAY,GAAG,mBACjB,eAAe,sCAAsC,GAAG,QAAQ,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,KAAK,IAAI,OAC9F,eAAe,mBAAmB,GAAG,QAAQ,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,KAAK,IAAI;AAAA,MAC/E,QAAQ,KAAK,SAAS;AAAA,IACxB;AAAA,EACF;AAAA,EAGA,MAAM,mBAAmB,MAAM,oBAAoB,CAAC;AAAA,EACpD,YAAY,WAAW,aAAa,OAAO,QAAQ,gBAAgB,GAAG;AAAA,IACpE,MAAM,SAAQ;AAAA,IACd,IAAI,OAAM,OAAO;AAAA,MACf,QAAQ,KAAK,eAAe,qBAAqB,OAAM,QAAQ;AAAA,IACjE;AAAA,EACF;AAAA,EAGA,MAAM,WAAW,+BAA+B,YAAY;AAAA,IAAmB,QAAQ,KAAK;AAAA,GAAO;AAAA;AAAA,EAGnG,MAAM,cAAc,MAAM,eAAe,CAAC;AAAA,EAC1C,YAAY,QAAQ,UAAU,OAAO,QAAQ,WAAW,GAAG;AAAA,IACzD,MAAM,KAAK;AAAA,IACX,MAAM,QAAQ,4BACZ,QACA,6BAA6B;AAAA,SACxB;AAAA,MACH,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,WAAW;AAAA,IACb,CAAC,CACH;AAAA,IACA,OAAO,KAAK,KAAK;AAAA,EACnB;AAAA,EAEA,OAAO,EAAE,UAAU,OAAO;AAAA;AAM5B,SAAS,wBAAwB,CAAC,MAAc,KAA2B;AAAA,EACzE,IAAI,QAAM,IAAI,SAAS,IAAI;AAAA,EAG3B,IAAI,IAAI,cAAc,CAAC,IAAI,KAAK,SAAS,QAAQ,GAAG;AAAA,IAClD,SAAO;AAAA,EACT;AAAA,EAGA,IAAI,IAAI,SAAS;AAAA,IACf,SAAO;AAAA,EACT;AAAA,EAGA,IAAI,IAAI,YAAY,WAAW;AAAA,IAC7B,MAAM,eAAe,mBAAmB,IAAI,SAAS,IAAI,IAAI;AAAA,IAC7D,SAAO,YAAY;AAAA,EACrB;AAAA,EAEA,OAAO;AAAA;AAOT,SAAS,oBAAoB,CAAC,OAAe,QAAgB,YAAkC;AAAA,EAC7F,OAAO,QAAQ,aAAa,MAAM,SAAS,GAAG,IAAI,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,KAAK;AAAA,EACrF,MAAM,sBAAsB,IAAI,YAAY;AAAA,EAG5C,MAAM,QAAkB,CAAC,IAAI,SAAS;AAAA,EAGtC,MAAM,KAAK,WAAW,IAAI;AAAA,EAG1B,IAAI,WAAW,YAAY;AAAA,IACzB,MAAM,KAAK,aAAa;AAAA,EAC1B;AAAA,EAGA,IAAI,WAAW,YAAY,WAAW;AAAA,IACpC,MAAM,eAAe,mBAAmB,WAAW,SAAS,WAAW,IAAI;AAAA,IAC3E,IAAI,cAAc;AAAA,MAChB,MAAM,KAAK,WAAW,cAAc;AAAA,IACtC;AAAA,EACF;AAAA,EAGA,MAAM,0BAA0B;AAAA,EAGhC,IAAI,wBAAwB,WAAW;AAAA,IACrC,MAAM,KAAK,wBAAwB,wBAAwB,mBAAmB;AAAA,EAChF;AAAA,EAGA,IAAI,WAAW,SAAS;AAAA,IACtB,MAAM,KAAK,UAAU;AAAA,EACvB;AAAA,EAMA,OAAO,eAAe,gDAAgD,MAAM,KAAK,GAAG;AAAA;AAOtF,SAAS,qBAAqB,CAAC,OAAe,QAAwB;AAAA,EACpE,OAAO,QAAQ,aAAa,MAAM,SAAS,GAAG,IAAI,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,KAAK;AAAA,EACrF,MAAM,sBAAsB,IAAI,YAAY;AAAA,EAE5C,OAAO,eAAe,8CAA8C;AAAA;AAatE,SAAS,sBAAsB,CAC7B,OACA,QACA,SACU;AAAA,EACV,OAAO,QAAQ,aAAa,MAAM,SAAS,GAAG,IAAI,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,KAAK;AAAA,EACrF,MAAM,sBAAsB,IAAI,YAAY;AAAA,EAC5C,MAAM,aAAuB,CAAC;AAAA,EAG9B,MAAM,YAAY,QAAQ;AAAA,EAC1B,MAAM,cAAc,QAAQ;AAAA,EAC5B,MAAM,gBAAgB,WAAW;AAAA,EACjC,MAAM,kBAAkB,aAAa;AAAA,EACrC,IAAI,kBAAkB,iBAAiB;AAAA,IACrC,MAAM,UAAU,iBAAiB;AAAA,IAGjC,MAAM,aAAa,wBAAwB,mBAAmB,IAAI,OAAO;AAAA,IAEzE,IAAI,YAAY;AAAA,MAEd,WAAW,KACT,eAAe,qCAAqC,gBAAgB,iBAAiB,qBAAqB,QAAQ,mBAAmB,IAAI,OAAO,IAClJ;AAAA,IACF,EAAO;AAAA,MACL,WAAW,KACT,eAAe,qCAAqC,yBAAyB,UAC/E;AAAA;AAAA,EAEJ;AAAA,EAGA,MAAM,mBAAmB,WAAW;AAAA,EACpC,MAAM,qBAAqB,aAAa;AAAA,EACxC,IAAI,qBAAqB,oBAAoB;AAAA,IAC3C,IAAI,kBAAkB;AAAA,MAEpB,WAAW,KAAK,eAAe,qCAAqC,uBAAuB;AAAA,IAC7F,EAAO;AAAA,MACL,WAAW,KAAK,eAAe,qCAAqC,wBAAwB;AAAA;AAAA,EAEhG;AAAA,EAGA,MAAM,mBAAmB,WAAW;AAAA,EACpC,MAAM,qBAAqB,aAAa;AAAA,EACxC,IAAI,qBAAqB,oBAAoB;AAAA,IAC3C,IAAI,qBAAqB,WAAW;AAAA,MAClC,MAAM,eAAe,mBAAmB,kBAAkB,iBAAiB,EAAE;AAAA,MAC7E,WAAW,KACT,eAAe,qCAAqC,uBAAuB,eAC7E;AAAA,IACF,EAAO;AAAA,MACL,WAAW,KAAK,eAAe,qCAAqC,uBAAuB;AAAA;AAAA,EAE/F;AAAA,EAEA,OAAO;AAAA;AAUT,SAAS,oBAAoB,CAAC,QAAgB,UAAkB,QAAwB;AAAA,EACtF,MAAM,OAAO,SAAS,MAAM,GAAG,EAAE,GAAG,YAAY,EAAE,KAAK;AAAA,EACvD,MAAM,KAAK,OAAO,MAAM,GAAG,EAAE,GAAG,YAAY,EAAE,KAAK;AAAA,EACnD,IAAI,SAAS,aAAa,OAAO,WAAW;AAAA,IAC1C,OAAO,IAAI,YAAY;AAAA,EACzB;AAAA,EACA,OAAO,IAAI,kBAAkB;AAAA;AAO/B,SAAS,uBAAuB,CAAC,UAAkB,QAAyB;AAAA,EAC1E,IAAI,CAAC,YAAY,CAAC;AAAA,IAAQ,OAAO;AAAA,EAGjC,IAAI,SAAS,SAAS,MAAM,KAAK,OAAO,SAAS,MAAM,GAAG;AAAA,IACxD,OAAO;AAAA,EACT;AAAA,EAMA,MAAM,iBAAgB,CAAC,MAAc;AAAA,IACnC,MAAM,OAAO,EAAE,MAAM,GAAG,EAAE,GAAG,YAAY,EAAE,KAAK;AAAA,IAChD,OAAO,SAAS,sBAAsB,YAAY;AAAA;AAAA,EAEpD,MAAM,WAAW,eAAc,QAAQ;AAAA,EACvC,MAAM,SAAS,eAAc,MAAM;AAAA,EAGnC,KACG,aAAa,UAAU,aAAa,eACpC,WAAW,WAAW,WAAW,SAClC;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EAGA,MAAM,kBAAkB;AAAA,IACtB,CAAC,WAAW,SAAS;AAAA,IACrB,CAAC,WAAW,SAAS;AAAA,IACrB,CAAC,QAAQ,SAAS;AAAA,IAClB,CAAC,QAAQ,SAAS;AAAA,IAClB,CAAC,QAAQ,SAAS;AAAA,IAClB,CAAC,QAAQ,MAAM;AAAA,IACf,CAAC,QAAQ,OAAO;AAAA,IAChB,CAAC,QAAQ,MAAM;AAAA,IACf,CAAC,WAAW,SAAS;AAAA,IACrB,CAAC,WAAW,SAAS;AAAA,IACrB,CAAC,WAAW,SAAS;AAAA,IACrB,CAAC,WAAW,MAAM;AAAA,IAClB,CAAC,WAAW,OAAO;AAAA,IACnB,CAAC,WAAW,MAAM;AAAA,EAEpB;AAAA,EAEA,YAAY,MAAM,OAAO,iBAAiB;AAAA,IACxC,IAAK,aAAa,QAAQ,WAAW,MAAQ,aAAa,MAAM,WAAW,MAAO;AAAA,MAChF,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAUT,SAAS,kBAAkB,CAAC,OAAqB,MAAsB;AAAA,EAErE,IAAI,UAAU,QAAQ,UAAU,QAAQ;AAAA,IACtC,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,SAAS,KAAK,YAAY,EAAE,SAAS,SAAS,KAAK,KAAK,YAAY,MAAM,SAAS;AAAA,IACrF,IAAI,UAAU,QAAQ,UAAU,UAAU,UAAU,OAAO,UAAU,GAAG;AAAA,MACtE,OAAO;AAAA,IACT;AAAA,IACA,IAAI,UAAU,SAAS,UAAU,WAAW,UAAU,OAAO,UAAU,GAAG;AAAA,MACxE,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAGA,IAAI,KAAK,MAAM,yDAAyD,GAAG;AAAA,IACzE,OAAO,OAAO,KAAK;AAAA,EACrB;AAAA,EAGA,IAAI,OAAO,UAAU,UAAU;AAAA,IAG7B,IAAI,MAAM,SAAS,IAAI,GAAG;AAAA,MACxB,OAAO;AAAA,IACT;AAAA,IAIA,IAAI,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAAG;AAAA,MAChD,OAAO;AAAA,IACT;AAAA,IAGA,IAAI,MAAM,MAAM,WAAW,KAAM,MAAM,SAAS,GAAG,KAAK,MAAM,SAAS,GAAG,GAAI;AAAA,MAC5E,OAAO;AAAA,IACT;AAAA,IAGA,IAAI,MAAM,YAAY,EAAE,WAAW,UAAU,GAAG;AAAA,MAC9C,OAAO;AAAA,IACT;AAAA,IAGA,OAAO,IAAI,MAAM,QAAQ,MAAM,IAAI;AAAA,EACrC;AAAA,EAGA,OAAO,OAAO,KAAK;AAAA;AAsBrB,SAAS,sBAAsB,CAAC,SAAwC;AAAA,EACtE,MAAM,UAAS,QAAM,WAAW,YAAY;AAAA,EAC5C,MAAM,SAAS,QAAM,UAAU;AAAA,EAC/B,MAAM,UAAU,QAAM,QACnB,IAAI,CAAC,MAAM;AAAA,IACV,IAAI,EAAE,cAAc;AAAA,MAClB,OAAO,EAAE;AAAA,IACX;AAAA,IAEA,OAAO,IAAI,EAAE,cAAc,EAAE,QAAQ,QAAQ,UAAU;AAAA,GACxD,EACA,KAAK,IAAI;AAAA,EAGZ,MAAM,YAAY,QAAM,KAAK,SAAS,GAAG,IAAI,QAAM,KAAK,MAAM,GAAG,EAAE,KAAK,QAAM;AAAA,EAG9E,IAAI;AAAA,EACJ,MAAM,aAAa,QAAM;AAAA,EACzB,IAAI,YAAY,SAAS,GAAG,GAAG;AAAA,IAC7B,OAAO,QAAQ,SAAS,WAAW,MAAM,GAAG;AAAA,IAC5C,WAAW,IAAI,YAAY;AAAA,EAC7B,EAAO;AAAA,IACL,WAAW,IAAI,cAAc;AAAA;AAAA,EAI/B,OAAO,UAAU,+BAA8B,iBAAiB,kBAAkB,WAAW;AAAA;AAM/F,SAAS,oBAAoB,CAAC,SAAqC;AAAA,EAEjE,MAAM,gBAAgB,OAAO,YAAU,WAAW,UAAQ,QAAM;AAAA,EAChE,MAAM,YAAY,cAAc,SAAS,GAAG,IAAI,cAAc,MAAM,GAAG,EAAE,KAAK;AAAA,EAE9E,OAAO,yBAAyB;AAAA;AAMlC,SAAS,2BAA2B,CAAC,IAA8B;AAAA,EACjE,OAAO,4BAA4B,GAAG,MAAM,6BAA6B,EAAE,CAAC;AAAA;AAM9E,SAAS,yBAAyB,CAAC,IAA8B;AAAA,EAC/D,OAAO,QAAQ,aAAa,GAAG,YAC3B,GAAG,UAAU,SAAS,GAAG,IACvB,GAAG,UAAU,MAAM,GAAG,IACtB,CAAC,UAAU,GAAG,SAAS,IACzB,CAAC,UAAU,EAAE;AAAA,EACjB,OAAO,gBAAgB,YAAY,+BAA+B,GAAG;AAAA;AAgCvE,SAAS,iCAAiC,CAAC,YAA+C;AAAA,EACxF,MAAM,QAAQ,WAAW,SAAS;AAAA,EAClC,OAAO,QAAQ,aAAa,MAAM,SAAS,GAAG,IAAI,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,KAAK;AAAA,EAErF,MAAM,OAAO,WAAW;AAAA,EACxB,MAAM,UAAU,WAAW,QAAQ,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,KAAK,IAAI;AAAA,EAEjE,IAAI,QAAM,gBAAgB,YAAY,8BAA8B;AAAA,EAGpE,IAAI,WAAW,kBAAkB;AAAA,IAC/B,SAAO;AAAA,EACT;AAAA,EAEA,SAAO,KAAK;AAAA,EAEZ,OAAO;AAAA;AAMT,SAAS,+BAA+B,CAAC,YAA+C;AAAA,EACtF,MAAM,QAAQ,WAAW,SAAS;AAAA,EAClC,OAAO,QAAQ,aAAa,MAAM,SAAS,GAAG,IAAI,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,KAAK;AAAA,EAErF,OAAO,gBAAgB,YAAY,+BAA+B,WAAW;AAAA;AAM/E,SAAS,gCAAgC,CAAC,YAA8C;AAAA,EACtF,MAAM,QAAQ,WAAW,SAAS;AAAA,EAClC,OAAO,QAAQ,aAAa,MAAM,SAAS,GAAG,IAAI,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,KAAK;AAAA,EAErF,MAAM,OAAO,WAAW;AAAA,EACxB,MAAM,QAAQ,WAAW;AAAA,EAEzB,OAAO,gBAAgB,YAAY,8BAA8B,gBAAgB;AAAA;AAMnF,SAAS,8BAA8B,CAAC,YAA8C;AAAA,EACpF,MAAM,QAAQ,WAAW,SAAS;AAAA,EAClC,OAAO,QAAQ,aAAa,MAAM,SAAS,GAAG,IAAI,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,KAAK;AAAA,EAErF,OAAO,gBAAgB,YAAY,+BAA+B,WAAW;AAAA;AAG/E,SAAS,4BAA4B,CAAC,IAA8B;AAAA,EAClE,MAAM,aAAa,GAAG,cAAc;AAAA,EACpC,MAAM,WAAW,GAAG,YAAY;AAAA,EAChC,MAAM,YAAY,GAAG;AAAA,EACrB,MAAM,cAAc,GAAG,YAAY,IAAI,CAAC,MAAc,IAAI,IAAI,EAAE,KAAK,IAAI;AAAA,EACzE,MAAM,YAAY,GAAG,UAAU,IAAI,CAAC,MAAc,IAAI,IAAI,EAAE,KAAK,IAAI;AAAA,EAErE,IAAI,QAAM,gBAAgB,gBAAgB,8BAA8B,GAAG,sBAAsB,4BAA4B,cAAc,GAAG,aAAa;AAAA,EAE3J,IAAI,GAAG,UAAU;AAAA,IACf,SAAO,cAAc,GAAG;AAAA,EAC1B;AAAA,EAEA,IAAI,GAAG,UAAU;AAAA,IACf,SAAO,cAAc,GAAG;AAAA,EAC1B;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,2BAA2B,CAAC,gBAAwB,WAA2B;AAAA,EACtF,MAAM,wBAAwB,eAAe,QAAQ,MAAM,IAAI;AAAA,EAC/D,OAAO,2EAA2E,gCAAgC;AAAA;AAAA,IA/9BpH;AAAA;AAAA;AAAA;;;ACIO,MAAM,iBAAiB;AAAA,EACR;AAAA,EAApB,WAAW,CAAS,IAAe;AAAA,IAAf;AAAA;AAAA,OAEd,0BAAyB,CAAC,YAAqC;AAAA,IACnE,WAAW,aAAa,YAAY;AAAA,MAClC,IAAI;AAAA,QAGF,IAAI,CAAC,mBAAmB,KAAK,SAAS,GAAG;AAAA,UACvC,oBAAO,KACL,EAAE,KAAK,cAAc,UAAU,GAC/B,sDACF;AAAA,UACA;AAAA,QACF;AAAA,QAGA,MAAM,KAAK,GAAG,QAAQ,0DAAqC,yBAAI,WAAW,SAAS,GAAG;AAAA,QACtF,oBAAO,MAAM,EAAE,KAAK,cAAc,UAAU,GAAG,qBAAqB;AAAA,QACpE,OAAO,OAAO;AAAA,QACd,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC1E,oBAAO,KACL,EAAE,KAAK,cAAc,WAAW,OAAO,aAAa,GACpD,6BACF;AAAA;AAAA,IAIJ;AAAA;AAEJ;AAAA,IAlCA,cACA;AAAA;AAAA,EADA;AAAA,EACA;AAAA;;;ACGO,MAAM,eAAe;AAAA,EACN;AAAA,EAApB,WAAW,CAAS,IAAe;AAAA,IAAf;AAAA;AAAA,OAEd,YAAW,CAAC,YAA6C;AAAA,IAC7D,MAAM,SAAS,MAAM,KAAK,GAAG,QAC3B;AAAA;AAAA,gCAE0B,YAC5B;AAAA,IAEA,IAAI,OAAO,KAAK,WAAW,GAAG;AAAA,MAC5B,OAAO;AAAA,IACT;AAAA,IAOA,MAAM,MAAM,OAAmB,MAAM;AAAA,IACrC,IAAI,CAAC,KAAK;AAAA,MACR,MAAM,IAAI,MAAM,iCAAiC,YAAY;AAAA,IAC/D;AAAA,IACA,OAAO;AAAA,MACL,SAAS,IAAI;AAAA,MACb,SAAS,IAAI;AAAA,MACb,SAAS,IAAI;AAAA,IACf;AAAA;AAAA,OAGI,YAAW,CAAC,YAAoB,SAAiC;AAAA,IACrE,MAAM,KAAK,GAAG,QACZ;AAAA,oBACc,eAAe,QAAQ,YAAY,QAAQ,YAAY,KAAK,UAAU,QAAQ,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,uCAMrG;AAAA;AAAA,OAGI,SAAQ,CAAC,YAAoB,OAAoC;AAAA,IAErE,IAAI,UAAU,MAAM,KAAK,YAAY,UAAU;AAAA,IAG/C,IAAI,CAAC,SAAS;AAAA,MACZ,UAAU;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS,CAAC;AAAA,MACZ;AAAA,IACF;AAAA,IAGA,QAAQ,QAAQ,KAAK,KAAK;AAAA,IAG1B,MAAM,KAAK,YAAY,YAAY,OAAO;AAAA;AAAA,OAGtC,WAAU,CAAC,YAAqC;AAAA,IACpD,MAAM,UAAU,MAAM,KAAK,YAAY,UAAU;AAAA,IAEjD,IAAI,CAAC,WAAW,QAAQ,QAAQ,WAAW,GAAG;AAAA,MAC5C,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,YAAY,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAAA,IAC3D,OAAO,UAAU,MAAM;AAAA;AAAA,OAGnB,cAAa,CACjB,YACA,KACA,KACA,cAAuB,MACR;AAAA,IACf,MAAM,QAAsB;AAAA,MAC1B;AAAA,MACA,SAAS;AAAA,MACT,MAAM,KAAK,IAAI;AAAA,MACf;AAAA,MACA;AAAA,IACF;AAAA,IAEA,MAAM,KAAK,SAAS,YAAY,KAAK;AAAA;AAEzC;AAAA,IA7FA;AAAA;AAAA;AAAA;;;ACIO,MAAM,iBAAiB;AAAA,EACR;AAAA,EAApB,WAAW,CAAS,IAAe;AAAA,IAAf;AAAA;AAAA,OAEd,aAAY,GAAkB;AAAA,IAClC,MAAM,KAAK,GAAG,QAAQ,gEAA2C;AAAA;AAAA,OAG7D,aAAY,GAAkB;AAAA,IAElC,MAAM,KAAK,aAAa;AAAA,IAGxB,MAAM,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAOrB;AAAA,IAGD,MAAM,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAOrB;AAAA,IAGD,MAAM,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KASrB;AAAA;AAAA,OAGG,iBAAgB,CAAC,YAIb;AAAA,IACR,MAAM,SAAS,MAAM,KAAK,GAAG,QAC3B;AAAA;AAAA,gCAE0B;AAAA;AAAA,kBAG5B;AAAA,IAMA,OAAO,OAAqB,MAAM,KAAK;AAAA;AAAA,OAGnC,gBAAe,CAAC,YAAoB,MAAc,WAAkC;AAAA,IACxF,MAAM,KAAK,GAAG,QACZ;AAAA,oBACc,eAAe,SAAS,YACxC;AAAA;AAEJ;AAAA,IA1EA;AAAA;AAAA;AAAA;;;ACGO,MAAM,gBAAgB;AAAA,EACP;AAAA,EAApB,WAAW,CAAS,IAAe;AAAA,IAAf;AAAA;AAAA,OAEd,aAAY,CAAC,YAAoB,KAAa,UAAyC;AAAA,IAC3F,MAAM,KAAK,GAAG,QACZ;AAAA,oBACc,eAAe,QAAQ,KAAK,UAAU,QAAQ;AAAA;AAAA;AAAA;AAAA,+BAK9D;AAAA;AAAA,OAGI,aAAY,CAAC,YAAoB,KAA6C;AAAA,IAClF,MAAM,SAAS,MAAM,KAAK,GAAG,QAC3B;AAAA;AAAA,gCAE0B,wBAAwB,KACpD;AAAA,IAEA,IAAI,OAAO,KAAK,WAAW,GAAG;AAAA,MAC5B,OAAO;AAAA,IACT;AAAA,IAEA,OAAO,OAAO,KAAK,GAAG;AAAA;AAAA,OAGlB,kBAAiB,CAAC,YAAoD;AAAA,IAC1E,MAAM,SAAS,MAAM,KAAK,GAAG,QAC3B;AAAA;AAAA,gCAE0B;AAAA;AAAA,kBAG5B;AAAA,IAEA,IAAI,OAAO,KAAK,WAAW,GAAG;AAAA,MAC5B,OAAO;AAAA,IACT;AAAA,IAEA,OAAO,OAAO,KAAK,GAAG;AAAA;AAAA,OAGlB,gBAAe,CAAC,YAA+C;AAAA,IACnE,MAAM,SAAS,MAAM,KAAK,GAAG,QAC3B;AAAA;AAAA,gCAE0B;AAAA,2BAE5B;AAAA,IAEA,OAAO,OAAO,KAAK,IAAI,CAAC,QAAQ,IAAI,QAA0B;AAAA;AAElE;AAAA,IAzDA;AAAA;AAAA;AAAA;;;ACmBO,MAAM,gBAAgB;AAAA,EAOP;AAAA,EANZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,WAAW,CAAS,IAAe;AAAA,IAAf;AAAA,IAClB,KAAK,mBAAmB,IAAI,iBAAiB,EAAE;AAAA,IAC/C,KAAK,iBAAiB,IAAI,eAAe,EAAE;AAAA,IAC3C,KAAK,kBAAkB,IAAI,gBAAgB,EAAE;AAAA,IAC7C,KAAK,mBAAmB,IAAI,iBAAiB,EAAE;AAAA,IAC/C,KAAK,eAAe,IAAI,qBAAqB,EAAE;AAAA;AAAA,EAQzC,qBAAqB,CAAC,YAA4B;AAAA,IAExD,IAAI,eAAe,uBAAuB;AAAA,MACxC,OAAO;AAAA,IACT;AAAA,IAGA,OAAO,iBAAiB,UAAU;AAAA;AAAA,OAMtB,mBAAkB,CAAC,UAAyC;AAAA,IACxE,MAAM,kBAAkB,IAAI;AAAA,IAG5B,WAAW,SAAS,OAAO,OAAO,SAAS,MAAM,GAAG;AAAA,MAClD,MAAM,aAAa,MAAM,UAAU;AAAA,MACnC,IAAI,eAAe,UAAU;AAAA,QAC3B,gBAAgB,IAAI,UAAU;AAAA,MAChC;AAAA,IACF;AAAA,IAGA,WAAW,UAAU,OAAO,KAAK,SAAS,WAAW,CAAC,CAAC,GAAG;AAAA,MACxD,IAAI,WAAW,UAAU;AAAA,QACvB,gBAAgB,IAAI,MAAM;AAAA,MAC5B;AAAA,IACF;AAAA,IAGA,WAAW,cAAc,iBAAiB;AAAA,MACxC,oBAAO,MAAM,EAAE,KAAK,cAAc,WAAW,GAAG,wBAAwB;AAAA,MACxE,MAAM,KAAK,GAAG,QAAQ,yBAAI,IAAI,gCAAgC,aAAa,CAAC;AAAA,IAC9E;AAAA;AAAA,EAMM,mBAAmB,CAAC,YAAoB,UAAgC;AAAA,IAC9E,MAAM,iBAAiB,KAAK,sBAAsB,UAAU;AAAA,IAC5D,MAAM,eAAe,eAAe;AAAA,IAEpC,WAAW,SAAS,OAAO,OAAO,SAAS,MAAM,GAAG;AAAA,MAClD,MAAM,eAAe,MAAM,UAAU;AAAA,MAGrC,IAAI,CAAC,gBAAgB,iBAAiB,UAAU;AAAA,QAC9C,oBAAO,KACL;AAAA,UACE,KAAK;AAAA,UACL;AAAA,UACA,WAAW,MAAM;AAAA,UACjB;AAAA,QACF,GACA,oFACF;AAAA,MACF;AAAA,MAGA,IAAI,gBAAgB,iBAAiB,UAAU;AAAA,QAC7C,oBAAO,KACL;AAAA,UACE,KAAK;AAAA,UACL,YAAY;AAAA,UACZ,WAAW,MAAM;AAAA,UACjB;AAAA,QACF,GACA,4CACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA,EASM,iBAAiB,CAAC,YAA4B;AAAA,IACpD,OAAO,eAAe,UAAU;AAAA;AAAA,EAO1B,cAAc,CAAC,OAAwB;AAAA,IAC7C,MAAM,aAAa,CAAC;AAAA,IACpB,MAAM,aAAa;AAAA,IACnB,OAAO,SAAS,cAAc,SAAS;AAAA;AAAA,EAOjC,sBAAsB,CAAC,eAAgC;AAAA,IAC7D,IAAI,CAAC,cAAc,KAAK;AAAA,MAAG,OAAO;AAAA,IAElC,MAAM,MAAM,cAAc,KAAK,EAAE,YAAY;AAAA,IAG7C,MAAM,eAAe,CAAC,YAAY,aAAa,cAAc,cAAc,gBAAgB;AAAA,IAC3F,IAAI,aAAa,KAAK,CAAC,MAAM,IAAI,WAAW,CAAC,CAAC;AAAA,MAAG,OAAO;AAAA,IAGxD,IAAI,IAAI,SAAS,UAAU;AAAA,MAAG,OAAO;AAAA,IAIrC,MAAM,YAAY;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,UAAU,KAAK,CAAC,MAAM,IAAI,WAAW,CAAC,CAAC;AAAA,MAAG,OAAO;AAAA,IAGrD,MAAM,kBAAkB,CAAC,UAAU,QAAQ;AAAA,IAC3C,MAAM,UAAU,IAAI,MAAM,GAAG,EAAE;AAAA,IAC/B,IAAI,gBAAgB,KAAK,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC;AAAA,MAAG,OAAO;AAAA,IACzD,IAAI,yBAAyB,KAAK,OAAO;AAAA,MAAG,OAAO;AAAA,IAGnD,IAAI,IAAI,SAAS,WAAW,KAAK,IAAI,SAAS,WAAW;AAAA,MAAG,OAAO;AAAA,IAGnE,MAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,WAAW,KAAK,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC;AAAA,MAAG,OAAO;AAAA,IAGpD,IAAI,IAAI,SAAS,GAAG,MAAM,IAAI,SAAS,UAAU,KAAK,WAAW,KAAK,GAAG;AAAA,MAAI,OAAO;AAAA,IAGpF,IAAI,iDAAiD,KAAK,GAAG;AAAA,MAAG,OAAO;AAAA,IAGvE,MAAM,gBAAgB;AAAA,MAEpB;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MAEA;AAAA,MAEA;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MAEA;AAAA,MAEA;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MAEA;AAAA,MAEA;AAAA,MAEA;AAAA,MAEA;AAAA,MAEA;AAAA,MACA;AAAA,MAEA;AAAA,MAEA;AAAA,MAEA;AAAA,MAEA;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,cAAc,KAAK,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC;AAAA,MAAG,OAAO;AAAA,IAGvD,IAAI,6CAA6C,KAAK,GAAG;AAAA,MAAG,OAAO;AAAA,IACnE,IAAI,6BAA6B,KAAK,aAAa;AAAA,MAAG,OAAO;AAAA,IAG7D,IAAI,sCAAsC,KAAK,aAAa;AAAA,MAAG,OAAO;AAAA,IAEtE,oBAAO,MACL,EAAE,KAAK,cAAc,YAAY,IAAI,UAAU,GAAG,EAAE,EAAE,GACtD,yDACF;AAAA,IACA,OAAO;AAAA;AAAA,OAOH,WAAU,GAAkB;AAAA,IAChC,oBAAO,KAAK,EAAE,KAAK,aAAa,GAAG,+BAA+B;AAAA,IAClE,MAAM,KAAK,iBAAiB,aAAa;AAAA,IACzC,oBAAO,KAAK,EAAE,KAAK,aAAa,GAAG,8BAA8B;AAAA;AAAA,OAU7D,QAAO,CACX,YACA,QACA,UAAmC,CAAC,GACrB;AAAA,IACf,MAAM,SAAS,KAAK,kBAAkB,UAAU;AAAA,IAGhD,IAAI,CAAC,KAAK,eAAe,MAAM,GAAG;AAAA,MAChC,MAAM,IAAI,MAAM,iDAAiD,YAAY;AAAA,IAC/E;AAAA,IAEA,IAAI,eAAe;AAAA,IAEnB,IAAI;AAAA,MACF,oBAAO,KAAK,EAAE,KAAK,cAAc,WAAW,GAAG,+BAA+B;AAAA,MAG9E,MAAM,KAAK,WAAW;AAAA,MAItB,MAAM,cAAc,QAAQ,IAAI,gBAAgB,QAAQ,IAAI,gBAAgB;AAAA,MAC5E,MAAM,iBAAiB,KAAK,uBAAuB,WAAW;AAAA,MAE9D,IAAI,gBAAgB;AAAA,QAClB,IAAI;AAAA,UACF,oBAAO,MAAM,EAAE,KAAK,cAAc,WAAW,GAAG,iCAAiC;AAAA,UAIjF,MAAM,YAAY,OAAO,SAAS;AAAA,UAElC,MAAM,aAAa,MAAM,KAAK,GAAG,QAC/B,4DAAuC,mCACzC;AAAA,UAKA,eAAe,OAAsB,UAAU,GAAG,aAAa;AAAA,UAE/D,IAAI,CAAC,cAAc;AAAA,YACjB,oBAAO,KACL,EAAE,KAAK,cAAc,WAAW,GAChC,iDACF;AAAA,YAGA,MAAM,KAAK,GAAG,QAAQ,wDAAmC,uBAAuB;AAAA,YAChF,eAAe;AAAA,YAEf,oBAAO,KAAK,EAAE,KAAK,cAAc,WAAW,GAAG,eAAe;AAAA,UAChE,EAAO;AAAA,YACL,oBAAO,MACL,EAAE,KAAK,cAAc,YAAY,QAAQ,UAAU,GACnD,wBACF;AAAA;AAAA,UAEF,OAAO,WAAW;AAAA,UAGlB,oBAAO,KACL;AAAA,YACE,KAAK;AAAA,YACL;AAAA,YACA,OAAO,qBAAqB,QAAQ,UAAU,UAAU,OAAO,SAAS;AAAA,UAC1E,GACA,0DACF;AAAA,UACA,eAAe;AAAA;AAAA,MAEnB,EAAO;AAAA,QAEL,oBAAO,MACL,EAAE,KAAK,aAAa,GACpB,wDACF;AAAA;AAAA,MAKF,MAAM,aAAa,iBACf,CAAC,UAAU,iBAAiB,UAAU,IACtC,CAAC,UAAU,eAAe;AAAA,MAC9B,MAAM,KAAK,iBAAiB,0BAA0B,UAAU;AAAA,MAGhE,MAAM,kBAAkB,MAAM,iBAAiB,MAAM;AAAA,MAGrD,MAAM,KAAK,mBAAmB,eAAe;AAAA,MAG7C,KAAK,oBAAoB,YAAY,eAAe;AAAA,MAEpD,MAAM,cAAc,aAAa,eAAe;AAAA,MAOhD,MAAM,gBAAgB,MAAM,KAAK,iBAAiB,iBAAiB,UAAU;AAAA,MAC7E,IAAI,iBAAiB,cAAc,SAAS,aAAa;AAAA,QACvD,oBAAO,KACL,EAAE,KAAK,cAAc,YAAY,MAAM,YAAY,GACnD,yCACF;AAAA,QACA;AAAA,MACF;AAAA,MAGA,IAAI,mBAAmB,MAAM,KAAK,gBAAgB,kBAAkB,UAAU;AAAA,MAG9E,IAAI,CAAC,oBAAoB,OAAO,KAAK,gBAAgB,MAAM,EAAE,SAAS,GAAG;AAAA,QACvE,MAAM,oBAAoB,MAAM,KAAK,aAAa,kBAAkB,UAAU;AAAA,QAE9E,IAAI,mBAAmB;AAAA,UACrB,oBAAO,KACL,EAAE,KAAK,cAAc,WAAW,GAChC,+DACF;AAAA,UAGA,MAAM,aAAa,KAAK,sBAAsB,UAAU;AAAA,UAGxD,MAAM,uBAAuB,MAAM,KAAK,aAAa,iBAAiB,UAAU;AAAA,UAMhF,MAAM,qBAAqB,IAAI;AAAA,UAC/B,WAAW,YAAY,OAAO,KAAK,gBAAgB,MAAM,GAAG;AAAA,YAC1D,MAAM,YAAY,gBAAgB,OAAO;AAAA,YACzC,MAAM,YAAY,UAAU,QAAQ,SAAS,MAAM,GAAG,EAAE,IAAI,KAAK;AAAA,YACjE,mBAAmB,IAAI,SAAS;AAAA,UAClC;AAAA,UAGA,MAAM,iBAA8C,CAAC;AAAA,UACrD,WAAW,YAAY,OAAO,KAAK,qBAAqB,MAAM,GAAG;AAAA,YAC/D,MAAM,YAAY,qBAAqB,OAAO;AAAA,YAC9C,MAAM,YAAY,UAAU,QAAQ,SAAS,MAAM,GAAG,EAAE,IAAI,KAAK;AAAA,YACjE,IAAI,mBAAmB,IAAI,SAAS,GAAG;AAAA,cACrC,eAAe,YAAY;AAAA,YAC7B,EAAO;AAAA,cACL,oBAAO,MACL,EAAE,KAAK,cAAc,YAAY,UAAU,GAC3C,2DACF;AAAA;AAAA,UAEJ;AAAA,UAGA,MAAM,mBAAmB;AAAA,eACpB;AAAA,YACH,QAAQ;AAAA,UACV;AAAA,UAGA,IAAI,OAAO,KAAK,iBAAiB,MAAM,EAAE,SAAS,GAAG;AAAA,YAEnD,MAAM,KAAK,gBAAgB,aAAa,YAAY,GAAG,gBAAgB;AAAA,YAGvE,MAAM,KAAK,eAAe,cACxB,YACA,GACA,gBAAgB,KAAK,IAAI,KACzB,IACF;AAAA,YAGA,MAAM,eAAe,aAAa,gBAAgB;AAAA,YAClD,MAAM,KAAK,iBAAiB,gBAAgB,YAAY,cAAc,KAAK,IAAI,CAAC;AAAA,YAEhF,oBAAO,KACL,EAAE,KAAK,cAAc,WAAW,GAChC,iDACF;AAAA,YAGA,mBAAmB;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAAA,MAGA,IAAI,CAAC,WAAW,kBAAkB,eAAe,GAAG;AAAA,QAClD,oBAAO,KAAK,EAAE,KAAK,cAAc,WAAW,GAAG,mBAAmB;AAAA,QAIlE,IAAI,CAAC,oBAAoB,OAAO,KAAK,gBAAgB,MAAM,EAAE,WAAW,GAAG;AAAA,UACzE,oBAAO,KAAK,EAAE,KAAK,cAAc,WAAW,GAAG,wBAAwB;AAAA,UACvE,MAAM,KAAK,iBAAiB,gBAAgB,YAAY,aAAa,KAAK,IAAI,CAAC;AAAA,UAC/E,MAAM,MAAM,MAAM,KAAK,eAAe,WAAW,UAAU;AAAA,UAC3D,MAAM,MAAM,KAAK,qBAAqB,KAAK,UAAU;AAAA,UACrD,MAAM,KAAK,eAAe,cAAc,YAAY,KAAK,KAAK,IAAI;AAAA,UAClE,MAAM,KAAK,gBAAgB,aAAa,YAAY,KAAK,eAAe;AAAA,QAC1E;AAAA,QAEA;AAAA,MACF;AAAA,MAGA,MAAM,OAAO,MAAM,cAAc,kBAAkB,eAAe;AAAA,MAGlE,IAAI,CAAC,eAAe,IAAI,GAAG;AAAA,QACzB,oBAAO,KAAK,EAAE,KAAK,cAAc,WAAW,GAAG,uBAAuB;AAAA,QACtE;AAAA,MACF;AAAA,MAGA,MAAM,gBAAgB,iBAAiB,IAAI;AAAA,MAE3C,IAAI,cAAc,aAAa;AAAA,QAC7B,MAAM,eAAe;AAAA,QAIrB,MAAM,mBACJ,QAAQ,SACR,QAAQ,iBACR,QAAQ,IAAI,uCAAuC;AAAA,QAErD,IAAI,CAAC,kBAAkB;AAAA,UAErB,oBAAO,MACL;AAAA,YACE,KAAK;AAAA,YACL;AAAA,YACA,aAAa,eAAe,eAAe;AAAA,YAC3C,UAAU,cAAc;AAAA,UAC1B,GACA,iGACF;AAAA,UAEA,MAAM,eAAe,eACjB,mDAAmD,gFACnD,qCAAqC;AAAA,UAEzC,MAAM,IAAI,MAAM,YAAY;AAAA,QAC9B;AAAA,QAGA,IAAI,cAAc,sBAAsB;AAAA,UACtC,oBAAO,KACL,EAAE,KAAK,cAAc,YAAY,UAAU,cAAc,SAAS,GAClE,uCACF;AAAA,QACF;AAAA,MACF;AAAA,MAGA,MAAM,gBAAgB,MAAM,qBAAqB,kBAAkB,iBAAiB,IAAI;AAAA,MAExF,IAAI,cAAc,WAAW,GAAG;AAAA,QAC9B,oBAAO,KAAK,EAAE,KAAK,cAAc,WAAW,GAAG,8BAA8B;AAAA,QAC7E;AAAA,MACF;AAAA,MAGA,oBAAO,KACL,EAAE,KAAK,cAAc,YAAY,gBAAgB,cAAc,OAAO,GACtE,0BACF;AAAA,MACA,IAAI,QAAQ,SAAS;AAAA,QACnB,cAAc,QAAQ,CAAC,MAAM,MAAM;AAAA,UACjC,oBAAO,MACL,EAAE,KAAK,cAAc,gBAAgB,IAAI,GAAG,WAAW,KAAK,GAC5D,eACF;AAAA,SACD;AAAA,MACH;AAAA,MAGA,IAAI,QAAQ,QAAQ;AAAA,QAClB,oBAAO,KACL,EAAE,KAAK,cAAc,YAAY,YAAY,cAAc,GAC3D,yCACF;AAAA,QACA;AAAA,MACF;AAAA,MAGA,MAAM,KAAK,iBAAiB,YAAY,iBAAiB,aAAa,aAAa;AAAA,MAEnF,oBAAO,KAAK,EAAE,KAAK,cAAc,WAAW,GAAG,kCAAkC;AAAA,MAGjF;AAAA,MACA,OAAO,OAAO;AAAA,MACd,oBAAO,MACL;AAAA,QACE,KAAK;AAAA,QACL;AAAA,QACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,GACA,kBACF;AAAA,MACA,MAAM;AAAA,cACN;AAAA,MAEA,MAAM,cAAc,QAAQ,IAAI,gBAAgB,QAAQ,IAAI,gBAAgB;AAAA,MAC5E,MAAM,iBAAiB,KAAK,uBAAuB,WAAW;AAAA,MAE9D,IAAI,gBAAgB,gBAAgB;AAAA,QAClC,IAAI;AAAA,UAEF,MAAM,YAAY,OAAO,SAAS;AAAA,UAClC,MAAM,KAAK,GAAG,QAAQ,0DAAqC,uBAAuB;AAAA,UAClF,oBAAO,MAAM,EAAE,KAAK,cAAc,WAAW,GAAG,wBAAwB;AAAA,UACxE,OAAO,aAAa;AAAA,UACpB,oBAAO,KACL;AAAA,YACE,KAAK;AAAA,YACL;AAAA,YACA,OAAO,uBAAuB,QAAQ,YAAY,UAAU,OAAO,WAAW;AAAA,UAChF,GACA,iCACF;AAAA;AAAA,MAEJ;AAAA;AAAA;AAAA,OAOU,iBAAgB,CAC5B,YACA,UACA,MACA,eACe;AAAA,IACf,IAAI,qBAAqB;AAAA,IAEzB,IAAI;AAAA,MAEF,MAAM,KAAK,GAAG,QAAQ,+BAAU;AAAA,MAChC,qBAAqB;AAAA,MAGrB,WAAW,QAAQ,eAAe;AAAA,QAChC,oBAAO,MAAM,EAAE,KAAK,cAAc,WAAW,KAAK,GAAG,yBAAyB;AAAA,QAC9E,MAAM,KAAK,GAAG,QAAQ,yBAAI,IAAI,IAAI,CAAC;AAAA,MACrC;AAAA,MAGA,MAAM,MAAM,MAAM,KAAK,eAAe,WAAW,UAAU;AAAA,MAG3D,MAAM,KAAK,iBAAiB,gBAAgB,YAAY,MAAM,KAAK,IAAI,CAAC;AAAA,MAGxE,MAAM,MAAM,KAAK,qBAAqB,KAAK,UAAU;AAAA,MACrD,MAAM,KAAK,eAAe,cACxB,YACA,KACA,KACA,IACF;AAAA,MAGA,MAAM,KAAK,gBAAgB,aAAa,YAAY,KAAK,QAAQ;AAAA,MAGjE,MAAM,KAAK,GAAG,QAAQ,gCAAW;AAAA,MAEjC,oBAAO,KAAK,EAAE,KAAK,cAAc,YAAY,IAAI,GAAG,oBAAoB;AAAA,MACxE,OAAO,OAAO;AAAA,MAEd,IAAI,oBAAoB;AAAA,QACtB,IAAI;AAAA,UACF,MAAM,KAAK,GAAG,QAAQ,kCAAa;AAAA,UACnC,oBAAO,MACL;AAAA,YACE,KAAK;AAAA,YACL,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC9D,GACA,+BACF;AAAA,UACA,OAAO,eAAe;AAAA,UACtB,oBAAO,MACL;AAAA,YACE,KAAK;AAAA,YACL,OAAO,yBAAyB,QAAQ,cAAc,UAAU,OAAO,aAAa;AAAA,UACtF,GACA,gCACF;AAAA;AAAA,MAEJ;AAAA,MACA,MAAM;AAAA;AAAA;AAAA,EAOF,oBAAoB,CAAC,KAAa,YAA4B;AAAA,IAEpE,MAAM,SAAS,IAAI,SAAS,EAAE,SAAS,GAAG,GAAG;AAAA,IAC7C,MAAM,cAAY,KAAK,IAAI,EAAE,SAAS,EAAE;AAAA,IACxC,OAAO,GAAG,UAAU,cAAc;AAAA;AAAA,OAQ9B,UAAS,CAAC,YAKb;AAAA,IACD,MAAM,gBAAgB,MAAM,KAAK,iBAAiB,iBAAiB,UAAU;AAAA,IAC7E,MAAM,UAAU,MAAM,KAAK,eAAe,YAAY,UAAU;AAAA,IAChE,MAAM,YAAY,MAAM,KAAK,gBAAgB,gBAAgB,UAAU;AAAA,IAEvE,OAAO;AAAA,MACL,QAAQ,CAAC,CAAC;AAAA,MACV;AAAA,MACA;AAAA,MACA,WAAW,UAAU;AAAA,IACvB;AAAA;AAAA,OAQI,MAAK,CAAC,YAAmC;AAAA,IAC7C,oBAAO,KAAK,EAAE,KAAK,cAAc,WAAW,GAAG,sBAAsB;AAAA,IAErE,MAAM,KAAK,GAAG,QACZ,kFAA6D,YAC/D;AAAA,IACA,MAAM,KAAK,GAAG,QAAQ,+EAA0D,YAAY;AAAA,IAC5F,MAAM,KAAK,GAAG,QAAQ,iFAA4D,YAAY;AAAA,IAE9F,oBAAO,KAAK,EAAE,KAAK,cAAc,WAAW,GAAG,gBAAgB;AAAA;AAAA,OAS3D,eAAc,CAClB,YACA,QAC+B;AAAA,IAC/B,IAAI;AAAA,MACF,oBAAO,KAAK,EAAE,KAAK,cAAc,WAAW,GAAG,oBAAoB;AAAA,MAGnE,MAAM,kBAAkB,MAAM,iBAAiB,MAAM;AAAA,MAGrD,MAAM,mBAAmB,MAAM,KAAK,gBAAgB,kBAAkB,UAAU;AAAA,MAGhF,IAAI,CAAC,WAAW,kBAAkB,eAAe,GAAG;AAAA,QAClD,oBAAO,KAAK,EAAE,KAAK,cAAc,WAAW,GAAG,qBAAqB;AAAA,QACpE,OAAO;AAAA,MACT;AAAA,MAGA,MAAM,OAAO,MAAM,cAAc,kBAAkB,eAAe;AAAA,MAGlE,MAAM,gBAAgB,iBAAiB,IAAI;AAAA,MAE3C,IAAI,cAAc,aAAa;AAAA,QAC7B,oBAAO,KAAK,EAAE,KAAK,cAAc,WAAW,GAAG,iCAAiC;AAAA,MAClF,EAAO;AAAA,QACL,oBAAO,KAAK,EAAE,KAAK,cAAc,WAAW,GAAG,kCAAkC;AAAA;AAAA,MAGnF,OAAO;AAAA,MACP,OAAO,OAAO;AAAA,MACd,oBAAO,MACL;AAAA,QACE,KAAK;AAAA,QACL;AAAA,QACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,GACA,2BACF;AAAA,MACA,MAAM;AAAA;AAAA;AAGZ;AAAA,IAzxBA,cACA;AAAA;AAAA,EAGA;AAAA,EAEA;AAAA,EACA;AAAA,EAKA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAhBA;AAAA,EACA;AAAA;;;;ECgBA;AAAA;;;;;;;;ACXO,MAAM,yBAAyB;AAAA,EAC5B,KAA6B;AAAA,EAC7B,oBAAoB,IAAI;AAAA,EACxB,WAAmC;AAAA,OAErC,uBAAsB,CAAC,IAAoC;AAAA,IAC/D,KAAK,KAAK;AAAA,IAKV,MAAM,iBAAiC,EAAE,GAAG;AAAA,IAC5C,MAAM,mBAAmB,cAAc;AAAA,IAEvC,KAAK,WAAW,IAAI,gBAAgB,EAAE;AAAA,IACtC,MAAM,KAAK,SAAS,WAAW;AAAA,IAC/B,oBAAO,KAAK,EAAE,KAAK,aAAa,GAAG,sCAAsC;AAAA;AAAA,EAG3E,gCAAgC,CAAC,SAAyB;AAAA,IACxD,WAAW,UAAU,SAAS;AAAA,MAI5B,MAAM,mBAAmB;AAAA,MACzB,IAAI,iBAAiB,QAAQ;AAAA,QAC3B,KAAK,kBAAkB,IAAI,OAAO,MAAM,iBAAiB,MAAM;AAAA,MACjE;AAAA,IACF;AAAA,IACA,oBAAO,KACL;AAAA,MACE,KAAK;AAAA,MACL,mBAAmB,KAAK,kBAAkB;AAAA,MAC1C,cAAc,QAAQ;AAAA,IACxB,GACA,2BACF;AAAA;AAAA,EAGF,cAAc,CAAC,YAAoB,QAAuC;AAAA,IACxE,KAAK,kBAAkB,IAAI,YAAY,MAAM;AAAA,IAC7C,oBAAO,MAAM,EAAE,KAAK,cAAc,WAAW,GAAG,mBAAmB;AAAA;AAAA,OAG/D,uBAAsB,CAAC,SAIX;AAAA,IAChB,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,UAAU;AAAA,MAC9B,MAAM,IAAI,MAAM,kEAAkE;AAAA,IACpF;AAAA,IAEA,MAAM,eAAe;AAAA,IAErB,MAAM,mBAAmB;AAAA,MACvB,SAAS,SAAS,WAAW,CAAC;AAAA,MAC9B,OAAO,SAAS,SAAS;AAAA,MACzB,QAAQ,SAAS,UAAU;AAAA,IAC7B;AAAA,IAEA,oBAAO,KACL;AAAA,MACE,KAAK;AAAA,MACL,aAAa,eAAe,eAAe;AAAA,MAC3C,aAAa,KAAK,kBAAkB;AAAA,MACpC,QAAQ,iBAAiB;AAAA,IAC3B,GACA,qBACF;AAAA,IAEA,IAAI,eAAe;AAAA,IACnB,IAAI,eAAe;AAAA,IACnB,MAAM,SAAsD,CAAC;AAAA,IAE7D,YAAY,YAAY,WAAW,KAAK,mBAAmB;AAAA,MACzD,IAAI;AAAA,QACF,MAAM,KAAK,SAAS,QAAQ,YAAY,QAAQ,gBAAgB;AAAA,QAChE;AAAA,QACA,oBAAO,KAAK,EAAE,KAAK,cAAc,WAAW,GAAG,qBAAqB;AAAA,QACpE,OAAO,OAAO;AAAA,QACd;AAAA,QACA,MAAM,eAAgB,MAAgB;AAAA,QAEtC,OAAO,KAAK,EAAE,YAAY,MAAsB,CAAC;AAAA,QAEjD,IAAI,aAAa,SAAS,+BAA+B,GAAG;AAAA,UAC1D,oBAAO,MACL,EAAE,KAAK,cAAc,WAAW,GAChC,mHACF;AAAA,QACF,EAAO;AAAA,UACL,oBAAO,MAAM,EAAE,KAAK,cAAc,YAAY,OAAO,aAAa,GAAG,kBAAkB;AAAA;AAAA;AAAA,IAG7F;AAAA,IAEA,IAAI,iBAAiB,GAAG;AAAA,MACtB,oBAAO,KAAK,EAAE,KAAK,cAAc,aAAa,GAAG,uCAAuC;AAAA,MAExF,MAAM,uBAAuB,QAAQ,IAAI,0BAA0B;AAAA,MAEnE,IAAI,sBAAsB;AAAA,QACxB,IAAI;AAAA,UACF,oBAAO,KAAK,EAAE,KAAK,aAAa,GAAG,mCAAmC;AAAA,UAItE,MAAM,iBAAiC;AAAA,YACrC,IAAI,KAAK;AAAA,UACX;AAAA,UACA,MAAM,oBAAoB,cAAc;AAAA,UACxC,MAAM,oBAAoB,cAAc;AAAA,UACxC,MAAM,0BAA0B,cAAc;AAAA,UAC9C,oBAAO,KAAK,EAAE,KAAK,aAAa,GAAG,6BAA6B;AAAA,UAChE,OAAO,UAAU;AAAA,UACjB,MAAM,WAAW,oBAAoB,QAAQ,SAAS,UAAU,OAAO,QAAQ;AAAA,UAC/E,oBAAO,KACL,EAAE,KAAK,cAAc,OAAO,SAAS,GACrC,qFACF;AAAA;AAAA,MAEJ,EAAO;AAAA,QACL,oBAAO,KACL,EAAE,KAAK,aAAa,GACpB,iEACF;AAAA;AAAA,IAEJ,EAAO;AAAA,MACL,oBAAO,MAAM,EAAE,KAAK,cAAc,cAAc,aAAa,GAAG,wBAAwB;AAAA,MAExF,MAAM,eAAe,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE,eAAe,EAAE,MAAM,SAAS,EAAE,KAAK;AAAA,GAAM;AAAA,MACzF,MAAM,iBAAiB,IAAI,MAAM,GAAG;AAAA,IAAwC,gBAAgB;AAAA,QAC1F,OAAO,OAAO,IAAI;AAAA,MACpB,CAAC;AAAA,MAGD,eAAe,kBAAkB;AAAA,MACjC,MAAM;AAAA;AAAA;AAAA,EAIV,WAAW,GAA2B;AAAA,IACpC,OAAO,KAAK;AAAA;AAEhB;AAAA,IAvJA;AAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAHA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACA0B,IAA1B;AAEwD,IAAxD;AAkBO,IAhBP;;;ACGO,IAPP;;;ACoDO,IApDP;AAoLO,IAbP;;;ACvK+B,IAA/B;AAC2E,IAA3E;;;ACWA;AAZoB,IAApB;AAWO,IAVP;;;ACEA;AAFoB,IAApB;AAC8D,IAA9D;AAOO,IAAM,cAAc,wBACzB,YACA;AAAA,EACE,IAAI,qBAAK,IAAI,EAAE,QAAQ,EAAE,WAAW;AAAA,EACpC,SAAS,qBAAK,UAAU,EACrB,QAAQ,EACR,WAAW,MAAM,WAAW,IAAI;AAAA,IAC/B,UAAU;AAAA,EACZ,CAAC;AAAA,EACH,WAAW,0BAAU,YAAY,EAAE,QAAQ,8BAAU,EAAE,QAAQ;AAAA,EAC/D,OAAO,qBAAK,OAAO,EAAE,MAAM,EAAE,QAAQ,qCAAiB,EAAE,QAAQ;AAAA,EAChE,UAAU,sBAAM,UAAU,EAAE,MAAgB,EAAE,QAAQ,oCAAgB,EAAE,QAAQ;AAClF,GACA,CAAC,UAAU;AAAA,EACT,OAAO;AAAA,IACL,iBAAiB,uBAAO,oBAAoB,EAAE,GAAG,MAAM,IAAI,MAAM,OAAO;AAAA,EAC1E;AAAA,CAEJ;;;ACxBA;AAFoB,IAApB;AACsD,IAAtD;AAkBO,IAAM,YAAY,wBAAQ,SAAS;AAAA,EACxC,IAAI,qBAAK,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,0CAAsB;AAAA,EACpE,SAAS,qBAAK,UAAU,EAAE,WAAW,MAAM,WAAW,IAAI;AAAA,IACxD,UAAU;AAAA,EACZ,CAAC;AAAA,EACD,QAAQ,qBAAK,QAAQ,EAAE,QAAQ;AAAA,EAC/B,MAAM,qBAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,iBAAiB,qBAAK,mBAAmB;AAAA,EACzC,SAAS,qBAAK,UAAU;AAAA,EAIxB,MAAM,qBAAK,MAAM;AAAA,EACjB,UAAU,sBAAM,UAAU,EAAE,MAAgB;AAAA,EAC5C,WAAW,qBAAK,YAAY;AAAA,EAC5B,WAAW,0BAAU,YAAY,EAAE,QAAQ,8BAAU,EAAE,QAAQ;AACjE,CAAC;;;AFZM,IAAM,cAAc,wBACzB,YACA;AAAA,EACE,IAAI,qBAAK,IAAI,EAAE,WAAW,EAAE,QAAQ;AAAA,EACpC,MAAM,qBAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,WAAW,0BAAU,YAAY,EAAE,QAAQ,8BAAU,EAAE,QAAQ;AAAA,EAC/D,SAAS,sBAAM,SAAS,EAAE,QAAQ;AAAA,EAClC,UAAU,qBAAK,WAAW,EAAE,WAAW,MAAM,YAAY,IAAI;AAAA,IAC3D,UAAU;AAAA,EACZ,CAAC;AAAA,EACD,SAAS,qBAAK,UAAU,EACrB,WAAW,MAAM,WAAW,IAAI;AAAA,IAC/B,UAAU;AAAA,EACZ,CAAC,EACA,QAAQ;AAAA,EACX,QAAQ,qBAAK,SAAS,EAAE,WAAW,MAAM,UAAU,IAAI;AAAA,IACrD,UAAU;AAAA,EACZ,CAAC;AAAA,EACD,SAAS,qBAAK,UAAU;AAAA,EAIxB,QAAQ,wBAAQ,QAAQ,EAAE,QAAQ,IAAI,EAAE,QAAQ;AAAA,EAChD,UAAU,sBAAM,UAAU,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ;AAClD,GACA,CAAC,UAAU;AAAA,EACT,sBAAM,wBAAwB,EAAE,GAAG,MAAM,MAAM,MAAM,MAAM;AAAA,EAC3D,sBAAM,uBAAuB,EAAE,GAAG,MAAM,OAAO;AAAA,EAC/C,2BAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,MAAM,MAAM;AAAA,IACtB,gBAAgB,CAAC,UAAU,EAAE;AAAA,EAC/B,CAAC,EAAE,SAAS,SAAS;AAAA,EACrB,2BAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,MAAM,QAAQ;AAAA,IACxB,gBAAgB,CAAC,YAAY,EAAE;AAAA,EACjC,CAAC,EAAE,SAAS,SAAS;AAAA,EACrB,2BAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,MAAM,OAAO;AAAA,IACvB,gBAAgB,CAAC,WAAW,EAAE;AAAA,EAChC,CAAC,EAAE,SAAS,SAAS;AAAA,EAMrB,sBAAM,4BAA4B,EAAE,GAAG,8CAA0B;AAAA,EACjE,sBAAM,0BAA0B,EAAE,GAAG,oDAAgC;AAAA,EACrE,sBAAM,qBAAqB,EAAE,GAC3B,sDACA,kDACF;AAAA,EACA,sBACE,2BACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAQF;AAAA,EACA,sBACE,2BACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAOF;AACF,CACF;;;ADhGO,IAAM,cAAc;AAAA,EACzB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,KAAK;AAAA,EAIL,MAAM;AAAA,EACN,MAAM;AACR;AAEO,IAAM,gBAAgB;AAAA,GAC1B,YAAY,QAAQ;AAAA,GACpB,YAAY,SAAS;AAAA,GACrB,YAAY,QAAQ;AAAA,GACpB,YAAY,KAAK;AAAA,GACjB,YAAY,MAAM;AAAA,GAClB,YAAY,OAAO;AAAA,GACnB,YAAY,OAAO;AACtB;AAMO,IAAM,iBAAiB,wBAC5B,cACA;AAAA,EACE,IAAI,qBAAK,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ;AAAA,EACpD,UAAU,qBAAK,WAAW,EAAE,WAAW,MAAM,YAAY,IAAI;AAAA,IAC3D,UAAU;AAAA,EACZ,CAAC;AAAA,EACD,WAAW,0BAAU,YAAY,EAAE,QAAQ,8BAAU,EAAE,QAAQ;AAAA,EAC/D,QAAQ,uBAAO,WAAW,EAAE,YAAY,YAAY,MAAM,CAAC;AAAA,EAC3D,QAAQ,uBAAO,WAAW,EAAE,YAAY,YAAY,OAAO,CAAC;AAAA,EAC5D,QAAQ,uBAAO,WAAW,EAAE,YAAY,YAAY,MAAM,CAAC;AAAA,EAC3D,SAAS,uBAAO,YAAY,EAAE,YAAY,YAAY,GAAG,CAAC;AAAA,EAC1D,SAAS,uBAAO,YAAY,EAAE,YAAY,YAAY,IAAI,CAAC;AAAA,EAC3D,SAAS,uBAAO,YAAY,EAAE,YAAY,YAAY,KAAK,CAAC;AAAA,EAC5D,SAAS,uBAAO,YAAY,EAAE,YAAY,YAAY,KAAK,CAAC;AAC9D,GACA,CAAC,UAAU;AAAA,EACT,sBAAM,0BAA0B,gDAA4B;AAAA,EAC5D,sBAAM,sBAAsB,EAAE,GAAG,MAAM,QAAQ;AAAA,EAC/C,2BAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,MAAM,QAAQ;AAAA,IACxB,gBAAgB,CAAC,YAAY,EAAE;AAAA,EACjC,CAAC,EAAE,SAAS,SAAS;AACvB,CACF;AAqBO,IAAM,kBAAkB,8BAAU,aAAa,GAAG,WAAW;AAAA,EAClE,WAAW,IAAI,cAAc;AAC/B,EAAE;;;AI/EF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA;AAFoB,IAApB;AAC6D,IAA7D;AAkBO,IAAM,uBAAuB,wBAClC,qBACA;AAAA,EACE,IAAI,qBAAK,IAAI,EAAE,WAAW,EAAE,cAAc;AAAA,EAE1C,OAAO,qBAAK,OAAO,EAAE,QAAQ;AAAA,EAE7B,aAAa,qBAAK,cAAc,EAAE,QAAQ;AAAA,EAE1C,eAAe,qBAAK,iBAAiB,EAAE,QAAQ;AAAA,EAE/C,QAAQ,qBAAK,QAAQ,EAAE,QAAQ;AAAA,EAE/B,SAAS,sBAAM,SAAS,EAAE,QAAQ;AAAA,EAElC,SAAS,qBAAK,SAAS,EAAE,QAAQ;AAAA,EAEjC,QAAQ,qBAAK,QAAQ,EAAE,QAAQ;AAAA,EAC/B,WAAW,0BAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ;AAAA,EAEnE,YAAY,0BAAU,eAAe,EAAE,cAAc,KAAK,CAAC;AAAA,EAE3D,YAAY,qBAAK,aAAa;AAAA,EAE9B,kBAAkB,qBAAK,mBAAmB;AAAA,EAE1C,SAAS,qBAAK,UAAU,EACrB,QAAQ,EACR,WAAW,MAAM,WAAW,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAC1D,WAAW,0BAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,8BAAU,EAAE,QAAQ;AAAA,EACvF,WAAW,0BAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,8BAAU,EAAE,QAAQ;AACzF,GACA,CAAC,UAAU;AAAA,EACT,sBAAM,qCAAqC,EAAE,GAAG,MAAM,eAAe,MAAM,KAAK;AAAA,EAChF,sBAAM,mCAAmC,EAAE,GAAG,MAAM,SAAS,MAAM,KAAK;AAAA,EACxE,sBAAM,qCAAqC,EAAE,GAAG,MAAM,OAAO,MAAM,SAAS;AAC9E,CACF;;ACxDoD,IAApD;AASO,IAAM,sBAAsB,wBACjC,qBACA;AAAA,EACE,IAAI,qBAAK,IAAI,EAAE,WAAW;AAAA,EAC1B,IAAI,uBAAO,MAAM,EAAE,MAAM,SAAS,CAAC,EAAE,QAAQ;AAAA,EAC7C,iBAAiB,qBAAK,mBAAmB;AAAA,EACzC,IAAI,qBAAK,IAAI;AAAA,EACb,WAAW,qBAAK,YAAY;AAAA,EAC5B,QAAQ,qBAAK,QAAQ,EAAE,QAAQ;AAAA,EAC/B,SAAS,qBAAK,SAAS,EAAE,QAAQ;AAAA,EACjC,UAAU,sBAAM,UAAU,EAAE,MAAiD,EAAE,QAAQ;AACzF,GACA,CAAC,UAAU;AAAA,EACT,sBAAM,8BAA8B,EAAE,GAAG,MAAM,MAAM;AAAA,EACrD,sBAAM,0BAA0B,EAAE,GAAG,MAAM,EAAE;AAAA,EAC7C,sBAAM,6BAA6B,EAAE,GAAG,MAAM,eAAe;AAC/D,CACF;;AC1B6C,IAA7C;AAUO,IAAM,4BAA4B,wBACvC,2BACA;AAAA,EACE,KAAK,qBAAK,KAAK,EAAE,WAAW;AAAA,EAC5B,QAAQ,uBAAO,WAAW,EAAE,MAAM,SAAS,CAAC,EAAE,QAAQ;AACxD,GACA,CAAC,UAAU,CAAC,sBAAM,gCAAgC,EAAE,GAAG,MAAM,MAAM,CAAC,CACtE;;ACjBoB,IAApB;AAC6C,IAA7C;AAWO,IAAM,oBAAoB,wBAC/B,mBACA;AAAA,EAEE,IAAI,qBAAK,IAAI,EAAE,WAAW;AAAA,EAC1B,MAAM,qBAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,aAAa,qBAAK,cAAc,EAAE,QAAQ;AAAA,EAC1C,WAAW,uBAAO,cAAc,EAAE,MAAM,SAAS,CAAC,EAAE,QAAQ;AAAA,EAE5D,cAAc,qBAAK,eAAe;AAAA,EAElC,aAAa,qBAAK,eAAe;AACnC,GACA,CAAC,UAAU;AAAA,EACT,sBAAM,0BAA0B,EAAE,GAAG,MAAM,IAAI;AAAA,EAC/C,sBAAM,gCAAgC,EAAE,GAAG,MAAM,WAAW;AAC9D,CACF;AAKO,IAAM,+BAA+B;;AClC0B,IAAtE;AAWO,IAAM,wBAAwB,yBACnC,uBACA;AAAA,EACE,IAAI,sBAAK,IAAI,EAAE,WAAW;AAAA,EAC1B,YAAY,sBAAK,aAAa,EAC3B,QAAQ,EACR,WAAW,MAAM,kBAAkB,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EACjE,WAAW,sBAAK,WAAW,EAAE,QAAQ;AAAA,EACrC,YAAY,sBAAK,aAAa,EAAE,QAAQ;AAAA,EACxC,eAAe,sBAAK,gBAAgB,EAAE,QAAQ;AAAA,EAE9C,YAAY,sBAAK,aAAa,EAAE,QAAQ;AAAA,EACxC,YAAY,wBAAO,eAAe,EAAE,MAAM,SAAS,CAAC,EAAE,QAAQ;AAAA,EAE9D,iBAAiB,sBAAK,mBAAmB;AAAA,EACzC,kBAAkB,wBAAO,sBAAsB,EAAE,MAAM,SAAS,CAAC;AACnE,GACA,CAAC,UAAU;AAAA,EACT,uBAAM,kCAAkC,EAAE,GAAG,MAAM,UAAU;AAAA,EAC7D,uBAAM,mCAAmC,EAAE,GAAG,MAAM,SAAS;AAAA,EAC7D,6BAAY,sDAAsD,EAAE,GAClE,MAAM,WACN,MAAM,YACN,MAAM,UACR;AAAA,EACA,4BAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,MAAM,UAAU;AAAA,IAC1B,gBAAgB,CAAC,kBAAkB,EAAE;AAAA,EACvC,CAAC,EAAE,SAAS,SAAS;AACvB,CACF;;AC1CyD,IAAzD;AAiBO,IAAM,2BAA2B,yBACtC,2BACA;AAAA,EAEE,WAAW,sBAAK,YAAY,EAAE,WAAW;AAAA,EACzC,YAAY,sBAAK,aAAa,EAC3B,QAAQ,EACR,WAAW,MAAM,kBAAkB,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAEjE,WAAW,sBAAK,YAAY,EACzB,QAAQ,EACR,WAAW,MAAM,sBAAsB,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EACrE,UAAU,wBAAO,aAAa,EAAE,MAAM,SAAS,CAAC,EAAE,QAAQ;AAAA,EAC1D,WAAW,wBAAO,cAAc,EAAE,MAAM,SAAS,CAAC,EAAE,QAAQ;AAAA,EAE5D,YAAY,wBAAO,eAAe,EAAE,MAAM,SAAS,CAAC;AACtD,GACA,CAAC,UAAU;AAAA,EACT,uBAAM,sCAAsC,EAAE,GAAG,MAAM,UAAU;AAAA,EACjE,uBAAM,qCAAqC,EAAE,GAAG,MAAM,SAAS;AAAA,EAC/D,uBAAM,qCAAqC,EAAE,GAAG,MAAM,SAAS;AAAA,EAC/D,4BAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,MAAM,UAAU;AAAA,IAC1B,gBAAgB,CAAC,kBAAkB,EAAE;AAAA,EACvC,CAAC,EAAE,SAAS,SAAS;AAAA,EACrB,4BAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,MAAM,SAAS;AAAA,IACzB,gBAAgB,CAAC,sBAAsB,EAAE;AAAA,EAC3C,CAAC,EAAE,SAAS,SAAS;AACvB,CACF;;ACjDyE,IAAzE;AAcO,IAAM,mBAAmB,yBAC9B,iBACA;AAAA,EACE,IAAI,sBAAK,IAAI,EAAE,WAAW;AAAA,EAC1B,YAAY,sBAAK,aAAa,EAC3B,QAAQ,EACR,WAAW,MAAM,kBAAkB,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EACjE,MAAM,sBAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,WAAW,wBAAO,cAAc,EAAE,MAAM,SAAS,CAAC,EAAE,QAAQ;AAAA,EAC5D,YAAY,wBAAO,gBAAgB,EAAE,MAAM,SAAS,CAAC,EAAE,QAAQ;AAAA,EAC/D,WAAW,wBAAO,cAAc,EAAE,MAAM,SAAS,CAAC,EAAE,QAAQ;AAAA,EAC5D,gBAAgB,yBAAQ,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAClE,YAAY,sBAAK,aAAa,EAAE,QAAQ;AAAA,EACxC,IAAI,sBAAK,IAAI;AAAA,EACb,WAAW,sBAAK,YAAY;AAAA,EAC5B,QAAQ,uBAAM,QAAQ,EAAE,MAAgB,EAAE,QAAQ;AAAA,EAClD,WAAW,wBAAO,cAAc,EAAE,MAAM,SAAS,CAAC;AACpD,GACA,CAAC,UAAU;AAAA,EACT,uBAAM,4BAA4B,EAAE,GAAG,MAAM,UAAU;AAAA,EACvD,uBAAM,2BAA2B,EAAE,GAAG,MAAM,SAAS;AAAA,EACrD,4BAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,MAAM,UAAU;AAAA,IAC1B,gBAAgB,CAAC,kBAAkB,EAAE;AAAA,EACvC,CAAC,EAAE,SAAS,SAAS;AACvB,CACF;;ACvCA;AAFoB,IAApB;AACkE,IAAlE;AAQO,IAAM,aAAa,yBACxB,SACA;AAAA,EACE,KAAK,sBAAK,KAAK,EAAE,QAAQ;AAAA,EACzB,SAAS,sBAAK,UAAU,EACrB,QAAQ,EACR,WAAW,MAAM,WAAW,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAC1D,OAAO,uBAAM,OAAO,EAAE,QAAQ;AAAA,EAC9B,WAAW,2BAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,8BAAU,EAAE,QAAQ;AAAA,EACvF,WAAW,2BAAU,cAAc,EAAE,cAAc,KAAK,CAAC;AAC3D,GACA,CAAC,UAAU,CAAC,4BAAW,EAAE,SAAS,CAAC,MAAM,KAAK,MAAM,OAAO,EAAE,CAAC,CAAC,CACjE;;ACrBoB,IAApB;AACsD,IAAtD;;;ACDoB,IAApB;AACsD,IAAtD;AAEO,IAAM,qBAAqB,yBAAQ,mBAAmB;AAAA,EAC3D,IAAI,sBAAK,IAAI,EAAE,WAAW;AAAA,EAC1B,MAAM,sBAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,YAAY,sBAAK,aAAa,EAAE,QAAQ;AAAA,EACxC,UAAU,sBAAK,WAAW;AAAA,EAC1B,UAAU,uBAAM,UAAU;AAAA,EAC1B,WAAW,2BAAU,cAAc,EAAE,MAAM,OAAO,CAAC,EAAE,QAAQ,0CAAsB,EAAE,QAAQ;AAAA,EAC7F,WAAW,2BAAU,cAAc,EAAE,MAAM,OAAO,CAAC,EAAE,QAAQ,0CAAsB,EAAE,QAAQ;AAC/F,CAAC;;;ADPM,IAAM,eAAe,yBAAQ,YAAY;AAAA,EAC9C,IAAI,sBAAK,IAAI,EAAE,WAAW;AAAA,EAC1B,iBAAiB,sBAAK,mBAAmB,EACtC,QAAQ,EACR,WAAW,MAAM,mBAAmB,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAClE,MAAM,sBAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,MAAM,sBAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,YAAY,sBAAK,aAAa;AAAA,EAC9B,UAAU,sBAAK,WAAW;AAAA,EAC1B,OAAO,sBAAK,OAAO;AAAA,EACnB,UAAU,uBAAM,UAAU;AAAA,EAE1B,WAAW,2BAAU,cAAc,EAAE,MAAM,OAAO,CAAC,EAAE,QAAQ,2CAAsB,EAAE,QAAQ;AAAA,EAC7F,WAAW,2BAAU,cAAc,EAAE,MAAM,OAAO,CAAC,EAAE,QAAQ,2CAAsB,EAAE,QAAQ;AAC/F,CAAC;;AElByC,IAA1C;AAGO,IAAM,2BAA2B,yBACtC,wBACA;AAAA,EACE,WAAW,sBAAK,YAAY,EACzB,QAAQ,EACR,WAAW,MAAM,aAAa,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAC5D,UAAU,sBAAK,WAAW,EAAE,QAAQ;AACtC,GACA,CAAC,UAAU,CAAC,4BAAW,EAAE,SAAS,CAAC,MAAM,WAAW,MAAM,QAAQ,EAAE,CAAC,CAAC,CACxE;;ACVA;AAFoB,IAApB;AACsD,IAAtD;;;ACCA;AAFoB,IAApB;AACsD,IAAtD;AASO,IAAM,aAAa,yBAAQ,UAAU;AAAA,EAC1C,IAAI,sBAAK,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,2CAAsB;AAAA,EACpE,SAAS,sBAAK,UAAU,EACrB,QAAQ,EACR,WAAW,MAAM,WAAW,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAC1D,MAAM,sBAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,UAAU,uBAAM,UAAU;AAAA,EAC1B,iBAAiB,sBAAK,mBAAmB;AAAA,EACzC,WAAW,2BAAU,YAAY,EAAE,QAAQ,+BAAU,EAAE,QAAQ;AACjE,CAAC;;;ADTM,IAAM,iBAAiB,yBAAQ,cAAc;AAAA,EAClD,IAAI,sBAAK,IAAI,EAAE,WAAW,EAAE,QAAQ,2CAAsB,EAAE,QAAQ;AAAA,EAGpE,UAAU,sBAAK,WAAW,EACvB,WAAW,MAAM,YAAY,IAAI,EAAE,UAAU,UAAU,CAAC,EACxD,QAAQ;AAAA,EACX,SAAS,sBAAK,UAAU,EACrB,WAAW,MAAM,WAAW,IAAI,EAAE,UAAU,UAAU,CAAC,EACvD,QAAQ;AAAA,EACX,QAAQ,sBAAK,SAAS,EACnB,WAAW,MAAM,UAAU,IAAI,EAAE,UAAU,UAAU,CAAC,EACtD,QAAQ;AAAA,EACX,SAAS,sBAAK,UAAU,EAAE,WAAW,MAAM,WAAW,IAAI;AAAA,IACxD,UAAU;AAAA,EACZ,CAAC;AAAA,EACD,gBAAgB,sBAAK,kBAAkB,EAAE,WAAW,MAAM,YAAY,IAAI;AAAA,IACxE,UAAU;AAAA,EACZ,CAAC;AAAA,EAGD,MAAM,sBAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,MAAM,uBAAM,MAAM,EAAE,QAAQ,qCAAgB;AAAA,EAG5C,WAAW,2BAAU,YAAY,EAAE,QAAQ,+BAAU,EAAE,QAAQ;AACjE,CAAC;;AEzBD;AAXoB,IAApB;AAUO,IATP;AAYO,IAAM,yBAAyB,yBACpC,sBACA;AAAA,EACE,IAAI,sBAAK,IAAI,EAAE,WAAW,EAAE,QAAQ,2CAAsB,EAAE,QAAQ;AAAA,EACpE,SAAS,sBAAK,UAAU,EACrB,QAAQ,EACR,WAAW,MAAM,WAAW,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAC1D,UAAU,sBAAK,UAAU,EAAE,QAAQ;AAAA,EAKnC,YAAY,sBAAK,aAAa,EAAE,QAAQ;AAAA,EACxC,YAAY,sBAAK,aAAa;AAAA,EAC9B,aAAa,sBAAK,cAAc;AAAA,EAChC,UAAU,sBAAK,UAAU;AAAA,EACzB,OAAO,sBAAK,OAAO;AAAA,EACnB,gBAAgB,sBAAK,kBAAkB;AAAA,EACvC,iBAAiB,sBAAK,mBAAmB;AAAA,EACzC,MAAM,sBAAK,MAAM,EAAE,QAAQ,EAAE,QAAQ,OAAO;AAAA,EAC5C,SAAS,uBAAM,SAAS,EAAE,MAAgB,EAAE,QAAQ,gDAA2B,EAAE,QAAQ;AAAA,EACzF,YAAY,sBAAK,aAAa,EAAE,QAAQ,EAAE,QAAQ,MAAM;AAAA,EACxD,QAAQ,sBAAK,QAAQ,EAAE,QAAQ,EAAE,QAAQ,WAAW;AAAA,EACpD,QAAQ,uBAAM,QAAQ,EAAE,MAAgB,EAAE,QAAQ,qCAAgB,EAAE,QAAQ;AAAA,EAC5E,cAAc,uBAAM,cAAc,EAAE,MAAgB,EAAE,QAAQ,qCAAgB,EAAE,QAAQ;AAAA,EACxF,SAAS,uBAAM,SAAS,EAAE,MAA+B,EAAE,QAAQ,qCAAgB,EAAE,QAAQ;AAAA,EAC7F,UAAU,uBAAM,UAAU,EACvB,MAA+B,EAC/B,QAAQ,qCAAgB,EACxB,QAAQ;AAAA,EACX,aAAa,2BAAU,gBAAgB,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,+BAAU,EAAE,QAAQ;AAAA,EAC3F,YAAY,2BAAU,gBAAgB,EAAE,cAAc,KAAK,CAAC;AAAA,EAC5D,WAAW,2BAAU,cAAc,EAAE,cAAc,KAAK,CAAC;AAAA,EACzD,WAAW,2BAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,+BAAU,EAAE,QAAQ;AAAA,EACvF,WAAW,2BAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,+BAAU,EAAE,QAAQ;AACzF,GACA,CAAC,UAAU;AAAA,EACT,6BAAY,oDAAoD,EAC7D,GAAG,MAAM,SAAS,MAAM,UAAU,MAAM,UAAU,EAClD,MAAM,2BAAM,MAAM,mBAAmB;AAAA,EACxC,6BAAY,iDAAiD,EAC1D,GAAG,MAAM,SAAS,MAAM,UAAU,MAAM,UAAU,EAClD,MAAM,2BAAM,MAAM,mBAAmB;AAAA,EACxC,uBAAM,uCAAuC,EAAE,GAAG,MAAM,SAAS,MAAM,QAAQ;AAAA,EAC/E,uBAAM,+BAA+B,EAAE,GAAG,MAAM,MAAM;AAAA,EACtD,uBAAM,gCAAgC,EAAE,GAAG,MAAM,SAAS;AAC5D,CACF;AAEO,IAAM,mCAAmC,yBAC9C,iCACA;AAAA,EACE,IAAI,sBAAK,IAAI,EAAE,WAAW,EAAE,QAAQ,2CAAsB,EAAE,QAAQ;AAAA,EACpE,WAAW,sBAAK,YAAY,EACzB,QAAQ,EACR,WAAW,MAAM,uBAAuB,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EACtE,SAAS,sBAAK,UAAU,EACrB,QAAQ,EACR,WAAW,MAAM,WAAW,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAC1D,UAAU,sBAAK,UAAU,EAAE,QAAQ;AAAA,EACnC,gBAAgB,sBAAK,iBAAiB,EAAE,QAAQ;AAAA,EAEhD,UAAU,sBAAK,WAAW,EAAE,QAAQ;AAAA,EACpC,UAAU,uBAAM,UAAU,EACvB,MAA+B,EAC/B,QAAQ,qCAAgB,EACxB,QAAQ;AAAA,EACX,WAAW,2BAAU,cAAc,EAAE,cAAc,KAAK,CAAC;AAAA,EACzD,gBAAgB,2BAAU,oBAAoB,EAAE,cAAc,KAAK,CAAC;AAAA,EACpE,WAAW,2BAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,+BAAU,EAAE,QAAQ;AAAA,EACvF,WAAW,2BAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,+BAAU,EAAE,QAAQ;AACzF,GACA,CAAC,UAAU;AAAA,EACT,6BAAY,iDAAiD,EAAE,GAC7D,MAAM,WACN,MAAM,cACR;AAAA,EACA,6BAAY,uDAAuD,EAAE,GACnE,MAAM,SACN,MAAM,UACN,MAAM,QACR;AAAA,EACA,uBAAM,kDAAkD,EAAE,GAAG,MAAM,SAAS,MAAM,QAAQ;AAAA,EAC1F,uBAAM,2CAA2C,EAAE,GAAG,MAAM,SAAS;AACvE,CACF;AAEO,IAAM,mCAAmC,yBAC9C,kCACA;AAAA,EACE,IAAI,sBAAK,IAAI,EAAE,WAAW,EAAE,QAAQ,2CAAsB,EAAE,QAAQ;AAAA,EACpE,WAAW,sBAAK,YAAY,EAAE,WAAW,MAAM,uBAAuB,IAAI;AAAA,IACxE,UAAU;AAAA,EACZ,CAAC;AAAA,EACD,SAAS,sBAAK,UAAU,EACrB,QAAQ,EACR,WAAW,MAAM,WAAW,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAC1D,UAAU,sBAAK,UAAU,EAAE,QAAQ;AAAA,EACnC,SAAS,sBAAK,UAAU;AAAA,EACxB,QAAQ,sBAAK,QAAQ,EAAE,QAAQ;AAAA,EAC/B,SAAS,sBAAK,SAAS,EAAE,QAAQ;AAAA,EACjC,UAAU,uBAAM,UAAU,EACvB,MAA+B,EAC/B,QAAQ,qCAAgB,EACxB,QAAQ;AAAA,EACX,WAAW,2BAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,+BAAU,EAAE,QAAQ;AACzF,GACA,CAAC,UAAU;AAAA,EACT,uBAAM,4CAA4C,EAAE,GAAG,MAAM,SAAS,MAAM,QAAQ;AAAA,EACpF,uBAAM,qCAAqC,EAAE,GAAG,MAAM,SAAS;AAAA,EAC/D,uBAAM,oCAAoC,EAAE,GAAG,MAAM,MAAM;AAAA,EAC3D,uBAAM,qCAAqC,EAAE,GAAG,MAAM,SAAS;AACjE,CACF;AAEO,IAAM,kBAAkB,yBAC7B,eACA;AAAA,EAEE,WAAW,sBAAK,YAAY,EAAE,QAAQ;AAAA,EACtC,SAAS,sBAAK,UAAU,EACrB,QAAQ,EACR,WAAW,MAAM,WAAW,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAC1D,UAAU,sBAAK,UAAU,EAAE,QAAQ;AAAA,EACnC,WAAW,sBAAK,YAAY,EAAE,WAAW,MAAM,uBAAuB,IAAI;AAAA,IACxE,UAAU;AAAA,EACZ,CAAC;AAAA,EACD,aAAa,sBAAK,cAAc;AAAA,EAEhC,iBAAiB,sBAAK,mBAAmB;AAAA,EACzC,QAAQ,uBAAM,QAAQ,EAAE,MAAgB,EAAE,QAAQ,qCAAgB,EAAE,QAAQ;AAAA,EAC5E,UAAU,uBAAM,UAAU,EACvB,MAA+B,EAC/B,QAAQ,qCAAgB,EACxB,QAAQ;AAAA,EACX,WAAW,2BAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,+BAAU,EAAE,QAAQ;AAAA,EACvF,WAAW,2BAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ;AAAA,EACnE,YAAY,2BAAU,eAAe,EAAE,cAAc,KAAK,CAAC;AAAA,EAC3D,YAAY,sBAAK,aAAa;AAChC,GACA,CAAC,UAAU;AAAA,EACT,4BAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,MAAM,SAAS,MAAM,UAAU,MAAM,SAAS;AAAA,EAC1D,CAAC;AAAA,EACD,uBAAM,gCAAgC,EAAE,GAAG,MAAM,SAAS,MAAM,QAAQ;AAAA,EACxE,uBAAM,yBAAyB,EAAE,GAAG,MAAM,SAAS;AAAA,EACnD,uBAAM,yBAAyB,EAAE,GAAG,MAAM,SAAS;AAAA,EACnD,uBAAM,0BAA0B,EAAE,GAAG,MAAM,UAAU;AACvD,CACF;;ACtJA;AAboB,IAApB;AAYO,IAXP;AAoBO,IAAM,sBAAsB,yBACjC,qBACA;AAAA,EACE,IAAI,sBAAK,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,2CAAsB;AAAA,EACpE,UAAU,sBAAK,WAAW,EACvB,QAAQ,EACR,WAAW,MAAM,YAAY,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAC3D,SAAS,sBAAK,UAAU,EACrB,QAAQ,EACR,WAAW,MAAM,WAAW,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAC1D,UAAU,sBAAK,UAAU,EAAE,QAAQ;AAAA,EACnC,QAAQ,sBAAK,QAAQ,EAAE,QAAQ;AAAA,EAC/B,UAAU,yBAAQ,UAAU,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACrD,YAAY,sBAAK,YAAY,EAAE,QAAQ,EAAE,QAAQ,CAAC;AAAA,EAClD,QAAQ,sBAAK,QAAQ;AAAA,EACrB,WAAW,2BAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,QAAQ,+BAAU;AAAA,EACvF,UAAU,2BAAU,aAAa,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,QAAQ,+BAAU;AAAA,EACrF,oBAAoB,uBAAM,sBAAsB,EAAE,MAAgB;AAAA,EAClE,WAAW,2BAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,QAAQ,+BAAU;AACzF,GACA,CAAC,UAAU;AAAA,EACT,uBAAM,8BAA8B,EAAE,GAAG,MAAM,QAAQ;AAAA,EACvD,uBAAM,uCAAuC,EAAE,GAAG,MAAM,UAAU,MAAM,MAAM;AAAA,EAC9E,wBAAO,wBAAwB,EAAE,GAC/B,MAAM,UACN,MAAM,UACN,MAAM,QACN,MAAM,OACR;AAAA,EACA,4BAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,MAAM,QAAQ;AAAA,IACxB,gBAAgB,CAAC,YAAY,EAAE;AAAA,EACjC,CAAC,EAAE,SAAS,SAAS;AAAA,EACrB,4BAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,MAAM,OAAO;AAAA,IACvB,gBAAgB,CAAC,WAAW,EAAE;AAAA,EAChC,CAAC,EAAE,SAAS,SAAS;AACvB,CACF;AAEO,IAAM,4BAA4B,yBACvC,2BACA;AAAA,EACE,IAAI,sBAAK,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,2CAAsB;AAAA,EACpE,SAAS,sBAAK,UAAU,EACrB,QAAQ,EACR,WAAW,MAAM,WAAW,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAC1D,SAAS,sBAAK,UAAU,EACrB,QAAQ,EACR,WAAW,MAAM,YAAY,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAC3D,SAAS,sBAAK,UAAU,EACrB,QAAQ,EACR,WAAW,MAAM,YAAY,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAC3D,YAAY,sBAAK,YAAY,EAAE,QAAQ,EAAE,QAAQ,CAAC;AAAA,EAClD,UAAU,uBAAM,UAAU;AAAA,EAC1B,QAAQ,sBAAK,QAAQ,EAAE,QAAQ,EAAE,QAAQ,SAAS;AAAA,EAClD,YAAY,2BAAU,eAAe,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,QAAQ,+BAAU;AAAA,EACzF,YAAY,2BAAU,eAAe,EAAE,cAAc,KAAK,CAAC;AAC7D,GACA,CAAC,UAAU;AAAA,EACT,uBAAM,oCAAoC,EAAE,GAAG,MAAM,MAAM;AAAA,EAC3D,uBAAM,kCAAkC,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO;AAAA,EACzE,4BAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,MAAM,OAAO;AAAA,IACvB,gBAAgB,CAAC,YAAY,EAAE;AAAA,EACjC,CAAC,EAAE,SAAS,SAAS;AAAA,EACrB,4BAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,MAAM,OAAO;AAAA,IACvB,gBAAgB,CAAC,YAAY,EAAE;AAAA,EACjC,CAAC,EAAE,SAAS,SAAS;AAAA,EACrB,4BAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,MAAM,OAAO;AAAA,IACvB,gBAAgB,CAAC,WAAW,EAAE;AAAA,EAChC,CAAC,EAAE,SAAS,SAAS;AACvB,CACF;AAOO,IAAM,qBAAqB,yBAChC,mBACA;AAAA,EACE,IAAI,sBAAK,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,2CAAsB;AAAA,EACpE,SAAS,sBAAK,UAAU,EACrB,QAAQ,EACR,WAAW,MAAM,WAAW,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAC1D,UAAU,sBAAK,WAAW,EACvB,QAAQ,EACR,WAAW,MAAM,YAAY,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAC3D,MAAM,sBAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,gBAAgB,sBAAK,kBAAkB;AAAA,EACvC,cAAc,sBAAK,eAAe,EAAE,QAAQ;AAAA,EAC5C,YAAY,sBAAK,YAAY,EAAE,QAAQ,EAAE,QAAQ,CAAC;AAAA,EAClD,UAAU,uBAAM,UAAU;AAAA,EAC1B,QAAQ,sBAAK,QAAQ,EAAE,QAAQ,EAAE,QAAQ,SAAS;AAAA,EAClD,YAAY,2BAAU,eAAe,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,QAAQ,+BAAU;AAAA,EACzF,YAAY,2BAAU,eAAe,EAAE,cAAc,KAAK,CAAC;AAC7D,GACA,CAAC,UAAU;AAAA,EACT,uBAAM,4BAA4B,EAAE,GAAG,MAAM,MAAM;AAAA,EACnD,uBAAM,4BAA4B,EAAE,GAAG,MAAM,QAAQ;AAAA,EACrD,4BAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,MAAM,QAAQ;AAAA,IACxB,gBAAgB,CAAC,YAAY,EAAE;AAAA,EACjC,CAAC,EAAE,SAAS,SAAS;AAAA,EACrB,4BAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,MAAM,OAAO;AAAA,IACvB,gBAAgB,CAAC,WAAW,EAAE;AAAA,EAChC,CAAC,EAAE,SAAS,SAAS;AACvB,CACF;;AC7IoB,IAApB;AACkE,IAAlE;AAUO,IAAM,WAAW,yBACtB,QACA;AAAA,EACE,IAAI,sBAAK,IAAI,EAAE,cAAc,EAAE,QAAQ;AAAA,EACvC,WAAW,2BAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,+BAAU,EAAE,QAAQ;AAAA,EACvF,UAAU,sBAAK,WAAW,EACvB,QAAQ,EACR,WAAW,MAAM,YAAY,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAC3D,MAAM,uBAAM,MAAM,EAAE,QAAQ;AAAA,EAC5B,MAAM,sBAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,QAAQ,sBAAK,SAAS,EACnB,QAAQ,EACR,WAAW,MAAM,UAAU,IAAI,EAAE,UAAU,UAAU,CAAC;AAC3D,GACA,CAAC,UAAU;AAAA,EACT,4BAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,MAAM,MAAM;AAAA,IACtB,gBAAgB,CAAC,UAAU,EAAE;AAAA,EAC/B,CAAC,EAAE,SAAS,SAAS;AAAA,EACrB,4BAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,MAAM,QAAQ;AAAA,IACxB,gBAAgB,CAAC,YAAY,EAAE;AAAA,EACjC,CAAC,EAAE,SAAS,SAAS;AACvB,CACF;;ACrCoB,IAApB;AAC4E,IAA5E;AAEO,IAAM,mBAAmB,yBAC9B,sBACA;AAAA,EACE,IAAI,sBAAK,IAAI,EAAE,WAAW,EAAE,QAAQ;AAAA,EACpC,SAAS,sBAAK,UAAU,EAAE,QAAQ;AAAA,EAClC,UAAU,sBAAK,WAAW,EAAE,QAAQ;AAAA,EACpC,UAAU,sBAAK,UAAU,EAAE,QAAQ;AAAA,EACnC,SAAS,sBAAK,SAAS,EAAE,QAAQ;AAAA,EACjC,UAAU,uBAAM,UAAU;AAAA,EAC1B,WAAW,sBAAK,WAAW,EAAE,MAAM;AAAA,EACnC,YAAY,sBAAK,YAAY,EAAE,QAAQ,CAAC;AAAA,EACxC,QAAQ,sBAAK,QAAQ;AAAA,EACrB,WAAW,2BAAU,YAAY,EAAE,QAAQ,+BAAU,EAAE,QAAQ;AAAA,EAC/D,WAAW,2BAAU,YAAY,EAAE,QAAQ,+BAAU,EAAE,QAAQ;AAAA,EAC/D,gBAAgB,2BAAU,kBAAkB;AAAA,EAC5C,aAAa,yBAAQ,cAAc,EAAE,QAAQ,CAAC;AAChD,GACA,CAAC,UAAU;AAAA,EACT,uBAAM,qCAAqC,EAAE,GAAG,MAAM,SAAS,MAAM,QAAQ;AAAA,EAC7E,uBAAM,iCAAiC,EAAE,GAAG,MAAM,QAAQ;AAAA,EAC1D,uBAAM,mCAAmC,EAAE,GAAG,MAAM,UAAU;AAAA,EAC9D,uBAAM,mCAAmC,EAAE,GAAG,MAAM,SAAS;AAC/D,CACF;;AC1BoB,IAApB;AACsD,IAAtD;AAEO,IAAM,mBAAmB,yBAC9B,sBACA;AAAA,EACE,IAAI,sBAAK,IAAI,EAAE,WAAW,EAAE,QAAQ;AAAA,EACpC,UAAU,sBAAK,WAAW,EAAE,QAAQ;AAAA,EACpC,YAAY,sBAAK,aAAa,EAAE,QAAQ;AAAA,EACxC,SAAS,sBAAK,UAAU,EAAE,QAAQ;AAAA,EAClC,YAAY,sBAAK,aAAa,EAAE,QAAQ;AAAA,EACxC,YAAY,2BAAU,aAAa,EAAE,QAAQ,+BAAU,EAAE,QAAQ;AACnE,GACA,CAAC,UAAU;AAAA,EACT,uBAAM,kCAAkC,EAAE,GAAG,MAAM,QAAQ;AAAA,EAC3D,uBAAM,iCAAiC,EAAE,GAAG,MAAM,OAAO;AAAA,EACzD,uBAAM,oCAAoC,EAAE,GAAG,MAAM,UAAU;AACjE,CACF;;AClBoB,IAApB;AACkE,IAAlE;AAGO,IAAM,eAAe,yBAAQ,oBAAoB;AAAA,EACtD,IAAI,sBAAK,IAAI,EAAE,WAAW;AAAA,EAC1B,WAAW,sBAAK,YAAY,EACzB,QAAQ,EACR,WAAW,MAAM,aAAa,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAC5D,UAAU,sBAAK,WAAW,EAAE,QAAQ;AAAA,EACpC,SAAS,sBAAK,SAAS,EAAE,QAAQ;AAAA,EACjC,YAAY,uBAAM,aAAa;AAAA,EAC/B,wBAAwB,sBAAK,6BAA6B,EAAE,WAC1D,MAAmB,aAAa,IAChC;AAAA,IACE,UAAU;AAAA,EACZ,CACF;AAAA,EACA,YAAY,sBAAK,aAAa;AAAA,EAC9B,UAAU,sBAAK,WAAW;AAAA,EAC1B,UAAU,uBAAM,UAAU;AAAA,EAC1B,WAAW,2BAAU,cAAc,EAAE,MAAM,OAAO,CAAC,EAAE,QAAQ,2CAAsB,EAAE,QAAQ;AAAA,EAC7F,WAAW,2BAAU,cAAc,EAAE,MAAM,OAAO,CAAC,EAAE,QAAQ,2CAAsB,EAAE,QAAQ;AAC/F,CAAC;;ACtBD;AAD0C,IAA1C;AAIO,IAAM,2BAA2B,yBACtC,yBACA;AAAA,EACE,iBAAiB,sBAAK,mBAAmB,EACtC,QAAQ,EACR,WAAW,MAAM,mBAAmB,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAClE,SAAS,sBAAK,UAAU,EACrB,QAAQ,EACR,WAAW,MAAM,WAAW,IAAI,EAAE,UAAU,UAAU,CAAC;AAC5D,GACA,CAAC,UAAU,CAAC,4BAAW,EAAE,SAAS,CAAC,MAAM,iBAAiB,MAAM,OAAO,EAAE,CAAC,CAAC,CAC7E;;ACbA;AAFoB,IAApB;AAC0E,IAA1E;AAOO,IAAM,wBAAwB,yBACnC,qBACA;AAAA,EACE,IAAI,sBAAK,IAAI,EAAE,WAAW,EAAE,cAAc;AAAA,EAE1C,SAAS,sBAAK,SAAS,EAAE,QAAQ;AAAA,EAEjC,UAAU,sBAAK,WAAW,EAAE,QAAQ;AAAA,EAEpC,WAAW,2BAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,+BAAU,EAAE,QAAQ;AAAA,EAEvF,UAAU,uBAAM,UAAU,EAAE,QAAQ,qCAAgB;AAAA,EAEpD,SAAS,sBAAK,UAAU,EACrB,QAAQ,EACR,WAAW,MAAM,WAAW,IAAI,EAAE,UAAU,UAAU,CAAC;AAC5D,GACA,CAAC,UAAU;AAAA,EAET,uBAAM,qCAAqC,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO;AAAA,EAE5E,6BAAY,4CAA4C,EAAE,GACxD,MAAM,UACN,MAAM,SACN,MAAM,OACR;AACF,CACF;;ACjCA;AAFoB,IAApB;AAC0E,IAA1E;AAOO,IAAM,sBAAsB,yBACjC,oBACA;AAAA,EACE,IAAI,sBAAK,IAAI,EAAE,WAAW,EAAE,cAAc;AAAA,EAE1C,SAAS,sBAAK,SAAS,EAAE,QAAQ;AAAA,EAEjC,UAAU,sBAAK,WAAW,EAAE,QAAQ;AAAA,EAEpC,MAAM,sBAAK,MAAM,EAAE,QAAQ;AAAA,EAE3B,WAAW,2BAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,+BAAU,EAAE,QAAQ;AAAA,EAEvF,YAAY,2BAAU,gBAAgB,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,+BAAU,EAAE,QAAQ;AAAA,EAE1F,UAAU,uBAAM,UAAU,EAAE,QAAQ,qCAAgB;AAAA,EAEpD,SAAS,sBAAK,UAAU,EACrB,QAAQ,EACR,WAAW,MAAM,WAAW,IAAI,EAAE,UAAU,UAAU,CAAC;AAC5D,GACA,CAAC,UAAU;AAAA,EAET,uBAAM,oCAAoC,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO;AAAA,EAE3E,6BAAY,yCAAyC,EAAE,GACrD,MAAM,MACN,MAAM,SACN,MAAM,OACR;AAAA,EAEA,6BAAY,2CAA2C,EAAE,GACvD,MAAM,UACN,MAAM,SACN,MAAM,OACR;AACF,CACF;;AC3CA;AAFoB,IAApB;AACkE,IAAlE;AAUO,IAAM,mBAAmB,yBAC9B,gBACA;AAAA,EACE,IAAI,sBAAK,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,2CAAsB;AAAA,EACpE,WAAW,2BAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,+BAAU,EAAE,QAAQ;AAAA,EACvF,UAAU,sBAAK,WAAW,EAAE,WAAW,MAAM,YAAY,IAAI;AAAA,IAC3D,UAAU;AAAA,EACZ,CAAC;AAAA,EACD,QAAQ,sBAAK,SAAS,EAAE,WAAW,MAAM,UAAU,IAAI;AAAA,IACrD,UAAU;AAAA,EACZ,CAAC;AAAA,EACD,SAAS,sBAAK,UAAU,EAAE,WAAW,MAAM,WAAW,IAAI;AAAA,IACxD,UAAU;AAAA,EACZ,CAAC;AAAA,EACD,WAAW,sBAAK,YAAY;AAC9B,GACA,CAAC,UAAU;AAAA,EAET,uBAAM,uBAAuB,EAAE,GAAG,MAAM,QAAQ;AAAA,EAChD,uBAAM,uBAAuB,EAAE,GAAG,MAAM,MAAM;AAAA,EAC9C,4BAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,MAAM,MAAM;AAAA,IACtB,gBAAgB,CAAC,UAAU,EAAE;AAAA,EAC/B,CAAC,EAAE,SAAS,SAAS;AAAA,EACrB,4BAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,MAAM,QAAQ;AAAA,IACxB,gBAAgB,CAAC,YAAY,EAAE;AAAA,EACjC,CAAC,EAAE,SAAS,SAAS;AACvB,CACF;;AC/BA;AAXoB,IAApB;AAUO,IATP;AAiBO,IAAM,oBAAoB,yBAC/B,iBACA;AAAA,EACE,IAAI,sBAAK,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,2CAAsB;AAAA,EACpE,WAAW,2BAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,+BAAU,EAAE,QAAQ;AAAA,EACvF,gBAAgB,sBAAK,kBAAkB,EACpC,QAAQ,EACR,WAAW,MAAM,YAAY,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAC3D,gBAAgB,sBAAK,kBAAkB,EACpC,QAAQ,EACR,WAAW,MAAM,YAAY,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAC3D,SAAS,sBAAK,UAAU,EACrB,QAAQ,EACR,WAAW,MAAM,WAAW,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAC1D,MAAM,sBAAK,MAAM,EAAE,MAAM;AAAA,EACzB,UAAU,uBAAM,UAAU;AAC5B,GACA,CAAC,UAAU;AAAA,EACT,uBAAM,yBAAyB,EAAE,GAAG,MAAM,gBAAgB,MAAM,cAAc;AAAA,EAC9E,wBAAO,qBAAqB,EAAE,GAAG,MAAM,gBAAgB,MAAM,gBAAgB,MAAM,OAAO;AAAA,EAC1F,4BAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,MAAM,cAAc;AAAA,IAC9B,gBAAgB,CAAC,YAAY,EAAE;AAAA,EACjC,CAAC,EAAE,SAAS,SAAS;AAAA,EACrB,4BAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC,MAAM,cAAc;AAAA,IAC9B,gBAAgB,CAAC,YAAY,EAAE;AAAA,EACjC,CAAC,EAAE,SAAS,SAAS;AACvB,CACF;;;AxBNA;;;AyB3CoB,IAApB;AAC4E,IAA5E;AAEO,IAAM,mBAAmB,yBAC9B,qBACA;AAAA,EACE,IAAI,sBAAK,IAAI,EAAE,WAAW,EAAE,QAAQ;AAAA,EACpC,SAAS,sBAAK,UAAU,EAAE,QAAQ;AAAA,EAClC,QAAQ,sBAAK,SAAS,EAAE,QAAQ;AAAA,EAChC,UAAU,sBAAK,WAAW;AAAA,EAC1B,SAAS,sBAAK,SAAS,EAAE,QAAQ;AAAA,EACjC,cAAc,yBAAQ,eAAe,EAAE,QAAQ;AAAA,EAC/C,mBAAmB,yBAAQ,qBAAqB,EAAE,QAAQ,CAAC,EAAE,QAAQ;AAAA,EACrE,WAAW,2BAAU,YAAY,EAAE,QAAQ;AAAA,EAC3C,SAAS,2BAAU,UAAU,EAAE,QAAQ;AAAA,EACvC,QAAQ,uBAAM,QAAQ,EAAE,MAAgB;AAAA,EACxC,UAAU,uBAAM,UAAU;AAAA,EAC1B,WAAW,sBAAK,WAAW,EAAE,MAAM;AAAA,EACnC,WAAW,2BAAU,YAAY,EAAE,QAAQ,+BAAU,EAAE,QAAQ;AAAA,EAC/D,WAAW,2BAAU,YAAY,EAAE,QAAQ,+BAAU,EAAE,QAAQ;AACjE,GACA,CAAC,UAAU;AAAA,EACT,uBAAM,kCAAkC,EAAE,GAAG,MAAM,SAAS,MAAM,MAAM;AAAA,EACxE,uBAAM,8BAA8B,EAAE,GAAG,MAAM,QAAQ;AAAA,EACvD,uBAAM,kCAAkC,EAAE,GAAG,MAAM,SAAS;AAC9D,CACF;;ACxBA;AAFoB,IAApB;AACsD,IAAtD;AAQO,IAAM,YAAY,yBAAQ,SAAS;AAAA,EACxC,IAAI,sBAAK,IAAI,EAAE,WAAW,EAAE,cAAc;AAAA,EAC1C,MAAM,sBAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,aAAa,sBAAK,aAAa;AAAA,EAC/B,QAAQ,sBAAK,SAAS;AAAA,EACtB,SAAS,sBAAK,UAAU;AAAA,EACxB,UAAU,sBAAK,WAAW;AAAA,EAC1B,SAAS,sBAAK,UAAU,EACrB,QAAQ,EACR,WAAW,MAAM,WAAW,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA,EAC1D,MAAM,sBAAK,MAAM,EAAE,MAAM,EAAE,QAAQ,sCAAiB;AAAA,EACpD,UAAU,uBAAM,UAAU,EAAE,QAAQ,qCAAgB;AAAA,EACpD,WAAW,2BAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,WAAW;AAAA,EACtE,WAAW,2BAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,WAAW;AACxE,CAAC;;ACvB0B,IAA3B;AAuByD,IAAzD;AAWA,IAAM,2BAA2B;AACjC,IAAM,qCACJ;AAEF,SAAS,yBAAyB,CAAC,OAA2B;AAAA,EAC5D,IAAI,UAAU,QAAQ,UAAU;AAAA,IAAW,OAAO;AAAA,EAClD,IAAI,MAAM,QAAQ,KAAK,GAAG;AAAA,IACxB,OAAO,MAAM,IAAI,yBAAyB;AAAA,EAC5C;AAAA,EACA,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,MAAM,WAAuC,CAAC;AAAA,IAC9C,YAAY,KAAK,SAAS,OAAO,QAAQ,KAAgC,GAAG;AAAA,MAC1E,SAAS,OAAO,mCAAmC,KAAK,GAAG,IACvD,2BACA,0BAA0B,IAAI;AAAA,IACpC;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;AAAA,IACxF,OAAO;AAAA,EACT;AAAA,EACA,OAAO,OAAO,KAAK;AAAA;AAGrB,SAAS,4BAA4B,CACnC,UAC4B;AAAA,EAC5B,OAAO,0BAA0B,YAAY,CAAC,CAAC;AAAA;AAGjD,SAAS,SAAS,CAAC,OAAuB;AAAA,EACxC,OAAO,8BAAW,QAAQ,EAAE,OAAO,OAAO,MAAM,EAAE,OAAO,KAAK;AAAA;AAGhE,SAAS,YAAY,CAAC,OAA+C;AAAA,EACnE,IAAI,SAAS;AAAA,IAAM,OAAO;AAAA,EAC1B,OAAO,MAAM,QAAQ;AAAA;AAGvB,SAAS,eAAe,CAAC,OAAkE;AAAA,EACzF,IAAI,UAAU;AAAA,IAAW;AAAA,EACzB,IAAI,UAAU;AAAA,IAAM,OAAO;AAAA,EAC3B,OAAO,iBAAiB,OAAO,QAAQ,IAAI,KAAK,KAAK;AAAA;AAGvD,SAAS,YAAY,CAAC,OAA4C;AAAA,EAChE,IAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAAA,IAC/D,OAAO;AAAA,EACT;AAAA,EACA,OAAO,CAAC;AAAA;AAGV,SAAS,aAAa,CAAC,OAA0B;AAAA,EAC/C,OAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,IAAI,CAAC,UAAU,OAAO,KAAK,CAAC,IAAI,CAAC;AAAA;AA2CvE,SAAS,aAAa,CAAC,KAAkD;AAAA,EACvE,OAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,SAAS,IAAI;AAAA,IACb,UAAU,IAAI;AAAA,IACd,YAAY,IAAI;AAAA,IAChB,YAAY,IAAI,cAAc;AAAA,IAC9B,aAAa,IAAI,eAAe;AAAA,IAChC,UAAU,IAAI,YAAY;AAAA,IAC1B,OAAO,IAAI,SAAS;AAAA,IACpB,gBAAgB,IAAI,kBAAkB;AAAA,IACtC,iBAAiB,IAAI,mBAAmB;AAAA,IACxC,MAAM,IAAI;AAAA,IACV,SAAS,cAAc,IAAI,OAAO;AAAA,IAClC,YAAY,IAAI;AAAA,IAChB,QAAQ,IAAI;AAAA,IACZ,QAAQ,cAAc,IAAI,MAAM;AAAA,IAChC,cAAc,cAAc,IAAI,YAAY;AAAA,IAC5C,SAAS,aAAa,IAAI,OAAO;AAAA,IACjC,UAAU,aAAa,IAAI,QAAQ;AAAA,IACnC,aAAa,IAAI,YAAY,QAAQ;AAAA,IACrC,YAAY,aAAa,IAAI,UAAU;AAAA,IACvC,WAAW,aAAa,IAAI,SAAS;AAAA,IACrC,WAAW,IAAI,UAAU,QAAQ;AAAA,IACjC,WAAW,IAAI,UAAU,QAAQ;AAAA,EACnC;AAAA;AAGF,SAAS,gBAAgB,CAAC,KAAkE;AAAA,EAC1F,OAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,WAAW,IAAI;AAAA,IACf,SAAS,IAAI;AAAA,IACb,UAAU,IAAI;AAAA,IACd,gBAAgB,IAAI;AAAA,IACpB,UAAU,IAAI;AAAA,IACd,UAAU,aAAa,IAAI,QAAQ;AAAA,IACnC,WAAW,aAAa,IAAI,SAAS;AAAA,IACrC,gBAAgB,aAAa,IAAI,cAAc;AAAA,IAC/C,WAAW,IAAI,UAAU,QAAQ;AAAA,IACjC,WAAW,IAAI,UAAU,QAAQ;AAAA,EACnC;AAAA;AAGF,SAAS,WAAW,CAAC,KAA0D;AAAA,EAC7E,OAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,WAAY,IAAI,aAAa;AAAA,IAC7B,SAAS,IAAI;AAAA,IACb,UAAU,IAAI;AAAA,IACd,SAAS,IAAI,WAAW;AAAA,IACxB,QAAQ,IAAI;AAAA,IACZ,SAAS,IAAI;AAAA,IACb,UAAU,aAAa,IAAI,QAAQ;AAAA,IACnC,WAAW,IAAI,UAAU,QAAQ;AAAA,EACnC;AAAA;AAGF,SAAS,eAAe,CAAC,KAAoC;AAAA,EAC3D,OAAO;AAAA,IACL,WAAW,IAAI;AAAA,IACf,SAAS,IAAI;AAAA,IACb,UAAU,IAAI;AAAA,IACd,WAAY,IAAI,aAAa;AAAA,IAC7B,aAAa,IAAI,eAAe;AAAA,IAChC,iBAAiB,IAAI,mBAAmB;AAAA,IACxC,QAAQ,cAAc,IAAI,MAAM;AAAA,IAChC,UAAU,aAAa,IAAI,QAAQ;AAAA,IACnC,WAAW,IAAI,UAAU,QAAQ;AAAA,IACjC,WAAW,IAAI,UAAU,QAAQ;AAAA,IACjC,YAAY,aAAa,IAAI,UAAU;AAAA,IACvC,YAAY,IAAI,cAAc;AAAA,EAChC;AAAA;AAAA;AAYK,MAAM,sBAAuC;AAAA,EACtB;AAAA,EAA5B,WAAW,CAAiB,KAAmB;AAAA,IAAnB;AAAA;AAAA,MAEhB,EAAE,GAAoB;AAAA,IAChC,OAAO,KAAK,IAAI,MAAM;AAAA;AAAA,OAGlB,aAAY,CAAC,SAAsC,CAAC,GAAsC;AAAA,IAC9F,OAAO,KAAK,IAAI,UAAU,YAAY;AAAA,MACpC,MAAM,UAAW,OAAO,WAAW,KAAK,IAAI;AAAA,MAC5C,MAAM,aAAa;AAAA,QACjB,wBAAG,uBAAuB,SAAS,OAAO;AAAA,QAC1C,4BAAO,uBAAuB,SAAS;AAAA,MACzC;AAAA,MACA,IAAI,OAAO,UAAU;AAAA,QACnB,WAAW,KAAK,wBAAG,uBAAuB,UAAU,OAAO,QAAQ,CAAC;AAAA,MACtE;AAAA,MACA,IAAI,OAAO,QAAQ;AAAA,QACjB,WAAW,KAAK,wBAAG,uBAAuB,QAAQ,OAAO,MAAM,CAAC;AAAA,MAClE;AAAA,MACA,MAAM,QAAQ,OAAO,SAAS;AAAA,MAC9B,MAAM,SAAS,OAAO,UAAU;AAAA,MAChC,MAAM,OAAO,MAAM,KAAK,GACrB,OAAO,EACP,KAAK,sBAAsB,EAC3B,MAAM,yBAAI,GAAG,UAAU,CAAC,EACxB,QAAQ,0BAAK,uBAAuB,SAAS,GAAG,uBAAuB,EAAE,EACzE,MAAM,KAAK,EACX,OAAO,MAAM;AAAA,MAChB,OAAO,KAAK,IAAI,aAAa;AAAA,OAC5B,oCAAoC;AAAA;AAAA,OAGnC,WAAU,CAAC,QAA2E;AAAA,IAC1F,OAAO,KAAK,IAAI,UAAU,YAAY;AAAA,MACpC,MAAM,UAAW,OAAO,WAAW,KAAK,IAAI;AAAA,MAC5C,MAAM,aAAa;AAAA,QACjB,wBAAG,uBAAuB,SAAS,OAAO;AAAA,QAC1C,4BAAO,uBAAuB,SAAS;AAAA,MACzC;AAAA,MACA,IAAI,OAAO,IAAI;AAAA,QACb,WAAW,KAAK,wBAAG,uBAAuB,IAAI,OAAO,EAAE,CAAC;AAAA,MAC1D,EAAO;AAAA,QACL,IAAI,CAAC,OAAO,YAAY,CAAC,OAAO,YAAY;AAAA,UAC1C,MAAM,IAAI,MAAM,0DAA0D;AAAA,QAC5E;AAAA,QACA,WAAW,KACT,wBAAG,uBAAuB,UAAU,OAAO,QAAQ,GACnD,wBAAG,uBAAuB,YAAY,OAAO,UAAU,CACzD;AAAA;AAAA,MAEF,MAAM,OAAO,MAAM,KAAK,GACrB,OAAO,EACP,KAAK,sBAAsB,EAC3B,MAAM,yBAAI,GAAG,UAAU,CAAC,EACxB,MAAM,CAAC;AAAA,MACV,MAAM,MAAM,KAAK;AAAA,MACjB,OAAO,MAAM,cAAc,GAAG,IAAI;AAAA,OACjC,kCAAkC;AAAA;AAAA,OAGjC,cAAa,CAAC,QAAuE;AAAA,IACzF,OAAO,KAAK,IAAI,UAAU,YAAY;AAAA,MACpC,MAAM,UAAW,OAAO,WAAW,KAAK,IAAI;AAAA,MAC5C,MAAM,cAAc,gBAAgB,OAAO,WAAW;AAAA,MACtD,MAAM,aAAa,gBAAgB,OAAO,UAAU;AAAA,MACpD,MAAM,YAAY,gBAAgB,OAAO,SAAS;AAAA,MAElD,MAAM,eAA2D;AAAA,QAC/D;AAAA,QACA,UAAU,OAAO;AAAA,QACjB,YAAY,OAAO;AAAA,QACnB,YAAY,OAAO,cAAc;AAAA,QACjC,aAAa,OAAO,eAAe;AAAA,QACnC,UAAU,OAAO,YAAY;AAAA,QAC7B,OAAO,OAAO,SAAS;AAAA,QACvB,gBAAgB,OAAO,kBAAkB;AAAA,QACzC,iBAAiB,OAAO,mBAAmB;AAAA,QAC3C,MAAM,OAAO,QAAQ;AAAA,QACrB,SAAS,OAAO,UAAU,CAAC,GAAG,OAAO,OAAO,IAAI,CAAC,WAAW;AAAA,QAC5D,YAAY,OAAO,cAAc;AAAA,QACjC,QAAQ,OAAO,UAAU;AAAA,QACzB,QAAQ,OAAO,SAAS,CAAC,GAAG,OAAO,MAAM,IAAI,CAAC;AAAA,QAC9C,cAAc,OAAO,eAAe,CAAC,GAAG,OAAO,YAAY,IAAI,CAAC;AAAA,QAChE,SAAS,OAAO,WAAW,CAAC;AAAA,QAC5B,UAAU,OAAO,YAAY,CAAC;AAAA,WAC1B,OAAO,KAAK,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC;AAAA,WACjC,gBAAgB,YAAY,EAAE,aAAa,eAAe,IAAI,KAAO,IAAI,CAAC;AAAA,WAC1E,eAAe,YAAY,EAAE,WAAW,IAAI,CAAC;AAAA,WAC7C,cAAc,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,MACjD;AAAA,MAEA,MAAM,YAAqC;AAAA,QACzC,WAAW,IAAI;AAAA,MACjB;AAAA,MACA,IAAI,OAAO,eAAe;AAAA,QAAW,UAAU,aAAa,OAAO;AAAA,MACnE,IAAI,OAAO,gBAAgB;AAAA,QAAW,UAAU,cAAc,OAAO;AAAA,MACrE,IAAI,OAAO,aAAa;AAAA,QAAW,UAAU,WAAW,OAAO;AAAA,MAC/D,IAAI,OAAO,UAAU;AAAA,QAAW,UAAU,QAAQ,OAAO;AAAA,MACzD,IAAI,OAAO,mBAAmB;AAAA,QAAW,UAAU,iBAAiB,OAAO;AAAA,MAC3E,IAAI,OAAO,oBAAoB;AAAA,QAAW,UAAU,kBAAkB,OAAO;AAAA,MAC7E,IAAI,OAAO,SAAS;AAAA,QAAW,UAAU,OAAO,OAAO;AAAA,MACvD,IAAI,OAAO,YAAY;AAAA,QAAW,UAAU,UAAU,CAAC,GAAG,OAAO,OAAO;AAAA,MACxE,IAAI,OAAO,eAAe;AAAA,QAAW,UAAU,aAAa,OAAO;AAAA,MACnE,IAAI,OAAO,WAAW;AAAA,QAAW,UAAU,SAAS,OAAO;AAAA,MAC3D,IAAI,OAAO,WAAW;AAAA,QAAW,UAAU,SAAS,CAAC,GAAG,OAAO,MAAM;AAAA,MACrE,IAAI,OAAO,iBAAiB;AAAA,QAAW,UAAU,eAAe,CAAC,GAAG,OAAO,YAAY;AAAA,MACvF,IAAI,OAAO,YAAY;AAAA,QAAW,UAAU,UAAU,OAAO;AAAA,MAC7D,IAAI,OAAO,aAAa;AAAA,QAAW,UAAU,WAAW,OAAO;AAAA,MAC/D,IAAI,gBAAgB,aAAa,gBAAgB,MAAM;AAAA,QACrD,UAAU,cAAc;AAAA,MAC1B;AAAA,MACA,IAAI,eAAe;AAAA,QAAW,UAAU,aAAa;AAAA,MACrD,UAAU,YAAY,cAAc,YAAY,OAAO;AAAA,MAEvD,IAAI,OAAO,IAAI;AAAA,QACb,MAAM,WAAW,MAAM,KAAK,GACzB,OAAO,EAAE,IAAI,uBAAuB,GAAG,CAAC,EACxC,KAAK,sBAAsB,EAC3B,MACC,yBACE,wBAAG,uBAAuB,SAAS,OAAO,GAC1C,wBAAG,uBAAuB,IAAI,OAAO,EAAE,GACvC,4BAAO,uBAAuB,SAAS,CACzC,CACF,EACC,MAAM,CAAC;AAAA,QACV,IAAI,SAAS,SAAS,GAAG;AAAA,UACvB,MAAM,UAAU,MAAM,KAAK,GACxB,OAAO,sBAAsB,EAC7B,IAAI;AAAA,eACA;AAAA,YACH,YAAY,OAAO;AAAA,UACrB,CAAC,EACA,MACC,yBACE,wBAAG,uBAAuB,SAAS,OAAO,GAC1C,wBAAG,uBAAuB,IAAI,OAAO,EAAE,CACzC,CACF,EACC,UAAU;AAAA,UACb,MAAM,OAAM,QAAQ;AAAA,UACpB,IAAI,CAAC,MAAK;AAAA,YACR,MAAM,IAAI,MAAM,oCAAoC;AAAA,UACtD;AAAA,UACA,OAAO,cAAc,IAAG;AAAA,QAC1B;AAAA,MACF;AAAA,MAEA,MAAM,WAAW,MAAM,KAAK,GACzB,OAAO,sBAAsB,EAC7B,OAAO,YAAY,EACnB,mBAAmB;AAAA,QAClB,QAAQ;AAAA,UACN,uBAAuB;AAAA,UACvB,uBAAuB;AAAA,UACvB,uBAAuB;AAAA,QACzB;AAAA,QACA,aAAa,2BAAM,uBAAuB;AAAA,QAC1C,KAAK;AAAA,MACP,CAAC,EACA,UAAU;AAAA,MAEb,MAAM,MAAM,SAAS;AAAA,MACrB,IAAI,CAAC,KAAK;AAAA,QACR,MAAM,IAAI,MAAM,oCAAoC;AAAA,MACtD;AAAA,MACA,OAAO,cAAc,GAAG;AAAA,OACvB,qCAAqC;AAAA;AAAA,OAGpC,cAAa,CAAC,QAAwD;AAAA,IAC1E,OAAO,KAAK,IAAI,UAAU,YAAY;AAAA,MACpC,MAAM,UAAW,OAAO,WAAW,KAAK,IAAI;AAAA,MAC5C,MAAM,aAAa,CAAC,wBAAG,uBAAuB,SAAS,OAAO,CAAC;AAAA,MAC/D,IAAI,OAAO,IAAI;AAAA,QACb,WAAW,KAAK,wBAAG,uBAAuB,IAAI,OAAO,EAAE,CAAC;AAAA,MAC1D,EAAO;AAAA,QACL,IAAI,CAAC,OAAO,YAAY,CAAC,OAAO,YAAY;AAAA,UAC1C,MAAM,IAAI,MAAM,6DAA6D;AAAA,QAC/E;AAAA,QACA,WAAW,KACT,wBAAG,uBAAuB,UAAU,OAAO,QAAQ,GACnD,wBAAG,uBAAuB,YAAY,OAAO,UAAU,CACzD;AAAA;AAAA,MAEF,MAAM,MAAM,IAAI;AAAA,MAChB,MAAM,UAAU,MAAM,KAAK,GACxB,OAAO,sBAAsB,EAC7B,IAAI,EAAE,WAAW,KAAK,QAAQ,YAAY,WAAW,IAAI,CAAC,EAC1D,MAAM,yBAAI,GAAG,UAAU,CAAC,EACxB,UAAU;AAAA,MACb,OAAO,QAAQ,SAAS;AAAA,OACvB,qCAAqC;AAAA;AAAA,OAGpC,iBAAgB,CACpB,QAC6C;AAAA,IAC7C,OAAO,KAAK,IAAI,UAAU,YAAY;AAAA,MACpC,IAAI,CAAC,OAAO,YAAY;AAAA,QACtB,OAAO;AAAA,MACT;AAAA,MACA,MAAM,aAAa;AAAA,QACjB,wBAAG,sBAAsB,WAAW,OAAO,SAAS;AAAA,QACpD,wBAAG,sBAAsB,YAAY,OAAO,UAAU;AAAA,QACtD,wBAAG,sBAAsB,YAAY,OAAO,UAAU;AAAA,MACxD;AAAA,MACA,MAAM,OAAO,MAAM,KAAK,GACrB,OAAO,EACP,KAAK,qBAAqB,EAC1B,MAAM,yBAAI,GAAG,UAAU,CAAC,EACxB,MAAM,CAAC;AAAA,MACV,MAAM,MAAM,KAAK;AAAA,MACjB,OAAO,MACH;AAAA,QACE,IAAI,IAAI;AAAA,QACR,YAAY,IAAI;AAAA,QAChB,WAAW,IAAI;AAAA,QACf,YAAY,IAAI;AAAA,QAChB,eAAe,IAAI;AAAA,QACnB,YAAY,IAAI;AAAA,QAChB,YAAY,OAAO,IAAI,UAAU;AAAA,MACnC,IACA;AAAA,OACH,wCAAwC;AAAA;AAAA,OAGvC,iBAAgB,CACpB,QAC8C;AAAA,IAC9C,OAAO,KAAK,IAAI,UAAU,YAAY;AAAA,MACpC,MAAM,UAAU,MAAM,KAAK,WAAW,EAAE,IAAI,OAAO,UAAU,CAAC;AAAA,MAC9D,IAAI,CAAC,SAAS;AAAA,QACZ,MAAM,IAAI,MAAM,gCAAgC,OAAO,WAAW;AAAA,MACpE;AAAA,MACA,MAAM,YAAY,gBAAgB,OAAO,SAAS;AAAA,MAClD,MAAM,iBAAiB,gBAAgB,OAAO,cAAc;AAAA,MAE5D,MAAM,eAAqE;AAAA,QACzE,WAAW,OAAO;AAAA,QAClB,SAAS,QAAQ;AAAA,QACjB,UAAU,QAAQ;AAAA,QAClB,gBAAgB,OAAO;AAAA,QACvB,UAAU,OAAO;AAAA,QACjB,UAAU,OAAO,YAAY,CAAC;AAAA,WAC1B,cAAc,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,WAC3C,mBAAmB,YAAY,EAAE,eAAe,IAAI,CAAC;AAAA,MAC3D;AAAA,MAEA,MAAM,YAAqC;AAAA,QACzC,UAAU,OAAO;AAAA,QACjB,WAAW,IAAI;AAAA,MACjB;AAAA,MACA,IAAI,OAAO,aAAa;AAAA,QAAW,UAAU,WAAW,OAAO;AAAA,MAC/D,IAAI,cAAc;AAAA,QAAW,UAAU,YAAY;AAAA,MACnD,IAAI,mBAAmB;AAAA,QAAW,UAAU,iBAAiB;AAAA,MAE7D,MAAM,WAAW,MAAM,KAAK,GACzB,OAAO,gCAAgC,EACvC,OAAO,YAAY,EACnB,mBAAmB;AAAA,QAClB,QAAQ;AAAA,UACN,iCAAiC;AAAA,UACjC,iCAAiC;AAAA,QACnC;AAAA,QACA,KAAK;AAAA,MACP,CAAC,EACA,UAAU;AAAA,MAEb,MAAM,MAAM,SAAS;AAAA,MACrB,IAAI,CAAC,KAAK;AAAA,QACR,MAAM,IAAI,MAAM,mDAAmD;AAAA,MACrE;AAAA,MACA,OAAO,iBAAiB,GAAG;AAAA,OAC1B,wCAAwC;AAAA;AAAA,OAGvC,iBAAgB,CACpB,QACqD;AAAA,IACrD,OAAO,KAAK,IAAI,UAAU,YAAY;AAAA,MACpC,MAAM,UAAU,MAAM,KAAK,WAAW,EAAE,IAAI,OAAO,UAAU,CAAC;AAAA,MAC9D,IAAI,CAAC;AAAA,QAAS,OAAO;AAAA,MACrB,MAAM,OAAO,MAAM,KAAK,GACrB,OAAO,EACP,KAAK,gCAAgC,EACrC,MACC,yBACE,wBAAG,iCAAiC,SAAS,KAAK,IAAI,OAAe,GACrE,wBAAG,iCAAiC,WAAW,OAAO,SAAS,GAC/D,wBAAG,iCAAiC,gBAAgB,OAAO,cAAc,CAC3E,CACF,EACC,MAAM,CAAC;AAAA,MACV,MAAM,MAAM,KAAK;AAAA,MACjB,OAAO,MAAM,iBAAiB,GAAG,IAAI;AAAA,OACpC,wCAAwC;AAAA;AAAA,OAGvC,mBAAkB,CACtB,QACgD;AAAA,IAChD,OAAO,KAAK,IAAI,UAAU,YAAY;AAAA,MACpC,MAAM,UAAU,MAAM,KAAK,WAAW,EAAE,IAAI,OAAO,UAAU,CAAC;AAAA,MAC9D,IAAI,CAAC;AAAA,QAAS,OAAO,CAAC;AAAA,MACtB,MAAM,OAAO,MAAM,KAAK,GACrB,OAAO,EACP,KAAK,gCAAgC,EACrC,MACC,yBACE,wBAAG,iCAAiC,SAAS,KAAK,IAAI,OAAe,GACrE,wBAAG,iCAAiC,WAAW,OAAO,SAAS,CACjE,CACF,EACC,QACC,0BAAK,iCAAiC,SAAS,GAC/C,iCAAiC,EACnC;AAAA,MACF,OAAO,KAAK,IAAI,gBAAgB;AAAA,OAC/B,0CAA0C;AAAA;AAAA,OAGzC,iBAAgB,CACpB,QAC2C;AAAA,IAC3C,OAAO,KAAK,IAAI,UAAU,YAAY;AAAA,MACpC,IAAI,UAAW,OAAO,WAAW,KAAK,IAAI;AAAA,MAC1C,IAAI,WAAW,OAAO;AAAA,MACtB,IAAI,OAAO,cAAc,CAAC,OAAO,WAAW,CAAC,WAAW;AAAA,QACtD,MAAM,UAAU,MAAM,KAAK,WAAW,EAAE,IAAI,OAAO,UAAU,CAAC;AAAA,QAC9D,IAAI,CAAC,SAAS;AAAA,UACZ,MAAM,IAAI,MAAM,gCAAgC,OAAO,WAAW;AAAA,QACpE;AAAA,QACA,UAAU,QAAQ;AAAA,QAClB,WAAW,QAAQ;AAAA,MACrB;AAAA,MACA,IAAI,CAAC,UAAU;AAAA,QACb,MAAM,IAAI,MAAM,iEAAiE;AAAA,MACnF;AAAA,MACA,MAAM,YAAY,gBAAgB,OAAO,SAAS;AAAA,MAClD,MAAM,eAAqE;AAAA,QACzE,WAAW,OAAO,aAAa;AAAA,QAC/B;AAAA,QACA;AAAA,QACA,SAAS,OAAO,WAAW;AAAA,QAC3B,QAAQ,OAAO;AAAA,QACf,SAAS,OAAO,WAAW;AAAA,QAC3B,UAAU,6BAA6B,OAAO,QAAQ;AAAA,WAClD,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,MACnC;AAAA,MACA,MAAM,WAAW,MAAM,KAAK,GACzB,OAAO,gCAAgC,EACvC,OAAO,YAAY,EACnB,UAAU;AAAA,MACb,MAAM,MAAM,SAAS;AAAA,MACrB,IAAI,CAAC,KAAK;AAAA,QACR,MAAM,IAAI,MAAM,gDAAgD;AAAA,MAClE;AAAA,MACA,OAAO,YAAY,GAAG;AAAA,OACrB,wCAAwC;AAAA;AAAA,OAGvC,gBAAe,CACnB,SAAgD,CAAC,GACJ;AAAA,IAC7C,OAAO,KAAK,IAAI,UAAU,YAAY;AAAA,MACpC,MAAM,aAA6B,CAAC;AAAA,MACpC,MAAM,UAAW,OAAO,WAAW,KAAK,IAAI;AAAA,MAC5C,WAAW,KAAK,wBAAG,iCAAiC,SAAS,OAAO,CAAC;AAAA,MACrE,IAAI,OAAO,UAAU;AAAA,QACnB,WAAW,KAAK,wBAAG,iCAAiC,UAAU,OAAO,QAAQ,CAAC;AAAA,MAChF;AAAA,MACA,IAAI,OAAO,WAAW;AAAA,QACpB,WAAW,KAAK,wBAAG,iCAAiC,WAAW,OAAO,SAAiB,CAAC;AAAA,MAC1F;AAAA,MACA,IAAI,OAAO,QAAQ;AAAA,QACjB,WAAW,KAAK,wBAAG,iCAAiC,QAAQ,OAAO,MAAM,CAAC;AAAA,MAC5E;AAAA,MACA,IAAI,OAAO,SAAS;AAAA,QAClB,WAAW,KAAK,wBAAG,iCAAiC,SAAS,OAAO,OAAO,CAAC;AAAA,MAC9E;AAAA,MACA,MAAM,QAAQ,OAAO,SAAS;AAAA,MAC9B,MAAM,OAAO,MAAM,KAAK,GACrB,OAAO,EACP,KAAK,gCAAgC,EACrC,MAAM,yBAAI,GAAG,UAAU,CAAC,EACxB,QACC,0BAAK,iCAAiC,SAAS,GAC/C,0BAAK,iCAAiC,EAAE,CAC1C,EACC,MAAM,KAAK;AAAA,MACd,OAAO,KAAK,IAAI,WAAW;AAAA,OAC1B,uCAAuC;AAAA;AAAA,OAGtC,qBAAoB,CAAC,QAA8D;AAAA,IACvF,OAAO,KAAK,IAAI,UAAU,YAAY;AAAA,MACpC,MAAM,YAAY,UAAU,OAAO,KAAK;AAAA,MACxC,MAAM,UAAW,OAAO,WAAW,KAAK,IAAI;AAAA,MAC5C,MAAM,MAAM,IAAI;AAAA,MAChB,MAAM,oBAAoB,gBAAgB,OAAO,SAAS;AAAA,MAC1D,MAAM,QAAQ,OAAO,SAAS,KAAK;AAAA,MACnC,MAAM,YAAY,qBAAqB,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK;AAAA,MAErE,MAAM,eAAoD;AAAA,QACxD;AAAA,QACA;AAAA,QACA,UAAU,OAAO;AAAA,QACjB,WAAW,OAAO,aAAa;AAAA,QAC/B,aAAa,OAAO,eAAe;AAAA,QACnC,iBAAiB,OAAO,mBAAmB;AAAA,QAC3C,QAAQ,OAAO,SAAS,CAAC,GAAG,OAAO,MAAM,IAAI,CAAC;AAAA,QAC9C,UAAU,OAAO,YAAY,CAAC;AAAA,QAC9B;AAAA,MACF;AAAA,MAEA,MAAM,WAAW,MAAM,KAAK,GACzB,OAAO,eAAe,EACtB,OAAO,YAAY,EACnB,mBAAmB;AAAA,QAClB,QAAQ,CAAC,gBAAgB,SAAS,gBAAgB,UAAU,gBAAgB,SAAS;AAAA,QACrF,KAAK;AAAA,UACH,WAAW,OAAO,aAAa;AAAA,UAC/B,aAAa,OAAO,eAAe;AAAA,UACnC,iBAAiB,OAAO,mBAAmB;AAAA,UAC3C,QAAQ,OAAO,SAAS,CAAC,GAAG,OAAO,MAAM,IAAI,CAAC;AAAA,UAC9C,UAAU,OAAO,YAAY,CAAC;AAAA,UAC9B;AAAA,UACA,YAAY;AAAA,UACZ,YAAY;AAAA,QACd;AAAA,MACF,CAAC,EACA,UAAU;AAAA,MAEb,MAAM,MAAM,SAAS;AAAA,MACrB,IAAI,CAAC,KAAK;AAAA,QACR,MAAM,IAAI,MAAM,mCAAmC;AAAA,MACrD;AAAA,MACA,OAAO,gBAAgB,GAAG;AAAA,OACzB,4CAA4C;AAAA;AAAA,OAG3C,sBAAqB,CACzB,QACiC;AAAA,IACjC,OAAO,KAAK,IAAI,UAAU,YAAY;AAAA,MACpC,MAAM,YAAY,UAAU,OAAO,KAAK;AAAA,MACxC,MAAM,MAAM,gBAAgB,OAAO,GAAG,KAAK,IAAI;AAAA,MAC/C,MAAM,UAAW,OAAO,WAAW,KAAK,IAAI;AAAA,MAC5C,MAAM,aAAa;AAAA,QACjB,wBAAG,gBAAgB,WAAW,SAAS;AAAA,QACvC,wBAAG,gBAAgB,SAAS,OAAO;AAAA,QACnC,4BAAO,gBAAgB,UAAU;AAAA,QACjC,wBAAG,gBAAgB,WAAW,GAAG;AAAA,MACnC;AAAA,MACA,IAAI,OAAO,UAAU;AAAA,QACnB,WAAW,KAAK,wBAAG,gBAAgB,UAAU,OAAO,QAAQ,CAAC;AAAA,MAC/D;AAAA,MACA,MAAM,UAAU,MAAM,KAAK,GACxB,OAAO,eAAe,EACtB,IAAI;AAAA,QACH,YAAY;AAAA,QACZ,YAAY,OAAO,cAAc;AAAA,MACnC,CAAC,EACA,MAAM,yBAAI,GAAG,UAAU,CAAC,EACxB,UAAU;AAAA,MACb,MAAM,MAAM,QAAQ;AAAA,MACpB,OAAO,MAAM,gBAAgB,GAAG,IAAI;AAAA,OACnC,6CAA6C;AAAA;AAAA,OAGpC,+BAA8B,CAC1C,QACgB;AAAA,IAChB,MAAM,UAAW,OAAO,WAAW,KAAK,IAAI;AAAA,IAC5C,MAAM,aAAoB,CAAC,wBAAG,gBAAgB,SAAS,OAAO,CAAC;AAAA,IAC/D,IAAI,OAAO,WAAW;AAAA,MACpB,WAAW,KAAK,wBAAG,gBAAgB,WAAW,OAAO,SAAS,CAAC;AAAA,IACjE,EAAO,SAAI,OAAO,OAAO;AAAA,MACvB,WAAW,KAAK,wBAAG,gBAAgB,WAAW,UAAU,OAAO,KAAK,CAAC,CAAC;AAAA,IACxE,EAAO,SAAI,OAAO,QAAQ;AAAA,MACxB,WAAW,KAAK,2BAAM,gBAAgB,yBAAyB,OAAO,QAAQ;AAAA,IAChF,EAAO;AAAA,MACL,MAAM,IAAI,MAAM,wDAAwD;AAAA;AAAA,IAE1E,IAAI,OAAO,UAAU;AAAA,MACnB,WAAW,KAAK,wBAAG,gBAAgB,UAAU,OAAO,QAAQ,CAAC;AAAA,IAC/D;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,kBAAiB,CAAC,QAAkE;AAAA,IACxF,OAAO,KAAK,IAAI,UAAU,YAAY;AAAA,MACpC,MAAM,aAAa,MAAM,KAAK,+BAA+B,MAAM;AAAA,MACnE,MAAM,MAAM,gBAAgB,OAAO,GAAG,KAAK,IAAI;AAAA,MAC/C,IAAI,CAAC,OAAO,iBAAiB;AAAA,QAC3B,WAAW,KAAK,4BAAO,gBAAgB,UAAU,CAAC;AAAA,MACpD;AAAA,MACA,IAAI,CAAC,OAAO,gBAAgB;AAAA,QAC1B,WAAW,KAAK,wBAAG,gBAAgB,WAAW,GAAG,CAAC;AAAA,MACpD;AAAA,MACA,MAAM,OAAO,MAAM,KAAK,GACrB,OAAO,EACP,KAAK,eAAe,EACpB,MAAM,yBAAI,GAAG,UAAU,CAAC,EACxB,MAAM,CAAC;AAAA,MACV,MAAM,MAAM,KAAK;AAAA,MACjB,OAAO,MAAM,gBAAgB,GAAG,IAAI;AAAA,OACnC,yCAAyC;AAAA;AAAA,OAGxC,qBAAoB,CAAC,QAAqE;AAAA,IAC9F,OAAO,KAAK,IAAI,UAAU,YAAY;AAAA,MACpC,MAAM,WAAW,MAAM,KAAK,kBAAkB;AAAA,WACzC;AAAA,QACH,iBAAiB;AAAA,QACjB,gBAAgB;AAAA,MAClB,CAAC;AAAA,MACD,IAAI,CAAC;AAAA,QAAU,OAAO;AAAA,MAEtB,MAAM,aAAa,MAAM,KAAK,+BAA+B;AAAA,QAC3D,WAAW,SAAS;AAAA,QACpB,SAAS,SAAS;AAAA,QAClB,UAAU,SAAS;AAAA,MACrB,CAAC;AAAA,MACD,MAAM,YAA0D,CAAC;AAAA,MACjE,IAAI,OAAO,cAAc;AAAA,QAAW,UAAU,YAAY,OAAO;AAAA,MACjE,IAAI,OAAO,gBAAgB;AAAA,QAAW,UAAU,cAAc,OAAO;AAAA,MACrE,IAAI,OAAO,oBAAoB,WAAW;AAAA,QACxC,UAAU,kBAAkB,OAAO;AAAA,MACrC;AAAA,MACA,IAAI,OAAO,WAAW;AAAA,QAAW,UAAU,SAAS,CAAC,GAAG,OAAO,MAAM;AAAA,MACrE,IAAI,OAAO,aAAa,WAAW;AAAA,QACjC,UAAU,WAAW;AAAA,aAChB,SAAS;AAAA,aACT,OAAO;AAAA,QACZ;AAAA,MACF;AAAA,MACA,IAAI,OAAO,cAAc,WAAW;AAAA,QAClC,UAAU,YAAY,gBAAgB,OAAO,SAAS,KAAK,IAAI;AAAA,MACjE;AAAA,MACA,IAAI,OAAO,eAAe,WAAW;AAAA,QACnC,UAAU,aAAa,gBAAgB,OAAO,UAAU;AAAA,MAC1D;AAAA,MACA,IAAI,OAAO,eAAe;AAAA,QAAW,UAAU,aAAa,OAAO;AAAA,MAEnE,MAAM,UAAU,MAAM,KAAK,GACxB,OAAO,eAAe,EACtB,IAAI,SAAS,EACb,MAAM,yBAAI,GAAG,UAAU,CAAC,EACxB,UAAU;AAAA,MACb,MAAM,MAAM,QAAQ;AAAA,MACpB,OAAO,MAAM,gBAAgB,GAAG,IAAI;AAAA,OACnC,4CAA4C;AAAA;AAAA,OAG3C,qBAAoB,CAAC,QAAsD;AAAA,IAC/E,OAAO,KAAK,IAAI,UAAU,YAAY;AAAA,MACpC,MAAM,WAAW,MAAM,KAAK,kBAAkB;AAAA,WACzC;AAAA,QACH,iBAAiB;AAAA,QACjB,gBAAgB;AAAA,MAClB,CAAC;AAAA,MACD,IAAI,CAAC;AAAA,QAAU,OAAO;AAAA,MACtB,MAAM,aAAa,MAAM,KAAK,+BAA+B;AAAA,QAC3D,WAAW,SAAS;AAAA,QACpB,SAAS,SAAS;AAAA,QAClB,UAAU,SAAS;AAAA,MACrB,CAAC;AAAA,MACD,MAAM,UAAU,MAAM,KAAK,GACxB,OAAO,eAAe,EACtB,MAAM,yBAAI,GAAG,UAAU,CAAC,EACxB,UAAU;AAAA,MACb,OAAO,QAAQ,SAAS;AAAA,OACvB,4CAA4C;AAAA;AAEnD;;;AhCjuBA,SAAS,kBAAkB,CAAC,KAAwB;AAAA,EAClD,IAAI,OAAO;AAAA,IAAM,OAAO,CAAC;AAAA,EACzB,IAAI,MAAM,QAAQ,GAAG;AAAA,IAAG,OAAO,IAAI,IAAI,CAAC,UAAU,OAAO,KAAK,CAAC;AAAA,EAC/D,IAAI,OAAO,QAAQ;AAAA,IAAU,OAAO,IAAI,KAAK,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG;AAAA,EACjE,OAAO,CAAC;AAAA;AAcV,SAAS,YAAY,CAAC,QAAiC,IAAmB;AAAA,EACxE,IAAI,CAAC,GAAG;AAAA,IAAM;AAAA,EACd,MAAM,QAAQ,GAAG,KAAK,MAAM,GAAG;AAAA,EAC/B,MAAM,OAAO,MAAM,IAAI;AAAA,EACvB,IAAI,SAAS;AAAA,IAAW;AAAA,EAExB,IAAI,SAAkC;AAAA,EACtC,WAAW,WAAW,OAAO;AAAA,IAC3B,MAAM,OAAO,OAAO;AAAA,IACpB,IAAI,SAAS,QAAQ,OAAO,SAAS,UAAU;AAAA,MAC7C,MAAM,UAAmC,CAAC;AAAA,MAC1C,OAAO,WAAW;AAAA,MAClB,SAAS;AAAA,IACX,EAAO;AAAA,MACL,SAAS;AAAA;AAAA,EAEb;AAAA,EAEA,QAAQ,GAAG;AAAA,SACJ;AAAA,MACH,OAAO,QAAQ,GAAG;AAAA,MAClB;AAAA,SACG;AAAA,MACH,OAAO,OAAO;AAAA,MACd;AAAA,SACG,QAAQ;AAAA,MACX,MAAM,WAAW,OAAO;AAAA,MACxB,IAAI,MAAM,QAAQ,QAAQ,GAAG;AAAA,QAC3B,SAAS,KAAK,GAAG,KAAK;AAAA,MACxB,EAAO;AAAA,QACL,OAAO,QAAQ,CAAC,GAAG,KAAK;AAAA;AAAA,MAE1B;AAAA,IACF;AAAA,SACK,aAAa;AAAA,MAChB,MAAM,WAAW,OAAO;AAAA,MACxB,MAAM,QAAQ,OAAO,GAAG,UAAU,WAAW,GAAG,QAAQ;AAAA,MACxD,OAAO,QAAQ,OAAO,aAAa,WAAW,WAAW,QAAQ;AAAA,MACjE;AAAA,IACF;AAAA;AAAA;AA4BJ,SAAS,YAAY,CAAC,OAAqD;AAAA,EACzE,IAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAAA,IAC/D,OAAO;AAAA,EACT;AAAA,EACA;AAAA;AAGF,SAAS,UAAU,CAAC,OAAsC;AAAA,EACxD,OAAQ,SAAS;AAAA;AAGnB,SAAS,iBAAiB,CAAC,OAAsC;AAAA,EAC/D,IAAI,MAAM,QAAQ,KAAK,GAAG;AAAA,IACxB,OAAO,MAAM,OAAO,CAAC,SAAyB,OAAO,SAAS,QAAQ;AAAA,EACxE;AAAA,EACA,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK;AAAA,IAAG,OAAO,CAAC,KAAK;AAAA,EAC5D;AAAA;AA2BF,IAAM,KAAK,MAAM,OAAO,WAAW;AASnC,SAAS,mBAAmB,CAAC,OAAyB;AAAA,EACpD,MAAM,OAAO,IAAI;AAAA,EACjB,IAAI,UAAmB;AAAA,EACvB,OAAO,WAAW,OAAO,YAAY,YAAY,CAAC,KAAK,IAAI,OAAO,GAAG;AAAA,IACnE,KAAK,IAAI,OAAO;AAAA,IAChB,MAAM,QAAQ;AAAA,IAKd,IAAI,MAAM,SAAS;AAAA,MAAS,OAAO;AAAA,IACnC,IAAI,OAAO,MAAM,YAAY,YAAY,gCAAgC,KAAK,MAAM,OAAO,GAAG;AAAA,MAC5F,OAAO;AAAA,IACT;AAAA,IACA,UAAU,MAAM;AAAA,EAClB;AAAA,EACA,OAAO;AAAA;AA+BT,SAAS,6BAA6B,CAAC,iBAAgD;AAAA,EACrF,IAAI,CAAC,MAAM,QAAQ,eAAe,KAAK,gBAAgB,WAAW,GAAG;AAAA,IACnE,OAAO,CAAC;AAAA,EACV;AAAA,EACA,OAAO,gBAAgB,QAAQ,CAAC,UAAgC;AAAA,IAC9D,IAAI,MAAM,QAAQ,KAAK,GAAG;AAAA,MACxB,OAAO,CAAC,EAAE,UAAU,MAAM,CAAC;AAAA,IAC7B;AAAA,IACA,IACE,SACA,OAAO,UAAU,YACjB,MAAM,QAAS,MAAiC,QAAQ,GACxD;AAAA,MACA,OAAO,CAAC,KAAqC;AAAA,IAC/C;AAAA,IACA,OAAO,CAAC;AAAA,GACT;AAAA;AAGH,SAAS,uBAAuB,CAAC,WAAkD;AAAA,EACjF,OAAO,UAAU,QAAQ,CAAC,SAAyB;AAAA,IACjD,IAAI,OAAO,SAAS,UAAU;AAAA,MAC5B,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,QAAQ,OAAO,KAAK,EAAE,CAAC;AAAA,IACjD;AAAA,IACA,IAAI,QAAQ,OAAO,SAAS,YAAY,OAAO,KAAK,SAAS,UAAU;AAAA,MACrE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,QAAQ,OAAO,KAAK,KAAK,EAAE,CAAC;AAAA,IACtD;AAAA,IACA,OAAO,CAAC;AAAA,GACT;AAAA;AAGH,SAAS,WAAW,CAAC,KAAsB;AAAA,EACzC,MAAM,QAAe;AAAA,OAChB;AAAA,IACH,UAAU,IAAI,YAAY;AAAA,IAC1B,IAAI,IAAI;AAAA,IACR,QAAQ,CAAC,IAAI,SAAS,YAAY,IAAI;AAAA,IACtC,KAAK,kBAAkB,IAAI,GAAG;AAAA,IAC9B,iBAAiB,8BAA8B,IAAI,eAAe;AAAA,IAClE,WAAW,wBAAwB,IAAI,SAAS;AAAA,IAChD,UAAU,IAAI;AAAA,IACd,WAAW,IAAI,UAAU,QAAQ;AAAA,IACjC,WAAW,IAAI,UAAU,QAAQ;AAAA,EACnC;AAAA,EACA,OAAO;AAAA;AAAA;AAUF,MAAe,2BAA2B,6BAAiC;AAAA,EAC7D,aAAqB;AAAA,EACrB,YAAoB;AAAA,EACpB,WAAmB;AAAA,EACnB,YAAoB;AAAA,EAC7B,qBAA+C,cAAc;AAAA,EAC7D;AAAA,EACF,sBAA4C;AAAA,EAC5C;AAAA,EAEE,wBAAwB,GAA0B;AAAA,IAC1D,IAAI,CAAC,KAAK,wBAAwB;AAAA,MAChC,MAAM,MAAoB;AAAA,QACxB,OAAO,MAAM,KAAK;AAAA,QAClB,WAAW,CAAI,cAAgC,KAAK,aAAa,SAAS;AAAA,QAC1E,sBAAsB,CACpB,UACA,aACG,KAAK,kBAAkB,UAAU,QAAQ;AAAA,QAC9C,SAAS,KAAK;AAAA,QACd,uBAAuB,MAAM,KAAK;AAAA,MACpC;AAAA,MACA,KAAK,yBAAyB,IAAI,sBAAsB,GAAG;AAAA,IAC7D;AAAA,IACA,OAAO,KAAK;AAAA;AAAA,OAaD,WAAU,GAAkB;AAAA,IACvC,MAAM,KAAK,KAAK;AAAA;AAAA,OAGL,oBAAmB,CAC9B,SACA,SAKe;AAAA,IACf,IAAI,CAAC,KAAK,kBAAkB;AAAA,MAC1B,QAAQ,wDAA6B;AAAA,MACrC,KAAK,mBAAmB,IAAI;AAAA,MAC5B,MAAM,KAAK,iBAAiB,uBAAuB,KAAK,EAAqB;AAAA,IAC/E;AAAA,IAEA,WAAW,UAAU,SAAS;AAAA,MAC5B,IAAI,OAAO,QAAQ;AAAA,QACjB,KAAK,iBAAiB,eAAe,OAAO,MAAM,OAAO,MAAM;AAAA,MACjE;AAAA,IACF;AAAA,IAEA,IAAI,KAAK,qBAAqB;AAAA,MAC5B,oBAAO,KACL,EAAE,KAAK,cAAc,aAAa,QAAQ,OAAO,GACjD,uEACF;AAAA,MACA,MAAM,KAAK;AAAA,MACX;AAAA,IACF;AAAA,IAEA,KAAK,sBAAsB,KAAK,iBAAiB,uBAAuB,OAAO;AAAA,IAC/E,IAAI;AAAA,MACF,MAAM,KAAK;AAAA,cACX;AAAA,MACA,KAAK,sBAAsB;AAAA;AAAA;AAAA,EAIxB,WAAW,GAAY;AAAA,IAC5B,OAAO,KAAK;AAAA;AAAA,EAGJ;AAAA,EAEV,WAAW,CAAC,SAAe;AAAA,IACzB,MAAM;AAAA,IACN,KAAK,UAAU;AAAA;AAAA,EAGT,oBAAoB,CAAC,OAA0B;AAAA,IACrD,IAAI,SAAS,MAAM;AAAA,MACjB,OAAO,CAAC;AAAA,IACV;AAAA,IAEA,IAAI,OAAO,UAAU,UAAU;AAAA,MAC7B,OAAO,CAAC,KAAK;AAAA,IACf;AAAA,IAEA,IAAI,MAAM,QAAQ,KAAK,GAAG;AAAA,MACxB,OAAO,MAAM,IAAI,MAAM;AAAA,IACzB;AAAA,IAEA,IAAI,iBAAiB,KAAK;AAAA,MACxB,OAAO,MAAM,KAAK,KAAK,EAAE,IAAI,MAAM;AAAA,IACrC;AAAA,IAEA,IAAI,OAAO,UAAU,UAAU;AAAA,MAC7B,MAAM,gBAAgB;AAAA,MACtB,IAAI,OAAO,cAAc,OAAO,cAAc,YAAY;AAAA,QACxD,OAAO,MAAM,KAAK,KAA0B,EAAE,IAAI,MAAM;AAAA,MAC1D;AAAA,IACF;AAAA,IAEA,OAAO,CAAC,OAAO,KAAK,CAAC;AAAA;AAAA,EAGf,WAAW,CAAC,OAAwB;AAAA,IAC1C,OAAO,kEAAkE,KAAK,KAAK;AAAA;AAAA,EAG7E,kBAAkB,CACxB,OACgC;AAAA,IAChC,MAAM,YAA4C;AAAA,MAChD,SAAS,KAAK;AAAA,MACd,IAAK,MAAM,MAAM,GAAG;AAAA,MACpB,MAAM,MAAM,QAAQ;AAAA,MACpB,UAAU,MAAM,YAAY,CAAC;AAAA,IAC/B;AAAA,IAEA,MAAM,WAAW,MAAM,YAAY,MAAM;AAAA,IACzC,IAAI,OAAO,aAAa,YAAY,KAAK,YAAY,QAAQ,GAAG;AAAA,MAC9D,UAAU,kBAAkB;AAAA,IAC9B,EAAO,SAAI,UAAU;AAAA,MACnB,oBAAO,KACL,EAAE,KAAK,cAAc,SAAS,KAAK,SAAS,SAAS,GACrD,uDACF;AAAA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,EAGD,cAAc,CAAC,OAAuB;AAAA,IAC5C,MAAM,cAAc;AAAA,IACpB,MAAM,kBAAkB,YAAY,mBAAmB,YAAY;AAAA,IACnE,OAAO;AAAA,SACF;AAAA,SACC,OAAO,oBAAoB,WAC3B;AAAA,QACE;AAAA,QACA,UAAU;AAAA,MACZ,IACA,CAAC;AAAA,IACP;AAAA;AAAA,OASc,UAAY,CAAC,WAAyC;AAAA,IACpE,IAAI,YAAmB,IAAI,MAAM,eAAe;AAAA,IAEhD,SAAS,UAAU,EAAG,WAAW,KAAK,YAAY,WAAW;AAAA,MAC3D,IAAI;AAAA,QACF,OAAO,MAAM,UAAU;AAAA,QACvB,OAAO,OAAO;AAAA,QACd,YAAY;AAAA,QAEZ,IAAI,UAAU,KAAK,YAAY;AAAA,UAC7B,MAAM,eAAe,KAAK,IAAI,KAAK,YAAY,MAAM,UAAU,IAAI,KAAK,QAAQ;AAAA,UAEhF,MAAM,SAAS,KAAK,OAAO,IAAI,KAAK;AAAA,UACpC,MAAM,QAAQ,eAAe;AAAA,UAE7B,oBAAO,KACL;AAAA,YACE,KAAK;AAAA,YACL;AAAA,YACA,YAAY,KAAK;AAAA,YACjB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC9D,GACA,qCACF;AAAA,UAEA,MAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,KAAK,CAAC;AAAA,QAC3D,EAAO;AAAA,UACL,oBAAO,MACL;AAAA,YACE,KAAK;AAAA,YACL,eAAe;AAAA,YACf,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC9D,GACA,4BACF;AAAA,UACA,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA;AAAA;AAAA,IAGpE;AAAA,IAEA,MAAM;AAAA;AAAA,OASF,yBAAwB,CAAC,WAAmB;AAAA,IAChD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,oBAAoB,cAAc;AAAA,MACxC,IAAI,CAAC,mBAAmB;AAAA,QACtB,oBAAO,KACL;AAAA,UACE,KAAK;AAAA,UACL,SAAS,KAAK;AAAA,UACd,oBAAoB;AAAA,UACpB,mBAAmB,KAAK;AAAA,QAC1B,GACA,6EACF;AAAA,QACA;AAAA,MACF;AAAA,MAEA,KAAK,qBAAqB;AAAA,KAC3B;AAAA;AAAA,OAQG,SAAQ,CAAC,SAAsC;AAAA,IACnD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,OAAO,MAAM,KAAK,GACrB,OAAO,EACP,KAAK,UAAU,EACf,MAAM,wBAAG,WAAW,IAAI,OAAO,CAAC,EAChC,MAAM,CAAC;AAAA,MAEV,IAAI,KAAK,WAAW;AAAA,QAAG,OAAO;AAAA,MAE9B,OAAO,YAAY,KAAK,EAAE;AAAA,KAC3B;AAAA;AAAA,OAQG,UAAS,GAA8B;AAAA,IAC3C,MAAM,SAAS,MAAM,KAAK,aAAa,YAAY;AAAA,MACjD,MAAM,OAAO,MAAM,KAAK,GACrB,OAAO;AAAA,QACN,IAAI,WAAW;AAAA,QACf,MAAM,WAAW;AAAA,QACjB,KAAK,WAAW;AAAA,MAClB,CAAC,EACA,KAAK,UAAU;AAAA,MAClB,OAAO,KAAK,IACV,CAAC,SACE;AAAA,WACI;AAAA,QACH,IAAI,IAAI;AAAA,QACR,KAAK,mBAAmB,IAAI,GAAG;AAAA,MACjC,EACJ;AAAA,KACD;AAAA,IAED,OAAO,UAAU,CAAC;AAAA;AAAA,OAGd,eAAc,CAAC,UAAoC;AAAA,IACvD,IAAI,SAAS,WAAW;AAAA,MAAG,OAAO,CAAC;AAAA,IACnC,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,OAAO,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,6BAAQ,WAAW,IAAI,QAAQ,CAAC;AAAA,MAC3F,OAAO,KAAK,IAAI,CAAC,QAAQ,YAAY,GAAG,CAAC;AAAA,KAC1C;AAAA;AAAA,OAGG,aAAY,CAAC,QAA2C;AAAA,IAC5D,IAAI,OAAO,WAAW;AAAA,MAAG,OAAO,CAAC;AAAA,IACjC,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,MAAc,CAAC;AAAA,MACrB,WAAW,SAAS,QAAQ;AAAA,QAC1B,IAAI,MAAM,IAAI;AAAA,UACZ,MAAM,UAAU,MAAM,KAAK,YAAY,KAAc;AAAA,UACrD,IAAI;AAAA,YAAS,IAAI,KAAK,MAAM,EAAE;AAAA,QAChC;AAAA,MACF;AAAA,MACA,OAAO;AAAA,KACR;AAAA;AAAA,OAGG,aAAY,CAAC,SAA4E;AAAA,IAC7F,aAAa,SAAS,WAAW,SAAS;AAAA,MACxC,MAAM,UAAU,MAAM,KAAK,YAAY,SAAS,KAAK;AAAA,MACrD,IAAI,CAAC;AAAA,QAAS,OAAO;AAAA,IACvB;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,aAAY,CAAC,QAAyC;AAAA,IAC1D,WAAW,SAAS,QAAQ;AAAA,MAC1B,IAAI,CAAC,MAAM;AAAA,QAAI;AAAA,MACf,MAAM,WAAW,MAAM,KAAK,SAAS,MAAM,EAAE;AAAA,MAC7C,IAAI,UAAU;AAAA,QACZ,MAAM,KAAK,YAAY,MAAM,IAAI,KAAK;AAAA,MACxC,EAAO;AAAA,QACL,MAAM,KAAK,YAAY,KAAc;AAAA;AAAA,IAEzC;AAAA;AAAA,OAGI,aAAY,CAAC,UAAoC;AAAA,IACrD,IAAI,SAAS,WAAW;AAAA,MAAG,OAAO;AAAA,IAClC,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,IAAI;AAAA,QACF,MAAM,KAAK,GAAG,OAAO,UAAU,EAAE,MAAM,6BAAQ,WAAW,IAAI,QAAQ,CAAC;AAAA,QACvE,OAAO;AAAA,QACP,OAAO,OAAO;AAAA,QACd,oBAAO,MACL;AAAA,UACE,KAAK;AAAA,UACL,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,GACA,yBACF;AAAA,QACA,OAAO;AAAA;AAAA,KAEV;AAAA;AAAA,OASG,YAAW,CAAC,OAAgC;AAAA,IAChD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,IAAI;AAAA,QAEF,IAAI,MAAM,IAAI;AAAA,UACZ,MAAM,WAAW,MAAM,KAAK,GACzB,OAAO,EAAE,IAAI,WAAW,GAAG,CAAC,EAC5B,KAAK,UAAU,EACf,MAAM,wBAAG,WAAW,IAAI,MAAM,EAAE,CAAC,EACjC,MAAM,CAAC;AAAA,UAEV,IAAI,SAAS,SAAS,GAAG;AAAA,YACvB,oBAAO,KACL,EAAE,KAAK,cAAc,SAAS,MAAM,GAAG,GACvC,6CACF;AAAA,YACA,OAAO;AAAA,UACT;AAAA,QACF;AAAA,QAEA,MAAM,KAAK,GAAG,YAAY,OAAO,OAAO;AAAA,UACtC,MAAM,YAAY;AAAA,eACb;AAAA,YACH,WAAW,IAAI,KACb,OAAO,MAAM,cAAc,WACvB,OAAO,MAAM,SAAS,IACtB,MAAM,aAAa,KAAK,IAAI,CAClC;AAAA,YACA,WAAW,IAAI,KACb,OAAO,MAAM,cAAc,WACvB,OAAO,MAAM,SAAS,IACtB,MAAM,aAAa,KAAK,IAAI,CAClC;AAAA,UACF;AAAA,UACA,MAAM,qBAAqB,OAAO,YAChC,OAAO,QAAQ,SAAS,EAAE,OAAO,IAAI,WAAW,UAAU,SAAS,CACrE;AAAA,UAEA,MAAM,GAAG,OAAO,UAAU,EAAE,OAAO,kBAAkB;AAAA,SACtD;AAAA,QAED,OAAO;AAAA,QACP,OAAO,OAAO;AAAA,QACd,IAAI,oBAAoB,KAAK,GAAG;AAAA,UAC9B,oBAAO,KACL,EAAE,KAAK,cAAc,SAAS,MAAM,GAAG,GACvC,6CACF;AAAA,UACA,OAAO;AAAA,QACT;AAAA,QAEA,oBAAO,MACL;AAAA,UACE,KAAK;AAAA,UACL,SAAS,MAAM;AAAA,UACf,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,GACA,wBACF;AAAA,QACA,MAAM;AAAA;AAAA,KAET;AAAA;AAAA,OASG,YAAW,CAAC,SAAe,OAAyC;AAAA,IACxE,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,IAAI;AAAA,QACF,IAAI,CAAC,SAAS;AAAA,UACZ,MAAM,IAAI,MAAM,iCAAiC;AAAA,QACnD;AAAA,QAEA,MAAM,KAAK,GAAG,YAAY,OAAO,OAAO;AAAA,UAEtC,IAAI,MAAM,UAAU;AAAA,YAClB,MAAM,WAAW,MAAM,KAAK,mBAAmB,IAAI,SAAS,MAAM,QAAQ;AAAA,UAC5E;AAAA,UAIA,MAAM,aAAsC,KAAK,MAAM;AAAA,UAEvD,IAAI,WAAW,WAAW;AAAA,YACxB,IAAI,OAAO,WAAW,cAAc,UAAU;AAAA,cAC5C,WAAW,YAAY,IAAI,KAAK,WAAW,SAAS;AAAA,YACtD,EAAO;AAAA,cACL,OAAO,WAAW;AAAA;AAAA,UAEtB;AAAA,UACA,IAAI,WAAW,WAAW;AAAA,YACxB,IAAI,OAAO,WAAW,cAAc,UAAU;AAAA,cAC5C,WAAW,YAAY,IAAI,KAAK,WAAW,SAAS;AAAA,YACtD,EAAO;AAAA,cACL,WAAW,YAAY,IAAI;AAAA;AAAA,UAE/B,EAAO;AAAA,YACL,WAAW,YAAY,IAAI;AAAA;AAAA,UAG7B,MAAM,GAAG,OAAO,UAAU,EAAE,IAAI,UAAU,EAAE,MAAM,wBAAG,WAAW,IAAI,OAAO,CAAC;AAAA,SAC7E;AAAA,QAED,OAAO;AAAA,QACP,OAAO,OAAO;AAAA,QACd,oBAAO,MACL;AAAA,UACE,KAAK;AAAA,UACL;AAAA,UACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,GACA,wBACF;AAAA,QACA,OAAO;AAAA;AAAA,KAEV;AAAA;AAAA,OAYW,mBAAqD,CACjE,IACA,SACA,iBACY;AAAA,IAEZ,MAAM,eAAe,MAAM,GACxB,OAAO,EAAE,UAAU,WAAW,SAAS,CAAC,EACxC,KAAK,UAAU,EACf,MAAM,wBAAG,WAAW,IAAI,OAAO,CAAC,EAChC,MAAM,CAAC;AAAA,IAEV,MAAM,kBACJ,aAAa,SAAS,KAAK,aAAa,GAAG,WAAW,aAAa,GAAG,WAAW,CAAC;AAAA,IAEpF,MAAM,YAAY,CAChB,QACA,WACwC;AAAA,MAIxC,IAAI,WAAW,MAAM;AAAA,QAGnB;AAAA,MACF;AAAA,MAGA,IAAI,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,UAAU;AAAA,QACvD,OAAO;AAAA,MACT;AAAA,MAGA,MAAM,SACJ,OAAO,WAAW,YAAY,WAAW,QAAQ,CAAC,MAAM,QAAQ,MAAM,IAClE,KAAM,OAAmC,IACzC,CAAC;AAAA,MAEP,WAAW,OAAO,OAAO,KAAK,MAAM,GAAG;AAAA,QAErC,MAAM,cAAc,OAAO;AAAA,QAE3B,IAAI,gBAAgB,MAAM;AAAA,UAExB,OAAO,OAAO;AAAA,QAChB,EAAO,SAAI,OAAO,gBAAgB,YAAY,CAAC,MAAM,QAAQ,WAAW,GAAG;AAAA,UAEzE,MAAM,oBAAoB,UAAU,OAAO,MAAM,WAAsC;AAAA,UACvF,IAAI,sBAAsB,WAAW;AAAA,YAEnC,OAAO,OAAO;AAAA,UAChB,EAAO;AAAA,YACL,OAAO,OAAO;AAAA;AAAA,QAElB,EAAO;AAAA,UAEL,OAAO,OAAO;AAAA;AAAA,MAElB;AAAA,MAKA,IAAI,OAAO,KAAK,MAAM,EAAE,WAAW,GAAG;AAAA,QAGpC,IAAI,EAAE,OAAO,WAAW,YAAY,WAAW,QAAQ,OAAO,KAAK,MAAM,EAAE,WAAW,IAAI;AAAA,UACxF;AAAA,QACF;AAAA,MACF;AAAA,MAEA,OAAO;AAAA;AAAA,IAGT,MAAM,gBAAgB,UAAU,iBAAiB,eAAe;AAAA,IAGhE,OAAQ,iBAAiB,CAAC;AAAA;AAAA,OAStB,YAAW,CAAC,SAAiC;AAAA,IACjD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,IAAI;AAAA,QAEF,MAAM,SAAS,MAAM,KAAK,GACvB,OAAO,UAAU,EACjB,MAAM,wBAAG,WAAW,IAAI,OAAO,CAAC,EAChC,UAAU;AAAA,QAEb,IAAI,OAAO,WAAW,GAAG;AAAA,UACvB,oBAAO,KAAK,EAAE,KAAK,cAAc,QAAQ,GAAG,8BAA8B;AAAA,UAC1E,OAAO;AAAA,QACT;AAAA,QAEA,OAAO;AAAA,QACP,OAAO,OAAO;AAAA,QACd,oBAAO,MACL;AAAA,UACE,KAAK;AAAA,UACL;AAAA,UACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,GACA,wBACF;AAAA,QACA,MAAM;AAAA;AAAA,KAET;AAAA;AAAA,OAWG,YAAW,GAAoB;AAAA,IACnC,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,IAAI;AAAA,QACF,MAAM,SAAS,MAAM,KAAK,GAAG,OAAO,EAAE,OAAO,2BAAM,EAAE,CAAC,EAAE,KAAK,UAAU;AAAA,QAEvE,MAAM,UAAU,OAAO;AAAA,QACvB,OAAO,SAAS,SAAS;AAAA,QACzB,OAAO,OAAO;AAAA,QACd,oBAAO,MACL;AAAA,UACE,KAAK;AAAA,UACL,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,GACA,wBACF;AAAA,QACA,OAAO;AAAA;AAAA,KAEV;AAAA;AAAA,OAQG,cAAa,GAAkB;AAAA,IACnC,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,IAAI;AAAA,QACF,MAAM,KAAK,GAAG,OAAO,UAAU;AAAA,QAC/B,OAAO,OAAO;AAAA,QACd,oBAAO,MACL;AAAA,UACE,KAAK;AAAA,UACL,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,GACA,gCACF;AAAA,QACA,MAAM;AAAA;AAAA,KAET;AAAA;AAAA,OAQG,iBAAgB,CAAC,WAAsC;AAAA,IAC3D,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,SAAS,MAAM,KAAK,GACvB,OAAO;AAAA,QACN,QAAQ;AAAA,QACR,YAAY;AAAA,MACd,CAAC,EACA,KAAK,WAAW,EAChB,SAAS,gBAAgB,wBAAG,eAAe,UAAU,YAAY,EAAE,CAAC,EACpE,MAAM,6BAAQ,YAAY,IAAI,SAAS,CAAC;AAAA,MAE3C,IAAI,OAAO,WAAW;AAAA,QAAG,OAAO,CAAC;AAAA,MAGjC,MAAM,WAAiC,CAAC;AAAA,MACxC,MAAM,mBAAuD,CAAC;AAAA,MAC9D,WAAW,KAAK,QAAQ;AAAA,QACtB,MAAM,MAAM,EAAE,OAAO;AAAA,QACrB,SAAS,OAAO,EAAE;AAAA,QAClB,IAAI,iBAAiB,SAAS;AAAA,UAAW,iBAAiB,OAAO,CAAC;AAAA,QAClE,IAAI,EAAE,YAAY;AAAA,UAEhB,MAAM,kBAAkB,MAAM,QAAQ,EAAE,UAAU,IAAI,EAAE,aAAa,CAAC,EAAE,UAAU;AAAA,UAClF,iBAAiB,OAAO,CAAC,GAAG,iBAAiB,MAAM,GAAG,eAAe;AAAA,QACvE;AAAA,MACF;AAAA,MACA,WAAW,KAAK,OAAO,KAAK,gBAAgB,GAAG;AAAA,QAC7C,SAAS,GAAG,aAAa,iBAAiB;AAAA,MAC5C;AAAA,MAEA,OAAO,OAAO,OAAO,QAAQ;AAAA,KAC9B;AAAA;AAAA,OASG,mBAAkB,CAAC,QAAc,mBAAgD;AAAA,IACrF,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,QAAQ,KAAK,GAChB,OAAO;AAAA,QACN,QAAQ;AAAA,WACJ,qBAAqB,EAAE,YAAY,eAAe;AAAA,MACxD,CAAC,EACA,KAAK,gBAAgB,EACrB,SACC,aACA,yBAAI,wBAAG,iBAAiB,UAAU,YAAY,EAAE,GAAG,wBAAG,YAAY,SAAS,KAAK,OAAO,CAAC,CAC1F;AAAA,MAEF,IAAI,mBAAmB;AAAA,QACrB,MAAM,SAAS,gBAAgB,wBAAG,eAAe,UAAU,YAAY,EAAE,CAAC;AAAA,MAC5E;AAAA,MAEA,MAAM,SAAS,MAAM,MAAM,MAAM,wBAAG,iBAAiB,QAAQ,MAAM,CAAC;AAAA,MAGpE,MAAM,kBAAkB,IAAI;AAAA,MAE5B,WAAW,OAAO,QAAQ;AAAA,QACxB,IAAI,CAAC,IAAI;AAAA,UAAQ;AAAA,QAEjB,MAAM,WAAW,IAAI,OAAO;AAAA,QAC5B,IAAI,CAAC,gBAAgB,IAAI,QAAQ,GAAG;AAAA,UAClC,MAAM,SAAiB;AAAA,eAClB,IAAI;AAAA,YACP,IAAI;AAAA,YACJ,SAAS,IAAI,OAAO;AAAA,YACpB,UAAW,IAAI,OAAO,YAAY,CAAC;AAAA,YACnC,YAAY,oBAAoB,CAAC,IAAI;AAAA,UACvC;AAAA,UACA,gBAAgB,IAAI,UAAU,MAAM;AAAA,QACtC;AAAA,QAEA,IAAI,qBAAqB,IAAI,YAAY;AAAA,UACvC,MAAM,SAAS,gBAAgB,IAAI,QAAQ;AAAA,UAC3C,IAAI,QAAQ;AAAA,YACV,IAAI,CAAC,OAAO,YAAY;AAAA,cACtB,OAAO,aAAa,CAAC;AAAA,YACvB;AAAA,YACA,OAAO,WAAW,KAAK,IAAI,UAAU;AAAA,UACvC;AAAA,QACF;AAAA,MACF;AAAA,MAEA,OAAO,MAAM,KAAK,gBAAgB,OAAO,CAAC;AAAA,KAC3C;AAAA;AAAA,OAQG,eAAc,CAAC,UAAqC;AAAA,IACxD,OAAO,KAAK,aAAa,YAAY;AAAA,MAGnC,MAAM,qBAAqB,SAAS,IAAI,CAAC,WAAW;AAAA,QAClD,QAAQ,OAAO,aAAa,qBAAqB;AAAA,QAIjD,MAAM,KAAM,OAAO,MAAM,GAAG;AAAA,QAC5B,OAAO;AAAA,aACF;AAAA,UACH;AAAA,UACA,SAAS,KAAK;AAAA,UACd,OAAO,KAAK,qBAAqB,KAAK;AAAA,UACtC,UAAU,YAAY,CAAC;AAAA,QACzB;AAAA,OACD;AAAA,MAED,IAAI;AAAA,QACF,OAAO,MAAM,KAAK,GAAG,YAAY,OAAO,OAAO;AAAA,UAC7C,MAAM,GAAG,OAAO,WAAW,EAAE,OAAO,kBAAkB;AAAA,UACtD,OAAO,mBAAmB,IAAI,CAAC,WAAW,OAAO,EAAU;AAAA,SAC5D;AAAA,QACD,OAAO,OAAO;AAAA,QACd,IAAI,oBAAoB,KAAK,GAAG;AAAA,UAG9B,oBAAO,KACL,EAAE,KAAK,cAAc,UAAU,SAAS,IAAI,GAAG,GAC/C,gDACF;AAAA,UACA,OAAO,mBAAmB,IAAI,CAAC,WAAW,OAAO,EAAU;AAAA,QAC7D;AAAA,QACA,oBAAO,MACL;AAAA,UACE,KAAK;AAAA,UACL,UAAU,SAAS,IAAI;AAAA,UACvB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,GACA,2BACF;AAAA,QACA,OAAO,CAAC;AAAA;AAAA,KAEX;AAAA;AAAA,OAQa,mBAAkB,CAAC,QAAkC;AAAA,IACnE,IAAI,CAAC,OAAO,IAAI;AAAA,MACd,oBAAO,MAAM,EAAE,KAAK,aAAa,GAAG,8CAA8C;AAAA,MAClF,OAAO;AAAA,IACT;AAAA,IAEA,IAAI;AAAA,MACF,MAAM,mBAAmB,MAAM,KAAK,iBAAiB,CAAC,OAAO,EAAE,CAAC;AAAA,MAEhE,IAAI,CAAC,iBAAiB,QAAQ;AAAA,QAC5B,QAAQ,MAAM,KAAK,eAAe,CAAC,MAAM,CAAC,GAAG,SAAS;AAAA,MACxD;AAAA,MAEA,OAAO;AAAA,MACP,OAAO,OAAO;AAAA,MACd,oBAAO,MACL;AAAA,QACE,KAAK;AAAA,QACL,UAAU,OAAO;AAAA,QACjB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,GACA,gCACF;AAAA,MACA,OAAO;AAAA;AAAA;AAAA,OASL,aAAY,CAAC,QAA+B;AAAA,IAChD,IAAI,CAAC,OAAO,IAAI;AAAA,MACd,MAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAAA,IACA,OAAO,KAAK,aAAa,YAAY;AAAA,MAEnC,MAAM,mBAAmB;AAAA,WACpB;AAAA,QACH,SAAS,KAAK;AAAA,QACd,OAAO,KAAK,qBAAqB,OAAO,KAAK;AAAA,QAC7C,UAAU,OAAO,YAAY,CAAC;AAAA,MAChC;AAAA,MAEA,MAAM,KAAK,GACR,OAAO,WAAW,EAClB,IAAI,gBAAgB,EACpB,MAAM,wBAAG,YAAY,IAAI,OAAO,EAAY,CAAC;AAAA,KACjD;AAAA;AAAA,OAQG,aAAY,CAAC,UAA+B;AAAA,IAChD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,KAAK,GAAG,YAAY,OAAO,OAAO;AAAA,QAEtC,MAAM,GACH,OAAO,cAAc,EACrB,MACC,wBAAG,wBAAG,eAAe,UAAU,QAAQ,GAAG,wBAAG,eAAe,gBAAgB,QAAQ,CAAC,CACvF;AAAA,QAGF,MAAM,GAAG,OAAO,WAAW,EAAE,MAAM,wBAAG,YAAY,IAAI,QAAQ,CAAC;AAAA,OAChE;AAAA,KACF;AAAA;AAAA,OAUG,mBAAkB,CAAC,QAA+D;AAAA,IACtF,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,QAAQ,OAAO,YAAY;AAAA,MAG3B,MAAM,iBAAiB,MAAM,IAAI,CAAC,SAAS,2BAAM,cAAc,YAAY,QAAQ;AAAA,MAEnF,MAAM,QAAQ;AAAA,wBACI;AAAA,gBACR,YAAY,aAAa;AAAA,eAC1B,yBAAI,KAAK,gBAAgB,8BAAS;AAAA;AAAA,MAG3C,MAAM,SAAS,MAAM,KAAK,GAAG,QAAQ,KAAK;AAAA,MAE1C,OAAO,OAAO,KAAK,IAAI,CAAC,SAAkC;AAAA,QACxD,IAAI,IAAI;AAAA,QACR,SAAS,IAAI;AAAA,QACb,OAAQ,IAAI,SAAS,CAAC;AAAA,QACtB,UAAW,IAAI,YAAY,CAAC;AAAA,MAC9B,EAAE;AAAA,KACH;AAAA;AAAA,OAWG,qBAAoB,CAAC,QAIL;AAAA,IACpB,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,QAAQ,OAAO,SAAS,QAAQ,OAAO;AAAA,MAGvC,IAAI,CAAC,SAAS,MAAM,KAAK,MAAM,IAAI;AAAA,QACjC,MAAM,UAAS,MAAM,KAAK,GACvB,OAAO,EACP,KAAK,WAAW,EAChB,MAAM,wBAAG,YAAY,SAAS,OAAO,CAAC,EACtC,MAAM,KAAK;AAAA,QAEd,OAAO,QAAO,IAAI,CAAC,SAAkC;AAAA,UACnD,IAAI,IAAI;AAAA,UACR,SAAS,IAAI;AAAA,UACb,OAAQ,IAAI,SAAS,CAAC;AAAA,UACtB,UAAW,IAAI,YAAY,CAAC;AAAA,QAC9B,EAAE;AAAA,MACJ;AAAA,MAGA,MAAM,cAAc;AAAA,wBACF;AAAA,gBACR,YAAY,aAAa;AAAA;AAAA,iCAER,YAAY;AAAA,yCACJ,IAAI;AAAA;AAAA,gBAE7B;AAAA;AAAA,MAGV,MAAM,SAAS,MAAM,KAAK,GAAG,QAAQ,WAAW;AAAA,MAEhD,OAAO,OAAO,KAAK,IAAI,CAAC,SAAkC;AAAA,QACxD,IAAI,IAAI;AAAA,QACR,SAAS,IAAI;AAAA,QACb,OAAQ,IAAI,SAAS,CAAC;AAAA,QACtB,UAAW,IAAI,YAAY,CAAC;AAAA,MAC9B,EAAE;AAAA,KACH;AAAA;AAAA,OAGG,aAAY,CAChB,UACA,MACA,SACA,gBAC2B;AAAA,IAC3B,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,aAAa,CAAC,wBAAG,eAAe,UAAU,QAAQ,GAAG,wBAAG,eAAe,MAAM,IAAI,CAAC;AAAA,MAExF,IAAI,SAAS;AAAA,QACX,WAAW,KAAK,wBAAG,eAAe,SAAS,OAAO,CAAC;AAAA,MACrD;AAAA,MAEA,IAAI,gBAAgB;AAAA,QAClB,WAAW,KAAK,wBAAG,eAAe,gBAAgB,cAAc,CAAC;AAAA,MACnE;AAAA,MAEA,MAAM,SAAS,MAAM,KAAK,GACvB,OAAO,EACP,KAAK,cAAc,EACnB,MAAM,yBAAI,GAAG,UAAU,CAAC;AAAA,MAE3B,IAAI,OAAO,WAAW;AAAA,QAAG,OAAO;AAAA,MAEhC,MAAM,YAAY,OAAO;AAAA,MAEzB,OAAO;AAAA,WACF;AAAA,QACH,IAAI,UAAU;AAAA,QACd,UAAU,UAAU;AAAA,QACpB,SAAS,UAAU;AAAA,QACnB,QAAQ,UAAU;AAAA,QAClB,SAAU,UAAU,WAAW;AAAA,QAC/B,gBAAiB,UAAU,kBAAkB;AAAA,QAC7C,MAAM,UAAU;AAAA,QAChB,WAAW,UAAU,UAAU,QAAQ;AAAA,MACzC;AAAA,KACD;AAAA;AAAA,OAUG,cAAa,CAAC,UAAgB,SAAgB,gBAA6C;AAAA,IAC/F,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,aAAa,CAAC,wBAAG,eAAe,UAAU,QAAQ,CAAC;AAAA,MAEzD,IAAI,SAAS;AAAA,QACX,WAAW,KAAK,wBAAG,eAAe,SAAS,OAAO,CAAC;AAAA,MACrD;AAAA,MAEA,IAAI,gBAAgB;AAAA,QAClB,WAAW,KAAK,wBAAG,eAAe,gBAAgB,cAAc,CAAC;AAAA,MACnE;AAAA,MAEA,MAAM,SAAS,MAAM,KAAK,GACvB,OAAO;AAAA,QACN,IAAI,eAAe;AAAA,QACnB,UAAU,eAAe;AAAA,QACzB,MAAM,eAAe;AAAA,QACrB,MAAM,eAAe;AAAA,QACrB,SAAS,eAAe;AAAA,QACxB,SAAS,eAAe;AAAA,QACxB,QAAQ,eAAe;AAAA,QACvB,gBAAgB,eAAe;AAAA,QAC/B,WAAW,eAAe;AAAA,MAC5B,CAAC,EACA,KAAK,cAAc,EACnB,MAAM,yBAAI,GAAG,UAAU,CAAC;AAAA,MAE3B,IAAI,OAAO,WAAW;AAAA,QAAG,OAAO,CAAC;AAAA,MAEjC,MAAM,aAAa,OAAO,IAAI,CAAC,eAAe;AAAA,WACzC;AAAA,QACH,IAAI,UAAU;AAAA,QACd,UAAU,UAAU;AAAA,QACpB,SAAS,UAAU;AAAA,QACnB,QAAQ,UAAU;AAAA,QAClB,SAAU,UAAU,WAAW;AAAA,QAC/B,gBAAiB,UAAU,kBAAkB;AAAA,QAC7C,MAAM,UAAU;AAAA,QAChB,WAAW,UAAU,UAAU,QAAQ;AAAA,MACzC,EAAE;AAAA,MAEF,OAAO;AAAA,KACR;AAAA;AAAA,OAQG,gBAAe,CAAC,WAAwC;AAAA,IAC5D,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,KAAK,GAAG,OAAO,cAAc,EAAE,OAAO;AAAA,WACvC;AAAA,QACH,WAAW,IAAI;AAAA,MACjB,CAAC;AAAA,MACD,OAAO;AAAA,KACR;AAAA;AAAA,OAQG,gBAAe,CAAC,WAAqC;AAAA,IACzD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,IAAI;AAAA,QAEF,QAAQ,cAAc,SAAS;AAAA,QAC/B,MAAM,KAAK,GACR,OAAO,cAAc,EACrB,IAAI;AAAA,aACA;AAAA,UACH,WAAW,IAAI,KAAK,SAAS;AAAA,QAC/B,CAAC,EACA,MAAM,wBAAG,eAAe,IAAI,UAAU,EAAE,CAAC;AAAA,QAC5C,OAAO,GAAG;AAAA,QACV,QAAQ,MAAM,yBAAyB,CAAC;AAAA;AAAA,KAE3C;AAAA;AAAA,OAQG,gBAAe,CAAC,aAAkC;AAAA,IACtD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,KAAK,GAAG,OAAO,cAAc,EAAE,MAAM,wBAAG,eAAe,IAAI,WAAW,CAAC;AAAA,KAC9E;AAAA;AAAA,OAeG,YAAW,CAAC,QAoBI;AAAA,IACpB,QAAQ,UAAU,SAAS,QAAQ,SAAS,iBAAQ,OAAO,KAAK,WAAW;AAAA,IAC3E,MAAM,mBAAmB,OAAO,qBAAqB;AAAA,IACrD,MAAM,YAAY,OAAO;AAAA,IAGzB,MAAM,iBAAiB,OAAO,SAAS,OAAO;AAAA,IAE9C,IAAI,WAAW,aAAa,SAAS,GAAG;AAAA,MACtC,MAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AAAA,IAEA,OAAO,KAAK,kBAAkB,YAAY,MAAM,OAAO,OAAO;AAAA,MAC5D,MAAM,aAAa,CAAC,wBAAG,YAAY,MAAM,SAAS,CAAC;AAAA,MAEnD,IAAI,UAAU,WAAW;AAAA,QACvB,WAAW,KAAK,yBAAI,YAAY,WAAW,IAAI,KAAK,KAAK,CAAC,CAAC;AAAA,MAC7D;AAAA,MAIA,IAAI,QAAQ;AAAA,QACV,WAAW,KAAK,wBAAG,YAAY,QAAQ,MAAM,CAAC;AAAA,MAChD;AAAA,MAGA,IAAI,SAAS;AAAA,QACX,WAAW,KAAK,wBAAG,YAAY,SAAS,OAAO,CAAC;AAAA,MAClD;AAAA,MAEA,IAAI,QAAQ,WAAW;AAAA,QACrB,WAAW,KAAK,yBAAI,YAAY,WAAW,IAAI,KAAK,GAAG,CAAC,CAAC;AAAA,MAC3D;AAAA,MAEA,IAAI,SAAQ;AAAA,QACV,WAAW,KAAK,wBAAG,YAAY,QAAQ,IAAI,CAAC;AAAA,MAC9C;AAAA,MAEA,IAAI,SAAS;AAAA,QACX,WAAW,KAAK,wBAAG,YAAY,SAAS,OAAO,CAAC;AAAA,MAClD;AAAA,MAEA,MAAM,eAAe;AAAA,QACnB,IAAI,YAAY;AAAA,QAChB,MAAM,YAAY;AAAA,QAClB,WAAW,YAAY;AAAA,QACvB,SAAS,YAAY;AAAA,QACrB,UAAU,YAAY;AAAA,QACtB,SAAS,YAAY;AAAA,QACrB,QAAQ,YAAY;AAAA,QACpB,QAAQ,YAAY;AAAA,QACpB,UAAU,YAAY;AAAA,MACxB;AAAA,MAYA,MAAM,SAAS,CAAC,GAAmB,eAAqD;AAAA,QACtF,IAAI,EAAE;AAAA,QACN,MAAM,EAAE;AAAA,QACR,WAAW,EAAE,UAAU,QAAQ;AAAA,QAC/B,SAAS,OAAO,EAAE,YAAY,WAAW,KAAK,MAAM,EAAE,OAAO,IAAI,EAAE;AAAA,QACnE,UAAU,EAAE;AAAA,QACZ,SAAS,EAAE;AAAA,QACX,QAAQ,EAAE;AAAA,QACV,QAAQ,EAAE;AAAA,QACV,UAAU,EAAE;AAAA,QACZ,WAAW,YAAY,MAAM,KAAK,SAAS,IAAI;AAAA,MACjD;AAAA,MAEA,IAAI,kBAAkB;AAAA,QACpB,MAAM,aAAY,GACf,OAAO;AAAA,UACN,QAAQ;AAAA,UACR,WAAW,eAAe,KAAK;AAAA,QACjC,CAAC,EACA,KAAK,WAAW,EAChB,SAAS,gBAAgB,wBAAG,eAAe,UAAU,YAAY,EAAE,CAAC,EACpE,MAAM,yBAAI,GAAG,UAAU,CAAC,EACxB,QAAQ,0BAAK,YAAY,SAAS,GAAG,0BAAK,YAAY,EAAE,CAAC;AAAA,QAC5D,MAAM,QAAO,OAAO,YAAY;AAAA,UAM9B,IAAI,kBAAkB,WAAW,aAAa,SAAS,GAAG;AAAA,YACxD,OAAO,WAAU,MAAM,cAAc,EAAE,OAAO,MAAM;AAAA,UACtD,EAAO,SAAI,gBAAgB;AAAA,YACzB,OAAO,WAAU,MAAM,cAAc;AAAA,UACvC,EAAO,SAAI,WAAW,aAAa,SAAS,GAAG;AAAA,YAC7C,OAAO,WAAU,OAAO,MAAM;AAAA,UAChC,EAAO;AAAA,YACL,OAAO;AAAA;AAAA,WAER;AAAA,QACH,OAAO,MAAK,IAAI,CAAC,QAAQ,OAAO,IAAI,QAA0B,IAAI,SAAS,CAAC;AAAA,MAC9E;AAAA,MAKA,MAAM,YAAY,GACf,OAAO,EAAE,QAAQ,aAAa,CAAC,EAC/B,KAAK,WAAW,EAChB,MAAM,yBAAI,GAAG,UAAU,CAAC,EACxB,QAAQ,0BAAK,YAAY,SAAS,GAAG,0BAAK,YAAY,EAAE,CAAC;AAAA,MAC5D,MAAM,OAAO,OAAO,YAAY;AAAA,QAC9B,IAAI,kBAAkB,WAAW,aAAa,SAAS,GAAG;AAAA,UACxD,OAAO,UAAU,MAAM,cAAc,EAAE,OAAO,MAAM;AAAA,QACtD,EAAO,SAAI,gBAAgB;AAAA,UACzB,OAAO,UAAU,MAAM,cAAc;AAAA,QACvC,EAAO,SAAI,WAAW,aAAa,SAAS,GAAG;AAAA,UAC7C,OAAO,UAAU,OAAO,MAAM;AAAA,QAChC,EAAO;AAAA,UACL,OAAO;AAAA;AAAA,SAER;AAAA,MACH,OAAO,KAAK,IAAI,CAAC,QAAQ,OAAO,IAAI,QAA0B,SAAS,CAAC;AAAA,KACzE;AAAA;AAAA,OAWG,qBAAoB,CAAC,QAKL;AAAA,IACpB,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,IAAI,OAAO,QAAQ,WAAW;AAAA,QAAG,OAAO,CAAC;AAAA,MAEzC,MAAM,aAAa;AAAA,QACjB,wBAAG,YAAY,MAAM,OAAO,SAAS;AAAA,QACrC,6BAAQ,YAAY,QAAQ,OAAO,OAAO;AAAA,MAC5C;AAAA,MAEA,WAAW,KAAK,wBAAG,YAAY,SAAS,KAAK,OAAO,CAAC;AAAA,MAErD,MAAM,QAAQ,KAAK,GAChB,OAAO;AAAA,QACN,IAAI,YAAY;AAAA,QAChB,MAAM,YAAY;AAAA,QAClB,WAAW,YAAY;AAAA,QACvB,SAAS,YAAY;AAAA,QACrB,UAAU,YAAY;AAAA,QACtB,SAAS,YAAY;AAAA,QACrB,QAAQ,YAAY;AAAA,QACpB,QAAQ,YAAY;AAAA,QACpB,UAAU,YAAY;AAAA,MACxB,CAAC,EACA,KAAK,WAAW,EAChB,MAAM,yBAAI,GAAG,UAAU,CAAC,EACxB,QAAQ,0BAAK,YAAY,SAAS,CAAC;AAAA,MAEtC,MAAM,OAAO,OAAO,QAAQ,MAAM,MAAM,MAAM,OAAO,KAAK,IAAI,MAAM;AAAA,MAEpE,OAAO,KAAK,IAAI,CAAC,SAAS;AAAA,QACxB,IAAI,IAAI;AAAA,QACR,WAAW,IAAI,UAAU,QAAQ;AAAA,QACjC,SAAS,OAAO,IAAI,YAAY,WAAW,KAAK,MAAM,IAAI,OAAO,IAAI,IAAI;AAAA,QACzE,UAAU,IAAI;AAAA,QACd,SAAS,IAAI;AAAA,QACb,QAAQ,IAAI;AAAA,QACZ,QAAQ,IAAI;AAAA,QACZ,UAAU,IAAI;AAAA,MAChB,EAAE;AAAA,KACH;AAAA;AAAA,OAQG,cAAa,CAAC,IAAkC;AAAA,IACpD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,SAAS,MAAM,KAAK,GACvB,OAAO;AAAA,QACN,QAAQ;AAAA,QACR,WAAW,eAAe,KAAK;AAAA,MACjC,CAAC,EACA,KAAK,WAAW,EAChB,SAAS,gBAAgB,wBAAG,YAAY,IAAI,eAAe,QAAQ,CAAC,EACpE,MAAM,wBAAG,YAAY,IAAI,EAAE,CAAC,EAC5B,MAAM,CAAC;AAAA,MAEV,IAAI,OAAO,WAAW;AAAA,QAAG,OAAO;AAAA,MAEhC,MAAM,MAAM,OAAO;AAAA,MACnB,OAAO;AAAA,QACL,IAAI,IAAI,OAAO;AAAA,QACf,WAAW,IAAI,OAAO,UAAU,QAAQ;AAAA,QACxC,SACE,OAAO,IAAI,OAAO,YAAY,WAC1B,KAAK,MAAM,IAAI,OAAO,OAAO,IAC7B,IAAI,OAAO;AAAA,QACjB,UAAU,IAAI,OAAO;AAAA,QACrB,SAAS,IAAI,OAAO;AAAA,QACpB,QAAQ,IAAI,OAAO;AAAA,QACnB,QAAQ,IAAI,OAAO;AAAA,QACnB,UAAU,IAAI,OAAO;AAAA,QACrB,WAAW,IAAI,aAAa;AAAA,MAC9B;AAAA,KACD;AAAA;AAAA,OAUG,iBAAgB,CAAC,WAAmB,WAAuC;AAAA,IAC/E,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,IAAI,UAAU,WAAW;AAAA,QAAG,OAAO,CAAC;AAAA,MAEpC,MAAM,aAAa,CAAC,6BAAQ,YAAY,IAAI,SAAS,CAAC;AAAA,MAEtD,IAAI,WAAW;AAAA,QACb,WAAW,KAAK,wBAAG,YAAY,MAAM,SAAS,CAAC;AAAA,MACjD;AAAA,MAEA,MAAM,OAAO,MAAM,KAAK,GACrB,OAAO;AAAA,QACN,QAAQ;AAAA,QACR,WAAW,eAAe,KAAK;AAAA,MACjC,CAAC,EACA,KAAK,WAAW,EAChB,SAAS,gBAAgB,wBAAG,eAAe,UAAU,YAAY,EAAE,CAAC,EACpE,MAAM,yBAAI,GAAG,UAAU,CAAC,EACxB,QAAQ,0BAAK,YAAY,SAAS,CAAC;AAAA,MAEtC,OAAO,KAAK,IAAI,CAAC,SAAS;AAAA,QACxB,IAAI,IAAI,OAAO;AAAA,QACf,WAAW,IAAI,OAAO,UAAU,QAAQ;AAAA,QACxC,SACE,OAAO,IAAI,OAAO,YAAY,WAC1B,KAAK,MAAM,IAAI,OAAO,OAAO,IAC7B,IAAI,OAAO;AAAA,QACjB,UAAU,IAAI,OAAO;AAAA,QACrB,SAAS,IAAI,OAAO;AAAA,QACpB,QAAQ,IAAI,OAAO;AAAA,QACnB,QAAQ,IAAI,OAAO;AAAA,QACnB,UAAU,IAAI,OAAO;AAAA,QACrB,WAAW,IAAI,aAAa;AAAA,MAC9B,EAAE;AAAA,KACH;AAAA;AAAA,OAcG,oBAAmB,CAAC,MAOwC;AAAA,IAChE,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,IAAI;AAAA,QAKF,MAAM,UAAU,MAAO,KAAK,GAAkC,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,8CAKhC,KAAK;AAAA;AAAA;AAAA;AAAA,yCAIV,KAAK;AAAA,8CACA,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2CAmBR,KAAK;AAAA;AAAA,6CAEH,KAAK,0CAA0C,KAAK;AAAA;AAAA,4BAErE,KAAK;AAAA,iBAChB;AAAA,QAET,OAAO,QAAQ,KACZ,IAAI,CAAC,SAAS;AAAA,UACb,WAAW,MAAM,QAAQ,IAAI,SAAS,IAClC,IAAI,YACJ,OAAO,IAAI,cAAc,WACvB,KAAK,MAAM,IAAI,SAAS,IACxB,CAAC;AAAA,UACP,mBAAmB,OAAO,IAAI,iBAAiB;AAAA,QACjD,EAAE,EACD,OAAO,CAAC,QAAQ,MAAM,QAAQ,IAAI,SAAS,CAAC;AAAA,QAC/C,OAAO,OAAO;AAAA,QACd,oBAAO,MACL;AAAA,UACE,KAAK;AAAA,UACL,WAAW,KAAK;AAAA,UAChB,WAAW,KAAK;AAAA,UAChB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,GACA,iCACF;AAAA,QACA,IACE,iBAAiB,SACjB,MAAM,YAAY,iEAClB;AAAA,UACA,OAAO,CAAC;AAAA,QACV;AAAA,QACA,MAAM;AAAA;AAAA,KAET;AAAA;AAAA,OAYG,IAAG,CAAC,QAAsF;AAAA,IAC9F,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,IAAI;AAAA,QAEF,MAAM,gBAAgB,KAAK,mBAAmB,OAAO,IAAI;AAAA,QAIzD,MAAM,aAAa,KAAK,UAAU,aAAa;AAAA,QAI/C,MAAM,KAAK,kBAAkB,OAAO,UAAU,OAAO,OAAO;AAAA,UAC1D,MAAM,GAAG,OAAO,QAAQ,EAAE,OAAO;AAAA,YAC/B,MAAM,2BAAM;AAAA,YACZ,UAAU,OAAO;AAAA,YACjB,QAAQ,OAAO;AAAA,YACf,MAAM,OAAO;AAAA,UACf,CAAC;AAAA,SACF;AAAA,QACD,OAAO,OAAO;AAAA,QACd,oBAAO,MACL;AAAA,UACE,KAAK;AAAA,UACL,MAAM,OAAO;AAAA,UACb,QAAQ,OAAO;AAAA,UACf,UAAU,OAAO;AAAA,UACjB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,GACA,4BACF;AAAA,QACA;AAAA;AAAA,KAEH;AAAA;AAAA,EAUK,kBAAkB,CAAC,OAAgB,OAAwB,IAAI,SAAoB;AAAA,IACzF,IAAI,UAAU,QAAQ,UAAU,WAAW;AAAA,MACzC,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,OAAO,UAAU,UAAU;AAAA,MAK7B,MAAM,WAAW,OAAO,aAAa,CAAC;AAAA,MACtC,MAAM,gBAAgB,IAAI,OAAO,UAAU,GAAG;AAAA,MAC9C,OAAO,MACJ,QAAQ,eAAe,EAAE,EACzB,QAAQ,uBAAuB,MAAM,EACrC,QAAQ,0BAA0B,OAAO;AAAA,IAC9C;AAAA,IAEA,IAAI,OAAO,UAAU,UAAU;AAAA,MAC7B,IAAI,KAAK,IAAI,KAAe,GAAG;AAAA,QAC7B,OAAO;AAAA,MACT,EAAO;AAAA,QACL,KAAK,IAAI,KAAe;AAAA;AAAA,MAG1B,IAAI,MAAM,QAAQ,KAAK,GAAG;AAAA,QACxB,OAAO,MAAM,IAAI,CAAC,SAAS,KAAK,mBAAmB,MAAM,IAAI,CAAC;AAAA,MAChE,EAAO;AAAA,QACL,MAAM,SAAkC,CAAC;AAAA,QACzC,MAAM,WAAW,OAAO,aAAa,CAAC;AAAA,QACtC,MAAM,gBAAgB,IAAI,OAAO,UAAU,GAAG;AAAA,QAC9C,YAAY,KAAK,QAAQ,OAAO,QAAQ,KAAK,GAAG;AAAA,UAE9C,MAAM,eACJ,OAAO,QAAQ,WACX,IAAI,QAAQ,eAAe,EAAE,EAAE,QAAQ,0BAA0B,OAAO,IACxE;AAAA,UACN,OAAO,gBAAgB,KAAK,mBAAmB,KAAK,IAAI;AAAA,QAC1D;AAAA,QACA,OAAO;AAAA;AAAA,IAEX;AAAA,IAEA,OAAO;AAAA;AAAA,OAaH,QAAO,CAAC,QAMK;AAAA,IACjB,QAAQ,UAAU,QAAQ,MAAM,eAAO,WAAW;AAAA,IAIlD,OAAO,KAAK,kBAAkB,YAAY,MAAM,OAAO,OAAO;AAAA,MAC5D,MAAM,SAAS,MAAM,GAClB,OAAO,EACP,KAAK,QAAQ,EACb,MACC,yBACE,SAAS,wBAAG,SAAS,QAAQ,MAAM,IAAI,WACvC,OAAO,wBAAG,SAAS,MAAM,IAAI,IAAI,SACnC,CACF,EACC,QAAQ,0BAAK,SAAS,SAAS,CAAC,EAChC,MAAM,UAAS,EAAE,EACjB,OAAO,UAAU,CAAC;AAAA,MAErB,MAAM,OAAO,OAAO,IAAI,CAAC,SAAS;AAAA,WAC7B;AAAA,QACH,IAAI,IAAI;AAAA,QACR,UAAU,IAAI;AAAA,QACd,QAAQ,IAAI;AAAA,QACZ,MAAM,IAAI;AAAA,QACV,MAAM,IAAI;AAAA,QACV,WAAW,IAAI,KAAK,IAAI,SAAmC;AAAA,MAC7D,EAAE;AAAA,MAEF,IAAI,KAAK,WAAW;AAAA,QAAG,OAAO,CAAC;AAAA,MAE/B,OAAO;AAAA,KACR;AAAA;AAAA,OAGG,qBAAoB,CACxB,SAOI,CAAC,GAC2B;AAAA,IAChC,MAAM,QAAQ,KAAK,IAAI,KAAK,IAAI,OAAO,SAAS,IAAI,CAAC,GAAG,GAAG;AAAA,IAC3D,MAAM,WAAW,OAAO,OAAO,SAAS,WAAW,IAAI,KAAK,OAAO,IAAI,IAAI;AAAA,IAC3E,MAAM,SAAS,OAAO,OAAO,OAAO,WAAW,IAAI,KAAK,OAAO,EAAE,IAAI;AAAA,IAGrE,OAAO,KAAK,kBAAkB,OAAO,YAAY,MAAM,OAAO,OAAO;AAAA,MACnE,MAAM,SAAS,IAAI;AAAA,MAEnB,MAAM,aAA6B;AAAA,QACjC,wBAAG,SAAS,MAAM,WAAW;AAAA,QAC7B,2BAAM,SAAS;AAAA,QACf,wBAAG,UAAU,SAAS,KAAK,OAAO;AAAA,MACpC;AAAA,MAEA,IAAI,OAAO,QAAQ;AAAA,QACjB,WAAW,KAAK,wBAAG,SAAS,QAAQ,OAAO,MAAM,CAAC;AAAA,MACpD;AAAA,MACA,IAAI,UAAU;AAAA,QACZ,WAAW,KAAK,yBAAI,SAAS,WAAW,QAAQ,CAAC;AAAA,MACnD;AAAA,MACA,IAAI,QAAQ;AAAA,QACV,WAAW,KAAK,yBAAI,SAAS,WAAW,MAAM,CAAC;AAAA,MACjD;AAAA,MAEA,MAAM,cAAc,yBAAI,GAAG,UAAU;AAAA,MAErC,MAAM,aAAa,KAAK,IAAI,QAAQ,IAAI,GAAG;AAAA,MAE3C,MAAM,eAAe,MAAM,GACxB,OAAO;AAAA,QACN,OAAO,4BAAe,SAAS;AAAA,QAC/B,QAAQ,4BAAsB,SAAS;AAAA,QACvC,WAAW,4BAAsB,SAAS;AAAA,QAC1C,SAAS,SAAS;AAAA,QAClB,WAAW,SAAS;AAAA,QACpB,QAAQ,SAAS;AAAA,QACjB,UAAU,SAAS;AAAA,MACrB,CAAC,EACA,KAAK,QAAQ,EACb,UAAU,WAAW,wBAAG,UAAU,IAAI,SAAS,MAAM,CAAC,EACtD,MAAM,WAAW,EACjB,QAAQ,0BAAK,SAAS,SAAS,CAAC,EAChC,MAAM,UAAU;AAAA,MAEnB,WAAW,OAAO,cAAc;AAAA,QAC9B,MAAM,QAAQ,IAAI;AAAA,QAClB,IAAI,CAAC;AAAA,UAAO;AAAA,QAEZ,MAAM,UAA2B,OAAO,IAAI,KAAK,KAAK;AAAA,UACpD;AAAA,UACA,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,UAAU,CAAC;AAAA,QACb;AAAA,QAEA,IAAI,CAAC,QAAQ,aAAa,IAAI,WAAW;AAAA,UACvC,QAAQ,YAAY,IAAI;AAAA,QAC1B;AAAA,QACA,IAAI,CAAC,QAAQ,UAAU,IAAI,QAAQ;AAAA,UACjC,QAAQ,SAAS,IAAI;AAAA,QACvB;AAAA,QACA,IAAI,CAAC,QAAQ,YAAY,IAAI,UAAU;AAAA,UACrC,QAAQ,WAAW,IAAI;AAAA,QACzB;AAAA,QAEA,MAAM,OAAO,IAAI;AAAA,QACjB,IAAI,QAAQ,OAAO,SAAS,UAAU;AAAA,UACpC,IAAI,CAAC,QAAQ,UAAU,OAAO,KAAK,WAAW,UAAU;AAAA,YACtD,QAAQ,SAAS,KAAK;AAAA,UACxB;AAAA,UACA,IAAI,CAAC,QAAQ,YAAY,OAAO,KAAK,aAAa,UAAU;AAAA,YAC1D,QAAQ,WAAW,KAAK;AAAA,UAC1B;AAAA,UACA,IAAI,CAAC,QAAQ,aAAa,OAAO,KAAK,cAAc,UAAU;AAAA,YAC5D,QAAQ,YAAY,KAAK;AAAA,UAC3B;AAAA,UACA,IAAI,CAAC,QAAQ,YAAY,OAAO,KAAK,QAAQ,QAAQ,EAAE,WAAW,GAAG;AAAA,YACnE,MAAM,WAAY,KAAK,YAAoD;AAAA,YAC3E,QAAQ,WAAW,WAAY,KAAK,SAAS,IAAkC,CAAC;AAAA,UAClF;AAAA,QACF;AAAA,QAEA,MAAM,YAAY,IAAI,qBAAqB,OAAO,IAAI,YAAY,IAAI,KAAK,IAAI,SAAS;AAAA,QACxF,MAAM,cAAY,UAAU,QAAQ;AAAA,QACpC,MAAM,aAAa,MAAM;AAAA,QACzB,MAAM,cACH,IAAI,UAAqC;AAAA,QAE5C,IAAI,gBAAgB,WAAW;AAAA,UAC7B,MAAM,mBACJ,QAAQ,cAAc,OAClB,OACA,OAAO,QAAQ,cAAc,WAC3B,OAAO,QAAQ,SAAS,IACxB,QAAQ;AAAA,UAChB,QAAQ,YACN,qBAAqB,OAAO,cAAY,KAAK,IAAI,kBAAkB,WAAS;AAAA,QAChF,EAAO,SACL,gBAAgB,eAChB,gBAAgB,aAChB,gBAAgB,SAChB;AAAA,UACA,QAAQ,SAAS;AAAA,UACjB,QAAQ,UAAU;AAAA,UAClB,IAAI,QAAQ,cAAc,MAAM;AAAA,YAC9B,MAAM,eACJ,OAAO,QAAQ,cAAc,WAAW,OAAO,QAAQ,SAAS,IAAI,QAAQ;AAAA,YAC9E,QAAQ,aAAa,KAAK,IAAI,cAAY,cAAc,CAAC;AAAA,UAC3D;AAAA,QACF;AAAA,QAEA,OAAO,IAAI,OAAO,OAAO;AAAA,MAC3B;AAAA,MAEA,IAAI,OAAO,MAAM,KAAK,OAAO,OAAO,CAAC;AAAA,MACrC,IAAI,OAAO,UAAU,OAAO,WAAW,OAAO;AAAA,QAC5C,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,WAAW,OAAO,MAAM;AAAA,MAC1D;AAAA,MAEA,KAAK,KAAK,CAAC,GAAG,MAAM;AAAA,QAClB,MAAM,WACJ,EAAE,cAAc,OACZ,IACA,OAAO,EAAE,cAAc,WACrB,OAAO,EAAE,SAAS,IAClB,EAAE;AAAA,QACV,MAAM,WACJ,EAAE,cAAc,OACZ,IACA,OAAO,EAAE,cAAc,WACrB,OAAO,EAAE,SAAS,IAClB,EAAE;AAAA,QACV,OAAO,WAAW;AAAA,OACnB;AAAA,MAED,MAAM,QAAQ,KAAK;AAAA,MACnB,MAAM,cAAc,KAAK,MAAM,GAAG,KAAK;AAAA,MACvC,MAAM,UAAU,QAAQ;AAAA,MAExB,MAAM,YAAY,IAAI;AAAA,MACtB,WAAW,OAAO,aAAa;AAAA,QAC7B,UAAU,IAAI,IAAI,OAAO;AAAA,UACvB,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,MAEA,MAAM,SAAS,YAAY,IAAI,CAAC,QAAQ,IAAI,KAAK,EAAE,OAAO,OAAO;AAAA,MAEjE,IAAI,OAAO,SAAS,GAAG;AAAA,QACrB,MAAM,aAAa,iCAAY,yBAAI,KACjC,OAAO,IAAI,CAAC,OAAO,2BAAM,IAAI,GAC7B,4BACF;AAAA,QAEA,MAAM,gBAAgB,MAAM,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAMnC;AAAA;AAAA,uCAEsB;AAAA;AAAA,SAE9B;AAAA,QAED,MAAM,aAAa,cAAc;AAAA,QAOjC,WAAW,OAAO,YAAY;AAAA,UAC5B,MAAM,SAAS,UAAU,IAAI,IAAI,KAAK;AAAA,UACtC,IAAI,CAAC;AAAA,YAAQ;AAAA,UACb,OAAO,WAAW,OAAO,IAAI,OAAO;AAAA,UACpC,OAAO,UAAU,OAAO,IAAI,MAAM;AAAA,UAClC,OAAO,cAAc,OAAO,IAAI,UAAU;AAAA,QAC5C;AAAA,QAEA,MAAM,mBAAmB,MAAM,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA,iBAItC;AAAA;AAAA,uCAEsB;AAAA;AAAA,SAE9B;AAAA,QAED,MAAM,gBAAgB,iBAAiB;AAAA,QAKvC,WAAW,OAAO,eAAe;AAAA,UAC/B,MAAM,SAAS,UAAU,IAAI,IAAI,KAAK;AAAA,UACtC,IAAI,CAAC;AAAA,YAAQ;AAAA,UACb,OAAO,cAAc,OAAO,IAAI,UAAU;AAAA,QAC5C;AAAA,QAEA,MAAM,iBAAiB,MAAM,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,iBAKpC;AAAA;AAAA,uCAEsB;AAAA;AAAA,SAE9B;AAAA,QAED,MAAM,cAAc,eAAe;AAAA,QAMnC,WAAW,OAAO,aAAa;AAAA,UAC7B,MAAM,SAAS,UAAU,IAAI,IAAI,KAAK;AAAA,UACtC,IAAI,CAAC;AAAA,YAAQ;AAAA,UACb,OAAO,cAAc,OAAO,IAAI,SAAS;AAAA,UACzC,OAAO,UAAU,OAAO,IAAI,eAAe;AAAA,QAC7C;AAAA,MACF;AAAA,MAEA,WAAW,OAAO,aAAa;AAAA,QAC7B,MAAM,SAAS,UAAU,IAAI,IAAI,KAAK,KAAK;AAAA,UACzC,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,YAAY;AAAA,QACd;AAAA,QACA,IAAI,SAAS;AAAA,MACf;AAAA,MAEA,OAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,KACD;AAAA;AAAA,OAQG,UAAS,CAAC,OAA4B;AAAA,IAC1C,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,KAAK,GAAG,OAAO,QAAQ,EAAE,MAAM,wBAAG,SAAS,IAAI,KAAK,CAAC;AAAA,KAC5D;AAAA;AAAA,OAiBG,eAAc,CAAC,QAWC;AAAA,IACpB,OAAO,MAAM,KAAK,0BAA0B,OAAO,WAAW;AAAA,MAC5D,iBAAiB,OAAO;AAAA,MACxB,OAAO,OAAO;AAAA,MAEd,QAAQ,OAAO;AAAA,MACf,SAAS,OAAO;AAAA,MAChB,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO;AAAA,MACf,WAAW,OAAO;AAAA,IACpB,CAAC;AAAA;AAAA,OAgBG,0BAAyB,CAC7B,WACA,QASmB;AAAA,IACnB,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,cAAc,UAAU,IAAI,CAAC,MAAO,OAAO,SAAS,CAAC,IAAI,OAAO,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAE;AAAA,MAExF,MAAM,aAAa,gCAAmB,oCACpC,eAAe,KAAK,qBACpB,WACF;AAAA,MAEA,MAAM,aAAa,CAAC,wBAAG,YAAY,MAAM,OAAO,SAAS,CAAC;AAAA,MAE1D,IAAI,OAAO,QAAQ;AAAA,QACjB,WAAW,KAAK,wBAAG,YAAY,QAAQ,IAAI,CAAC;AAAA,MAC9C;AAAA,MAEA,WAAW,KAAK,wBAAG,YAAY,SAAS,KAAK,OAAO,CAAC;AAAA,MAGrD,IAAI,OAAO,QAAQ;AAAA,QACjB,WAAW,KAAK,wBAAG,YAAY,QAAQ,OAAO,MAAM,CAAC;AAAA,MACvD;AAAA,MACA,IAAI,OAAO,SAAS;AAAA,QAClB,WAAW,KAAK,wBAAG,YAAY,SAAS,OAAO,OAAO,CAAC;AAAA,MACzD;AAAA,MACA,IAAI,OAAO,UAAU;AAAA,QACnB,WAAW,KAAK,wBAAG,YAAY,UAAU,OAAO,QAAQ,CAAC;AAAA,MAC3D;AAAA,MAEA,IAAI,OAAO,iBAAiB;AAAA,QAC1B,WAAW,KAAK,yBAAI,YAAY,OAAO,eAAe,CAAC;AAAA,MACzD;AAAA,MAEA,MAAM,UAAU,MAAM,KAAK,GACxB,OAAO;AAAA,QACN,QAAQ;AAAA,QACR;AAAA,QACA,WAAW,eAAe,KAAK;AAAA,MACjC,CAAC,EACA,KAAK,cAAc,EACnB,UAAU,aAAa,wBAAG,YAAY,IAAI,eAAe,QAAQ,CAAC,EAClE,MAAM,yBAAI,GAAG,UAAU,CAAC,EACxB,QAAQ,0BAAK,UAAU,CAAC,EACxB,MAAM,OAAO,SAAS,EAAE;AAAA,MAE3B,OAAO,QAAQ,IAAI,CAAC,SAAS;AAAA,QAC3B,IAAI,IAAI,OAAO;AAAA,QACf,MAAM,IAAI,OAAO;AAAA,QACjB,WAAW,IAAI,OAAO,UAAU,QAAQ;AAAA,QACxC,SACE,OAAO,IAAI,OAAO,YAAY,WAC1B,KAAK,MAAM,IAAI,OAAO,OAAO,IAC7B,IAAI,OAAO;AAAA,QACjB,UAAU,IAAI,OAAO;AAAA,QACrB,SAAS,IAAI,OAAO;AAAA,QACpB,QAAQ,IAAI,OAAO;AAAA,QACnB,SAAS,IAAI,OAAO;AAAA,QACpB,QAAQ,IAAI,OAAO;AAAA,QACnB,UAAU,IAAI,OAAO;AAAA,QACrB,WAAW,IAAI,aAAa;AAAA,QAC5B,YAAY,IAAI;AAAA,MAClB,EAAE;AAAA,KACH;AAAA;AAAA,OASG,aAAY,CAChB,QACA,WACe;AAAA,IACf,MAAM,WAAW,OAAO,MAAO,GAAG;AAAA,IAElC,MAAM,WAAW,MAAM,KAAK,cAAc,QAAQ;AAAA,IAClD,IAAI,UAAU;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,IAGA,IAAI,OAAO,WAAW,WAAW;AAAA,MAC/B,OAAO,SAAS;AAAA,MAChB,IAAI,OAAO,aAAa,MAAM,QAAQ,OAAO,SAAS,GAAG;AAAA,QACvD,MAAM,kBAAkB,MAAM,KAAK,0BAA0B,OAAO,WAAW;AAAA,UAC7E;AAAA,UAEA,QAAQ,OAAO;AAAA,UACf,SAAS,OAAO;AAAA,UAChB,UAAU,OAAO;AAAA,UACjB,iBAAiB;AAAA,UACjB,OAAO;AAAA,QACT,CAAC;AAAA,QACD,OAAO,SAAS,gBAAgB,WAAW;AAAA,MAC7C;AAAA,IACF;AAAA,IAIA,MAAM,kBACJ,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU,KAAK,UAAU,OAAO,OAAO;AAAA,IAErF,MAAM,mBACJ,OAAO,OAAO,aAAa,WAAW,OAAO,WAAW,KAAK,UAAU,OAAO,YAAY,CAAC,CAAC;AAAA,IAI9F,MAAM,KAAK,kBAAkB,OAAO,UAAU,OAAO,OAAO;AAAA,MAC1D,MAAM,GAAG,OAAO,WAAW,EAAE,OAAO;AAAA,QAClC;AAAA,UACE,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,SAAS,2BAAM;AAAA,UACf,UAAU,2BAAM;AAAA,UAChB,UAAU,OAAO;AAAA,UACjB,QAAQ,OAAO;AAAA,UACf,SAAS,OAAO;AAAA,UAChB,SAAS,OAAO,WAAW,KAAK;AAAA,UAChC,QAAQ,OAAO;AAAA,UACf,WAAW,OAAO,cAAc,YAAY,IAAI,KAAK,OAAO,SAAS,IAAI,IAAI;AAAA,QAC/E;AAAA,MACF,CAAC;AAAA,MAED,IAAI,OAAO,aAAa,MAAM,QAAQ,OAAO,SAAS,GAAG;AAAA,QACvD,MAAM,oBAAoB,OAAO,KAAK,mBAAmB,QAAQ,QAAQ,EAAE,CAAC;AAAA,QAC5E,IAAI,OAAO,UAAU,WAAW,mBAAmB;AAAA,UAOjD,oBAAO,KACL;AAAA,YACE,KAAK;AAAA,YACL,SAAS,KAAK;AAAA,YACd;AAAA,YACA,mBAAmB,OAAO,UAAU;AAAA,YACpC,QAAQ,KAAK;AAAA,UACf,GACA,sEACF;AAAA,QACF,EAAO;AAAA,UACL,MAAM,kBAA2C;AAAA,YAC/C,IAAI,GAAG;AAAA,YACP;AAAA,YACA,WAAW,OAAO,cAAc,YAAY,IAAI,KAAK,OAAO,SAAS,IAAI,IAAI;AAAA,UAC/E;AAAA,UAEA,MAAM,cAAc,OAAO,UAAU,IAAI,CAAC,MACxC,OAAO,SAAS,CAAC,IAAI,OAAO,EAAE,QAAQ,CAAC,CAAC,IAAI,CAC9C;AAAA,UAEA,gBAAgB,KAAK,sBAAsB;AAAA,UAE3C,MAAM,GAAG,OAAO,cAAc,EAAE,OAAO,CAAC,eAAe,CAAC;AAAA;AAAA,MAE5D;AAAA,KACD;AAAA,IAED,OAAO;AAAA;AAAA,OAQH,aAAY,CAChB,QACkB;AAAA,IAClB,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,IAAI;AAAA,QACF,MAAM,KAAK,GAAG,YAAY,OAAO,OAAO;AAAA,UAEtC,IAAI,OAAO,SAAS;AAAA,YAClB,MAAM,kBACJ,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU,KAAK,UAAU,OAAO,OAAO;AAAA,YAErF,MAAM,mBACJ,OAAO,OAAO,aAAa,WACvB,OAAO,WACP,KAAK,UAAU,OAAO,YAAY,CAAC,CAAC;AAAA,YAE1C,MAAM,GACH,OAAO,WAAW,EAClB,IAAI;AAAA,cACH,SAAS,2BAAM;AAAA,iBACX,OAAO,YAAY;AAAA,gBACrB,UAAU,2BAAM;AAAA,cAClB;AAAA,YACF,CAAC,EACA,MAAM,wBAAG,YAAY,IAAI,OAAO,EAAE,CAAC;AAAA,UACxC,EAAO,SAAI,OAAO,UAAU;AAAA,YAE1B,MAAM,mBACJ,OAAO,OAAO,aAAa,WACvB,OAAO,WACP,KAAK,UAAU,OAAO,QAAQ;AAAA,YAEpC,MAAM,GACH,OAAO,WAAW,EAClB,IAAI;AAAA,cACH,UAAU,2BAAM;AAAA,YAClB,CAAC,EACA,MAAM,wBAAG,YAAY,IAAI,OAAO,EAAE,CAAC;AAAA,UACxC;AAAA,UAGA,IAAI,OAAO,aAAa,MAAM,QAAQ,OAAO,SAAS,GAAG;AAAA,YACvD,MAAM,oBAAoB,OAAO,KAAK,mBAAmB,QAAQ,QAAQ,EAAE,CAAC;AAAA,YAC5E,IAAI,OAAO,UAAU,WAAW,mBAAmB;AAAA,cACjD,oBAAO,KACL;AAAA,gBACE,KAAK;AAAA,gBACL,SAAS,KAAK;AAAA,gBACd,UAAU,OAAO;AAAA,gBACjB;AAAA,gBACA,mBAAmB,OAAO,UAAU;AAAA,gBACpC,QAAQ,KAAK;AAAA,cACf,GACA,sEACF;AAAA,YACF,EAAO;AAAA,cACL,MAAM,cAAc,OAAO,UAAU,IAAI,CAAC,MACxC,OAAO,SAAS,CAAC,IAAI,OAAO,EAAE,QAAQ,CAAC,CAAC,IAAI,CAC9C;AAAA,cAGA,MAAM,oBAAoB,MAAM,GAC7B,OAAO,EAAE,IAAI,eAAe,GAAG,CAAC,EAChC,KAAK,cAAc,EACnB,MAAM,wBAAG,eAAe,UAAU,OAAO,EAAE,CAAC,EAC5C,MAAM,CAAC;AAAA,cAEV,IAAI,kBAAkB,SAAS,GAAG;AAAA,gBAEhC,MAAM,eAAwC,CAAC;AAAA,gBAC/C,aAAa,KAAK,sBAAsB;AAAA,gBAExC,MAAM,GACH,OAAO,cAAc,EACrB,IAAI,YAAY,EAChB,MAAM,wBAAG,eAAe,UAAU,OAAO,EAAE,CAAC;AAAA,cACjD,EAAO;AAAA,gBAEL,MAAM,kBAA2C;AAAA,kBAC/C,IAAI,GAAG;AAAA,kBACP,UAAU,OAAO;AAAA,gBACnB;AAAA,gBACA,gBAAgB,KAAK,sBAAsB;AAAA,gBAE3C,MAAM,GAAG,OAAO,cAAc,EAAE,OAAO,CAAC,eAAe,CAAC;AAAA;AAAA;AAAA,UAG9D;AAAA,SACD;AAAA,QAED,OAAO;AAAA,QACP,OAAO,OAAO;AAAA,QACd,oBAAO,MACL;AAAA,UACE,KAAK;AAAA,UACL,UAAU,OAAO;AAAA,UACjB,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,GACA,yBACF;AAAA,QACA,OAAO;AAAA;AAAA,KAEV;AAAA;AAAA,OAQG,aAAY,CAAC,UAA+B;AAAA,IAChD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,KAAK,GAAG,YAAY,OAAO,OAAO;AAAA,QAEtC,MAAM,KAAK,sBAAsB,IAAI,QAAQ;AAAA,QAG7C,MAAM,GAAG,OAAO,cAAc,EAAE,MAAM,wBAAG,eAAe,UAAU,QAAQ,CAAC;AAAA,QAG3E,MAAM,GAAG,OAAO,WAAW,EAAE,MAAM,wBAAG,YAAY,IAAI,QAAQ,CAAC;AAAA,OAChE;AAAA,KACF;AAAA;AAAA,OAQG,mBAAkB,CAAC,WAAkC;AAAA,IACzD,IAAI,UAAU,WAAW,GAAG;AAAA,MAC1B;AAAA,IACF;AAAA,IAEA,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,KAAK,GAAG,YAAY,OAAO,OAAO;AAAA,QAEtC,MAAM,aAAa;AAAA,QACnB,SAAS,IAAI,EAAG,IAAI,UAAU,QAAQ,KAAK,YAAY;AAAA,UACrD,MAAM,QAAQ,UAAU,MAAM,GAAG,IAAI,UAAU;AAAA,UAG/C,MAAM,QAAQ,IACZ,MAAM,IAAI,OAAO,aAAa;AAAA,YAC5B,MAAM,KAAK,sBAAsB,IAAI,QAAQ;AAAA,WAC9C,CACH;AAAA,UAGA,MAAM,GAAG,OAAO,cAAc,EAAE,MAAM,6BAAQ,eAAe,UAAU,KAAK,CAAC;AAAA,UAG7E,MAAM,GAAG,OAAO,WAAW,EAAE,MAAM,6BAAQ,YAAY,IAAI,KAAK,CAAC;AAAA,QACnE;AAAA,OACD;AAAA,KACF;AAAA;AAAA,OASW,sBAAqB,CAAC,IAAqB,YAAiC;AAAA,IACxF,MAAM,oBAAoB,MAAM,KAAK,mBAAmB,IAAI,UAAU;AAAA,IAEtE,IAAI,kBAAkB,SAAS,GAAG;AAAA,MAChC,MAAM,cAAc,kBAAkB,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,MAGrD,MAAM,GAAG,OAAO,cAAc,EAAE,MAAM,6BAAQ,eAAe,UAAU,WAAW,CAAC;AAAA,MAGnF,MAAM,GAAG,OAAO,WAAW,EAAE,MAAM,6BAAQ,YAAY,IAAI,WAAW,CAAC;AAAA,IACzE;AAAA;AAAA,OAUY,mBAAkB,CAAC,IAAqB,YAA2C;AAAA,IAC/F,MAAM,YAAY,MAAM,GACrB,OAAO,EAAE,IAAI,YAAY,GAAG,CAAC,EAC7B,KAAK,WAAW,EAChB,MACC,yBACE,wBAAG,YAAY,SAAS,KAAK,OAAO,GACpC,2BAAM,YAAY,6BAA6B,YACjD,CACF;AAAA,IAEF,OAAO,UAAU,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,GAAW,EAAE;AAAA;AAAA,OAW9C,kBAAiB,CAAC,iBAAgC,WAAkC;AAAA,IACxF,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,UAAU,MAAM,QAAQ,eAAe,IAAI,kBAAkB,CAAC,eAAe;AAAA,MAEnF,IAAI,QAAQ,WAAW,GAAG;AAAA,QACxB;AAAA,MACF;AAAA,MAEA,MAAM,KAAK,GAAG,YAAY,OAAO,OAAO;AAAA,QAEtC,MAAM,OAAO,MAAM,GAChB,OAAO,EAAE,IAAI,YAAY,GAAG,CAAC,EAC7B,KAAK,WAAW,EAChB,MACC,yBACE,6BAAQ,YAAY,QAAQ,OAAO,GACnC,wBAAG,YAAY,MAAM,SAAS,GAC9B,wBAAG,YAAY,SAAS,KAAK,OAAO,CACtC,CACF;AAAA,QAEF,MAAM,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,QAChC,oBAAO,MACL,EAAE,KAAK,cAAc,SAAS,WAAW,aAAa,IAAI,OAAO,GACjE,uBACF;AAAA,QAEA,IAAI,IAAI,WAAW,GAAG;AAAA,UACpB;AAAA,QACF;AAAA,QAGA,MAAM,QAAQ,IACZ,IAAI,IAAI,OAAO,aAAa;AAAA,UAC1B,MAAM,KAAK,sBAAsB,IAAI,QAAQ;AAAA,UAC7C,MAAM,GAAG,OAAO,cAAc,EAAE,MAAM,wBAAG,eAAe,UAAU,QAAQ,CAAC;AAAA,SAC5E,CACH;AAAA,QAGA,MAAM,GACH,OAAO,WAAW,EAClB,MACC,yBACE,6BAAQ,YAAY,QAAQ,OAAO,GACnC,wBAAG,YAAY,MAAM,SAAS,GAC9B,wBAAG,YAAY,SAAS,KAAK,OAAO,CACtC,CACF;AAAA,OACH;AAAA,KACF;AAAA;AAAA,OAUG,cAAa,CACjB,gBACA,UAAS,MACT,WACiB;AAAA,IACjB,MAAM,SACJ,OAAO,mBAAmB,WACtB;AAAA,MACE,SAAS,CAAC,cAAc;AAAA,MACxB;AAAA,MACA,WAAW,aAAa;AAAA,IAC1B,IACA;AAAA,SACK;AAAA,MACH,WAAW,eAAe,aAAa;AAAA,MACvC,QAAQ,eAAe,UAAU;AAAA,IACnC;AAAA,IAEN,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,aAAY,OAAO,aAAa;AAAA,MACtC,MAAM,aAAa,CAAC,wBAAG,YAAY,MAAM,UAAS,CAAC;AAAA,MAEnD,IAAI,OAAO,WAAW,OAAO,QAAQ,SAAS,GAAG;AAAA,QAC/C,WAAW,KAAK,6BAAQ,YAAY,QAAQ,OAAO,OAAO,CAAC;AAAA,MAC7D;AAAA,MACA,IAAI,OAAO,UAAU;AAAA,QACnB,WAAW,KAAK,wBAAG,YAAY,UAAU,OAAO,QAAQ,CAAC;AAAA,MAC3D;AAAA,MACA,IAAI,OAAO,SAAS;AAAA,QAClB,WAAW,KAAK,wBAAG,YAAY,SAAS,OAAO,OAAO,CAAC;AAAA,MACzD;AAAA,MACA,IAAI,OAAO,QAAQ;AAAA,QACjB,WAAW,KAAK,wBAAG,YAAY,QAAQ,IAAI,CAAC;AAAA,MAC9C;AAAA,MAEA,MAAM,SAAS,MAAM,KAAK,GACvB,OAAO,EAAE,OAAO,mCAAsB,CAAC,EACvC,KAAK,WAAW,EAChB,MAAM,yBAAI,GAAG,UAAU,CAAC;AAAA,MAE3B,MAAM,UAAU,OAAO;AAAA,MACvB,OAAO,OAAO,SAAS,KAAK;AAAA,KAC7B;AAAA;AAAA,OAQG,cAAa,CAAC,SAAkC;AAAA,IACpD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,SAAS,MAAM,KAAK,GACvB,OAAO;AAAA,QACN,IAAI,UAAU;AAAA,QACd,MAAM,UAAU;AAAA,QAChB,WAAW,UAAU;AAAA,QACrB,SAAS,UAAU;AAAA,QACnB,iBAAiB,UAAU;AAAA,QAC3B,SAAS,UAAU;AAAA,QACnB,MAAM,UAAU;AAAA,QAChB,QAAQ,UAAU;AAAA,QAClB,UAAU,UAAU;AAAA,MACtB,CAAC,EACA,KAAK,SAAS,EACd,MAAM,yBAAI,6BAAQ,UAAU,IAAI,OAAO,GAAG,wBAAG,UAAU,SAAS,KAAK,OAAO,CAAC,CAAC;AAAA,MAGjF,MAAM,QAAQ,OAAO,IAAI,CAAC,UAAU;AAAA,WAC/B;AAAA,QACH,IAAI,KAAK;AAAA,QACT,MAAM,KAAK,QAAQ;AAAA,QACnB,SAAS,KAAK;AAAA,QACd,iBAAiB,KAAK;AAAA,QACtB,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,QACd,WAAW,KAAK;AAAA,QAChB,MAAM,KAAK;AAAA,QACX,UAAU,KAAK;AAAA,MACjB,EAAE;AAAA,MAEF,OAAO;AAAA,KACR;AAAA;AAAA,OAQG,gBAAe,CAAC,SAAgC;AAAA,IACpD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,SAAS,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,wBAAG,UAAU,SAAS,OAAO,CAAC;AAAA,MAC1F,MAAM,QAAQ,OAAO,IAAI,CAAC,UAAU;AAAA,WAC/B;AAAA,QACH,IAAI,KAAK;AAAA,QACT,MAAM,KAAK,QAAQ;AAAA,QACnB,SAAS,KAAK;AAAA,QACd,iBAAiB,KAAK;AAAA,QACtB,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,QACd,WAAW,KAAK;AAAA,QAChB,MAAM,KAAK;AAAA,QACX,UAAU,KAAK;AAAA,MACjB,EAAE;AAAA,MACF,OAAO;AAAA,KACR;AAAA;AAAA,OAQG,WAAU,CAAC,MAA2B;AAAA,IAC1C,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,KAAK,GACR,OAAO,SAAS,EAChB,IAAI,KAAK,MAAM,SAAS,KAAK,QAAQ,CAAC,EACtC,MAAM,wBAAG,UAAU,IAAI,KAAK,EAAE,CAAC;AAAA,KACnC;AAAA;AAAA,OAQG,YAAW,CAAC,OAAgC;AAAA,IAChD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,eAAe,MAAM,IAAI,CAAC,UAAU;AAAA,WACrC;AAAA,QACH,SAAS,KAAK;AAAA,QACd,IAAI,KAAK,MAAM,GAAG;AAAA,MACpB,EAAE;AAAA,MAEF,MAAM,gBAAgB,MAAM,KAAK,GAC9B,OAAO,SAAS,EAChB,OAAO,YAAY,EACnB,oBAAoB,EACpB,UAAU;AAAA,MACb,MAAM,cAAc,cAAc,IAAI,CAAC,MAAM,EAAE,EAAU;AAAA,MACzD,OAAO;AAAA,KACR;AAAA;AAAA,OAQG,WAAU,CAAC,QAA6B;AAAA,IAC5C,IAAI,CAAC;AAAA,MAAQ,MAAM,IAAI,MAAM,qBAAqB;AAAA,IAClD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,KAAK,GAAG,YAAY,OAAO,OAAO;AAAA,QACtC,MAAM,GAAG,OAAO,SAAS,EAAE,MAAM,wBAAG,UAAU,IAAI,MAAM,CAAC;AAAA,OAC1D;AAAA,KACF;AAAA;AAAA,OAQG,uBAAsB,CAAC,UAAiC;AAAA,IAC5D,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,SAAS,MAAM,KAAK,GACvB,OAAO,EAAE,QAAQ,iBAAiB,OAAO,CAAC,EAC1C,KAAK,gBAAgB,EACrB,UAAU,WAAW,wBAAG,iBAAiB,QAAQ,UAAU,EAAE,CAAC,EAC9D,MAAM,yBAAI,wBAAG,iBAAiB,UAAU,QAAQ,GAAG,wBAAG,UAAU,SAAS,KAAK,OAAO,CAAC,CAAC;AAAA,MAE1F,OAAO,OAAO,IAAI,CAAC,QAAQ,IAAI,MAAc;AAAA,KAC9C;AAAA;AAAA,OAQG,wBAAuB,CAAC,WAAoC;AAAA,IAChE,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,SAAS,MAAM,KAAK,GACvB,eAAe,EAAE,QAAQ,iBAAiB,OAAO,CAAC,EAClD,KAAK,gBAAgB,EACrB,UAAU,WAAW,wBAAG,iBAAiB,QAAQ,UAAU,EAAE,CAAC,EAC9D,MACC,yBAAI,6BAAQ,iBAAiB,UAAU,SAAS,GAAG,wBAAG,UAAU,SAAS,KAAK,OAAO,CAAC,CACxF;AAAA,MAEF,OAAO,OAAO,IAAI,CAAC,QAAQ,IAAI,MAAc;AAAA,KAC9C;AAAA;AAAA,OASG,eAAc,CAAC,UAAgB,QAAgC;AAAA,IACnE,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,IAAI;AAAA,QACF,MAAM,WAAW,MAAM,KAAK,GACzB,OAAO,EAAE,IAAI,iBAAiB,GAAG,CAAC,EAClC,KAAK,gBAAgB,EACrB,MACC,yBACE,wBAAG,iBAAiB,UAAU,QAAQ,GACtC,wBAAG,iBAAiB,QAAQ,MAAM,GAClC,wBAAG,iBAAiB,SAAS,KAAK,OAAO,CAC3C,CACF,EACC,MAAM,CAAC;AAAA,QACV,IAAI,SAAS,WAAW,GAAG;AAAA,UACzB,MAAM,KAAK,GAAG,OAAO,gBAAgB,EAAE,OAAO;AAAA,YAC5C;AAAA,YACA;AAAA,YACA,SAAS,KAAK;AAAA,UAChB,CAAC;AAAA,QACH;AAAA,QACA,OAAO;AAAA,QACP,OAAO,OAAO;AAAA,QACd,oBAAO,MACL;AAAA,UACE,KAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA,SAAS,KAAK;AAAA,UACd,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,GACA,mCACF;AAAA,QACA,OAAO;AAAA;AAAA,KAEV;AAAA;AAAA,OAGG,oBAAmB,CAAC,WAAmB,QAAgC;AAAA,IAC3E,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,IAAI;AAAA,QACF,WAAW,MAAM,WAAW;AAAA,UAC1B,MAAM,WAAW,MAAM,KAAK,GACzB,OAAO,EAAE,IAAI,iBAAiB,GAAG,CAAC,EAClC,KAAK,gBAAgB,EACrB,MACC,yBACE,wBAAG,iBAAiB,UAAU,EAAE,GAChC,wBAAG,iBAAiB,QAAQ,MAAM,GAClC,wBAAG,iBAAiB,SAAS,KAAK,OAAO,CAC3C,CACF,EACC,MAAM,CAAC;AAAA,UACV,IAAI,SAAS,WAAW,GAAG;AAAA,YACzB,MAAM,KAAK,GAAG,OAAO,gBAAgB,EAAE,OAAO;AAAA,cAC5C,UAAU;AAAA,cACV;AAAA,cACA,SAAS,KAAK;AAAA,YAChB,CAAC;AAAA,UACH;AAAA,QACF;AAAA,QACA,OAAO;AAAA,QACP,OAAO,OAAO;AAAA,QACd,oBAAO,MACL;AAAA,UACE,KAAK;AAAA,UACL;AAAA,UACA,SAAS,KAAK;AAAA,UACd,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,GACA,oCACF;AAAA,QACA,OAAO;AAAA;AAAA,KAEV;AAAA;AAAA,OASG,kBAAiB,CAAC,UAAgB,QAAgC;AAAA,IACtE,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,IAAI;AAAA,QACF,MAAM,SAAS,MAAM,KAAK,GAAG,YAAY,OAAO,OAAO;AAAA,UACrD,OAAO,MAAM,GACV,OAAO,gBAAgB,EACvB,MACC,yBAAI,wBAAG,iBAAiB,UAAU,QAAQ,GAAG,wBAAG,iBAAiB,QAAQ,MAAM,CAAC,CAClF,EACC,UAAU;AAAA,SACd;AAAA,QAED,MAAM,UAAU,OAAO,SAAS;AAAA,QAChC,OAAO;AAAA,QACP,OAAO,OAAO;AAAA,QACd,oBAAO,MACL;AAAA,UACE,KAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,GACA,wCACF;AAAA,QACA,OAAO;AAAA;AAAA,KAEV;AAAA;AAAA,OAQG,yBAAwB,CAAC,UAAwC;AAAA,IACrE,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,SAAS,MAAM,KAAK,GACvB,OAAO;AAAA,QACN,IAAI,iBAAiB;AAAA,QACrB,UAAU,iBAAiB;AAAA,QAC3B,QAAQ,iBAAiB;AAAA,MAC3B,CAAC,EACA,KAAK,gBAAgB,EACrB,MAAM,wBAAG,iBAAiB,UAAU,QAAQ,CAAC;AAAA,MAEhD,MAAM,WAAW,MAAM,KAAK,iBAAiB,CAAC,QAAQ,CAAC;AAAA,MAEvD,IAAI,CAAC,SAAS,QAAQ;AAAA,QACpB,OAAO,CAAC;AAAA,MACV;AAAA,MAEA,OAAO,OAAO,IAAI,CAAC,SAAS;AAAA,QAC1B,IAAI,IAAI;AAAA,QACR,QAAQ,SAAS;AAAA,MACnB,EAAE;AAAA,KACH;AAAA;AAAA,OAQG,uBAAsB,CAAC,QAA+B;AAAA,IAC1D,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,SAAS,MAAM,KAAK,GACvB,OAAO,EAAE,UAAU,iBAAiB,SAAS,CAAC,EAC9C,KAAK,gBAAgB,EACrB,MAAM,wBAAG,iBAAiB,QAAQ,MAAM,CAAC;AAAA,MAE5C,OAAO,OAAO,IAAI,CAAC,QAAQ,IAAI,QAAgB;AAAA,KAChD;AAAA;AAAA,OAUG,kBAAiB,CAAC,QAAc,UAAkC;AAAA,IACtE,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,SAAS,MAAM,KAAK,GACvB,OAAO,EACP,KAAK,gBAAgB,EACrB,MAAM,yBAAI,wBAAG,iBAAiB,QAAQ,MAAM,GAAG,wBAAG,iBAAiB,UAAU,QAAQ,CAAC,CAAC,EACvF,MAAM,CAAC;AAAA,MAEV,OAAO,OAAO,SAAS;AAAA,KACxB;AAAA;AAAA,OASG,wBAAuB,CAC3B,QACA,UACsC;AAAA,IACtC,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,SAAS,MAAM,KAAK,GACvB,OAAO,EAAE,WAAW,iBAAiB,UAAU,CAAC,EAChD,KAAK,gBAAgB,EACrB,MACC,yBACE,wBAAG,iBAAiB,QAAQ,MAAM,GAClC,wBAAG,iBAAiB,UAAU,QAAQ,GACtC,wBAAG,iBAAiB,SAAS,KAAK,OAAO,CAC3C,CACF,EACC,MAAM,CAAC;AAAA,MAEV,MAAM,UAAU,OAAO;AAAA,MACvB,OAAQ,SAAS,aAA6C;AAAA,KAC/D;AAAA;AAAA,OAUG,wBAAuB,CAC3B,QACA,UACA,OACe;AAAA,IACf,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,IAAI;AAAA,QACF,MAAM,KAAK,GAAG,YAAY,OAAO,OAAO;AAAA,UACtC,MAAM,GACH,OAAO,gBAAgB,EACvB,IAAI,EAAE,WAAW,MAAM,CAAC,EACxB,MACC,yBACE,wBAAG,iBAAiB,QAAQ,MAAM,GAClC,wBAAG,iBAAiB,UAAU,QAAQ,GACtC,wBAAG,iBAAiB,SAAS,KAAK,OAAO,CAC3C,CACF;AAAA,SACH;AAAA,QACD,OAAO,OAAO;AAAA,QACd,oBAAO,MACL;AAAA,UACE,KAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC9D,GACA,wCACF;AAAA,QACA,MAAM;AAAA;AAAA,KAET;AAAA;AAAA,OAYG,mBAAkB,CAAC,QAKJ;AAAA,IACnB,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,KAAK,GAAG;AAAA,MACd,MAAM,aAAa;AAAA,QACjB;AAAA,QACA,gBAAgB,OAAO;AAAA,QACvB,gBAAgB,OAAO;AAAA,QACvB,SAAS,KAAK;AAAA,QACd,MAAM,OAAO,QAAQ,CAAC;AAAA,QACtB,UAAU,OAAO,YAAY,CAAC;AAAA,MAChC;AAAA,MACA,IAAI;AAAA,QACF,MAAM,WAAW,MAAM,KAAK,GACzB,OAAO,iBAAiB,EACxB,OAAO,UAAU,EACjB,oBAAoB,EACpB,UAAU;AAAA,QACb,OAAO,SAAS,SAAS;AAAA,QACzB,OAAO,OAAO;AAAA,QACd,oBAAO,MACL;AAAA,UACE,KAAK;AAAA,UACL,SAAS,KAAK;AAAA,UACd,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC5D;AAAA,QACF,GACA,6BACF;AAAA,QACA,OAAO;AAAA;AAAA,KAEV;AAAA;AAAA,OAQG,mBAAkB,CAAC,cAA2C;AAAA,IAClE,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,IAAI;AAAA,QACF,MAAM,KAAK,GACR,OAAO,iBAAiB,EACxB,IAAI;AAAA,UACH,MAAM,aAAa,QAAQ,CAAC;AAAA,UAC5B,UAAU,aAAa,YAAY,CAAC;AAAA,QACtC,CAAC,EACA,MAAM,wBAAG,kBAAkB,IAAI,aAAa,EAAE,CAAC;AAAA,QAClD,OAAO,OAAO;AAAA,QACd,oBAAO,MACL;AAAA,UACE,KAAK;AAAA,UACL,SAAS,KAAK;AAAA,UACd,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC5D,gBAAgB,aAAa;AAAA,QAC/B,GACA,6BACF;AAAA,QACA,MAAM;AAAA;AAAA,KAET;AAAA;AAAA,OAUG,gBAAe,CAAC,QAGW;AAAA,IAC/B,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,QAAQ,gBAAgB,mBAAmB;AAAA,MAC3C,MAAM,SAAS,MAAM,KAAK,GACvB,OAAO,EACP,KAAK,iBAAiB,EACtB,MACC,yBACE,wBAAG,kBAAkB,gBAAgB,cAAc,GACnD,wBAAG,kBAAkB,gBAAgB,cAAc,CACrD,CACF;AAAA,MACF,IAAI,OAAO,WAAW;AAAA,QAAG,OAAO;AAAA,MAChC,MAAM,eAAe,OAAO;AAAA,MAC5B,OAAO;AAAA,WACF;AAAA,QACH,IAAI,aAAa;AAAA,QACjB,gBAAgB,aAAa;AAAA,QAC7B,gBAAgB,aAAa;AAAA,QAC7B,SAAS,aAAa;AAAA,QACtB,MAAO,aAAa,QAAQ,CAAC;AAAA,QAC7B,UAAW,aAAa,YAAY,CAAC;AAAA,QACrC,WAAW,aAAa,UAAU,YAAY;AAAA,MAChD;AAAA,KACD;AAAA;AAAA,OAWG,iBAAgB,CAAC,QAMK;AAAA,IAC1B,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,QAAQ,WAAW,cAAc,UAAU,MAAM,OAAO,WAAW;AAAA,MACnE,MAAM,aACJ,gBAAgB,aAAa,SAAS,IAAI,eAAe,WAAW,CAAC,QAAQ,IAAI,CAAC,GAClF,OAAO,CAAC,OAAmB,OAAO,OAAO,YAAY,GAAG,KAAK,EAAE,SAAS,CAAC;AAAA,MAE3E,IAAI,UAAU,WAAW,GAAG;AAAA,QAC1B,OAAO,CAAC;AAAA,MACV;AAAA,MAEA,MAAM,eAAe,yBAAI,KACvB,UAAU,IACR,CAAC,OACC,4BAAO,kBAAkB,oBAAoB,SAAS,kBAAkB,oBAAoB,KAChG,GACA,8BACF;AAAA,MACA,IAAI,QAAQ;AAAA,wBACM;AAAA,iBACP;AAAA;AAAA,MAGX,IAAI,QAAQ,KAAK,SAAS,GAAG;AAAA,QAC3B,QAAQ;AAAA,YACJ;AAAA,gBACI,kBAAkB,sBAAsB,yBAAI,KAAK,MAAM,4BAAO;AAAA;AAAA,MAExE;AAAA,MAEA,IAAI,OAAO,UAAU,UAAU;AAAA,QAC7B,QAAQ,2BAAM,eAAe;AAAA,MAC/B;AAAA,MAEA,IAAI,OAAO,WAAW,YAAY,SAAS,GAAG;AAAA,QAC5C,QAAQ,2BAAM,gBAAgB;AAAA,MAChC;AAAA,MAEA,MAAM,SAAS,MAAM,KAAK,GAAG,QAAQ,KAAK;AAAA,MAE1C,OAAO,OAAO,KAAK,IAAI,CAAC,kBAA2C;AAAA,WAC9D;AAAA,QACH,IAAI,aAAa;AAAA,QACjB,gBAAiB,aAAa,oBAAoB,aAAa;AAAA,QAC/D,gBAAiB,aAAa,oBAAoB,aAAa;AAAA,QAC/D,SAAU,aAAa,YAAY,aAAa;AAAA,QAChD,MAAO,aAAa,QAAQ,CAAC;AAAA,QAC7B,UAAW,aAAa,YAAY,CAAC;AAAA,QACrC,WACE,aAAa,cAAc,aAAa,aACnC,aAAa,cAAc,aAAa,sBAAsB,QAC3D,aAAa,cAAc,aAAa,WAAoB,YAAY,IAC1E,IAAI,KACD,aAAa,cAA0B,aAAa,SACvD,EAAE,YAAY,IAChB,IAAI,KAAK,EAAE,YAAY;AAAA,MAC/B,EAAE;AAAA,KACH;AAAA;AAAA,OAQG,SAAW,CAAC,KAAqC;AAAA,IACrD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,IAAI;AAAA,QACF,MAAM,SAAS,MAAM,KAAK,GACvB,OAAO,EAAE,OAAO,WAAW,MAAM,CAAC,EAClC,KAAK,UAAU,EACf,MAAM,yBAAI,wBAAG,WAAW,SAAS,KAAK,OAAO,GAAG,wBAAG,WAAW,KAAK,GAAG,CAAC,CAAC,EACxE,MAAM,CAAC;AAAA,QAEV,IAAI,UAAU,OAAO,SAAS,KAAK,OAAO,IAAI;AAAA,UAC5C,OAAO,OAAO,GAAG;AAAA,QACnB;AAAA,QAEA;AAAA,QACA,OAAO,OAAO;AAAA,QACd,oBAAO,MACL;AAAA,UACE,KAAK;AAAA,UACL,SAAS,KAAK;AAAA,UACd,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC5D;AAAA,QACF,GACA,sBACF;AAAA,QACA;AAAA;AAAA,KAEH;AAAA;AAAA,OASG,SAAW,CAAC,KAAa,OAA4B;AAAA,IACzD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,IAAI;AAAA,QACF,MAAM,KAAK,GACR,OAAO,UAAU,EACjB,OAAO;AAAA,UACN;AAAA,UACA,SAAS,KAAK;AAAA,UACd;AAAA,QACF,CAAC,EACA,mBAAmB;AAAA,UAClB,QAAQ,CAAC,WAAW,KAAK,WAAW,OAAO;AAAA,UAC3C,KAAK;AAAA,YACH;AAAA,UACF;AAAA,QACF,CAAC;AAAA,QAEH,OAAO;AAAA,QACP,OAAO,OAAO;AAAA,QACd,oBAAO,MACL;AAAA,UACE,KAAK;AAAA,UACL,SAAS,KAAK;AAAA,UACd,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC5D;AAAA,QACF,GACA,qBACF;AAAA,QACA,OAAO;AAAA;AAAA,KAEV;AAAA;AAAA,OAQG,YAAW,CAAC,KAA+B;AAAA,IAC/C,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,IAAI;AAAA,QACF,MAAM,KAAK,GAAG,YAAY,OAAO,OAAO;AAAA,UACtC,MAAM,GACH,OAAO,UAAU,EACjB,MAAM,yBAAI,wBAAG,WAAW,SAAS,KAAK,OAAO,GAAG,wBAAG,WAAW,KAAK,GAAG,CAAC,CAAC;AAAA,SAC5E;AAAA,QACD,OAAO;AAAA,QACP,OAAO,OAAO;AAAA,QACd,oBAAO,MACL;AAAA,UACE,KAAK;AAAA,UACL,SAAS,KAAK;AAAA,UACd,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC5D;AAAA,QACF,GACA,sBACF;AAAA,QACA,OAAO;AAAA;AAAA,KAEV;AAAA;AAAA,OAQG,YAAW,CAAC,OAA6B;AAAA,IAC7C,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,kBAAkB,KAAK,mBAAmB,KAAK;AAAA,MACrD,MAAM,aAAa,gBAAgB;AAAA,MAEnC,MAAM,KAAK,GAAG,OAAO,UAAU,EAAE,OAAO,eAAe;AAAA,MACvD,OAAO;AAAA,KACR;AAAA;AAAA,OAQG,SAAQ,CAAC,IAAiC;AAAA,IAC9C,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,SAAS,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,wBAAG,WAAW,IAAI,EAAE,CAAC;AAAA,MAClF,OAAO,OAAO,SAAS,IAAI,KAAK,eAAe,OAAO,EAAE,IAAI;AAAA,KAC7D;AAAA;AAAA,OAOG,aAAY,GAAqB;AAAA,IACrC,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,SAAS,MAAM,KAAK,GACvB,OAAO,EACP,KAAK,UAAU,EACf,MAAM,wBAAG,WAAW,SAAS,KAAK,OAAO,CAAC;AAAA,MAC7C,OAAO,OAAO,IAAI,CAAC,UAAU,KAAK,eAAe,KAAK,CAAC;AAAA,KACxD;AAAA;AAAA,OAQG,YAAW,CAAC,OAA6B;AAAA,IAC7C,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,kBAAkB,KAAK,mBAAmB,KAAK;AAAA,MACrD,OAAO,gBAAgB;AAAA,MACvB,MAAM,KAAK,GACR,OAAO,UAAU,EACjB,IAAI,eAAe,EACnB,MAAM,yBAAI,wBAAG,WAAW,IAAI,MAAM,EAAE,GAAG,wBAAG,WAAW,SAAS,KAAK,OAAO,CAAC,CAAC;AAAA,KAChF;AAAA;AAAA,OAQG,YAAW,CAAC,IAAyB;AAAA,IACzC,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,KAAK,GAAG,OAAO,UAAU,EAAE,MAAM,wBAAG,WAAW,IAAI,EAAE,CAAC;AAAA,KAC7D;AAAA;AAAA,OAQG,WAAU,CAAC,MAA2B;AAAA,IAE1C,IAAI,CAAC,KAAK,SAAS;AAAA,MACjB,OAAO,KAAK,MAAM,SAAS,KAAK,QAAgB;AAAA,IAClD;AAAA,IACA,OAAO,KAAK,UAAU,YAAY;AAAA,MAChC,OAAO,KAAK,aAAa,YAAY;AAAA,QACnC,MAAM,MAAM,IAAI;AAAA,QAChB,MAAM,WAAW,KAAK,YAAY,CAAC;AAAA,QAEnC,MAAM,SAAS;AAAA,aAIT,KAAK,KAAK,EAAE,IAAI,KAAK,GAAW,IAAI,CAAC;AAAA,UACzC,MAAM,KAAK;AAAA,UACX,aAAa,KAAK;AAAA,UAClB,QAAQ,KAAK;AAAA,UACb,SAAS,KAAK;AAAA,UACd,MAAM,KAAK;AAAA,UACX;AAAA,UACA,WAAW;AAAA,UACX,WAAW;AAAA,UACX,SAAS,KAAK;AAAA,QAChB;AAAA,QAEA,MAAM,SAAS,MAAM,KAAK,GAAG,OAAO,SAAS,EAAE,OAAO,MAAM,EAAE,UAAU;AAAA,QAExE,OAAO,OAAO,GAAG;AAAA,OAClB;AAAA,KACF;AAAA;AAAA,OAQG,SAAQ,CAAC,QAIK;AAAA,IAClB,OAAO,KAAK,UAAU,YAAY;AAAA,MAChC,OAAO,KAAK,aAAa,YAAY;AAAA,QACnC,MAAM,SAAS,MAAM,KAAK,GACvB,OAAO,EACP,KAAK,SAAS,EACd,MACC,yBACE,wBAAG,UAAU,SAAS,KAAK,OAAO,GAClC,GAAI,OAAO,SAAS,CAAC,wBAAG,UAAU,QAAQ,OAAO,MAAM,CAAC,IAAI,CAAC,GAC7D,GAAI,OAAO,QAAQ,OAAO,KAAK,SAAS,IACpC;AAAA,UACE,2BAAM,UAAU,iBAAiB,yBAAI,KACnC,OAAO,KAAK,IAAI,CAAC,MAAM,2BAAM,GAAG,GAChC,4BACF;AAAA,QACF,IACA,CAAC,CACP,CACF;AAAA,QAEF,OAAO,OAAO,IAAI,CAAC,SAAS;AAAA,UAC1B,IAAI,IAAI;AAAA,UACR,SAAS,IAAI;AAAA,UACb,MAAM,IAAI;AAAA,UACV,aAAa,IAAI,eAAe;AAAA,UAChC,QAAQ,IAAI;AAAA,UACZ,SAAS,IAAI;AAAA,UACb,MAAM,IAAI,QAAQ,CAAC;AAAA,UACnB,UAAU,IAAI;AAAA,QAChB,EAAE;AAAA,OACH;AAAA,KACF;AAAA;AAAA,OAQG,eAAc,CAAC,MAA+B;AAAA,IAClD,OAAO,KAAK,UAAU,YAAY;AAAA,MAChC,OAAO,KAAK,aAAa,YAAY;AAAA,QACnC,MAAM,SAAS,MAAM,KAAK,GACvB,OAAO,EACP,KAAK,SAAS,EACd,MAAM,yBAAI,wBAAG,UAAU,MAAM,IAAI,GAAG,wBAAG,UAAU,SAAS,KAAK,OAAO,CAAC,CAAC;AAAA,QAE3E,OAAO,OAAO,IAAI,CAAC,SAAS;AAAA,UAC1B,IAAI,IAAI;AAAA,UACR,SAAS,IAAI;AAAA,UACb,MAAM,IAAI;AAAA,UACV,aAAa,IAAI,eAAe;AAAA,UAChC,QAAQ,IAAI;AAAA,UACZ,SAAS,IAAI;AAAA,UACb,MAAM,IAAI,QAAQ,CAAC;AAAA,UACnB,UAAW,IAAI,YAAY,CAAC;AAAA,QAC9B,EAAE;AAAA,OACH;AAAA,KACF;AAAA;AAAA,OAQG,QAAO,CAAC,IAAgC;AAAA,IAC5C,OAAO,KAAK,UAAU,YAAY;AAAA,MAChC,OAAO,KAAK,aAAa,YAAY;AAAA,QACnC,MAAM,SAAS,MAAM,KAAK,GACvB,OAAO,EACP,KAAK,SAAS,EACd,MAAM,yBAAI,wBAAG,UAAU,IAAI,EAAE,GAAG,wBAAG,UAAU,SAAS,KAAK,OAAO,CAAC,CAAC,EACpE,MAAM,CAAC;AAAA,QAEV,IAAI,OAAO,WAAW,GAAG;AAAA,UACvB,OAAO;AAAA,QACT;AAAA,QAEA,MAAM,MAAM,OAAO;AAAA,QACnB,OAAO;AAAA,UACL,IAAI,IAAI;AAAA,UACR,SAAS,IAAI;AAAA,UACb,MAAM,IAAI;AAAA,UACV,aAAa,IAAI,eAAe;AAAA,UAChC,QAAQ,IAAI;AAAA,UACZ,SAAS,IAAI;AAAA,UACb,MAAM,IAAI,QAAQ,CAAC;AAAA,UACnB,UAAW,IAAI,YAAY,CAAC;AAAA,QAC9B;AAAA,OACD;AAAA,KACF;AAAA;AAAA,OASG,WAAU,CAAC,IAAU,MAAoC;AAAA,IAC7D,MAAM,KAAK,UAAU,YAAY;AAAA,MAC/B,MAAM,KAAK,aAAa,YAAY;AAAA,QAClC,MAAM,eAAuD,CAAC;AAAA,QAG9D,IAAI,KAAK,SAAS;AAAA,UAAW,aAAa,OAAO,KAAK;AAAA,QACtD,IAAI,KAAK,gBAAgB;AAAA,UAAW,aAAa,cAAc,KAAK;AAAA,QACpE,IAAI,KAAK,WAAW;AAAA,UAAW,aAAa,SAAS,KAAK;AAAA,QAC1D,IAAI,KAAK,YAAY;AAAA,UAAW,aAAa,UAAU,KAAK;AAAA,QAC5D,IAAI,KAAK,SAAS;AAAA,UAAW,aAAa,OAAO,KAAK;AAAA,QACtD,IAAI,KAAK,aAAa;AAAA,UACpB,aAAa,WAAW,KAAK;AAAA,QAE/B,MAAM,oBAAoB;AAAA,QAG1B,IAAI,kBAAkB,cAAc,aAAa,kBAAkB,cAAc,MAAM;AAAA,UACrF,MAAM,iBAAiB,kBAAkB;AAAA,UACzC,aAAa,YAAY,IAAI,KAC3B,OAAO,mBAAmB,WAAW,OAAO,cAAc,IAAI,cAChE;AAAA,QACF;AAAA,QAGA,MAAM,iBAAyD;AAAA,aAC1D;AAAA,UACH,WAAW,IAAI;AAAA,QACjB;AAAA,QAGA,IAAI,KAAK,aAAa,WAAW;AAAA,UAC/B,eAAe,WAAW,KAAK;AAAA,QACjC;AAAA,QAEA,MAAM,KAAK,GACR,OAAO,SAAS,EAEhB,IAAI,cAAc,EAClB,MAAM,yBAAI,wBAAG,UAAU,IAAI,EAAE,GAAG,wBAAG,UAAU,SAAS,KAAK,OAAO,CAAC,CAAC;AAAA,OACxE;AAAA,KACF;AAAA;AAAA,OAQG,WAAU,CAAC,IAAyB;AAAA,IACxC,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,KAAK,GAAG,OAAO,SAAS,EAAE,MAAM,wBAAG,UAAU,IAAI,EAAE,CAAC;AAAA,KAC3D;AAAA;AAAA,OAGG,qBAAoB,CAAC,QAIL;AAAA,IACpB,OAAO,KAAK,aAAa,YAAY;AAAA,MAEnC,MAAM,QAAQ,MAAM,KAAK,GACtB,OAAO,EAAE,IAAI,UAAU,GAAG,CAAC,EAC3B,KAAK,SAAS,EACd,MAAM,yBAAI,wBAAG,UAAU,SAAS,OAAO,OAAO,GAAG,wBAAG,UAAU,SAAS,KAAK,OAAO,CAAC,CAAC;AAAA,MAExF,IAAI,MAAM,WAAW,GAAG;AAAA,QACtB,OAAO,CAAC;AAAA,MACV;AAAA,MAEA,MAAM,UAAU,MAAM,IAAI,CAAC,SAAS,KAAK,EAAU;AAAA,MAEnD,MAAM,WAAW,MAAM,KAAK,qBAAqB;AAAA,QAC/C;AAAA,QACA,WAAW,OAAO,aAAa;AAAA,QAC/B,OAAO,OAAO;AAAA,MAChB,CAAC;AAAA,MAED,OAAO;AAAA,KACR;AAAA;AAAA,OAGG,sBAAqB,CAAC,QAIN;AAAA,IACpB,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,QAAQ,MAAM,KAAK,GACtB,OAAO,EAAE,IAAI,UAAU,GAAG,CAAC,EAC3B,KAAK,SAAS,EACd,MACC,yBAAI,wBAAG,UAAU,iBAAiB,OAAO,QAAQ,GAAG,wBAAG,UAAU,SAAS,KAAK,OAAO,CAAC,CACzF;AAAA,MAEF,IAAI,MAAM,WAAW,GAAG;AAAA,QACtB,OAAO,CAAC;AAAA,MACV;AAAA,MAEA,OAAO,KAAK,qBAAqB;AAAA,QAC/B,SAAS,MAAM,IAAI,CAAC,SAAS,KAAK,EAAU;AAAA,QAC5C,WAAW,OAAO,aAAa;AAAA,QAC/B,OAAO,OAAO;AAAA,MAChB,CAAC;AAAA,KACF;AAAA;AAAA,OAGG,qBAAoB,CAAC,SAA8B;AAAA,IACvD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,QAAQ,MAAM,KAAK,GACtB,OAAO,EAAE,IAAI,UAAU,GAAG,CAAC,EAC3B,KAAK,SAAS,EACd,MAAM,yBAAI,wBAAG,UAAU,SAAS,OAAO,GAAG,wBAAG,UAAU,SAAS,KAAK,OAAO,CAAC,CAAC;AAAA,MAEjF,IAAI,MAAM,WAAW,GAAG;AAAA,QACtB;AAAA,MACF;AAAA,MAEA,MAAM,UAAU,MAAM,IAAI,CAAC,SAAS,KAAK,EAAU;AAAA,MAEnD,IAAI,QAAQ,SAAS,GAAG;AAAA,QACtB,MAAM,KAAK,GAAG,OAAO,QAAQ,EAAE,MAAM,6BAAQ,SAAS,QAAQ,OAAO,CAAC;AAAA,QACtE,MAAM,KAAK,GAAG,OAAO,gBAAgB,EAAE,MAAM,6BAAQ,iBAAiB,QAAQ,OAAO,CAAC;AAAA,QAEtF,MAAM,kBAAkB,MAAM,KAAK,GAChC,OAAO,EAAE,IAAI,YAAY,GAAG,CAAC,EAC7B,KAAK,WAAW,EAChB,MAAM,6BAAQ,YAAY,QAAQ,OAAO,CAAC;AAAA,QAC7C,MAAM,mBAAmB,gBAAgB,IAAI,CAAC,MAAM,EAAE,EAAU;AAAA,QAEhE,IAAI,iBAAiB,SAAS,GAAG;AAAA,UAC/B,MAAM,KAAK,GACR,OAAO,cAAc,EACrB,MAAM,6BAAQ,eAAe,UAAU,gBAAgB,CAAC;AAAA,UAC3D,MAAM,KAAK,GAAG,OAAO,WAAW,EAAE,MAAM,6BAAQ,YAAY,IAAI,gBAAgB,CAAC;AAAA,QACnF;AAAA,QAEA,MAAM,KAAK,GAAG,OAAO,SAAS,EAAE,MAAM,6BAAQ,UAAU,IAAI,OAAO,CAAC;AAAA,QAEpE,oBAAO,MACL;AAAA,UACE,KAAK;AAAA,UACL;AAAA,UACA,cAAc,QAAQ;AAAA,UACtB,iBAAiB,iBAAiB;AAAA,QACpC,GACA,yBACF;AAAA,MACF;AAAA,KACD;AAAA;AAAA,OAQG,oBAAmB,CAAC,MAcvB;AAAA,IACD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,QAAQ,KAAK,MAAO,GAAG;AAAA,MAC7B,MAAM,MAAM,IAAI;AAAA,MAChB,MAAM,iBAAiB;AAAA,QACrB,IAAI;AAAA,QACJ,MAAM,KAAK;AAAA,QACX,YAAY,KAAK;AAAA,QACjB,UAAU,KAAK;AAAA,QACf,UAAU,KAAK;AAAA,QACf,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AAAA,MAEA,MAAM,KAAK,GAAG,OAAO,kBAAkB,EAAE,OAAO,cAAc,EAAE,oBAAoB;AAAA,MAGpF,IAAI,KAAK,IAAI;AAAA,QACX,MAAM,WAAW,MAAM,KAAK,GACzB,OAAO,EACP,KAAK,kBAAkB,EACvB,MAAM,wBAAG,mBAAmB,IAAI,KAAK,EAAE,CAAC,EACxC,MAAM,CAAC;AAAA,QACV,IAAI,SAAS,SAAS,GAAG;AAAA,UACvB,OAAO;AAAA,YACL,IAAI,SAAS,GAAG;AAAA,YAChB,MAAM,SAAS,GAAG;AAAA,YAClB,YAAY,SAAS,GAAG;AAAA,YACxB,UAAU,SAAS,GAAG,YAAY;AAAA,YAClC,UAAW,SAAS,GAAG,YAAY;AAAA,YACnC,WAAW,SAAS,GAAG;AAAA,YACvB,WAAW,SAAS,GAAG;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA,MAEA,OAAO;AAAA,KACR;AAAA;AAAA,OAMG,kBAAiB,GAUrB;AAAA,IACA,MAAM,SAAS,MAAM,KAAK,aAAa,YAAY;AAAA,MACjD,MAAM,UAAU,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,kBAAkB;AAAA,MAC9D,OAAO,QAAQ,IAAI,CAAC,OAAO;AAAA,QACzB,IAAI,EAAE;AAAA,QACN,MAAM,EAAE;AAAA,QACR,YAAY,EAAE;AAAA,QACd,UAAU,EAAE,YAAY;AAAA,QACxB,UAAW,EAAE,YAAY;AAAA,QACzB,WAAW,EAAE;AAAA,QACb,WAAW,EAAE;AAAA,MACf,EAAE;AAAA,KACH;AAAA,IAED,OAAO,UAAU,CAAC;AAAA;AAAA,OAMd,qBAAoB,CAAC,UAQjB;AAAA,IACR,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,UAAU,MAAM,KAAK,GACxB,OAAO,EACP,KAAK,kBAAkB,EACvB,MAAM,wBAAG,mBAAmB,IAAI,QAAQ,CAAC,EACzC,MAAM,CAAC;AAAA,MACV,OAAO,QAAQ,SAAS,IACpB;AAAA,QACE,IAAI,QAAQ,GAAG;AAAA,QACf,MAAM,QAAQ,GAAG;AAAA,QACjB,YAAY,QAAQ,GAAG;AAAA,QACvB,UAAU,QAAQ,GAAG,YAAY;AAAA,QACjC,UAAW,QAAQ,GAAG,YAAY;AAAA,QAClC,WAAW,QAAQ,GAAG;AAAA,QACtB,WAAW,QAAQ,GAAG;AAAA,MACxB,IACA;AAAA,KACL;AAAA;AAAA,OAOG,8BAA6B,CAAC,aAQ1B;AAAA,IACR,OAAO,KAAK,aAAa,YAAY;AAAA,MAEnC,MAAM,UAAU,MAAM,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA,4BAGhB;AAAA;AAAA,OAErB;AAAA,MAED,MAAM,OAAO,QAAQ,QAAQ;AAAA,MAC7B,OAAQ,KAAmC,SAAS,IAChD;AAAA,QACE,IAAK,KAAmC,GAAG;AAAA,QAC3C,MAAO,KAAmC,GAAG;AAAA,QAC7C,YAAa,KAAmC,GAAG;AAAA,QACnD,UAAY,KAAmC,GAAG,aAAa;AAAA,QAG/D,UAAY,KAAmC,GAAG,YAAY;AAAA,QAG9D,WAAW,IAAI,KAAM,KAAmC,GAAG,UAAoB;AAAA,QAC/E,WAAW,IAAI,KAAM,KAAmC,GAAG,UAAoB;AAAA,MACjF,IACA;AAAA,KACL;AAAA;AAAA,OAMG,cAAa,CACjB,MAUA,gBAYC;AAAA,IACD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,QAAQ,KAAK,MAAO,GAAG;AAAA,MAC7B,MAAM,MAAM,IAAI;AAAA,MAChB,MAAM,kBAAkB;AAAA,QACtB,IAAI;AAAA,QACJ,iBAAiB,KAAK;AAAA,QACtB,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,QACX,YAAY,KAAK;AAAA,QACjB,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,UAAU,KAAK;AAAA,QACf,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AAAA,MAEA,MAAM,KAAK,GAAG,YAAY,OAAO,OAAO;AAAA,QACtC,MAAM,GAAG,OAAO,YAAY,EAAE,OAAO,eAAe;AAAA,QAEpD,IAAI,kBAAkB,eAAe,SAAS,GAAG;AAAA,UAC/C,MAAM,oBAAoB,eAAe,IAAI,CAAC,cAAc;AAAA,YAC1D,WAAW;AAAA,YACX;AAAA,UACF,EAAE;AAAA,UACF,MAAM,GAAG,OAAO,wBAAwB,EAAE,OAAO,iBAAiB,EAAE,oBAAoB;AAAA,QAC1F;AAAA,OACD;AAAA,MAED,OAAO;AAAA,KACR;AAAA;AAAA,OAMG,4BAA2B,CAAC,iBAahC;AAAA,IACA,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,UAAU,MAAM,KAAK,GACxB,OAAO,EACP,KAAK,YAAY,EACjB,MAAM,wBAAG,aAAa,iBAAiB,eAAe,CAAC;AAAA,MAC1D,OAAO,QAAQ,IAAI,CAAC,OAAO;AAAA,QACzB,IAAI,EAAE;AAAA,QACN,iBAAiB,EAAE;AAAA,QACnB,MAAM,EAAE;AAAA,QACR,MAAM,EAAE;AAAA,QACR,YAAY,EAAE,cAAc;AAAA,QAC5B,UAAU,EAAE,YAAY;AAAA,QACxB,OAAO,EAAE,SAAS;AAAA,QAClB,UAAW,EAAE,YAAY;AAAA,QACzB,WAAW,EAAE;AAAA,QACb,WAAW,EAAE;AAAA,MACf,EAAE;AAAA,KACH;AAAA;AAAA,OAMG,kBAAiB,CAAC,WAWd;AAAA,IACR,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,UAAU,MAAM,KAAK,GACxB,OAAO,EACP,KAAK,YAAY,EACjB,MAAM,wBAAG,aAAa,IAAI,SAAS,CAAC,EACpC,MAAM,CAAC;AAAA,MACV,OAAO,QAAQ,SAAS,IACpB;AAAA,QACE,IAAI,QAAQ,GAAG;AAAA,QACf,iBAAiB,QAAQ,GAAG;AAAA,QAC5B,MAAM,QAAQ,GAAG;AAAA,QACjB,MAAM,QAAQ,GAAG;AAAA,QACjB,YAAY,QAAQ,GAAG,cAAc;AAAA,QACrC,UAAU,QAAQ,GAAG,YAAY;AAAA,QACjC,OAAO,QAAQ,GAAG,SAAS;AAAA,QAC3B,UAAW,QAAQ,GAAG,YAAY;AAAA,QAClC,WAAW,QAAQ,GAAG;AAAA,QACtB,WAAW,QAAQ,GAAG;AAAA,MACxB,IACA;AAAA,KACL;AAAA;AAAA,OAMG,cAAa,CAAC,MAsBjB;AAAA,IACD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,QAAQ,KAAK,aAAc,GAAG;AAAA,MACpC,MAAM,MAAM,IAAI;AAAA,MAChB,MAAM,kBAAkB;AAAA,QACtB,IAAI;AAAA,QACJ,WAAW,KAAK;AAAA,QAChB,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,QACd,YAAY,KAAK;AAAA,QACjB,YAAY,KAAK;AAAA,QACjB,UAAU,KAAK;AAAA,QACf,UAAU,KAAK;AAAA,QACf,wBAAwB,KAAK;AAAA,QAC7B,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AAAA,MAEA,MAAM,KAAK,GAAG,OAAO,YAAY,EAAE,OAAO,eAAe;AAAA,MACzD,OAAO;AAAA,KACR;AAAA;AAAA,OAGG,eAAc,CAAC,IAYX;AAAA,IACR,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,OAAO,MAAM,KAAK,GACrB,OAAO,EACP,KAAK,YAAY,EACjB,MAAM,wBAAG,aAAa,IAAI,EAAE,CAAC,EAC7B,MAAM,CAAC;AAAA,MACV,IAAI,CAAC,QAAQ,KAAK,WAAW;AAAA,QAAG,OAAO;AAAA,MACvC,MAAM,MAAM,KAAK;AAAA,MACjB,OAAO;AAAA,QACL,IAAI,IAAI;AAAA,QACR,WAAW,IAAI;AAAA,QACf,UAAU,IAAI;AAAA,QACd,SAAS,IAAI;AAAA,QACb,YAAY,aAAa,IAAI,UAAU;AAAA,QACvC,YAAY,IAAI,cAAc;AAAA,QAC9B,UAAU,IAAI,YAAY;AAAA,QAC1B,UAAW,IAAI,YAAY;AAAA,QAC3B,wBAAyB,IAAI,0BAA0B;AAAA,QACvD,WAAW,IAAI;AAAA,QACf,WAAW,IAAI;AAAA,MACjB;AAAA,KACD;AAAA;AAAA,OAGG,cAAa,CACjB,IACA,OAoBQ;AAAA,IACR,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,WAAW,MAAM,KAAK,eAAe,EAAE;AAAA,MAC7C,IAAI,CAAC;AAAA,QAAU,OAAO;AAAA,MAEtB,MAAM,YAAY,IAAI;AAAA,MACtB,MAAM,OAAO;AAAA,QACX,SAAS,MAAM,WAAW,SAAS;AAAA,QACnC,YAAY,MAAM,cAAc,SAAS;AAAA,QACzC,YAAY,MAAM,cAAc,SAAS;AAAA,QACzC,UAAU,MAAM,YAAY,SAAS;AAAA,QACrC,UAAU,MAAM,YAAY,SAAS;AAAA,QACrC,wBAAwB,MAAM,0BAA0B,SAAS;AAAA,QACjE;AAAA,MACF;AAAA,MAEA,MAAM,KAAK,GAAG,OAAO,YAAY,EAAE,IAAI,IAAI,EAAE,MAAM,wBAAG,aAAa,IAAI,EAAE,CAAC;AAAA,MAG1E,OAAO;AAAA,WACF;AAAA,WACA;AAAA,MACL;AAAA,KACD;AAAA;AAAA,OAMG,sBAAqB,CACzB,WACA,QAAgB,IAChB,iBAeA;AAAA,IACA,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,aAAa,CAAC,wBAAG,aAAa,WAAW,SAAS,CAAC;AAAA,MACzD,IAAI,iBAAiB;AAAA,QACnB,WAAW,KAAK,wBAAG,aAAa,WAAW,eAAe,CAAC;AAAA,MAC7D;AAAA,MAEA,MAAM,QAAQ,KAAK,GAChB,OAAO,EACP,KAAK,YAAY,EACjB,MAAM,yBAAI,GAAG,UAAU,CAAC,EACxB,QAAQ,0BAAK,aAAa,SAAS,CAAC,EACpC,MAAM,KAAK;AAAA,MAEd,MAAM,UAAU,MAAM;AAAA,MACtB,OAAO,QAAQ,IAAI,CAAC,OAAO;AAAA,QACzB,IAAI,EAAE;AAAA,QACN,WAAW,EAAE;AAAA,QACb,UAAU,EAAE;AAAA,QACZ,SAAS,EAAE;AAAA,QACX,YAAY,aAAa,EAAE,UAAU;AAAA,QACrC,YAAY,EAAE,cAAc;AAAA,QAC5B,UAAU,EAAE,YAAY;AAAA,QACxB,UAAU,WAAW,EAAE,QAAQ;AAAA,QAC/B,wBAAwB,EAAE;AAAA,QAC1B,WAAW,EAAE;AAAA,QACb,WAAW,EAAE;AAAA,MACf,EAAE;AAAA,KACH;AAAA;AAAA,OAMG,cAAa,CAAC,WAAgC;AAAA,IAClD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,KAAK,GAAG,OAAO,YAAY,EAAE,MAAM,wBAAG,aAAa,IAAI,SAAS,CAAC;AAAA,KACxE;AAAA;AAAA,OAMG,cAAa,CACjB,WACA,SAgBC;AAAA,IACD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,MAAM,IAAI;AAAA,MAEhB,MAAM,KAAK,GAAG,YAAY,OAAO,OAAO;AAAA,QAEtC,MAAM,aAAsC,EAAE,WAAW,IAAI;AAAA,QAC7D,IAAI,QAAQ,SAAS;AAAA,UAAW,WAAW,OAAO,QAAQ;AAAA,QAC1D,IAAI,QAAQ,aAAa;AAAA,UAAW,WAAW,WAAW,QAAQ;AAAA,QAElE,MAAM,GAAG,OAAO,YAAY,EAAE,IAAI,UAAU,EAAE,MAAM,wBAAG,aAAa,IAAI,SAAS,CAAC;AAAA,QAGlF,IAAI,QAAQ,8BAA8B,WAAW;AAAA,UAEnD,MAAM,GACH,OAAO,wBAAwB,EAC/B,MAAM,wBAAG,yBAAyB,WAAW,SAAS,CAAC;AAAA,UAG1D,IAAI,QAAQ,0BAA0B,SAAS,GAAG;AAAA,YAChD,MAAM,oBAAoB,QAAQ,0BAA0B,IAAI,CAAC,cAAc;AAAA,cAC7E;AAAA,cACA;AAAA,YACF,EAAE;AAAA,YACF,MAAM,GACH,OAAO,wBAAwB,EAC/B,OAAO,iBAAiB,EACxB,oBAAoB;AAAA,UACzB;AAAA,QACF;AAAA,OACD;AAAA,MAGD,MAAM,iBAAiB,MAAM,KAAK,kBAAkB,SAAS;AAAA,MAC7D,IAAI,CAAC,gBAAgB;AAAA,QACnB,MAAM,IAAI,MAAM,WAAW,kCAAkC;AAAA,MAC/D;AAAA,MACA,OAAO;AAAA,KACR;AAAA;AAAA,OAMG,cAAa,CAAC,WAAgC;AAAA,IAClD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,KAAK,GAAG,YAAY,OAAO,OAAO;AAAA,QAEtC,MAAM,GAAG,OAAO,YAAY,EAAE,MAAM,wBAAG,aAAa,WAAW,SAAS,CAAC;AAAA,QAGzE,MAAM,GACH,OAAO,wBAAwB,EAC/B,MAAM,wBAAG,yBAAyB,WAAW,SAAS,CAAC;AAAA,QAG1D,MAAM,GAAG,OAAO,YAAY,EAAE,MAAM,wBAAG,aAAa,IAAI,SAAS,CAAC;AAAA,OACnE;AAAA,KACF;AAAA;AAAA,OAMG,uBAAsB,CAAC,WAAiB,WAAkC;AAAA,IAC9E,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,IAAI,CAAC,aAAa,UAAU,WAAW;AAAA,QAAG;AAAA,MAE1C,MAAM,oBAAoB,UAAU,IAAI,CAAC,cAAc;AAAA,QACrD;AAAA,QACA;AAAA,MACF,EAAE;AAAA,MAEF,MAAM,KAAK,GACR,OAAO,wBAAwB,EAC/B,OAAO,iBAAiB,EACxB,oBAAoB;AAAA,KACxB;AAAA;AAAA,OAMG,uBAAsB,CAAC,WAAkC;AAAA,IAC7D,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,UAAU,MAAM,KAAK,GACxB,OAAO,EAAE,UAAU,yBAAyB,SAAS,CAAC,EACtD,KAAK,wBAAwB,EAC7B,MAAM,wBAAG,yBAAyB,WAAW,SAAS,CAAC;AAAA,MAE1D,OAAO,QAAQ,IAAI,CAAC,MAAM,EAAE,QAAgB;AAAA,KAC7C;AAAA;AAAA,OASG,qBAAoB,CAAC,WAAiB,UAAkC;AAAA,IAC5E,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,SAAS,MAAM,KAAK,GACvB,OAAO,EACP,KAAK,wBAAwB,EAC7B,MACC,yBACE,wBAAG,yBAAyB,WAAW,SAAS,GAChD,wBAAG,yBAAyB,UAAU,QAAQ,CAChD,CACF,EACC,MAAM,CAAC;AAAA,MAEV,OAAO,OAAO,SAAS;AAAA,KACxB;AAAA;AAAA,OAMG,wBAAuB,CAAC,iBAAuB,SAA8B;AAAA,IACjF,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,KAAK,GACR,OAAO,wBAAwB,EAC/B,OAAO;AAAA,QACN;AAAA,QACA;AAAA,MACF,CAAC,EACA,oBAAoB;AAAA,KACxB;AAAA;AAAA,OAMG,0BAAyB,CAAC,iBAAwC;AAAA,IACtE,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,UAAU,MAAM,KAAK,GACxB,OAAO,EAAE,SAAS,yBAAyB,QAAQ,CAAC,EACpD,KAAK,wBAAwB,EAC7B,MAAM,wBAAG,yBAAyB,iBAAiB,eAAe,CAAC;AAAA,MAEtE,OAAO,QAAQ,IAAI,CAAC,MAAM,EAAE,OAAe;AAAA,KAC5C;AAAA;AAAA,OAMG,6BAA4B,CAAC,iBAAuB,SAA8B;AAAA,IACtF,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,KAAK,GACR,OAAO,wBAAwB,EAC/B,MACC,yBACE,wBAAG,yBAAyB,iBAAiB,eAAe,GAC5D,wBAAG,yBAAyB,SAAS,OAAO,CAC9C,CACF;AAAA,KACH;AAAA;AAAA,OAMG,sBAAqB,CACzB,SACA,SACA,iBAYC;AAAA,IACD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,MAAM,CAAC,SAAS,OAAO,EAAE,KAAK;AAAA,MACpC,MAAM,gBAAgB,MAAM,IAAI,MAAM,IAAI;AAAA,MAE1C,MAAM,mBAAmB,MAAM,KAAK,GACjC,OAAO,EACP,KAAK,YAAY,EACjB,MACC,yBACE,wBAAG,aAAa,MAAM,yBAAY,EAAE,GACpC,wBAAG,aAAa,MAAM,aAAa,GACnC,wBAAG,aAAa,iBAAiB,eAAe,CAClD,CACF,EACC,MAAM,CAAC;AAAA,MAEV,IAAI,iBAAiB,SAAS,GAAG;AAAA,QAC/B,OAAO;AAAA,UACL,IAAI,iBAAiB,GAAG;AAAA,UACxB,iBAAiB,iBAAiB,GAAG;AAAA,UACrC,MAAM,iBAAiB,GAAG;AAAA,UAC1B,MAAM,iBAAiB,GAAG;AAAA,UAC1B,YAAY,iBAAiB,GAAG,cAAc;AAAA,UAC9C,UAAU,iBAAiB,GAAG,YAAY;AAAA,UAC1C,OAAO,iBAAiB,GAAG,SAAS;AAAA,UACpC,UAAW,iBAAiB,GAAG,YAAY;AAAA,UAC3C,WAAW,iBAAiB,GAAG;AAAA,UAC/B,WAAW,iBAAiB,GAAG;AAAA,QACjC;AAAA,MACF;AAAA,MAGA,OAAO,KAAK,cACV;AAAA,QACE;AAAA,QACA,MAAM;AAAA,QACN,MAAM,yBAAY;AAAA,QAClB,UAAU,EAAE,OAAO,IAAI,IAAI,OAAO,IAAI,GAAG;AAAA,MAC3C,GACA,GACF;AAAA,KACD;AAAA;AAAA,OAUG,mBAAkB,CACtB,SACgC;AAAA,IAChC,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,IAAI,QAAQ,WAAW,GAAG;AAAA,QACxB,OAAO,CAAC;AAAA,MACV;AAAA,MAEA,OAAO,QAAQ,IACb,QAAQ,IAAI,SAAS,SAAS,cAAc;AAAA,QAC1C,MAAM,UAAU,MAAM,KAAK,GACxB,OAAO,EACP,KAAK,mBAAmB,EACxB,MACC,yBACE,wBAAG,oBAAoB,SAAS,OAAO,GACvC,wBAAG,oBAAoB,SAAS,OAAO,CACzC,CACF,EACC,QAAQ,oBAAoB,SAAS;AAAA,QAExC,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,UAAU,QAAQ,IAAI,CAAC,SAAS;AAAA,YAC9B,IAAI,IAAI;AAAA,YACR,SAAS,IAAI;AAAA,YACb,UAAU,IAAI;AAAA,YACd,MAAM,IAAI;AAAA,YACV,WAAW,IAAI;AAAA,YACf,YAAY,IAAI;AAAA,YAChB,UAAW,IAAI,YAAuC;AAAA,YACtD,SAAS,IAAI;AAAA,UACf,EAAE;AAAA,QACJ;AAAA,OACD,CACH;AAAA,KACD;AAAA;AAAA,OAMG,qBAAoB,CAAC,SAAwC;AAAA,IACjE,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,KAAK,QAAQ,MAAO,GAAG;AAAA,MAC7B,MAAM,KAAK,GAAG,OAAO,mBAAmB,EAAE,OAAO;AAAA,QAC/C;AAAA,QACA,SAAS,QAAQ;AAAA,QACjB,UAAU,QAAQ;AAAA,QAClB,MAAM,QAAQ;AAAA,QACd,WAAW,QAAQ;AAAA,QACnB,YAAY,QAAQ;AAAA,QACpB,UAAU,QAAQ,YAAY,CAAC;AAAA,QAC/B,SAAS,QAAQ;AAAA,MACnB,CAAC;AAAA,MACD,OAAO;AAAA,KACR;AAAA;AAAA,OAMG,qBAAoB,CAAC,SAAwC;AAAA,IACjE,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,KAAK,GACR,OAAO,mBAAmB,EAC1B,IAAI;AAAA,QACH,YAAY,QAAQ;AAAA,QACpB,UAAU,QAAQ,YAAY,CAAC;AAAA,MACjC,CAAC,EACA,MAAM,wBAAG,oBAAoB,IAAI,QAAQ,EAAE,CAAC;AAAA,KAChD;AAAA;AAAA,OAMG,qBAAoB,CAAC,IAAyB;AAAA,IAClD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,KAAK,GAAG,OAAO,mBAAmB,EAAE,MAAM,wBAAG,oBAAoB,IAAI,EAAE,CAAC;AAAA,KAC/E;AAAA;AAAA,OAMG,oBAAmB,CACvB,SACA,SACkC;AAAA,IAClC,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,UAAU,MAAM,KAAK,GACxB,OAAO,EACP,KAAK,qBAAqB,EAC1B,MACC,yBACE,wBAAG,sBAAsB,SAAS,OAAO,GACzC,wBAAG,sBAAsB,SAAS,OAAO,CAC3C,CACF,EACC,QAAQ,sBAAsB,SAAS;AAAA,MAE1C,OAAO,QAAQ,IAAI,CAAC,SAAS;AAAA,QAC3B,IAAI,IAAI;AAAA,QACR,SAAS,IAAI;AAAA,QACb,UAAU,IAAI;AAAA,QACd,WAAW,IAAI;AAAA,QACf,UAAW,IAAI,YAAuC;AAAA,QACtD,SAAS,IAAI;AAAA,MACf,EAAE;AAAA,KACH;AAAA;AAAA,OAMG,4BAA2B,CAAC,OAA6C;AAAA,IAC7E,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,KAAK,MAAM,MAAO,GAAG;AAAA,MAC3B,MAAM,KAAK,GACR,OAAO,qBAAqB,EAC5B,OAAO;AAAA,QACN;AAAA,QACA,SAAS,MAAM;AAAA,QACf,UAAU,MAAM;AAAA,QAChB,WAAW,MAAM;AAAA,QACjB,UAAU,MAAM,YAAY,CAAC;AAAA,QAC7B,SAAS,MAAM;AAAA,MACjB,CAAC,EACA,oBAAoB;AAAA,MACvB,OAAO;AAAA,KACR;AAAA;AAAA,OAMG,4BAA2B,CAAC,IAAyB;AAAA,IACzD,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,KAAK,GAAG,OAAO,qBAAqB,EAAE,MAAM,wBAAG,sBAAsB,IAAI,EAAE,CAAC;AAAA,KACnF;AAAA;AAAA,OAKG,QAAO,GAAqB;AAAA,IAChC,IAAI;AAAA,MACF,MAAM,KAAK,GAAG,QAAQ,kCAAa;AAAA,MACnC,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA;AAAA;AAAA,OAIL,cAAa,GAA6B;AAAA,IAC9C,OAAO,KAAK;AAAA;AAAA,OAGR,YAAc,CAClB,UACA,UACY;AAAA,IAGZ,OAAO,SAAS,IAAyC;AAAA;AAAA,OAKrD,2BAA0B,CAC9B,MAM+B;AAAA,IAC/B,IAAI,KAAK,WAAW;AAAA,MAAG,OAAO,CAAC;AAAA,IAC/B,MAAM,UAAgC,CAAC;AAAA,IACvC,WAAW,OAAO,MAAM;AAAA,MACtB,MAAM,YAAY,MAAM,KAAK,aAC3B,IAAI,UACJ,IAAI,MACJ,IAAI,SACJ,IAAI,cACN;AAAA,MACA,QAAQ,KAAK,SAAS;AAAA,IACxB;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,yBAAwB,CAC5B,WACA,SACA,gBACsB;AAAA,IACtB,IAAI,UAAU,WAAW;AAAA,MAAG,OAAO,CAAC;AAAA,IACpC,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,aAAoB,CAAC,6BAAQ,eAAe,UAAU,SAAS,CAAC;AAAA,MACtE,IAAI,SAAS;AAAA,QACX,WAAW,KAAK,wBAAG,eAAe,SAAS,OAAO,CAAC;AAAA,MACrD;AAAA,MACA,IAAI,gBAAgB;AAAA,QAClB,WAAW,KAAK,wBAAG,eAAe,gBAAgB,cAAc,CAAC;AAAA,MACnE;AAAA,MACA,MAAM,SAAS,MAAM,KAAK,GACvB,OAAO,EACP,KAAK,cAAc,EACnB,MAAM,yBAAI,GAAG,UAAU,CAAC;AAAA,MAC3B,OAAO,OAAO,IAAI,CAAC,eAAe;AAAA,WAC7B;AAAA,QACH,IAAI,UAAU;AAAA,QACd,UAAU,UAAU;AAAA,QACpB,SAAS,UAAU;AAAA,QACnB,QAAQ,UAAU;AAAA,QAClB,SAAU,UAAU,WAAW;AAAA,QAC/B,gBAAiB,UAAU,kBAAkB;AAAA,QAC7C,MAAM,UAAU;AAAA,QAChB,WAAW,UAAU,UAAU,QAAQ;AAAA,MACzC,EAAE;AAAA,KACH;AAAA;AAAA,OAGG,iBAAgB,CAAC,YAA0C;AAAA,IAC/D,IAAI,WAAW,WAAW;AAAA,MAAG,OAAO,CAAC;AAAA,IACrC,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,MAAc,CAAC;AAAA,MACrB,WAAW,aAAa,YAAY;AAAA,QAClC,MAAM,UAAU,MAAM,KAAK,gBAAgB,SAAS;AAAA,QACpD,IAAI;AAAA,UAAS,IAAI,KAAK,UAAU,EAAE;AAAA,MACpC;AAAA,MACA,OAAO;AAAA,KACR;AAAA;AAAA,OAGG,mBAAkB,CAAC,cAA4C;AAAA,IACnE,IAAI,aAAa,WAAW;AAAA,MAAG,OAAO,CAAC;AAAA,IACvC,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,SAAS,MAAM,KAAK,GACvB,OAAO,EACP,KAAK,cAAc,EACnB,MAAM,6BAAQ,eAAe,IAAI,YAAY,CAAC;AAAA,MACjD,OAAO,OAAO,IAAI,CAAC,eAAe;AAAA,WAC7B;AAAA,QACH,IAAI,UAAU;AAAA,QACd,UAAU,UAAU;AAAA,QACpB,SAAS,UAAU;AAAA,QACnB,QAAQ,UAAU;AAAA,QAClB,SAAU,UAAU,WAAW;AAAA,QAC/B,gBAAiB,UAAU,kBAAkB;AAAA,QAC7C,MAAM,UAAU;AAAA,QAChB,WAAW,UAAU,UAAU,QAAQ;AAAA,MACzC,EAAE;AAAA,KACH;AAAA;AAAA,OAGG,iBAAgB,CAAC,YAAwC;AAAA,IAC7D,WAAW,aAAa,YAAY;AAAA,MAClC,MAAM,KAAK,gBAAgB,SAAS;AAAA,IACtC;AAAA;AAAA,OAGI,iBAAgB,CAAC,cAAqC;AAAA,IAC1D,IAAI,aAAa,WAAW;AAAA,MAAG;AAAA,IAC/B,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,KAAK,GAAG,OAAO,cAAc,EAAE,MAAM,6BAAQ,eAAe,IAAI,YAAY,CAAC;AAAA,KACpF;AAAA;AAAA,OAGG,iBAAgB,CACpB,YACA,UACe;AAAA,IACf,WAAW,aAAa,YAAY;AAAA,MAClC,MAAM,WAAW,MAAM,KAAK,aAC1B,UAAU,UACV,UAAU,MACV,UAAU,SACV,UAAU,cACZ;AAAA,MACA,IAAI,UAAU;AAAA,QACZ,MAAM,KAAK,gBAAgB,KAAK,WAAW,IAAI,SAAS,GAAG,CAAC;AAAA,MAC9D,EAAO;AAAA,QACL,MAAM,KAAK,gBAAgB,SAAS;AAAA;AAAA,IAExC;AAAA;AAAA,OAGI,gBAAe,CACnB,SACA,UACe;AAAA,IACf,WAAW,UAAU,SAAS;AAAA,MAC5B,MAAM,OAAO,MAAM,KAAK,aAAa,YACnC,KAAK,GAAG,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,wBAAG,eAAe,IAAI,OAAO,WAAW,CAAC,CACvF;AAAA,MACA,MAAM,MAAM,KAAK;AAAA,MACjB,IAAI,CAAC;AAAA,QAAK;AAAA,MAEV,MAAM,OAAO,KAAO,IAAI,QAAQ,CAAC,EAA+B;AAAA,MAChE,WAAW,MAAM,OAAO,KAAK;AAAA,QAC3B,aAAa,MAAM,EAAE;AAAA,MACvB;AAAA,MAEA,MAAM,KAAK,aAAa,YAAY;AAAA,QAClC,MAAM,KAAK,GACR,OAAO,cAAc,EACrB,IAAI,EAAE,KAAK,CAAC,EACZ,MAAM,wBAAG,eAAe,IAAI,OAAO,WAAW,CAAC;AAAA,OACnD;AAAA,IACH;AAAA;AAAA,OAKI,eAAc,CAAC,UAAmC;AAAA,IACtD,WAAW,UAAU,UAAU;AAAA,MAC7B,IAAI,CAAC,OAAO,IAAI;AAAA,QACd,MAAM,KAAK,eAAe,CAAC,MAAM,CAAC;AAAA,QAClC;AAAA,MACF;AAAA,MACA,MAAM,WAAW,MAAM,KAAK,iBAAiB,CAAC,OAAO,EAAE,CAAC;AAAA,MACxD,IAAI,SAAS,SAAS,GAAG;AAAA,QACvB,MAAM,KAAK,aAAa,MAAM;AAAA,MAChC,EAAO;AAAA,QACL,MAAM,KAAK,eAAe,CAAC,MAAM,CAAC;AAAA;AAAA,IAEtC;AAAA;AAAA,OAGI,cAAa,CAAC,QAUE;AAAA,IAEpB,IAAI,OAAO,WAAW,QAAQ;AAAA,MAC5B,MAAM,WAAW,MAAM,KAAK,iBAAiB,OAAO,SAAS;AAAA,MAC7D,OAAO,YAAY,CAAC;AAAA,IACtB;AAAA,IAEA,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,aAAoB,CAAC;AAAA,MAE3B,IAAI,OAAO,SAAS;AAAA,QAClB,WAAW,KAAK,wBAAG,YAAY,SAAS,OAAO,OAAO,CAAC;AAAA,MACzD;AAAA,MAKA,IAAI,OAAO,iBAAiB,OAAO,uBAAuB,OAAO,SAAS;AAAA,QACxE,MAAM,gBAAuB,CAAC,2BAAM,eAAe,cAAc,YAAY,IAAI;AAAA,QACjF,IAAI,OAAO,eAAe;AAAA,UACxB,cAAc,KAAK,2BAAM,eAAe,UAAU,OAAO,eAAe;AAAA,QAC1E;AAAA,QACA,IAAI,OAAO,qBAAqB;AAAA,UAC9B,cAAc,KACZ,2BAAM,eAAe,WAAW,KAAK,UAAU,OAAO,mBAAmB,UAC3E;AAAA,QACF;AAAA,QACA,IAAI,OAAO,SAAS;AAAA,UAClB,cAAc,KAAK,2BAAM,eAAe,aAAa,OAAO,SAAS;AAAA,QACvE;AAAA,QACA,MAAM,WAAW;AAAA,0BACC;AAAA,kBACR,yBAAI,KAAK,eAAe,+BAAU;AAAA;AAAA,QAE5C,WAAW,KAAK,QAAQ;AAAA,MAC1B;AAAA,MAEA,IAAI,QAAQ,KAAK,GACd,OAAO,EACP,KAAK,WAAW,EAChB,MAAM,WAAW,SAAS,IAAI,yBAAI,GAAG,UAAU,IAAI,SAAS;AAAA,MAE/D,IAAI,OAAO,OAAO;AAAA,QAChB,QAAQ,MAAM,MAAM,OAAO,KAAK;AAAA,MAClC;AAAA,MACA,IAAI,OAAO,QAAQ;AAAA,QACjB,QAAQ,MAAM,OAAO,OAAO,MAAM;AAAA,MACpC;AAAA,MAEA,MAAM,SAAS,MAAM;AAAA,MAErB,MAAM,WAAqB,OAAO,IAAI,CAAC,SAAS;AAAA,WAC3C;AAAA,QACH,IAAI,IAAI;AAAA,QACR,SAAS,IAAI;AAAA,QACb,OAAQ,IAAI,SAAS,CAAC;AAAA,QACtB,UAAW,IAAI,YAAY,CAAC;AAAA,MAC9B,EAAE;AAAA,MAGF,IAAI,OAAO,wBAAwB,SAAS,SAAS,GAAG;AAAA,QACtD,MAAM,YAAY,SAAS,QAAQ,CAAC,WAAY,OAAO,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAE;AAAA,QAC7E,MAAM,aAAa,MAAM,KAAK,yBAAyB,WAAW,OAAO,OAAO;AAAA,QAChF,MAAM,qBAAqB,IAAI;AAAA,QAC/B,WAAW,QAAQ,YAAY;AAAA,UAC7B,MAAM,OAAO,mBAAmB,IAAI,KAAK,QAAQ,KAAK,CAAC;AAAA,UACvD,KAAK,KAAK,IAAI;AAAA,UACd,mBAAmB,IAAI,KAAK,UAAU,IAAI;AAAA,QAC5C;AAAA,QACA,WAAW,UAAU,UAAU;AAAA,UAC7B,OAAO,aAAa,OAAO,KAAM,mBAAmB,IAAI,OAAO,EAAE,KAAK,CAAC,IAAK,CAAC;AAAA,QAC/E;AAAA,MACF;AAAA,MAEA,OAAO;AAAA,KACR;AAAA;AAAA,OAGG,eAAc,CAAC,UAAmC;AAAA,IACtD,WAAW,UAAU,UAAU;AAAA,MAC7B,MAAM,KAAK,aAAa,MAAM;AAAA,IAChC;AAAA;AAAA,OAGI,eAAc,CAAC,WAAkC;AAAA,IACrD,WAAW,YAAY,WAAW;AAAA,MAChC,MAAM,KAAK,aAAa,QAAQ;AAAA,IAClC;AAAA;AAAA,OAGI,oBAAmB,CACvB,SACA,mBACiC;AAAA,IACjC,MAAM,SAAiC,CAAC;AAAA,IACxC,WAAW,UAAU,SAAS;AAAA,MAC5B,MAAM,WAAW,MAAM,KAAK,mBAAmB,QAAQ,iBAAiB;AAAA,MACxE,OAAO,KAAK,EAAE,QAAQ,SAAS,CAAC;AAAA,IAClC;AAAA,IACA,OAAO;AAAA;AAAA,OAKH,WAAU,CACd,QAMe;AAAA,IACf,WAAW,SAAS,QAAQ;AAAA,MAC1B,MAAM,KAAK,IAAI,KAAK;AAAA,IACtB;AAAA;AAAA,OAGI,aAAY,CAAC,QAAgC;AAAA,IACjD,IAAI,OAAO,WAAW;AAAA,MAAG,OAAO,CAAC;AAAA,IACjC,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,SAAS,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,6BAAQ,SAAS,IAAI,MAAM,CAAC;AAAA,MACvF,OAAO,OAAO,IAAI,CAAC,SAAS;AAAA,WACvB;AAAA,QACH,IAAI,IAAI;AAAA,QACR,UAAU,IAAI;AAAA,QACd,QAAQ,IAAI;AAAA,QACZ,MAAM,IAAI;AAAA,QACV,MAAM,IAAI;AAAA,QACV,WAAW,IAAI,KAAK,IAAI,SAAmC;AAAA,MAC7D,EAAE;AAAA,KACH;AAAA;AAAA,OAGG,WAAU,CAAC,MAAiE;AAAA,IAChF,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,aAAa,IAAI,aAAa,MAAM;AAAA,QAClC,MAAM,YAAqC,CAAC;AAAA,QAC5C,IAAI,QAAQ,SAAS;AAAA,UAAW,UAAU,OAAO,QAAQ;AAAA,QACzD,IAAI,QAAQ,SAAS;AAAA,UAAW,UAAU,OAAO,QAAQ;AAAA,QACzD,IAAI,OAAO,KAAK,SAAS,EAAE,SAAS,GAAG;AAAA,UACrC,MAAM,KAAK,GAAG,OAAO,QAAQ,EAAE,IAAI,SAAS,EAAE,MAAM,wBAAG,SAAS,IAAI,EAAE,CAAC;AAAA,QACzE;AAAA,MACF;AAAA,KACD;AAAA;AAAA,OAGG,WAAU,CAAC,QAA+B;AAAA,IAC9C,IAAI,OAAO,WAAW;AAAA,MAAG;AAAA,IACzB,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,KAAK,GAAG,OAAO,QAAQ,EAAE,MAAM,6BAAQ,SAAS,IAAI,MAAM,CAAC;AAAA,KAClE;AAAA;AAAA,OAKG,eAAc,CAClB,UACiB;AAAA,IACjB,MAAM,MAAc,CAAC;AAAA,IACrB,aAAa,QAAQ,WAAW,qBAAY,UAAU;AAAA,MACpD,MAAM,mBAAmB,YAAW,YAAY,KAAK,QAAQ,gBAAO,IAAI;AAAA,MACxE,MAAM,KAAK,MAAM,KAAK,aAAa,kBAAkB,SAAS;AAAA,MAC9D,IAAI,KAAK,EAAE;AAAA,IACb;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,eAAc,CAClB,UACe;AAAA,IACf,WAAW,UAAU,UAAU;AAAA,MAC7B,MAAM,KAAK,aAAa,MAAM;AAAA,IAChC;AAAA;AAAA,OAGI,eAAc,CAClB,UACA,UACe;AAAA,IACf,aAAa,QAAQ,eAAe,UAAU;AAAA,MAC5C,IAAI,OAAO,IAAI;AAAA,QACb,MAAM,WAAW,MAAM,KAAK,cAAc,OAAO,EAAE;AAAA,QACnD,IAAI,UAAU;AAAA,UACZ,MAAM,KAAK,aAAa,MAAwC;AAAA,UAChE;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,KAAK,aAAa,QAAQ,SAAS;AAAA,IAC3C;AAAA;AAAA,OAGI,eAAc,CAAC,WAAkC;AAAA,IACrD,MAAM,KAAK,mBAAmB,SAAS;AAAA;AAAA,OAKnC,eAAc,CAAC,UAAoC;AAAA,IACvD,IAAI,SAAS,WAAW;AAAA,MAAG,OAAO,CAAC;AAAA,IACnC,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,SAAS,MAAM,KAAK,GACvB,OAAO,EACP,KAAK,UAAU,EACf,MAAM,6BAAQ,WAAW,IAAI,QAAQ,CAAC;AAAA,MACzC,OAAO,OAAO,IAAI,CAAC,UAAU,KAAK,eAAe,KAAK,CAAC;AAAA,KACxD;AAAA;AAAA,OAGG,aAAY,CAAC,QAAkC;AAAA,IACnD,MAAM,MAAc,CAAC;AAAA,IACrB,WAAW,SAAS,QAAQ;AAAA,MAC1B,MAAM,KAAK,MAAM,KAAK,YAAY,KAAK;AAAA,MACvC,IAAI,KAAK,EAAE;AAAA,IACb;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,aAAY,CAAC,UAAiC;AAAA,IAClD,WAAW,MAAM,UAAU;AAAA,MACzB,MAAM,KAAK,YAAY,EAAE;AAAA,IAC3B;AAAA;AAAA,OAGI,aAAY,CAAC,QAAgC;AAAA,IACjD,WAAW,SAAS,QAAQ;AAAA,MAC1B,MAAM,KAAK,YAAY,KAAK;AAAA,IAC9B;AAAA;AAAA,OAGI,aAAY,CAAC,QAAgC;AAAA,IACjD,WAAW,SAAS,QAAQ;AAAA,MAC1B,MAAM,WAAW,MAAM,KAAK,SAAS,MAAM,EAAE;AAAA,MAC7C,IAAI,UAAU;AAAA,QACZ,MAAM,KAAK,YAAY,KAAK;AAAA,MAC9B,EAAO;AAAA,QACL,MAAM,KAAK,YAAY,KAAK;AAAA;AAAA,IAEhC;AAAA;AAAA,OAKI,sBAAqB,CAAC,UAAiC;AAAA,IAC3D,WAAW,WAAW,UAAU;AAAA,MAC9B,MAAM,KAAK,qBAAqB,OAAO;AAAA,IACzC;AAAA;AAAA,OAGI,iBAAgB,CAAC,UAAkB,OAAgB,QAAkC;AAAA,IACzF,IAAI,SAAS,WAAW;AAAA,MAAG,OAAO,CAAC;AAAA,IACnC,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,aAAa;AAAA,QACjB,6BAAQ,UAAU,SAAS,QAAQ;AAAA,QACnC,wBAAG,UAAU,SAAS,KAAK,OAAO;AAAA,MACpC;AAAA,MACA,IAAI,QAAQ,KAAK,GACd,OAAO,EACP,KAAK,SAAS,EACd,MAAM,yBAAI,GAAG,UAAU,CAAC;AAAA,MAC3B,IAAI,QAAQ;AAAA,QACV,QAAQ,MAAM,OAAO,MAAM;AAAA,MAC7B;AAAA,MACA,IAAI,OAAO;AAAA,QACT,QAAQ,MAAM,MAAM,KAAK;AAAA,MAC3B;AAAA,MACA,MAAM,SAAS,MAAM;AAAA,MACrB,OAAO,OAAO,IAAI,CAAC,UAAU;AAAA,WACxB;AAAA,QACH,IAAI,KAAK;AAAA,QACT,MAAM,KAAK,QAAQ;AAAA,QACnB,SAAS,KAAK;AAAA,QACd,iBAAiB,KAAK;AAAA,QACtB,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,QACd,WAAW,KAAK;AAAA,QAChB,MAAM,KAAK;AAAA,QACX,UAAU,KAAK;AAAA,MACjB,EAAE;AAAA,KACH;AAAA;AAAA,OAGG,YAAW,CAAC,OAA8B;AAAA,IAC9C,WAAW,QAAQ,OAAO;AAAA,MACxB,MAAM,WAAW,MAAM,KAAK,cAAc,CAAC,KAAK,EAAE,CAAC;AAAA,MACnD,IAAI,YAAY,SAAS,SAAS,GAAG;AAAA,QACnC,MAAM,KAAK,WAAW,IAAI;AAAA,MAC5B,EAAO;AAAA,QACL,MAAM,KAAK,YAAY,CAAC,IAAI,CAAC;AAAA;AAAA,IAEjC;AAAA;AAAA,OAGI,uBAAsB,CAAC,WAAmB,QAA+B;AAAA,IAC7E,MAAM,MAAc,CAAC;AAAA,IACrB,WAAW,YAAY,WAAW;AAAA,MAChC,MAAM,UAAU,MAAM,KAAK,eAAe,UAAU,MAAM;AAAA,MAC1D,IAAI,SAAS;AAAA,QACX,IAAI,KAAK,GAAG,UAAU,UAAkB;AAAA,MAC1C;AAAA,IACF;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,mBAAkB,CACtB,cACkB;AAAA,IAClB,aAAa,UAAU,YAAY,cAAc;AAAA,MAC/C,MAAM,UAAU,MAAM,KAAK,kBAAkB,UAAU,MAAM;AAAA,MAC7D,IAAI,CAAC;AAAA,QAAS,OAAO;AAAA,IACvB;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,mBAAkB,CACtB,cAKe;AAAA,IACf,aAAa,UAAU,QAAQ,aAAa,cAAc;AAAA,MACxD,IAAI,QAAQ,cAAc,WAAW;AAAA,QACnC,MAAM,KAAK,wBAAwB,QAAQ,UAAU,QAAQ,SAAS;AAAA,MACxE;AAAA,IACF;AAAA;AAAA,OAGI,YAAW,CAAC,OAA8B;AAAA,IAC9C,WAAW,QAAQ,OAAO;AAAA,MACxB,MAAM,KAAK,WAAW,IAAI;AAAA,IAC5B;AAAA;AAAA,OAGI,YAAW,CAAC,SAAgC;AAAA,IAChD,WAAW,UAAU,SAAS;AAAA,MAC5B,MAAM,KAAK,WAAW,MAAM;AAAA,IAC9B;AAAA;AAAA,OAKI,2BAA0B,CAAC,WAA2C;AAAA,IAC1E,MAAM,SAAwB,CAAC;AAAA,IAC/B,WAAW,YAAY,WAAW;AAAA,MAChC,MAAM,eAAe,MAAM,KAAK,yBAAyB,QAAQ;AAAA,MACjE,OAAO,KAAK,GAAG,YAAY;AAAA,IAC7B;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,wBAAuB,CAAC,SAAsD;AAAA,IAClF,MAAM,SAAqC,CAAC;AAAA,IAC5C,WAAW,UAAU,SAAS;AAAA,MAC5B,MAAM,YAAY,MAAM,KAAK,uBAAuB,MAAM;AAAA,MAC1D,OAAO,KAAK,EAAE,QAAQ,UAAU,CAAC;AAAA,IACnC;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,oBAAmB,CAAC,OAAoE;AAAA,IAC5F,MAAM,UAAqB,CAAC;AAAA,IAC5B,aAAa,QAAQ,cAAc,OAAO;AAAA,MACxC,MAAM,gBAAgB,MAAM,KAAK,kBAAkB,QAAQ,QAAQ;AAAA,MACnE,QAAQ,KAAK,aAAa;AAAA,IAC5B;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,yBAAwB,CAC5B,OACiC;AAAA,IACjC,MAAM,UAAkC,CAAC;AAAA,IACzC,aAAa,QAAQ,cAAc,OAAO;AAAA,MACxC,MAAM,QAAQ,MAAM,KAAK,wBAAwB,QAAQ,QAAQ;AAAA,MACjE,QAAQ,KAAK,KAAK;AAAA,IACpB;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,4BAA2B,CAC/B,SAKe;AAAA,IACf,aAAa,QAAQ,UAAU,WAAW,SAAS;AAAA,MACjD,MAAM,KAAK,wBAAwB,QAAQ,UAAU,KAAK;AAAA,IAC5D;AAAA;AAAA,OAKI,wBAAuB,CAC3B,OACkC;AAAA,IAClC,MAAM,UAAmC,CAAC;AAAA,IAC1C,WAAW,QAAQ,OAAO;AAAA,MACxB,MAAM,MAAM,MAAM,KAAK,gBAAgB,IAAI;AAAA,MAC3C,QAAQ,KAAK,GAAG;AAAA,IAClB;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,oBAAmB,CACvB,eAMiB;AAAA,IACjB,MAAM,MAAc,CAAC;AAAA,IACrB,WAAW,OAAO,eAAe;AAAA,MAC/B,MAAM,KAAK,GAAG;AAAA,MACd,MAAM,UAAU,MAAM,KAAK,mBAAmB,GAAG;AAAA,MACjD,IAAI;AAAA,QAAS,IAAI,KAAK,EAAE;AAAA,IAC1B;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,sBAAqB,CAAC,iBAAkD;AAAA,IAC5E,IAAI,gBAAgB,WAAW;AAAA,MAAG,OAAO,CAAC;AAAA,IAC1C,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,SAAS,MAAM,KAAK,GACvB,OAAO,EACP,KAAK,iBAAiB,EACtB,MAAM,6BAAQ,kBAAkB,IAAI,eAAe,CAAC;AAAA,MACvD,OAAO,OAAO,IAAI,CAAC,kBAAkB;AAAA,WAChC;AAAA,QACH,IAAI,aAAa;AAAA,QACjB,gBAAgB,aAAa;AAAA,QAC7B,gBAAgB,aAAa;AAAA,QAC7B,SAAS,aAAa;AAAA,QACtB,MAAO,aAAa,QAAQ,CAAC;AAAA,QAC7B,UAAW,aAAa,YAAY,CAAC;AAAA,QACrC,WAAW,aAAa,UAAU,YAAY;AAAA,MAChD,EAAE;AAAA,KACH;AAAA;AAAA,OAGG,oBAAmB,CAAC,eAA8C;AAAA,IACtE,WAAW,gBAAgB,eAAe;AAAA,MACxC,MAAM,KAAK,mBAAmB,YAAY;AAAA,IAC5C;AAAA;AAAA,OAGI,oBAAmB,CAAC,iBAAwC;AAAA,IAChE,IAAI,gBAAgB,WAAW;AAAA,MAAG;AAAA,IAClC,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,MAAM,KAAK,GAAG,OAAO,iBAAiB,EAAE,MAAM,6BAAQ,kBAAkB,IAAI,eAAe,CAAC;AAAA,KAC7F;AAAA;AAAA,OAKG,UAAY,CAAC,MAAyC;AAAA,IAC1D,MAAM,SAAS,IAAI;AAAA,IACnB,WAAW,OAAO,MAAM;AAAA,MACtB,MAAM,QAAQ,MAAM,KAAK,SAAY,GAAG;AAAA,MACxC,IAAI,UAAU,WAAW;AAAA,QACvB,OAAO,IAAI,KAAK,KAAK;AAAA,MACvB;AAAA,IACF;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,UAAY,CAAC,SAA6D;AAAA,IAC9E,aAAa,KAAK,WAAW,SAAS;AAAA,MACpC,MAAM,UAAU,MAAM,KAAK,SAAS,KAAK,KAAK;AAAA,MAC9C,IAAI,CAAC;AAAA,QAAS,OAAO;AAAA,IACvB;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,aAAY,CAAC,MAAkC;AAAA,IACnD,WAAW,OAAO,MAAM;AAAA,MACtB,MAAM,UAAU,MAAM,KAAK,YAAY,GAAG;AAAA,MAC1C,IAAI,CAAC;AAAA,QAAS,OAAO;AAAA,IACvB;AAAA,IACA,OAAO;AAAA;AAAA,OAKH,YAAW,CAAC,OAAgC;AAAA,IAChD,MAAM,MAAc,CAAC;AAAA,IACrB,WAAW,QAAQ,OAAO;AAAA,MACxB,MAAM,KAAK,MAAM,KAAK,WAAW,IAAI;AAAA,MACrC,IAAI,KAAK,EAAE;AAAA,IACb;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,cAAa,CAAC,SAAkC;AAAA,IACpD,MAAM,QAAgB,CAAC;AAAA,IACvB,WAAW,UAAU,SAAS;AAAA,MAC5B,MAAM,OAAO,MAAM,KAAK,QAAQ,MAAM;AAAA,MACtC,IAAI;AAAA,QAAM,MAAM,KAAK,IAAI;AAAA,IAC3B;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,YAAW,CAAC,SAAkE;AAAA,IAClF,aAAa,IAAI,UAAU,SAAS;AAAA,MAClC,MAAM,KAAK,WAAW,IAAI,IAAI;AAAA,IAChC;AAAA;AAAA,OAGI,YAAW,CAAC,SAAgC;AAAA,IAChD,WAAW,UAAU,SAAS;AAAA,MAC5B,MAAM,KAAK,WAAW,MAAM;AAAA,IAC9B;AAAA;AAAA,OAKI,qBAAoB,CACxB,SACkC;AAAA,IAClC,MAAM,SAAkC,CAAC;AAAA,IACzC,aAAa,SAAS,aAAa,SAAS;AAAA,MAC1C,MAAM,UAAU,MAAM,KAAK,oBAAoB,SAAS,OAAO;AAAA,MAC/D,OAAO,KAAK,EAAE,SAAS,SAAS,QAAQ,CAAC;AAAA,IAC3C;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,sBAAqB,CAAC,UAA6C;AAAA,IACvE,MAAM,MAAc,CAAC;AAAA,IACrB,WAAW,WAAW,UAAU;AAAA,MAC9B,MAAM,KAAK,MAAM,KAAK,qBAAqB,OAAO;AAAA,MAClD,IAAI,KAAK,EAAE;AAAA,IACb;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,sBAAqB,CAAC,UAA2C;AAAA,IACrE,WAAW,WAAW,UAAU;AAAA,MAC9B,MAAM,KAAK,qBAAqB,OAAO;AAAA,IACzC;AAAA;AAAA,OAGI,sBAAqB,CAAC,KAA4B;AAAA,IACtD,WAAW,MAAM,KAAK;AAAA,MACpB,MAAM,KAAK,qBAAqB,EAAE;AAAA,IACpC;AAAA;AAAA,OAGI,8BAA6B,CAAC,SAAmD;AAAA,IACrF,MAAM,MAAc,CAAC;AAAA,IACrB,WAAW,SAAS,SAAS;AAAA,MAC3B,MAAM,KAAK,MAAM,KAAK,4BAA4B,KAAK;AAAA,MACvD,IAAI,KAAK,EAAE;AAAA,IACb;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,8BAA6B,CAAC,SAAiD;AAAA,IAGnF,OAAO,KAAK,aAAa,YAAY;AAAA,MACnC,WAAW,SAAS,SAAS;AAAA,QAC3B,IAAI,CAAC,MAAM;AAAA,UAAI;AAAA,QACf,MAAM,KAAK,GACR,OAAO,qBAAqB,EAC5B,IAAI;AAAA,UACH,UAAU,MAAM,YAAY,CAAC;AAAA,QAC/B,CAAC,EACA,MAAM,wBAAG,sBAAsB,IAAI,MAAM,EAAE,CAAC;AAAA,MACjD;AAAA,KACD;AAAA;AAAA,OAGG,8BAA6B,CAAC,KAA4B;AAAA,IAC9D,WAAW,MAAM,KAAK;AAAA,MACpB,MAAM,KAAK,4BAA4B,EAAE;AAAA,IAC3C;AAAA;AAAA,OAKI,sBAAqB,CACzB,QACmC;AAAA,IACnC,OAAO,KAAK,yBAAyB,EAAE,aAAa,UAAU,CAAC,CAAC;AAAA;AAAA,OAG5D,oBAAmB,CACvB,QACwC;AAAA,IACxC,OAAO,KAAK,yBAAyB,EAAE,WAAW,MAAM;AAAA;AAAA,OAGpD,uBAAsB,CAC1B,QACiC;AAAA,IACjC,OAAO,KAAK,yBAAyB,EAAE,cAAc,MAAM;AAAA;AAAA,OAGvD,uBAAsB,CAAC,QAAwD;AAAA,IACnF,OAAO,KAAK,yBAAyB,EAAE,cAAc,MAAM;AAAA;AAAA,OAGvD,0BAAyB,CAC7B,QAC6C;AAAA,IAC7C,OAAO,KAAK,yBAAyB,EAAE,iBAAiB,MAAM;AAAA;AAAA,OAG1D,iCAAgC,CACpC,QAC8C;AAAA,IAC9C,OAAO,KAAK,yBAAyB,EAAE,iBAAiB,MAAM;AAAA;AAAA,OAG1D,iCAAgC,CACpC,QACqD;AAAA,IACrD,OAAO,KAAK,yBAAyB,EAAE,iBAAiB,MAAM;AAAA;AAAA,OAG1D,mCAAkC,CACtC,QACgD;AAAA,IAChD,OAAO,KAAK,yBAAyB,EAAE,mBAAmB,MAAM;AAAA;AAAA,OAG5D,iCAAgC,CACpC,QAC2C;AAAA,IAC3C,OAAO,KAAK,yBAAyB,EAAE,iBAAiB,MAAM;AAAA;AAAA,OAG1D,gCAA+B,CACnC,SAAgD,CAAC,GACJ;AAAA,IAC7C,OAAO,KAAK,yBAAyB,EAAE,gBAAgB,MAAM;AAAA;AAAA,OAGzD,qBAAoB,CAAC,QAA8D;AAAA,IACvF,OAAO,KAAK,yBAAyB,EAAE,qBAAqB,MAAM;AAAA;AAAA,OAG9D,sBAAqB,CACzB,QACiC;AAAA,IACjC,OAAO,KAAK,yBAAyB,EAAE,sBAAsB,MAAM;AAAA;AAAA,OAG/D,kBAAiB,CAAC,QAAkE;AAAA,IACxF,OAAO,KAAK,yBAAyB,EAAE,kBAAkB,MAAM;AAAA;AAAA,OAG3D,qBAAoB,CAAC,QAAqE;AAAA,IAC9F,OAAO,KAAK,yBAAyB,EAAE,qBAAqB,MAAM;AAAA;AAAA,OAG9D,qBAAoB,CAAC,QAAsD;AAAA,IAC/E,OAAO,KAAK,yBAAyB,EAAE,qBAAqB,MAAM;AAAA;AAEtE;;;ADj6KO,MAAM,0BAA0B,mBAAmB;AAAA,EAC9C,qBAA+C,cAAc;AAAA,EAC/D;AAAA,EAER,WAAW,CACT,SACA,SACA,SACA;AAAA,IACA,MAAM,OAAO;AAAA,IACb,KAAK,UAAU;AAAA,IACf,KAAK,KAAK,QAAQ,YAAY;AAAA;AAAA,EAGhC,UAAU,GAA8B;AAAA,IACtC,OAAO,KAAK;AAAA;AAAA,OAGD,kBAAoB,CAC/B,UACA,UACY;AAAA,IACZ,OAAO,MAAM,KAAK,QAAQ,kBAAkB,UAAU,QAAQ;AAAA;AAAA,OAG1D,eAAc,CAAC,WAA6C;AAAA,IAChE,OAAO,KAAK,iBAAiB,SAAS;AAAA;AAAA,OAGlC,sBAAqB,CAAC,QAA+D;AAAA,IACzF,OAAO,MAAM,sBAAsB,MAAM;AAAA;AAAA,OAGrC,kBAAiB,CAAC,OAAuC;AAAA,IAC7D,MAAM,gBAAgB,MAAM,KAAK,SAAS,KAAK,OAAO;AAAA,IACtD,IAAI,eAAe;AAAA,MACjB,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,WAAkB;AAAA,MACtB,IAAI,KAAK;AAAA,MACT,MAAM,MAAM,QAAQ;AAAA,MACpB,UAAU,MAAM;AAAA,MAChB,KAAM,MAAM,QAAQ,MAAM,GAAG,IACzB,MAAM,MACN,MAAM,MACJ,CAAC,MAAM,GAAG,IACV,CAAC,aAAa;AAAA,MACpB,WAAW,MAAM,aAAa,KAAK,IAAI;AAAA,MACvC,WAAW,MAAM,aAAa,KAAK,IAAI;AAAA,IACzC;AAAA,IAEA,MAAM,KAAK,YAAY,QAAQ;AAAA,IAC/B,MAAM,eAAe,MAAM,KAAK,SAAS,KAAK,OAAO;AAAA,IACrD,IAAI,CAAC,cAAc;AAAA,MACjB,MAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AAAA,IACA,OAAO;AAAA;AAAA,OAGO,aAAe,CAAC,WAAyC;AAAA,IACvE,OAAO,MAAM,KAAK,UAAU,YAAY;AAAA,MACtC,OAAO,MAAM,UAAU;AAAA,KACxB;AAAA;AAAA,OAGG,KAAI,GAAkB;AAAA,IAC1B,qBAAO,MAAM,EAAE,KAAK,aAAa,GAAG,+BAA+B;AAAA;AAAA,OAG/D,QAAO,GAAqB;AAAA,IAChC,OAAO,KAAK,QAAQ,eAAe;AAAA;AAAA,OAG/B,MAAK,GAAkB;AAAA,IAC3B,MAAM,KAAK,QAAQ,MAAM;AAAA;AAAA,OAGrB,cAAa,GAA4B;AAAA,IAC7C,OAAO,KAAK;AAAA;AAAA,EAGd,gBAAgB,GAAS;AAAA,IACvB,OAAO,KAAK,QAAQ,cAAc;AAAA;AAAA,OAG9B,YAAW,CAAC,OAAgC;AAAA,IAChD,OAAO,MAAM,YAAY,KAAK;AAAA;AAAA,EAGhC,QAAQ,CAAC,SAAsC;AAAA,IAC7C,OAAO,MAAM,SAAS,OAAO;AAAA;AAAA,EAG/B,WAAW,CAAC,SAAe,OAAyC;AAAA,IAClE,OAAO,MAAM,YAAY,SAAS,KAAK;AAAA;AAAA,EAGzC,WAAW,CAAC,SAAiC;AAAA,IAC3C,OAAO,MAAM,YAAY,OAAO;AAAA;AAAA,EAGlC,cAAc,CAAC,UAAqC;AAAA,IAClD,OAAO,MAAM,eAAe,QAAQ;AAAA;AAAA,EAGtC,gBAAgB,CAAC,WAAsC;AAAA,IACrD,OAAO,MAAM,iBAAiB,SAAS,EAAE,KAAK,CAAC,WAAW,UAAU,CAAC,CAAC;AAAA;AAAA,EAGxE,YAAY,CAAC,QAA+B;AAAA,IAC1C,OAAO,MAAM,aAAa,MAAM;AAAA;AAAA,EAGlC,YAAY,CAAC,QAAgB,WAAkC;AAAA,IAC7D,OAAO,MAAM,aAAa,QAAQ,SAAS;AAAA;AAAA,EAG7C,aAAa,CAAC,UAAwC;AAAA,IACpD,OAAO,MAAM,cAAc,QAAQ;AAAA;AAAA,EAGrC,YAAY,CAAC,QAA0D;AAAA,IACrE,OAAO,MAAM,aAAa,MAAM;AAAA;AAAA,EAGlC,YAAY,CAAC,UAA+B;AAAA,IAC1C,OAAO,MAAM,aAAa,QAAQ;AAAA;AAAA,EAGpC,eAAe,CAAC,WAAwC;AAAA,IACtD,OAAO,MAAM,gBAAgB,SAAS;AAAA;AAAA,EAGxC,YAAY,CACV,UACA,MACA,SACA,gBAC2B;AAAA,IAC3B,OAAO,MAAM,aAAa,UAAU,MAAM,SAAS,cAAc;AAAA;AAAA,EAGnE,eAAe,CAAC,WAAqC;AAAA,IACnD,OAAO,MAAM,gBAAgB,SAAS;AAAA;AAAA,EAGxC,eAAe,CAAC,aAAkC;AAAA,IAChD,OAAO,MAAM,gBAAgB,WAAW;AAAA;AAE5C;;;AkCpKgD,IAAhD;AACoB,IAApB;AAC6C,IAA7C;AACuD,IAAvD;;;ACHA,IAAM,iCAAiC,IAAI,IAAI,CAAC,UAAU,WAAW,WAAW,CAAC;AAO1E,SAAS,kBAAkB,CAAC,kBAAkC;AAAA,EACnE,IAAI,CAAC,oBAAoB,+CAA+C,KAAK,gBAAgB,GAAG;AAAA,IAC9F,OAAO;AAAA,EACT;AAAA,EAEA,OAAO,iBACJ,QAAQ,yDAAyD,CAAC,OAAO,QAAQ,UAChF,+BAA+B,IAAI,OAAO,KAAK,EAAE,YAAY,CAAC,IAC1D,GAAG,sBACH,KACN,EACC,QACC,wDACA,CAAC,OAAO,UAAU,QAAQ,UACxB,+BAA+B,IAAI,OAAO,KAAK,EAAE,YAAY,CAAC,IAC1D,GAAG,WAAW,sBACd,KACR;AAAA;;;ADlBG,MAAM,0BAA0B;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,eAAqC;AAAA,EACrC,eAAe;AAAA,EAEvB,WAAW,CAAC,kBAA0B,aAAsB;AAAA,IAM1D,MAAM,SAAS,CAAC,KAAa,aAA6B;AAAA,MACxD,MAAM,MAAM,QAAQ,IAAI;AAAA,MACxB,IAAI,QAAQ,aAAa,QAAQ;AAAA,QAAI,OAAO;AAAA,MAC5C,MAAM,IAAI,OAAO,GAAG;AAAA,MACpB,OAAO,OAAO,SAAS,CAAC,KAAK,KAAK,IAAI,IAAI;AAAA;AAAA,IAE5C,MAAM,aAAyB;AAAA,MAC7B,kBAAkB,mBAAmB,gBAAgB;AAAA,MACrD,KAAK,OAAO,qBAAqB,EAAE;AAAA,MACnC,KAAK,OAAO,qBAAqB,CAAC;AAAA,MAClC,mBAAmB,OAAO,iCAAiC,KAAK;AAAA,MAChE,yBAAyB;AAAA,MACzB,WAAW;AAAA,MACX,6BAA6B;AAAA,IAC/B;AAAA,IAEA,IAAI,aAAa;AAAA,MACf,WAAW,mBAAmB;AAAA,MAC9B,qBAAO,MACL,EAAE,KAAK,cAAc,aAAa,YAAY,UAAU,GAAG,CAAC,EAAE,GAC9D,iCACF;AAAA,IACF;AAAA,IAEA,KAAK,OAAO,IAAI,eAAK,UAAU;AAAA,IAE/B,KAAK,KAAK,GAAG,SAAS,CAAC,QAAQ;AAAA,MAC7B,qBAAO,KACL,EAAE,KAAK,cAAc,OAAO,IAAI,WAAW,OAAO,GAAG,EAAE,GACvD,iDACF;AAAA,KACD;AAAA,IAED,KAAK,KAAK,6BAAQ,KAAK,MAAM,EAAE,QAAQ,aAAa,CAAC;AAAA;AAAA,EAGhD,WAAW,GAAmB;AAAA,IACnC,OAAO,KAAK;AAAA;AAAA,EAGP,aAAa,GAAS;AAAA,IAC3B,OAAO,KAAK;AAAA;AAAA,EAGP,cAAc,GAAY;AAAA,IAC/B,OAAO,KAAK,gBAAgB,KAAK,KAAK,UAAU,KAAK,KAAK;AAAA;AAAA,OAG/C,UAAS,GAAwB;AAAA,IAC5C,IAAI,KAAK,eAAe,GAAG;AAAA,MACzB,MAAM,IAAI,MAAM,8DAA8D;AAAA,IAChF;AAAA,IAEA,OAAO,KAAK,KAAK,QAAQ;AAAA;AAAA,OAGd,eAAc,GAAqB;AAAA,IAC9C,IAAI,SAA4B;AAAA,IAChC,IAAI;AAAA,MACF,IAAI,KAAK,eAAe,GAAG;AAAA,QACzB,OAAO;AAAA,MACT;AAAA,MAEA,SAAS,MAAM,KAAK,KAAK,QAAQ;AAAA,MACjC,MAAM,OAAO,MAAM,UAAU;AAAA,MAC7B,OAAO;AAAA,MACP,OAAO,OAAO;AAAA,MACd,qBAAO,MACL;AAAA,QACE,KAAK;AAAA,QACL,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,GACA,mCACF;AAAA,MACA,OAAO;AAAA,cACP;AAAA,MACA,IAAI,QAAQ;AAAA,QACV,OAAO,QAAQ;AAAA,MACjB;AAAA;AAAA;AAAA,OAIS,kBAAoB,CAC/B,UACA,UACY;AAAA,IACZ,IAAI,KAAK,eAAe,GAAG;AAAA,MACzB,MAAM,IAAI,MAAM,qDAAqD;AAAA,IACvE;AAAA,IAEA,MAAM,uBAAuB,QAAQ,IAAI,0BAA0B;AAAA,IAEnE,OAAO,MAAM,KAAK,GAAG,YAAY,OAAO,OAAO;AAAA,MAC7C,IAAI,wBAAwB,UAAU;AAAA,QACpC,IAAI,CAAC,2BAAa,QAAQ,GAAG;AAAA,UAC3B,MAAM,IAAI,MAAM,2CAA2C,UAAU;AAAA,QACvE;AAAA,QAEA,IAAI;AAAA,UAKF,MAAM,GAAG,QAAQ,8DAAyC,iBAAiB;AAAA,UAC3E,qBAAO,MAAM,wCAAwC,UAAU;AAAA,UAC/D,OAAO,OAAO;AAAA,UACd,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC1E,qBAAO,MACL,EAAE,OAAO,SAAS,GAClB,kDAAkD,cACpD;AAAA,UACA,MAAM;AAAA;AAAA,MAEV,EAAO,SAAI,CAAC,sBAAsB,CAClC,EAAO;AAAA,QACL,qBAAO,MAAM,2DAA2D;AAAA;AAAA,MAG1E,OAAO,MAAM,SAAS,EAAE;AAAA,KACzB;AAAA;AAAA,OAGU,MAAK,GAAkB;AAAA,IAClC,IAAI,KAAK,cAAc;AAAA,MACrB,OAAO,KAAK;AAAA,IACd;AAAA,IAEA,KAAK,eAAe;AAAA,IACpB,IAAI,KAAK,KAAK,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,IAEA,KAAK,eAAe,KAAK,KAAK,IAAI,EAAE,QAAQ,MAAM;AAAA,MAChD,KAAK,eAAe;AAAA,KACrB;AAAA,IAED,OAAO,KAAK;AAAA;AAEhB;;;AEhJO,IAXP;AAY6C,IAA7C;AAKO,MAAM,8BAA8B,mBAAmB;AAAA,EACpD;AAAA,EACE,qBAA+C,cAAc;AAAA,EAEvE,WAAW,CAAC,SAAe,SAA8B;AAAA,IACvD,MAAM,OAAO;AAAA,IACb,KAAK,UAAU;AAAA,IAKf,MAAM,gBAAgB;AAAA,IACtB,KAAK,KAAK,cAAc,KAAK,QAAQ,cAAc,CAAC;AAAA;AAAA,OAGzC,kBAAoB,CAC/B,WACA,UACY;AAAA,IACZ,OAAO,KAAK,GAAG,YAAY,QAAQ;AAAA;AAAA,OAG/B,eAAc,CAAC,WAA6C;AAAA,IAChE,OAAO,KAAK,iBAAiB,SAAS;AAAA;AAAA,OAGlC,sBAAqB,CAAC,QAA+D;AAAA,IACzF,OAAO,MAAM,sBAAsB,MAAM;AAAA;AAAA,OAGrC,kBAAiB,CAAC,OAAuC;AAAA,IAC7D,MAAM,gBAAgB,MAAM,KAAK,SAAS,KAAK,OAAO;AAAA,IACtD,IAAI,eAAe;AAAA,MACjB,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,WAAkB;AAAA,MACtB,IAAI,KAAK;AAAA,MACT,MAAM,MAAM,QAAQ;AAAA,MACpB,UAAU,MAAM;AAAA,MAChB,KAAM,MAAM,QAAQ,MAAM,GAAG,IACzB,MAAM,MACN,MAAM,MACJ,CAAC,MAAM,GAAG,IACV,CAAC,aAAa;AAAA,MACpB,WAAW,MAAM,aAAa,KAAK,IAAI;AAAA,MACvC,WAAW,MAAM,aAAa,KAAK,IAAI;AAAA,IACzC;AAAA,IAEA,MAAM,KAAK,YAAY,QAAQ;AAAA,IAC/B,MAAM,eAAe,MAAM,KAAK,SAAS,KAAK,OAAO;AAAA,IACrD,IAAI,CAAC,cAAc;AAAA,MACjB,MAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AAAA,IACA,OAAO;AAAA;AAAA,OAGO,aAAe,CAAC,WAAyC;AAAA,IACvE,IAAI,KAAK,QAAQ,eAAe,GAAG;AAAA,MACjC,MAAM,QAAQ,IAAI,MAAM,gDAAgD;AAAA,MACxE,qBAAO,KACL,EAAE,KAAK,cAAc,OAAO,MAAM,QAAQ,GAC1C,6CACF;AAAA,MACA,MAAM;AAAA,IACR;AAAA,IACA,MAAM,kBAAkB,KAAK;AAAA,IAI7B,MAAM,gBAAgB,WAAW;AAAA,IAIjC,MAAM,gBAAgB,aAAa;AAAA,IACnC,IAAI,KAAK,QAAQ,eAAe,GAAG;AAAA,MACjC,MAAM,QAAQ,IAAI,MAAM,gDAAgD;AAAA,MACxE,qBAAO,KACL,EAAE,KAAK,cAAc,OAAO,MAAM,QAAQ,GAC1C,6CACF;AAAA,MACA,MAAM;AAAA,IACR;AAAA,IACA,OAAO,UAAU;AAAA;AAAA,OAGb,KAAI,GAAkB;AAAA,IAC1B,MAAM,kBAAkB,KAAK;AAAA,IAG7B,MAAM,gBAAgB,WAAW;AAAA,IACjC,qBAAO,MAAM,EAAE,KAAK,aAAa,GAAG,mCAAmC;AAAA;AAAA,OAGnE,QAAO,GAAqB;AAAA,IAChC,MAAM,mBAAmB,KAAK;AAAA,IAG9B,OAAO,CAAC,KAAK,QAAQ,eAAe,KAAK,iBAAiB,cAAc,MAAM;AAAA;AAAA,OAG1E,MAAK,GAAG;AAAA,IACZ,MAAM,KAAK,QAAQ,MAAM;AAAA;AAAA,OAGrB,cAAa,GAA4B;AAAA,IAC7C,MAAM,kBAAkB,KAAK;AAAA,IAG7B,MAAM,gBAAgB,WAAW;AAAA,IACjC,OAAO,KAAK;AAAA;AAAA,EAGd,gBAAgB,GAAW;AAAA,IACzB,OAAO,KAAK,QAAQ,cAAc;AAAA;AAAA,OAS9B,YAAW,CAAC,OAAgC;AAAA,IAChD,MAAM,KAAK,MAAM,MAAM,YAAY,KAAK;AAAA,IACxC,IAAI,MAAM,MAAM,IAAI;AAAA,MAClB,KAAK,QAAQ,YAAY,UAAU,UAAU,KAAK,OAAO,IAAI,MAAM,GAAG,CAGrE;AAAA,IACH;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,YAAW,CAAC,SAAe,OAAyC;AAAA,IACxE,MAAM,KAAK,MAAM,MAAM,YAAY,SAAS,KAAK;AAAA,IACjD,IAAI,IAAI;AAAA,MACN,KAAK,QAAQ,YAAY,UAAU,UAAU,KAAK,OAAO,IAAI,QAAQ,CAGpE;AAAA,IACH;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,YAAW,CAAC,SAAiC;AAAA,IACjD,MAAM,KAAK,MAAM,MAAM,YAAY,OAAO;AAAA,IAC1C,IAAI,IAAI;AAAA,MACN,KAAK,QAAQ,YAAY,UAAU,UAAU,EAAE,IAAI,QAAQ,CAAC;AAAA,IAC9D;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,aAAY,CAAC,UAAoC;AAAA,IACrD,MAAM,KAAK,MAAM,MAAM,aAAa,QAAQ;AAAA,IAC5C,IAAI,IAAI;AAAA,MACN,WAAW,MAAM,UAAU;AAAA,QACzB,KAAK,QAAQ,YAAY,UAAU,UAAU,EAAE,GAAG,CAAC;AAAA,MACrD;AAAA,IACF;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,eAAc,CAAC,UAAqC;AAAA,IACxD,MAAM,MAAM,MAAM,MAAM,eAAe,QAAQ;AAAA,IAC/C,SAAS,IAAI,EAAG,IAAI,SAAS,UAAU,IAAI,IAAI,QAAQ,KAAK;AAAA,MAC1D,KAAK,QAAQ,YAAY,YAAY,UAAU,KAAK,SAAS,IAAI,IAAI,IAAI,GAAG,CAG3E;AAAA,IACH;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,aAAY,CAAC,QAA+B;AAAA,IAChD,MAAM,MAAM,aAAa,MAAM;AAAA,IAC/B,IAAI,OAAO,IAAI;AAAA,MACb,KAAK,QAAQ,YAAY,YAAY,UAAU,KAAK,QAAQ,IAAI,OAAO,GAAG,CAGzE;AAAA,IACH;AAAA;AAAA,OAGI,aAAY,CAAC,UAA+B;AAAA,IAChD,MAAM,MAAM,aAAa,QAAQ;AAAA,IACjC,KAAK,QAAQ,YAAY,YAAY,UAAU,EAAE,IAAI,SAAS,CAAC;AAAA;AAAA,OAG3D,YAAW,CAAC,OAA6B;AAAA,IAC7C,MAAM,KAAK,MAAM,MAAM,YAAY,KAAK;AAAA,IACxC,KAAK,QAAQ,YAAY,UAAU,UAAU,KAAK,OAAO,GAAG,CAA4B;AAAA,IACxF,OAAO;AAAA;AAAA,OAGH,YAAW,CAAC,OAA6B;AAAA,IAC7C,MAAM,MAAM,YAAY,KAAK;AAAA,IAC7B,IAAI,MAAM,IAAI;AAAA,MACZ,KAAK,QAAQ,YAAY,UAAU,UAAU,KAAK,OAAO,IAAI,MAAM,GAAG,CAGrE;AAAA,IACH;AAAA;AAAA,OAGI,YAAW,CAAC,IAAyB;AAAA,IACzC,MAAM,MAAM,YAAY,EAAE;AAAA,IAC1B,KAAK,QAAQ,YAAY,UAAU,UAAU,EAAE,GAAG,CAAC;AAAA;AAAA,OAG/C,YAAW,CAAC,OAAgC;AAAA,IAChD,MAAM,MAAM,MAAM,MAAM,YAAY,KAAK;AAAA,IACzC,SAAS,IAAI,EAAG,IAAI,MAAM,UAAU,IAAI,IAAI,QAAQ,KAAK;AAAA,MACvD,KAAK,QAAQ,YAAY,SAAS,UAAU,KAAK,MAAM,IAAI,IAAI,IAAI,GAAG,CAGrE;AAAA,IACH;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,WAAU,CAAC,MAA2B;AAAA,IAC1C,MAAM,MAAM,WAAW,IAAI;AAAA,IAC3B,KAAK,QAAQ,YAAY,SAAS,UAAU,KAAK,MAAM,IAAI,KAAK,GAAG,CAGlE;AAAA;AAAA,OAGG,WAAU,CAAC,QAA6B;AAAA,IAC5C,MAAM,MAAM,WAAW,MAAM;AAAA,IAC7B,KAAK,QAAQ,YAAY,SAAS,UAAU,EAAE,IAAI,OAAO,CAAC;AAAA;AAAA,OAGtD,eAAc,CAAC,UAAgB,QAAgC;AAAA,IACnE,MAAM,KAAK,MAAM,MAAM,eAAe,UAAU,MAAM;AAAA,IACtD,IAAI,IAAI;AAAA,MAGN,IAAI,gBAA+B;AAAA,MACnC,IAAI;AAAA,QACF,MAAM,SAAS,MAAM,KAAK,QACvB,cAAc,EACd,MACC,wHACA,CAAC,UAAU,QAAQ,KAAK,OAAO,CACjC;AAAA,QACF,MAAM,OAAO,OAAO;AAAA,QACpB,gBAAgB,KAAK,IAAI,MAAM;AAAA,QAC/B,OAAO,KAAK;AAAA,QACZ,qBAAO,MACL,EAAE,KAAK,cAAc,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,GAC7E,iDACF;AAAA;AAAA,MAEF,IAAI,eAAe;AAAA,QACjB,KAAK,QAAQ,YAAY,gBAAgB,UAAU;AAAA,UACjD,IAAI;AAAA,UACJ,WAAW;AAAA,UACX,SAAS;AAAA,UACT,UAAU,KAAK;AAAA,QACjB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,kBAAiB,CAAC,UAAgB,QAAgC;AAAA,IACtE,MAAM,KAAK,MAAM,MAAM,kBAAkB,UAAU,MAAM;AAAA,IACzD,IAAI,IAAI;AAAA,MACN,KAAK,QAAQ,YAAY,gBAAgB,UAAU,EAAE,WAAW,UAAU,SAAS,OAAO,CAAC;AAAA,IAC7F;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,aAAY,CAChB,QACA,WACe;AAAA,IACf,MAAM,KAAK,MAAM,MAAM,aAAa,QAAQ,SAAS;AAAA,IAIrD,KAAK,QAAQ,YAAY,YAAY,UAAU,KAAK,QAAQ,GAAG,CAA4B;AAAA,IAC3F,OAAO;AAAA;AAAA,OAGH,aAAY,CAChB,QACkB;AAAA,IAClB,MAAM,KAAK,MAAM,MAAM,aAAa,MAAM;AAAA,IAC1C,IAAI,IAAI;AAAA,MACN,KAAK,QAAQ,YAAY,YAAY,UAAU,KAAK,QAAQ,IAAI,OAAO,GAAG,CAGzE;AAAA,IACH;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,aAAY,CAAC,UAA+B;AAAA,IAChD,MAAM,MAAM,aAAa,QAAQ;AAAA,IACjC,KAAK,QAAQ,YAAY,YAAY,UAAU,EAAE,IAAI,SAAS,CAAC;AAAA;AAAA,OAG3D,mBAAkB,CAAC,WAAkC;AAAA,IACzD,MAAM,MAAM,mBAAmB,SAAS;AAAA,IACxC,WAAW,MAAM,WAAW;AAAA,MAC1B,KAAK,QAAQ,YAAY,YAAY,UAAU,EAAE,GAAG,CAAC;AAAA,IACvD;AAAA;AAAA,OAKI,kBAAiB,CAAC,iBAAgC,WAAkC;AAAA,IAGxF,MAAM,UAAU,MAAM,QAAQ,eAAe,IAAI,kBAAkB,CAAC,eAAe;AAAA,IACnF,IAAI,aAAuB,CAAC;AAAA,IAC5B,IAAI,QAAQ,SAAS,GAAG;AAAA,MACtB,IAAI;AAAA,QACF,MAAM,SAAS,MAAM,KAAK,QACvB,cAAc,EACd,MACC,2FACA,CAAC,SAAS,WAAW,KAAK,OAAO,CACnC;AAAA,QACF,aAAc,OAAO,KAA+B,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,QACnE,OAAO,KAAK;AAAA,QACZ,qBAAO,MACL,EAAE,KAAK,cAAc,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,GAC7E,qDACF;AAAA;AAAA,IAEJ;AAAA,IACA,MAAM,MAAM,kBAAkB,iBAA0B,SAAS;AAAA,IACjE,WAAW,MAAM,YAAY;AAAA,MAC3B,KAAK,QAAQ,YAAY,YAAY,UAAU,EAAE,GAAG,CAAC;AAAA,IACvD;AAAA;AAAA,OAGI,mBAAkB,CAAC,QAKJ;AAAA,IACnB,MAAM,KAAK,MAAM,MAAM,mBAAmB,MAAM;AAAA,IAChD,IAAI,IAAI;AAAA,MAGN,IAAI,iBAAgC;AAAA,MACpC,IAAI;AAAA,QACF,MAAM,SAAS,MAAM,KAAK,QACvB,cAAc,EACd,MACC,yIACA,CAAC,OAAO,gBAAgB,OAAO,gBAAgB,KAAK,OAAO,CAC7D;AAAA,QACF,MAAM,OAAO,OAAO;AAAA,QACpB,iBAAiB,KAAK,IAAI,MAAM;AAAA,QAChC,OAAO,KAAK;AAAA,QACZ,qBAAO,MACL,EAAE,KAAK,cAAc,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,GAC7E,kDACF;AAAA;AAAA,MAEF,IAAI,gBAAgB;AAAA,QAClB,KAAK,QAAQ,YAAY,iBAAiB,UAAU;AAAA,UAClD,IAAI;AAAA,UACJ,kBAAkB,OAAO;AAAA,UACzB,kBAAkB,OAAO;AAAA,UACzB,UAAU,KAAK;AAAA,UACf,MAAM,OAAO,QAAQ,CAAC;AAAA,UACtB,UAAU,OAAO,YAAY,CAAC;AAAA,QAChC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,mBAAkB,CAAC,cAA2C;AAAA,IAClE,MAAM,MAAM,mBAAmB,YAAY;AAAA,IAC3C,KAAK,QAAQ,YAAY,iBAAiB,UAAU;AAAA,SAC/C;AAAA,MACH,IAAI,aAAa;AAAA,IACnB,CAA4B;AAAA;AAAA,OAGxB,oBAAmB,CAAC,iBAAwC;AAAA,IAChE,MAAM,MAAM,oBAAoB,eAAe;AAAA,IAC/C,WAAW,MAAM,iBAAiB;AAAA,MAChC,KAAK,QAAQ,YAAY,iBAAiB,UAAU,EAAE,GAAG,CAAC;AAAA,IAC5D;AAAA;AAAA,OAGI,WAAU,CAAC,MAA2B;AAAA,IAC1C,MAAM,KAAK,MAAM,MAAM,WAAW,IAAI;AAAA,IACtC,KAAK,QAAQ,YAAY,SAAS,UAAU,KAAK,MAAM,GAAG,CAA4B;AAAA,IACtF,OAAO;AAAA;AAAA,OAGH,WAAU,CAAC,IAAU,MAAoC;AAAA,IAC7D,MAAM,MAAM,WAAW,IAAI,IAAI;AAAA,IAC/B,KAAK,QAAQ,YAAY,SAAS,UAAU,KAAK,MAAM,GAAG,CAA4B;AAAA;AAAA,OAGlF,WAAU,CAAC,IAAyB;AAAA,IACxC,MAAM,MAAM,WAAW,EAAE;AAAA,IACzB,KAAK,QAAQ,YAAY,SAAS,UAAU,EAAE,GAAG,CAAC;AAAA;AAEtD;;;ACraO,IARP;AAS2C,IAA3C;AAC8B,IAA9B;AACqB,IAArB;AACuB,IAAvB;;;ACZA,IAAI,aAAY,OAAO;AACvB,IAAI,aAAa,OAAO;AACxB,IAAI,oBAAoB,OAAO;AAC/B,IAAI,sBAAsB,OAAO;AACjC,IAAI,gBAAe,OAAO,UAAU;AACpC,IAAI,eAAe,OAAO,UAAU;AACpC,IAAI,cAAc,CAAC,QAAQ;AAAA,EACzB,MAAM,UAAU,GAAG;AAAA;AAErB,IAAI,kBAAkB,CAAC,KAAK,KAAK,WAAU,OAAO,OAAM,WAAU,KAAK,KAAK,EAAE,YAAY,MAAM,cAAc,MAAM,UAAU,MAAM,MAAM,CAAC,IAAI,IAAI,OAAO;AAC1J,IAAI,iBAAiB,CAAC,GAAG,MAAM;AAAA,EAC7B,SAAS,QAAQ,MAAM,IAAI,CAAC;AAAA,IAC1B,IAAI,cAAa,KAAK,GAAG,IAAI;AAAA,MAC3B,gBAAgB,GAAG,MAAM,EAAE,KAAK;AAAA,EACpC,IAAI;AAAA,IACF,SAAS,QAAQ,oBAAoB,CAAC,GAAG;AAAA,MACvC,IAAI,aAAa,KAAK,GAAG,IAAI;AAAA,QAC3B,gBAAgB,GAAG,MAAM,EAAE,KAAK;AAAA,IACpC;AAAA,EACF,OAAO;AAAA;AAET,IAAI,gBAAgB,CAAC,GAAG,MAAM,WAAW,GAAG,kBAAkB,CAAC,CAAC;AAChE,IAAI,YAAY,CAAC,QAAQ,YAAY;AAAA,EACnC,IAAI,SAAS,CAAC;AAAA,EACd,SAAS,QAAQ;AAAA,IACf,IAAI,cAAa,KAAK,QAAQ,IAAI,KAAK,QAAQ,QAAQ,IAAI,IAAI;AAAA,MAC7D,OAAO,QAAQ,OAAO;AAAA,EAC1B,IAAI,UAAU,QAAQ;AAAA,IACpB,SAAS,QAAQ,oBAAoB,MAAM,GAAG;AAAA,MAC5C,IAAI,QAAQ,QAAQ,IAAI,IAAI,KAAK,aAAa,KAAK,QAAQ,IAAI;AAAA,QAC7D,OAAO,QAAQ,OAAO;AAAA,IAC1B;AAAA,EACF,OAAO;AAAA;AAET,IAAI,gBAAgB,CAAC,KAAK,QAAQ,QAAQ,OAAO,IAAI,GAAG,KAAK,YAAY,YAAY,GAAG;AACxF,IAAI,eAAe,CAAC,KAAK,QAAQ,YAAY,cAAc,KAAK,QAAQ,yBAAyB,GAAG,SAAS,OAAO,KAAK,GAAG,IAAI,OAAO,IAAI,GAAG;AAC9I,IAAI,eAAe,CAAC,KAAK,QAAQ,UAAU,OAAO,IAAI,GAAG,IAAI,YAAY,mDAAmD,IAAI,kBAAkB,UAAU,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,KAAK,KAAK;AACnM,IAAI,eAAe,CAAC,KAAK,QAAQ,OAAO,YAAY,cAAc,KAAK,QAAQ,wBAAwB,GAAG,SAAS,OAAO,KAAK,KAAK,KAAK,IAAI,OAAO,IAAI,KAAK,KAAK,GAAG;AACrK,IAAI,kBAAkB,CAAC,KAAK,QAAQ,YAAY,cAAc,KAAK,QAAQ,uBAAuB,GAAG;AACrG,IAAI,mBAAmB,CAAC,KAAK,QAAQ,QAAQ,YAAY;AAAA,MACnD,CAAC,CAAC,OAAO;AAAA,IACX,aAAa,KAAK,QAAQ,OAAO,MAAM;AAAA;AAAA,MAErC,CAAC,GAAG;AAAA,IACN,OAAO,aAAa,KAAK,QAAQ,MAAM;AAAA;AAE3C;AAGA,IAAI,aAAa,MAAM,oBAAoB,MAAM;AAAA,EAC/C,WAAW,CAAC,QAAQ,QAAM,MAAM,SAAS,KAAK,SAAS;AAAA,IACrD,MACE,WAAW,cAAc,aAAa,QAAQ,UAAQ,OAAO,SAAO,KAAK,UAAU,IAAI,GACzF;AAAA,IACA,KAAK,MAAM;AAAA,IACX,KAAK,OAAO;AAAA,IACZ,KAAK,SAAS;AAAA,IACd,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA,IACZ,KAAK,UAAU;AAAA;AAAA,cAEJ,aAAY,CAAC,UAAU,KAAK;AAAA,IACvC,MAAM,SAAS,SAAS;AAAA,IACxB,MAAM,UAAU,OAAO,YAAY,CAAC,GAAG,SAAS,QAAQ,QAAQ,CAAC,CAAC;AAAA,IAClE,IAAI,SAAY;AAAA,IAChB,IAAI,OAAY;AAAA,IAChB,MAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AAAA,IACvD,IAAI,CAAC,SAAS,UAAU;AAAA,MACtB,IAAI,eAAe,YAAY,SAAS,kBAAkB,GAAG;AAAA,QAC3D,OAAO,MAAM,SAAS,KAAK;AAAA,MAC7B,EAAO;AAAA,QACL,SAAO,MAAM,SAAS,KAAK;AAAA;AAAA,IAE/B;AAAA,IACA,OAAO,IAAI,YAAY,QAAQ,QAAM,MAAM,SAAS,GAAG;AAAA;AAE3D;AACA,IAAI,yBAAyB,cAAc,MAAM;AAAA,EAC/C,WAAW,GAAG;AAAA,IACZ,MAAM,4BAA4B;AAAA,IAClC,KAAK,OAAO;AAAA;AAEhB;AACA,IAAI,uBAAuB,cAAc,MAAM;AAAA,EAC7C,WAAW,GAAG;AAAA,IACZ,MAAM,uDAAuD;AAAA,IAC7D,KAAK,OAAO;AAAA;AAEhB;AACA,IAAI,qBAAqB,cAAc,MAAM;AAAA,EAC3C,WAAW,GAAG;AAAA,IACZ,MAAM,+DAA+D;AAAA,IACrE,KAAK,OAAO;AAAA;AAEhB;AACA,IAAI,0BAA0B,cAAc,MAAM;AAAA,EAChD,WAAW,GAAG;AAAA,IACZ,MACE,2EACF;AAAA,IACA,KAAK,OAAO;AAAA;AAEhB;AACA,IAAI,qBAAqB,cAAc,MAAM;AAAA,EAC3C,WAAW,CAAC,gBAAgB;AAAA,IAC1B,MACE,kEAAkE,eAAe,KAAK,IAAI,GAC5F;AAAA,IACA,KAAK,OAAO;AAAA;AAEhB;AACA,IAAI,uBAAuB,cAAc,MAAM;AAAA,EAC7C,WAAW,CAAC,YAAY;AAAA,IACtB,MAAM,WAAW,cAAc,OAAO,aAAa,uCAAuC;AAAA,IAC1F,KAAK,OAAO;AAAA;AAEhB;AACA,IAAI,sBAAsB,cAAc,MAAM;AAAA,EAC5C,WAAW,CAAC,KAAK,gBAAgB;AAAA,IAC/B,IAAI,MAAM,yCAAyC;AAAA;AAAA,IAEnD,eAAe,QAAQ,CAAC,MAAM;AAAA,MAC5B,OAAO,KAAK;AAAA;AAAA,KAEb;AAAA,IACD,OAAO;AAAA;AAAA,IAEP,OAAO;AAAA;AAAA,IAEP,MAAM,GAAG;AAAA;AAEb;AACA,IAAI,kBAAkB,cAAc,MAAM;AAAA,EACxC,WAAW,CAAC,SAAS;AAAA,IACnB,MAAM,OAAO;AAAA,IACb,KAAK,OAAO;AAAA;AAEhB;AAGA,IAAI,cAAc,CAAC,UAAU,OAAO,KAAK;AACzC,IAAI,YAAY,CAAC,UAAU,UAAU,UAAU,UAAU;AACzD,IAAI,cAAc,CAAC,UAAU,OAAO,KAAK;AACzC,IAAI,YAAY,CAAC,UAAU,KAAK,MAAM,KAAK;AAC3C,IAAI,iBAAiB,CAAC,MAAM;AAC5B,IAAI,gBAAgB;AAAA,EAClB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AACT;AACA,SAAS,aAAa,CAAC,OAAO,QAAQ;AAAA,EACpC,IAAI,IAAI;AAAA,EACR,IAAI,OAAO;AAAA,EACX,IAAI,MAAM;AAAA,EACV,IAAI,SAAS;AAAA,EACb,IAAI,OAAO;AAAA,EACX,IAAI,IAAS;AAAA,EACb,SAAS,YAAY,CAAC,GAAG,OAAO,KAAK;AAAA,IACnC,IAAI,MAAM,EAAE,MAAM,OAAO,GAAG;AAAA,IAC5B,MAAM,QAAQ,SAAS,OAAO;AAAA,IAC9B,OAAO,SAAS,OAAO,GAAG,IAAI;AAAA;AAAA,EAEhC,SAAS,IAAI,CAAC,GAAG;AAAA,IACf,MAAM,KAAK,CAAC;AAAA,IACZ,MAAO,IAAI,EAAE,QAAQ,KAAK;AAAA,MACxB,OAAO,EAAE;AAAA,MACT,IAAI,QAAQ;AAAA,QACV,IAAI,SAAS,MAAM;AAAA,UACjB,OAAO,EAAE,EAAE;AAAA,QACb,EAAO,SAAI,SAAS,KAAK;AAAA,UACvB,GAAG,KAAK,SAAS,OAAO,GAAG,IAAI,GAAG;AAAA,UAClC,MAAM;AAAA,UACN,SAAS,EAAE,IAAI,OAAO;AAAA,UACtB,OAAO,IAAI;AAAA,QACb,EAAO;AAAA,UACL,OAAO;AAAA;AAAA,MAEX,EAAO,SAAI,SAAS,KAAK;AAAA,QACvB,SAAS;AAAA,MACX,EAAO,SAAI,SAAS,KAAK;AAAA,QACvB,OAAO,EAAE;AAAA,QACT,GAAG,KAAK,KAAK,CAAC,CAAC;AAAA,MACjB,EAAO,SAAI,SAAS,KAAK;AAAA,QACvB,SAAS;AAAA,QACT,OAAO,KAAK,GAAG,KAAK,aAAa,GAAG,MAAM,CAAC,CAAC;AAAA,QAC5C,OAAO,IAAI;AAAA,QACX;AAAA,MACF,EAAO,SAAI,SAAS,OAAO,MAAM,OAAO,MAAM,KAAK;AAAA,QACjD,GAAG,KAAK,aAAa,GAAG,MAAM,CAAC,CAAC;AAAA,QAChC,OAAO,IAAI;AAAA,MACb;AAAA,MACA,IAAI;AAAA,IACN;AAAA,IACA,OAAO,KAAK,GAAG,KAAK,GAAG,KAAK,aAAa,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC;AAAA,IACzD,OAAO;AAAA;AAAA,EAET,OAAO,KAAK,KAAK,EAAE;AAAA;AAErB,IAAI,gBAAgB,MAAM;AAAA,EACxB,WAAW,CAAC,QAAQ,aAAa;AAAA,IAC/B,KAAK,SAAS,eAAe,eAAe,CAAC,GAAG,aAAa,GAAG,MAAM;AAAA,IACtE,KAAK,cAAc;AAAA;AAAA,EAErB,KAAK,CAAC,UAAU,QAAQ;AAAA,IACtB,OAAO,KAAK,MAAM,UAAU,CAAC,KAAK,UAAU;AAAA,MAC1C,KAAK,QAAQ,WAAW,QAAQ,gBAAgB,OAAO,UAAU,YAAY,UAAU,MAAM;AAAA,QAC3F,OAAO,KAAK,sBAAsB,OAAO,MAAM;AAAA,MACjD;AAAA,MACA,OAAO;AAAA,KACR;AAAA;AAAA,EAMH,iBAAiB,CAAC,UAAU,QAAQ;AAAA,IAClC,OAAO,SAAS,IAAI,CAAC,YAAY;AAAA,MAC/B,MAAM,MAAM;AAAA,MACZ,IAAI,IAAI,SAAS,OAAO,IAAI,UAAU,YAAY,IAAI,UAAU,MAAM;AAAA,QACpE,IAAI,QAAQ,KAAK,sBAAsB,IAAI,OAAO,MAAM;AAAA,MAC1D;AAAA,MACA,IAAI,IAAI,aAAa,OAAO,IAAI,cAAc,YAAY,IAAI,cAAc,MAAM;AAAA,QAChF,IAAI,YAAY,KAAK,sBAAsB,IAAI,WAAW,MAAM;AAAA,MAClE;AAAA,MACA,OAAO;AAAA,KACR;AAAA;AAAA,EAKH,qBAAqB,CAAC,OAAO,QAAQ;AAAA,IACnC,MAAM,MAAM;AAAA,IACZ,OAAO,KAAK,GAAG,EAAE,QAAQ,CAAC,QAAQ;AAAA,MAChC,IAAI,OAAO,KAAK,SAAS,KAAK,IAAI,MAAM,MAAM;AAAA,KAC/C;AAAA,IACD,OAAO,KAAK,cAAc,KAAK,YAAY,GAAG,IAAI;AAAA;AAAA,EAGpD,QAAQ,CAAC,KAAK,OAAO,QAAQ;AAAA,IAC3B,IAAI;AAAA,IACJ,MAAM,aAAa,OAAO;AAAA,IAC1B,IAAI,CAAC,YAAY;AAAA,MACf,OAAO;AAAA,IACT;AAAA,IACA,MAAM,KAAK,cAAc,MAAM,KAAK,MAAM,eAAe,IAAI,iBAAiB,UAAU,IAAI,CAAC,QAAQ,MAAM,CAAC;AAAA,IAC5G,MAAM,cAAc,KAAK,KAAK,OAAO,SAAS,OAAO,KAAK;AAAA,IAC1D,MAAM,SAAS,mBAAmB,YAAY,YAAY,GAAG;AAAA,IAC7D,IAAI,cAAc,aAAa,GAAG;AAAA,MAChC,MAAM,wBAAwB,mBAC5B,CAAC,QAAQ,MAAM,cAAc,QAAQ,MAAM,GAC3C,YACA,GACF;AAAA,MACA,OAAO,sBAAsB,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,OAAO,OAAO,cAAc;AAAA;AAEvC;AACA,SAAS,kBAAkB,CAAC,QAAQ,YAAY,YAAY;AAAA,EAC1D,IAAI;AAAA,EACJ,MAAM,aAAa,GAAG,KAAK,WAAW,aAAa,OAAO,KAAK;AAAA,EAC/D,OAAO,CAAC,UAAU;AAAA,IAChB,IAAI,UAAU,MAAM;AAAA,MAClB,IAAI,CAAC,YAAY;AAAA,QACf,MAAM,IAAI,qBAAqB,cAAc,OAAO,aAAa,SAAS;AAAA,MAC5E;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IACA,OAAO,OAAO,OAAO,UAAU;AAAA;AAAA;AAKnC,SAAS,eAAe,CAAC,YAAY;AAAA,EACnC,MAAM,UAAU,WAAW,QAAQ,MAAM,IAAI;AAAA,EAC7C,OAAO,IAAI;AAAA;AAqCb,SAAS,iBAAiB,CAAC,aAAa,QAAQ;AAAA,EAC9C,IAAI,CAAC,eAAe,CAAC;AAAA,IAAQ,OAAO,eAAe,OAAO,cAAc;AAAA,EACxE,MAAM,8BAA8B,IAAI,IAAI;AAAA,IAC1C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EACD,MAAM,eAAe,CAAC;AAAA,EACtB,IAAI,MAAM;AAAA,EACV,OAAO,MAAM,YAAY,QAAQ;AAAA,IAC/B,MAAM,KAAK,YAAY;AAAA,IACvB,IAAI,OAAO,OAAO,OAAO,KAAK;AAAA,MAC5B,MAAM,QAAQ;AAAA,MACd,MAAM,YAAY;AAAA,MAClB;AAAA,MACA,OAAO,MAAM,YAAY,QAAQ;AAAA,QAC/B,IAAI,YAAY,SAAS,WAAW;AAAA,UAClC,IAAI,YAAY,MAAM,OAAO,WAAW;AAAA,YACtC,OAAO;AAAA,UACT,EAAO;AAAA,YACL;AAAA,YACA;AAAA;AAAA,QAEJ,EAAO;AAAA,UACL;AAAA;AAAA,MAEJ;AAAA,MACA,aAAa,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;AAAA,IACvC,EAAO;AAAA,MACL;AAAA;AAAA,EAEJ;AAAA,EACA,MAAM,mBAAmB,CAAC,SAAS;AAAA,IACjC,OAAO,aAAa,KAAK,CAAC,UAAU,QAAQ,MAAM,SAAS,OAAO,MAAM,GAAG;AAAA;AAAA,EAE7E,MAAM,oBAAoB,IAAI,OAAO,6DAA6D,GAAG;AAAA,EACrG,OAAO,YAAY,QAAQ,mBAAmB,CAAC,OAAO,KAAK,WAAW;AAAA,IACpE,IAAI,iBAAiB,MAAM,GAAG;AAAA,MAC5B,OAAO;AAAA,IACT;AAAA,IACA,IAAI,YAAY,IAAI,MAAM,YAAY,CAAC,GAAG;AAAA,MACxC,OAAO;AAAA,IACT;AAAA,IACA,IAAI,MAAM,WAAW,GAAG,GAAG;AAAA,MACzB,OAAO;AAAA,IACT;AAAA,IACA,MAAM,UAAU,OAAO,KAAK;AAAA,IAC5B,OAAO;AAAA,GACR;AAAA;AAqBH,SAAS,eAAe,CAAC,SAAS;AAAA,EAChC,OAAO,WAAW,QAAQ,SAAS;AAAA;AAErC,SAAS,gBAAgB,CAAC,SAAS;AAAA,EACjC,OAAO,WAAW,QAAQ,aAAa,WAAW,aAAa,QAAQ;AAAA;AAEzE,SAAS,iBAAiB,CAAC,SAAS;AAAA,EAClC,OAAO,iBAAiB,OAAO,KAAK,QAAQ,QAAQ,YAAY;AAAA;AAElE,SAAS,SAAS,CAAC,SAAS;AAAA,EAC1B,IAAI,QAAQ,QAAQ,WAAW;AAAA,IAAc;AAAA,EAC7C,MAAM,MAAM,QAAQ,QAAQ;AAAA,EAC5B,OAAO,MAAM,GAAG,UAAe;AAAA;AAEjC,SAAS,cAAc,CAAC,MAAM,OAAO;AAAA,EACnC,OAAO,OAAO,UAAU,WAAW,MAAM,SAAS,IAAI;AAAA;AAExD,SAAS,mBAAmB,CAAC,OAAO;AAAA,EAClC,OAAO,KAAK,UAAU,OAAO,cAAc;AAAA;AAe7C,SAAS,mBAAmB,CAAC,MAAM,UAAU;AAAA,EAC3C,MAAM,MAAM,OAAO,IAAI;AAAA,EACvB,MAAM,OAAO,OAAO,SAAS,IAAI;AAAA,EACjC,MAAM,OAAO,OAAO,SAAS,IAAI;AAAA,EACjC,MAAM,MAAM,SAAS,SAAS,IAAI,MAAM;AAAA,EACxC,OAAO,MAAM,QAAQ,MAAM,QAAQ,CAAC,IAAI,SAAS,GAAG;AAAA;AAItD,IAAI,2BAA2B;AAC/B,IAAI,sBAAsB;AAC1B,IAAI,2BAA2B;AAC/B,IAAI,sBAAsB;AAC1B,IAAI,0BAA0B;AAC9B,IAAI,sBAAsB;AAC1B,IAAI,gCAAgC;AACpC,IAAI,6BAA6B;AACjC,IAAI,2BAA2B;AAC/B,IAAI,mBAAmB;AACvB,IAAI,qBAAqB;AACzB,IAAI,oBAAoB;AACxB,IAAI,oBAAoB;AACxB,IAAI,gBAAgB;AACpB,IAAI,qBAAqB;AACzB,IAAI,oCAAoC;AACxC,IAAI,uBAAuB;AAC3B,IAAI,+BAA+B;AACnC,IAAI,eAAe;AACnB,IAAI,cAAc;AAClB,IAAI,uBAAuB;AAC3B,IAAI,qBAAqB;AACzB,IAAI,qBAAqB;AACzB,IAAI,sBAAsB;AAC1B,IAAI,wBAAwB;AAC5B,IAAI,4BAA4B;AAChC,IAAI,0BAA0B;AAC9B,IAAI,6BAA6B;AACjC,IAAI,2BAA2B;AAC/B,IAAI,iCAAiC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAI,0BAA0B,CAAC,GAAG;AAClC,IAAI,kBAAkB;AAAA,EACpB,cAAc;AAAA,EACd,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAEd;AACA,SAAS,qBAAqB,CAAC,YAAY;AAAA,EACzC,IAAI,CAAC;AAAA,IAAY,OAAO;AAAA,EACxB,MAAM,gBAAgB,OAAO,UAAU;AAAA,EACvC,IAAI,OAAO,SAAS,aAAa,KAAK,gBAAgB,GAAG;AAAA,IACvD,OAAO,gBAAgB;AAAA,EACzB;AAAA,EACA,MAAM,YAAY,KAAK,MAAM,UAAU;AAAA,EACvC,IAAI,CAAC,MAAM,SAAS,GAAG;AAAA,IACrB,MAAM,UAAU,YAAY,KAAK,IAAI;AAAA,IACrC,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,OAAI,CAAC;AAAA,EAC5C;AAAA,EACA,OAAO;AAAA;AAET,SAAS,sBAAsB,CAAC,aAAa,iBAAiB,iBAAiB;AAAA,EAC7E;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,aAAa;AAAA,MACX;AAAA,EACJ,OAAO,UAAU,SAAS;AAAA,IACxB,IAAI;AAAA,IACJ,MAAM,MAAM,KAAK;AAAA,IACjB,MAAM,UAAU,KAAK;AAAA,IACrB,IAAI,QAAQ;AAAA,IACZ,IAAI,UAAU;AAAA,IACd,OAAO,MAAM;AAAA,MACX,IAAI;AAAA,QACF,MAAM,SAAS,MAAM,YAAY,GAAG,IAAI;AAAA,QACxC,IAAI,OAAO,IAAI;AAAA,UACb,OAAO;AAAA,QACT;AAAA,QACA,MAAM,MAAM,MAAM,WAAW,aAAa,QAAQ,IAAI,SAAS,CAAC;AAAA,QAChE,MAAM;AAAA,QACN,OAAO,GAAG;AAAA,QACV,mBAAmB,QAAgB,gBAAgB;AAAA,QACnD,KAAK,KAAK,WAAW,OAAY,YAAI,QAAQ,WAAW,OAAY,YAAI,GAAG,SAAS;AAAA,UAClF,MAAM,IAAI;AAAA,QACZ,EAAO,SAAI,aAAa,cAAc,CAAC,wBAAwB,SAAS,EAAE,MAAM,KAAK,EAAE,UAAU,OAAO,EAAE,SAAS,KAAK;AAAA,UACtH,MAAM;AAAA,QACR,EAAO;AAAA,UACL;AAAA,UACA,IAAI,UAAU,YAAY;AAAA,YACxB,IAAI,OAAO;AAAA,cACT,QAAQ,IACN,wBAAwB,WAAW,wBACrC;AAAA,YACF;AAAA,YACA,MAAM;AAAA,UACR;AAAA,UACA,MAAM,kBAAkB,aAAa,cAAc,EAAE,UAAU,sBAAsB,EAAE,QAAQ,cAAc,IAAI;AAAA,UACjH,MAAM,SAAS,KAAK,OAAO,IAAI;AAAA,UAC/B,MAAM,kBAAkB,KAAK,IAAI,QAAQ,QAAQ;AAAA,UACjD,MAAM,SAAS,KAAK,IAAI,iBAAiB,eAAe;AAAA,UACxD,IAAI,OAAO;AAAA,YACT,MAAM,SAAS,kBAAkB,IAAI,kBAAkB;AAAA,YACvD,QAAQ,IACN,kBAAkB,iBAAiB,aAAa,qBAAqB,oCAAoC,oBAC3G;AAAA,UACF;AAAA,UACA,MAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,MAAM,CAAC;AAAA,UAC1D,QAAQ,KAAK,IAAI,QAAQ,YAAY,QAAQ;AAAA;AAAA;AAAA,IAGnD;AAAA;AAAA;AAGJ,IAAI,uBAAuB,CAAC,KAAK,KAAK,GAAG;AACzC,SAAS,+BAA+B,CAAC,aAAa;AAAA,EACpD,OAAO,UAAU,SAAS;AAAA,IACxB,IAAI,IAAI;AAAA,IACR,MAAM,MAAM,KAAK;AAAA,IACjB,MAAM,MAAM,MAAM,YAAY,GAAG,IAAI;AAAA,IACrC,IAAI;AAAA,MACF,IAAI,IAAI,SAAS,OAAO,qBAAqB,SAAS,IAAI,MAAM,GAAG;AAAA,QACjE,OAAO;AAAA,MACT;AAAA,MACA,MAAM,SAAO,MAAM,IAAI,KAAK;AAAA,MAC5B,OAAO,IAAI,SAAS,QAAM,GAAG;AAAA,MAC7B,OAAO,KAAK;AAAA,MACZ,KAAK,MAAM,KAAK,KAAK,OAAO,OAAY,YAAI,GAAG,WAAW,OAAY,YAAI,GAAG,SAAS;AAAA,QACpF,MAAM,IAAI;AAAA,MACZ;AAAA,MACA,MAAM,IAAI,WACR,IAAI,QACC,WACA,WACL,OAAO,YAAY,CAAC,GAAG,IAAI,QAAQ,QAAQ,CAAC,CAAC,GAC7C,IAAI,SAAS,GACb,eAAe,QAAQ,IAAI,UAAU,OAAO,QAAQ,WAAW,MAAM,qBACvE;AAAA;AAAA;AAAA;AAIN,IAAI,wBAAwB;AAAA,EAC1B,qBAAqB;AACvB;AACA,SAAS,0BAA0B,CAAC,aAAa,kBAAkB,uBAAuB;AAAA,EACxF,QAAQ,wBAAwB;AAAA,EAChC,IAAI;AAAA,EACJ,MAAM,iBAAiB,UAAU,SAAS;AAAA,IACxC,MAAM,MAAM,KAAK,GAAG,SAAS;AAAA,IAC7B,MAAM,SAAS,iBAAiB,KAAK,IAAI,KAAK,EAAE;AAAA,IAChD,IAAI,WAAW,OAAO;AAAA,MACpB,iBAAiB,QAAgB,cAAc,MAAM;AAAA,MACrD,gBAAqB;AAAA,MACrB,OAAO,YAAY,GAAG,IAAI;AAAA,IAC5B;AAAA,IACA,MAAM,oBAAoB,iBAAiB,OAAY,YAAI,cAAc,QAAQ,GAAG,IAAI;AAAA,IACxF,IAAI,mBAAmB;AAAA,MACrB,OAAO;AAAA,IACT;AAAA,IACA,iBAAiB,QAAgB,cAAc,MAAM;AAAA,IACrD,gBAAqB;AAAA,IACrB,MAAM,WAAW,MAAM,YAAY,GAAG,IAAI;AAAA,IAC1C,MAAM,UAAU,gBAAgB,KAAK,QAAQ;AAAA,IAC7C,IAAI,SAAS;AAAA,MACX,gBAAgB,IAAI,cAAc;AAAA,QAChC;AAAA,QACA,uBAAuB;AAAA,QACvB,KAAK;AAAA,QACL,aAAa,KAAK;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,IACA,OAAO;AAAA;AAAA,EAET,OAAO;AAAA;AAET,IAAI,kCAAkC;AAAA,EACpC;AAAA,EACA;AACF;AACA,IAAI,8BAA8B,CAAC,wBAAwB;AAC3D,IAAI,iCAAiC,CAAC,mBAAmB;AACzD,SAAS,mCAAmC,CAAC,aAAa;AAAA,EACxD,OAAO,UAAU,SAAS;AAAA,IACxB,MAAM,WAAW,MAAM,YAAY,GAAG,IAAI;AAAA,IAC1C,IAAI,SAAS,IAAI;AAAA,MACf,MAAM,UAAU,SAAS;AAAA,MACzB,MAAM,iBAAiB,CAAC;AAAA,MACxB,MAAM,oBAAoB,CAAC,oBAAoB,eAAe,KAAK,GAAG,gBAAgB,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;AAAA,MACpH,MAAM,QAAQ,KAAK;AAAA,MACnB,MAAM,YAAY,MAAM,SAAS;AAAA,MACjC,MAAM,MAAM,IAAI,IAAI,SAAS;AAAA,MAC7B,MAAM,oBAAoB;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,CAAC,MAAM,IAAI,aAAa,IAAI,CAAC,CAAC;AAAA,MACrC,IAAI,mBAAmB;AAAA,QACrB,OAAO;AAAA,MACT;AAAA,MACA,kBAAkB,+BAA+B;AAAA,MACjD,IAAI,IAAI,aAAa,IAAI,gBAAgB,MAAM,QAAQ;AAAA,QACrD,kBAAkB,2BAA2B;AAAA,MAC/C;AAAA,MACA,IAAI,CAAC,IAAI,aAAa,IAAI,gBAAgB,KAAK,IAAI,aAAa,IAAI,gBAAgB,MAAM,SAAS;AAAA,QACjG,kBAAkB,8BAA8B;AAAA,MAClD;AAAA,MACA,IAAI,eAAe,SAAS,GAAG;AAAA,QAC7B,MAAM,IAAI,oBAAoB,WAAW,cAAc;AAAA,MACzD;AAAA,IACF;AAAA,IACA,OAAO;AAAA;AAAA;AAGX,IAAI;AAAJ,IAAkB;AAAlB,IAA0C;AAA1C,IAA0D;AAA1D,IAAyE;AAAzE,IAAwF;AAAxF,IAAkH;AAClH,IAAI,gBAAgB,MAAM;AAAA,EACxB,WAAW,CAAC,SAAS;AAAA,IACnB,aAAa,MAAM,wBAAwB;AAAA,IAC3C,aAAa,MAAM,YAAY;AAAA,IAC/B,aAAa,MAAM,sBAAsB;AAAA,IACzC,aAAa,MAAM,gCAAgC,IAAI,GAAK;AAAA,IAC5D,aAAa,MAAM,aAAa;AAAA,IAChC,aAAa,MAAM,aAAa;AAAA,IAChC,IAAI;AAAA,IACJ,aAAa,MAAM,eAAe,KAAK,QAAQ,gBAAgB,OAAO,KAAK,IAAI,SAAS,MAAM,GAAG,IAAI,CAAC;AAAA,IACtG,aAAa,MAAM,wBAAwB,QAAQ,qBAAqB;AAAA,IACxE,aAAa,MAAM,eAAe,QAAQ,IAAI,SAAS,CAAC;AAAA,IACxD,aAAa,MAAM,eAAe,aAAa,MAAM,aAAa,CAAC;AAAA,IACnE,gBAAgB,MAAM,0BAA0B,WAAW,EAAE,KAAK,MAAM,QAAQ,KAAK,QAAQ,WAAW;AAAA;AAAA,EAE1G,KAAK,GAAG;AAAA,IACN,aAAa,MAAM,cAAc,EAAE,QAAQ,EAAE,GAAG,aAAa,QAAQ,MAAM,CAAC;AAAA,IAC5E,aAAa,MAAM,cAAc,EAAE,MAAM;AAAA;AAAA,EAE3C,OAAO,IAAI,MAAM;AAAA,IACf,MAAM,MAAM,KAAK,GAAG,SAAS;AAAA,IAC7B,MAAM,QAAQ,aAAa,MAAM,cAAc,EAAE,IAAI,GAAG;AAAA,IACxD,IAAI,CAAC,SAAS,QAAQ,aAAa,MAAM,aAAa;AAAA,MAAG;AAAA,IACzD,OAAO,SAAS,WAAW;AAAA,IAC3B,IAAI,QAAQ,OAAO,SAAS;AAAA,MAC1B,aAAa,MAAM,cAAc,EAAE,OAAO,GAAG;AAAA,MAC7C;AAAA,IACF;AAAA,IACA,aAAa,MAAM,cAAc,EAAE,OAAO,GAAG;AAAA,IAC7C,QAAQ,KAAK,CAAC,aAAa;AAAA,MACzB,MAAM,UAAU,gBAAgB,KAAK,QAAQ;AAAA,MAC7C,aAAa,MAAM,eAAe,OAAO;AAAA,MACzC,IAAI,aAAa,MAAM,aAAa,KAAK,CAAC,aAAa,MAAM,cAAc,EAAE,IAAI,aAAa,MAAM,aAAa,CAAC,GAAG;AAAA,QACnH,gBAAgB,MAAM,0BAA0B,WAAW,EAAE,KAAK,MAAM,aAAa,MAAM,aAAa,GAAG,KAAK,EAAE;AAAA,MACpH;AAAA,KACD,EAAE,MAAM,MAAM,EACd;AAAA,IACD,OAAO;AAAA;AAEX;AACA,eAAe,IAAI;AACnB,yBAAyB,IAAI;AAC7B,iBAAiB,IAAI;AACrB,gBAAgB,IAAI;AACpB,gBAAgB,IAAI;AACpB,2BAA2B,IAAI;AAC/B,cAAc,QAAQ,IAAI,MAAM;AAAA,EAC9B,IAAI,IAAI;AAAA,EACR,MAAM,MAAM,KAAK,GAAG,SAAS;AAAA,EAC7B,IAAI,aAAa,MAAM,cAAc,EAAE,QAAQ,aAAa,MAAM,sBAAsB;AAAA,IAAG;AAAA,EAC3F,MAAM,UAAU,IAAI;AAAA,EACpB,IAAI;AAAA,IACF,QAAQ,QAAQ,YAAY,aAAa,UAAU,KAAK,KAAK,OAAO,OAAY,YAAI,GAAG,MAAM;AAAA,IAC7F,MAAM,UAAU,aAAa,MAAM,YAAY,EAAE,KAAK,MAAM,KAAK,cAAc,eAAe,CAAC,IAAI,KAAK,KAAK,OAAO,OAAO,KAAK,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAAA,IAChJ,aAAa,MAAM,cAAc,EAAE,IAAI,KAAK,CAAC,SAAS,OAAO,CAAC;AAAA,IAC9D,QAAQ,KAAK,CAAC,aAAa;AAAA,MACzB,IAAI,CAAC,SAAS,MAAM,QAAQ,OAAO;AAAA,QAAS;AAAA,MAC5C,MAAM,UAAU,gBAAgB,KAAK,QAAQ;AAAA,MAC7C,IAAI,CAAC,WAAW,YAAY,KAAK;AAAA,QAC/B,aAAa,MAAM,eAAoB,SAAC;AAAA,QACxC;AAAA,MACF;AAAA,MACA,aAAa,MAAM,eAAe,OAAO;AAAA,MACzC,OAAO,gBAAgB,MAAM,0BAA0B,WAAW,EAAE,KAAK,MAAM,SAAS,KAAK,EAAE;AAAA,KAChG,EAAE,MAAM,MAAM,EACd,EAAE,QAAQ,OAAO;AAAA,IAClB,OAAO,GAAG;AAAA;AAGd,SAAS,eAAe,CAAC,KAAK,KAAK;AAAA,EACjC,MAAM,cAAc,IAAI,QAAQ,IAAI,mBAAmB;AAAA,EACvD,MAAM,aAAa,IAAI,QAAQ,IAAI,wBAAwB;AAAA,EAC3D,MAAM,aAAa,IAAI,QAAQ,IAAI,uBAAuB;AAAA,EAC1D,IAAI,CAAC,eAAe,CAAC,cAAc;AAAA,IAAY;AAAA,EAC/C,MAAM,UAAU,IAAI,IAAI,GAAG;AAAA,EAC3B,IAAI,QAAQ,aAAa,IAAI,gBAAgB;AAAA,IAAG;AAAA,EAChD,MAAM,gBAAgB,QAAQ,aAAa,IAAI,0BAA0B;AAAA,EACzE,IAAI,iBAAiB,gBAAgB,eAAe;AAAA,IAClD,QAAQ,KACN,kLAAkL,+MACpL;AAAA,IACA;AAAA,EACF;AAAA,EACA,QAAQ,aAAa,IAAI,0BAA0B,WAAW;AAAA,EAC9D,QAAQ,aAAa,IAAI,oBAAoB,UAAU;AAAA,EACvD,QAAQ,aAAa,KAAK;AAAA,EAC1B,OAAO,QAAQ,SAAS;AAAA;AAE1B,SAAS,YAAY,CAAC,SAAS,cAAc;AAAA,EAC3C,IAAI,UAAU;AAAA,EACd,IAAI,CAAC,cAAc,CACnB,EAAO,SAAI,aAAa,SAAS;AAAA,IAC/B,QAAQ,MAAM;AAAA,EAChB,EAAO;AAAA,IACL,MAAM,cAAc,MAAM,QAAQ,MAAM;AAAA,IACxC,aAAa,iBAAiB,SAAS,aAAa;AAAA,MAClD,MAAM;AAAA,MACN,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,IACD,UAAU,MAAM,aAAa,oBAAoB,SAAS,WAAW;AAAA;AAAA,EAEvE,OAAO;AAAA,IACL,QAAQ,QAAQ;AAAA,IAChB;AAAA,EACF;AAAA;AAEF,SAAS,IAAI,GAAG;AAEhB,SAAS,gBAAgB,CAAC,OAAO,MAAM;AAAA,EACrC,IAAI,QAAQ,OAAY,YAAI,KAAK,QAAQ;AAAA,IACvC,OAAO,KAAK,OAAO,YAAY;AAAA,EACjC;AAAA,EACA,IAAI,OAAO,YAAY,eAAe,iBAAiB,SAAS;AAAA,IAC9D,OAAO,MAAM,OAAO,YAAY;AAAA,EAClC;AAAA,EACA,OAAO;AAAA;AAIT,SAAS,iBAAiB,CAAC,MAAM,cAAc;AAAA,EAC7C,QAAQ,KAAK;AAAA,SACN,OAAO;AAAA,MACV,MAAM,eAAe,eAAe,aAAa,KAAK,MAAM,IAAI,KAAK;AAAA,MACrE,OAAO,gBAAgB,YAAY;AAAA,IACrC;AAAA,SACK;AAAA,MACH,OAAO,IAAI,KAAK;AAAA,SACb;AAAA,MACH,OAAO,gBAAgB,MAAM,YAAY;AAAA,aAClC;AAAA,MACP,MAAM,cAAc;AAAA,MACpB,MAAM,IAAI,MAAM,4BAA4B,KAAK,UAAU,WAAW,GAAG;AAAA,IAC3E;AAAA;AAAA;AAGJ,SAAS,eAAe,CAAC,MAAM,cAAc;AAAA,EAC3C,MAAM,OAAO,KAAK,KAAK,IAAI,CAAC,QAAQ,kBAAkB,KAAK,YAAY,CAAC;AAAA,EACxE,QAAQ,KAAK;AAAA,SAEN;AAAA,MACH,OAAO,GAAG,KAAK,QAAQ,KAAK;AAAA,SACzB;AAAA,MACH,OAAO,GAAG,KAAK,QAAQ,KAAK;AAAA,SACzB;AAAA,MACH,OAAO,GAAG,KAAK,SAAS,KAAK;AAAA,SAC1B;AAAA,MACH,OAAO,GAAG,KAAK,QAAQ,KAAK;AAAA,SACzB;AAAA,MACH,OAAO,GAAG,KAAK,SAAS,KAAK;AAAA,SAE1B;AAAA,MACH,OAAO,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,KAAK,OAAO;AAAA,SAC1C;AAAA,MACH,OAAO,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM;AAAA,SACzC;AAAA,MACH,OAAO,QAAQ,KAAK;AAAA,SAEjB;AAAA,MACH,OAAO,GAAG,KAAK,YAAY,KAAK;AAAA,SAC7B;AAAA,MACH,OAAO,GAAG,KAAK,WAAW,KAAK;AAAA,SAC5B;AAAA,MACH,OAAO,GAAG,KAAK,YAAY,KAAK;AAAA,SAC7B;AAAA,SACA;AAAA,MACH,OAAO,GAAG,KAAK;AAAA,SAEZ;AAAA,MACH,OAAO,SAAS,KAAK;AAAA,SAClB;AAAA,MACH,OAAO,SAAS,KAAK;AAAA,SAClB;AAAA,MACH,OAAO,UAAU,KAAK;AAAA,SACnB;AAAA,MACH,OAAO,UAAU,KAAK,KAAK,IAAI;AAAA,SAE5B;AAAA,MACH,OAAO,YAAY,KAAK,KAAK,IAAI;AAAA;AAAA,MAEjC,MAAM,IAAI,MAAM,qBAAqB,KAAK,MAAM;AAAA;AAAA;AAGtD,SAAS,cAAc,CAAC,SAAS,cAAc;AAAA,EAC7C,OAAO,QAAQ,IAAI,CAAC,WAAW;AAAA,IAC7B,MAAM,eAAe,eAAe,aAAa,OAAO,MAAM,IAAI,OAAO;AAAA,IACzE,IAAI,QAAM,gBAAgB,YAAY;AAAA,IACtC,IAAI,OAAO,cAAc;AAAA,MAAQ,SAAO;AAAA,IACxC,IAAI,OAAO,UAAU;AAAA,MAAS,SAAO;AAAA,IACrC,IAAI,OAAO,UAAU;AAAA,MAAQ,SAAO;AAAA,IACpC,OAAO;AAAA,GACR,EAAE,KAAK,IAAI;AAAA;AAId,eAAe,QAAQ,CAAC,QAAQ,SAAS;AAAA,EACvC,MAAM,SAAS,OAAO,UAAU;AAAA,EAChC,IAAI;AAAA,EACJ,OAAO,EAAE,SAAS,MAAM,OAAO,KAAK,GAAG,MAAM;AAAA,IAC3C,QAAQ,OAAO,KAAK;AAAA,EACtB;AAAA;AAEF,SAAS,QAAQ,CAAC,QAAQ;AAAA,EACxB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI,yBAAyB;AAAA,EAC7B,OAAO,SAAS,OAAO,CAAC,KAAK;AAAA,IAC3B,IAAI,WAAgB,WAAG;AAAA,MACrB,SAAS;AAAA,MACT,WAAW;AAAA,MACX,cAAc;AAAA,IAChB,EAAO;AAAA,MACL,SAAS,OAAO,QAAQ,GAAG;AAAA;AAAA,IAE7B,MAAM,YAAY,OAAO;AAAA,IACzB,IAAI,YAAY;AAAA,IAChB,OAAO,WAAW,WAAW;AAAA,MAC3B,IAAI,wBAAwB;AAAA,QAC1B,IAAI,OAAO,cAAc,IAAI;AAAA,UAC3B,YAAY,EAAE;AAAA,QAChB;AAAA,QACA,yBAAyB;AAAA,MAC3B;AAAA,MACA,IAAI,UAAU;AAAA,MACd,MAAO,WAAW,aAAa,YAAY,IAAI,EAAE,UAAU;AAAA,QACzD,QAAQ,OAAO;AAAA,eACR;AAAA,YACH,IAAI,gBAAgB,IAAI;AAAA,cACtB,cAAc,WAAW;AAAA,YAC3B;AAAA,YACA;AAAA,eACG;AAAA,YACH,yBAAyB;AAAA,eACtB;AAAA,YACH,UAAU;AAAA,YACV;AAAA;AAAA,MAEN;AAAA,MACA,IAAI,YAAY,IAAI;AAAA,QAClB;AAAA,MACF;AAAA,MACA,OAAO,OAAO,SAAS,WAAW,OAAO,GAAG,WAAW;AAAA,MACvD,YAAY;AAAA,MACZ,cAAc;AAAA,IAChB;AAAA,IACA,IAAI,cAAc,WAAW;AAAA,MAC3B,SAAc;AAAA,IAChB,EAAO,SAAI,cAAc,GAAG;AAAA,MAC1B,SAAS,OAAO,SAAS,SAAS;AAAA,MAClC,YAAY;AAAA,IACd;AAAA;AAAA;AAGJ,SAAS,WAAW,CAAC,MAAM,SAAS,WAAW;AAAA,EAC7C,IAAI,UAAU,WAAW;AAAA,EACzB,MAAM,UAAU,IAAI;AAAA,EACpB,OAAO,SAAS,MAAM,CAAC,MAAM,aAAa;AAAA,IACxC,IAAI,KAAK,WAAW,GAAG;AAAA,MACrB,cAAc,QAAQ,cAAmB,aAAa,UAAU,OAAO;AAAA,MACvE,UAAU,WAAW;AAAA,IACvB,EAAO,SAAI,cAAc,GAAG;AAAA,MAC1B,MAAM,QAAQ,QAAQ,OAAO,KAAK,SAAS,GAAG,WAAW,CAAC;AAAA,MAC1D,MAAM,cAAc,eAAe,KAAK,cAAc,OAAO,KAAK,IAAI;AAAA,MACtE,MAAM,QAAQ,QAAQ,OAAO,KAAK,SAAS,WAAW,CAAC;AAAA,MACvD,QAAQ;AAAA,aACD;AAAA,UACH,QAAQ,OAAO,QAAQ,OAAO,QAAQ,OAAO;AAAA,IAAO,QAAQ;AAAA,UAC5D;AAAA,aACG;AAAA,UACH,QAAQ,QAAQ;AAAA,UAChB;AAAA,aACG;AAAA,UACH,KAAK,QAAQ,KAAK,KAAK;AAAA,UACvB;AAAA,aACG;AAAA,UACH,MAAM,QAAQ,SAAS,OAAO,EAAE;AAAA,UAChC,IAAI,CAAC,MAAM,KAAK,GAAG;AAAA,YACjB,QAAQ,QAAQ,QAAQ,KAAK;AAAA,UAC/B;AAAA,UACA;AAAA;AAAA,IAEN;AAAA;AAAA;AAGJ,SAAS,MAAM,CAAC,GAAG,GAAG;AAAA,EACpB,MAAM,MAAM,IAAI,WAAW,EAAE,SAAS,EAAE,MAAM;AAAA,EAC9C,IAAI,IAAI,CAAC;AAAA,EACT,IAAI,IAAI,GAAG,EAAE,MAAM;AAAA,EACnB,OAAO;AAAA;AAET,SAAS,UAAU,GAAG;AAAA,EACpB,OAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,OAAY;AAAA,EACd;AAAA;AAIF,IAAI,SAAS,QAAQ,CAAC,GAAG,GAAG;AAAA,EAC1B,IAAI,IAAI,CAAC;AAAA,EACT,SAAS,KAAK;AAAA,IAAG,IAAI,OAAO,UAAU,eAAe,KAAK,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI;AAAA,MAChF,EAAE,KAAK,EAAE;AAAA,EACX,IAAI,KAAK,QAAQ,OAAO,OAAO,0BAA0B;AAAA,IACvD,SAAS,IAAI,GAAG,IAAI,OAAO,sBAAsB,CAAC,EAAG,IAAI,EAAE,QAAQ,KAAK;AAAA,MACtE,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,KAAK,OAAO,UAAU,qBAAqB,KAAK,GAAG,EAAE,EAAE;AAAA,QAC3E,EAAE,EAAE,MAAM,EAAE,EAAE;AAAA,IAClB;AAAA,EACF,OAAO;AAAA;AAET,IAAI,yBAAyB;AAC7B,IAAI,uBAAuB;AAC3B,IAAI,cAAc;AAClB,SAAS,gBAAgB,CAAC,OAAO,IAAI;AAAA,EACnC,MAAM,QAAQ,aAAa,SAAS,cAAc,QAAQ,aAAa,WAAW,SAAS,SAAS,gBAAgB,OAAO,eAAe,IAAI,OAAO,OAAO,IAAI,CAAC,UAAU,WAAW,UAAU,aAAa,WAAW,WAAW,kBAAkB,OAAO,CAAC;AAAA,EAC7P,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,IACtC,MAAM,UAAU,OAAO,OAAO,CAAC,GAAG,YAAY;AAAA,IAC9C,IAAI,CAAC,QAAQ,QAAQ;AAAA,MACnB,QAAQ,SAAS;AAAA,IACnB;AAAA,IACA,IAAI;AAAA,IACJ,SAAS,kBAAkB,GAAG;AAAA,MAC5B,qBAAqB,MAAM;AAAA,MAC3B,IAAI,OAAO,aAAa,eAAe,CAAC,SAAS,QAAQ;AAAA,QACvD,OAAO;AAAA,MACT;AAAA;AAAA,IAEF,IAAI,OAAO,aAAa,eAAe,CAAC,gBAAgB;AAAA,MACtD,SAAS,iBAAiB,oBAAoB,kBAAkB;AAAA,IAClE;AAAA,IACA,IAAI,gBAAgB;AAAA,IACpB,IAAI,aAAa;AAAA,IACjB,SAAS,OAAO,GAAG;AAAA,MACjB,IAAI,OAAO,aAAa,aAAa;AAAA,QACnC,SAAS,oBAAoB,oBAAoB,kBAAkB;AAAA,MACrE;AAAA,MACA,aAAa,UAAU;AAAA,MACvB,qBAAqB,MAAM;AAAA;AAAA,IAE7B,gBAAgB,QAAQ,gBAAqB,aAAa,YAAY,iBAAiB,SAAS,MAAM;AAAA,MACpG,QAAQ;AAAA,KACT;AAAA,IACD,MAAM,SAAS,eAAe,QAAQ,eAAoB,YAAI,aAAa,OAAO;AAAA,IAClF,MAAM,SAAS,gBAAgB,QAAQ,gBAAqB,YAAI,cAAc;AAAA,IAC9E,eAAe,MAAM,GAAG;AAAA,MACtB,IAAI;AAAA,MACJ,uBAAuB,IAAI;AAAA,MAC3B,MAAM,MAAM,YAAY,UAAU,cAAc,qBAAqB;AAAA,MACrE,IAAI;AAAA,QACF,MAAM,WAAW,MAAM,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,SAAS,QAAQ,IAAI,CAAC,CAAC;AAAA,QACrG,MAAM,OAAO,QAAQ;AAAA,QACrB,MAAM,SAAS,SAAS,MAAM,SAAS,YAAY,CAAC,OAAO;AAAA,UACzD,IAAI,IAAI;AAAA,YACN,QAAQ,eAAe;AAAA,UACzB,EAAO;AAAA,YACL,OAAO,QAAQ;AAAA;AAAA,WAEhB,CAAC,UAAU;AAAA,UACZ,gBAAgB;AAAA,WACf,SAAS,CAAC,CAAC;AAAA,QACd,YAAY,QAAQ,YAAiB,aAAa,QAAQ;AAAA,QAC1D,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,OAAO,KAAK;AAAA,QACZ,IAAI,IAAI,SAAS;AAAA,UACf,QAAQ;AAAA,UACR,OAAO,GAAG;AAAA,QACZ,EAAO,SAAI,CAAC,qBAAqB,OAAO,SAAS;AAAA,UAC/C,IAAI;AAAA,YACF,MAAM,YAAY,MAAM,YAAY,QAAQ,YAAiB,YAAS,YAAI,QAAQ,GAAG,OAAO,QAAQ,QAAa,YAAI,MAAM;AAAA,YAC3H,aAAa,UAAU;AAAA,YACvB,aAAa,WAAW,QAAQ,QAAQ;AAAA,YACxC,OAAO,UAAU;AAAA,YACjB,QAAQ;AAAA,YACR,OAAO,QAAQ;AAAA;AAAA,QAEnB;AAAA;AAAA;AAAA,IAGJ,OAAO;AAAA,GACR;AAAA;AAEH,SAAS,aAAa,CAAC,UAAU;AAAA,EAC/B,MAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AAAA,EACvD,IAAI,EAAE,gBAAgB,QAAQ,gBAAqB,YAAS,YAAI,YAAY,WAAW,sBAAsB,IAAI;AAAA,IAC/G,MAAM,IAAI,MAAM,+BAA+B,mCAAmC,aAAa;AAAA,EACjG;AAAA;AAIF,IAAI,qBAAqB,MAAM;AAAA,EAC7B,WAAW,GAAG;AAAA,IACZ,KAAK,OAAO,CAAC;AAAA,IACb,KAAK,MAAM;AAAA,IACX,KAAK,aAAa;AAAA,IAClB,KAAK,KAAK;AAAA;AAAA,EAEZ,gBAAgB,CAAC,UAAU;AAAA,IACzB,MAAM,QAAQ,KAAK,KAAK;AAAA,IACxB,IAAI,OAAO;AAAA,MACT,MAAM,WAAW,KAAK,IAAI;AAAA,MAC1B,KAAK,KAAK;AAAA,MACV,OAAO,MAAM;AAAA,IACf;AAAA,IACA,OAAO;AAAA;AAAA,EAET,WAAW,CAAC,UAAU,QAAQ;AAAA,IAC5B,KAAK,KAAK,YAAY,EAAE,eAAe,QAAQ,UAAU,KAAK,IAAI,EAAE;AAAA,IACpE,MAAM,OAAO,OAAO,KAAK,KAAK,IAAI;AAAA,IAClC,IAAI,KAAK,SAAS,KAAK,KAAK;AAAA,MAC1B,MAAM,SAAS,KAAK,OAClB,CAAC,KAAK,MAAM,KAAK,KAAK,GAAG,WAAW,KAAK,KAAK,KAAK,WAAW,IAAI,GACpE;AAAA,MACA,OAAO,KAAK,KAAK;AAAA,IACnB;AAAA,IACA,KAAK,KAAK;AAAA;AAAA,EAEZ,IAAI,GAAG;AAAA,IACL,IAAI,OAAO,iBAAiB;AAAA,MAAa;AAAA,IACzC,IAAI;AAAA,MACF,aAAa,QAAQ,KAAK,YAAY,KAAK,UAAU,KAAK,IAAI,CAAC;AAAA,MAC/D,OAAO,GAAG;AAAA;AAAA,EAGd,IAAI,GAAG;AAAA,IACL,IAAI,OAAO,iBAAiB;AAAA,MAAa;AAAA,IACzC,IAAI;AAAA,MACF,MAAM,SAAS,aAAa,QAAQ,KAAK,UAAU;AAAA,MACnD,IAAI,QAAQ;AAAA,QACV,KAAK,OAAO,KAAK,MAAM,MAAM;AAAA,MAC/B;AAAA,MACA,OAAO,GAAG;AAAA,MACV,KAAK,OAAO,CAAC;AAAA;AAAA;AAAA,EAGjB,KAAK,GAAG;AAAA,IACN,KAAK,OAAO,CAAC;AAAA,IACb,KAAK,KAAK;AAAA;AAAA,EAEZ,MAAM,CAAC,UAAU;AAAA,IACf,OAAO,KAAK,KAAK;AAAA,IACjB,KAAK,KAAK;AAAA;AAEd;AACA,IAAI,qBAAqB,IAAI;AAG7B,IAAI,kBAAkB,MAAM;AAAA,EAC1B,WAAW,GAAG;AAAA,IACZ,KAAK,OAAO,CAAC;AAAA,IACb,KAAK,aAAa;AAAA,IAClB,KAAK,WAAW;AAAA,IAEhB,KAAK,aAAa;AAAA,IAClB,KAAK,kBAAkB;AAAA,IAEvB,KAAK,gBAAgB;AAAA,IACrB,KAAK,KAAK;AAAA,IACV,KAAK,QAAQ;AAAA;AAAA,EAOf,cAAc,CAAC,UAAU,QAAQ;AAAA,IAC/B,KAAK,KAAK,YAAY;AAAA,MACpB,WAAW,KAAK,IAAI;AAAA,MACpB;AAAA,IACF;AAAA,IACA,MAAM,OAAO,OAAO,KAAK,KAAK,IAAI;AAAA,IAClC,IAAI,KAAK,SAAS,KAAK,YAAY;AAAA,MACjC,MAAM,SAAS,KAAK,OAClB,CAAC,KAAK,MAAM,KAAK,KAAK,GAAG,YAAY,KAAK,KAAK,KAAK,YAAY,IAAI,GACtE;AAAA,MACA,OAAO,KAAK,KAAK;AAAA,IACnB;AAAA,IACA,KAAK,aAAa;AAAA;AAAA,EAMpB,YAAY,GAAG;AAAA,IACb,MAAM,MAAM,KAAK,IAAI;AAAA,IACrB,MAAM,qBAAqB,MAAM,KAAK;AAAA,IACtC,IAAI,sBAAsB,KAAK,iBAAiB;AAAA,MAC9C,KAAK,gBAAgB;AAAA,MACrB,KAAK,KAAK;AAAA,IACZ,EAAO,SAAI,CAAC,KAAK,kBAAkB;AAAA,MACjC,MAAM,QAAQ,KAAK,kBAAkB;AAAA,MACrC,KAAK,mBAAmB,WAAW,MAAM;AAAA,QACvC,KAAK,gBAAgB,KAAK,IAAI;AAAA,QAC9B,KAAK,mBAAwB;AAAA,QAC7B,KAAK,KAAK;AAAA,SACT,KAAK;AAAA,IACV;AAAA;AAAA,EAQF,qBAAqB,CAAC,UAAU;AAAA,IAC9B,MAAM,QAAQ,KAAK,KAAK;AAAA,IACxB,IAAI,CAAC,OAAO;AAAA,MACV,OAAO;AAAA,IACT;AAAA,IACA,MAAM,MAAM,KAAK,IAAI,IAAI,MAAM;AAAA,IAC/B,IAAI,OAAO,KAAK,UAAU;AAAA,MACxB,OAAO;AAAA,IACT;AAAA,IACA,OAAO,MAAM;AAAA;AAAA,EAMf,OAAO,GAAG;AAAA,IACR,MAAM,MAAM,KAAK,IAAI;AAAA,IACrB,MAAM,OAAO,OAAO,KAAK,KAAK,IAAI;AAAA,IAClC,IAAI,WAAW;AAAA,IACf,WAAW,OAAO,MAAM;AAAA,MACtB,MAAM,MAAM,MAAM,KAAK,KAAK,KAAK;AAAA,MACjC,IAAI,MAAM,KAAK,UAAU;AAAA,QACvB,OAAO,KAAK,KAAK;AAAA,QACjB,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,IAAI,UAAU;AAAA,MACZ,KAAK,KAAK;AAAA,IACZ;AAAA;AAAA,EAEF,IAAI,GAAG;AAAA,IACL,IAAI,OAAO,iBAAiB;AAAA,MAAa;AAAA,IACzC,IAAI;AAAA,MACF,aAAa,QAAQ,KAAK,YAAY,KAAK,UAAU,KAAK,IAAI,CAAC;AAAA,MAC/D,OAAO,GAAG;AAAA;AAAA,EAGd,IAAI,GAAG;AAAA,IACL,IAAI,OAAO,iBAAiB;AAAA,MAAa;AAAA,IACzC,IAAI;AAAA,MACF,MAAM,SAAS,aAAa,QAAQ,KAAK,UAAU;AAAA,MACnD,IAAI,QAAQ;AAAA,QACV,KAAK,OAAO,KAAK,MAAM,MAAM;AAAA,MAC/B;AAAA,MACA,OAAO,GAAG;AAAA,MACV,KAAK,OAAO,CAAC;AAAA;AAAA;AAAA,EAOjB,KAAK,GAAG;AAAA,IACN,KAAK,OAAO,CAAC;AAAA,IACb,IAAI,KAAK,kBAAkB;AAAA,MACzB,aAAa,KAAK,gBAAgB;AAAA,MAClC,KAAK,mBAAwB;AAAA,IAC/B;AAAA,IACA,KAAK,KAAK;AAAA;AAAA,EAEZ,MAAM,CAAC,UAAU;AAAA,IACf,OAAO,KAAK,KAAK;AAAA,IACjB,KAAK,KAAK;AAAA;AAEd;AACA,IAAI,kBAAkB,IAAI;AAG1B,IAAI;AAAJ,IAAgC;AAAhC,IAA6D;AAA7D,IAA0E;AAC1E,IAAI,kBAAkB,MAAM;AAAA,EAC1B,WAAW,GAAG;AAAA,IACZ,aAAa,MAAM,0BAA0B;AAAA,IAC7C,KAAK,kCAAkC,IAAI;AAAA,IAC3C,KAAK,gCAAgC,IAAI;AAAA,IACzC,KAAK,yCAAyC,IAAI;AAAA;AAAA,EAKpD,WAAW,CAAC,UAAU,MAAM;AAAA,IAC1B,gBAAgB,MAAM,4BAA4B,2BAA2B,EAAE,KAAK,MAAM,SAAS,aAAa;AAAA,IAChH,MAAM,OAAO,OAAO,SAAS,IAAI;AAAA,IACjC,MAAM,cAAc,OAAO,SAAS,YAAY;AAAA,IAChD,KAAK,gBAAgB,IAAI,SAAS,eAAe;AAAA,MAC/C,MAAM,OAAO,SAAS,IAAI;AAAA,MAC1B;AAAA,MACA,UAAU,SAAS,SAAS,IAAI,MAAM;AAAA,MACtC;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IACD,gBAAgB,MAAM,4BAA4B,WAAW,EAAE,KAAK,MAAM,KAAK,eAAe,MAAM,SAAS,aAAa;AAAA,IAC1H,gBAAgB,MAAM,4BAA4B,WAAW,EAAE,KAAK,MAAM,KAAK,wBAAwB,aAAa,SAAS,aAAa;AAAA;AAAA,EAK5I,cAAc,CAAC,cAAc;AAAA,IAC3B,gBAAgB,MAAM,4BAA4B,2BAA2B,EAAE,KAAK,MAAM,YAAY;AAAA,IACtG,KAAK,gBAAgB,OAAO,YAAY;AAAA;AAAA,EAM1C,mBAAmB,CAAC,SAAS;AAAA,IAC3B,MAAM,QAAQ,QAAQ,QAAQ,SAAS,CAAC;AAAA,IACxC,IAAI,MAAM,WAAW;AAAA,MAAG,OAAO;AAAA,IAC/B,MAAM,MAAM,KAAK,IAAI,GAAG,KAAK;AAAA,IAC7B,YAAY,MAAM,cAAc,KAAK,cAAc,QAAQ,GAAG;AAAA,MAC5D,IAAI,OAAO,MAAM;AAAA,QACf,WAAW,YAAY,WAAW;AAAA,UAChC,KAAK,eAAe,QAAQ;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,IACA,OAAO,CAAC,GAAG,KAAK,gBAAgB,OAAO,CAAC,EAAE,KACxC,CAAC,MAAM,EAAE,KAAK,IAAI,QAAQ,GAAG,KAAK,oBAAoB,KAAK,CAAC,CAC9D;AAAA;AAAA,EAEF,cAAc,CAAC,gBAAgB;AAAA,IAC7B,YAAY,OAAO,cAAc,KAAK,uBAAuB,QAAQ,GAAG;AAAA,MACtE,IAAI,SAAS,gBAAgB;AAAA,QAC3B,WAAW,YAAY,WAAW;AAAA,UAChC,KAAK,eAAe,QAAQ;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA;AAEJ;AACA,6BAA6B,IAAI;AACjC,8BAA8B,QAAQ,CAAC,cAAc;AAAA,EACnD,MAAM,WAAW,KAAK,gBAAgB,IAAI,YAAY;AAAA,EACtD,IAAI,CAAC;AAAA,IAAU;AAAA,EACf,gBAAgB,MAAM,4BAA4B,gBAAgB,EAAE,KAAK,MAAM,KAAK,eAAe,SAAS,MAAM,YAAY;AAAA,EAC9H,gBAAgB,MAAM,4BAA4B,gBAAgB,EAAE,KAAK,MAAM,KAAK,wBAAwB,SAAS,aAAa,YAAY;AAAA;AAEhJ,cAAc,QAAQ,CAAC,KAAK,KAAK,OAAO;AAAA,EACtC,MAAM,MAAM,IAAI,IAAI,GAAG;AAAA,EACvB,IAAI,KAAK;AAAA,IACP,IAAI,IAAI,KAAK;AAAA,EACf,EAAO;AAAA,IACL,IAAI,IAAI,qBAAqB,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;AAAA;AAAA;AAGjD,mBAAmB,QAAQ,CAAC,KAAK,KAAK,OAAO;AAAA,EAC3C,MAAM,MAAM,IAAI,IAAI,GAAG;AAAA,EACvB,IAAI,CAAC;AAAA,IAAK;AAAA,EACV,IAAI,OAAO,KAAK;AAAA,EAChB,IAAI,IAAI,SAAS;AAAA,IAAG,IAAI,OAAO,GAAG;AAAA;AAIpC,IAAI,mBAAmB,MAAM;AAAA,MAEvB,UAAU,GAAG;AAAA,IACf,OAAO;AAAA;AAAA,MAGL,gBAAgB,GAAG;AAAA,IACrB;AAAA;AAAA,MAEE,oBAAoB,GAAG;AAAA,IACzB,OAAO;AAAA;AAAA,MAEL,wBAAwB,GAAG;AAAA,IAC7B,OAAO;AAAA;AAAA,MAEL,8BAA8B,GAAG;AAAA,IACnC,OAAO;AAAA;AAAA,MAEL,YAAY,GAAG;AAAA,IACjB;AAAA;AAAA,EAGF,kBAAkB,GAAG;AAAA,IACnB,OAAO;AAAA;AAAA,EAET,eAAe,CAAC,SAAS;AAAA,IACvB,OAAO;AAAA;AAAA,EAET,YAAY,CAAC,OAAO;AAAA,IAClB,OAAO;AAAA;AAAA,EAET,yBAAyB,CAAC,QAAQ;AAAA,IAChC,OAAO;AAAA,MACL,OAAO;AAAA,MACP,uBAAuB;AAAA,MACvB,oBAAoB;AAAA,IACtB;AAAA;AAAA,EAIF,cAAc,CAAC,MAAM,UAAU;AAAA,EAG/B,sBAAsB,CAAC,QAAQ;AAAA,IAC7B,OAAO,EAAE,QAAQ,WAAW,OAAO,KAAK;AAAA;AAAA,EAE1C,kBAAkB,CAAC,QAAQ;AAAA,IACzB,OAAO,EAAE,OAAO,MAAM,eAAe,OAAO,gBAAgB,MAAM;AAAA;AAAA,EAEpE,KAAK,GAAG;AAAA,IACN,OAAO,IAAI,YAAY,IAAI;AAAA;AAAA,EAE7B,YAAY,CAAC,OAAO;AAAA,IAClB,OAAO,IAAI,WAAW,MAAM,KAAK;AAAA;AAAA,EAEnC,eAAe,CAAC,QAAQ;AAAA,IACtB,OAAO,IAAI,aAAa;AAAA,MACtB;AAAA,MACA,QAAQ;AAAA,MACR,iBAAiB;AAAA,MACjB,cAAc,KAAK;AAAA,MACnB,QAAa;AAAA,IACf,CAAC;AAAA;AAEL;AACA,IAAI;AACJ,IAAI,cAAc,cAAc,iBAAiB;AAAA,EAC/C,WAAW,CAAC,QAAQ;AAAA,IAClB,MAAM;AAAA,IACN,aAAa,MAAM,OAAO;AAAA,IAC1B,aAAa,MAAM,SAAS,MAAM;AAAA;AAAA,MAEhC,MAAM,GAAG;AAAA,IACX,OAAO,aAAa,MAAM,OAAO,EAAE;AAAA;AAAA,MAEjC,MAAM,GAAG;AAAA,IACX,OAAO,aAAa,MAAM,OAAO,EAAE;AAAA;AAAA,MAEjC,MAAM,GAAG;AAAA,IACX,OAAO,aAAa,MAAM,OAAO,EAAE;AAAA;AAAA,MAEjC,eAAe,GAAG;AAAA,IACpB,OAAO,aAAa,MAAM,OAAO,EAAE;AAAA;AAAA,MAEjC,YAAY,GAAG;AAAA,IACjB,OAAO,aAAa,MAAM,OAAO,EAAE;AAAA;AAAA,MAGjC,aAAa,GAAG;AAAA,IAClB,OAAO,aAAa,MAAM,OAAO;AAAA;AAAA,EAGnC,cAAc,CAAC,KAAK,UAAU;AAAA,IAC5B,IAAI,aAAa,IAAI,oBAAoB,aAAa,MAAM,OAAO,EAAE,MAAM;AAAA,IAC3E,IAAI,aAAa,MAAM,OAAO,EAAE,QAAQ;AAAA,MACtC,IAAI,aAAa,IAAI,0BAA0B,aAAa,MAAM,OAAO,EAAE,MAAM;AAAA,IACnF;AAAA;AAAA,EAIF,mBAAmB,CAAC,OAAO;AAAA,IACzB,IAAI,IAAI,IAAI;AAAA,IACZ,MAAM,iBAAiB,MAAM;AAAA,IAC7B,MAAM,SAAS,kBAAkB,mBAAmB,MAAM,gBAAgB,iBAAiB,aAAa,MAAM,OAAO,EAAE;AAAA,IACvH,MAAM,UAAU,KAAK,MAAM,mBAAmB,OAAO,KAAK,aAAa,MAAM,OAAO,EAAE;AAAA,IACtF,MAAM,mBAAmB,KAAK,MAAM,mBAAmB,OAAO,KAAK,aAAa,MAAM,OAAO,EAAE;AAAA,IAC/F,MAAM,UAAU,KAAK,aAAa,MAAM,OAAO,EAAE,WAAW,OAAO,KAAK,MAAM;AAAA,IAC9E,MAAM,eAAe,MAAM,WAAW,MAAM,MAAM,MAAM,aAAa,MAAM,OAAO,EAAE;AAAA,IACpF,OAAO,EAAE,QAAQ,QAAQ,QAAQ,iBAAiB,aAAa;AAAA;AAAA,EAMjE,kBAAkB,CAAC,OAAO;AAAA,IACxB,MAAM,iBAAiB,MAAM;AAAA,IAC7B,MAAM,gBAAgB,MAAM;AAAA,IAC5B,IAAI,CAAC,kBAAkB,mBAAmB,eAAe;AAAA,MACvD,OAAO;AAAA,IACT;AAAA,IACA,MAAM,aAAa,KAAK,uBAAuB;AAAA,IAC/C,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO,IAAI,gBAAgB,cAAc,eAAe,CAAC,GAAG,KAAK,aAAa,GAAG;AAAA,QAC/E,kBAAkB,MAAM,kBAAkB;AAAA,QAC1C,sBAAsB;AAAA,MACxB,CAAC,CAAC;AAAA,MACF,oBAAoB,aAAa,MAAM;AAAA,IACzC;AAAA;AAAA,EAGF,kBAAkB,CAAC,OAAO;AAAA,IACxB,IAAI,CAAC,MAAM,eAAe,CAAC,MAAM,oBAAoB;AAAA,MACnD,OAAO,EAAE,OAAO,MAAM,eAAe,OAAO,gBAAgB,MAAM;AAAA,IACpE;AAAA,IACA,IAAI,SAAS,aAAa,MAAM,OAAO,EAAE;AAAA,IACzC,IAAI,MAAM,SAAS,MAAM,gBAAgB;AAAA,MACvC,SAAS,MAAM;AAAA,IACjB;AAAA,IACA,MAAM,SAAS;AAAA,MACb,QAAQ,aAAa,MAAM,OAAO,EAAE;AAAA,MACpC;AAAA,MACA,QAAQ,aAAa,MAAM,OAAO,EAAE;AAAA,MACpC,iBAAiB,aAAa,MAAM,OAAO,EAAE;AAAA,MAC7C,cAAc,MAAM;AAAA,IACtB;AAAA,IACA,OAAO,KAAK,WAAW,QAAQ,KAAK;AAAA;AAAA,EAGtC,UAAU,CAAC,QAAQ,QAAQ;AAAA,IACzB,OAAO;AAAA,MACL,OAAO,IAAI,UAAU,MAAM;AAAA,MAC3B,eAAe;AAAA,MACf,gBAAgB;AAAA,IAClB;AAAA;AAEJ;AACA,UAAU,IAAI;AACd,IAAI,gBAAgB,cAAc,YAAY;AAAA,EAC5C,sBAAsB,CAAC,OAAO;AAAA,IAC5B,MAAM,cAAc,KAAK,mBAAmB,KAAK;AAAA,IACjD,IAAI;AAAA,MAAa,OAAO;AAAA,IACxB,MAAM,SAAS,KAAK,oBAAoB,KAAK;AAAA,IAC7C,IAAI,MAAM,WAAW,KAAK;AAAA,MACxB,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,OAAO,IAAI,UAAU,QAAQ,EAAE,0BAA0B,KAAK,CAAC;AAAA,MACjE;AAAA,IACF;AAAA,IACA,OAAO,EAAE,QAAQ,YAAY,OAAO,IAAI,aAAa,MAAM,EAAE;AAAA;AAAA,EAE/D,kBAAkB,GAAG;AAAA,IACnB,OAAO;AAAA;AAAA,EAET,eAAe,CAAC,QAAQ;AAAA,IACtB,OAAO,IAAI,eAAe,cAAc,eAAe,CAAC,GAAG,KAAK,aAAa,GAAG;AAAA,MAC9E,cAAc;AAAA,IAChB,CAAC,CAAC;AAAA;AAEN;AACA,IAAI,eAAe,MAAM,sBAAsB,cAAc;AAAA,EAC3D,WAAW,CAAC,QAAQ;AAAA,IAClB,MAAM,MAAM;AAAA,IACZ,KAAK,OAAO;AAAA;AAAA,EAEd,UAAU,CAAC,QAAQ;AAAA,IACjB,OAAO,IAAI,cAAc,cAAc,eAAe,CAAC,GAAG,KAAK,aAAa,GAAG,EAAE,OAAO,CAAC,CAAC;AAAA;AAE9F;AACA,IAAI,eAAe,MAAM,sBAAsB,cAAc;AAAA,EAC3D,WAAW,CAAC,QAAQ;AAAA,IAClB,MAAM,MAAM;AAAA,IACZ,KAAK,OAAO;AAAA;AAAA,EAEd,UAAU,CAAC,QAAQ;AAAA,IACjB,OAAO,IAAI,cAAc,cAAc,eAAe,CAAC,GAAG,KAAK,aAAa,GAAG,EAAE,OAAO,CAAC,CAAC;AAAA;AAE9F;AACA,IAAI;AAAJ,IAAuB;AACvB,IAAI,mBAAmB,MAAM,0BAAyB,cAAc;AAAA,EAClE,WAAW,CAAC,QAAQ;AAAA,IAClB,MAAM,KAAK,UAAU,kBAAkB,yBAAyB,IAAI,SAAS,UAAU,IAAI,CAAC,oBAAoB,sBAAsB,CAAC;AAAA,IACvI,MAAM,MAAM;AAAA,IACZ,KAAK,OAAO;AAAA,IACZ,aAAa,MAAM,iBAAiB;AAAA,IACpC,aAAa,MAAM,qBAAqB;AAAA,IACxC,aAAa,MAAM,mBAAmB,gBAAgB;AAAA,IACtD,aAAa,MAAM,uBAAuB,oBAAoB;AAAA;AAAA,MAE5D,gBAAgB,GAAG;AAAA,IACrB,OAAO,aAAa,MAAM,iBAAiB;AAAA;AAAA,MAEzC,oBAAoB,GAAG;AAAA,IACzB,OAAO,aAAa,MAAM,qBAAqB;AAAA;AAAA,EAGjD,kBAAkB,GAAG;AAAA,IACnB,OAAO;AAAA;AAAA,EAET,UAAU,CAAC,QAAQ;AAAA,IACjB,OAAO,IAAI,kBAAiB,cAAc,eAAe,CAAC,GAAG,KAAK,aAAa,GAAG;AAAA,MAChF;AAAA,MACA,kBAAkB,aAAa,MAAM,iBAAiB;AAAA,MACtD,sBAAsB,aAAa,MAAM,qBAAqB;AAAA,IAChE,CAAC,CAAC;AAAA;AAAA,EAEJ,cAAc,CAAC,KAAK,SAAS;AAAA,IAC3B,MAAM,eAAe,KAAK,OAAO;AAAA,IACjC,IAAI,aAAa,IAAI,0BAA0B,aAAa,MAAM,iBAAiB,CAAC;AAAA;AAExF;AACA,oBAAoB,IAAI;AACxB,wBAAwB,IAAI;AAC5B,IAAI,kBAAkB;AACtB,IAAI;AAAJ,IAAqC;AACrC,IAAI,aAAa,MAAM,oBAAmB,YAAY;AAAA,EACpD,WAAW,CAAC,QAAQ,UAAU;AAAA,IAC5B,IAAI,IAAI;AAAA,IACR,MAAM,MAAM;AAAA,IACZ,KAAK,OAAO;AAAA,IACZ,aAAa,MAAM,+BAA+B;AAAA,IAClD,aAAa,MAAM,yBAAyB;AAAA,IAC5C,aAAa,MAAM,kCAAkC,KAAK,YAAY,OAAY,YAAI,SAAS,mCAAmC,OAAO,KAAK,CAAC;AAAA,IAC/I,aAAa,MAAM,4BAA4B,KAAK,YAAY,OAAY,YAAI,SAAS,6BAA6B,OAAO,KAAK,KAAK;AAAA;AAAA,MAErI,UAAU,GAAG;AAAA,IACf,OAAO;AAAA;AAAA,MAEL,8BAA8B,GAAG;AAAA,IACnC,OAAO,aAAa,MAAM,+BAA+B;AAAA;AAAA,MAEvD,wBAAwB,GAAG;AAAA,IAC7B,OAAO,aAAa,MAAM,yBAAyB;AAAA;AAAA,EAErD,UAAU,CAAC,QAAQ;AAAA,IACjB,OAAO,IAAI,YAAW,cAAc,eAAe,CAAC,GAAG,KAAK,aAAa,GAAG,EAAE,OAAO,CAAC,GAAG,KAAK,QAAQ;AAAA;AAAA,EAExG,cAAc,CAAC,KAAK,SAAS;AAAA,IAC3B,MAAM,eAAe,KAAK,OAAO;AAAA,IACjC,IAAI,CAAC,QAAQ,mBAAmB;AAAA,MAC9B,IAAI,aAAa,IAAI,+BAA+B,KAAK,eAAe;AAAA,MACxE,IAAI,QAAQ,aAAa;AAAA,QACvB,IAAI,aAAa,IAAI,kBAAkB,MAAM;AAAA,MAC/C;AAAA,IACF;AAAA;AAAA,MAEE,QAAQ,GAAG;AAAA,IACb,OAAO;AAAA,MACL,gCAAgC,aAAa,MAAM,+BAA+B;AAAA,MAClF,0BAA0B,aAAa,MAAM,yBAAyB;AAAA,IACxE;AAAA;AAAA,EAEF,sBAAsB,CAAC,OAAO;AAAA,IAC5B,MAAM,cAAc,KAAK,mBAAmB,KAAK;AAAA,IACjD,IAAI;AAAA,MAAa,OAAO;AAAA,IACxB,MAAM,SAAS,KAAK,oBAAoB,KAAK;AAAA,IAC7C,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO,IAAI,YAAW,QAAQ,KAAK,QAAQ;AAAA,IAC7C;AAAA;AAAA,EAEF,UAAU,CAAC,QAAQ,QAAQ;AAAA,IACzB,OAAO;AAAA,MACL,OAAO,IAAI,YAAW,QAAQ,KAAK,QAAQ;AAAA,MAC3C,eAAe;AAAA,MACf,gBAAgB;AAAA,IAClB;AAAA;AAAA,EAEF,YAAY,CAAC,MAAM;AAAA,IACjB,OAAO,KAAK,kBAAkB,CAAC,KAAK,gBAAgB,CAAC,KAAK,qBAAqB,CAAC,aAAa,MAAM,yBAAyB;AAAA;AAAA,EAE9H,yBAAyB,CAAC,OAAO;AAAA,IAC/B,IAAI,uBAAuB,aAAa,MAAM,+BAA+B;AAAA,IAC7E,IAAI,eAAe,aAAa,MAAM,yBAAyB;AAAA,IAC/D,IAAI,wBAAwB;AAAA,IAC5B,IAAI,qBAAqB;AAAA,IACzB,IAAI,MAAM,qBAAqB,MAAM,yBAAyB,CAAC,MAAM,YAAY;AAAA,MAC/E,qBAAqB;AAAA,MACrB,uBAAuB,uBAAuB;AAAA,MAC9C,IAAI,wBAAwB,MAAM,qBAAqB;AAAA,QACrD,eAAe;AAAA,QACf,wBAAwB;AAAA,MAC1B;AAAA,IACF,EAAO,SAAI,MAAM,sBAAsB,MAAM,uBAAuB;AAAA,MAClE,uBAAuB;AAAA,IACzB;AAAA,IACA,OAAO;AAAA,MACL,OAAO,IAAI,YAAW,KAAK,eAAe;AAAA,QACxC,gCAAgC;AAAA,QAChC,0BAA0B;AAAA,MAC5B,CAAC;AAAA,MACD;AAAA,MACA;AAAA,IACF;AAAA;AAEJ;AACA,kCAAkC,IAAI;AACtC,4BAA4B,IAAI;AAChC,IAAI,YAAY;AAChB,IAAI;AACJ,IAAI,kBAAkB,MAAM,yBAAwB,YAAY;AAAA,EAC9D,WAAW,CAAC,QAAQ;AAAA,IAClB,MAAM,KAAK,UAAU,iBAAiB,IAAI,SAAS,UAAU,IAAI,CAAC,cAAc,CAAC;AAAA,IACjF,MAAM,MAAM;AAAA,IACZ,KAAK,OAAO;AAAA,IACZ,aAAa,MAAM,aAAa;AAAA,IAChC,aAAa,MAAM,eAAe,YAAY;AAAA;AAAA,MAE5C,YAAY,GAAG;AAAA,IACjB,OAAO,aAAa,MAAM,aAAa;AAAA;AAAA,EAEzC,UAAU,CAAC,QAAQ;AAAA,IACjB,OAAO,IAAI,iBAAgB,cAAc,eAAe,CAAC,GAAG,KAAK,aAAa,GAAG;AAAA,MAC/E;AAAA,MACA,cAAc,aAAa,MAAM,aAAa;AAAA,IAChD,CAAC,CAAC;AAAA;AAAA,EAEJ,sBAAsB,CAAC,OAAO;AAAA,IAC5B,MAAM,cAAc,KAAK,mBAAmB,KAAK;AAAA,IACjD,IAAI;AAAA,MAAa,OAAO;AAAA,IACxB,MAAM,SAAS,KAAK,oBAAoB,KAAK;AAAA,IAC7C,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO,IAAI,iBAAgB,cAAc,eAAe,CAAC,GAAG,MAAM,GAAG;AAAA,QACnE,cAAc,aAAa,MAAM,aAAa;AAAA,MAChD,CAAC,CAAC;AAAA,IACJ;AAAA;AAAA,EAEF,UAAU,CAAC,QAAQ,OAAO;AAAA,IACxB,MAAM,gBAAgB,CAAC,MAAM,SAAS,aAAa,MAAM,aAAa,MAAM,MAAM;AAAA,IAClF,OAAO;AAAA,MACL,OAAO,IAAI,UAAU,MAAM;AAAA,MAC3B;AAAA,MACA,gBAAgB;AAAA,IAClB;AAAA;AAEJ;AACA,gBAAgB,IAAI;AACpB,IAAI,iBAAiB;AACrB,IAAI,cAAc,MAAM,qBAAqB,iBAAiB;AAAA,EAC5D,WAAW,CAAC,eAAe;AAAA,IACzB,MAAM;AAAA,IACN,KAAK,OAAO;AAAA,IACZ,KAAK,gBAAgB,yBAAyB,eAAe,cAAc,gBAAgB;AAAA;AAAA,MAEzF,MAAM,GAAG;AAAA,IACX,OAAO,KAAK,cAAc;AAAA;AAAA,MAExB,MAAM,GAAG;AAAA,IACX,OAAO,KAAK,cAAc;AAAA;AAAA,MAExB,MAAM,GAAG;AAAA,IACX,OAAO,KAAK,cAAc;AAAA;AAAA,MAExB,eAAe,GAAG;AAAA,IACpB,OAAO,KAAK,cAAc;AAAA;AAAA,MAExB,YAAY,GAAG;AAAA,IACjB,OAAO,KAAK,cAAc;AAAA;AAAA,MAExB,UAAU,GAAG;AAAA,IACf,OAAO,KAAK,cAAc;AAAA;AAAA,MAExB,gBAAgB,GAAG;AAAA,IACrB,OAAO,KAAK,cAAc;AAAA;AAAA,MAExB,oBAAoB,GAAG;AAAA,IACzB,OAAO,KAAK,cAAc;AAAA;AAAA,MAExB,wBAAwB,GAAG;AAAA,IAC7B,OAAO,KAAK,cAAc;AAAA;AAAA,MAExB,8BAA8B,GAAG;AAAA,IACnC,OAAO,KAAK,cAAc;AAAA;AAAA,MAExB,YAAY,GAAG;AAAA,IACjB,OAAO,KAAK,cAAc;AAAA;AAAA,EAE5B,sBAAsB,CAAC,OAAO;AAAA,IAC5B,MAAM,aAAa,KAAK,cAAc,uBAAuB,KAAK;AAAA,IAClE,IAAI,WAAW,WAAW,YAAY;AAAA,MACpC,OAAO,EAAE,QAAQ,YAAY,OAAO,IAAI,aAAa,WAAW,KAAK,EAAE;AAAA,IACzE;AAAA,IACA,IAAI,WAAW,WAAW,WAAW;AAAA,MACnC,OAAO,EAAE,QAAQ,WAAW,OAAO,KAAK;AAAA,IAC1C;AAAA,IACA,IAAI,WAAW,WAAW,eAAe;AAAA,MACvC,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,OAAO,IAAI,aAAa,WAAW,KAAK;AAAA,QACxC,oBAAoB,WAAW;AAAA,MACjC;AAAA,IACF;AAAA,IACA,MAAM,cAAc;AAAA,IACpB,MAAM,IAAI,MACR,oEAAoE,YAAY,SAClF;AAAA;AAAA,EAEF,UAAU,CAAC,QAAQ;AAAA,IACjB,OAAO,IAAI,aAAa,KAAK,cAAc,WAAW,MAAM,CAAC;AAAA;AAAA,EAE/D,cAAc,CAAC,KAAK,SAAS;AAAA,IAC3B,KAAK,cAAc,eAAe,KAAK,OAAO;AAAA;AAAA,EAEhD,KAAK,GAAG;AAAA,IACN,OAAO;AAAA;AAAA,EAET,MAAM,GAAG;AAAA,IACP,OAAO,KAAK;AAAA;AAEhB;AACA,IAAI,aAAa,MAAM,oBAAoB,iBAAiB;AAAA,EAC1D,WAAW,CAAC,eAAe,OAAO;AAAA,IAChC,MAAM;AAAA,IACN,KAAK,OAAO;AAAA,IACZ,KAAK,gBAAgB,yBAAyB,cAAc,cAAc,gBAAgB;AAAA,IAC1F,KAAK,QAAQ;AAAA;AAAA,MAEX,MAAM,GAAG;AAAA,IACX,OAAO,KAAK,cAAc;AAAA;AAAA,MAExB,MAAM,GAAG;AAAA,IACX,OAAO,KAAK,cAAc;AAAA;AAAA,MAExB,MAAM,GAAG;AAAA,IACX,OAAO,KAAK,cAAc;AAAA;AAAA,MAExB,eAAe,GAAG;AAAA,IACpB,OAAO,KAAK,cAAc;AAAA;AAAA,MAExB,YAAY,GAAG;AAAA,IACjB,OAAO,KAAK,cAAc;AAAA;AAAA,MAExB,UAAU,GAAG;AAAA,IACf,OAAO,KAAK,cAAc;AAAA;AAAA,MAExB,gBAAgB,GAAG;AAAA,IACrB,OAAO,KAAK,cAAc;AAAA;AAAA,MAExB,oBAAoB,GAAG;AAAA,IACzB,OAAO,KAAK,cAAc;AAAA;AAAA,MAExB,wBAAwB,GAAG;AAAA,IAC7B,OAAO,KAAK,cAAc;AAAA;AAAA,MAExB,8BAA8B,GAAG;AAAA,IACnC,OAAO,KAAK,cAAc;AAAA;AAAA,MAExB,YAAY,GAAG;AAAA,IACjB,OAAO,KAAK,cAAc;AAAA;AAAA,EAE5B,UAAU,CAAC,QAAQ;AAAA,IACjB,OAAO,IAAI,YAAY,KAAK,cAAc,WAAW,MAAM,GAAG,KAAK,KAAK;AAAA;AAAA,EAE1E,cAAc,CAAC,KAAK,SAAS;AAAA,IAC3B,KAAK,cAAc,eAAe,KAAK,OAAO;AAAA;AAAA,EAEhD,KAAK,GAAG;AAAA,IACN,OAAO,KAAK;AAAA;AAAA,EAEd,KAAK,CAAC,QAAQ;AAAA,IACZ,OAAO,KAAK,cAAc,gBAAgB,MAAM;AAAA;AAEpD;AACA,SAAS,kBAAkB,CAAC,MAAM;AAAA,EAChC,OAAO,IAAI,aAAa;AAAA,IACtB,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,iBAAiB;AAAA,IACjB,cAAmB;AAAA,IACnB,QAAa;AAAA,EACf,CAAC;AAAA;AAIH,IAAI;AAAJ,IAAc;AAAd,IAA2B;AAC3B,IAAI,YAAY,MAAM;AAAA,EACpB,WAAW,CAAC,WAAW;AAAA,IACrB,aAAa,MAAM,0BAA0B,IAAI,GAAK;AAAA,IACtD,aAAa,MAAM,WAAW;AAAA,IAC9B,aAAa,MAAM,WAAW;AAAA,IAC9B,aAAa,MAAM,aAAa,UAAU,UAAU;AAAA,IACpD,aAAa,MAAM,aAAa,UAAU,UAAU;AAAA;AAAA,EAUtD,OAAO,CAAC,QAAQ;AAAA,IACd,IAAI,aAAa,MAAM,QAAQ,EAAE,IAAI,MAAM,GAAG;AAAA,MAC5C,QAAQ,KACN,0BAA0B,mDAC5B;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM,cAAc,aAAa,MAAM,QAAQ,EAAE,SAAS;AAAA,IAC1D,aAAa,MAAM,QAAQ,EAAE,IAAI,MAAM;AAAA,IACvC,IAAI,aAAa;AAAA,MACf,aAAa,MAAM,WAAW,EAAE,KAAK,IAAI;AAAA,IAC3C;AAAA;AAAA,EASF,OAAO,CAAC,QAAQ;AAAA,IACd,IAAI,CAAC,aAAa,MAAM,QAAQ,EAAE,OAAO,MAAM,GAAG;AAAA,MAChD,QAAQ,KACN,0BAA0B,yEAC5B;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,aAAa,MAAM,QAAQ,EAAE,SAAS,GAAG;AAAA,MAC3C,aAAa,MAAM,WAAW,EAAE,KAAK,IAAI;AAAA,IAC3C;AAAA;AAAA,MAKE,QAAQ,GAAG;AAAA,IACb,OAAO,aAAa,MAAM,QAAQ,EAAE,OAAO;AAAA;AAAA,EAK7C,QAAQ,CAAC,QAAQ;AAAA,IACf,OAAO,aAAa,MAAM,QAAQ,EAAE,IAAI,MAAM;AAAA;AAAA,EAUhD,kBAAkB,CAAC,QAAQ;AAAA,IACzB,WAAW,UAAU,aAAa,MAAM,QAAQ,GAAG;AAAA,MACjD,IAAI,OAAO,WAAW,MAAM,GAAG;AAAA,QAC7B,aAAa,MAAM,QAAQ,EAAE,OAAO,MAAM;AAAA,MAC5C;AAAA,IACF;AAAA;AAEJ;AACA,WAAW,IAAI;AACf,cAAc,IAAI;AAClB,cAAc,IAAI;AAGlB,IAAI,kCAAkC,IAAI,IAAI;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAI,sBAAsB;AAC1B,SAAS,iBAAiB,GAAG;AAAA,EAC3B,OAAO,GAAG,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC;AAAA;AAEnE,eAAe,YAAY,CAAC,OAAO;AAAA,EACjC,IAAI,OAAO,UAAU,YAAY;AAAA,IAC/B,OAAO,MAAM;AAAA,EACf;AAAA,EACA,OAAO;AAAA;AAET,eAAe,gBAAgB,CAAC,QAAQ;AAAA,EACtC,MAAM,UAAU,OAAO,QAAQ,MAAM;AAAA,EACrC,MAAM,kBAAkB,MAAM,QAAQ,IACpC,QAAQ,IAAI,QAAQ,KAAK,WAAW;AAAA,IAClC,IAAI,UAAe;AAAA,MAAG,OAAO,CAAC,KAAU,SAAC;AAAA,IACzC,MAAM,gBAAgB,MAAM,aAAa,KAAK;AAAA,IAC9C,OAAO;AAAA,MACL;AAAA,MACA,MAAM,QAAQ,aAAa,IAAI,cAAc,KAAK,GAAG,IAAI;AAAA,IAC3D;AAAA,GACD,CACH;AAAA,EACA,OAAO,OAAO,YACZ,gBAAgB,OAAO,EAAE,GAAG,WAAW,UAAe,SAAC,CACzD;AAAA;AAEF,eAAe,cAAc,CAAC,SAAS;AAAA,EACrC,IAAI,CAAC;AAAA,IAAS,OAAO,CAAC;AAAA,EACtB,MAAM,UAAU,OAAO,QAAQ,OAAO;AAAA,EACtC,MAAM,kBAAkB,MAAM,QAAQ,IACpC,QAAQ,IAAI,QAAQ,KAAK,WAAW,CAAC,KAAK,MAAM,aAAa,KAAK,CAAC,CAAC,CACtE;AAAA,EACA,OAAO,OAAO,YAAY,eAAe;AAAA;AAE3C,SAAS,iBAAiB,CAAC,KAAK;AAAA,EAC9B,MAAM,WAAW,IAAI,IAAI,IAAI,SAAS,IAAI,QAAQ;AAAA,EAClD,YAAY,KAAK,UAAU,IAAI,cAAc;AAAA,IAC3C,IAAI,CAAC,+BAA+B,SAAS,GAAG,GAAG;AAAA,MACjD,SAAS,aAAa,OAAO,KAAK,KAAK;AAAA,IACzC;AAAA,EACF;AAAA,EACA,SAAS,aAAa,KAAK;AAAA,EAC3B,OAAO,SAAS,SAAS;AAAA;AAE3B,IAAI;AAAJ,IAAY;AAAZ,IAA2B;AAA3B,IAA4C;AAA5C,IAA4D;AAA5D,IAA0E;AAA1E,IAAoF;AAApF,IAAgG;AAAhG,IAA4G;AAA5G,IAAmH;AAAnH,IAA6H;AAA7H,IAAsJ;AAAtJ,IAAqK;AAArK,IAAuL;AAAvL,IAA+M;AAA/M,IAAiO;AAAjO,IAA+O;AAA/O,IAAqQ;AAArQ,IAA2R;AAA3R,IAA0S;AAA1S,IAAyT;AAAzT,IAA2U;AAA3U,IAAuV;AAAvV,IAAyW;AAAzW,IAAsY;AAAtY,IAAia;AAAja,IAA0b;AAA1b,IAAgd;AAAhd,IAAqe;AAAre,IAAwgB;AAAxgB,IAAuiB;AAAviB,IAA8jB;AAA9jB,IAAqlB;AAArlB,IAAwmB;AAAxmB,IAA4nB;AAA5nB,IAAopB;AAAppB,IAA2qB;AAA3qB,IAAssB;AAAtsB,IAAytB;AAAztB,IAA0vB;AAA1vB,IAA+wB;AAA/wB,IAAyyB;AAAzyB,IAAg0B;AAAh0B,IAA01B;AAA11B,IAAu3B;AAAv3B,IAAw4B;AAAx4B,IAAk5B;AAAl5B,IAA+5B;AAA/5B,IAAu7B;AAAv7B,IAAw8B;AAAx8B,IAA09B;AAA19B,IAA2+B;AAA3+B,IAAmgC;AAAngC,IAAyhC;AAAzhC,IAAwiC;AAAxiC,IAAujC;AAAvjC,IAAglC;AAAhlC,IAAomC;AAApmC,IAAinC;AAAjnC,IAA6nC;AAA7nC,IAAwpC;AAAxpC,IAAorC;AAAprC,IAAqtC;AAArtC,IAAkvC;AAAlvC,IAA4vC;AAA5vC,IAAuxC;AACvxC,IAAI,cAAc,MAAM;AAAA,EACtB,WAAW,CAAC,SAAS;AAAA,IACnB,aAAa,MAAM,sBAAsB;AAAA,IACzC,aAAa,MAAM,QAAQ,IAAI;AAAA,IAC/B,aAAa,MAAM,aAAa;AAAA,IAChC,aAAa,MAAM,eAAe;AAAA,IAClC,aAAa,MAAM,cAAc;AAAA,IACjC,aAAa,MAAM,8BAA8B,IAAI,GAAK;AAAA,IAC1D,aAAa,MAAM,UAAU,KAAK;AAAA,IAClC,aAAa,MAAM,UAAU;AAAA,IAC7B,aAAa,MAAM,YAAY,KAAK;AAAA,IACpC,aAAa,MAAM,KAAK;AAAA,IACxB,aAAa,MAAM,QAAQ;AAAA,IAC3B,aAAa,MAAM,uBAAuB;AAAA,IAC1C,aAAa,MAAM,eAAe,CAAC;AAAA,IACnC,aAAa,MAAM,kBAAkB,CAAC;AAAA,IACtC,aAAa,MAAM,YAAY;AAAA,IAC/B,aAAa,MAAM,oBAAoB;AAAA,IACvC,aAAa,MAAM,oBAAoB;AAAA,IACvC,aAAa,MAAM,eAAe,QAAQ,QAAQ,CAAC,CAAC,CAAC;AAAA,IAOrD,aAAa,MAAM,eAAe,KAAK;AAAA,IACvC,aAAa,MAAM,kBAAkB,IAAI,eAAiB;AAAA,IAC1D,aAAa,MAAM,UAAU;AAAA,IAC7B,aAAa,MAAM,gBAAgB;AAAA,IAEnC,aAAa,MAAM,2BAA2B;AAAA,IAC9C,aAAa,MAAM,2BAA2B,IAAG;AAAA,IAEjD,aAAa,MAAM,yBAAyB,CAAC;AAAA,IAE7C,aAAa,MAAM,sBAAsB,GAAG;AAAA,IAE5C,aAAa,MAAM,qBAAqB,IAAG;AAAA,IAE3C,aAAa,MAAM,iCAAiC;AAAA,IACpD,aAAa,MAAM,6BAA6B;AAAA,IAChD,aAAa,MAAM,uBAAuB,CAAC;AAAA,IAG3C,aAAa,MAAM,uBAAuB,CAAC,CAAC;AAAA,IAC5C,aAAa,MAAM,mBAAmB,GAAG;AAAA,IACzC,aAAa,MAAM,oBAAoB,CAAC;AAAA,IACxC,aAAa,MAAM,wBAAwB,GAAG;AAAA,IAC9C,aAAa,MAAM,uBAAuB,IAAG;AAAA,IAC7C,aAAa,MAAM,2BAA2B,CAAC;AAAA,IAC/C,aAAa,MAAM,mBAAmB,CAAC;AAAA,IACvC,aAAa,MAAM,+BAA+B;AAAA,IAClD,aAAa,MAAM,qBAAqB,CAAC;AAAA,IACzC,aAAa,MAAM,0BAA0B,IAAI;AAAA,IACjD,aAAa,MAAM,uBAAuB,IAAI;AAAA,IAC9C,aAAa,MAAM,0BAA0B,CAAC;AAAA,IAC9C,aAAa,MAAM,6BAA6B,EAAE;AAAA,IAClD,aAAa,MAAM,eAAe;AAAA,IAClC,IAAI,IAAI,IAAI,IAAI;AAAA,IAChB,KAAK,UAAU,eAAe,EAAE,WAAW,KAAK,GAAG,OAAO;AAAA,IAC1D,gBAAgB,KAAK,OAAO;AAAA,IAC5B,aAAa,MAAM,YAAY,mBAAmB;AAAA,MAChD,SAAS,KAAK,KAAK,QAAQ,WAAW,OAAO,KAAK;AAAA,MAClD,QAAQ,KAAK,QAAQ;AAAA,IACvB,CAAC,CAAC;AAAA,IACF,aAAa,MAAM,YAAY,IAAI,UAAU;AAAA,MAC3C,YAAY,MAAM;AAAA,QAChB,IAAI;AAAA,QACJ,aAAa,MAAM,YAAY,aAAa,MAAM,UAAU,EAAE,MAAM,CAAC;AAAA,QACrE,IAAI,aAAa,MAAM,QAAQ,GAAG;AAAA,WAC/B,MAAM,aAAa,MAAM,uBAAuB,MAAM,QAAgB,IAAI,MAAM,YAAY;AAAA,QAC/F;AAAA;AAAA,MAEF,YAAY,MAAM;AAAA,QAChB,IAAI;AAAA,QACJ,IAAI,CAAC,aAAa,MAAM,QAAQ;AAAA,UAAG;AAAA,QACnC,KAAK,MAAM,KAAK,QAAQ,WAAW,OAAY,YAAI,IAAI;AAAA,UAAS;AAAA,QAChE,gBAAgB,MAAM,wBAAwB,QAAQ,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,EAC9E;AAAA;AAAA,IAEL,CAAC,CAAC;AAAA,IACF,IAAI;AAAA,IACJ,IAAI,QAAQ,cAAc;AAAA,MACxB,MAAM,oBAAoB,CAAC,QAAQ;AAAA,QACjC,MAAM,SAAS,CAAC;AAAA,QAChB,YAAY,OAAO,UAAU,OAAO,QAAQ,GAAG,GAAG;AAAA,UAChD,MAAM,SAAS,QAAQ,aAAa,OAAO,KAAK;AAAA,UAChD,OAAO,UAAU;AAAA,QACnB;AAAA,QACA,OAAO;AAAA;AAAA,MAET,cAAc,QAAQ,cAAc,CAAC,QAAQ,QAAQ,YAAY,kBAAkB,GAAG,CAAC,IAAI;AAAA,IAC7F,EAAO;AAAA,MACL,cAAc,QAAQ;AAAA;AAAA,IAExB,aAAa,MAAM,gBAAgB,IAAI,cAAc,QAAQ,QAAQ,WAAW,CAAC;AAAA,IACjF,aAAa,MAAM,UAAU,KAAK,QAAQ,OAAO;AAAA,IACjD,aAAa,MAAM,QAAQ,KAAK,KAAK,QAAQ,QAAQ,OAAO,KAAK,MAAM;AAAA,IACvE,MAAM,mBAAmB,KAAK,QAAQ,gBAAgB,OAAO,KAAK,IAAI,SAAS,MAAM,GAAG,IAAI;AAAA,IAC5F,MAAM,cAAc,cAAc,eAAe,CAAC,IAAI,KAAK,QAAQ,mBAAmB,OAAO,KAAK,eAAe,GAAG;AAAA,MAClH,iBAAiB,MAAM;AAAA,QACrB,IAAI,KAAK;AAAA,QACT,aAAa,MAAM,YAAY,KAAK;AAAA,SACnC,OAAO,MAAM,QAAQ,mBAAmB,OAAY,YAAI,IAAI,oBAAoB,QAAgB,IAAI,KAAK,GAAG;AAAA;AAAA,IAEjH,CAAC;AAAA,IACD,aAAa,MAAM,iBAAiB;AAAA,MAClC,cAAc,YAAY;AAAA,MAC1B,UAAU,YAAY;AAAA,MACtB,YAAY,YAAY;AAAA,IAC1B,CAAC;AAAA,IACD,MAAM,yBAAyB,uBAC7B,iBACA,WACF;AAAA,IACA,aAAa,MAAM,iBAAiB,oCAClC,2BAA2B,sBAAsB,CACnD,CAAC;AAAA,IACD,aAAa,MAAM,eAAe,gCAAgC,aAAa,MAAM,eAAe,CAAC,CAAC;AAAA,IACtG,gBAAgB,MAAM,wBAAwB,+BAA+B,EAAE,KAAK,IAAI;AAAA;AAAA,MAEtF,WAAW,GAAG;AAAA,IAChB,OAAO,aAAa,MAAM,UAAU,EAAE;AAAA;AAAA,MAEpC,KAAK,GAAG;AAAA,IACV,OAAO,aAAa,MAAM,MAAM;AAAA;AAAA,MAE9B,UAAU,GAAG;AAAA,IACf,OAAO,aAAa,MAAM,UAAU,EAAE;AAAA;AAAA,MAEpC,UAAU,GAAG;AAAA,IACf,OAAO,aAAa,MAAM,UAAU,EAAE;AAAA;AAAA,MAEpC,IAAI,GAAG;AAAA,IACT,OAAO,aAAa,MAAM,KAAK;AAAA;AAAA,EAEjC,SAAS,CAAC,UAAU,UAAU,MAAM,IACjC;AAAA,IACD,MAAM,iBAAiB,CAAC;AAAA,IACxB,aAAa,MAAM,YAAY,EAAE,IAAI,gBAAgB,CAAC,UAAU,OAAO,CAAC;AAAA,IACxE,IAAI,CAAC,aAAa,MAAM,QAAQ;AAAA,MAAG,gBAAgB,MAAM,wBAAwB,QAAQ,EAAE,KAAK,IAAI;AAAA,IACpG,OAAO,MAAM;AAAA,MACX,aAAa,MAAM,YAAY,EAAE,OAAO,cAAc;AAAA;AAAA;AAAA,EAG1D,cAAc,GAAG;AAAA,IACf,IAAI,IAAI;AAAA,IACR,aAAa,MAAM,YAAY,EAAE,MAAM;AAAA,KACtC,KAAK,aAAa,MAAM,iCAAiC,MAAM,QAAgB,GAAG,KAAK,IAAI;AAAA,KAC3F,KAAK,aAAa,MAAM,6BAA6B,MAAM,QAAgB,GAAG,KAAK,IAAI;AAAA;AAAA,EAG1F,YAAY,GAAG;AAAA,IACb,OAAO,aAAa,MAAM,UAAU,EAAE;AAAA;AAAA,EAGxC,UAAU,GAAG;AAAA,IACX,IAAI,aAAa,MAAM,UAAU,EAAE,iBAAsB;AAAA,MAAG,OAAO;AAAA,IACnE,OAAO,KAAK,IAAI,IAAI,aAAa,MAAM,UAAU,EAAE;AAAA;AAAA,EAGrD,WAAW,GAAG;AAAA,IACZ,OAAO,aAAa,MAAM,UAAU;AAAA;AAAA,EAGtC,SAAS,GAAG;AAAA,IACV,OAAO,CAAC,aAAa,MAAM,UAAU,EAAE;AAAA;AAAA,EAEzC,UAAU,GAAG;AAAA,IACX,OAAO,aAAa,MAAM,QAAQ;AAAA;AAAA,EAEpC,QAAQ,GAAG;AAAA,IACT,OAAO,aAAa,MAAM,UAAU,EAAE;AAAA;AAAA,OAQlC,0BAAyB,GAAG;AAAA,IAChC,IAAI,IAAI;AAAA,IACR,iBAAiB,MAAM,aAAa,EAAE;AAAA,IACtC,IAAI;AAAA,MACF,IAAI,aAAa,MAAM,UAAU,EAAE,cAAc,GAAG,KAAK,aAAa,MAAM,uBAAuB,MAAM,OAAY,YAAI,GAAG,OAAO,UAAU;AAAA,SAC1I,KAAK,aAAa,MAAM,uBAAuB,MAAM,QAAgB,GAAG,MAAM,4BAA4B;AAAA,MAC7G;AAAA,MACA,MAAM,gBAAgB,MAAM,wBAAwB,WAAW,EAAE,KAAK,IAAI;AAAA,cAC1E;AAAA,MACA,iBAAiB,MAAM,aAAa,EAAE;AAAA;AAAA;AAAA,OAiBpC,gBAAe,CAAC,MAAM;AAAA,IAC1B,IAAI,aAAa,MAAM,KAAK,MAAM,QAAQ;AAAA,MACxC,MAAM,IAAI,MACR,0CAA0C,aAAa,MAAM,KAAK,2DACpE;AAAA,IACF;AAAA,IACA,IAAI,CAAC,aAAa,MAAM,QAAQ,GAAG;AAAA,MACjC,gBAAgB,MAAM,wBAAwB,QAAQ,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,EAC9E;AAAA,IACH;AAAA,IACA,MAAM,iBAAiB,YAAY,EAAE,iBAAiB,MAAM,gBAAgB,EAAE;AAAA,IAC9E,aAAa,MAAM,UAAU,EAAE,QAAQ,cAAc;AAAA,IACrD,MAAM,oBAAoB,WAAW,MAAM;AAAA,MACzC,QAAQ,KACN,wBAAwB,4GAAiH,CAAC,mBAAmB,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,IAAI,KACjM,IAAI,MAAM,aAAa,CACzB;AAAA,OACC,KAAG;AAAA,IACN,IAAI;AAAA,MACF,QAAQ,UAAU,MAAM,gBAAgB,mBAAmB,MAAM,KAAK,cAAc,IAAI;AAAA,MACxF,MAAM,sBAAsB,KAAK,OAAO;AAAA,QACtC,EAAE,SAAS,eAAe,EAAE,SAAS,eAAe,GAAG,QAAQ,EAAE;AAAA,QACjE,EAAE,SAAS,eAAe,EAAE,SAAS,aAAa,GAAG,IAAI,EAAE;AAAA,MAC7D,CAAC;AAAA,MACD,aAAa,MAAM,gBAAgB,EAAE,YACnC,UACA,IAAI,IAAI,KAAK,IAAI,CAAC,YAAY,QAAQ,GAAG,CAAC,CAC5C;AAAA,MACA,MAAM,gBAAgB,MAAM,wBAAwB,aAAa,EAAE,KAAK,MAAM,qBAAqB,OAAO;AAAA,QACxG,6BAA6B;AAAA,MAC/B,CAAC;AAAA,MACD,IAAI,mBAAmB,QAAQ,mBAAmB,MAAM;AAAA,QACtD,MAAM,aAAa,aAAa,MAAM,UAAU,EAAE,uBAAuB;AAAA,UACvE,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,UACA,gBAAgB;AAAA,UAChB,eAAe;AAAA,UACf,KAAK,KAAK,IAAI;AAAA,UACd,sBAAsB,aAAa,MAAM,qBAAqB;AAAA,UAC9D;AAAA,QACF,CAAC;AAAA,QACD,IAAI,WAAW,WAAW,YAAY;AAAA,UACpC,aAAa,MAAM,YAAY,WAAW,KAAK;AAAA,QACjD,EAAO;AAAA,UACL,QAAQ,KACN,oEAAoE,aAAa,MAAM,UAAU,EAAE,kBAAkB,WAAW,0DAChI,IAAI,MAAM,aAAa,CACzB;AAAA;AAAA,MAEJ;AAAA,MACA,OAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,cACA;AAAA,MACA,aAAa,iBAAiB;AAAA,MAC9B,aAAa,MAAM,UAAU,EAAE,QAAQ,cAAc;AAAA;AAAA;AAAA,OAcnD,cAAa,CAAC,MAAM;AAAA,IACxB,OAAO,gBAAgB,MAAM,wBAAwB,yBAAyB,EAAE,KAAK,MAAM,MAAM,CAAC;AAAA;AAEtG;AACA,SAAS,IAAI;AACb,gBAAgB,IAAI;AACpB,kBAAkB,IAAI;AACtB,iBAAiB,IAAI;AACrB,eAAe,IAAI;AACnB,WAAW,IAAI;AACf,aAAa,IAAI;AACjB,aAAa,IAAI;AACjB,QAAQ,IAAI;AACZ,WAAW,IAAI;AACf,0BAA0B,IAAI;AAC9B,gBAAgB,IAAI;AACpB,mBAAmB,IAAI;AACvB,yBAAyB,IAAI;AAC7B,mBAAmB,QAAQ,GAAG;AAAA,EAC5B,OAAO,aAAa,MAAM,aAAa,IAAI;AAAA;AAE7C,eAAe,IAAI;AACnB,uBAAuB,IAAI;AAC3B,uBAAuB,IAAI;AAC3B,gBAAgB,IAAI;AACpB,gBAAgB,IAAI;AACpB,mBAAmB,IAAI;AACvB,aAAa,IAAI;AACjB,mBAAmB,IAAI;AACvB,8BAA8B,IAAI;AAClC,4BAA4B,IAAI;AAChC,0BAA0B,IAAI;AAC9B,uBAAuB,IAAI;AAC3B,sBAAsB,IAAI;AAC1B,oCAAoC,IAAI;AACxC,gCAAgC,IAAI;AACpC,wBAAwB,IAAI;AAC5B,wBAAwB,IAAI;AAC5B,oBAAoB,IAAI;AACxB,qBAAqB,IAAI;AACzB,yBAAyB,IAAI;AAC7B,wBAAwB,IAAI;AAC5B,4BAA4B,IAAI;AAChC,oBAAoB,IAAI;AACxB,kCAAkC,IAAI;AACtC,sBAAsB,IAAI;AAC1B,2BAA2B,IAAI;AAC/B,wBAAwB,IAAI;AAC5B,2BAA2B,IAAI;AAC/B,8BAA8B,IAAI;AAClC,kBAAkB,IAAI;AACtB,WAAW,cAAc,GAAG;AAAA,EAC1B,IAAI,IAAI,IAAI;AAAA,EACZ,aAAa,MAAM,UAAU,IAAI;AAAA,EACjC,gBAAgB,MAAM,wBAAwB,2BAA2B,EAAE,KAAK,IAAI;AAAA,EACpF,IAAI;AAAA,IACF,MAAM,gBAAgB,MAAM,wBAAwB,eAAe,EAAE,KAAK,IAAI;AAAA,IAC9E,OAAO,KAAK;AAAA,IACZ,aAAa,MAAM,QAAQ,GAAG;AAAA,IAC9B,IAAI,eAAe,OAAO;AAAA,MACxB,aAAa,MAAM,YAAY,aAAa,MAAM,UAAU,EAAE,aAAa,GAAG,CAAC;AAAA,IACjF;AAAA,IACA,IAAI,aAAa,MAAM,QAAQ,GAAG;AAAA,MAChC,MAAM,YAAY,MAAM,aAAa,MAAM,QAAQ,EAAE,KAAK,MAAM,GAAG;AAAA,MACnE,MAAM,cAAc,EAAE,eAAe;AAAA,MACrC,IAAI,aAAa,OAAO,cAAc,YAAY,aAAa;AAAA,QAC7D,IAAI,UAAU,QAAQ;AAAA,UACpB,KAAK,QAAQ,SAAS,eAAe,eAAe,CAAC,IAAI,KAAK,KAAK,QAAQ,WAAW,OAAO,KAAK,CAAC,CAAC,GAAG,UAAU,MAAM;AAAA,QACzH;AAAA,QACA,IAAI,UAAU,SAAS;AAAA,UACrB,KAAK,QAAQ,UAAU,eAAe,eAAe,CAAC,IAAI,KAAK,KAAK,QAAQ,YAAY,OAAO,KAAK,CAAC,CAAC,GAAG,UAAU,OAAO;AAAA,QAC5H;AAAA,QACA,iBAAiB,MAAM,wBAAwB,EAAE;AAAA,QACjD,IAAI,aAAa,MAAM,wBAAwB,IAAI,aAAa,MAAM,2BAA2B,GAAG;AAAA,UAClG,QAAQ,KACN,iDAAiD,aAAa,MAAM,2BAA2B,sFAAsF,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,KACpO,IAAI,MAAM,aAAa,CACzB;AAAA,UACA,IAAI,eAAe,OAAO;AAAA,YACxB,gBAAgB,MAAM,wBAAwB,yBAAyB,EAAE,KAAK,MAAM,GAAG;AAAA,UACzF;AAAA,UACA,gBAAgB,MAAM,wBAAwB,WAAW,EAAE,KAAK,IAAI;AAAA,UACpE;AAAA,QACF;AAAA,QACA,aAAa,MAAM,QAAQ,IAAI;AAAA,QAC/B,IAAI,aAAa,MAAM,UAAU,aAAa,YAAY;AAAA,UACxD,aAAa,MAAM,YAAY,aAAa,MAAM,UAAU,EAAE,MAAM,CAAC;AAAA,QACvE;AAAA,QACA,aAAa,MAAM,2BAA2B,CAAC;AAAA,QAC/C,aAAa,MAAM,uBAAuB,CAAC,CAAC;AAAA,QAC5C,MAAM,gBAAgB,MAAM,wBAAwB,sBAAsB,EAAE,KAAK,MAAM,aAAa,MAAM,wBAAwB,CAAC;AAAA,QACnI,KAAK,KAAK,KAAK,QAAQ,WAAW,OAAY,YAAI,GAAG,SAAS;AAAA,UAC5D,gBAAgB,MAAM,wBAAwB,WAAW,EAAE,KAAK,IAAI;AAAA,UACpE;AAAA,QACF;AAAA,QACA,aAAa,MAAM,UAAU,KAAK;AAAA,QAClC,OAAO,gBAAgB,MAAM,wBAAwB,QAAQ,EAAE,KAAK,IAAI;AAAA,MAC1E;AAAA,MACA,IAAI,eAAe,OAAO;AAAA,QACxB,gBAAgB,MAAM,wBAAwB,yBAAyB,EAAE,KAAK,MAAM,GAAG;AAAA,MACzF;AAAA,MACA,gBAAgB,MAAM,wBAAwB,WAAW,EAAE,KAAK,IAAI;AAAA,MACpE;AAAA,IACF;AAAA,IACA,IAAI,eAAe,OAAO;AAAA,MACxB,gBAAgB,MAAM,wBAAwB,yBAAyB,EAAE,KAAK,MAAM,GAAG;AAAA,IACzF;AAAA,IACA,gBAAgB,MAAM,wBAAwB,WAAW,EAAE,KAAK,IAAI;AAAA,IACpE,MAAM;AAAA;AAAA,EAER,gBAAgB,MAAM,wBAAwB,WAAW,EAAE,KAAK,IAAI;AAAA;AAEtE,cAAc,QAAQ,GAAG;AAAA,EACvB,IAAI,IAAI;AAAA,EACR,aAAa,MAAM,YAAY,KAAK;AAAA,GACnC,KAAK,aAAa,MAAM,oBAAoB,MAAM,QAAgB,GAAG,KAAK,IAAI;AAAA,GAC9E,KAAK,aAAa,MAAM,6BAA6B,MAAM,QAAgB,GAAG,KAAK,IAAI;AAAA;AAE1F,yBAAyB,cAAc,CAAC,cAAc;AAAA,EACpD,QAAQ,cAAc,UAAU,eAAe,aAAa,MAAM,eAAe;AAAA,EACjF,MAAM,cAAc,KAAK,IACvB,UACA,eAAe,KAAK,IAAI,YAAY,eAAe,CAAC,CAEtD;AAAA,EACA,MAAM,UAAU,KAAK,MAAM,KAAK,OAAO,IAAI,WAAW;AAAA,EACtD,MAAM,SAAS,KAAK,QAAQ;AAAA,EAC5B,IAAI,WAAW,MAAM,UAAU,OAAY,YAAI,OAAO;AAAA,IAAU;AAAA,EAChE,MAAM,IAAI,QAAQ,CAAC,YAAY;AAAA,IAC7B,IAAI,UAAU;AAAA,IACd,MAAM,OAAO,MAAM;AAAA,MACjB,IAAI;AAAA,QAAS;AAAA,MACb,UAAU;AAAA,MACV,aAAa,KAAK;AAAA,MAClB,UAAU,QAAgB,OAAO,oBAAoB,SAAS,IAAI;AAAA,MAClE,QAAQ;AAAA;AAAA,IAEV,MAAM,QAAQ,WAAW,MAAM,OAAO;AAAA,IACtC,UAAU,QAAgB,OAAO,iBAAiB,SAAS,MAAM,EAAE,MAAM,KAAK,CAAC;AAAA,IAC/E,IAAI,UAAU,OAAY,YAAI,OAAO;AAAA,MAAS,KAAK;AAAA,GACpD;AAAA;AAEH,kBAAkB,cAAc,CAAC,yBAAyB;AAAA,EACxD,IAAI,IAAI,IAAI;AAAA,EACZ,KAAK,KAAK,KAAK,QAAQ,WAAW,OAAY,YAAI,GAAG,SAAS;AAAA,IAC5D,gBAAgB,MAAM,wBAAwB,WAAW,EAAE,KAAK,IAAI;AAAA,IACpE;AAAA,EACF;AAAA,EACA,IAAI,aAAa,MAAM,UAAU,aAAa,YAAY;AAAA,IACxD,MAAM,aAAa,MAAM,UAAU,EAAE;AAAA,EACvC;AAAA,EACA,MAAM,oBAAoB,2BAA2B,OAAO,0BAA0B,aAAa,MAAM,+BAA+B;AAAA,EACxI,IAAI,aAAa,MAAM,UAAU,EAAE,UAAU;AAAA,IAC3C,IAAI,mBAAmB;AAAA,MACrB,aAAa,MAAM,iCAAiC,iBAAiB;AAAA,IACvE;AAAA,IACA;AAAA,EACF;AAAA,EACA,IAAI,CAAC,KAAK,QAAQ,gBAAgB,KAAK,KAAK,QAAQ,WAAW,OAAY,YAAI,GAAG,YAAY,aAAa,MAAM,UAAU,EAAE,aAAa;AAAA,IACxI;AAAA,EACF;AAAA,EACA,IAAI,CAAC,aAAa,MAAM,UAAU,EAAE,YAAY;AAAA,IAC9C,MAAM,gBAAgB,MAAM,wBAAwB,gBAAgB,EAAE,KAAK,IAAI;AAAA,EACjF,EAAO;AAAA,IACL,aAAa,MAAM,2BAA2B,CAAC;AAAA,IAC/C,aAAa,MAAM,uBAAuB,CAAC,CAAC;AAAA;AAAA,EAE9C,IAAI,oBAAoB;AAAA,EACxB,IAAI,aAAa,MAAM,UAAU,aAAa,aAAa;AAAA,IACzD,oBAAoB;AAAA,IACpB,aAAa,MAAM,YAAY,aAAa,MAAM,UAAU,EAAE,OAAO,CAAC;AAAA,EACxE;AAAA,EACA,QAAQ,KAAK,WAAW,KAAK;AAAA,EAC7B,QAAQ,UAAU,mBAAmB,MAAM,gBAAgB,MAAM,wBAAwB,eAAe,EAAE,KAAK,MAAM,KAAK,iBAAiB;AAAA,EAC3I,IAAI,mBAAmB;AAAA,IACrB,SAAS,aAAa,IAAI,0BAA0B,iBAAiB;AAAA,IACrE,SAAS,aAAa,KAAK;AAAA,EAC7B;AAAA,EACA,MAAM,gBAAgB,MAAM,gBAAgB,MAAM,wBAAwB,sBAAsB,EAAE,KAAK,MAAM,MAAM;AAAA,EACnH,MAAM,yBAAyB,aAAa,MAAM,uBAAuB;AAAA,EACzE,IAAI,aAAa,MAAM,UAAU,EAAE,UAAU;AAAA,IAC3C,IAAI,iBAAiB,QAAQ;AAAA,MAC3B,OAAO,oBAAoB,SAAS,aAAa;AAAA,IACnD;AAAA,IACA,IAAI,mBAAmB;AAAA,MACrB,aAAa,MAAM,iCAAiC,iBAAiB;AAAA,IACvE;AAAA,IACA,aAAa,MAAM,yBAA8B,SAAC;AAAA,IAClD;AAAA,EACF;AAAA,EACA,aAAa,MAAM,iCAAsC,SAAC;AAAA,EAC1D,IAAI;AAAA,IACF,MAAM,gBAAgB,MAAM,wBAAwB,aAAa,EAAE,KAAK,MAAM;AAAA,MAC5E;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT;AAAA,IACF,CAAC;AAAA,IACD,OAAO,GAAG;AAAA,IACV,MAAM,cAAc,uBAAuB,OAAO;AAAA,IAClD,MAAM,iBAAiB,uBAAuB,OAAO,YAAY,gBAAgB,gCAAgC,gBAAgB;AAAA,IACjI,KAAK,aAAa,cAAc,aAAa,2BAA2B,gBAAgB;AAAA,MACtF,OAAO,gBAAgB,MAAM,wBAAwB,eAAe,EAAE,KAAK,IAAI;AAAA,IACjF;AAAA,IACA,IAAI,aAAa,wBAAwB;AAAA,MACvC;AAAA,IACF;AAAA,IACA,IAAI,aAAa,iBAAiB;AAAA,MAChC,OAAO,gBAAgB,MAAM,wBAAwB,eAAe,EAAE,KAAK,IAAI;AAAA,IACjF;AAAA,IACA,IAAI,EAAE,aAAa;AAAA,MAAa,MAAM;AAAA,IACtC,IAAI,EAAE,UAAU,KAAK;AAAA,MACnB,IAAI,aAAa,MAAM,UAAU,EAAE,QAAQ;AAAA,QACzC,MAAM,WAAW,kBAAkB,QAAQ;AAAA,QAC3C,mBAAmB,YAAY,UAAU,aAAa,MAAM,UAAU,EAAE,MAAM;AAAA,MAChF;AAAA,MACA,MAAM,iBAAiB,EAAE,QAAQ;AAAA,MACjC,IAAI,CAAC,gBAAgB;AAAA,QACnB,QAAQ,KACN,kIACF;AAAA,MACF;AAAA,MACA,MAAM,8BAA8B,kBAAkB;AAAA,MACtD,gBAAgB,MAAM,wBAAwB,QAAQ,EAAE,KAAK,MAAM,cAAc;AAAA,MACjF,MAAM,gBAAgB,MAAM,wBAAwB,UAAU,EAAE,KAAK,MAAM,CAAC,EAAE,SAAS,EAAE,SAAS,eAAe,EAAE,CAAC,CAAC;AAAA,MACrH,OAAO,gBAAgB,MAAM,wBAAwB,eAAe,EAAE,KAAK,MAAM,2BAA2B;AAAA,IAC9G,EAAO;AAAA,MACL,MAAM;AAAA;AAAA,YAER;AAAA,IACA,IAAI,iBAAiB,QAAQ;AAAA,MAC3B,OAAO,oBAAoB,SAAS,aAAa;AAAA,IACnD;AAAA,IACA,aAAa,MAAM,yBAA8B,SAAC;AAAA;AAAA,GAEnD,KAAK,aAAa,MAAM,oBAAoB,MAAM,QAAgB,GAAG,KAAK,IAAI;AAAA,EAC/E,OAAO,gBAAgB,MAAM,wBAAwB,eAAe,EAAE,KAAK,IAAI;AAAA;AAEjF,mBAAmB,cAAc,GAAG;AAAA,EAClC,MAAM,MAAM,KAAK,IAAI;AAAA,EACrB,MAAM,gBAAgB,aAAa,MAAM,UAAU,EAAE;AAAA,EACrD,aAAa,MAAM,uBAAuB,aAAa,MAAM,qBAAqB,EAAE,OAClF,CAAC,MAAM,MAAM,EAAE,YAAY,aAAa,MAAM,iBAAiB,CACjE,CAAC;AAAA,EACD,aAAa,MAAM,qBAAqB,EAAE,KAAK,EAAE,WAAW,KAAK,QAAQ,cAAc,CAAC;AAAA,EACxF,MAAM,kBAAkB,aAAa,MAAM,qBAAqB,EAAE,OAChE,CAAC,MAAM,EAAE,WAAW,aACtB,EAAE;AAAA,EACF,IAAI,kBAAkB,aAAa,MAAM,kBAAkB;AAAA,IAAG;AAAA,EAC9D,iBAAiB,MAAM,yBAAyB,EAAE;AAAA,EAClD,IAAI,aAAa,MAAM,yBAAyB,KAAK,aAAa,MAAM,iBAAiB,GAAG;AAAA,IAC1F,MAAM,IAAI,WACR,KACK,WACA,WACL,CAAC,GACD,KAAK,QAAQ,KACb,yCAAyC,aAAa,MAAM,kBAAkB,iBAAiB,aAAa,MAAM,iBAAiB,oCAAoC,aAAa,MAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA,wDAIzJ,qBACpD;AAAA,EACF;AAAA,EACA,IAAI,aAAa,MAAM,yBAAyB,MAAM,GAAG;AAAA,IACvD,QAAQ,KACN,wCAAwC,aAAa,MAAM,kBAAkB,iBAAiB,aAAa,MAAM,iBAAiB,0UAA0U,uBAC5c,IAAI,MAAM,aAAa,CACzB;AAAA,IACA,IAAI,aAAa,MAAM,gBAAgB,GAAG;AAAA,MACxC,MAAM,WAAW,kBAAkB,aAAa,MAAM,gBAAgB,CAAC;AAAA,MACvE,mBAAmB,OAAO,QAAQ;AAAA,MAClC,gBAAgB,OAAO,QAAQ;AAAA,IACjC,EAAO;AAAA,MACL,mBAAmB,MAAM;AAAA,MACzB,gBAAgB,MAAM;AAAA;AAAA,IAExB,gBAAgB,MAAM,wBAAwB,QAAQ,EAAE,KAAK,IAAI;AAAA,IACjE,aAAa,MAAM,uBAAuB,CAAC,CAAC;AAAA,IAC5C;AAAA,EACF;AAAA,EACA,MAAM,WAAW,KAAK,IACpB,aAAa,MAAM,qBAAqB,GACxC,aAAa,MAAM,sBAAsB,IAAI,KAAK,IAAI,GAAG,aAAa,MAAM,yBAAyB,CAAC,CACxG;AAAA,EACA,MAAM,UAAU,KAAK,MAAM,KAAK,OAAO,IAAI,QAAQ;AAAA,EACnD,MAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,OAAO,CAAC;AAAA,EAC3D,aAAa,MAAM,uBAAuB,CAAC,CAAC;AAAA;AAE9C,kBAAkB,cAAc,CAAC,KAAK,mBAAmB,cAAc;AAAA,EACrE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAAA,EACxB,OAAO,gBAAgB,UAAU,MAAM,QAAQ,IAAI;AAAA,IACjD,eAAe,KAAK,QAAQ,OAAO;AAAA,IACnC,KAAK,QAAQ,SAAS,iBAAiB,wBAAwB,KAAK,QAAQ,MAAM,CAAC,IAAS;AAAA,EAC9F,CAAC;AAAA,EACD,IAAI;AAAA,IAAQ,eAAe,MAAM;AAAA,EACjC,MAAM,WAAW,IAAI,IAAI,GAAG;AAAA,EAC5B,IAAI,QAAQ;AAAA,IACV,IAAI,OAAO;AAAA,MAAO,cAAc,UAAU,mBAAmB,OAAO,KAAK;AAAA,IACzE,IAAI,OAAO,SAAS,OAAO,OAAO,UAAU,UAAU;AAAA,MACpD,MAAM,eAAe,kBACnB,OAAO,QACN,KAAK,KAAK,QAAQ,iBAAiB,OAAY,YAAI,GAAG,MACzD;AAAA,MACA,cAAc,UAAU,mBAAmB,YAAY;AAAA,IACzD;AAAA,IACA,IAAI,OAAO,SAAS;AAAA,MAClB,MAAM,kBAAkB,MAAM,cAAc,KAAK,KAAK,QAAQ,WAAW,OAAY,YAAI,GAAG,OAAO;AAAA,MACnG,IAAI,MAAM,QAAQ,eAAe,GAAG;AAAA,QAClC,IAAI,iBAAiB,gBAAgB,IAAI,MAAM;AAAA,QAC/C,IAAI,KAAK,QAAQ,cAAc;AAAA,UAC7B,iBAAiB,eAAe,IAC9B,KAAK,QAAQ,aAAa,MAC5B;AAAA,QACF;AAAA,QACA,MAAM,oBAAoB,eAAe,IAAI,eAAe,EAAE,KAAK,GAAG;AAAA,QACtE,cAAc,UAAU,qBAAqB,iBAAiB;AAAA,MAChE,EAAO;AAAA,QACL,cAAc,UAAU,qBAAqB,OAAO,OAAO;AAAA;AAAA,IAE/D;AAAA,IACA,IAAI,OAAO;AAAA,MAAS,cAAc,UAAU,eAAe,OAAO,OAAO;AAAA,IACzE,IAAI,OAAO;AAAA,MACT,cAAc,UAAU,oBAAoB,OAAO,MAAM;AAAA,IAC3D,MAAM,eAAe,eAAe,CAAC,GAAG,MAAM;AAAA,IAC9C,OAAO,aAAa;AAAA,IACpB,OAAO,aAAa;AAAA,IACpB,OAAO,aAAa;AAAA,IACpB,OAAO,aAAa;AAAA,IACpB,OAAO,aAAa;AAAA,IACpB,YAAY,KAAK,UAAU,OAAO,QAAQ,YAAY,GAAG;AAAA,MACvD,cAAc,UAAU,KAAK,KAAK;AAAA,IACpC;AAAA,EACF;AAAA,EACA,IAAI,cAAc;AAAA,IAChB,IAAI,aAAa,WAAW;AAAA,MAC1B,MAAM,gBAAgB,kBACpB,aAAa,YACZ,KAAK,KAAK,QAAQ,iBAAiB,OAAY,YAAI,GAAG,MACzD;AAAA,MACA,cAAc,UAAU,oBAAoB,aAAa;AAAA,MACzD,SAAS,aAAa,IACpB,yBACA,KAAK,UAAU,aAAa,SAAS,CACvC;AAAA,IACF,EAAO,SAAI,aAAa,SAAS,OAAO,aAAa,UAAU,UAAU;AAAA,MACvE,MAAM,eAAe,kBACnB,aAAa,QACZ,KAAK,KAAK,QAAQ,iBAAiB,OAAY,YAAI,GAAG,MACzD;AAAA,MACA,cAAc,UAAU,oBAAoB,YAAY;AAAA,IAC1D;AAAA,IACA,IAAI,aAAa;AAAA,MACf,SAAS,aAAa,IACpB,2BACA,oBAAoB,aAAa,MAAM,CACzC;AAAA,IACF,IAAI,aAAa,UAAe;AAAA,MAC9B,cAAc,UAAU,oBAAoB,aAAa,KAAK;AAAA,IAChE,IAAI,aAAa,WAAgB;AAAA,MAC/B,cAAc,UAAU,qBAAqB,aAAa,MAAM;AAAA,IAClE,IAAI,aAAa,aAAa;AAAA,MAC5B,MAAM,kBAAkB,eACtB,aAAa,cACZ,KAAK,KAAK,QAAQ,iBAAiB,OAAY,YAAI,GAAG,MACzD;AAAA,MACA,cAAc,UAAU,uBAAuB,eAAe;AAAA,MAC9D,SAAS,aAAa,IACpB,4BACA,KAAK,UAAU,aAAa,WAAW,CACzC;AAAA,IACF,EAAO,SAAI,aAAa,WAAW,OAAO,aAAa,YAAY,UAAU;AAAA,MAC3E,MAAM,iBAAiB,kBACrB,aAAa,UACZ,KAAK,KAAK,QAAQ,iBAAiB,OAAY,YAAI,GAAG,MACzD;AAAA,MACA,cAAc,UAAU,uBAAuB,cAAc;AAAA,IAC/D;AAAA,EACF;AAAA,EACA,aAAa,MAAM,UAAU,EAAE,eAAe,UAAU;AAAA,IACtD,mBAAmB,iBAAsB;AAAA,IAGzC,aAAa,CAAC,aAAa,MAAM,wBAAwB,gBAAgB,KAAK,CAAC;AAAA,EACjF,CAAC;AAAA,EACD,SAAS,aAAa,IAAI,sBAAsB,aAAa,MAAM,KAAK,CAAC;AAAA,EACzE,MAAM,WAAW,kBAAkB,QAAQ;AAAA,EAC3C,MAAM,gBAAgB,mBAAmB,iBAAiB,QAAQ;AAAA,EAClE,IAAI,eAAe;AAAA,IACjB,SAAS,aAAa,IAAI,4BAA4B,aAAa;AAAA,EACrE;AAAA,EACA,SAAS,aAAa,KAAK;AAAA,EAC3B,OAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AAAA;AAEF,yBAAyB,cAAc,CAAC,QAAQ;AAAA,EAC9C,IAAI;AAAA,EACJ,aAAa,MAAM,yBAAyB,IAAI,eAAiB;AAAA,EACjE,IAAI,QAAQ;AAAA,IACV,MAAM,gBAAgB,MAAM;AAAA,MAC1B,IAAI;AAAA,OACH,MAAM,aAAa,MAAM,uBAAuB,MAAM,QAAgB,IAAI,MAAM,OAAO,MAAM;AAAA;AAAA,IAEhG,OAAO,iBAAiB,SAAS,eAAe,EAAE,MAAM,KAAK,CAAC;AAAA,IAC9D,IAAI,OAAO,SAAS;AAAA,OACjB,KAAK,aAAa,MAAM,uBAAuB,MAAM,QAAgB,GAAG,MAAM,OAAO,MAAM;AAAA,IAC9F;AAAA,IACA,OAAO;AAAA,EACT;AAAA;AAEF,uBAAuB,cAAc,CAAC,UAAU;AAAA,EAC9C,IAAI,IAAI,IAAI;AAAA,EACZ,QAAQ,SAAS,WAAW;AAAA,EAC5B,MAAM,cAAc,QAAQ,IAAI,mBAAmB;AAAA,EACnD,MAAM,WAAW,aAAa,MAAM,gBAAgB,IAAI,kBAAkB,aAAa,MAAM,gBAAgB,CAAC,IAAI;AAAA,EAClH,MAAM,gBAAgB,WAAW,mBAAmB,iBAAiB,QAAQ,IAAI;AAAA,EACjF,IAAI,aAAa,MAAM,qBAAqB,GAAG;AAAA,IAC7C,QAAQ,UAAU,WAAW,gBAAgB,aAAa,MAAM,qBAAqB;AAAA,IACrF,aAAa,MAAM,uBAAuB,IAAI;AAAA,IAC9C,IAAI,aAAa,aAAa,gBAAgB,aAAa;AAAA,MACzD,QAAQ,KACN,2DAA2D,4bAA4b,uBACvf,IAAI,MAAM,aAAa,CACzB;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,aAAa,aAAa,MAAM,UAAU,EAAE,uBAAuB;AAAA,IACvE;AAAA,IACA,gBAAgB;AAAA,IAChB,gBAAgB,QAAQ,IAAI,wBAAwB;AAAA,IACpD,gBAAgB,QAAQ,IAAI,wBAAwB;AAAA,IACpD,gBAAgB,qBAAqB,OAAO;AAAA,IAC5C;AAAA,IACA,KAAK,KAAK,IAAI;AAAA,IACd,sBAAsB,aAAa,MAAM,qBAAqB;AAAA,IAC9D;AAAA,EACF,CAAC;AAAA,EACD,aAAa,MAAM,YAAY,WAAW,KAAK;AAAA,EAC/C,IAAI,WAAW,KAAK;AAAA,IAClB,aAAa,MAAM,0BAA0B,IAAI;AAAA,EACnD;AAAA,EACA,IAAI,WAAW,WAAW,cAAc,WAAW,KAAK;AAAA,IACtD,aAAa,MAAM,0BAA0B,CAAC;AAAA,EAChD;AAAA,EACA,IAAI,WAAW,WAAW,eAAe;AAAA,IACvC,QAAQ,KAAK,SAAS,SAAS,OAAY,YAAI,GAAG,OAAO;AAAA,IACzD,IAAI,WAAW,oBAAoB;AAAA,MACjC,IAAI,UAAU;AAAA,QACZ,mBAAmB,OAAO,QAAQ;AAAA,QAClC,IAAI,aAAa,MAAM,wBAAwB,MAAM,UAAU;AAAA,UAC7D,QAAQ,KACN,6CAA6C,aAAa,MAAM,qBAAqB,4KAA4K,uBACjQ,IAAI,MAAM,aAAa,CACzB;AAAA,UACA,aAAa,MAAM,0BAA0B,QAAQ;AAAA,UACrD,IAAI,aAAa;AAAA,YACf,aAAa,MAAM,uBAAuB;AAAA,cACxC;AAAA,cACA,aAAa;AAAA,YACf,CAAC;AAAA,UACH;AAAA,UACA,gBAAgB,MAAM,wBAAwB,QAAQ,EAAE,KAAK,IAAI;AAAA,UACjE,MAAM,IAAI,gBACR,qDACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,IAAI,WACR,KACK,WACA,WACL,CAAC,IACA,MAAM,KAAK,aAAa,MAAM,gBAAgB,MAAM,OAAY,YAAI,GAAG,SAAS,MAAM,OAAO,KAAK,IACnG,sDAAsD,aAAa,MAAM,qBAAqB,wOAAwO,qBACxU;AAAA,IACF;AAAA,IACA,QAAQ,KACN,kLAAkL,uNAAuN,8FAA8F,aAAa,MAAM,UAAU,EAAE,wBAAwB,aAAa,MAAM,qBAAqB,OACtkB,IAAI,MAAM,aAAa,CACzB;AAAA,IACA,MAAM,IAAI,gBACR,uDAAuD,6KACzD;AAAA,EACF;AAAA,EACA,IAAI,WAAW,WAAW,WAAW;AAAA,IACnC,QAAQ,KACN,6CAA6C,aAAa,MAAM,UAAU,EAAE,wHAC5E,IAAI,MAAM,aAAa,CACzB;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA;AAET,gBAAgB,cAAc,CAAC,OAAO,eAAe,OAAO,OAAO,CAAC,GAAG;AAAA,EACrE,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AAAA,IACzB,QAAQ,KACN,0DAA0D,OAAO,oDACjE,IAAI,MAAM,aAAa,CACzB;AAAA,IACA;AAAA,EACF;AAAA,EACA,IAAI,MAAM,WAAW;AAAA,IAAG;AAAA,EACxB,aAAa,MAAM,0BAA0B,CAAC;AAAA,EAC9C,MAAM,cAAc,MAAM,MAAM,SAAS;AAAA,EACzC,MAAM,qBAAqB,kBAAkB,WAAW;AAAA,EACxD,MAAM,iBAAiB,qBAAqB,UAAU,WAAW,IAAS;AAAA,EAC1E,MAAM,aAAa,aAAa,MAAM,UAAU,EAAE,mBAAmB;AAAA,IACnE,aAAa;AAAA,IACb;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,KAAK,KAAK,IAAI;AAAA,IACd,eAAe,aAAa,MAAM,UAAU,EAAE;AAAA,EAChD,CAAC;AAAA,EACD,aAAa,MAAM,YAAY,WAAW,KAAK;AAAA,EAC/C,IAAI,oBAAoB;AAAA,IACtB,IAAI,WAAW,eAAe;AAAA,MAC5B;AAAA,IACF;AAAA,IACA,IAAI,aAAa,MAAM,gBAAgB,GAAG;AAAA,MACxC,MAAM,WAAW,kBAAkB,aAAa,MAAM,gBAAgB,CAAC;AAAA,MACvE,gBAAgB,eACd,UACA,aAAa,MAAM,UAAU,EAAE,eACjC;AAAA,MACA,aAAa,MAAM,0BAA0B,IAAI;AAAA,IACnD;AAAA,EACF;AAAA,EACA,MAAM,oBAAoB,MAAM,OAAO,CAAC,YAAY;AAAA,IAClD,IAAI,gBAAgB,OAAO,GAAG;AAAA,MAC5B,OAAO,CAAC,aAAa,MAAM,gBAAgB,EAAE,oBAAoB,OAAO;AAAA,IAC1E;AAAA,IACA,OAAO;AAAA,GACR;AAAA,EACD,MAAM,gBAAgB,MAAM,wBAAwB,UAAU,EAAE,KAAK,MAAM,mBAAmB;AAAA,IAC5F,sBAAsB,KAAK;AAAA,EAC7B,CAAC;AAAA;AAEH,gBAAgB,cAAc,CAAC,MAAM;AAAA,EACnC,IAAI;AAAA,EACJ,aAAa,MAAM,kBAAkB,KAAK,QAAQ;AAAA,EAClD,IAAI,CAAC,aAAa,MAAM,UAAU,EAAE,cAAc,aAAa,MAAM,UAAU,EAAE,mBAAmB,GAAG;AAAA,IACrG,MAAM,WAAW,kBAAkB,KAAK,QAAQ;AAAA,IAChD,MAAM,iBAAiB,gBAAgB,sBAAsB,QAAQ;AAAA,IACrE,IAAI,gBAAgB;AAAA,MAClB,aAAa,MAAM,YAAY,aAAa,MAAM,UAAU,EAAE,gBAAgB,cAAc,CAAC;AAAA,IAC/F;AAAA,EACF;AAAA,EACA,MAAM,UAAU,KAAK,KAAK,QAAQ,YAAY,OAAO,KAAK,KAAK,QAAQ;AAAA,EACvE,IAAI,aAAa,MAAM,UAAU,EAAE,aAAa;AAAA,IAC9C,gBAAgB,CAAC,CAAC;AAAA,IAClB,cAAc,aAAa,MAAM,wBAAwB,gBAAgB;AAAA,IACzE,mBAAmB,CAAC,CAAC,KAAK;AAAA,EAC5B,CAAC,GAAG;AAAA,IACF,KAAK,SAAS,aAAa,IAAI,mCAAmC,MAAM;AAAA,IACxE,KAAK,SAAS,aAAa,IAAI,sBAAsB,MAAM;AAAA,IAC3D,OAAO,gBAAgB,MAAM,wBAAwB,kBAAkB,EAAE,KAAK,MAAM,IAAI;AAAA,EAC1F;AAAA,EACA,OAAO,gBAAgB,MAAM,wBAAwB,uBAAuB,EAAE,KAAK,MAAM,IAAI;AAAA;AAE/F,0BAA0B,cAAc,CAAC,MAAM;AAAA,EAC7C,IAAI;AAAA,EACJ,QAAQ,UAAU,wBAAwB,YAAY;AAAA,EACtD,MAAM,WAAW,MAAM,aAAa,MAAM,aAAa,EAAE,KAAK,MAAM,SAAS,SAAS,GAAG;AAAA,IACvF,QAAQ,uBAAuB;AAAA,IAC/B;AAAA,EACF,CAAC;AAAA,EACD,aAAa,MAAM,YAAY,IAAI;AAAA,EACnC,MAAM,oBAAoB,MAAM,gBAAgB,MAAM,wBAAwB,oBAAoB,EAAE,KAAK,MAAM,QAAQ;AAAA,EACvH,IAAI,CAAC;AAAA,IAAmB;AAAA,EACxB,MAAM,SAAS,aAAa,MAAM,UAAU,EAAE;AAAA,EAC9C,MAAM,MAAM,MAAM,SAAS,KAAK;AAAA,EAChC,MAAM,WAAW,OAAO;AAAA,EACxB,MAAM,QAAQ,aAAa,MAAM,cAAc,EAAE,MAAM,UAAU,MAAM;AAAA,EACvE,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AAAA,IACzB,MAAM,WAAW,KAAK,oBAAoB,KAAK,MAAM,OAAY,YAAI,GAAG,MAAM,GAAG,GAAG;AAAA,IACpF,MAAM,IAAI,WACR,SAAS,QACT,0JAA0J,OAAO,UAAU,WACtK,WACL,OAAO,YAAY,SAAS,QAAQ,QAAQ,CAAC,GAC7C,SAAS,SAAS,CACpB;AAAA,EACF;AAAA,EACA,MAAM,gBAAgB,MAAM,wBAAwB,aAAa,EAAE,KAAK,MAAM,KAAK;AAAA;AAErF,qBAAqB,cAAc,CAAC,MAAM;AAAA,EACxC,QAAQ,UAAU,wBAAwB,YAAY;AAAA,EACtD,MAAM,SAAS,aAAa,MAAM,eAAe;AAAA,EACjD,aAAa,MAAM,6BAA6B,KAAK,IAAI,CAAC;AAAA,EAC1D,MAAM,aAAa,cAAc,eAAe,CAAC,GAAG,OAAO,GAAG;AAAA,IAC5D,QAAQ;AAAA,EACV,CAAC;AAAA,EACD,IAAI,uBAAuB;AAAA,EAC3B,IAAI;AAAA,IACF,IAAI,SAAS,CAAC;AAAA,IACd,MAAM,iBAAiB,SAAS,SAAS,GAAG;AAAA,MAC1C,SAAS;AAAA,MACT,OAAO;AAAA,MACP,QAAQ,OAAO,aAAa;AAAA,QAC1B,aAAa,MAAM,YAAY,IAAI;AAAA,QACnC,MAAM,oBAAoB,MAAM,gBAAgB,MAAM,wBAAwB,oBAAoB,EAAE,KAAK,MAAM,QAAQ;AAAA,QACvH,IAAI,CAAC,mBAAmB;AAAA,UACtB,uBAAuB;AAAA,UACvB,MAAM,IAAI,MAAM,wBAAwB;AAAA,QAC1C;AAAA;AAAA,MAEF,WAAW,CAAC,UAAU;AAAA,QACpB,IAAI,MAAM,MAAM;AAAA,UACd,MAAM,SAAS,aAAa,MAAM,UAAU,EAAE;AAAA,UAC9C,MAAM,UAAU,aAAa,MAAM,cAAc,EAAE,MACjD,MAAM,MACN,MACF;AAAA,UACA,OAAO,KAAK,OAAO;AAAA,UACnB,IAAI,kBAAkB,OAAO,GAAG;AAAA,YAC9B,gBAAgB,MAAM,wBAAwB,aAAa,EAAE,KAAK,MAAM,QAAQ,IAAI;AAAA,YACpF,SAAS,CAAC;AAAA,UACZ;AAAA,QACF;AAAA;AAAA,MAEF,SAAS,CAAC,UAAU;AAAA,QAClB,MAAM;AAAA;AAAA,MAER,QAAQ,uBAAuB;AAAA,IACjC,CAAC;AAAA,IACD,OAAO,OAAO;AAAA,IACd,IAAI,sBAAsB;AAAA,MACxB;AAAA,IACF;AAAA,IACA,IAAI,uBAAuB,OAAO,SAAS;AAAA,MACzC,MAAM,IAAI;AAAA,IACZ;AAAA,IACA,IAAI,iBAAiB,cAAc,iBAAiB,mBAAmB,iBAAiB,qBAAqB;AAAA,MAC3G,MAAM;AAAA,IACR;AAAA,YACA;AAAA,IACA,MAAM,qBAAqB,KAAK,IAAI,IAAI,aAAa,MAAM,2BAA2B;AAAA,IACtF,MAAM,aAAa,uBAAuB,OAAO;AAAA,IACjD,MAAM,aAAa,aAAa,MAAM,UAAU,EAAE,0BAA0B;AAAA,MAC1E;AAAA,MACA;AAAA,MACA,uBAAuB,aAAa,MAAM,yBAAyB;AAAA,MACnE,qBAAqB,aAAa,MAAM,uBAAuB;AAAA,IACjE,CAAC;AAAA,IACD,aAAa,MAAM,YAAY,WAAW,KAAK;AAAA,IAC/C,IAAI,WAAW,uBAAuB;AAAA,MACpC,QAAQ,KACN,kbACA,IAAI,MAAM,aAAa,CACzB;AAAA,IACF,EAAO,SAAI,WAAW,oBAAoB;AAAA,MACxC,MAAM,WAAW,KAAK,IACpB,aAAa,MAAM,mBAAmB,GACtC,aAAa,MAAM,oBAAoB,IAAI,KAAK,IAAI,GAAG,aAAa,MAAM,UAAU,EAAE,8BAA8B,CACtH;AAAA,MACA,MAAM,UAAU,KAAK,MAAM,KAAK,OAAO,IAAI,QAAQ;AAAA,MACnD,MAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,OAAO,CAAC;AAAA,IAC7D;AAAA;AAAA;AAGJ,cAAc,cAAc,GAAG;AAAA,EAC7B,IAAI,aAAa,MAAM,UAAU,EAAE,UAAU;AAAA,IAC3C,MAAM,IAAI,MACR,4GACF;AAAA,EACF;AAAA,EACA,IAAI,aAAa,MAAM,YAAY,GAAG;AAAA,IACpC,OAAO,aAAa,MAAM,YAAY;AAAA,EACxC;AAAA,EACA,aAAa,MAAM,cAAc,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,IAChE,aAAa,MAAM,sBAAsB,OAAO;AAAA,IAChD,aAAa,MAAM,sBAAsB,MAAM;AAAA,GAChD,CAAC;AAAA,EACF,aAAa,MAAM,YAAY,EAAE,QAAQ,MAAM;AAAA,IAC7C,aAAa,MAAM,cAAmB,SAAC;AAAA,IACvC,aAAa,MAAM,sBAA2B,SAAC;AAAA,IAC/C,aAAa,MAAM,sBAA2B,SAAC;AAAA,GAChD;AAAA,EACD,OAAO,aAAa,MAAM,YAAY;AAAA;AAExC,aAAa,cAAc,CAAC,UAAU,OAAO,CAAC,GAAG;AAAA,EAC/C,MAAM,UAAU,MAAM,QAAQ,IAC5B,MAAM,KAAK,aAAa,MAAM,YAAY,EAAE,OAAO,CAAC,EAAE,IAAI,QAAQ,UAAU,QAAQ;AAAA,IAClF,IAAI;AAAA,MACF,MAAM,SAAS,QAAQ;AAAA,MACvB,OAAO,KAAK;AAAA,MACZ,eAAe,MAAM;AAAA,QACnB,MAAM;AAAA,OACP;AAAA;AAAA,GAEJ,CACH;AAAA,EACA,IAAI,aAAa,MAAM,aAAa,KAAK,KAAK,sBAAsB;AAAA,IAClE,OAAO,QAAQ;AAAA,EACjB;AAAA,EACA,aAAa,MAAM,eAAe,aAAa,MAAM,aAAa,EAAE,KAAK,YAAY;AAAA,IACnF,aAAa,MAAM,eAAe,IAAI;AAAA,IACtC,IAAI;AAAA,MACF,OAAO,MAAM,QAAQ;AAAA,cACrB;AAAA,MACA,aAAa,MAAM,eAAe,KAAK;AAAA;AAAA,GAE1C,CAAC;AAAA,EACF,OAAO,aAAa,MAAM,aAAa;AAAA;AAEzC,4BAA4B,QAAQ,CAAC,OAAO;AAAA,EAC1C,aAAa,MAAM,YAAY,EAAE,QAAQ,EAAE,GAAG,aAAa;AAAA,IACzD,WAAW,QAAgB,QAAQ,KAAK;AAAA,GACzC;AAAA;AAEH,6BAA6B,QAAQ,GAAG;AAAA,EACtC,OAAO,OAAO,aAAa,YAAY,OAAO,SAAS,WAAW,aAAa,OAAO,SAAS,qBAAqB;AAAA;AAEtH,kCAAkC,QAAQ,GAAG;AAAA,EAC3C,IAAI,gBAAgB,MAAM,wBAAwB,0BAA0B,EAAE,KAAK,IAAI,GAAG;AAAA,IACxF,MAAM,oBAAoB,MAAM;AAAA,MAC9B,IAAI,SAAS,QAAQ;AAAA,QACnB,aAAa,MAAM,UAAU,EAAE,QAAQ,YAAY;AAAA,MACrD,EAAO;AAAA,QACL,aAAa,MAAM,UAAU,EAAE,QAAQ,YAAY;AAAA;AAAA;AAAA,IAGvD,SAAS,iBAAiB,oBAAoB,iBAAiB;AAAA,IAC/D,aAAa,MAAM,mCAAmC,MAAM;AAAA,MAC1D,SAAS,oBAAoB,oBAAoB,iBAAiB;AAAA,MAClE,aAAa,MAAM,mCAAwC,SAAC;AAAA,KAC7D;AAAA,EACH;AAAA;AAcF,8BAA8B,QAAQ,GAAG;AAAA,EACvC,IAAI,gBAAgB,MAAM,wBAAwB,0BAA0B,EAAE,KAAK,IAAI;AAAA,IAAG;AAAA,EAC1F,IAAI,aAAa,MAAM,6BAA6B;AAAA,IAAG;AAAA,EACvD,MAAM,cAAc;AAAA,EACpB,MAAM,oBAAoB;AAAA,EAC1B,IAAI,eAAe,KAAK,IAAI;AAAA,EAC5B,MAAM,QAAQ,YAAY,MAAM;AAAA,IAC9B,MAAM,MAAM,KAAK,IAAI;AAAA,IACrB,MAAM,UAAU,MAAM;AAAA,IACtB,eAAe;AAAA,IACf,IAAI,UAAU,cAAc,mBAAmB;AAAA,MAC7C,IAAI,CAAC,aAAa,MAAM,UAAU,EAAE,YAAY,aAAa,MAAM,uBAAuB,GAAG;AAAA,QAC3F,iBAAiB,MAAM,aAAa,EAAE;AAAA,QACtC,aAAa,MAAM,uBAAuB,EAAE,MAAM,WAAW;AAAA,QAC7D,eAAe,MAAM;AAAA,UACnB,iBAAiB,MAAM,aAAa,EAAE;AAAA,SACvC;AAAA,MACH;AAAA,IACF;AAAA,KACC,WAAW;AAAA,EACd,IAAI,OAAO,UAAU,YAAY,WAAW,OAAO;AAAA,IACjD,MAAM,MAAM;AAAA,EACd;AAAA,EACA,aAAa,MAAM,+BAA+B,MAAM;AAAA,IACtD,cAAc,KAAK;AAAA,IACnB,aAAa,MAAM,+BAAoC,SAAC;AAAA,GACzD;AAAA;AAMH,WAAW,QAAQ,CAAC,QAAQ;AAAA,EAC1B,aAAa,MAAM,YAAY,aAAa,MAAM,UAAU,EAAE,gBAAgB,MAAM,CAAC;AAAA,EACrF,aAAa,MAAM,YAAY,KAAK;AAAA,EACpC,aAAa,MAAM,UAAU,EAAE,mBAAmB,UAAU;AAAA;AAE9D,4BAA4B,cAAc,CAAC,MAAM,YAAY,aAAa;AAAA,EACxE,IAAI,IAAI,IAAI;AAAA,EACZ,MAAM,UAAU,MAAM,KAAK,KAAK,WAAW,OAAO,KAAK,KAAK,QAAQ,iBAAiB,OAAO,KAAK;AAAA,EACjG,MAAM,UAAU,WAAW;AAAA,EAC3B,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI,SAAS;AAAA,IACX,MAAM,SAAS,MAAM,gBAAgB,MAAM,wBAAwB,eAAe,EAAE,KAAK,MAAM,KAAK,QAAQ,KAAK,IAAI;AAAA,IACrH,WAAW,OAAO;AAAA,IAClB,eAAe;AAAA,MACb,QAAQ;AAAA,MACR,SAAS,cAAc,eAAe,CAAC,GAAG,OAAO,cAAc,GAAG;AAAA,QAChE,gBAAgB;AAAA,MAClB,CAAC;AAAA,MACD,MAAM,oBAAoB,gBAAgB,MAAM,wBAAwB,kBAAkB,EAAE,KAAK,MAAM,IAAI,CAAC;AAAA,IAC9G;AAAA,EACF,EAAO;AAAA,IACL,MAAM,SAAS,MAAM,gBAAgB,MAAM,wBAAwB,eAAe,EAAE,KAAK,MAAM,KAAK,QAAQ,KAAK,MAAM,IAAI;AAAA,IAC3H,WAAW,OAAO;AAAA,IAClB,eAAe,EAAE,SAAS,OAAO,eAAe;AAAA;AAAA,EAElD,IAAI,aAAa;AAAA,IACf,SAAS,aAAa,IAAI,0BAA0B,WAAW;AAAA,IAC/D,SAAS,aAAa,KAAK;AAAA,EAC7B;AAAA,EACA,MAAM,aAAa,aAAa,MAAM,UAAU,EAAE;AAAA,EAClD,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,WAAW,MAAM,aAAa,MAAM,aAAa,EAAE,KAAK,MAAM,SAAS,SAAS,GAAG,YAAY;AAAA,IAC/F,OAAO,GAAG;AAAA,IACV,IAAI,aAAa,cAAc,EAAE,WAAW,KAAK;AAAA,MAC/C,MAAM,iBAAiB,aAAa;AAAA,MACpC,IAAI,iBAAiB,aAAa,MAAM,mBAAmB,GAAG;AAAA,QAC5D,MAAM,IAAI,WACR,KACK,WACA,WACL,CAAC,GACD,SAAS,SAAS,GAClB,kDAAkD,aAAa,MAAM,mBAAmB,kHAAkH,qBAC5M;AAAA,MACF;AAAA,MACA,IAAI,YAAY;AAAA,QACd,MAAM,WAAW,kBAAkB,QAAQ;AAAA,QAC3C,mBAAmB,YAAY,UAAU,UAAU;AAAA,MACrD;AAAA,MACA,MAAM,aAAa,EAAE,QAAQ;AAAA,MAC7B,IAAI,YAAY;AAAA,QACd,aAAa,MAAM,YAAY,aAAa,MAAM,UAAU,EAAE,WAAW,UAAU,CAAC;AAAA,MACtF,EAAO;AAAA,QACL,QAAQ,KACN,kIACF;AAAA;AAAA,MAEF,MAAM,kBAAkB,kBAAkB;AAAA,MAC1C,OAAO,gBAAgB,MAAM,wBAAwB,yBAAyB,EAAE,KAAK,MAAM,MAAM,gBAAgB,eAAe;AAAA,IAClI;AAAA,IACA,MAAM;AAAA;AAAA,EAER,IAAI,CAAC,SAAS,IAAI;AAAA,IAChB,MAAM,MAAM,WAAW,aAAa,UAAU,SAAS,SAAS,CAAC;AAAA,EACnE;AAAA,EACA,MAAM,UAAU,KAAK,aAAa,MAAM,UAAU,EAAE,WAAW,OAAO,KAAK,qBAAqB,SAAS,SAAS;AAAA,IAChH,UAAU;AAAA,IACV,KAAK,SAAS,SAAS;AAAA,EACzB,CAAC;AAAA,EACD,QAAQ,UAAU,MAAM,YAAY,MAAM,SAAS,KAAK;AAAA,EACxD,MAAM,OAAO,aAAa,MAAM,cAAc,EAAE,kBAC9C,SACA,MACF;AAAA,EACA,MAAM,iBAAiB,SAAS,QAAQ,IAAI,wBAAwB,KAAK;AAAA,EACzE,MAAM,iBAAiB,SAAS,QAAQ,IAAI,mBAAmB;AAAA,EAC/D,OAAO,EAAE,UAAU,MAAM,gBAAgB,eAAe;AAAA;AAE1D,qBAAqB,QAAQ,CAAC,MAAM;AAAA,EAClC,IAAI,IAAI,IAAI,IAAI;AAAA,EAChB,MAAM,OAAO,CAAC;AAAA,EACd,IAAI,KAAK,WAAW;AAAA,IAClB,KAAK,QAAQ,kBACX,KAAK,YACJ,KAAK,KAAK,QAAQ,iBAAiB,OAAY,YAAI,GAAG,MACzD;AAAA,IACA,KAAK,aAAa,KAAK;AAAA,EACzB,EAAO,SAAI,KAAK,SAAS,OAAO,KAAK,UAAU,UAAU;AAAA,IACvD,KAAK,QAAQ,kBACX,KAAK,QACJ,KAAK,KAAK,QAAQ,iBAAiB,OAAY,YAAI,GAAG,MACzD;AAAA,EACF;AAAA,EACA,IAAI,KAAK,QAAQ;AAAA,IACf,KAAK,SAAS,KAAK;AAAA,EACrB;AAAA,EACA,IAAI,KAAK,UAAe,WAAG;AAAA,IACzB,KAAK,QAAQ,KAAK;AAAA,EACpB;AAAA,EACA,IAAI,KAAK,WAAgB,WAAG;AAAA,IAC1B,KAAK,SAAS,KAAK;AAAA,EACrB;AAAA,EACA,IAAI,KAAK,aAAa;AAAA,IACpB,KAAK,WAAW,eACd,KAAK,cACJ,KAAK,KAAK,QAAQ,iBAAiB,OAAY,YAAI,GAAG,MACzD;AAAA,IACA,KAAK,gBAAgB,KAAK;AAAA,EAC5B,EAAO,SAAI,KAAK,WAAW,OAAO,KAAK,YAAY,UAAU;AAAA,IAC3D,KAAK,WAAW,kBACd,KAAK,UACJ,KAAK,KAAK,QAAQ,iBAAiB,OAAY,YAAI,GAAG,MACzD;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAET,YAAY,UAAU;AAAA,EACpB,MAAM;AAAA,EACN,SAAS;AACX;AACA,SAAS,oBAAoB,CAAC,SAAS,SAAS;AAAA,EAC9C,MAAM,eAAe,QAAQ,IAAI,mBAAmB;AAAA,EACpD,IAAI,CAAC,cAAc;AAAA,IACjB,KAAK,WAAW,OAAY,YAAI,QAAQ,cAAc,WAAW,OAAY,YAAI,QAAQ,MAAM;AAAA,MAC7F,MAAM,IAAI,oBAAoB,QAAQ,KAAK,CAAC,mBAAmB,CAAC;AAAA,IAClE;AAAA,IACA,OAAO,CAAC;AAAA,EACV;AAAA,EACA,OAAO,KAAK,MAAM,YAAY;AAAA;AAEhC,SAAS,cAAc,CAAC,QAAQ;AAAA,EAC9B,IAAI,CAAC;AAAA,IAAQ;AAAA,EACb,MAAM,iBAAiB,OAAO,KAAK,MAAM,EAAE,OACzC,CAAC,QAAQ,gBAAgB,IAAI,GAAG,CAClC;AAAA,EACA,IAAI,eAAe,SAAS,GAAG;AAAA,IAC7B,MAAM,IAAI,mBAAmB,cAAc;AAAA,EAC7C;AAAA;AAEF,IAAI,gBAAgB;AACpB,SAAS,gBAAgB,GAAG;AAAA,EAC1B,IAAI;AAAA,EACJ,OAAO,OAAO,YAAY,eAAe,KAAK,QAAQ,QAAQ,OAAY,YAAI,GAAG,WAAgB;AAAA;AAEnG,SAAS,eAAe,CAAC,KAAK,MAAM;AAAA,EAClC,IAAI;AAAA,IACF,OAAO,IAAI,IAAI,KAAK,IAAI;AAAA,IACxB,OAAO,GAAG;AAAA,IACV;AAAA;AAAA;AAGJ,SAAS,oBAAoB,GAAG;AAAA,EAC9B,OAAO,OAAO,WAAW;AAAA;AAE3B,SAAS,qBAAqB,GAAG;AAAA,EAC/B,IAAI,qBAAqB,KAAK,OAAO,OAAO,aAAa,aAAa;AAAA,IACpE,OAAO,OAAO,SAAS;AAAA,EACzB;AAAA,EACA;AAAA;AAEF,SAAS,eAAe,CAAC,SAAS;AAAA,EAChC,IAAI;AAAA,EACJ,IAAI,CAAC,QAAQ,KAAK;AAAA,IAChB,MAAM,IAAI;AAAA,EACZ;AAAA,EACA,IAAI,QAAQ,UAAU,EAAE,QAAQ,kBAAkB,cAAc;AAAA,IAC9D,MAAM,IAAI;AAAA,EACZ;AAAA,EACA,IAAI,QAAQ,WAAgB,aAAK,QAAQ,WAAW,QAAQ,QAAQ,WAAW,SAAS,CAAC,QAAQ,QAAQ;AAAA,IACvG,MAAM,IAAI;AAAA,EACZ;AAAA,EACA,eAAe,QAAQ,MAAM;AAAA,EAC7B,MAAM,UAAU,iBAAiB;AAAA,EACjC,MAAM,cAAc,KAAK,QAAQ,eAAe,OAAO,KAAK,YAAY;AAAA,EACxE,IAAI,cAAc,CAAC,iBAAiB,qBAAqB,GAAG;AAAA,IAC1D,IAAI,OAAO,YAAY,aAAa;AAAA,MAClC,MAAM,UAAU,sBAAsB;AAAA,MACtC,MAAM,cAAc,gBAAgB,QAAQ,KAAK,OAAO;AAAA,MACxD,MAAM,UAAU,eAAe,OAAY,YAAI,YAAY,cAAc;AAAA,MACzE,IAAI,QAAQ;AAAA,QACV,gBAAgB;AAAA,QAChB,QAAQ,KACN,mQACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA;AAKF,SAAS,aAAa,CAAC,KAAK,KAAK,OAAO;AAAA,EACtC,IAAI,UAAe,aAAK,SAAS,MAAM;AAAA,IACrC;AAAA,EACF,EAAO,SAAI,OAAO,UAAU,UAAU;AAAA,IACpC,IAAI,aAAa,IAAI,KAAK,KAAK;AAAA,EACjC,EAAO,SAAI,OAAO,UAAU,UAAU;AAAA,IACpC,YAAY,GAAG,MAAM,OAAO,QAAQ,KAAK,GAAG;AAAA,MAC1C,IAAI,aAAa,IAAI,GAAG,OAAO,MAAM,CAAC;AAAA,IACxC;AAAA,EACF,EAAO;AAAA,IACL,IAAI,aAAa,IAAI,KAAK,MAAM,SAAS,CAAC;AAAA;AAAA;AAG9C,SAAS,uBAAuB,CAAC,aAAa;AAAA,EAC5C,IAAI,MAAM,QAAQ,YAAY,MAAM,GAAG;AAAA,IACrC,OAAO,cAAc,eAAe,CAAC,GAAG,WAAW,GAAG;AAAA,MACpD,QAAQ,OAAO,YAAY,YAAY,OAAO,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;AAAA,IACzE,CAAC;AAAA,EACH;AAAA,EACA,OAAO;AAAA;AAIT,IAAI;AAAJ,IAAW;AAAX,IAA0B;AAA1B,IAAyC;AAAzC,IAAiE;AAAjE,IAA6F;AAA7F,IAAsG;AAAtG,IAA+G;AAA/G,IAAiI;AAAjI,IAA6I;AAA7I,IAAoK;AAApK,IAA8L;AAA9L,IAAgN;AAAhN,IAAsO;AAAtO,IAAsP;AA+FtP,QAAQ,IAAI;AACZ,gBAAgB,IAAI;AACpB,gBAAgB,IAAI;AACpB,yBAAyB,IAAI;AAC7B,6BAA6B,IAAI;AACjC,UAAU,IAAI;AACd,UAAU,IAAI;AACd,mBAAmB,IAAI;AACvB,aAAa,QAAQ,CAAC,UAAU;AAAA,EAC9B,IAAI,eAAe;AAAA,EACnB,SAAS,QAAQ,CAAC,YAAY;AAAA,IAC5B,IAAI,gBAAgB,OAAO,GAAG;AAAA,MAC5B,MAAM,cAAc,aAAa,MAAM,OAAO,MAAM;AAAA,MACpD,gBAAgB,MAAM,kBAAkB,oBAAoB,EAAE,KAAK,MAAM,SAAS;AAAA,MAClF,IAAI,KAAK,SAAS,QAAQ;AAAA,QACxB,QAAQ,QAAQ,QAAQ;AAAA,eACjB;AAAA,YACH,aAAa,MAAM,KAAK,EAAE,IAAI,QAAQ,KAAK,QAAQ,KAAK;AAAA,YACxD,IAAI;AAAA,cAAa,eAAe;AAAA,YAChC;AAAA,eACG;AAAA,YACH,aAAa,MAAM,KAAK,EAAE,IAAI,QAAQ,KAAK,eAAe,eAAe,CAAC,GAAG,aAAa,MAAM,KAAK,EAAE,IAAI,QAAQ,GAAG,CAAC,GAAG,QAAQ,KAAK,CAAC;AAAA,YACxI,IAAI;AAAA,cAAa,eAAe;AAAA,YAChC;AAAA,eACG;AAAA,YACH,aAAa,MAAM,KAAK,EAAE,OAAO,QAAQ,GAAG;AAAA,YAC5C,IAAI;AAAA,cAAa,eAAe;AAAA,YAChC;AAAA;AAAA,MAEN,EAAO;AAAA,QACL,QAAQ,QAAQ,QAAQ;AAAA,eACjB;AAAA,YACH,aAAa,MAAM,aAAa,EAAE,IAAI,QAAQ,GAAG;AAAA,YACjD,aAAa,MAAM,KAAK,EAAE,IAAI,QAAQ,KAAK,QAAQ,KAAK;AAAA,YACxD,IAAI;AAAA,cAAa,eAAe;AAAA,YAChC;AAAA,eACG;AAAA,YACH,IAAI,aAAa,MAAM,aAAa,EAAE,IAAI,QAAQ,GAAG,GAAG;AAAA,cACtD,aAAa,MAAM,KAAK,EAAE,IAAI,QAAQ,KAAK,eAAe,eAAe,CAAC,GAAG,aAAa,MAAM,KAAK,EAAE,IAAI,QAAQ,GAAG,CAAC,GAAG,QAAQ,KAAK,CAAC;AAAA,cACxI,IAAI;AAAA,gBAAa,eAAe;AAAA,YAClC;AAAA,YACA;AAAA,eACG;AAAA,YACH,IAAI,aAAa,MAAM,aAAa,EAAE,IAAI,QAAQ,GAAG,GAAG;AAAA,cACtD,aAAa,MAAM,KAAK,EAAE,OAAO,QAAQ,GAAG;AAAA,cAC5C,aAAa,MAAM,aAAa,EAAE,OAAO,QAAQ,GAAG;AAAA,cACpD,IAAI;AAAA,gBAAa,eAAe;AAAA,YAClC;AAAA,YACA;AAAA;AAAA;AAAA,IAGR;AAAA,IACA,IAAI,iBAAiB,OAAO,GAAG;AAAA,MAC7B,QAAQ,QAAQ,QAAQ;AAAA,aACjB;AAAA,UACH,IAAI,gBAAgB,MAAM,kBAAkB,oBAAoB,EAAE,KAAK,MAAM,YAAY;AAAA,YAAG,eAAe;AAAA,UAC3G,IAAI,aAAa,MAAM,0BAA0B,GAAG;AAAA,YAClD,aAAa,MAAM,4BAA4B,KAAK;AAAA,YAC/C,gBAAgB,MAAM,kBAAkB,qBAAqB,EAAE,KAAK,IAAI;AAAA,UAC/E;AAAA,UACA;AAAA,aACG;AAAA,UACH,aAAa,MAAM,KAAK,EAAE,MAAM;AAAA,UAChC,aAAa,MAAM,aAAa,EAAE,MAAM;AAAA,UACxC,aAAa,MAAM,SAAS,KAAK;AAAA,UACjC,gBAAgB,MAAM,kBAAkB,oBAAoB,EAAE,KAAK,MAAM,SAAS;AAAA,UAClF,aAAa,MAAM,4BAA4B,IAAI;AAAA,UACnD;AAAA;AAAA,IAEN;AAAA,GACD;AAAA,EACD,IAAI;AAAA,IAAc,gBAAgB,MAAM,kBAAkB,SAAS,EAAE,KAAK,IAAI;AAAA;AAEhF,wBAAwB,cAAc,GAAG;AAAA,EACvC,IAAI;AAAA,IACF,MAAM,gBAAgB,MAAM,kBAAkB,gBAAgB,EAAE,KAAK,IAAI;AAAA,IACzE,OAAO,GAAG;AAAA,IACV,gBAAgB,MAAM,kBAAkB,wBAAwB,EAAE,KAAK,MAAM,CAAC;AAAA,IAC9E;AAAA;AAAA,EAEF,MAAM,UAAU,MAAM,QAAQ,IAC5B,MAAM,KAAK,aAAa,MAAM,sBAAsB,CAAC,EAAE,IAAI,OAAO,eAAe;AAAA,IAC/E,IAAI;AAAA,MACF,MAAM,WAAW,KAAK,MAAM,UAAU;AAAA,MACtC,MAAM,KAAK,OAAO,gBAAgB,QAAQ;AAAA,MAC1C;AAAA,MACA,OAAO,GAAG;AAAA,MACV,OAAO;AAAA;AAAA,GAEV,CACH;AAAA,EACA,MAAM,aAAa,QAAQ,KAAK,CAAC,MAAM,MAAW,SAAC;AAAA,EACnD,IAAI,eAAoB;AAAA,IAAG,gBAAgB,MAAM,kBAAkB,wBAAwB,EAAE,KAAK,MAAM,UAAU;AAAA;AAEpH,2BAA2B,QAAQ,CAAC,GAAG;AAAA,EACrC,IAAI,aAAa,YAAY;AAAA,IAC3B,aAAa,MAAM,SAAS,CAAC;AAAA,EAC/B,EAAO,SAAI,aAAa,OAAO;AAAA,IAC7B,aAAa,MAAM,SAAS,IAAI,WAAW,GAAG,EAAE,SAAc,WAAG,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC;AAAA,EACrF,EAAO;AAAA,IACL,aAAa,MAAM,SAAS,IAAI,WAAW,GAAG,OAAO,CAAC,GAAQ,WAAG,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC;AAAA;AAAA,EAErF,gBAAgB,MAAM,kBAAkB,SAAS,EAAE,KAAK,IAAI;AAAA;AAE9D,mBAAmB,cAAc,GAAG;AAAA,EAClC,IAAI,aAAa,MAAM,OAAO;AAAA,IAAG,MAAM,aAAa,MAAM,OAAO;AAAA,EACjE,IAAI,KAAK,OAAO;AAAA,IAAY;AAAA,EAC5B,IAAI,KAAK,OAAO;AAAA,IAAO,MAAM,KAAK,OAAO;AAAA,EACzC,MAAM,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,IACrC,IAAI,UAAU;AAAA,IACd,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM,OAAO,CAAC,WAAW;AAAA,MACvB,IAAI;AAAA,QAAS;AAAA,MACb,UAAU;AAAA,MACV,cAAc,QAAQ;AAAA,MACtB,SAAS,QAAgB,MAAM;AAAA,MAC/B,OAAO;AAAA;AAAA,IAET,MAAM,SAAQ,MAAM;AAAA,MAClB,IAAI,KAAK,OAAO;AAAA,QAAY,OAAO,KAAK,OAAO;AAAA,MAC/C,MAAM,cAAc,KAAK,OAAO;AAAA,MAChC,IAAI;AAAA,QAAa,OAAO,KAAK,MAAM,OAAO,WAAW,CAAC;AAAA,MACtD,IAAI,aAAa,MAAM,OAAO,GAAG;AAAA,QAC/B,MAAM,MAAM,aAAa,MAAM,OAAO;AAAA,QACtC,OAAO,KAAK,MAAM,OAAO,GAAG,CAAC;AAAA,MAC/B;AAAA;AAAA,IAEF,WAAW,YAAY,QAAO,EAAE;AAAA,IAChC,QAAQ,KAAK,OAAO,UAClB,MAAM,OAAM,GACZ,CAAC,QAAQ,KAAK,MAAM,OAAO,GAAG,CAAC,CACjC;AAAA,IACA,OAAM;AAAA,GACP;AAAA;AAEH,uBAAuB,QAAQ,CAAC,QAAQ;AAAA,EACtC,MAAM,eAAe,aAAa,MAAM,OAAO,MAAM;AAAA,EACrD,aAAa,MAAM,SAAS,MAAM;AAAA,EAClC,OAAO,gBAAgB,WAAW;AAAA;AAEpC,iBAAiB,QAAQ,CAAC,GAAG;AAAA,EAC3B,IAAI,aAAa,YAAY;AAAA,IAC3B,aAAa,MAAM,SAAS,CAAC;AAAA,IAC7B,gBAAgB,MAAM,kBAAkB,SAAS,EAAE,KAAK,IAAI;AAAA,EAC9D;AAAA;AAEF,YAAY,QAAQ,GAAG;AAAA,EACrB,aAAa,MAAM,aAAa,EAAE,QAAQ,CAAC,aAAa;AAAA,IACtD,SAAS,EAAE,OAAO,KAAK,cAAc,MAAM,KAAK,YAAY,CAAC;AAAA,GAC9D;AAAA;;;AC16GH,IAAI,aAAY,OAAO;AACvB,IAAI,cAAa,OAAO;AACxB,IAAI,qBAAoB,OAAO;AAC/B,IAAI,uBAAsB,OAAO;AAEjC,IAAI,gBAAe,OAAO,UAAU;AACpC,IAAI,gBAAe,OAAO,UAAU;AAEpC,IAAI,eAAc,CAAC,QAAQ;AAAA,EACzB,MAAM,UAAU,GAAG;AAAA;AAErB,IAAI,mBAAkB,CAAC,KAAK,KAAK,WAAU,OAAO,OAAM,WAAU,KAAK,KAAK,EAAE,YAAY,MAAM,cAAc,MAAM,UAAU,MAAM,MAAM,CAAC,IAAI,IAAI,OAAO;AAC1J,IAAI,kBAAiB,CAAC,GAAG,MAAM;AAAA,EAC7B,SAAS,QAAQ,MAAM,IAAI,CAAC;AAAA,IAC1B,IAAI,cAAa,KAAK,GAAG,IAAI;AAAA,MAC3B,iBAAgB,GAAG,MAAM,EAAE,KAAK;AAAA,EACpC,IAAI;AAAA,IACF,SAAS,QAAQ,qBAAoB,CAAC,GAAG;AAAA,MACvC,IAAI,cAAa,KAAK,GAAG,IAAI;AAAA,QAC3B,iBAAgB,GAAG,MAAM,EAAE,KAAK;AAAA,IACpC;AAAA,EACF,OAAO;AAAA;AAET,IAAI,iBAAgB,CAAC,GAAG,MAAM,YAAW,GAAG,mBAAkB,CAAC,CAAC;AAChE,IAAI,iBAAgB,CAAC,KAAK,QAAQ,QAAQ,OAAO,IAAI,GAAG,KAAK,aAAY,YAAY,GAAG;AACxF,IAAI,gBAAe,CAAC,KAAK,QAAQ,YAAY,eAAc,KAAK,QAAQ,yBAAyB,GAAG,SAAS,OAAO,KAAK,GAAG,IAAI,OAAO,IAAI,GAAG;AAC9I,IAAI,gBAAe,CAAC,KAAK,QAAQ,UAAU,OAAO,IAAI,GAAG,IAAI,aAAY,mDAAmD,IAAI,kBAAkB,UAAU,OAAO,IAAI,GAAG,IAAI,OAAO,IAAI,KAAK,KAAK;AACnM,IAAI,gBAAe,CAAC,KAAK,QAAQ,OAAO,YAAY,eAAc,KAAK,QAAQ,wBAAwB,GAAG,SAAS,OAAO,KAAK,KAAK,KAAK,IAAI,OAAO,IAAI,KAAK,KAAK,GAAG;AACrK,IAAI,mBAAkB,CAAC,KAAK,QAAQ,YAAY,eAAc,KAAK,QAAQ,uBAAuB,GAAG;AAErG,IAAI,UAAU,CAAC,QAAQ,aAAa,cAAc;AAAA,EAChD,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,IACtC,IAAI,YAAY,CAAC,UAAU;AAAA,MACzB,IAAI;AAAA,QACF,KAAK,UAAU,KAAK,KAAK,CAAC;AAAA,QAC1B,OAAO,GAAG;AAAA,QACV,OAAO,CAAC;AAAA;AAAA;AAAA,IAGZ,IAAI,WAAW,CAAC,UAAU;AAAA,MACxB,IAAI;AAAA,QACF,KAAK,UAAU,MAAM,KAAK,CAAC;AAAA,QAC3B,OAAO,GAAG;AAAA,QACV,OAAO,CAAC;AAAA;AAAA;AAAA,IAGZ,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,QAAQ,EAAE,KAAK,IAAI,QAAQ,QAAQ,EAAE,KAAK,EAAE,KAAK,WAAW,QAAQ;AAAA,IAC/F,MAAM,YAAY,UAAU,MAAM,QAAQ,WAAW,GAAG,KAAK,CAAC;AAAA,GAC/D;AAAA;AAuCH,SAAS,SAAS,CAAC,MAAM;AAAA,EACvB,OAAO,OAAO,KAAK,OAAO,CAAC,GAAG,MAAM,IAAI,IAAI,IAAI,CAAC,CAAC;AAAA;AAEpD,SAAS,SAAS,CAAC,MAAM;AAAA,EACvB,OAAO,OAAO,KAAK,OAAO,CAAC,GAAG,MAAM,IAAI,IAAI,IAAI,CAAC,CAAC;AAAA;AAYpD,IAAI;AAAJ,IAAa;AAAb,IAAuB;AAAvB,IAAgD;AAAhD,IAA+D;AAA/D,IAAkF;AAAlF,IAAgG;AAAhG,IAA6H;AAA7H,IAAuI;AAAvI,IAAmK;AAAnK,IAAuL;AAAvL,IAAmM;AACnM,IAAI,mBAAmB,MAAM;AAAA,EAC3B,WAAW,CAAC,SAAS;AAAA,IACnB,cAAa,MAAM,2BAA2B;AAAA,IAC9C,cAAa,MAAM,OAAO;AAAA,IAC1B,cAAa,MAAM,WAAU,KAAK;AAAA,IAClC,cAAa,MAAM,uBAAuB;AAAA,IAI1C,cAAa,MAAM,aAAa;AAAA,IAChC,cAAa,MAAM,iBAAiB;AAAA,IACpC,cAAa,MAAM,+BAA8B,IAAI,GAAK;AAAA,IAC1D;AAAA,MACE,QAAQ;AAAA,MAER,yBAAyB;AAAA,MAEzB;AAAA,QACE;AAAA,IACJ,KAAK,yBAAyB;AAAA,IAC9B,cAAa,MAAM,SAAS,OAAO,YACjC,OAAO,QAAQ,MAAM,EAAE,IAAI,EAAE,KAAK,WAAW;AAAA,MAC3C;AAAA,MACA,iBAAiB,cAAc,QAAQ,IAAI,YAAY,eAAc,gBAAe,CAAC,GAAG,KAAK,GAAG;AAAA,QAC9F,OAAO;AAAA,MACT,CAAC,CAAC;AAAA,IACJ,CAAC,CACH,CAAC;AAAA,IACD,cAAa,MAAM,eAAe,OAAO,YACvC,OAAO,QAAQ,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CACzD,CAAC;AAAA,IACD,cAAa,MAAM,mBAAmB,OAAO,YAC3C,OAAO,QAAQ,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CACzD,CAAC;AAAA,IACD,IAAI;AAAA,MAAO,iBAAgB,MAAM,6BAA6B,SAAQ,EAAE,KAAK,IAAI;AAAA;AAAA,EAEnF,QAAQ,CAAC,UAAU;AAAA,IACjB,OAAO,QAAQ,MAAM,MAAM,UAAU,GAAG;AAAA,MACtC,MAAM,QAAQ,IACZ,MAAM,KAAK,cAAa,MAAM,aAAY,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,QAAQ,MAAM,CAAC,EAAE,GAAG,UAAU,EAAE,UAAU,KAAK;AAAA,QAC/G,IAAI;AAAA,UACF,MAAM,SAAS,QAAQ;AAAA,UACvB,OAAO,KAAK;AAAA,UACZ,eAAe,MAAM;AAAA,YACnB,MAAM;AAAA,WACP;AAAA;AAAA,OAEJ,CAAC,CACJ;AAAA,KACD;AAAA;AAAA,MAKC,MAAM,GAAG;AAAA,IACX,OAAO,cAAa,MAAM,OAAO;AAAA;AAAA,EAEnC,SAAS,CAAC,UAAU,SAAS;AAAA,IAC3B,MAAM,iBAAiB,KAAK,OAAO;AAAA,IACnC,cAAa,MAAM,aAAY,EAAE,IAAI,gBAAgB,CAAC,UAAU,OAAO,CAAC;AAAA,IACxE,IAAI,CAAC,cAAa,MAAM,SAAQ;AAAA,MAAG,iBAAgB,MAAM,6BAA6B,SAAQ,EAAE,KAAK,IAAI;AAAA,IACzG,OAAO,MAAM;AAAA,MACX,cAAa,MAAM,aAAY,EAAE,OAAO,cAAc;AAAA;AAAA;AAAA,EAG1D,cAAc,GAAG;AAAA,IACf,cAAa,MAAM,aAAY,EAAE,MAAM;AAAA;AAAA,EAGzC,YAAY,GAAG;AAAA,IACb,MAAM,eAAe,iBAAgB,MAAM,6BAA6B,eAAe,EAAE,KAAK,IAAI;AAAA,IAClG,IAAI,aAAa,WAAW;AAAA,MAAG;AAAA,IAC/B,OAAO,aAAa,OAAO,CAAC,kBAAkB,GAAG,WAAW;AAAA,MAC1D,IAAI;AAAA,MACJ,OAAO,KAAK,IAAI,kBAAkB,KAAK,MAAM,aAAa,MAAM,OAAO,KAAK,QAAQ;AAAA,OACnF,QAAQ;AAAA;AAAA,EAGb,UAAU,GAAG;AAAA,IACX,MAAM,eAAe,KAAK,aAAa;AAAA,IACvC,IAAI,iBAAsB;AAAA,MAAG,OAAO;AAAA,IACpC,OAAO,KAAK,IAAI,IAAI;AAAA;AAAA,EAGtB,WAAW,GAAG;AAAA,IACZ,OAAO,iBAAgB,MAAM,6BAA6B,eAAe,EAAE,KAAK,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,MAAM,YAAY,CAAC;AAAA;AAAA,EAGjI,SAAS,GAAG;AAAA,IACV,OAAO,iBAAgB,MAAM,6BAA6B,eAAe,EAAE,KAAK,IAAI,EAAE,KAAK,EAAE,GAAG,WAAW,MAAM,UAAU,CAAC;AAAA;AAAA,MAE1H,UAAU,GAAG;AAAA,IACf,OAAO,iBAAgB,MAAM,6BAA6B,eAAe,EAAE,KAAK,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,MAAM,UAAU;AAAA;AAEhI;AACA,UAAU,IAAI;AACd,YAAW,IAAI;AACf,0BAA0B,IAAI;AAC9B,gBAAgB,IAAI;AACpB,oBAAoB,IAAI;AACxB,gBAAe,IAAI;AACnB,8BAA8B,IAAI;AAClC,YAAW,QAAQ,GAAG;AAAA,EACpB,IAAI,cAAa,MAAM,SAAQ;AAAA,IAAG,MAAM,IAAI,MAAM,uCAAuC;AAAA,EACzF,YAAY,KAAK,UAAU,iBAAgB,MAAM,6BAA6B,eAAe,EAAE,KAAK,IAAI,GAAG;AAAA,IACzG,IAAI,MAAM,WAAW,GAAG;AAAA,MACtB,MAAM,IAAI,MAAM,SAAS,qBAAqB;AAAA,IAChD;AAAA,IACA,MAAM,UACJ,CAAC,aAAa,QAAQ,MAAM,MAAM,UAAU,GAAG;AAAA,MAC7C,MAAM,eAAe,SAAS,OAAO,gBAAgB,EAAE,IACrD,GAAG,cAAc,OAAO,QAAQ,yBAAyB,WAAW,OAAO,QAAQ,oBAAoB,IAAI,OAAO,CAAC,CACrH;AAAA,MACA,IAAI,aAAa,SAAS,GAAG;AAAA,QAC3B,MAAM,iBAAiB,UAAU,YAAY;AAAA,QAC7C,MAAM,qBAAqB,cAAa,MAAM,iBAAiB,EAAE;AAAA,QACjE,IAAI,iBAAiB,oBAAoB;AAAA,UACvC,cAAa,MAAM,iBAAiB,EAAE,OAAO;AAAA,QAC/C;AAAA,MACF;AAAA,MACA,MAAM,WAAW,SAAS,OAAO,eAAgB,EAAE,IACjD,GAAG,cAAc,OAAO,QAAQ,QAAQ,WAAW,OAAO,QAAQ,GAAG,IAAI,OAAO,CAAC,CACnF;AAAA,MACA,IAAI,SAAS,SAAS,GAAG;AAAA,QACvB,MAAM,aAAa,UAAU,QAAQ;AAAA,QACrC,MAAM,iBAAiB,cAAa,MAAM,aAAa,EAAE;AAAA,QACzD,IAAI,aAAa,gBAAgB;AAAA,UAC/B,cAAa,MAAM,aAAa,EAAE,OAAO;AAAA,QAC3C;AAAA,QACA,iBAAgB,MAAM,6BAA6B,0BAA0B,EAAE,KAAK,IAAI;AAAA,MAC1F;AAAA,MACA,MAAM,qBAAqB,SAAS,IAClC,CAAC,YAAY,eAAc,gBAAe,CAAC,GAAG,OAAO,GAAG;AAAA,QACtD,OAAO;AAAA,MACT,CAAC,CACH;AAAA,MACA,MAAM,KAAK,SAAS,kBAAkB;AAAA,KACvC,GACD,CAAC,UAAU,iBAAgB,MAAM,6BAA6B,UAAU,EAAE,KAAK,MAAM,KAAK,CAC5F;AAAA,EACF;AAAA,EACA,cAAa,MAAM,WAAU,IAAI;AAAA;AAEnC,6BAA6B,QAAQ,GAAG;AAAA,EACtC,IAAI;AAAA,GACH,KAAK,cAAa,MAAM,uBAAuB,MAAM,QAAY,cAAa,MAAM,yBAAyB,WAAW,MAAM;AAAA,IAC7H,iBAAgB,MAAM,6BAA6B,kBAAkB,EAAE,KAAK,IAAI;AAAA,IAChF,cAAa,MAAM,yBAA8B,SAAC;AAAA,KACjD,KAAK,sBAAsB,CAAC;AAAA;AAEjC,qBAAqB,QAAQ,GAAG;AAAA,EAC9B,OAAO,QAAQ,MAAM,MAAM,UAAU,GAAG;AAAA,IACtC,MAAM,aAAa,UAAU,OAAO,OAAO,cAAa,MAAM,aAAa,CAAC,CAAC;AAAA,IAC7E,MAAM,kBAAkB,iBAAgB,MAAM,6BAA6B,eAAe,EAAE,KAAK,IAAI,EAAE,OAAO,EAAE,SAAS;AAAA,MACvH,MAAM,kBAAkB,cAAa,MAAM,iBAAiB,EAAE;AAAA,MAC9D,OAAO,kBAAkB;AAAA,KAC1B,EAAE,IAAI,EAAE,GAAG,WAAW;AAAA,MACrB,OAAO,MAAM,0BAA0B;AAAA,KACxC;AAAA,IACD,MAAM,QAAQ,IAAI,eAAe;AAAA,GAClC;AAAA;AAEH,aAAa,QAAQ,CAAC,OAAO;AAAA,EAC3B,cAAa,MAAM,aAAY,EAAE,QAAQ,EAAE,GAAG,aAAa;AAAA,IACzD,WAAW,QAAgB,QAAQ,KAAK;AAAA,GACzC;AAAA;AAOH,kBAAkB,QAAQ,GAAG;AAAA,EAC3B,OAAO,OAAO,QAAQ,cAAa,MAAM,OAAO,CAAC;AAAA;AAEnD,IAAI;AAAJ,IAAqB;AAArB,IAAoC;AAApC,IAA8E;AAA9E,IAAuG;AAwCvG,kBAAkB,IAAI;AACtB,gBAAgB,IAAI;AACpB,2CAA2C,IAAI;AAC/C,0BAA0B,QAAQ,GAAG;AAAA,EACnC,OAAO,UAAU,OAAO,OAAO,cAAa,MAAM,aAAa,CAAC,CAAC;AAAA;AAEnE,gBAAgB,QAAQ,CAAC,UAAU;AAAA,EACjC,MAAM,aAAa,KAAK;AAAA,EACxB,SAAS,QAAQ,CAAC,YAAY;AAAA,IAC5B,IAAI;AAAA,IACJ,QAAQ,OAAO,YAAY;AAAA,IAC3B,IAAI,gBAAiB,OAAO,GAAG;AAAA,MAC7B,MAAM,MAAM,OAAO,QAAQ,QAAQ,WAAW,OAAO,QAAQ,GAAG,IAAI,OAAO,CAAC;AAAA,MAC5E,IAAI,CAAC,cAAa,MAAM,eAAe,EAAE,IAAI,GAAG,GAAG;AAAA,QACjD,cAAa,MAAM,eAAe,EAAE,IAAI,KAAK,CAAC,CAAC;AAAA,MACjD;AAAA,OACC,KAAK,cAAa,MAAM,eAAe,EAAE,IAAI,GAAG,MAAM,QAAgB,GAAG,KAAK,OAAO;AAAA,MACtF,IAAI,cACJ,OAAO,QAAQ,SAAS,aAAa,QAAQ,SAAS,MAAM;AAAA,QAC1D,cAAa,MAAM,aAAa,EAAE,SAAS,UAAU;AAAA,UACnD,cAAa,MAAM,aAAa,EAAE;AAAA,UAClC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,EAAO,SAAI,iBAAiB,OAAO,GAAG;AAAA,MACpC,IAAI,QAAQ,YAAY,cAAc;AAAA,QACpC,IAAI,OAAO,QAAQ,yBAAyB,UAAU;AAAA,UACpD,MAAM,IAAI,MAAM,sCAAsC;AAAA,QACxD;AAAA,QACA,cAAa,MAAM,aAAa,EAAE,SAAS,UAAU;AAAA,UACnD,cAAa,MAAM,aAAa,EAAE;AAAA,UAClC,OAAO,QAAQ,oBAAoB;AAAA,QACrC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,GACD;AAAA;;;AClW2I,IAAI,KAAG;AAAyB,eAAe,CAAC,GAAE,IAAG,GAAE,gBAAe,GAAE,iBAAgB,KAAG;AAAA,EAAC,IAAI,IAAE,MAAM,EAAE,MAAM;AAAA;AAAA,aAEjP,EAAE,CAAC;AAAA;AAAA,OAEV,CAAC,CAAC,CAAC;AAAA,EAAE,IAAG,EAAE,KAAK,WAAS;AAAA,IAAE,OAAO;AAAA,EAAK,IAAG,EAAE,KAAK,SAAO;AAAA,IAAE,MAAM,IAAI,MAAM,yCAAyC,GAAG;AAAA,EAAE,IAAI,IAAE,EAAE,KAAK;AAAA,EAAG,IAAG,OAAO,EAAE,YAAU;AAAA,IAAS,OAAM,KAAI,GAAE,UAAS,OAAO,EAAE,QAAQ,EAAC;AAAA,EAAE,MAAM,IAAI,MAAM,0BAA0B,OAAO,EAAE,UAAU;AAAA;AAAE,eAAe,CAAC,GAAE,IAAG,GAAE,gBAAe,GAAE,iBAAgB,GAAE,eAAc,GAAE,SAAQ,GAAE,OAAM,KAAG;AAAA,EAAC,KAAG,QAAQ,IAAI,+BAA8B,GAAE,GAAE,CAAC,GAAE,MAAM,EAAE,MAAM;AAAA,oBACha,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAQjB,CAAC,GAAE,GAAE,EAAE,SAAS,CAAC,CAAC;AAAA;AAAE,eAAe,CAAC,GAAE,IAAG,GAAE,gBAAe,GAAE,iBAAgB,KAAG;AAAA,EAAC,MAAM,EAAE,MAAM,eAAe,EAAE,CAAC,oBAAmB,CAAC,CAAC,CAAC;AAAA;AAAE,eAAe,CAAC,GAAE,IAAG,GAAE,gBAAe,KAAG;AAAA,EAAC,MAAM,EAAE,KAAK;AAAA,YACzL;AAAA,qCACyB;AAAA,mCACF,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,KAKjC;AAAA;AAAE,SAAS,CAAC,CAAC,GAAE;AAAA,EAAC,OAAM,IAAI,OAAO;AAAA;AAAM,eAAe,CAAC,GAAE,IAAG,GAAE,OAAM,GAAE,QAAO,IAAE,UAAS,SAAQ,GAAE,YAAW,GAAE,YAAW,GAAE,OAAM,KAAG;AAAA,EAAC,IAAI,IAAE,IAAE,EAAE,GAAE,CAAC,IAAE,EAAE;AAAA,EAAM,QAAO,EAAE,QAAQ;AAAA,SAAe,UAAS;AAAA,MAAC,KAAG,QAAQ,IAAI,aAAY,CAAC;AAAA,MAAE,IAAI,IAAE,OAAO,KAAK,CAAC;AAAA,MAAE,OAAO,MAAM,EAAE,MAAM;AAAA,2BACzP,OAAO;AAAA,eACnB,EAAE,IAAI,OAAG,MAAI,IAAE,GAAG,EAAE,KAAK,IAAI;AAAA;AAAA,eAE7B,EAAE,IAAI,CAAC,GAAE,MAAI,OAAK,IAAE,EAAE,EAAE,KAAK,IAAI;AAAA,aACpC,EAAE,IAAI,OAAG,EAAE,EAAE,CAAC;AAAA,IAAC;AAAA,SAAK,UAAS;AAAA,MAAC,KAAG,QAAQ,IAAI,YAAW,CAAC;AAAA,MAAE,IAAI,IAAE,OAAO,KAAK,CAAC,EAAE,OAAO,OAAG,CAAC,EAAE,SAAS,CAAC,CAAC;AAAA,MAAE,OAAO,EAAE,WAAS,IAAO,YAAE,MAAM,EAAE,MAAM;AAAA,sBACzI,OAAO;AAAA,kBACX,EAAE,IAAI,CAAC,GAAE,MAAI,MAAI,IAAE,WAAS,IAAE,EAAE,EAAE,KAAK,IAAI;AAAA,oBACzC,EAAE,IAAI,CAAC,GAAE,MAAI,MAAI,IAAE,WAAS,EAAE,SAAO,IAAE,EAAE,EAAE,KAAK,OAAO;AAAA,aAC/D,CAAC,GAAG,EAAE,IAAI,OAAG,EAAE,EAAE,GAAE,GAAG,EAAE,IAAI,OAAG,EAAE,EAAE,CAAC,CAAC;AAAA,IAAC;AAAA,SAAK;AAAA,MAAS,OAAO,KAAG,QAAQ,IAAI,YAAW,CAAC,GAAE,MAAM,EAAE,MAAM;AAAA,2BACvF,OAAO;AAAA,oBACd,EAAE,IAAI,CAAC,GAAE,MAAI,MAAI,IAAE,WAAS,IAAE,EAAE,EAAE,KAAK,OAAO;AAAA,aACtD,CAAC,GAAG,EAAE,IAAI,OAAG,EAAE,EAAE,CAAC,CAAC;AAAA;AAAA;AAAG,eAAe,CAAC,GAAE,IAAG,GAAE,OAAM,GAAE,QAAO,IAAE,UAAS,UAAS,GAAE,YAAW,GAAE,OAAM,KAAG;AAAA,EAAC,IAAI,IAAE,EAAE,IAAI,OAAG,IAAE,EAAE,GAAE,CAAC,IAAE,EAAE,KAAK;AAAA,EAAE,KAAG,QAAQ,IAAI,aAAY,CAAC;AAAA,EAAE,IAAI,IAAE,OAAO,KAAK,EAAE,EAAE,GAAE,IAAE,OAAG;AAAA,IAAC,IAAG,MAAI;AAAA,MAAK,OAAO;AAAA,IAAE,IAAG,aAAa;AAAA,MAAY,OAAO,EAAE;AAAA,IAAW,IAAG,aAAa;AAAA,MAAK,OAAO,EAAE;AAAA,IAAK,IAAG,aAAa,cAAY,aAAa,YAAU,YAAY,OAAO,CAAC;AAAA,MAAE,OAAO,EAAE;AAAA,IAAW,QAAO,OAAO;AAAA,WAAO;AAAA,QAAS,OAAO,EAAE;AAAA,WAAW;AAAA,QAAS,OAAO;AAAA,WAAM;AAAA,QAAU,OAAO;AAAA;AAAA,QAAU,OAAO,aAAa,OAAK,IAAE,GAAG,SAAS,GAAG,UAAQ;AAAA;AAAA,KAAI,IAAE,OAAG,EAAE,OAAO,CAAC,GAAE,MAAI;AAAA,IAAC,IAAI,IAAE,EAAE;AAAA,IAAG,IAAG,MAAI;AAAA,MAAK,OAAO;AAAA,IAAE,IAAG,MAAM,QAAQ,CAAC,GAAE;AAAA,MAAC,IAAG,EAAE,WAAS;AAAA,QAAE,OAAO;AAAA,MAAE,IAAI,IAAE,EAAE;AAAA,MAAG,QAAO,OAAO;AAAA,aAAO;AAAA,UAAS,OAAO,IAAE,EAAE,SAAO;AAAA,aAAM;AAAA,UAAS,OAAO,IAAE,EAAE,OAAO,CAAC,GAAE,MAAI,IAAE,EAAE,QAAO,CAAC;AAAA,aAAM;AAAA,UAAU,OAAO,IAAE,EAAE;AAAA;AAAA,UAAe,OAAO,aAAa,OAAK,IAAE,EAAE,SAAO,IAAE,IAAE,EAAE,OAAO,CAAC,GAAE,MAAI,IAAE,EAAE,CAAC,GAAE,CAAC;AAAA;AAAA,IAAE;AAAA,IAAC,OAAO,IAAE,EAAE,CAAC;AAAA,KAAG,CAAC,GAAE,IAAE,OAAK,IAAE,KAAG,OAAK,MAAK,IAAE,OAAM,MAAG;AAAA,IAAC,IAAI,IAAE;AAAA,qBACr5B,OAAO;AAAA,SACnB,EAAE,IAAI,OAAG,IAAI,IAAI,EAAE,KAAK,IAAI;AAAA;AAAA,QAE7B,EAAE,IAAI,CAAC,GAAE,MAAI,IAAI,EAAE,IAAI,CAAC,GAAE,MAAI,OAAK,IAAE,EAAE,SAAO,IAAE,EAAE,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI;AAAA,OAC9E,IAAE,EAAE,QAAQ,OAAG,EAAE,IAAI,OAAG,EAAE,EAAE,CAAC;AAAA,IAAE,MAAM,EAAE,MAAM,GAAE,CAAC;AAAA,KAAG,IAAE,CAAC,GAAE,IAAE,GAAE,IAAE;AAAA,EAAE,SAAQ,IAAE,EAAE,IAAE,EAAE,QAAO,KAAI;AAAA,IAAC,IAAI,IAAE,EAAE,IAAG,IAAE,EAAE,CAAC,GAAE,IAAE,EAAE;AAAA,IAAO,EAAE,SAAO,MAAI,IAAE,IAAE,KAAG,IAAE,IAAE,OAAK,KAAG,IAAE,IAAE,KAAG,QAAQ,IAAI,4CAA4C,GAAE,KAAG,IAAE,IAAE,KAAG,QAAQ,IAAI,8CAA8C,GAAE,MAAM,EAAE,CAAC,GAAE,IAAE,CAAC,GAAE,IAAE,GAAE,IAAE,IAAG,EAAE,KAAK,CAAC,GAAE,KAAG,GAAE,KAAG;AAAA,EAAC;AAAA,EAAC,EAAE,SAAO,KAAG,MAAM,EAAE,CAAC,GAAE,KAAG,QAAQ,IAAI,YAAY,EAAE,0BAA0B;AAAA;AAAE,eAAe,CAAC,GAAE,IAAG,GAAE,OAAM,GAAE,QAAO,IAAE,UAAS,UAAS,GAAE,YAAW,GAAE,OAAM,KAAG;AAAA,EAAC,KAAG,QAAQ,IAAI,0CAA0C;AAAA,EAAE,IAAI,IAAE,EAAE,IAAI,OAAG,IAAE,EAAE,GAAE,CAAC,IAAE,EAAE,KAAK,GAAE,KAAG,MAAM,EAAE,MAAM;AAAA;AAAA;AAAA;AAAA,SAI3lB,CAAC,GAAE,CAAC,CAAC,GAAG,KAAK,OAAO,OAAG,OAAO,UAAU,eAAe,KAAK,EAAE,IAAG,EAAE,WAAW,CAAC,GAAE,IAAE;AAAA,EAAI,SAAQ,IAAE,EAAE,IAAE,EAAE,QAAO,KAAG,GAAE;AAAA,IAAC,IAAI,IAAE,EAAE,MAAM,GAAE,IAAE,CAAC;AAAA,IAAE,MAAM,EAAE,MAAM;AAAA,uBACxI,OAAO;AAAA,qDACuB,EAAE,IAAI,OAAG,GAAG,EAAE,eAAe,EAAE,SAAS,QAAQ,MAAK,EAAE,OAAK,EAAE,cAAY,UAAQ,OAAK,GAAG,EAAE,KAAK,IAAI;AAAA,SAClJ,CAAC,CAAC,CAAC;AAAA,EAAC;AAAA,EAAC,KAAG,QAAQ,IAAI,YAAY,EAAE,qCAAqC;AAAA;AAAE,eAAe,CAAC,GAAE,IAAG,GAAE,OAAM,GAAE,QAAO,IAAE,UAAS,UAAS,GAAE,YAAW,GAAE,OAAM,KAAG;AAAA,EAAC,KAAG,QAAQ,IAAI,6BAA6B;AAAA,EAAE,IAAI,IAAE,EAAE,IAAI,OAAG,IAAE,EAAE,GAAE,CAAC,IAAE,EAAE,KAAK,GAAE,IAAE,OAAO,KAAK,EAAE,EAAE,GAAE,IAAE,EAAE,IAAI,OAAG,EAAE,IAAI,OAAG;AAAA,IAAC,IAAI,IAAE,EAAE;AAAA,IAAG,OAAO,OAAO,KAAG,aAAW,EAAE,SAAS,GAAG,KAAG,EAAE,SAAS,GAAG,KAAG,EAAE,SAAS;AAAA,CAC/W,KAAG,IAAI,EAAE,QAAQ,MAAK,IAAI,OAAK,MAAI,OAAK,QAAM;AAAA,GAAE,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK;AAAA,CAClE,GAAE,IAAE,IAAI,KAAK,CAAC,CAAC,GAAE,EAAC,MAAK,WAAU,CAAC;AAAA,EAAE,MAAM,EAAE,MAAM;AAAA,cACrC,OAAO,OAAO,EAAE,IAAI,OAAG,IAAI,IAAI,EAAE,KAAK,IAAI;AAAA;AAAA;AAAA,OAGlD,CAAC,GAAE,EAAC,MAAK,EAAC,CAAC,GAAE,KAAG,QAAQ,IAAI,YAAY,EAAE,wBAAwB;AAAA;AAAE,SAAS,CAAC,CAAC,GAAE,GAAE;AAAA,EAAC,IAAG,OAAO,KAAG;AAAA,IAAW,OAAO,EAAE,CAAC;AAAA,EAAE,IAAI,IAAE,CAAC;AAAA,EAAE,UAAQ,GAAE,MAAK,OAAO,QAAQ,CAAC;AAAA,IAAE,EAAE,KAAG,EAAE,MAAM;AAAA,EAAG,OAAO;AAAA;AAAE,eAAe,EAAE,CAAC,GAAE,GAAE;AAAA,EAAC,IAAI,IAAE,GAAG,SAAO,OAAG,IAAE,GAAG,kBAAgB,YAAW,IAAE,CAAC,GAAE,IAAE,IAAI,KAAI,IAAE,OAAG,IAAE,YAAS;AAAA,IAAC,MAAI,IAAE,MAAG,MAAM,EAAE,EAAC,IAAG,GAAE,gBAAe,EAAC,CAAC;AAAA,KAAI,IAAE,SAAO,KAAI,GAAE,QAAO,GAAE,SAAQ,IAAE,OAAG,qBAAoB,IAAE,UAAS,eAAc,GAAE,SAAQ,QAAK;AAAA,IAAC,IAAI,IAAE;AAAA,IAAG,MAAM,EAAE,GAAE,OAAO,OAAO,CAAC,EAAE,OAAO,OAAG,CAAC,EAAE,aAAa,EAAE,QAAQ,OAAG;AAAA,MAAC,IAAG,EAAE,IAAI,EAAE,KAAK;AAAA,QAAE,MAAM,IAAI,MAAM,qCAAmC,EAAE,KAAK;AAAA,MAAE,EAAE,IAAI,EAAE,KAAK;AAAA,KAAE;AAAA,IAAE,IAAI,IAAE;AAAA,IAAK,MAAI,SAAO,IAAE,MAAM,EAAE,EAAC,IAAG,GAAE,gBAAe,GAAE,iBAAgB,EAAC,CAAC,GAAE,KAAG,KAAG,QAAQ,IAAI,oCAAmC,CAAC;AAAA,IAAG,IAAI,IAAE,MAAI;AAAA,IAAK,KAAG,MAAI,aAAW,IAAE,OAAM,QAAQ,KAAK,4GAA4G;AAAA,IAAG,IAAI,IAAE,CAAC,KAAG,MAAI,UAAS,IAAE,OAAG,IAAE,IAAI,IAAI,OAAO,KAAK,CAAC,EAAE,IAAI,OAAG,CAAC,GAAE,IAAI,GAAG,CAAC,CAAC,GAAE,IAAE,IAAI,IAAI,OAAO,KAAK,CAAC,EAAE,IAAI,OAAG,CAAC,GAAE,OAAO,EAAE,CAAC,CAAC,CAAC,GAAE,IAAE,IAAI,KAAI,IAAE,GAAG,YAAU,OAAO,EAAE,GAAE,IAAE,IAAI;AAAA,IAAgB,OAAO,OAAO,CAAC,EAAE,OAAO,OAAG,CAAC,CAAC,EAAE,MAAM,MAAM,EAAE,QAAQ,OAAG;AAAA,MAAC,EAAE,MAAM,OAAO,iBAAiB,SAAQ,MAAI,EAAE,MAAM,GAAE,EAAC,MAAK,KAAE,CAAC;AAAA,KAAE;AAAA,IAAE,IAAI,IAAE,IAAI,iBAAG,EAAC,QAAO,OAAO,YAAY,OAAO,QAAQ,CAAC,EAAE,IAAI,EAAE,GAAE,OAAK;AAAA,MAAC,IAAI,IAAE,GAAG,eAAe;AAAA,MAAG,OAAM,CAAC,GAAE,KAAI,EAAE,UAAS,IAAE,EAAC,QAAO,EAAE,QAAO,QAAO,EAAE,OAAM,IAAE,CAAC,GAAE,QAAO,EAAE,OAAM,CAAC;AAAA,KAAE,CAAC,EAAC,CAAC,GAAE,KAAG,EAAC,MAAK,GAAE,KAAI,GAAE,SAAQ,GAAE,QAAO,EAAC,GAAE,KAAG,OAAM,MAAG;AAAA,MAAC,IAAI,IAAE,IAAI,IAAI,OAAO,KAAK,CAAC,EAAE,IAAI,OAAG,CAAC,GAAE,CAAC,CAAC,CAAC,CAAC;AAAA,MAAE,UAAQ,GAAE,MAAK,EAAE,QAAQ,GAAE;AAAA,QAAC,IAAI,IAAE,EAAE,IAAI,CAAC;AAAA,QAAE,SAAQ,KAAK,EAAE,KAAK;AAAA,UAAE,IAAG,KAAG,GAAE;AAAA,YAAC,SAAQ,KAAK,EAAE,IAAI,CAAC;AAAA,cAAE,EAAE,KAAK,CAAC;AAAA,YAAE,EAAE,OAAO,CAAC;AAAA,UAAC;AAAA,MAAC;AAAA,MAAC,MAAM,EAAE,YAAY,OAAM,MAAG;AAAA,QAAC,KAAG,QAAQ,KAAK,QAAQ,GAAE,MAAM,EAAE,KAAK,aAAa,mBAAmB;AAAA,QAAE,UAAQ,GAAE,MAAK,EAAE,QAAQ,GAAE;AAAA,UAAC,IAAI,IAAE,EAAE,IAAG,IAAE;AAAA,UAAE,IAAG,EAAE,IAAI,CAAC,GAAE;AAAA,YAAC,IAAG,KAAG,QAAQ,IAAI,oBAAmB,EAAE,KAAK,GAAE,EAAE;AAAA,cAAc,MAAM,EAAE,cAAc,CAAC;AAAA,YAAM;AAAA,cAAC,IAAI,IAAE,EAAE,UAAQ;AAAA,cAAS,MAAM,EAAE,KAAK,gBAAgB,OAAO,EAAE,SAAS;AAAA;AAAA,YAAE,EAAE,OAAO,CAAC;AAAA,UAAC;AAAA,UAAC,IAAG,CAAC,GAAE;AAAA,YAAC,IAAI,IAAE,CAAC,GAAE,IAAE,CAAC,GAAE,IAAE;AAAA,YAAG,SAAQ,KAAK;AAAA,cAAE,CAAC,KAAG,EAAE,QAAQ,cAAY,WAAS,EAAE,KAAK,CAAC,KAAG,IAAE,MAAG,EAAE,KAAK,CAAC;AAAA,YAAG,EAAE,SAAO,KAAG,MAAI,SAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAE,IAAE,GAAE,EAAE,SAAO,MAAI,MAAM,GAAG,GAAG,EAAC,IAAG,GAAE,OAAM,EAAE,OAAM,QAAO,EAAE,QAAO,UAAS,GAAE,YAAW,EAAE,YAAW,OAAM,EAAC,CAAC,GAAE,IAAE;AAAA,UAAG;AAAA,UAAC,IAAI,IAAE,CAAC,GAAE,IAAE,MAAK,IAAE,EAAE;AAAA,UAAO,SAAQ,IAAE,EAAE,IAAE,GAAE,KAAI;AAAA,YAAC,IAAI,IAAE,EAAE;AAAA,YAAG,EAAE,QAAQ,cAAY,WAAS,EAAE,KAAK,CAAC,IAAE,IAAE,IAAG,KAAG,MAAI,IAAE,OAAK,EAAE,SAAO,MAAI,MAAM,EAAE,EAAC,IAAG,GAAE,OAAM,EAAE,OAAM,QAAO,EAAE,QAAO,UAAS,GAAE,YAAW,EAAE,YAAW,OAAM,EAAC,CAAC,GAAE,EAAE,SAAO,IAAG,MAAI,MAAM,EAAE,EAAC,IAAG,GAAE,OAAM,EAAE,OAAM,QAAO,EAAE,QAAO,SAAQ,GAAE,YAAW,EAAE,YAAW,YAAW,EAAE,YAAW,OAAM,EAAC,CAAC,GAAE,IAAE;AAAA,UAAM;AAAA,QAAC;AAAA,QAAC,KAAG,MAAM,EAAE,EAAC,IAAG,GAAE,gBAAe,GAAE,iBAAgB,GAAE,eAAc,OAAO,YAAY,OAAO,KAAK,CAAC,EAAE,IAAI,OAAG,CAAC,GAAE,EAAC,QAAO,EAAE,OAAO,GAAG,aAAY,QAAO,EAAE,OAAO,GAAG,WAAU,CAAC,CAAC,CAAC,GAAE,SAAQ,GAAE,OAAM,EAAC,CAAC,GAAE,KAAG,MAAM,EAAE,SAAS;AAAA,OAAE,GAAE,KAAG,QAAQ,QAAQ,QAAQ,GAAE,KAAG,CAAC,KAAG,EAAE,eAAa,EAAE,GAAE,IAAE;AAAA;AAAA,IAAK,OAAO,EAAE,UAAU,OAAM,MAAG;AAAA,MAAC,IAAG;AAAA,QAAE;AAAA,MAAO,KAAG,QAAQ,IAAI,qBAAoB,EAAE,MAAM,GAAE,EAAE,QAAQ,OAAG;AAAA,QAAC,IAAI,IAAE,EAAE,IAAI,EAAE,KAAK,KAAG,OAAO,EAAE;AAAA,QAAE,IAAG,gBAAG,CAAC,GAAE;AAAA,UAAC,IAAI,IAAE,EAAE,IAAI,EAAE,KAAK,GAAE,IAAE,OAAO,EAAE,QAAQ,OAAK,WAAS,OAAO,EAAE,QAAQ,GAAG,IAAE,OAAO,CAAC;AAAA,UAAE,IAAG,KAAG;AAAA,YAAE;AAAA,UAAO,IAAI,IAAE,EAAE,QAAQ,QAAM;AAAA,UAAG,EAAE,IAAI,CAAC,KAAG,EAAE,IAAI,GAAE,CAAC,CAAC,GAAE,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,GAAE,KAAG,EAAE,IAAI,EAAE,OAAM,CAAC;AAAA,QAAC,EAAM,SAAG,iBAAG,CAAC;AAAA,UAAE,QAAO,EAAE,QAAQ;AAAA,iBAAa,cAAa;AAAA,cAAC,IAAG,KAAG,QAAQ,IAAI,uBAAsB,CAAC,GAAE,OAAO,EAAE,QAAQ,wBAAsB;AAAA,gBAAS,MAAM,IAAI,MAAM,sCAAsC;AAAA,cAAE,IAAI,IAAE,OAAO,EAAE,QAAQ,oBAAoB;AAAA,cAAE,IAAG,KAAG;AAAA,gBAAE;AAAA,cAAO,EAAE,IAAI,EAAE,OAAM,CAAC;AAAA,cAAE;AAAA,YAAK;AAAA,iBAAK,gBAAe;AAAA,cAAC,KAAG,QAAQ,IAAI,yBAAwB,CAAC,GAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAE,EAAE,IAAI,EAAE,OAAM,OAAO,EAAE,CAAC,GAAE,EAAE,IAAI,EAAE,KAAK;AAAA,cAAE;AAAA,YAAK;AAAA;AAAA,OAAG;AAAA,MAAE,IAAI,IAAE,MAAM,KAAK,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,GAAE,MAAI,IAAE,IAAE,IAAE,CAAC,GAAE,IAAE,IAAE,GAAE,IAAE,KAAG,KAAG,EAAE,OAAK;AAAA,OAAG,KAAG,OAAK,GAAG,CAAC,GAAE,MAAM,IAAI,QAAQ,OAAG,WAAW,CAAC,CAAC;AAAA,OAAI,CAAC,GAAE,EAAE,KAAK,EAAC,QAAO,GAAE,SAAQ,EAAC,CAAC,GAAE,EAAC,aAAY,MAAI;AAAA,MAAC,KAAG,QAAQ,IAAI,eAAe,GAAE,IAAE,MAAG,EAAE,eAAe,GAAE,EAAE,MAAM;AAAA,MAAE,SAAQ,KAAK,OAAO,OAAO,CAAC;AAAA,QAAE,EAAE,OAAO,EAAE,KAAK;AAAA,WAAO,UAAU,GAAE;AAAA,MAAC,OAAO,EAAE;AAAA,OAAY,SAAQ,OAAO,YAAY,OAAO,KAAK,CAAC,EAAE,IAAI,OAAG,CAAC,GAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAC;AAAA;AAAA,EAAG,OAAM,EAAC,cAAa,EAAC,oBAAmB,GAAE,oBAAmB,GAAE,kBAAiB,OAAM,MAAG;AAAA,IAAC,IAAI,IAAE,MAAM,EAAE,EAAC,QAAO,EAAC,OAAM,EAAC,OAAM,EAAE,OAAM,OAAM,EAAE,OAAM,QAAO,EAAE,QAAO,YAAW,EAAE,YAAW,YAAW,EAAE,YAAW,eAAc,EAAE,cAAa,EAAC,GAAE,KAAI,EAAE,UAAS,SAAQ,EAAE,SAAQ,qBAAoB,EAAE,qBAAoB,eAAc,EAAE,eAAc,SAAQ,EAAE,QAAO,CAAC;AAAA,IAAE,OAAM,EAAC,aAAY,EAAE,iBAAgB,UAAU,GAAE;AAAA,MAAC,OAAO,EAAE;AAAA,OAAY,QAAO,EAAE,QAAQ,MAAK;AAAA,KAAG,oBAAmB,OAAM,MAAG;AAAA,IAAC,MAAM,EAAE,EAAC,IAAG,GAAE,gBAAe,GAAE,iBAAgB,EAAC,CAAC;AAAA,IAAE,GAAE,OAAM,YAAS;AAAA,IAAC,WAAQ,QAAO,GAAE,SAAQ,OAAK;AAAA,MAAE,EAAE,eAAe,GAAE,EAAE,MAAM;AAAA,IAAE;AAAA;AAAE,SAAS,EAAE,CAAC,GAAE;AAAA,EAAC,OAAM,EAAC,MAAK,iBAAgB,OAAM,OAAM,MAAG;AAAA,IAAC,MAAI,cAAa,GAAE,OAAM,MAAG,MAAM,GAAG,GAAE,CAAC;AAAA,IAAE,OAAM,EAAC,cAAa,GAAE,OAAM,EAAC;AAAA,IAAE;AAAA;;;AHrCnoJ,IAAvB;;;AIQuB,IAAvB;AAEA,IAAM,YAAY;AAClB,IAAM,oBAAoB;AAC1B,IAAM,cAAc;AAmBpB,SAAS,aAAa,CAAC,SAAiB,SAAyB;AAAA,EAC/D,MAAM,OAAO,QAAQ,QAAQ,QAAQ,EAAE;AAAA,EACvC,OAAO,GAAG,4BAA4B;AAAA;AAAA;AAGjC,MAAM,iBAAiB;AAAA,EACpB;AAAA,EACA;AAAA,EACA,QAAwB,CAAC;AAAA,EACzB,WAAW;AAAA,EACX,aAAmD;AAAA,EAEnD,eAAe;AAAA,EAEvB,WAAW,CAAC,OAAyB,CAAC,GAAG;AAAA,IACvC,MAAM,UAAU,KAAK,gBAAgB,QAAQ,IAAI,8BAA8B;AAAA,IAC/E,MAAM,MAAM,KAAK,cAAc,QAAQ,IAAI,2BAA2B;AAAA,IACtE,MAAM,UAAU,KAAK,WAAW,QAAQ,IAAI,YAAY;AAAA,IAExD,IAAI,WAAW,WAAW,KAAK;AAAA,MAC7B,KAAK,WAAW,cAAc,SAAS,OAAO;AAAA,MAC9C,KAAK,aAAa;AAAA,IACpB,EAAO;AAAA,MACL,KAAK,WAAW;AAAA,MAChB,KAAK,aAAa;AAAA;AAAA;AAAA,MAKlB,OAAO,GAAY;AAAA,IACrB,OAAO,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,KAAK;AAAA;AAAA,EAOnC,OAAO,CACL,OACA,WACA,KACM;AAAA,IACN,IAAI,CAAC,KAAK;AAAA,MAAS;AAAA,IAEnB,KAAK;AAAA,IACL,MAAM,UAAU,GAAG,KAAK,IAAI,KAAK,KAAK;AAAA,IAEtC,KAAK,MAAM,KAAK,EAAE,OAAO,WAAW,KAAK,SAAS,SAAS,EAAE,CAAC;AAAA,IAE9D,IAAI,KAAK,MAAM,UAAU,WAAW;AAAA,MAClC,KAAK,cAAc,CAAC;AAAA,IACtB,EAAO;AAAA,MACL,KAAK,cAAc,iBAAiB;AAAA;AAAA;AAAA,OASlC,MAAK,GAAkB;AAAA,IAC3B,IAAI,KAAK,YAAY;AAAA,MACnB,aAAa,KAAK,UAAU;AAAA,MAC5B,KAAK,aAAa;AAAA,IACpB;AAAA,IAEA,OAAO,KAAK,MAAM,SAAS,GAAG;AAAA,MAC5B,IAAI,CAAC,KAAK,UAAU;AAAA,QAClB,MAAM,KAAK,WAAW;AAAA,MACxB;AAAA,MAEA,MAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAAA,IAC5C;AAAA,IAEA,IAAI,CAAC,KAAK,UAAU;AAAA,MAClB,MAAM,KAAK,WAAW;AAAA,IACxB;AAAA;AAAA,EAGM,aAAa,CAAC,SAAuB;AAAA,IAC3C,IAAI,KAAK;AAAA,MAAY;AAAA,IACrB,KAAK,aAAa,WAAW,MAAM;AAAA,MACjC,KAAK,aAAa;AAAA,MAClB,KAAK,WAAW,EAAE,MAAM,MAAM,EAE7B;AAAA,OACA,OAAO;AAAA;AAAA,OAGE,WAAU,GAAkB;AAAA,IACxC,IAAI,KAAK;AAAA,MAAU;AAAA,IACnB,IAAI,KAAK,MAAM,WAAW;AAAA,MAAG;AAAA,IAC7B,IAAI,CAAC,KAAK,SAAS;AAAA,MACjB,KAAK,QAAQ,CAAC;AAAA,MACd;AAAA,IACF;AAAA,IAEA,KAAK,WAAW;AAAA,IAEhB,IAAI;AAAA,MACF,OAAO,KAAK,MAAM,SAAS,GAAG;AAAA,QAC5B,MAAM,QAAQ,KAAK,MAAM,OAAO,GAAG,SAAS;AAAA,QAC5C,MAAM,KAAK,UAAU,KAAK;AAAA,MAC5B;AAAA,cACA;AAAA,MACA,KAAK,WAAW;AAAA,MAChB,IAAI,KAAK,MAAM,SAAS,GAAG;AAAA,QACzB,KAAK,cAAc,CAAC;AAAA,MACtB;AAAA;AAAA;AAAA,OAIU,UAAS,CAAC,OAAsC;AAAA,IAG5D,IAAI,CAAC,KAAK,YAAY,CAAC,KAAK,YAAY;AAAA,MACtC,qBAAO,KACL,EAAE,KAAK,aAAa,GACpB,0EACF;AAAA,MACA;AAAA,IACF;AAAA,IAEA,IAAI;AAAA,MACF,MAAM,WAAW,MAAM,MAAM,KAAK,UAAU;AAAA,QAC1C,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,iBAAiB,KAAK;AAAA,QACxB;AAAA,QACA,MAAM,KAAK,UAAU,EAAE,QAAQ,MAAM,CAAC;AAAA,QACtC,QAAQ,YAAY,QAAQ,KAAM;AAAA,MACpC,CAAC;AAAA,MAED,IAAI,CAAC,SAAS,IAAI;AAAA,QAChB,MAAM,SAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AAAA,QACjD,qBAAO,KACL,EAAE,KAAK,cAAc,QAAQ,SAAS,OAAO,GAC7C,wCAAwC,SAAS,WAAW,OAAK,MAAM,GAAG,GAAG,GAC/E;AAAA,QACA,KAAK,cAAc,KAAK;AAAA,MAC1B;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAC3D,qBAAO,KACL,EAAE,KAAK,cAAc,OAAO,IAAI,GAChC,yDACF;AAAA,MACA,KAAK,cAAc,KAAK;AAAA;AAAA;AAAA,EAIpB,aAAa,CAAC,OAA6B;AAAA,IACjD,MAAM,UAA0B,CAAC;AAAA,IACjC,WAAW,SAAS,OAAO;AAAA,MACzB,MAAM;AAAA,MACN,IAAI,MAAM,WAAW,aAAa;AAAA,QAChC,QAAQ,KAAK,KAAK;AAAA,MACpB,EAAO;AAAA,QACL,qBAAO,KACL;AAAA,UACE,KAAK;AAAA,UACL,OAAO,MAAM;AAAA,UACb,SAAS,MAAM;AAAA,UACf,SAAS,MAAM;AAAA,QACjB,GACA,oDACF;AAAA;AAAA,IAEJ;AAAA,IACA,IAAI,QAAQ,SAAS,GAAG;AAAA,MAEtB,KAAK,MAAM,QAAQ,GAAG,OAAO;AAAA,IAC/B;AAAA;AAEJ;;;AC7NO,IAAM,qBAAqB;AAAA,EAChC,aAAa;AAAA,EACb,cAAc;AAAA,EACd,uBAAuB;AACzB;AAAA;AAIO,MAAM,wBAAwB,MAAM;AAAA,EACzB;AAAA,EACA;AAAA,EAEhB,WAAW,CACT,MACA,SACA,SACA;AAAA,IACA,MAAM,SAAS,EAAE,OAAO,SAAS,MAAM,CAAC;AAAA,IACxC,KAAK,OAAO;AAAA,IACZ,KAAK,OAAO;AAAA,IACZ,KAAK,UAAU,SAAS;AAAA;AAE5B;AAEO,SAAS,qBAAqB,CACnC,MACA,SACA,SACiB;AAAA,EACjB,OAAO,IAAI,gBAAgB,MAAM,SAAS,OAAO;AAAA;AAG5C,SAAS,kBAAkB,CAAC,KAAsC;AAAA,EACvE,MAAM,OAAO,IAAI;AAAA,EACjB,IAAI,UAAmB;AAAA,EAEvB,OAAO,WAAW,CAAC,KAAK,IAAI,OAAO,GAAG;AAAA,IACpC,KAAK,IAAI,OAAO;AAAA,IAChB,IACE,OAAO,YAAY,YACnB,YAAY,QACZ,UAAU,WACV,OAAQ,QAA+B,SAAS,UAChD;AAAA,MACA,MAAM,OAAQ,QAA6B;AAAA,MAC3C,IACE,SAAS,mBAAmB,eAC5B,SAAS,mBAAmB,gBAC5B,SAAS,mBAAmB,uBAC5B;AAAA,QACA,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IAEA,IAAI,mBAAmB,OAAO;AAAA,MAC5B,UAAW,QAAwC;AAAA,MACnD;AAAA,IACF;AAAA,IAEA,IAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,WAAW,SAAS;AAAA,MACzE,UAAW,QAAgC;AAAA,MAC3C;AAAA,IACF;AAAA,IAEA;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAGF,SAAS,sBAAsB,CAAC,MAAwC;AAAA,EAC7E,OACE,SAAS,mBAAmB,eAC5B,SAAS,mBAAmB,gBAC5B,SAAS,mBAAmB;AAAA;;;ALlDzB,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAAA;AAmEO,MAAM,oBAA8D;AAAA,SAOjD,gBAAgB,IAAI,KAAK,KAAK,KAAK;AAAA,EAEnD;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,cAAc;AAAA,EACd,oBAA0C;AAAA,EAC1C,SAAwB;AAAA,EACxB,WAA0B;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,aAA+B;AAAA,EAC/B,YAA2B;AAAA,EAC3B,kBAAuC;AAAA,EACvC,kBAAyC,CAAC;AAAA,EAC1C,eAAyB,CAAC;AAAA,EAG1B,iBAAuC;AAAA,EAIvC,mBAA0E;AAAA,EAG1E;AAAA,EAER,WAAW,CACT,SAMA;AAAA,IACA,KAAK,UAAU;AAAA,IACf,KAAK,UAAU,QAAQ,WAAW;AAAA,IAClC,KAAK,UAAU,QAAQ,WAAW;AAAA,IAClC,KAAK,YAAY,IAAI,iBAAiB;AAAA,MACpC,cAAc,QAAQ;AAAA,MACtB,SAAS,QAAQ;AAAA,MACjB,YAAY,QAAQ;AAAA,IACtB,CAAC;AAAA,IACD,KAAK,2BAA2B;AAAA,IAChC,IAAI;AAAA,MACF,KAAK,SAAS,KAAK,aAAa,OAAO;AAAA,MACvC,KAAK,sBAAsB;AAAA,MAC3B,OAAO,KAAK;AAAA,MAKZ,KAAK,mBAAmB;AAAA,MACxB,MAAM;AAAA;AAAA;AAAA,EAIH,aAAa,GAAW;AAAA,IAC7B,OAAO,KAAK;AAAA;AAAA,EAOP,YAAY,GAA4B;AAAA,IAC7C,OAAO,KAAK,UAAU,UAAU,KAAK,YAAY;AAAA;AAAA,EAQ5C,WAAW,CAChB,OACA,WACA,KACM;AAAA,IACN,KAAK,UAAU,QAAQ,OAAO,WAAW,GAAG;AAAA;AAAA,EAavC,aAAa,GAKlB;AAAA,IACA,OAAO;AAAA,MACL,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK,KAAK,gBAAgB;AAAA,MAClC,QAAQ,CAAC,GAAG,KAAK,YAAY;AAAA,IAC/B;AAAA;AAAA,EAGK,cAAc,GAAY;AAAA,IAC/B,OAAO,KAAK;AAAA;AAAA,EAGP,aAAa,GAAY;AAAA,IAC9B,OAAO,KAAK;AAAA;AAAA,OAGD,WAAU,GAAkB;AAAA,IACvC,IAAI,KAAK,aAAa;AAAA,MACpB;AAAA,IACF;AAAA,IAEA,IAAI,CAAC,KAAK,mBAAmB;AAAA,MAC3B,KAAK,oBAAoB,KAAK,mBAAmB,EAAE,QAAQ,MAAM;AAAA,QAC/D,KAAK,oBAAoB;AAAA,OAC1B;AAAA,IACH;AAAA,IAEA,MAAM,KAAK;AAAA;AAAA,OAGA,MAAK,GAAkB;AAAA,IAClC,KAAK,eAAe;AAAA,IAEpB,IAAI,KAAK,UAAU,SAAS;AAAA,MAC1B,IAAI;AAAA,QACF,MAAM,KAAK,UAAU,MAAM;AAAA,QAC3B,MAAM;AAAA,IACV;AAAA,IAEA,IAAI,KAAK,gBAAgB;AAAA,MACvB,IAAI;AAAA,QACF,MAAM,KAAK;AAAA,QACX,MAAM;AAAA,IACV;AAAA,IACA,IAAI,KAAK,iBAAiB;AAAA,MACxB,IAAI;AAAA,QACF,KAAK,gBAAgB;AAAA,QACrB,MAAM;AAAA,MACR,KAAK,kBAAkB;AAAA,IACzB;AAAA,IAKA,MAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAAA,IAC1C,IAAI,KAAK,QAAQ;AAAA,MACf,IAAI;AAAA,QACF,MAAM,KAAK,OAAO,MAAM;AAAA,QACxB,MAAM;AAAA,IACV;AAAA,IACA,KAAK,mBAAmB;AAAA;AAAA,EAGlB,qBAAqB,GAAG;AAAA,EAExB,YAAY,CAAC,SAAgC;AAAA,IAMnD,IAAK,QAAkC,YAAY,YAAY;AAAA,MAC7D,UAAU,KAAK,SAAS,SAAS,YAAY;AAAA,IAC/C;AAAA,IACA,IAAI,QAAQ,IAAI,oCAAoC,KAAK;AAAA,MACvD,OAAO,IAAI,sBAAO,OAAO;AAAA,IAC3B;AAAA,IAGA,MAAM,UAAU,KAAK,WAAW,QAAQ,IAAI,2BAA2B;AAAA,IACvE,MAAM,aAAa;AAAA,SACb,QAAQ,cAAc,CAAC;AAAA,MAC3B;AAAA,MACA;AAAA,SAII,UAAU,EAAE,UAAU,GAAa,GAAG,uBAAK,IAAI,CAAC;AAAA,IACtD;AAAA,IACA,OAAO,IAAI,sBAAO;AAAA,SACb;AAAA,MACH;AAAA,IACF,CAAC;AAAA;AAAA,EAGK,UAAU,GAAkB;AAAA,IAClC,MAAM,qBAAqB,KAAK;AAAA,IAKhC,MAAM,UAAU,mBAAmB,WAAW,mBAAmB;AAAA,IACjE,OAAO,OAAO,YAAY,WAAW,UAAU;AAAA;AAAA,EAGzC,mBAAmB,CAAC,SAA2C;AAAA,IACrE,IAAI,CAAC,SAAS;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,QAAQ,SAAS,KAAK,GAAG;AAAA,MAC3B,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,YAAY,YAAY;AAAA,MAC1B,OAAO;AAAA,IACT;AAAA,IAEA,OAAO;AAAA;AAAA,EAGD,kBAAkB,CAAC,SAAyB;AAAA,IAClD,OAAO,GAAG;AAAA;AAAA,EAGJ,WAAW,CAAC,UAAoE;AAAA,IACtF,IAAI;AAAA,MACF,MAAM,MAAM,4BAAa,UAAU,OAAO;AAAA,MAC1C,MAAM,SAAS,KAAK,MAAM,GAAG;AAAA,MAC7B,MAAM,MAAM,OAAO,OAAO,QAAQ,YAAY,OAAO,MAAM,IAAI,OAAO,MAAM;AAAA,MAC5E,MAAM,cAAc,OAAO,OAAO,cAAc,WAAW,KAAK,MAAM,OAAO,SAAS,IAAI;AAAA,MAC1F,MAAM,YAAY,OAAO,MAAM,WAAW,IAAI,OAAO;AAAA,MACrD,OAAO,EAAE,KAAK,UAAU;AAAA,MACxB,MAAM;AAAA,MACN,OAAO,EAAE,KAAK,MAAM,WAAW,KAAK;AAAA;AAAA;AAAA,EAwBhC,YAAY,CAAC,KAAa,WAAmC;AAAA,IACnE,IAAI;AAAA,MACF,QAAQ,KAAK,KAAK,CAAC;AAAA,MAEnB,OAAO;AAAA,MACP,OAAO,KAAK;AAAA,MACZ,MAAM,OAAQ,IAA8B;AAAA,MAC5C,IAAI,SAAS,SAAS;AAAA,QAEpB,OAAO;AAAA,MACT;AAAA,MAGA,IAAI,cAAc,MAAM;AAAA,QACtB,OAAO;AAAA,MACT;AAAA,MACA,OAAO,KAAK,IAAI,IAAI,YAAY,oBAAoB;AAAA;AAAA;AAAA,EAIhD,0BAA0B,GAAS;AAAA,IACzC,MAAM,UAAU,KAAK,WAAW;AAAA,IAChC,IAAI,CAAC,KAAK,oBAAoB,OAAO,GAAG;AAAA,MACtC;AAAA,IACF;AAAA,IAEA,yBAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,IACtC,MAAM,WAAW,KAAK,mBAAmB,OAAO;AAAA,IAChD,SAAS,UAAU,EAAG,UAAU,GAAG,WAAW;AAAA,MAC5C,IAAI;AAAA,QACF,MAAM,KAAK,wBAAS,UAAU,IAAI;AAAA,QAClC,6BACE,IACA,GAAG,KAAK,UAAU;AAAA,UAChB,KAAK,QAAQ;AAAA,UACb,WAAW,IAAI,KAAK,EAAE,YAAY;AAAA,UAClC;AAAA,QACF,CAAC;AAAA,CACH;AAAA,QACA,KAAK,SAAS;AAAA,QACd,KAAK,WAAW;AAAA,QAChB;AAAA,QACA,OAAO,KAAK;AAAA,QACZ,MAAM,OAAQ,IAA8B;AAAA,QAC5C,IAAI,SAAS,UAAU;AAAA,UACrB,MAAM,KAAK,sBAAsB,SAAS,GAAG;AAAA,QAC/C;AAAA,QAEA,QAAQ,KAAK,cAAc,KAAK,YAAY,QAAQ;AAAA,QACpD,IAAI,OAAO,KAAK,aAAa,KAAK,SAAS,GAAG;AAAA,UAC5C,MAAM,KAAK,sBACT,SACA,IAAI,MAAM,+CAA+C,KAAK,CAChE;AAAA,QACF;AAAA,QAEA,IAAI;AAAA,UACF,0BAAW,QAAQ;AAAA,UACnB,qBAAO,MACL,EAAE,KAAK,cAAc,SAAS,UAAU,IAAI,GAC5C,gCACF;AAAA,UACA,OAAO,WAAW;AAAA,UAClB,MAAM,KAAK,sBAAsB,SAAS,SAAS;AAAA;AAAA;AAAA,IAGzD;AAAA,IAEA,MAAM,KAAK,sBAAsB,SAAS,IAAI,MAAM,oCAAoC,CAAC;AAAA;AAAA,EAGnF,kBAAkB,GAAS;AAAA,IACjC,IAAI,KAAK,WAAW,MAAM;AAAA,MACxB,IAAI;AAAA,QACF,yBAAU,KAAK,MAAM;AAAA,QACrB,MAAM;AAAA,MACR,KAAK,SAAS;AAAA,IAChB;AAAA,IAEA,IAAI,KAAK,UAAU;AAAA,MACjB,IAAI;AAAA,QACF,0BAAW,KAAK,QAAQ;AAAA,QACxB,MAAM;AAAA,MACR,KAAK,WAAW;AAAA,IAClB;AAAA;AAAA,EAGM,YAAY,CAAC,OAAwB;AAAA,IAC3C,IAAI,iBAAiB,OAAO;AAAA,MAC1B,OAAO,MAAM;AAAA,IACf;AAAA,IACA,IAAI,OAAO,UAAU,UAAU;AAAA,MAC7B,OAAO;AAAA,IACT;AAAA,IACA,IAAI,SAAS,OAAO,UAAU,UAAU;AAAA,MACtC,MAAM,MAAM;AAAA,MACZ,IAAI,OAAO,IAAI,YAAY,YAAY,IAAI,QAAQ,SAAS,GAAG;AAAA,QAC7D,OAAO,IAAI;AAAA,MACb;AAAA,MACA,IAAI;AAAA,QACF,MAAM,OAAO,KAAK,UAAU,KAAK;AAAA,QACjC,IAAI,QAAQ,SAAS,MAAM;AAAA,UACzB,OAAO;AAAA,QACT;AAAA,QACA,MAAM;AAAA,MACR,IAAI,OAAO,IAAI,aAAa,YAAY;AAAA,QACtC,MAAM,cAAc,IAAI,SAAS,KAAK,KAAK;AAAA,QAC3C,IAAI,eAAe,gBAAgB,mBAAmB;AAAA,UACpD,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,IACA,OAAO,OAAO,KAAK;AAAA;AAAA,EAGb,sBAAsB,CAAC,SAAsC;AAAA,IACnE,MAAM,UAAU,GAAG;AAAA,IACnB,IAAI,CAAC,0BAAW,OAAO,GAAG;AAAA,MACxB,OAAO;AAAA,IACT;AAAA,IAcA,IACE,QAAQ,IAAI,4BAA4B,OACxC,QAAQ,IAAI,gCAAgC,KAC5C;AAAA,MACA,IAAI;AAAA,QACF,0BAAW,OAAO;AAAA,QAClB,qBAAO,KACL,EAAE,KAAK,cAAc,SAAS,QAAQ,GACtC,8DACF;AAAA,QACA,OAAO;AAAA,QACP,OAAO,KAAK;AAAA,QACZ,qBAAO,KACL,EAAE,KAAK,cAAc,SAAS,OAAO,KAAK,aAAa,GAAG,EAAE,GAC5D,uDACF;AAAA,QACA,OAAO;AAAA;AAAA,IAEX;AAAA,IAEA,IAAI;AAAA,MACF,MAAM,UAAU,4BAAa,SAAS,OAAO;AAAA,MAC7C,MAAM,YAAY,QAAQ,MAAM;AAAA,CAAI,EAAE,IAAI,KAAK;AAAA,MAC/C,MAAM,MAAM,SAAS,WAAW,EAAE;AAAA,MAElC,IAAI,OAAO,MAAM,GAAG,KAAK,OAAO,GAAG;AAAA,QACjC,0BAAW,OAAO;AAAA,QAClB,qBAAO,MACL,EAAE,KAAK,cAAc,SAAS,QAAQ,GACtC,yCACF;AAAA,QACA,OAAO;AAAA,MACT;AAAA,MAEA,IAAI;AAAA,QACF,QAAQ,KAAK,KAAK,CAAC;AAAA,QACnB,qBAAO,KACL,EAAE,KAAK,cAAc,SAAS,IAAI,GAClC,sDACF;AAAA,QACA,OAAO;AAAA,QACP,OAAO,SAAkB;AAAA,QACzB,MAAM,OAAQ,QAAkC;AAAA,QAChD,IAAI,SAAS,SAAS;AAAA,UACpB,0BAAW,OAAO;AAAA,UAClB,qBAAO,KAAK,EAAE,KAAK,cAAc,SAAS,IAAI,GAAG,qCAAqC;AAAA,UACtF,OAAO;AAAA,QACT;AAAA,QACA,qBAAO,KACL,EAAE,KAAK,cAAc,SAAS,KAAK,KAAK,GACxC,gDACF;AAAA,QACA,OAAO;AAAA;AAAA,MAET,OAAO,KAAK;AAAA,MACZ,qBAAO,KACL;AAAA,QACE,KAAK;AAAA,QACL;AAAA,QACA,OAAO,KAAK,aAAa,GAAG;AAAA,MAC9B,GACA,yCACF;AAAA,MACA,OAAO;AAAA;AAAA;AAAA,EAIH,qBAAqB,CAAC,SAAiB,OAAuB;AAAA,IACpE,OAAO,sBACL,mBAAmB,aACnB,wCAAwC,8GACxC,EAAE,OAAO,QAAQ,CACnB;AAAA;AAAA,EAGM,8BAA8B,CAAC,SAAiB,OAAuB;AAAA,IAC7E,MAAM,YAAY,KAAK,aAAa,KAAK;AAAA,IACzC,MAAM,eAAe,sBACnB,mBAAmB,cACnB,sBAAsB,0CAA0C,aAChE,EAAE,OAAO,QAAQ,CACnB;AAAA,IACA,OAAO,sBACL,mBAAmB,uBACnB,oCAAoC,YAAY,qFAAqF,WACrI,EAAE,OAAO,cAAc,QAAQ,CACjC;AAAA;AAAA,OAGY,sBAAqB,GAAkB;AAAA,IACnD,MAAM,KAAK,OAAO,MAAM,wCAAwC;AAAA,IAChE,KAAK,cAAc;AAAA;AAAA,OAaR,WAAU,GAAkB;AAAA,IAEvC,IAAI,KAAK;AAAA,MAAiB;AAAA,IAC1B,IAAI,CAAC,KAAK;AAAA,MAAa;AAAA,IAKvB,MAAM,KAAK,UAAU;AAAA;AAAA,EAgBhB,SAAS,GAAyB;AAAA,IAGvC,MAAM,iBAAiB,KAAK;AAAA,IAG5B,OAAO,eAAe,QAAQ;AAAA;AAAA,OAgBnB,YAAW,GAKd;AAAA,IAGR,IAAI,KAAK;AAAA,MAAkB,OAAO,KAAK;AAAA,IACvC,KAAK,mBAAmB,KAAK,oBAAoB;AAAA,IACjD,IAAI;AAAA,MACF,OAAO,MAAM,KAAK;AAAA,cAClB;AAAA,MACA,KAAK,mBAAmB;AAAA;AAAA;AAAA,OAId,oBAAmB,GAKvB;AAAA,IACR,MAAM,UAAU,KAAK,WAAW,QAAQ,IAAI,2BAA2B;AAAA,IACvE,IAAI,CAAC;AAAA,MAAS,OAAO;AAAA,IACrB,IAAI,CAAC,KAAK;AAAA,MAAa,OAAO;AAAA,IAG9B,IAAI,KAAK,iBAAiB;AAAA,MACxB,IAAI;AAAA,QACF,KAAK,gBAAgB;AAAA,QACrB,MAAM;AAAA,MACR,KAAK,kBAAkB;AAAA,MAOvB,MAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAAA,IAC5C;AAAA,IAMA,IAAI;AAAA,MACF,MAAM,KAAK,OAAO,MAAM,wCAAwC;AAAA,MAChE,qBAAO,KAAK,EAAE,KAAK,cAAc,QAAQ,GAAG,4CAA2C;AAAA,MACvF,OAAO,KAAK;AAAA,MACZ,qBAAO,KACL,EAAE,KAAK,cAAc,OAAO,KAAK,aAAa,GAAG,EAAE,GACnD,kEACF;AAAA;AAAA,IAOF,MAAM,KAAK,UAAU;AAAA,IAErB,OAAO,KAAK,cAAc;AAAA;AAAA,OAmBd,UAAS,GAAkB;AAAA,IACvC,MAAM,UAAU,KAAK,WAAW,QAAQ,IAAI,2BAA2B;AAAA,IACvE,IAAI,CAAC,SAAS;AAAA,MACZ,KAAK,aAAa;AAAA,MAClB;AAAA,IACF;AAAA,IAGA,IAAI,KAAK;AAAA,MAAc;AAAA,IAMvB,IAAI,KAAK;AAAA,MAAgB,OAAO,KAAK;AAAA,IACrC,KAAK,iBAAiB,KAAK,kBAAkB,OAAO;AAAA,IACpD,IAAI;AAAA,MACF,OAAO,MAAM,KAAK;AAAA,cAClB;AAAA,MACA,KAAK,iBAAiB;AAAA;AAAA;AAAA,OAMZ,kBAAiB,CAAC,SAAgC;AAAA,IAE9D,IAAI,KAAK,iBAAiB;AAAA,MACxB;AAAA,IACF;AAAA,IAGA,KAAK,aAAa;AAAA,IAClB,KAAK,YAAY;AAAA,IAEjB,IAAI;AAAA,MAIF,MAAM,qBAAqB,KAAK;AAAA,MAkBhC,IAAI,CAAC,mBAAmB,UAAU,oBAAoB;AAAA,QACpD,MAAM,MACJ;AAAA,QACF,qBAAO,KAAK,EAAE,KAAK,cAAc,QAAQ,GAAG,GAAG;AAAA,QAC/C,KAAK,aAAa;AAAA,QAClB,KAAK,YAAY;AAAA,QACjB;AAAA,MACF;AAAA,MAOA,MAAM,UAAU,KAAK,WAAW,QAAQ,IAAI,YAAY;AAAA,MACxD,IAAI,CAAC,SAAS;AAAA,QACZ,MAAM,MACJ;AAAA,QACF,qBAAO,MAAM,EAAE,KAAK,cAAc,QAAQ,GAAG,GAAG;AAAA,QAChD,KAAK,aAAa;AAAA,QAClB,KAAK,YAAY;AAAA,QACjB;AAAA,MACF;AAAA,MAKA,IAAI,CAAC,kEAAkE,KAAK,OAAO,GAAG;AAAA,QACpF,MAAM,MAAM,gCAAgC;AAAA,QAC5C,qBAAO,MAAM,EAAE,KAAK,cAAc,QAAQ,GAAG,GAAG;AAAA,QAChD,KAAK,aAAa;AAAA,QAClB,KAAK,YAAY;AAAA,QACjB;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,eAAe;AAAA,MAC7B,MAAM,aAAa,SAAS;AAAA,MAM5B,MAAM,SAAS,mBAAmB,IAAI,CAAC,UAAU;AAAA,QAC/C,KAAK;AAAA,QACL,OAAO;AAAA,QACP,IAAI,CAAC,IAAI;AAAA,QACT,OAAO,SAAS,WAAW,aAAa;AAAA,QACxC,QAAQ,CAAC;AAAA,MACX,EAAE;AAAA,MAGF,KAAK,kBAAkB,CAAC;AAAA,MACxB,aAAa,SAAS,QAAQ;AAAA,QAC5B,KAAK,gBAAgB,OAAO,EAAE,OAAO,UAAU;AAAA,MACjD;AAAA,MACA,KAAK,eAAe,CAAC;AAAA,MAIrB,MAAM,SAOF,CAAC;AAAA,MACL,aAAa,KAAK,OAAO,IAAI,OAAO,YAAY,QAAQ,iBAAiB,QAAQ;AAAA,QAC/E,OAAO,OAAO;AAAA,UACZ,OAAO;AAAA,YACL,KAAK;AAAA,YACL,QAAQ,EAAE,OAAO,OAAO,eAAe,YAAY;AAAA,UACrD;AAAA,UACA;AAAA,UACA,YAAY;AAAA,QACd;AAAA,MACF;AAAA,MAIA,MAAM,UAAU;AAAA,MAIhB,IAAI,sBAAsB;AAAA,MAE1B,MAAM,OAAO,mBAAmB,SAAS,mBAAmB;AAAA,QAC1D;AAAA,QACA,KAAK;AAAA,QACL,eAAe,MAAM;AAAA,UAGnB,IAAI,KAAK;AAAA,YAAc;AAAA,UACvB,sBAAsB;AAAA,UAEtB,aAAa,SAAS,QAAQ;AAAA,YAC5B,KAAK,gBAAgB,OAAO,EAAE,OAAO,SAAS;AAAA,UAChD;AAAA,UACA,KAAK,eAAe,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG;AAAA,UAC3C,KAAK,aAAa;AAAA,UAClB,KAAK,YAAY;AAAA,UACjB,qBAAO,KACL,EAAE,KAAK,cAAc,cAAc,KAAK,aAAa,GACrD,+CAA+C,OAAO,eACxD;AAAA;AAAA,QAEF,SAAS,CAAC,QAAe;AAAA,UAGvB,IAAI,KAAK;AAAA,YAAc;AAAA,UAIvB,KAAK,YAAY,IAAI;AAAA,UACrB,IAAI,CAAC,qBAAqB;AAAA,YAGxB,KAAK,aAAa;AAAA,UACpB;AAAA,UAGA,qBAAO,MACL,EAAE,KAAK,cAAc,OAAO,IAAI,QAAQ,GACxC,8DACF;AAAA;AAAA,MAEJ,CAAC;AAAA,MAED,KAAK,kBAAkB,MAAM,KAAK,YAAY;AAAA,MAK9C,IAAI,KAAK,cAAc,CAAC,uBAAuB,CAAC,KAAK,cAAc;AAAA,QACjE,aAAa,SAAS,QAAQ;AAAA,UAC5B,KAAK,gBAAgB,OAAO,EAAE,OAAO,SAAS;AAAA,QAChD;AAAA,QACA,KAAK,eAAe,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG;AAAA,QAC3C,KAAK,aAAa;AAAA,MACpB;AAAA,MAEA,qBAAO,KACL;AAAA,QACE,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,KAAK;AAAA,QACb,QAAQ,OAAO;AAAA,QACf,cAAc,KAAK;AAAA,MACrB,GACA,kDACF;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,KAAK,aAAa;AAAA,MAClB,KAAK,YAAY,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MAChE,qBAAO,MACL,EAAE,KAAK,cAAc,OAAO,KAAK,UAAU,GAC3C,wEACF;AAAA;AAAA;AAAA,OAIU,mBAAkB,GAAkB;AAAA,IAChD,IAAI;AAAA,MACF,MAAM,KAAK,sBAAsB;AAAA,MAGjC;AAAA,MACA,OAAO,cAAc;AAAA,MACrB,MAAM,UAAU,KAAK,WAAW;AAAA,MAChC,IAAI,CAAC,KAAK,oBAAoB,OAAO,GAAG;AAAA,QACtC,MAAM;AAAA,MACR;AAAA,MAEA,MAAM,YAAY,KAAK,uBAAuB,OAAO;AAAA,MACrD,IACE,cAAc,YACd,cAAc,wBACd,cAAc,gBACd;AAAA,QACA,MAAM,KAAK,sBAAsB,SAAS,YAAY;AAAA,MACxD;AAAA,MAEA,IAAI,cAAc,mBAAmB,cAAc,qBAAqB;AAAA,QACtE,qBAAO,KACL;AAAA,UACE,KAAK;AAAA,UACL;AAAA,UACA,OAAO,KAAK,aAAa,YAAY;AAAA,QACvC,GACA,8DACF;AAAA,QACA,IAAI;AAAA,UACF,MAAM,KAAK,OAAO,MAAM;AAAA,UACxB,MAAM;AAAA,QACR,KAAK,SAAS,KAAK,aAAa,KAAK,OAAO;AAAA,QAE5C,IAAI;AAAA,UACF,MAAM,KAAK,sBAAsB;AAAA,UAEjC;AAAA,UACA,OAAO,YAAY;AAAA,UACnB,qBAAO,MACL;AAAA,YACE,KAAK;AAAA,YACL;AAAA,YACA,OAAO,KAAK,aAAa,UAAU;AAAA,UACrC,GACA,kEACF;AAAA,UACA,MAAM,KAAK,+BAA+B,SAAS,UAAU;AAAA;AAAA,MAEjE;AAAA,MAEA,qBAAO,MACL;AAAA,QACE,KAAK;AAAA,QACL;AAAA,QACA,OAAO,KAAK,aAAa,YAAY;AAAA,MACvC,GACA,qDACF;AAAA,MACA,MAAM,KAAK,+BAA+B,SAAS,YAAY;AAAA;AAAA;AAGrE;;;AMr+BO,IAZP;;;ACEA,IAAM,eAAe;AAErB,SAAS,WAAW,CAAC,OAAe,MAAsB;AAAA,EACxD,IAAI,OAAO,SAAS;AAAA,EACpB,SAAS,UAAQ,EAAG,UAAQ,MAAM,QAAQ,WAAS,GAAG;AAAA,IACpD,QAAQ,MAAM,WAAW,OAAK;AAAA,IAC9B,OAAO,KAAK,KAAK,MAAM,QAAQ;AAAA,EACjC;AAAA,EACA,OAAO,SAAS;AAAA;AAGX,SAAS,YAAY,CAAC,QAA+B;AAAA,EAC1D,MAAM,QAAQ,OAAO,WAAW,WAAW,OAAO,SAAS,IAAI;AAAA,EAE/D,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,MAAM,IAAI,UAAU,sBAAsB;AAAA,EAC5C;AAAA,EAEA,IAAI,aAAa,KAAK,KAAK,GAAG;AAAA,IAC5B,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,mBAAmB,KAAK;AAAA,EACtC,MAAM,MAAM;AAAA,IACV,YAAY,OAAO,UAAU;AAAA,IAC7B,YAAY,OAAO,UAAU;AAAA,IAC7B,YAAY,OAAO,UAAU;AAAA,IAC7B,YAAY,OAAO,UAAU;AAAA,EAC/B,EACG,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAChD,KAAK,EAAE,EACP,MAAM,GAAG,EAAE,EACX,MAAM,EAAE;AAAA,EAEX,IAAI,MAAM;AAAA,EACV,IAAI,OAAQ,OAAO,SAAS,IAAI,OAAO,KAAK,EAAE,IAAI,IAAO,GAAK,SAAS,EAAE;AAAA,EAEzE,OAAO,GAAG,IAAI,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,IAAI,MAAM,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,IAChE,MAAM,IAAI,EAAE,EACZ,KAAK,EAAE,KAAK,IAAI,MAAM,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,IAAI,MAAM,IAAI,EAAE,EAAE,KAAK,EAAE;AAAA;;;ADzBxE,IAAM,4BAA4B;AAoBlC,SAAS,yBAAyB,CAAC,SAAsD;AAAA,EACvF,OACE,OAAO,YAAY,YACnB,YAAY,QACZ,OAAQ,QAA4C,sBAAsB;AAAA;AAuB9E,IAAM,yBAAyB;AAC/B,IAAM,wBAAwB;AAC9B,IAAM,yBAAyB;AAE/B,SAAS,QAAQ,CAAC,OAAwC;AAAA,EACxD,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAAA;AAG5E,SAAS,QAAQ,CAAC,OAAsC;AAAA,EACtD,OAAO,SAAS,KAAK,IAAI,QAAQ;AAAA;AAGnC,SAAS,WAAW,CAAC,OAAuC;AAAA,EAC1D,IAAI,UAAU;AAAA,IAAM,OAAO;AAAA,EAC3B,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,UAAU,WAAW;AAAA,IAC9B,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,MAAM,QAAQ,KAAK,GAAG;AAAA,IACxB,OAAO,MACJ,IAAI,CAAC,UAAU,YAAY,KAAK,CAAC,EACjC,OAAO,CAAC,UAA8B,UAAU,SAAS;AAAA,EAC9D;AAAA,EAEA,IAAI,SAAS,KAAK,GAAG;AAAA,IACnB,MAAM,UAAU,OAAO,QAAQ,KAAK,EACjC,IAAI,EAAE,KAAK,WAAW;AAAA,MACrB,MAAM,YAAY,YAAY,KAAK;AAAA,MACnC,OAAO,cAAc,YAAY,OAAQ,CAAC,KAAK,SAAS;AAAA,KACzD,EACA,OAAO,CAAC,UAAiD,UAAU,IAAI;AAAA,IAC1E,OAAO,OAAO,YAAY,OAAO;AAAA,EACnC;AAAA,EAEA;AAAA;AAGF,SAAS,YAAY,CAAC,OAAwC;AAAA,EAC5D,MAAM,YAAY,YAAY,KAAK;AAAA,EACnC,OAAO,SAAS,SAAS,IAAK,YAA2B;AAAA;AAG3D,SAAS,yBAAyB,CAAC,QAMhB;AAAA,EACjB,MAAM,WAA2B;AAAA,OAC3B,OAAO,YAAY,CAAC;AAAA,IACxB,MAAM;AAAA,IACN,OAAO,OAAO;AAAA,IACd,WAAW,OAAO;AAAA,IAClB,gBAAgB,OAAO;AAAA,EACzB;AAAA,EAEA,IAAI,OAAO,QAAQ;AAAA,IACjB,SAAS,SAAS,OAAO;AAAA,EAC3B;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,QAAQ,CAAC,OAAoC;AAAA,EACpD,OAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,IAAI,MAAM,KAAK,IAAI;AAAA;AAG/E,SAAS,QAAQ,CAAC,OAAoC;AAAA,EACpD,OAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,QAAQ;AAAA;AAGvE,SAAS,cAAa,CAAC,OAAsC;AAAA,EAC3D,IAAI,CAAC,MAAM,QAAQ,KAAK;AAAA,IAAG;AAAA,EAC3B,MAAM,SAAS,MAAM,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ;AAAA,EACjF,OAAO,OAAO,SAAS,IAAI,SAAS;AAAA;AAGtC,SAAS,MAAM,CAAC,OAAgB,UAAuB;AAAA,EACrD,IAAI,iBAAiB,QAAQ,OAAO,SAAS,MAAM,QAAQ,CAAC,GAAG;AAAA,IAC7D,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AAAA,IACvD,MAAM,SAAS,IAAI,KAAK,KAAK;AAAA,IAC7B,IAAI,OAAO,SAAS,OAAO,QAAQ,CAAC;AAAA,MAAG,OAAO;AAAA,EAChD;AAAA,EACA,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,GAAG;AAAA,IACxD,MAAM,SAAS,IAAI,KAAK,KAAK;AAAA,IAC7B,IAAI,OAAO,SAAS,OAAO,QAAQ,CAAC;AAAA,MAAG,OAAO;AAAA,EAChD;AAAA,EACA,OAAO,YAAY,IAAI;AAAA;AAGzB,SAAS,aAAa,CAAC,QAAwB;AAAA,EAC7C,OAAO,OAAO,OAAO,QAAQ,SAAS,WAAW,OAAO,QAAQ,OAAO;AAAA;AAGzE,SAAS,yBAAyB,CAAC,QAA+C;AAAA,EAChF,MAAM,WAAW,SAAS,OAAO,QAAQ;AAAA,EACzC,MAAM,iBAAiB,SAAS,UAAU,cAAc;AAAA,EACxD,IAAI,CAAC,gBAAgB;AAAA,IACnB,OAAO;AAAA,EACT;AAAA,EACA,MAAM,OAAO,SAAS,eAAe,IAAI;AAAA,EACzC,IAAI,SAAS,sBAAsB,SAAS,mBAAmB;AAAA,IAC7D,OAAO;AAAA,EACT;AAAA,EAEA,OAAO;AAAA,IACL;AAAA,IACA,kBAAkB,SAAS,eAAe,gBAAgB;AAAA,IAC1D,gBAAgB,SAAS,eAAe,cAAc;AAAA,IACtD,UAAU,SAAS,eAAe,QAAQ;AAAA,IAC1C,YAAY,SAAS,eAAe,UAAU;AAAA,IAC9C,QAAQ,SAAS,eAAe,MAAM;AAAA,IACtC,kBAAkB,aAAa,eAAe,gBAAgB;AAAA,IAC9D,cAAc,SAAS,eAAe,YAAY;AAAA,IAClD,mBAAmB,SAAS,eAAe,iBAAiB;AAAA,IAC5D,WAAW,SAAS,eAAe,SAAS;AAAA,IAC5C,SAAS,SAAS,eAAe,OAAO;AAAA,IACxC,QAAQ,eAAc,eAAe,MAAM;AAAA,IAC3C,iBAAiB,aAAa,eAAe,eAAe;AAAA,IAC5D,WAAW,SAAS,eAAe,SAAS;AAAA,IAC5C,gBAAgB,SAAS,eAAe,cAAc;AAAA,IACtD,aAAa,SAAS,eAAe,WAAW;AAAA,EAClD;AAAA;AAAA;AAGK,MAAM,qCAAqC,sBAAyC;AAAA,SAClF,cAAc;AAAA,EAErB,wBAAwB;AAAA,cAEX,MAAK,CAAC,SAA0C;AAAA,IAC3D,MAAM,UAAU,IAAI;AAAA,IACpB,MAAM,QAAQ,WAAW,OAAO;AAAA,IAChC,OAAO;AAAA;AAAA,OAGH,WAAU,CAAC,SAAuC;AAAA,IACtD,KAAK,UAAU;AAAA;AAAA,OAGX,KAAI,GAAkB;AAAA,EAEpB,gBAAgB,GAAS;AAAA,IAC/B,OAAO,aAAa,yBAAyB,KAAK,QAAQ,SAAS;AAAA;AAAA,EAG7D,iBAAiB,CAAC,UAAsB;AAAA,IAC9C,OAAO,aAAa,6BAA6B,KAAK,QAAQ,WAAW,UAAU;AAAA;AAAA,OAGvE,kBAAiB,GAAkB;AAAA,IAC/C,MAAM,UAAU,KAAK,iBAAiB;AAAA,IACtC,MAAM,QAAe;AAAA,MACnB,IAAI;AAAA,MACJ,SAAS,KAAK,QAAQ;AAAA,MACtB,MAAM;AAAA,MACN,UAAU;AAAA,QACR,SAAS;AAAA,MACX;AAAA,MACA,WAAW,IAAI;AAAA,IACjB;AAAA,IACA,MAAM,KAAK,QAAQ,kBAAkB,KAAK;AAAA,IAC1C,OAAO;AAAA;AAAA,OAGK,mBAAkB,CAAC,UAAgB,SAA8B;AAAA,IAC7E,MAAM,SAAS,KAAK,kBAAkB,QAAQ;AAAA,IAC9C,MAAM,OAAa;AAAA,MACjB,IAAI;AAAA,MACJ,SAAS,KAAK,QAAQ;AAAA,MACtB;AAAA,MACA,QAAQ;AAAA,MACR,MAAM,0BAAY;AAAA,MAClB,MAAM,mBAAmB,SAAS,MAAM,GAAG,CAAC;AAAA,MAC5C,UAAU;AAAA,QACR,SAAS;AAAA,QACT;AAAA,MACF;AAAA,MACA,WAAW,IAAI;AAAA,IACjB;AAAA,IACA,MAAM,KAAK,QAAQ,iBAAiB,IAAI;AAAA,IACxC,OAAO;AAAA;AAAA,OAGK,2BAA0B,GAA4C;AAAA,IAClF,MAAM,WAAW,KAAK,QAAQ,WAAW,yBAAyB;AAAA,IAClE,IAAI,0BAA0B,QAAQ,GAAG;AAAA,MACvC,OAAO;AAAA,IACT;AAAA,IACA,IAAI,CAAC,KAAK,QAAQ,WAAW,yBAAyB,GAAG;AAAA,MACvD,OAAO;AAAA,IACT;AAAA,IACA,IAAI;AAAA,MACF,MAAM,SAAS,MAAM,KAAK,QAAQ,sBAAsB,yBAAyB;AAAA,MACjF,OAAO,0BAA0B,MAAM,IAAI,SAAS;AAAA,MACpD,MAAM;AAAA,MACN,OAAO;AAAA;AAAA;AAAA,OAIG,iBAAgB,CAAC,UAAoC;AAAA,IACjE,MAAM,aAAa,MAAM,KAAK,2BAA2B;AAAA,IACzD,IAAI,CAAC,YAAY;AAAA,MACf,OAAO,IAAI,IAAU,CAAC,QAAQ,CAAC;AAAA,IACjC;AAAA,IAEA,MAAM,QAAQ,IAAI,IAAU,CAAC,QAAQ,CAAC;AAAA,IACtC,MAAM,QAAgB,CAAC,QAAQ;AAAA,IAE/B,OAAO,MAAM,SAAS,GAAG;AAAA,MACvB,MAAM,UAAU,MAAM,MAAM;AAAA,MAC5B,MAAM,QAAQ,MAAM,WAAW,kBAAkB,OAAO;AAAA,MACxD,WAAW,QAAQ,OAAO;AAAA,QACxB,MAAM,QAAQ,KAAK,YAAY,UAAU,KAAK,UAAU,KAAK;AAAA,QAC7D,IAAI,CAAC,MAAM,IAAI,KAAK,GAAG;AAAA,UACrB,MAAM,IAAI,KAAK;AAAA,UACf,MAAM,KAAK,KAAK;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,OAGK,kBAAiB,CAAC,UAA+B;AAAA,IAC7D,MAAM,QAAQ,MAAM,KAAK,iBAAiB,QAAQ;AAAA,IAClD,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,EAAE;AAAA;AAAA,EAG1B,mBAAmB,CAAC,QAA6C;AAAA,IACvE,MAAM,WAAW,0BAA0B,MAAM;AAAA,IACjD,IAAI,UAAU,SAAS,sBAAsB,CAAC,OAAO,MAAM,CAAC,OAAO,SAAS;AAAA,MAC1E,OAAO;AAAA,IACT;AAAA,IAEA,OAAO;AAAA,MACL,IAAI,OAAO;AAAA,MACX,SAAS,OAAO;AAAA,MAChB,UAAU,SAAS,oBAAoB,SAAS,kBAAmB,OAAO;AAAA,MAC1E,UAAW,SAAS,YAAY;AAAA,MAChC,SAAS,cAAc,MAAM;AAAA,MAC7B,UAAU,SAAS;AAAA,MACnB,WAAW,MAAM,QAAQ,OAAO,SAAS,IAAI,OAAO,YAAY;AAAA,MAChE,YAAY,SAAS;AAAA,MACrB,QAAQ,SAAS;AAAA,MACjB,WAAW,OAAO,OAAO,SAAS;AAAA,MAClC,WAAW,OAAO,SAAS,WAAW,OAAO,OAAO,SAAS,CAAC;AAAA,MAC9D,gBAAgB,SAAS,iBAAiB,OAAO,SAAS,cAAc,IAAI;AAAA,MAC5E,aAAa,SAAS,eAAe;AAAA,IACvC;AAAA;AAAA,EAGM,mBAAmB,CAAC,QAA6C;AAAA,IACvE,MAAM,WAAW,0BAA0B,MAAM;AAAA,IACjD,IAAI,UAAU,SAAS,qBAAqB,CAAC,OAAO,MAAM,CAAC,OAAO,WAAW,CAAC,OAAO,QAAQ;AAAA,MAC3F,OAAO;AAAA,IACT;AAAA,IAEA,OAAO;AAAA,MACL,IAAI,OAAO;AAAA,MACX,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO;AAAA,MACf,UAAU,SAAS,oBAAqB,OAAO;AAAA,MAC/C,SAAS,cAAc,MAAM;AAAA,MAC7B,cAAc,SAAS,gBAAgB;AAAA,MACvC,mBAAmB,SAAS,qBAAqB;AAAA,MACjD,WAAW,OAAO,SAAS,WAAW,OAAO,OAAO,SAAS,CAAC;AAAA,MAC9D,SAAS,OAAO,SAAS,SAAS,OAAO,OAAO,SAAS,CAAC;AAAA,MAC1D,QAAQ,SAAS;AAAA,MACjB,UAAU,SAAS;AAAA,MACnB,WAAW,MAAM,QAAQ,OAAO,SAAS,IAAI,OAAO,YAAY;AAAA,MAChE,WAAW,OAAO,OAAO,SAAS;AAAA,MAClC,WAAW,OAAO,SAAS,WAAW,OAAO,OAAO,SAAS,CAAC;AAAA,IAChE;AAAA;AAAA,EAGM,oBAAoB,CAAC,UAA0D;AAAA,IACrF,OAAO,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,MAAM,UAAU;AAAA,MACzC,MAAM,cAAc,KAAK,UAAU,QAAQ;AAAA,MAC3C,MAAM,eAAe,MAAM,UAAU,QAAQ;AAAA,MAC7C,IAAI,iBAAiB,aAAa;AAAA,QAChC,OAAO,eAAe;AAAA,MACxB;AAAA,MACA,MAAM,iBAAiB,KAAK,cAAc;AAAA,MAC1C,MAAM,kBAAkB,MAAM,cAAc;AAAA,MAC5C,IAAI,oBAAoB,gBAAgB;AAAA,QACtC,OAAO,kBAAkB;AAAA,MAC3B;AAAA,MACA,OAAO,MAAM,UAAU,QAAQ,IAAI,KAAK,UAAU,QAAQ;AAAA,KAC3D;AAAA;AAAA,EAGK,oBAAoB,CAAC,WAA2D;AAAA,IACtF,OAAO,CAAC,GAAG,SAAS,EAAE,KAAK,CAAC,MAAM,UAAU;AAAA,MAC1C,MAAM,cAAc,KAAK,UAAU,QAAQ;AAAA,MAC3C,MAAM,eAAe,MAAM,UAAU,QAAQ;AAAA,MAC7C,IAAI,iBAAiB,aAAa;AAAA,QAChC,OAAO,eAAe;AAAA,MACxB;AAAA,MACA,OAAO,MAAM,UAAU,QAAQ,IAAI,KAAK,UAAU,QAAQ;AAAA,KAC3D;AAAA;AAAA,OAGG,oBAAmB,CAAC,QAA4D;AAAA,IACpF,MAAM,MAAM,IAAI;AAAA,IAChB,MAAM,iBAAiB,MAAM,KAAK,kBAAkB,OAAO,QAAQ;AAAA,IACnE,MAAM,UAAU,MAAM,KAAK,kBAAkB;AAAA,IAC7C,MAAM,SAAS,MAAM,KAAK,mBAAmB,gBAAgB,OAAO;AAAA,IACpE,MAAM,iBAAiB,aAAa;AAAA,MAClC,MAAM;AAAA,MACN,kBAAkB,OAAO;AAAA,MACzB;AAAA,MACA,UAAU,OAAO;AAAA,MACjB,YAAY,OAAO;AAAA,MACnB,QAAQ,OAAO;AAAA,MACf,kBAAkB,OAAO;AAAA,MACzB,WAAW,IAAI,YAAY;AAAA,MAC3B,aAAa;AAAA,IACf,CAAC;AAAA,IACD,IAAI,CAAC,gBAAgB;AAAA,MACnB,MAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AAAA,IACA,MAAM,KAAK,MAAM,KAAK,QAAQ,aAC5B;AAAA,MACE,SAAS,KAAK,QAAQ;AAAA,MACtB,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA,SAAS,EAAE,MAAM,OAAO,QAAQ;AAAA,MAChC,UAAU,0BAA0B;AAAA,QAClC,OAAO;AAAA,QACP,WAAW,IAAI,QAAQ;AAAA,QACvB,QAAQ,OAAO;AAAA,QACf;AAAA,MACF,CAAC;AAAA,MACD,WAAW,OAAO;AAAA,MAClB,WAAW,IAAI,QAAQ;AAAA,MACvB,QAAQ;AAAA,IACV,GACA,wBACA,KACF;AAAA,IAEA,MAAM,SAAS,MAAM,KAAK,QAAQ,cAAc,EAAE;AAAA,IAClD,MAAM,SAAS,SAAS,KAAK,oBAAoB,MAAM,IAAI;AAAA,IAC3D,IAAI,CAAC,QAAQ;AAAA,MACX,MAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,oBAAmB,CACvB,SACA,UACA,MACiC;AAAA,IACjC,MAAM,QAAQ,MAAM,KAAK,iBAAiB,QAAQ;AAAA,IAClD,MAAM,UAAU,MAAM,KAAK,KAAK,EAAE,IAAI,CAAC,mBACrC,KAAK,kBAAkB,cAAc,CACvC;AAAA,IACA,IAAI,QAAQ,WAAW,GAAG;AAAA,MACxB,OAAO,CAAC;AAAA,IACV;AAAA,IAEA,MAAM,WAAW,MAAM,KAAK,QAAQ,qBAAqB;AAAA,MACvD,WAAW;AAAA,MACX;AAAA,MACA,OAAO,KAAK,KAAK,MAAM,SAAS,MAAM,QAAQ,SAAS,GAAG,EAAE;AAAA,IAC9D,CAAC;AAAA,IAED,MAAM,WAAW,SACd,OAAO,CAAC,WAAW,OAAO,YAAY,OAAO,EAC7C,IAAI,CAAC,WAAW,KAAK,oBAAoB,MAAM,CAAC,EAChD,OAAO,CAAC,WAA2C,WAAW,IAAI,EAClE,OAAO,CAAC,WAAY,MAAM,WAAW,OAAO,aAAa,KAAK,WAAW,IAAK;AAAA,IAEjF,OAAO,KAAK,qBAAqB,QAAQ,EAAE,MAAM,GAAG,MAAM,SAAS,EAAE;AAAA;AAAA,OAGjE,qBAAoB,CACxB,IACA,SACA,UACA,SACe;AAAA,IACf,MAAM,WAAW,MAAM,KAAK,QAAQ,cAAc,EAAE;AAAA,IACpD,MAAM,SAAS,WAAW,KAAK,oBAAoB,QAAQ,IAAI;AAAA,IAC/D,IAAI,CAAC,YAAY,CAAC,UAAU,SAAS,YAAY,SAAS;AAAA,MACxD,MAAM,IAAI,MAAM,oBAAoB,cAAc;AAAA,IACpD;AAAA,IAEA,MAAM,eAAe,MAAM,KAAK,iBAAiB,QAAQ;AAAA,IACzD,IAAI,CAAC,aAAa,IAAI,OAAO,QAAQ,GAAG;AAAA,MACtC,MAAM,IAAI,MAAM,oBAAoB,gCAAgC,UAAU;AAAA,IAChF;AAAA,IAEA,MAAM,kBAAkB,0BAA0B,QAAQ;AAAA,IAC1D,MAAM,YAAY,IAAI;AAAA,IACtB,MAAM,iBAAiB,aAAa;AAAA,SAC9B,mBAAmB,CAAC;AAAA,MACxB,MAAM;AAAA,MACN,kBAAkB,iBAAiB,oBAAoB;AAAA,MACvD,gBAAgB,OAAO;AAAA,MACvB,UAAU,QAAQ,YAAY,OAAO;AAAA,MACrC,YAAY,QAAQ,cAAc,OAAO;AAAA,MACzC,QAAQ,QAAQ,UAAU,OAAO;AAAA,MACjC,kBAAkB,QAAQ,YAAY,OAAO;AAAA,MAC7C,WAAW,UAAU,YAAY;AAAA,MACjC,gBAAgB,QAAQ,gBAAgB,YAAY;AAAA,MACpD,aAAa,QAAQ,eAAe,OAAO,eAAe;AAAA,IAC5D,CAAC;AAAA,IACD,IAAI,CAAC,gBAAgB;AAAA,MACnB,MAAM,IAAI,MAAM,4DAA4D;AAAA,IAC9E;AAAA,IACA,MAAM,KAAK,QAAQ,aAAa;AAAA,MAC9B;AAAA,MACA,SAAS;AAAA,QACP,MAAM,QAAQ,WAAW,OAAO;AAAA,MAClC;AAAA,MACA,UAAU,0BAA0B;AAAA,QAClC,UAAU,SAAS,SAAS,QAAQ;AAAA,QACpC,OAAO;AAAA,QACP,WAAW,UAAU,QAAQ;AAAA,QAC7B,QAAQ,QAAQ,UAAU,OAAO;AAAA,QACjC;AAAA,MACF,CAAC;AAAA,SACG,QAAQ,YAAY,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC;AAAA,IAC9D,CAAC;AAAA;AAAA,OAGG,qBAAoB,CAAC,IAAU,SAAe,UAA+B;AAAA,IACjF,MAAM,WAAW,MAAM,KAAK,QAAQ,cAAc,EAAE;AAAA,IACpD,MAAM,SAAS,WAAW,KAAK,oBAAoB,QAAQ,IAAI;AAAA,IAC/D,IAAI,CAAC,YAAY,CAAC,UAAU,SAAS,YAAY,SAAS;AAAA,MACxD,MAAM,IAAI,MAAM,oBAAoB,cAAc;AAAA,IACpD;AAAA,IACA,MAAM,eAAe,MAAM,KAAK,iBAAiB,QAAQ;AAAA,IACzD,IAAI,CAAC,aAAa,IAAI,OAAO,QAAQ,GAAG;AAAA,MACtC,MAAM,IAAI,MAAM,oBAAoB,gCAAgC,UAAU;AAAA,IAChF;AAAA,IACA,MAAM,KAAK,QAAQ,aAAa,EAAE;AAAA;AAAA,OAG9B,oBAAmB,CAAC,SAA6D;AAAA,IACrF,MAAM,MAAM,IAAI;AAAA,IAChB,MAAM,iBAAiB,aAAa;AAAA,MAClC,MAAM;AAAA,MACN,kBAAkB,QAAQ;AAAA,MAC1B,cAAc,QAAQ;AAAA,MACtB,mBAAmB,QAAQ;AAAA,MAC3B,WAAW,QAAQ,UAAU,YAAY;AAAA,MACzC,SAAS,QAAQ,QAAQ,YAAY;AAAA,MACrC,QAAQ,QAAQ;AAAA,MAChB,iBAAiB,QAAQ;AAAA,MACzB,WAAW,IAAI,YAAY;AAAA,IAC7B,CAAC;AAAA,IACD,IAAI,CAAC,gBAAgB;AAAA,MACnB,MAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AAAA,IACA,MAAM,KAAK,MAAM,KAAK,QAAQ,aAC5B;AAAA,MACE,SAAS,KAAK,QAAQ;AAAA,MACtB,UAAU,QAAQ,YAAY,KAAK,QAAQ;AAAA,MAC3C,QAAQ,QAAQ;AAAA,MAChB,SAAS,KAAK,iBAAiB;AAAA,MAC/B,SAAS,EAAE,MAAM,QAAQ,QAAQ;AAAA,MACjC,UAAU,0BAA0B;AAAA,QAClC,OAAO;AAAA,QACP,WAAW,IAAI,QAAQ;AAAA,QACvB;AAAA,MACF,CAAC;AAAA,MACD,WAAW,QAAQ;AAAA,MACnB,WAAW,IAAI,QAAQ;AAAA,MACvB,QAAQ;AAAA,IACV,GACA,uBACA,KACF;AAAA,IAEA,MAAM,SAAS,MAAM,KAAK,QAAQ,cAAc,EAAE;AAAA,IAClD,MAAM,SAAS,SAAS,KAAK,oBAAoB,MAAM,IAAI;AAAA,IAC3D,IAAI,CAAC,QAAQ;AAAA,MACX,MAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAAA,IACA,OAAO;AAAA;AAAA,OAGH,yBAAwB,CAC5B,SACA,QACsC;AAAA,IACtC,MAAM,YAAY,MAAM,KAAK,oBAAoB,SAAS,QAAQ,CAAC;AAAA,IACnE,OAAO,UAAU,MAAM;AAAA;AAAA,OAGnB,qBAAoB,CACxB,IACA,SACA,QACA,SAGe;AAAA,IACf,MAAM,WAAW,MAAM,KAAK,QAAQ,cAAc,EAAE;AAAA,IACpD,MAAM,SAAS,WAAW,KAAK,oBAAoB,QAAQ,IAAI;AAAA,IAC/D,IAAI,CAAC,YAAY,CAAC,UAAU,SAAS,YAAY,WAAW,SAAS,WAAW,QAAQ;AAAA,MACtF,MAAM,IAAI,MAAM,mBAAmB,cAAc;AAAA,IACnD;AAAA,IAEA,MAAM,kBAAkB,0BAA0B,QAAQ;AAAA,IAC1D,MAAM,YAAY,IAAI;AAAA,IACtB,MAAM,iBAAiB,aAAa;AAAA,SAC9B,mBAAmB,CAAC;AAAA,MACxB,MAAM;AAAA,MACN,kBAAkB,iBAAiB,oBAAoB,OAAO;AAAA,MAC9D,cAAc,QAAQ,gBAAgB,OAAO;AAAA,MAC7C,mBAAmB,QAAQ,qBAAqB,OAAO;AAAA,MACvD,YAAY,QAAQ,aAAa,OAAO,WAAW,YAAY;AAAA,MAC/D,UAAU,QAAQ,WAAW,OAAO,SAAS,YAAY;AAAA,MACzD,QAAQ,QAAQ,UAAU,OAAO;AAAA,MACjC,iBAAiB,QAAQ,YAAY,OAAO;AAAA,MAC5C,WAAW,UAAU,YAAY;AAAA,IACnC,CAAC;AAAA,IACD,IAAI,CAAC,gBAAgB;AAAA,MACnB,MAAM,IAAI,MAAM,2DAA2D;AAAA,IAC7E;AAAA,IACA,MAAM,KAAK,QAAQ,aAAa;AAAA,MAC9B;AAAA,MACA,SAAS;AAAA,QACP,MAAM,QAAQ,WAAW,OAAO;AAAA,MAClC;AAAA,MACA,UAAU,0BAA0B;AAAA,QAClC,UAAU,SAAS,SAAS,QAAQ;AAAA,QACpC,OAAO;AAAA,QACP,WAAW,UAAU,QAAQ;AAAA,QAC7B;AAAA,MACF,CAAC;AAAA,SACG,QAAQ,YAAY,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC;AAAA,IAC9D,CAAC;AAAA;AAAA,OAGG,oBAAmB,CACvB,SACA,QACA,QAAQ,GACyB;AAAA,IACjC,IAAI,SAAS,GAAG;AAAA,MACd,OAAO,CAAC;AAAA,IACV;AAAA,IACA,MAAM,WAAW,MAAM,KAAK,QAAQ,YAAY;AAAA,MAC9C;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,OAAO,KAAK,IAAI,QAAQ,GAAG,EAAE;AAAA,MAC7B,QAAQ;AAAA,IACV,CAAC;AAAA,IAED,OAAO,KAAK,qBACV,SACG,IAAI,CAAC,WAAW,KAAK,oBAAoB,MAAM,CAAC,EAChD,OAAO,CAAC,WAA2C,WAAW,IAAI,CACvE,EAAE,MAAM,GAAG,KAAK;AAAA;AAEpB;;;AE3nB2B,IAA3B;AACiB,IAAjB;AACmB,IAAnB;AAEO,SAAS,eAAe,CAAC,UAA0B;AAAA,EACxD,IAAI,SAAS,WAAW,GAAG,GAAG;AAAA,IAC5B,OAAO,yBAAK,KAAK,QAAQ,IAAI,GAAG,SAAS,MAAM,CAAC,CAAC;AAAA,EACnD;AAAA,EACA,OAAO;AAAA;AAGF,SAAS,cAAc,CAAC,WAAmB,QAAQ,IAAI,GAAW;AAAA,EACvE,IAAI,aAAa;AAAA,EAEjB,OAAO,MAAM;AAAA,IACX,MAAM,YAAY,yBAAK,KAAK,YAAY,MAAM;AAAA,IAC9C,IAAI,2BAAW,SAAS,GAAG;AAAA,MACzB,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,YAAY,yBAAK,QAAQ,UAAU;AAAA,IACzC,IAAI,cAAc,YAAY;AAAA,MAC5B;AAAA,IACF;AAAA,IACA,aAAa;AAAA,EACf;AAAA,EAEA,OAAO,yBAAK,KAAK,UAAU,MAAM;AAAA;AAG5B,SAAS,gBAAgB,CAAC,KAAc,aAA8B;AAAA,EAC3E,MAAM,UAAU,eAAe;AAAA,EAC/B,IAAI,2BAAW,OAAO,GAAG;AAAA,IACvB,sBAAO,OAAO,EAAE,MAAM,QAAQ,CAAC;AAAA,EACjC;AAAA,EAEA,IAAI;AAAA,EACJ,IAAI,2BAAW,yBAAK,KAAK,QAAQ,IAAI,GAAG,YAAY,MAAM,CAAC,GAAG;AAAA,IAC5D,WAAW,QAAQ,IAAI;AAAA,EACzB,EAAO;AAAA,IACL,MAAM,QAAQ,yBAAK,QAAQ,QAAQ,IAAI,GAAG,OAAO;AAAA,IACjD,IAAI,2BAAW,yBAAK,KAAK,OAAO,YAAY,MAAM,CAAC,GAAG;AAAA,MACpD,WAAW;AAAA,IACb;AAAA;AAAA,EAGF,MAAM,OACJ,OACA,QAAQ,IAAI,mBACZ,gBACC,WAAW,yBAAK,KAAK,UAAU,UAAU,UAAU,IAAI,cACxD,yBAAK,KAAK,QAAQ,IAAI,GAAG,UAAU,UAAU;AAAA,EAE/C,OAAO,gBAAgB,IAAI;AAAA;;;ACdtB,SAAS,gCAAgC,CAAC,QAKtC;AAAA,EACT,OAAO;AAAA,IACL;AAAA,IACA,sBAAsB,OAAO,OAAO;AAAA,IACpC,sBAAsB,OAAO,QAAQ;AAAA,IACrC,sBAAsB,OAAO,SAAS;AAAA,IACtC,sBAAsB,OAAO,cAAc;AAAA,EAC7C,EAAE,KAAK,GAAG;AAAA;AAGL,SAAS,8BAA8B,CAC5C,OAC0B;AAAA,EAC1B,OAAO;AAAA,SACC,UAAS,CAAC,QAAQ;AAAA,MACtB,MAAM,WAAW,OAAO,YAAY,iCAAiC,MAAM;AAAA,MAC3E,MAAM,MAAM,IAAI,UAAU,OAAO,OAAO,EAAE,WAAW,MAAM,QAAQ,OAAO,OAAO,CAAC;AAAA,MAClF,OAAO;AAAA;AAAA,SAEH,aAAY,CAAC,QAAQ;AAAA,MACzB,IAAI,CAAC,MAAM,cAAc;AAAA,QACvB,MAAM,IAAI,MAAM,yEAAyE;AAAA,MAC3F;AAAA,MACA,MAAM,WAAW,OAAO,YAAY,iCAAiC,MAAM;AAAA,MAC3E,MAAM,MAAM,aAAa,UAAU,OAAO,SAAS;AAAA,MACnD,OAAO;AAAA;AAAA,SAEH,IAAG,CAAC,UAAU,SAAS;AAAA,MAC3B,IAAI,SAAS,UAAU,MAAM,QAAQ;AAAA,QACnC,OAAO,MAAM,OAAO,UAAU,QAAQ,MAAM;AAAA,MAC9C;AAAA,MACA,OAAO,MAAM,IAAI,QAAQ;AAAA;AAAA,SAErB,IAAG,CAAC,UAAU;AAAA,MAClB,OAAO,MAAM,IAAI,QAAQ;AAAA;AAAA,SAErB,OAAM,CAAC,UAAU;AAAA,MACrB,MAAM,MAAM,OAAO,QAAQ;AAAA;AAAA,EAE/B;AAAA;AAGF,SAAS,qBAAqB,CAAC,OAAuB;AAAA,EACpD,MAAM,aAAa,MAChB,KAAK,EACL,QAAQ,oBAAoB,GAAG,EAC/B,QAAQ,YAAY,EAAE;AAAA,EACzB,QAAQ,cAAc,WAAW,MAAM,GAAG,EAAE;AAAA;;;A/CwI9C;AACA;AAxKA,IAAM,oBAAoB,OAAO,IAAI,sCAAsC;AAe3E,IAAM,gBAAgB;AAEtB,IAAI,CAAC,cAAc,oBAAoB;AAAA,EACrC,cAAc,qBAAqB,CAAC;AACtC;AAEA,IAAM,mBAAmB,cAAc;AAEvC,SAAS,wBAAwB,CAAC,SAAmD;AAAA,EACnF,IAAI,CAAC,SAAS;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EAEA,OAAO,CAAC,QAAQ,eAAe;AAAA;AAGjC,SAAS,0BAA0B,CACjC,SACsC;AAAA,EACtC,IAAI,CAAC,SAAS;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EAEA,OAAO,CAAC,QAAQ,eAAe;AAAA;AAG1B,SAAS,qBAAqB,CACnC,QAIA,SACkB;AAAA,EAClB,IAAI,OAAO,aAAa;AAAA,IACtB,IAAI,WAAU,iBAAiB;AAAA,IAC/B,IAAI,CAAC,2BAA2B,QAAO,GAAG;AAAA,MACxC,MAAM,uBAAuB,QAAQ,IAAI,0BAA0B;AAAA,MACnE,IAAI;AAAA,MACJ,IAAI,sBAAsB;AAAA,QACxB,MAAM,oBAAoB,QAAQ,IAAI;AAAA,QACtC,IAAI,CAAC,mBAAmB;AAAA,UACtB,MAAM,IAAI,MACR,2FACF;AAAA,QACF;AAAA,QACA,cAAc,aAAa,iBAAiB;AAAA,QAC5C,qBAAO,MACL;AAAA,UACE,KAAK;AAAA,UACL,aAAa,YAAY,MAAM,GAAG,CAAC;AAAA,UACnC,gBAAgB;AAAA,QAClB,GACA,0CACF;AAAA,MACF;AAAA,MAEA,WAAU,IAAI,0BAA0B,OAAO,aAAa,WAAW;AAAA,MACvE,iBAAiB,4BAA4B;AAAA,IAC/C;AAAA,IACA,OAAO,IAAI,kBAAkB,SAAS,QAAO;AAAA,EAC/C;AAAA,EAEA,MAAM,UAAU,iBAAiB,OAAO,OAAO;AAAA,EAK/C,IAAI,WAAW,CAAC,QAAQ,SAAS,KAAK,KAAK,YAAY,YAAY;AAAA,IACjE,0BAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,EACxC;AAAA,EAEA,IAAI,CAAC,yBAAyB,iBAAiB,mBAAmB,GAAG;AAAA,IACnE,iBAAiB,sBAAsB,IAAI,oBAAoB,EAAE,SAAS,QAAQ,CAAC;AAAA,EACrF;AAAA,EAEA,MAAM,UAAU,iBAAiB;AAAA,EACjC,IAAI,CAAC,SAAS;AAAA,IACZ,MAAM,IAAI,MAAM,0EAA0E;AAAA,EAC5F;AAAA,EAEA,OAAO,IAAI,sBAAsB,SAAS,OAAO;AAAA;AAG5C,IAAM,SAAiB;AAAA,EAC5B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,UAAU,CAAC,4BAA4B;AAAA,EACvC,MAAM,OAAO,GAAG,YAA2B;AAAA,IACzC,MAAM,qBAAqB;AAAA,IAC3B,QAAQ,OAAO,KACb,EAAE,KAAK,cAAc,SAAS,QAAQ,QAAQ,GAC9C,0BACF;AAAA,IAEA,MAAM,oBACJ,OAAO,mBAAmB,uBAAuB,aAC7C,mBAAmB,mBAAmB,KACrC,MAAM;AAAA,MACL,IAAI;AAAA,QACF,MAAM,WACJ,mBAAmB,qBAAqB,KACxC,mBAAmB,mBACnB,mBAAmB;AAAA,QACrB,OAAO,QAAQ,QAAQ;AAAA,QACvB,MAAM;AAAA,QACN,OAAO;AAAA;AAAA,OAER;AAAA,IAET,IAAI,mBAAmB;AAAA,MACrB,QAAQ,OAAO,KACb,EAAE,KAAK,cAAc,SAAS,QAAQ,QAAQ,GAC9C,wDACF;AAAA,MACA;AAAA,IACF;AAAA,IAEA,QAAQ,OAAO,MACb,EAAE,KAAK,cAAc,SAAS,QAAQ,QAAQ,GAC9C,mDACF;AAAA,IAEA,MAAM,cAAc,QAAQ,WAAW,cAAc;AAAA,IACrD,MAAM,UAAU,QAAQ,WAAW,iBAAiB;AAAA,IAEpD,MAAM,YAAY,sBAChB;AAAA,MACE,SAAS,OAAO,YAAY,WAAW,UAAU;AAAA,MACjD,aAAa,OAAO,gBAAgB,WAAW,cAAc;AAAA,IAC/D,GACA,QAAQ,OACV;AAAA,IAEA,mBAAmB,wBAAwB,SAAS;AAAA,IACpD,MAAM,UAAU,WAAW;AAAA,IAC3B,QAAQ,OAAO,KACb,EAAE,KAAK,cAAc,SAAS,QAAQ,QAAQ,GAC9C,yCACF;AAAA;AAAA,OAEI,QAAO,CAAC,SAAS;AAAA,IACrB,MAAM,QACH,WAAyC,6BAA6B,WAAW,GAChF,KAAK;AAAA;AAEb;AAEA,IAAe;AAuBR,SAAS,mBAAmB,GAKjC;AAAA,EACA,MAAM,UAAU,iBAAiB;AAAA,EACjC,IAAI,CAAC,SAAS;AAAA,IACZ,OAAO,EAAE,QAAQ,YAAY,OAAO,MAAM,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EACnE;AAAA,EACA,OAAO,QAAQ,cAAc;AAAA;AAQxB,SAAS,sBAAsB,GAAyB;AAAA,EAC7D,MAAM,UAAU,iBAAiB;AAAA,EACjC,IAAI,CAAC;AAAA,IAAS,OAAO;AAAA,EACrB,OAAO,QAAQ,UAAU;AAAA;AAS3B,eAAsB,iBAAiB,GAK7B;AAAA,EACR,MAAM,UAAU,iBAAiB;AAAA,EACjC,IAAI,CAAC;AAAA,IAAS,OAAO;AAAA,EACrB,OAAO,QAAQ,YAAY;AAAA;",
73
+ "debugId": "99C7E9BC2C606C9C64756E2164756E21",
74
+ "names": []
75
+ }