@rebasepro/server-mongodb 0.0.1-canary.4d4fb3e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +6 -0
- package/dist/index.es.js +875 -0
- package/dist/index.es.js.map +1 -0
- package/dist/index.umd.js +878 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/server-mongodb/src/connection.d.ts +35 -0
- package/dist/server-mongodb/src/connection.d.ts.map +1 -0
- package/dist/server-mongodb/src/db/MongoConditionBuilder.d.ts +64 -0
- package/dist/server-mongodb/src/db/MongoConditionBuilder.d.ts.map +1 -0
- package/dist/server-mongodb/src/db/MongoEntityService.d.ts +98 -0
- package/dist/server-mongodb/src/db/MongoEntityService.d.ts.map +1 -0
- package/dist/server-mongodb/src/factory.d.ts +139 -0
- package/dist/server-mongodb/src/factory.d.ts.map +1 -0
- package/dist/server-mongodb/src/index.d.ts +17 -0
- package/dist/server-mongodb/src/index.d.ts.map +1 -0
- package/dist/server-mongodb/src/services/MongoDriver.d.ts +81 -0
- package/dist/server-mongodb/src/services/MongoDriver.d.ts.map +1 -0
- package/dist/server-mongodb/src/services/MongoRealtimeService.d.ts +65 -0
- package/dist/server-mongodb/src/services/MongoRealtimeService.d.ts.map +1 -0
- package/dist/server-mongodb/src/useMongoDriver.d.ts +18 -0
- package/dist/server-mongodb/src/useMongoDriver.d.ts.map +1 -0
- package/dist/server-mongodb/src/utils.d.ts +10 -0
- package/dist/server-mongodb/src/utils.d.ts.map +1 -0
- package/dist/types/src/controllers/analytics_controller.d.ts +8 -0
- package/dist/types/src/controllers/analytics_controller.d.ts.map +1 -0
- package/dist/types/src/controllers/auth.d.ts +118 -0
- package/dist/types/src/controllers/auth.d.ts.map +1 -0
- package/dist/types/src/controllers/client.d.ts +59 -0
- package/dist/types/src/controllers/client.d.ts.map +1 -0
- package/dist/types/src/controllers/collection_registry.d.ts +45 -0
- package/dist/types/src/controllers/collection_registry.d.ts.map +1 -0
- package/dist/types/src/controllers/customization_controller.d.ts +55 -0
- package/dist/types/src/controllers/customization_controller.d.ts.map +1 -0
- package/dist/types/src/controllers/data.d.ts +142 -0
- package/dist/types/src/controllers/data.d.ts.map +1 -0
- package/dist/types/src/controllers/data_driver.d.ts +169 -0
- package/dist/types/src/controllers/data_driver.d.ts.map +1 -0
- package/dist/types/src/controllers/database_admin.d.ts +12 -0
- package/dist/types/src/controllers/database_admin.d.ts.map +1 -0
- package/dist/types/src/controllers/dialogs_controller.d.ts +37 -0
- package/dist/types/src/controllers/dialogs_controller.d.ts.map +1 -0
- package/dist/types/src/controllers/effective_role.d.ts +5 -0
- package/dist/types/src/controllers/effective_role.d.ts.map +1 -0
- package/dist/types/src/controllers/index.d.ts +18 -0
- package/dist/types/src/controllers/index.d.ts.map +1 -0
- package/dist/types/src/controllers/local_config_persistence.d.ts +21 -0
- package/dist/types/src/controllers/local_config_persistence.d.ts.map +1 -0
- package/dist/types/src/controllers/navigation.d.ts +214 -0
- package/dist/types/src/controllers/navigation.d.ts.map +1 -0
- package/dist/types/src/controllers/registry.d.ts +52 -0
- package/dist/types/src/controllers/registry.d.ts.map +1 -0
- package/dist/types/src/controllers/side_dialogs_controller.d.ts +68 -0
- package/dist/types/src/controllers/side_dialogs_controller.d.ts.map +1 -0
- package/dist/types/src/controllers/side_entity_controller.d.ts +90 -0
- package/dist/types/src/controllers/side_entity_controller.d.ts.map +1 -0
- package/dist/types/src/controllers/snackbar.d.ts +25 -0
- package/dist/types/src/controllers/snackbar.d.ts.map +1 -0
- package/dist/types/src/controllers/storage.d.ts +174 -0
- package/dist/types/src/controllers/storage.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +5 -0
- package/dist/types/src/index.d.ts.map +1 -0
- package/dist/types/src/rebase_context.d.ts +102 -0
- package/dist/types/src/rebase_context.d.ts.map +1 -0
- package/dist/types/src/types/backend.d.ts +534 -0
- package/dist/types/src/types/backend.d.ts.map +1 -0
- package/dist/types/src/types/builders.d.ts +15 -0
- package/dist/types/src/types/builders.d.ts.map +1 -0
- package/dist/types/src/types/chips.d.ts +6 -0
- package/dist/types/src/types/chips.d.ts.map +1 -0
- package/dist/types/src/types/collections.d.ts +813 -0
- package/dist/types/src/types/collections.d.ts.map +1 -0
- package/dist/types/src/types/data_source.d.ts +65 -0
- package/dist/types/src/types/data_source.d.ts.map +1 -0
- package/dist/types/src/types/entities.d.ts +146 -0
- package/dist/types/src/types/entities.d.ts.map +1 -0
- package/dist/types/src/types/entity_actions.d.ts +99 -0
- package/dist/types/src/types/entity_actions.d.ts.map +1 -0
- package/dist/types/src/types/entity_callbacks.d.ts +174 -0
- package/dist/types/src/types/entity_callbacks.d.ts.map +1 -0
- package/dist/types/src/types/entity_link_builder.d.ts +8 -0
- package/dist/types/src/types/entity_link_builder.d.ts.map +1 -0
- package/dist/types/src/types/entity_overrides.d.ts +10 -0
- package/dist/types/src/types/entity_overrides.d.ts.map +1 -0
- package/dist/types/src/types/entity_views.d.ts +62 -0
- package/dist/types/src/types/entity_views.d.ts.map +1 -0
- package/dist/types/src/types/export_import.d.ts +22 -0
- package/dist/types/src/types/export_import.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +23 -0
- package/dist/types/src/types/index.d.ts.map +1 -0
- package/dist/types/src/types/locales.d.ts +5 -0
- package/dist/types/src/types/locales.d.ts.map +1 -0
- package/dist/types/src/types/modify_collections.d.ts +6 -0
- package/dist/types/src/types/modify_collections.d.ts.map +1 -0
- package/dist/types/src/types/plugins.d.ts +226 -0
- package/dist/types/src/types/plugins.d.ts.map +1 -0
- package/dist/types/src/types/properties.d.ts +1092 -0
- package/dist/types/src/types/properties.d.ts.map +1 -0
- package/dist/types/src/types/property_config.d.ts +71 -0
- package/dist/types/src/types/property_config.d.ts.map +1 -0
- package/dist/types/src/types/relations.d.ts +337 -0
- package/dist/types/src/types/relations.d.ts.map +1 -0
- package/dist/types/src/types/slots.d.ts +229 -0
- package/dist/types/src/types/slots.d.ts.map +1 -0
- package/dist/types/src/types/translations.d.ts +827 -0
- package/dist/types/src/types/translations.d.ts.map +1 -0
- package/dist/types/src/types/user_management_delegate.d.ts +121 -0
- package/dist/types/src/types/user_management_delegate.d.ts.map +1 -0
- package/dist/types/src/types/websockets.d.ts +79 -0
- package/dist/types/src/types/websockets.d.ts.map +1 -0
- package/dist/types/src/users/index.d.ts +3 -0
- package/dist/types/src/users/index.d.ts.map +1 -0
- package/dist/types/src/users/roles.d.ts +23 -0
- package/dist/types/src/users/roles.d.ts.map +1 -0
- package/dist/types/src/users/user.d.ts +47 -0
- package/dist/types/src/users/user.d.ts.map +1 -0
- package/package.json +81 -0
- package/src/connection.ts +60 -0
- package/src/db/MongoConditionBuilder.ts +181 -0
- package/src/db/MongoEntityService.ts +350 -0
- package/src/factory.ts +274 -0
- package/src/index.ts +24 -0
- package/src/services/MongoDriver.ts +267 -0
- package/src/services/MongoRealtimeService.ts +295 -0
- package/src/useMongoDriver.ts +516 -0
- package/src/utils.ts +28 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/connection.ts","../src/db/MongoConditionBuilder.ts","../src/db/MongoEntityService.ts","../src/services/MongoRealtimeService.ts","../src/services/MongoDriver.ts","../src/factory.ts"],"sourcesContent":["/**\n * MongoDB Connection\n *\n * Wraps MongoDB connection to implement the DatabaseConnection interface.\n */\n\nimport { Db, MongoClient } from \"mongodb\";\nimport { DatabaseConnection } from \"@rebasepro/types\";\n\n/**\n * MongoDB database connection wrapper that implements DatabaseConnection interface.\n */\nexport class MongoDBConnection implements DatabaseConnection {\n readonly type = \"mongodb\";\n\n constructor(\n public readonly db: Db,\n public readonly client: MongoClient\n ) { }\n\n get isConnected(): boolean {\n // MongoClient doesn't have a direct isConnected property in v6+\n // We check if the client topology is connected\n try {\n const clientInternal = this.client as unknown as Record<string, { isConnected?: () => boolean } | undefined>;\n return clientInternal.topology?.isConnected?.() ?? false;\n } catch {\n return false;\n }\n }\n\n async close(): Promise<void> {\n await this.client.close();\n }\n}\n\n/**\n * Create a MongoDB database connection from a connection string.\n *\n * @param connectionString - MongoDB connection string (e.g., mongodb://localhost:27017)\n * @param databaseName - Name of the database to use\n * @returns Promise resolving to MongoDBConnection\n *\n * @example\n * ```typescript\n * const connection = await createMongoDBConnection(\n * \"mongodb://localhost:27017\",\n * \"my_database\"\n * );\n * ```\n */\nexport async function createMongoDBConnection(\n connectionString: string,\n databaseName: string\n): Promise<MongoDBConnection> {\n const client = new MongoClient(connectionString);\n await client.connect();\n const db = client.db(databaseName);\n return new MongoDBConnection(db, client);\n}\n","/**\n * MongoDB Condition Builder\n *\n * Translates Rebase filter conditions to MongoDB query operators.\n */\n\nimport { FilterValues, WhereFilterOp } from \"@rebasepro/types\";\nimport { Filter, Document } from \"mongodb\";\n\n/**\n * Mapping from Rebase filter operators to MongoDB query operators\n */\nconst REBASE_TO_MONGO_OP: Record<WhereFilterOp, string> = {\n \"<\": \"$lt\",\n \"<=\": \"$lte\",\n \"==\": \"$eq\",\n \"!=\": \"$ne\",\n \">=\": \"$gte\",\n \">\": \"$gt\",\n \"array-contains\": \"$elemMatch\",\n \"array-contains-any\": \"$in\",\n \"in\": \"$in\",\n \"not-in\": \"$nin\"\n};\n\n/**\n * MongoDB Condition Builder\n *\n * Provides static methods to translate Rebase filter conditions\n * to MongoDB query filters.\n */\nexport class MongoConditionBuilder {\n /**\n * Build MongoDB filter conditions from Rebase FilterValues\n *\n * @param filter - Rebase filter values\n * @returns Array of MongoDB filter objects\n */\n static buildFilterConditions<M extends Record<string, any>>(\n filter: FilterValues<Extract<keyof M, string>>\n ): Filter<Document>[] {\n if (!filter) return [];\n\n const conditions: Filter<Document>[] = [];\n\n for (const [field, filterParam] of Object.entries(filter)) {\n if (!filterParam) continue;\n\n const [op, value] = filterParam as [WhereFilterOp, any];\n const mongoOp = REBASE_TO_MONGO_OP[op];\n\n if (!mongoOp) {\n console.warn(`Unsupported filter operator: ${op}`);\n continue;\n }\n\n // Handle array-contains specially\n if (op === \"array-contains\") {\n conditions.push({\n [field]: { $elemMatch: { $eq: value } }\n });\n } else {\n conditions.push({\n [field]: { [mongoOp]: value }\n });\n }\n }\n\n return conditions;\n }\n\n /**\n * Build search conditions for text search\n *\n * @param searchString - Text to search for\n * @param properties - Properties to search in\n * @returns Array of MongoDB filter objects for text search\n */\n static buildSearchConditions(\n searchString: string,\n properties: Record<string, any>\n ): Filter<Document>[] {\n if (!searchString) return [];\n\n // Build regex conditions for each searchable string property\n const orConditions: Filter<Document>[] = [];\n const searchRegex = new RegExp(searchString, \"i\");\n\n for (const [key, prop] of Object.entries(properties)) {\n // Only search in string-type properties\n if (prop?.dataType === \"string\" || typeof prop === \"string\") {\n orConditions.push({\n [key]: { $regex: searchRegex }\n });\n }\n }\n\n // If no properties to search, use MongoDB text search\n if (orConditions.length === 0) {\n return [{ $text: { $search: searchString } }];\n }\n\n return orConditions;\n }\n\n /**\n * Combine multiple conditions with AND operator\n *\n * @param conditions - Array of filter conditions\n * @returns Combined filter or undefined if empty\n */\n static combineConditionsWithAnd(conditions: Filter<Document>[]): Filter<Document> | undefined {\n if (conditions.length === 0) return undefined;\n if (conditions.length === 1) return conditions[0];\n return { $and: conditions };\n }\n\n /**\n * Combine multiple conditions with OR operator\n *\n * @param conditions - Array of filter conditions\n * @returns Combined filter or undefined if empty\n */\n static combineConditionsWithOr(conditions: Filter<Document>[]): Filter<Document> | undefined {\n if (conditions.length === 0) return undefined;\n if (conditions.length === 1) return conditions[0];\n return { $or: conditions };\n }\n\n /**\n * Build a complete MongoDB query from Rebase options\n *\n * @param options - Rebase fetch options\n * @returns MongoDB filter object\n */\n static buildQuery<M extends Record<string, any>>(options: {\n filter?: FilterValues<Extract<keyof M, string>>;\n searchString?: string;\n properties?: Record<string, any>;\n }): Filter<Document> {\n const conditions: Filter<Document>[] = [];\n\n // Add filter conditions\n if (options.filter) {\n const filterConditions = this.buildFilterConditions<M>(options.filter);\n conditions.push(...filterConditions);\n }\n\n // Add search conditions\n if (options.searchString && options.properties) {\n const searchConditions = this.buildSearchConditions(\n options.searchString,\n options.properties\n );\n if (searchConditions.length > 0) {\n // Search conditions are OR'd together\n const searchFilter = this.combineConditionsWithOr(searchConditions);\n if (searchFilter) {\n conditions.push(searchFilter);\n }\n }\n }\n\n return this.combineConditionsWithAnd(conditions) ?? {};\n }\n\n /**\n * Build MongoDB sort options from Rebase options\n *\n * @param orderBy - Field to order by\n * @param order - Sort direction\n * @returns MongoDB sort object\n */\n static buildSort(\n orderBy?: string,\n order?: \"asc\" | \"desc\"\n ): Record<string, 1 | -1> | undefined {\n if (!orderBy) return undefined;\n return { [orderBy]: order === \"desc\" ? -1 : 1 };\n }\n}\n","/**\n * MongoDB Entity Service\n *\n * Implements EntityRepository interface for MongoDB.\n * Provides all CRUD operations for entities.\n */\n\nimport { Db, ObjectId, Collection, Document, FindOptions, Filter } from \"mongodb\";\nimport { Entity, FilterValues, EntityRepository, EntityCollection } from \"@rebasepro/types\";\nimport { MongoConditionBuilder } from \"./MongoConditionBuilder\";\n\n/**\n * MongoDB Entity Service\n *\n * Implements the EntityRepository interface for MongoDB.\n * Provides all CRUD operations for entities stored in MongoDB collections.\n */\nexport class MongoEntityService implements EntityRepository {\n constructor(private db: Db) { }\n\n /**\n * Get a MongoDB collection by its path\n */\n private getCollection(collectionPath: string): Collection<Document> {\n // Handle nested paths (e.g., \"posts/123/comments\" -> \"posts_123_comments\")\n const collectionName = collectionPath.replace(/\\//g, \"_\");\n return this.db.collection(collectionName);\n }\n\n /**\n * Convert a string ID to ObjectId if it's a valid ObjectId string\n */\n private toObjectId(id: string | number): ObjectId | string | number {\n if (typeof id === \"string\" && ObjectId.isValid(id) && id.length === 24) {\n return new ObjectId(id);\n }\n return id;\n }\n\n /**\n * Convert a MongoDB document to a Rebase Entity\n */\n private documentToEntity<M extends Record<string, any>>(\n doc: Document,\n path: string\n ): Entity<M> {\n const { _id, ...values } = doc;\n return {\n id: _id.toString(),\n path,\n values: this.convertFromMongoValues(values) as M\n };\n }\n\n /**\n * Convert values from MongoDB format to Rebase format\n */\n private convertFromMongoValues(values: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(values)) {\n result[key] = this.convertFromMongoValue(value);\n }\n\n return result;\n }\n\n /**\n * Convert a single value from MongoDB format\n */\n private convertFromMongoValue(value: any): any {\n if (value === null || value === undefined) return value;\n\n // Handle ObjectId\n if (value instanceof ObjectId) {\n return value.toString();\n }\n\n // Handle Date\n if (value instanceof Date) {\n return value;\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n return value.map(v => this.convertFromMongoValue(v));\n }\n\n // Handle EntityReference-like objects\n if (typeof value === \"object\" && \"path\" in value && \"id\" in value) {\n return {\n path: value.path,\n id: value.id instanceof ObjectId ? value.id.toString() : value.id\n };\n }\n\n // Handle nested objects\n if (typeof value === \"object\") {\n return this.convertFromMongoValues(value);\n }\n\n return value;\n }\n\n /**\n * Convert values to MongoDB format for storage\n */\n private convertToMongoValues(values: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(values)) {\n result[key] = this.convertToMongoValue(value);\n }\n\n return result;\n }\n\n /**\n * Convert a single value to MongoDB format\n */\n private convertToMongoValue(value: any): any {\n if (value === null || value === undefined) return value;\n\n // Handle EntityReference\n if (typeof value === \"object\" && value.isEntityReference?.()) {\n return {\n id: ObjectId.isValid(value.id) ? new ObjectId(value.id) : value.id,\n path: value.path\n };\n }\n\n // Handle Date\n if (value instanceof Date) {\n return value;\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n return value.map(v => this.convertToMongoValue(v));\n }\n\n // Handle nested objects\n if (typeof value === \"object\") {\n return this.convertToMongoValues(value);\n }\n\n return value;\n }\n\n // =============================================================\n // EntityRepository Implementation\n // =============================================================\n\n /**\n * Fetch a single entity by ID\n */\n async fetchEntity<M extends Record<string, any>>(\n collectionPath: string,\n entityId: string | number,\n _databaseId?: string\n ): Promise<Entity<M> | undefined> {\n const collection = this.getCollection(collectionPath);\n const id = this.toObjectId(entityId);\n\n const doc = await collection.findOne({ _id: id } as Filter<Document>);\n\n if (!doc) return undefined;\n\n return this.documentToEntity<M>(doc, collectionPath);\n }\n\n /**\n * Fetch a collection of entities with optional filtering, ordering, and pagination\n */\n async fetchCollection<M extends Record<string, any>>(\n collectionPath: string,\n options: {\n filter?: FilterValues<Extract<keyof M, string>>;\n orderBy?: string;\n order?: \"desc\" | \"asc\";\n limit?: number;\n startAfter?: any;\n searchString?: string;\n databaseId?: string;\n collection?: EntityCollection;\n } = {}\n ): Promise<Entity<M>[]> {\n const collection = this.getCollection(collectionPath);\n\n // Build query\n const query = MongoConditionBuilder.buildQuery<M>({\n filter: options.filter,\n searchString: options.searchString,\n properties: options.collection?.properties ?? {}\n });\n\n // Build find options\n const findOptions: FindOptions<Document> = {};\n\n // Apply sorting\n const sort = MongoConditionBuilder.buildSort(options.orderBy, options.order);\n if (sort) {\n findOptions.sort = sort;\n }\n\n // Apply limit\n if (options.limit) {\n findOptions.limit = options.limit;\n }\n\n // Apply pagination (skip-based for now, cursor-based would be better)\n if (options.startAfter !== undefined) {\n findOptions.skip = Number(options.startAfter);\n }\n\n const docs = await collection.find(query, findOptions).toArray();\n\n return docs.map((doc: Document) => this.documentToEntity<M>(doc, collectionPath));\n }\n\n /**\n * Search entities by text\n */\n async searchEntities<M extends Record<string, any>>(\n collectionPath: string,\n searchString: string,\n options: {\n filter?: FilterValues<Extract<keyof M, string>>;\n orderBy?: string;\n order?: \"desc\" | \"asc\";\n limit?: number;\n databaseId?: string;\n collection?: EntityCollection;\n } = {}\n ): Promise<Entity<M>[]> {\n return this.fetchCollection<M>(collectionPath, {\n ...options,\n searchString\n });\n }\n\n /**\n * Count entities in a collection\n */\n async countEntities<M extends Record<string, any>>(\n collectionPath: string,\n options: {\n filter?: FilterValues<Extract<keyof M, string>>;\n databaseId?: string;\n } = {}\n ): Promise<number> {\n const collection = this.getCollection(collectionPath);\n\n const query = options.filter\n ? MongoConditionBuilder.buildQuery<M>({ filter: options.filter })\n : {};\n\n return collection.countDocuments(query);\n }\n\n /**\n * Save an entity (create or update)\n */\n async saveEntity<M extends Record<string, any>>(\n collectionPath: string,\n values: Partial<M>,\n entityId?: string | number,\n _databaseId?: string\n ): Promise<Entity<M>> {\n const collection = this.getCollection(collectionPath);\n const mongoValues = this.convertToMongoValues(values as Record<string, any>);\n\n if (entityId) {\n // Update existing entity\n const id = this.toObjectId(entityId);\n await collection.updateOne(\n { _id: id } as Filter<Document>,\n { $set: mongoValues },\n { upsert: true }\n );\n\n return {\n id: entityId.toString(),\n path: collectionPath,\n values: values as M\n };\n } else {\n // Create new entity\n const newId = new ObjectId();\n await collection.insertOne({\n _id: newId,\n ...mongoValues\n });\n\n return {\n id: newId.toString(),\n path: collectionPath,\n values: values as M\n };\n }\n }\n\n /**\n * Delete an entity by ID\n */\n async deleteEntity(\n collectionPath: string,\n entityId: string | number,\n _databaseId?: string\n ): Promise<void> {\n const collection = this.getCollection(collectionPath);\n const id = this.toObjectId(entityId);\n\n const result = await collection.deleteOne({ _id: id } as Filter<Document>);\n\n if (result.deletedCount === 0) {\n console.warn(`Entity ${entityId} not found in collection ${collectionPath}`);\n }\n }\n\n /**\n * Check if a field value is unique in a collection\n */\n async checkUniqueField(\n collectionPath: string,\n fieldName: string,\n value: any,\n excludeEntityId?: string,\n _databaseId?: string\n ): Promise<boolean> {\n const collection = this.getCollection(collectionPath);\n\n const query: Filter<Document> = { [fieldName]: value };\n\n if (excludeEntityId) {\n const id = this.toObjectId(excludeEntityId);\n (query as Record<string, unknown>)._id = { $ne: id };\n }\n\n const count = await collection.countDocuments(query);\n return count === 0;\n }\n\n /**\n * Generate a new entity ID\n */\n generateEntityId(): string {\n return new ObjectId().toString();\n }\n}\n","/**\n * MongoDB Realtime Service\n *\n * Implements RealtimeProvider interface using MongoDB Change Streams.\n * Provides real-time subscriptions to collection and entity changes.\n */\n\nimport { Db, ChangeStream, ChangeStreamDocument, Document, ObjectId } from \"mongodb\";\nimport {\n Entity,\n FilterValues,\n RealtimeProvider,\n CollectionSubscriptionConfig,\n EntitySubscriptionConfig,\n} from \"@rebasepro/types\";\nimport { MongoEntityService } from \"../db/MongoEntityService\";\n\ninterface Subscription {\n type: \"collection\" | \"entity\";\n config: CollectionSubscriptionConfig | EntitySubscriptionConfig;\n changeStream?: ChangeStream;\n callback?: (data: any) => void;\n}\n\n/**\n * MongoDB Realtime Service\n *\n * Implements real-time subscriptions using MongoDB Change Streams.\n * Requires MongoDB replica set for change streams to work.\n */\nexport class MongoRealtimeService implements RealtimeProvider {\n private subscriptions = new Map<string, Subscription>();\n private entityService: MongoEntityService;\n\n constructor(private db: Db) {\n this.entityService = new MongoEntityService(db);\n }\n\n /**\n * Get the collection name from a path\n */\n private getCollectionName(path: string): string {\n return path.replace(/\\//g, \"_\");\n }\n\n /**\n * Subscribe to collection changes\n */\n subscribeToCollection(\n subscriptionId: string,\n config: CollectionSubscriptionConfig,\n callback?: (entities: Entity[]) => void\n ): void {\n // Clean up existing subscription if any\n this.unsubscribe(subscriptionId);\n\n const collectionName = this.getCollectionName(config.path);\n const collection = this.db.collection(collectionName);\n\n // Build pipeline for change stream filtering\n const pipeline: Document[] = [];\n\n // Filter by operation types we care about\n pipeline.push({\n $match: {\n operationType: { $in: [\"insert\", \"update\", \"replace\", \"delete\"] }\n }\n });\n\n try {\n // Create change stream\n const changeStream = collection.watch(pipeline, {\n fullDocument: \"updateLookup\"\n });\n\n const subscription: Subscription = {\n type: \"collection\",\n config,\n changeStream,\n callback\n };\n\n this.subscriptions.set(subscriptionId, subscription);\n\n // Fetch initial data\n this.fetchAndNotifyCollection(subscriptionId, config, callback);\n\n // Listen for changes\n changeStream.on(\"change\", async (change: ChangeStreamDocument) => {\n // Re-fetch the entire collection when any change happens\n // This is simpler and ensures consistent sorting/filtering\n await this.fetchAndNotifyCollection(subscriptionId, config, callback);\n });\n\n changeStream.on(\"error\", (error: Error) => {\n console.error(`Change stream error for subscription ${subscriptionId}:`, error);\n });\n\n } catch (error) {\n // Change streams might not be available (e.g., standalone MongoDB)\n console.warn(\"Change streams not available, falling back to polling:\", error);\n\n // Store subscription without change stream for manual notifications\n const subscription: Subscription = {\n type: \"collection\",\n config,\n callback\n };\n\n this.subscriptions.set(subscriptionId, subscription);\n\n // Fetch initial data\n this.fetchAndNotifyCollection(subscriptionId, config, callback);\n }\n }\n\n /**\n * Fetch collection and notify callback\n */\n private async fetchAndNotifyCollection(\n subscriptionId: string,\n config: CollectionSubscriptionConfig,\n callback?: (entities: Entity[]) => void\n ): Promise<void> {\n try {\n const entities = await this.entityService.fetchCollection(config.path, {\n filter: config.filter as FilterValues<string> | undefined,\n orderBy: config.orderBy,\n order: config.order,\n limit: config.limit,\n startAfter: config.startAfter,\n searchString: config.searchString\n });\n\n if (callback) {\n callback(entities);\n }\n } catch (error) {\n console.error(`Error fetching collection for subscription ${subscriptionId}:`, error);\n }\n }\n\n /**\n * Subscribe to single entity changes\n */\n subscribeToEntity(\n subscriptionId: string,\n config: EntitySubscriptionConfig,\n callback?: (entity: Entity | null) => void\n ): void {\n // Clean up existing subscription if any\n this.unsubscribe(subscriptionId);\n\n const collectionName = this.getCollectionName(config.path);\n const collection = this.db.collection(collectionName);\n\n // Build pipeline to watch specific document\n const entityId = typeof config.entityId === \"string\" && ObjectId.isValid(config.entityId)\n ? new ObjectId(config.entityId)\n : config.entityId;\n\n const pipeline: Document[] = [\n {\n $match: {\n \"documentKey._id\": entityId,\n operationType: { $in: [\"insert\", \"update\", \"replace\", \"delete\"] }\n }\n }\n ];\n\n try {\n const changeStream = collection.watch(pipeline, {\n fullDocument: \"updateLookup\"\n });\n\n const subscription: Subscription = {\n type: \"entity\",\n config,\n changeStream,\n callback\n };\n\n this.subscriptions.set(subscriptionId, subscription);\n\n // Fetch initial data\n this.fetchAndNotifyEntity(subscriptionId, config, callback);\n\n // Listen for changes\n changeStream.on(\"change\", async (change: ChangeStreamDocument) => {\n if (change.operationType === \"delete\") {\n if (callback) {\n callback(null);\n }\n } else {\n await this.fetchAndNotifyEntity(subscriptionId, config, callback);\n }\n });\n\n changeStream.on(\"error\", (error: Error) => {\n console.error(`Change stream error for subscription ${subscriptionId}:`, error);\n });\n\n } catch (error) {\n console.warn(\"Change streams not available, falling back to polling:\", error);\n\n const subscription: Subscription = {\n type: \"entity\",\n config,\n callback\n };\n\n this.subscriptions.set(subscriptionId, subscription);\n\n // Fetch initial data\n this.fetchAndNotifyEntity(subscriptionId, config, callback);\n }\n }\n\n /**\n * Fetch entity and notify callback\n */\n private async fetchAndNotifyEntity(\n subscriptionId: string,\n config: EntitySubscriptionConfig,\n callback?: (entity: Entity | null) => void\n ): Promise<void> {\n try {\n const entity = await this.entityService.fetchEntity(config.path, config.entityId);\n\n if (callback) {\n callback(entity || null);\n }\n } catch (error) {\n console.error(`Error fetching entity for subscription ${subscriptionId}:`, error);\n }\n }\n\n /**\n * Unsubscribe from a subscription\n */\n unsubscribe(subscriptionId: string): void {\n const subscription = this.subscriptions.get(subscriptionId);\n if (subscription) {\n if (subscription.changeStream) {\n subscription.changeStream.close().catch(console.error);\n }\n this.subscriptions.delete(subscriptionId);\n }\n }\n\n /**\n * Notify all relevant subscribers of an entity update\n * This is called after save/delete operations to push updates\n */\n async notifyEntityUpdate(\n path: string,\n entityId: string,\n entity: Entity | null,\n _databaseId?: string\n ): Promise<void> {\n // Find all subscriptions that might be affected by this update\n for (const [subscriptionId, subscription] of this.subscriptions) {\n if (subscription.type === \"entity\") {\n const config = subscription.config as EntitySubscriptionConfig;\n if (config.path === path && config.entityId.toString() === entityId) {\n if (subscription.callback) {\n subscription.callback(entity);\n }\n }\n } else if (subscription.type === \"collection\") {\n const config = subscription.config as CollectionSubscriptionConfig;\n if (config.path === path) {\n // Re-fetch the collection to get updated data\n await this.fetchAndNotifyCollection(subscriptionId, config, subscription.callback);\n }\n }\n }\n }\n\n /**\n * Get all active subscriptions (for debugging)\n */\n getSubscriptions(): Map<string, Subscription> {\n return this.subscriptions;\n }\n\n /**\n * Close all subscriptions\n */\n async closeAll(): Promise<void> {\n for (const [subscriptionId] of this.subscriptions) {\n this.unsubscribe(subscriptionId);\n }\n }\n}\n","/**\n * MongoDB DataDriver Delegate\n *\n * Implements the DataDriver interface for Rebase frontend integration.\n * This is the main entry point for Rebase to interact with MongoDB.\n */\n\nimport { Db, ObjectId } from \"mongodb\";\nimport {\n DataDriver,\n DeleteEntityProps,\n Entity,\n EntityCollection,\n FetchCollectionProps,\n FetchEntityProps,\n ListenCollectionProps,\n ListenEntityProps,\n SaveEntityProps\n} from \"@rebasepro/types\";\nimport { MongoEntityService } from \"../db/MongoEntityService\";\nimport { MongoRealtimeService } from \"./MongoRealtimeService\";\n\n/**\n * MongoDB DataDriver Delegate\n *\n * Implements the DataDriver interface for Rebase.\n * Provides all data operations needed by the Rebase frontend.\n */\nexport class MongoDriver implements DataDriver {\n key = \"mongodb\";\n initialised = true;\n\n private entityService: MongoEntityService;\n private realtimeService: MongoRealtimeService;\n\n\n constructor(\n private db: Db,\n realtimeService?: MongoRealtimeService\n ) {\n this.entityService = new MongoEntityService(db);\n this.realtimeService = realtimeService ?? new MongoRealtimeService(db);\n }\n\n\n\n /**\n * Get the current timestamp\n */\n currentTime(): Date {\n return new Date();\n }\n\n /**\n * Fetch a collection of entities\n */\n async fetchCollection<M extends Record<string, any>>({\n path,\n collection,\n filter,\n limit,\n startAfter,\n orderBy,\n searchString,\n order\n }: FetchCollectionProps<M>): Promise<Entity<M>[]> {\n return this.entityService.fetchCollection<M>(path, {\n filter,\n limit,\n startAfter,\n orderBy,\n order,\n searchString,\n collection: collection as unknown as EntityCollection\n });\n }\n\n /**\n * Listen to collection changes\n */\n listenCollection<M extends Record<string, any>>({\n path,\n collection,\n filter,\n limit,\n startAfter,\n orderBy,\n searchString,\n order,\n onUpdate,\n onError\n }: ListenCollectionProps<M>): () => void {\n const subscriptionId = this.generateSubscriptionId();\n\n const callback = (entities: Entity<any>[]) => {\n try {\n onUpdate(entities as Entity<M>[]);\n } catch (error) {\n console.error(\"Error in collection update callback:\", error);\n if (onError) {\n onError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n };\n\n this.realtimeService.subscribeToCollection(\n subscriptionId,\n {\n clientId: \"driver\",\n path,\n filter,\n orderBy,\n order,\n limit,\n startAfter,\n searchString\n },\n callback\n );\n\n // Return unsubscribe function\n return () => {\n this.realtimeService.unsubscribe(subscriptionId);\n };\n }\n\n /**\n * Fetch a single entity\n */\n async fetchEntity<M extends Record<string, any>>({\n path,\n entityId,\n databaseId,\n collection\n }: FetchEntityProps<M>): Promise<Entity<M> | undefined> {\n return this.entityService.fetchEntity<M>(path, entityId, databaseId);\n }\n\n /**\n * Listen to entity changes\n */\n listenEntity<M extends Record<string, any>>({\n path,\n entityId,\n collection,\n onUpdate,\n onError\n }: ListenEntityProps<M>): () => void {\n const subscriptionId = this.generateSubscriptionId();\n\n const callback = (entity: Entity<any> | null) => {\n try {\n onUpdate(entity as Entity<M>);\n } catch (error) {\n console.error(\"Error in entity update callback:\", error);\n if (onError) {\n onError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n };\n\n this.realtimeService.subscribeToEntity(\n subscriptionId,\n {\n clientId: \"driver\",\n path,\n entityId\n },\n callback\n );\n\n // Return unsubscribe function\n return () => {\n this.realtimeService.unsubscribe(subscriptionId);\n };\n }\n\n /**\n * Save an entity (create or update)\n */\n async saveEntity<M extends Record<string, any>>({\n path,\n entityId,\n values,\n collection,\n status\n }: SaveEntityProps<M>): Promise<Entity<M>> {\n const entity = await this.entityService.saveEntity<M>(path, values, entityId);\n\n // Notify subscribers of the update\n await this.realtimeService.notifyEntityUpdate(path, String(entity.id), entity);\n\n return entity;\n }\n\n /**\n * Delete an entity\n */\n async deleteEntity<M extends Record<string, any>>({\n entity,\n collection\n }: DeleteEntityProps<M>): Promise<void> {\n await this.entityService.deleteEntity(entity.path, entity.id);\n\n // Notify subscribers of the deletion\n await this.realtimeService.notifyEntityUpdate(entity.path, String(entity.id), null);\n }\n\n /**\n * Check if a field value is unique\n */\n async checkUniqueField(\n path: string,\n name: string,\n value: any,\n entityId?: string,\n collection?: EntityCollection\n ): Promise<boolean> {\n return this.entityService.checkUniqueField(path, name, value, entityId);\n }\n\n /**\n * Generate a new entity ID\n */\n generateEntityId(path: string, collection?: EntityCollection): string {\n return this.entityService.generateEntityId();\n }\n\n /**\n * Count entities in a collection\n */\n async countEntities<M extends Record<string, any>>({\n path,\n collection,\n filter\n }: FetchCollectionProps<M>): Promise<number> {\n return this.entityService.countEntities<M>(path, { filter });\n }\n\n /**\n * Generate a unique subscription ID\n */\n private generateSubscriptionId(): string {\n return `mongo_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n }\n\n /**\n * Check if the delegate is ready\n */\n isReady(): boolean {\n return this.initialised;\n }\n\n /**\n * Get the underlying entity service for direct access\n */\n getEntityService(): MongoEntityService {\n return this.entityService;\n }\n\n /**\n * Get the underlying realtime service for direct access\n */\n getRealtimeService(): MongoRealtimeService {\n return this.realtimeService;\n }\n}\n","/**\n * MongoDB Backend Factory\n *\n * This module provides factory functions for creating MongoDB backend instances.\n * It abstracts the creation of drivers, realtime services, and entity services.\n */\n\nimport { Db, MongoClient } from \"mongodb\";\nimport { DataDriver, EntityCollection } from \"@rebasepro/types\";\n\nimport { MongoEntityService } from \"./db/MongoEntityService\";\nimport { MongoRealtimeService } from \"./services/MongoRealtimeService\";\nimport { MongoDriver } from \"./services/MongoDriver\";\nimport { MongoDBConnection } from \"./connection\";\nimport { BackendConfig, BackendInstance, CollectionRegistryInterface, EntityRepository, RealtimeProvider, DatabaseConnection, DatabaseAdmin, DocumentAdmin, SchemaAdmin, HealthCheckResult } from \"@rebasepro/types\";\n\n/**\n * Configuration for creating a MongoDB backend.\n */\nexport interface MongoBackendConfig extends BackendConfig {\n type: \"mongodb\";\n /** MongoDB database instance */\n connection: Db;\n /** MongoDB client (for connection management) */\n client: MongoClient;\n /** Collections to register (optional, can be registered later) */\n collections?: EntityCollection[];\n}\n\n/**\n * MongoDB-specific backend instance with additional MongoDB types.\n */\nexport interface MongoBackendInstance extends BackendInstance {\n /** The MongoDB database instance */\n db: Db;\n /** The MongoDB client */\n client: MongoClient;\n /** MongoDB DataDriver for use with Rebase */\n driver: DataDriver;\n /** Entity service for direct database operations */\n entityService: MongoEntityService;\n /** Realtime service for subscriptions */\n realtimeService: MongoRealtimeService;\n /** Admin capabilities (DocumentAdmin + SchemaAdmin) */\n admin: DatabaseAdmin;\n}\n\n// =============================================================================\n// Simple Collection Registry\n// =============================================================================\n\n/**\n * Simple in-memory collection registry for MongoDB.\n */\nexport class MongoCollectionRegistry implements CollectionRegistryInterface {\n private collections = new Map<string, EntityCollection>();\n\n /**\n * Register a collection\n */\n register(collection: EntityCollection): void {\n this.collections.set(collection.name, collection);\n }\n\n /**\n * Get a collection by its path\n */\n getCollectionByPath(path: string): EntityCollection | undefined {\n return this.collections.get(path);\n }\n\n /**\n * Get all registered collections\n */\n getCollections(): EntityCollection[] {\n return Array.from(this.collections.values());\n }\n}\n\n// =============================================================================\n// Factory Functions\n// =============================================================================\n\n/**\n * Create a complete MongoDB backend instance.\n *\n * This factory function creates all the necessary services for a MongoDB backend:\n * - MongoDBConnection (database connection wrapper)\n * - MongoEntityService (implements EntityRepository)\n * - MongoRealtimeService (implements RealtimeProvider)\n * - MongoCollectionRegistry (implements CollectionRegistryInterface)\n * - MongoDriver (for Rebase integration)\n *\n * @example\n * ```typescript\n * import { createMongoBackend } from \"@rebasepro/server-mongodb\";\n *\n * const client = new MongoClient(\"mongodb://localhost:27017\");\n * await client.connect();\n * const db = client.db(\"my_database\");\n *\n * const backend = createMongoBackend({\n * type: \"mongodb\",\n * connection: db,\n * client: client,\n * collections: myCollections\n * });\n *\n * // Use the backend\n * const entities = await backend.entityRepository.fetchCollection(\"users\", {});\n * ```\n */\nexport function createMongoBackend(config: MongoBackendConfig): MongoBackendInstance {\n const { connection: db, client, collections } = config;\n\n // Create collection registry\n const collectionRegistry = new MongoCollectionRegistry();\n\n // Register collections if provided\n if (collections) {\n collections.forEach(collection => collectionRegistry.register(collection));\n }\n\n // Create services\n const entityService = new MongoEntityService(db);\n const realtimeService = new MongoRealtimeService(db);\n const driver = new MongoDriver(db, realtimeService);\n const mongoConnection = new MongoDBConnection(db, client);\n\n // Build admin capabilities for MongoDB\n const admin: DatabaseAdmin = {\n async executeAggregate(pipeline: Record<string, unknown>[]) {\n // Run aggregation on a collection — requires a target collection \n // from the pipeline's $match or $lookup stage:\n const firstStage = pipeline[0];\n const collName = (firstStage as any)?.$from ?? \"__admin__\";\n const cursor = db.collection(collName).aggregate(pipeline);\n return await cursor.toArray() as Record<string, unknown>[];\n },\n async fetchCollectionStats(collectionName: string) {\n const stats = await db.command({ collStats: collectionName }) as { count: number; size: number };\n return { count: stats.count, sizeBytes: stats.size };\n },\n async fetchUnmappedTables(mappedPaths?: string[]) {\n const allCollections = await db.listCollections().toArray();\n const names = allCollections.map(c => c.name).filter(n => !n.startsWith(\"system.\"));\n if (!mappedPaths || mappedPaths.length === 0) return names;\n const mappedSet = new Set(mappedPaths.map(p => p.toLowerCase()));\n return names.filter(n => !mappedSet.has(n.toLowerCase()));\n },\n async fetchTableMetadata(collectionName: string) {\n // Sample a document to infer fields\n const sample = await db.collection(collectionName).findOne();\n if (!sample) return { columns: [], foreignKeys: [], junctions: [], policies: [] };\n const columns = Object.entries(sample).map(([key, value]) => ({\n column_name: key,\n data_type: typeof value,\n udt_name: typeof value,\n is_nullable: \"YES\",\n column_default: null,\n character_maximum_length: null,\n }));\n return { columns, foreignKeys: [], junctions: [], policies: [] };\n },\n } satisfies DocumentAdmin & SchemaAdmin;\n\n return {\n // Abstract interface implementations\n connection: mongoConnection,\n entityRepository: entityService,\n realtimeProvider: realtimeService,\n collectionRegistry: collectionRegistry,\n admin,\n\n // Lifecycle\n async initialize() {\n // Connection is already established via the MongoClient constructor\n },\n async healthCheck(): Promise<HealthCheckResult> {\n const start = Date.now();\n try {\n await db.command({ ping: 1 });\n return { healthy: true, latencyMs: Date.now() - start };\n } catch {\n return { healthy: false, latencyMs: Date.now() - start };\n }\n },\n async destroy() {\n await client.close();\n },\n\n // MongoDB-specific accessors\n db,\n client,\n driver,\n entityService,\n realtimeService\n };\n}\n\n/**\n * Create a MongoDB DataDriver.\n *\n * This is a convenience function when you only need the DataDriver\n * without the full backend instance.\n *\n * @example\n * ```typescript\n * import { createMongoDelegate } from \"@rebasepro/server-mongodb\";\n *\n * const delegate = createMongoDelegate(db);\n * ```\n */\nexport function createMongoDelegate(\n db: Db,\n realtimeService?: MongoRealtimeService\n): MongoDriver {\n const realtime = realtimeService ?? new MongoRealtimeService(db);\n return new MongoDriver(db, realtime);\n}\n\n/**\n * Create a RealtimeService for MongoDB.\n *\n * @example\n * ```typescript\n * import { createMongoRealtimeService } from \"@rebasepro/server-mongodb\";\n *\n * const realtimeService = createMongoRealtimeService(db);\n * ```\n */\nexport function createMongoRealtimeService(db: Db): MongoRealtimeService {\n return new MongoRealtimeService(db);\n}\n\n/**\n * Create a MongoDB entity repository.\n *\n * @example\n * ```typescript\n * import { createMongoEntityRepository } from \"@rebasepro/server-mongodb\";\n *\n * const repository = createMongoEntityRepository(db);\n * const users = await repository.fetchCollection(\"users\", {});\n * ```\n */\nexport function createMongoEntityRepository(db: Db): EntityRepository {\n return new MongoEntityService(db);\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Check if a backend config is for MongoDB.\n */\nexport function isMongoBackendConfig(config: BackendConfig): config is MongoBackendConfig {\n return config.type === \"mongodb\" &&\n typeof (config as MongoBackendConfig).connection !== \"undefined\" &&\n typeof (config as MongoBackendConfig).client !== \"undefined\";\n}\n\n/**\n * Check if a driver config is for MongoDB.\n */\nexport function isMongoDriverConfig(obj: unknown): obj is { type: \"mongodb\"; connection: Db; client: MongoClient } {\n return typeof obj === \"object\" &&\n obj !== null &&\n \"type\" in obj &&\n (obj as Record<string, unknown>).type === \"mongodb\" &&\n \"connection\" in obj &&\n \"client\" in obj;\n}\n"],"names":[],"mappings":";AAYO,MAAM,kBAAgD;AAAA,EAGzD,YACoB,IACA,QAClB;AAFkB,SAAA,KAAA;AACA,SAAA,SAAA;AAAA,EAChB;AAAA,EALK,OAAO;AAAA,EAOhB,IAAI,cAAuB;AAGvB,QAAI;AACA,YAAM,iBAAiB,KAAK;AAC5B,aAAO,eAAe,UAAU,cAAA,KAAmB;AAAA,IACvD,QAAQ;AACJ,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEA,MAAM,QAAuB;AACzB,UAAM,KAAK,OAAO,MAAA;AAAA,EACtB;AACJ;AAiBA,eAAsB,wBAClB,kBACA,cAC0B;AAC1B,QAAM,SAAS,IAAI,YAAY,gBAAgB;AAC/C,QAAM,OAAO,QAAA;AACb,QAAM,KAAK,OAAO,GAAG,YAAY;AACjC,SAAO,IAAI,kBAAkB,IAAI,MAAM;AAC3C;AC/CA,MAAM,qBAAoD;AAAA,EACtD,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,MAAM;AAAA,EACN,UAAU;AACd;AAQO,MAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO/B,OAAO,sBACH,QACkB;AAClB,QAAI,CAAC,OAAQ,QAAO,CAAA;AAEpB,UAAM,aAAiC,CAAA;AAEvC,eAAW,CAAC,OAAO,WAAW,KAAK,OAAO,QAAQ,MAAM,GAAG;AACvD,UAAI,CAAC,YAAa;AAElB,YAAM,CAAC,IAAI,KAAK,IAAI;AACpB,YAAM,UAAU,mBAAmB,EAAE;AAErC,UAAI,CAAC,SAAS;AACV,gBAAQ,KAAK,gCAAgC,EAAE,EAAE;AACjD;AAAA,MACJ;AAGA,UAAI,OAAO,kBAAkB;AACzB,mBAAW,KAAK;AAAA,UACZ,CAAC,KAAK,GAAG,EAAE,YAAY,EAAE,KAAK,QAAM;AAAA,QAAE,CACzC;AAAA,MACL,OAAO;AACH,mBAAW,KAAK;AAAA,UACZ,CAAC,KAAK,GAAG,EAAE,CAAC,OAAO,GAAG,MAAA;AAAA,QAAM,CAC/B;AAAA,MACL;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,sBACH,cACA,YACkB;AAClB,QAAI,CAAC,aAAc,QAAO,CAAA;AAG1B,UAAM,eAAmC,CAAA;AACzC,UAAM,cAAc,IAAI,OAAO,cAAc,GAAG;AAEhD,eAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,UAAU,GAAG;AAElD,UAAI,MAAM,aAAa,YAAY,OAAO,SAAS,UAAU;AACzD,qBAAa,KAAK;AAAA,UACd,CAAC,GAAG,GAAG,EAAE,QAAQ,YAAA;AAAA,QAAY,CAChC;AAAA,MACL;AAAA,IACJ;AAGA,QAAI,aAAa,WAAW,GAAG;AAC3B,aAAO,CAAC,EAAE,OAAO,EAAE,SAAS,aAAA,GAAgB;AAAA,IAChD;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,yBAAyB,YAA8D;AAC1F,QAAI,WAAW,WAAW,EAAG,QAAO;AACpC,QAAI,WAAW,WAAW,EAAG,QAAO,WAAW,CAAC;AAChD,WAAO,EAAE,MAAM,WAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,wBAAwB,YAA8D;AACzF,QAAI,WAAW,WAAW,EAAG,QAAO;AACpC,QAAI,WAAW,WAAW,EAAG,QAAO,WAAW,CAAC;AAChD,WAAO,EAAE,KAAK,WAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,WAA0C,SAI5B;AACjB,UAAM,aAAiC,CAAA;AAGvC,QAAI,QAAQ,QAAQ;AAChB,YAAM,mBAAmB,KAAK,sBAAyB,QAAQ,MAAM;AACrE,iBAAW,KAAK,GAAG,gBAAgB;AAAA,IACvC;AAGA,QAAI,QAAQ,gBAAgB,QAAQ,YAAY;AAC5C,YAAM,mBAAmB,KAAK;AAAA,QAC1B,QAAQ;AAAA,QACR,QAAQ;AAAA,MAAA;AAEZ,UAAI,iBAAiB,SAAS,GAAG;AAE7B,cAAM,eAAe,KAAK,wBAAwB,gBAAgB;AAClE,YAAI,cAAc;AACd,qBAAW,KAAK,YAAY;AAAA,QAChC;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO,KAAK,yBAAyB,UAAU,KAAK,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,UACH,SACA,OACkC;AAClC,QAAI,CAAC,QAAS,QAAO;AACrB,WAAO,EAAE,CAAC,OAAO,GAAG,UAAU,SAAS,KAAK,EAAA;AAAA,EAChD;AACJ;ACnKO,MAAM,mBAA+C;AAAA,EACxD,YAAoB,IAAQ;AAAR,SAAA,KAAA;AAAA,EAAU;AAAA;AAAA;AAAA;AAAA,EAKtB,cAAc,gBAA8C;AAEhE,UAAM,iBAAiB,eAAe,QAAQ,OAAO,GAAG;AACxD,WAAO,KAAK,GAAG,WAAW,cAAc;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,IAAiD;AAChE,QAAI,OAAO,OAAO,YAAY,SAAS,QAAQ,EAAE,KAAK,GAAG,WAAW,IAAI;AACpE,aAAO,IAAI,SAAS,EAAE;AAAA,IAC1B;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKQ,iBACJ,KACA,MACS;AACT,UAAM,EAAE,KAAK,GAAG,OAAA,IAAW;AAC3B,WAAO;AAAA,MACH,IAAI,IAAI,SAAA;AAAA,MACR;AAAA,MACA,QAAQ,KAAK,uBAAuB,MAAM;AAAA,IAAA;AAAA,EAElD;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,QAAkD;AAC7E,UAAM,SAA8B,CAAA;AAEpC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC/C,aAAO,GAAG,IAAI,KAAK,sBAAsB,KAAK;AAAA,IAClD;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,OAAiB;AAC3C,QAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAGlD,QAAI,iBAAiB,UAAU;AAC3B,aAAO,MAAM,SAAA;AAAA,IACjB;AAGA,QAAI,iBAAiB,MAAM;AACvB,aAAO;AAAA,IACX;AAGA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,aAAO,MAAM,IAAI,CAAA,MAAK,KAAK,sBAAsB,CAAC,CAAC;AAAA,IACvD;AAGA,QAAI,OAAO,UAAU,YAAY,UAAU,SAAS,QAAQ,OAAO;AAC/D,aAAO;AAAA,QACH,MAAM,MAAM;AAAA,QACZ,IAAI,MAAM,cAAc,WAAW,MAAM,GAAG,SAAA,IAAa,MAAM;AAAA,MAAA;AAAA,IAEvE;AAGA,QAAI,OAAO,UAAU,UAAU;AAC3B,aAAO,KAAK,uBAAuB,KAAK;AAAA,IAC5C;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,QAAkD;AAC3E,UAAM,SAA8B,CAAA;AAEpC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC/C,aAAO,GAAG,IAAI,KAAK,oBAAoB,KAAK;AAAA,IAChD;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,OAAiB;AACzC,QAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAGlD,QAAI,OAAO,UAAU,YAAY,MAAM,uBAAuB;AAC1D,aAAO;AAAA,QACH,IAAI,SAAS,QAAQ,MAAM,EAAE,IAAI,IAAI,SAAS,MAAM,EAAE,IAAI,MAAM;AAAA,QAChE,MAAM,MAAM;AAAA,MAAA;AAAA,IAEpB;AAGA,QAAI,iBAAiB,MAAM;AACvB,aAAO;AAAA,IACX;AAGA,QAAI,MAAM,QAAQ,KAAK,GAAG;AACtB,aAAO,MAAM,IAAI,CAAA,MAAK,KAAK,oBAAoB,CAAC,CAAC;AAAA,IACrD;AAGA,QAAI,OAAO,UAAU,UAAU;AAC3B,aAAO,KAAK,qBAAqB,KAAK;AAAA,IAC1C;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YACF,gBACA,UACA,aAC8B;AAC9B,UAAM,aAAa,KAAK,cAAc,cAAc;AACpD,UAAM,KAAK,KAAK,WAAW,QAAQ;AAEnC,UAAM,MAAM,MAAM,WAAW,QAAQ,EAAE,KAAK,IAAwB;AAEpE,QAAI,CAAC,IAAK,QAAO;AAEjB,WAAO,KAAK,iBAAoB,KAAK,cAAc;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACF,gBACA,UASI,IACgB;AACpB,UAAM,aAAa,KAAK,cAAc,cAAc;AAGpD,UAAM,QAAQ,sBAAsB,WAAc;AAAA,MAC9C,QAAQ,QAAQ;AAAA,MAChB,cAAc,QAAQ;AAAA,MACtB,YAAY,QAAQ,YAAY,cAAc,CAAA;AAAA,IAAC,CAClD;AAGD,UAAM,cAAqC,CAAA;AAG3C,UAAM,OAAO,sBAAsB,UAAU,QAAQ,SAAS,QAAQ,KAAK;AAC3E,QAAI,MAAM;AACN,kBAAY,OAAO;AAAA,IACvB;AAGA,QAAI,QAAQ,OAAO;AACf,kBAAY,QAAQ,QAAQ;AAAA,IAChC;AAGA,QAAI,QAAQ,eAAe,QAAW;AAClC,kBAAY,OAAO,OAAO,QAAQ,UAAU;AAAA,IAChD;AAEA,UAAM,OAAO,MAAM,WAAW,KAAK,OAAO,WAAW,EAAE,QAAA;AAEvD,WAAO,KAAK,IAAI,CAAC,QAAkB,KAAK,iBAAoB,KAAK,cAAc,CAAC;AAAA,EACpF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACF,gBACA,cACA,UAOI,CAAA,GACgB;AACpB,WAAO,KAAK,gBAAmB,gBAAgB;AAAA,MAC3C,GAAG;AAAA,MACH;AAAA,IAAA,CACH;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cACF,gBACA,UAGI,IACW;AACf,UAAM,aAAa,KAAK,cAAc,cAAc;AAEpD,UAAM,QAAQ,QAAQ,SAChB,sBAAsB,WAAc,EAAE,QAAQ,QAAQ,OAAA,CAAQ,IAC9D,CAAA;AAEN,WAAO,WAAW,eAAe,KAAK;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACF,gBACA,QACA,UACA,aACkB;AAClB,UAAM,aAAa,KAAK,cAAc,cAAc;AACpD,UAAM,cAAc,KAAK,qBAAqB,MAA6B;AAE3E,QAAI,UAAU;AAEV,YAAM,KAAK,KAAK,WAAW,QAAQ;AACnC,YAAM,WAAW;AAAA,QACb,EAAE,KAAK,GAAA;AAAA,QACP,EAAE,MAAM,YAAA;AAAA,QACR,EAAE,QAAQ,KAAA;AAAA,MAAK;AAGnB,aAAO;AAAA,QACH,IAAI,SAAS,SAAA;AAAA,QACb,MAAM;AAAA,QACN;AAAA,MAAA;AAAA,IAER,OAAO;AAEH,YAAM,QAAQ,IAAI,SAAA;AAClB,YAAM,WAAW,UAAU;AAAA,QACvB,KAAK;AAAA,QACL,GAAG;AAAA,MAAA,CACN;AAED,aAAO;AAAA,QACH,IAAI,MAAM,SAAA;AAAA,QACV,MAAM;AAAA,QACN;AAAA,MAAA;AAAA,IAER;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aACF,gBACA,UACA,aACa;AACb,UAAM,aAAa,KAAK,cAAc,cAAc;AACpD,UAAM,KAAK,KAAK,WAAW,QAAQ;AAEnC,UAAM,SAAS,MAAM,WAAW,UAAU,EAAE,KAAK,IAAwB;AAEzE,QAAI,OAAO,iBAAiB,GAAG;AAC3B,cAAQ,KAAK,UAAU,QAAQ,4BAA4B,cAAc,EAAE;AAAA,IAC/E;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBACF,gBACA,WACA,OACA,iBACA,aACgB;AAChB,UAAM,aAAa,KAAK,cAAc,cAAc;AAEpD,UAAM,QAA0B,EAAE,CAAC,SAAS,GAAG,MAAA;AAE/C,QAAI,iBAAiB;AACjB,YAAM,KAAK,KAAK,WAAW,eAAe;AACzC,YAAkC,MAAM,EAAE,KAAK,GAAA;AAAA,IACpD;AAEA,UAAM,QAAQ,MAAM,WAAW,eAAe,KAAK;AACnD,WAAO,UAAU;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,mBAA2B;AACvB,WAAO,IAAI,SAAA,EAAW,SAAA;AAAA,EAC1B;AACJ;AC/TO,MAAM,qBAAiD;AAAA,EAI1D,YAAoB,IAAQ;AAAR,SAAA,KAAA;AAChB,SAAK,gBAAgB,IAAI,mBAAmB,EAAE;AAAA,EAClD;AAAA,EALQ,oCAAoB,IAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EASA,kBAAkB,MAAsB;AAC5C,WAAO,KAAK,QAAQ,OAAO,GAAG;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,sBACI,gBACA,QACA,UACI;AAEJ,SAAK,YAAY,cAAc;AAE/B,UAAM,iBAAiB,KAAK,kBAAkB,OAAO,IAAI;AACzD,UAAM,aAAa,KAAK,GAAG,WAAW,cAAc;AAGpD,UAAM,WAAuB,CAAA;AAG7B,aAAS,KAAK;AAAA,MACV,QAAQ;AAAA,QACJ,eAAe,EAAE,KAAK,CAAC,UAAU,UAAU,WAAW,QAAQ,EAAA;AAAA,MAAE;AAAA,IACpE,CACH;AAED,QAAI;AAEA,YAAM,eAAe,WAAW,MAAM,UAAU;AAAA,QAC5C,cAAc;AAAA,MAAA,CACjB;AAED,YAAM,eAA6B;AAAA,QAC/B,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAGJ,WAAK,cAAc,IAAI,gBAAgB,YAAY;AAGnD,WAAK,yBAAyB,gBAAgB,QAAQ,QAAQ;AAG9D,mBAAa,GAAG,UAAU,OAAO,WAAiC;AAG9D,cAAM,KAAK,yBAAyB,gBAAgB,QAAQ,QAAQ;AAAA,MACxE,CAAC;AAED,mBAAa,GAAG,SAAS,CAAC,UAAiB;AACvC,gBAAQ,MAAM,wCAAwC,cAAc,KAAK,KAAK;AAAA,MAClF,CAAC;AAAA,IAEL,SAAS,OAAO;AAEZ,cAAQ,KAAK,0DAA0D,KAAK;AAG5E,YAAM,eAA6B;AAAA,QAC/B,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MAAA;AAGJ,WAAK,cAAc,IAAI,gBAAgB,YAAY;AAGnD,WAAK,yBAAyB,gBAAgB,QAAQ,QAAQ;AAAA,IAClE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,yBACV,gBACA,QACA,UACa;AACb,QAAI;AACA,YAAM,WAAW,MAAM,KAAK,cAAc,gBAAgB,OAAO,MAAM;AAAA,QACnE,QAAQ,OAAO;AAAA,QACf,SAAS,OAAO;AAAA,QAChB,OAAO,OAAO;AAAA,QACd,OAAO,OAAO;AAAA,QACd,YAAY,OAAO;AAAA,QACnB,cAAc,OAAO;AAAA,MAAA,CACxB;AAED,UAAI,UAAU;AACV,iBAAS,QAAQ;AAAA,MACrB;AAAA,IACJ,SAAS,OAAO;AACZ,cAAQ,MAAM,8CAA8C,cAAc,KAAK,KAAK;AAAA,IACxF;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,kBACI,gBACA,QACA,UACI;AAEJ,SAAK,YAAY,cAAc;AAE/B,UAAM,iBAAiB,KAAK,kBAAkB,OAAO,IAAI;AACzD,UAAM,aAAa,KAAK,GAAG,WAAW,cAAc;AAGpD,UAAM,WAAW,OAAO,OAAO,aAAa,YAAY,SAAS,QAAQ,OAAO,QAAQ,IAClF,IAAI,SAAS,OAAO,QAAQ,IAC5B,OAAO;AAEb,UAAM,WAAuB;AAAA,MACzB;AAAA,QACI,QAAQ;AAAA,UACJ,mBAAmB;AAAA,UACnB,eAAe,EAAE,KAAK,CAAC,UAAU,UAAU,WAAW,QAAQ,EAAA;AAAA,QAAE;AAAA,MACpE;AAAA,IACJ;AAGJ,QAAI;AACA,YAAM,eAAe,WAAW,MAAM,UAAU;AAAA,QAC5C,cAAc;AAAA,MAAA,CACjB;AAED,YAAM,eAA6B;AAAA,QAC/B,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAGJ,WAAK,cAAc,IAAI,gBAAgB,YAAY;AAGnD,WAAK,qBAAqB,gBAAgB,QAAQ,QAAQ;AAG1D,mBAAa,GAAG,UAAU,OAAO,WAAiC;AAC9D,YAAI,OAAO,kBAAkB,UAAU;AACnC,cAAI,UAAU;AACV,qBAAS,IAAI;AAAA,UACjB;AAAA,QACJ,OAAO;AACH,gBAAM,KAAK,qBAAqB,gBAAgB,QAAQ,QAAQ;AAAA,QACpE;AAAA,MACJ,CAAC;AAED,mBAAa,GAAG,SAAS,CAAC,UAAiB;AACvC,gBAAQ,MAAM,wCAAwC,cAAc,KAAK,KAAK;AAAA,MAClF,CAAC;AAAA,IAEL,SAAS,OAAO;AACZ,cAAQ,KAAK,0DAA0D,KAAK;AAE5E,YAAM,eAA6B;AAAA,QAC/B,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MAAA;AAGJ,WAAK,cAAc,IAAI,gBAAgB,YAAY;AAGnD,WAAK,qBAAqB,gBAAgB,QAAQ,QAAQ;AAAA,IAC9D;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,qBACV,gBACA,QACA,UACa;AACb,QAAI;AACA,YAAM,SAAS,MAAM,KAAK,cAAc,YAAY,OAAO,MAAM,OAAO,QAAQ;AAEhF,UAAI,UAAU;AACV,iBAAS,UAAU,IAAI;AAAA,MAC3B;AAAA,IACJ,SAAS,OAAO;AACZ,cAAQ,MAAM,0CAA0C,cAAc,KAAK,KAAK;AAAA,IACpF;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,gBAA8B;AACtC,UAAM,eAAe,KAAK,cAAc,IAAI,cAAc;AAC1D,QAAI,cAAc;AACd,UAAI,aAAa,cAAc;AAC3B,qBAAa,aAAa,MAAA,EAAQ,MAAM,QAAQ,KAAK;AAAA,MACzD;AACA,WAAK,cAAc,OAAO,cAAc;AAAA,IAC5C;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,mBACF,MACA,UACA,QACA,aACa;AAEb,eAAW,CAAC,gBAAgB,YAAY,KAAK,KAAK,eAAe;AAC7D,UAAI,aAAa,SAAS,UAAU;AAChC,cAAM,SAAS,aAAa;AAC5B,YAAI,OAAO,SAAS,QAAQ,OAAO,SAAS,SAAA,MAAe,UAAU;AACjE,cAAI,aAAa,UAAU;AACvB,yBAAa,SAAS,MAAM;AAAA,UAChC;AAAA,QACJ;AAAA,MACJ,WAAW,aAAa,SAAS,cAAc;AAC3C,cAAM,SAAS,aAAa;AAC5B,YAAI,OAAO,SAAS,MAAM;AAEtB,gBAAM,KAAK,yBAAyB,gBAAgB,QAAQ,aAAa,QAAQ;AAAA,QACrF;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,mBAA8C;AAC1C,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAA0B;AAC5B,eAAW,CAAC,cAAc,KAAK,KAAK,eAAe;AAC/C,WAAK,YAAY,cAAc;AAAA,IACnC;AAAA,EACJ;AACJ;AC1QO,MAAM,YAAkC;AAAA,EAQ3C,YACY,IACR,iBACF;AAFU,SAAA,KAAA;AAGR,SAAK,gBAAgB,IAAI,mBAAmB,EAAE;AAC9C,SAAK,kBAAkB,mBAAmB,IAAI,qBAAqB,EAAE;AAAA,EACzE;AAAA,EAbA,MAAM;AAAA,EACN,cAAc;AAAA,EAEN;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,EAgBR,cAAoB;AAChB,+BAAW,KAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAA+C;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GAC8C;AAC9C,WAAO,KAAK,cAAc,gBAAmB,MAAM;AAAA,MAC/C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACH;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAgD;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GACqC;AACrC,UAAM,iBAAiB,KAAK,uBAAA;AAE5B,UAAM,WAAW,CAAC,aAA4B;AAC1C,UAAI;AACA,iBAAS,QAAuB;AAAA,MACpC,SAAS,OAAO;AACZ,gBAAQ,MAAM,wCAAwC,KAAK;AAC3D,YAAI,SAAS;AACT,kBAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,QACrE;AAAA,MACJ;AAAA,IACJ;AAEA,SAAK,gBAAgB;AAAA,MACjB;AAAA,MACA;AAAA,QACI,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,MAEJ;AAAA,IAAA;AAIJ,WAAO,MAAM;AACT,WAAK,gBAAgB,YAAY,cAAc;AAAA,IACnD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAA2C;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GACoD;AACpD,WAAO,KAAK,cAAc,YAAe,MAAM,UAAU,UAAU;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA,EAKA,aAA4C;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GACiC;AACjC,UAAM,iBAAiB,KAAK,uBAAA;AAE5B,UAAM,WAAW,CAAC,WAA+B;AAC7C,UAAI;AACA,iBAAS,MAAmB;AAAA,MAChC,SAAS,OAAO;AACZ,gBAAQ,MAAM,oCAAoC,KAAK;AACvD,YAAI,SAAS;AACT,kBAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,QACrE;AAAA,MACJ;AAAA,IACJ;AAEA,SAAK,gBAAgB;AAAA,MACjB;AAAA,MACA;AAAA,QACI,UAAU;AAAA,QACV;AAAA,QACA;AAAA,MAAA;AAAA,MAEJ;AAAA,IAAA;AAIJ,WAAO,MAAM;AACT,WAAK,gBAAgB,YAAY,cAAc;AAAA,IACnD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAA0C;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GACuC;AACvC,UAAM,SAAS,MAAM,KAAK,cAAc,WAAc,MAAM,QAAQ,QAAQ;AAG5E,UAAM,KAAK,gBAAgB,mBAAmB,MAAM,OAAO,OAAO,EAAE,GAAG,MAAM;AAE7E,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAA4C;AAAA,IAC9C;AAAA,IACA;AAAA,EAAA,GACoC;AACpC,UAAM,KAAK,cAAc,aAAa,OAAO,MAAM,OAAO,EAAE;AAG5D,UAAM,KAAK,gBAAgB,mBAAmB,OAAO,MAAM,OAAO,OAAO,EAAE,GAAG,IAAI;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBACF,MACA,MACA,OACA,UACA,YACgB;AAChB,WAAO,KAAK,cAAc,iBAAiB,MAAM,MAAM,OAAO,QAAQ;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,MAAc,YAAuC;AAClE,WAAO,KAAK,cAAc,iBAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAA6C;AAAA,IAC/C;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GACyC;AACzC,WAAO,KAAK,cAAc,cAAiB,MAAM,EAAE,QAAQ;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAAiC;AACrC,WAAO,SAAS,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA,EAKA,UAAmB;AACf,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAuC;AACnC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,qBAA2C;AACvC,WAAO,KAAK;AAAA,EAChB;AACJ;ACpNO,MAAM,wBAA+D;AAAA,EAChE,kCAAkB,IAAA;AAAA;AAAA;AAAA;AAAA,EAK1B,SAAS,YAAoC;AACzC,SAAK,YAAY,IAAI,WAAW,MAAM,UAAU;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,MAA4C;AAC5D,WAAO,KAAK,YAAY,IAAI,IAAI;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAqC;AACjC,WAAO,MAAM,KAAK,KAAK,YAAY,QAAQ;AAAA,EAC/C;AACJ;AAmCO,SAAS,mBAAmB,QAAkD;AACjF,QAAM,EAAE,YAAY,IAAI,QAAQ,gBAAgB;AAGhD,QAAM,qBAAqB,IAAI,wBAAA;AAG/B,MAAI,aAAa;AACb,gBAAY,QAAQ,CAAA,eAAc,mBAAmB,SAAS,UAAU,CAAC;AAAA,EAC7E;AAGA,QAAM,gBAAgB,IAAI,mBAAmB,EAAE;AAC/C,QAAM,kBAAkB,IAAI,qBAAqB,EAAE;AACnD,QAAM,SAAS,IAAI,YAAY,IAAI,eAAe;AAClD,QAAM,kBAAkB,IAAI,kBAAkB,IAAI,MAAM;AAGxD,QAAM,QAAuB;AAAA,IACzB,MAAM,iBAAiB,UAAqC;AAGxD,YAAM,aAAa,SAAS,CAAC;AAC7B,YAAM,WAAY,YAAoB,SAAS;AAC/C,YAAM,SAAS,GAAG,WAAW,QAAQ,EAAE,UAAU,QAAQ;AACzD,aAAO,MAAM,OAAO,QAAA;AAAA,IACxB;AAAA,IACA,MAAM,qBAAqB,gBAAwB;AAC/C,YAAM,QAAQ,MAAM,GAAG,QAAQ,EAAE,WAAW,gBAAgB;AAC5D,aAAO,EAAE,OAAO,MAAM,OAAO,WAAW,MAAM,KAAA;AAAA,IAClD;AAAA,IACA,MAAM,oBAAoB,aAAwB;AAC9C,YAAM,iBAAiB,MAAM,GAAG,gBAAA,EAAkB,QAAA;AAClD,YAAM,QAAQ,eAAe,IAAI,CAAA,MAAK,EAAE,IAAI,EAAE,OAAO,CAAA,MAAK,CAAC,EAAE,WAAW,SAAS,CAAC;AAClF,UAAI,CAAC,eAAe,YAAY,WAAW,EAAG,QAAO;AACrD,YAAM,YAAY,IAAI,IAAI,YAAY,IAAI,CAAA,MAAK,EAAE,YAAA,CAAa,CAAC;AAC/D,aAAO,MAAM,OAAO,CAAA,MAAK,CAAC,UAAU,IAAI,EAAE,YAAA,CAAa,CAAC;AAAA,IAC5D;AAAA,IACA,MAAM,mBAAmB,gBAAwB;AAE7C,YAAM,SAAS,MAAM,GAAG,WAAW,cAAc,EAAE,QAAA;AACnD,UAAI,CAAC,OAAQ,QAAO,EAAE,SAAS,CAAA,GAAI,aAAa,CAAA,GAAI,WAAW,IAAI,UAAU,CAAA,EAAC;AAC9E,YAAM,UAAU,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,QAC1D,aAAa;AAAA,QACb,WAAW,OAAO;AAAA,QAClB,UAAU,OAAO;AAAA,QACjB,aAAa;AAAA,QACb,gBAAgB;AAAA,QAChB,0BAA0B;AAAA,MAAA,EAC5B;AACF,aAAO,EAAE,SAAS,aAAa,CAAA,GAAI,WAAW,CAAA,GAAI,UAAU,GAAC;AAAA,IACjE;AAAA,EAAA;AAGJ,SAAO;AAAA;AAAA,IAEH,YAAY;AAAA,IACZ,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA;AAAA,IAGA,MAAM,aAAa;AAAA,IAEnB;AAAA,IACA,MAAM,cAA0C;AAC5C,YAAM,QAAQ,KAAK,IAAA;AACnB,UAAI;AACA,cAAM,GAAG,QAAQ,EAAE,MAAM,GAAG;AAC5B,eAAO,EAAE,SAAS,MAAM,WAAW,KAAK,IAAA,IAAQ,MAAA;AAAA,MACpD,QAAQ;AACJ,eAAO,EAAE,SAAS,OAAO,WAAW,KAAK,IAAA,IAAQ,MAAA;AAAA,MACrD;AAAA,IACJ;AAAA,IACA,MAAM,UAAU;AACZ,YAAM,OAAO,MAAA;AAAA,IACjB;AAAA;AAAA,IAGA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAER;AAeO,SAAS,oBACZ,IACA,iBACW;AACX,QAAM,WAAW,mBAAmB,IAAI,qBAAqB,EAAE;AAC/D,SAAO,IAAI,YAAY,IAAI,QAAQ;AACvC;AAYO,SAAS,2BAA2B,IAA8B;AACrE,SAAO,IAAI,qBAAqB,EAAE;AACtC;AAaO,SAAS,4BAA4B,IAA0B;AAClE,SAAO,IAAI,mBAAmB,EAAE;AACpC;AASO,SAAS,qBAAqB,QAAqD;AACtF,SAAO,OAAO,SAAS,aACnB,OAAQ,OAA8B,eAAe,eACrD,OAAQ,OAA8B,WAAW;AACzD;AAKO,SAAS,oBAAoB,KAA+E;AAC/G,SAAO,OAAO,QAAQ,YAClB,QAAQ,QACR,UAAU,OACT,IAAgC,SAAS,aAC1C,gBAAgB,OAChB,YAAY;AACpB;"}
|