@mateusseiboth/ember-orm 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/ast/index.ts","../src/schema/index.ts","../src/errors/index.ts","../src/schema/lexer.ts","../src/schema/parser.ts","../src/schema/validator.ts","../src/schema/printer.ts","../src/utils/index.ts","../src/driver/firebird-driver.ts","../src/driver/url.ts","../src/driver/index.ts","../src/sql/fragment.ts","../src/sql/dialect.ts","../src/query/order.ts","../src/query/relations.ts","../src/query/where.ts","../src/query/having.ts","../src/query/compiler.ts","../src/query/coerce.ts","../src/query/defaults.ts","../src/query/writer.ts","../src/query/engine.ts","../src/client/runtime.ts","../src/client/index.ts","../src/introspect/firebird-meta.ts","../src/introspect/type-map.ts","../src/introspect/index.ts","../src/generator/index.ts","../src/generator/ts-types.ts","../src/migrate/index.ts","../src/migrate/diff.ts","../src/migrate/ddl.ts","../src/migrate/planner.ts","../src/migrate/history.ts"],"sourcesContent":["/**\n * EmberORM — a Prisma-like ORM for Firebird.\n *\n * Public entry point. The typed client is produced by `ember generate` and\n * imported from your generated output directory; everything needed at runtime\n * and for tooling is re-exported here.\n */\n\n// Schema & AST\nexport * from \"@ember/ast\";\nexport {\n parseSchema,\n parseAndValidate,\n loadSchema,\n findSchemaPath,\n resolveDatasourceUrl,\n printSchema,\n validateSchema,\n type LoadedSchema,\n} from \"@ember/schema\";\n\n// Errors\nexport * from \"@ember/errors\";\n\n// Driver\nexport {\n createDriver,\n parseConnectionUrl,\n buildConnectionUrl,\n FirebirdDriver,\n type ConnectionConfig,\n type SqlDriver,\n type SqlValue,\n type TransactionContext,\n type TransactionOptions,\n type IsolationLevel,\n} from \"@ember/driver\";\n\n// SQL\nexport { Sql, FirebirdDialect, type SqlDialect } from \"@ember/sql\";\n\n// Query engine & arg types\nexport {\n QueryEngine,\n type FindManyArgs,\n type FindUniqueArgs,\n type CreateArgs,\n type UpdateArgs,\n type UpsertArgs,\n type DeleteArgs,\n type AggregateArgs,\n type GroupByArgs,\n type WhereInput,\n type OrderByInput,\n type SelectInput,\n type IncludeInput,\n} from \"@ember/query\";\n\n// Client runtime\nexport {\n EmberClientBase,\n createClient,\n type ClientOptions,\n type ModelDelegate,\n} from \"@ember/client\";\n\n// Tooling (introspection + codegen) for programmatic use\nexport { Introspector } from \"@ember/introspect\";\nexport {\n ClientGenerator,\n generateClientSource,\n writeClient,\n} from \"@ember/generator\";\n\n// Migrations\nexport {\n Migrator,\n diffSchemas,\n planMigration,\n renderMigrationSql,\n splitStatements,\n FirebirdDdl,\n} from \"@ember/migrate\";\n","/**\n * EmberORM schema AST (DMMF-like).\n *\n * This is the single in-memory source of truth that every other layer\n * (parser, validator, query engine, generator, introspection) depends on.\n * It is intentionally decoupled from Firebird specifics so it can be reused\n * for other dialects in the future.\n */\n\nexport type ScalarType =\n | \"String\"\n | \"Boolean\"\n | \"Int\"\n | \"BigInt\"\n | \"Float\"\n | \"Decimal\"\n | \"DateTime\"\n | \"Bytes\"\n | \"Json\";\n\nexport const SCALAR_TYPES: readonly ScalarType[] = [\n \"String\",\n \"Boolean\",\n \"Int\",\n \"BigInt\",\n \"Float\",\n \"Decimal\",\n \"DateTime\",\n \"Bytes\",\n \"Json\",\n] as const;\n\nexport type FieldKind = \"scalar\" | \"enum\" | \"object\";\n\n/** Value of an attribute argument, e.g. `@default(now())` or `@map(\"USER_ID\")`. */\nexport type AttributeArgValue =\n | { kind: \"string\"; value: string }\n | { kind: \"number\"; value: number }\n | { kind: \"boolean\"; value: boolean }\n | { kind: \"ref\"; value: string } // bare identifier, e.g. an enum value or field name\n | { kind: \"function\"; name: string; args: AttributeArgValue[] } // e.g. now(), autoincrement()\n | { kind: \"array\"; items: AttributeArgValue[] };\n\nexport interface DefaultValue {\n /** A scalar literal default. */\n literal?: string | number | boolean;\n /** A function default such as now(), uuid(), cuid(), autoincrement(). */\n function?: { name: string; args: AttributeArgValue[] };\n}\n\nexport interface RelationInfo {\n /** Relation name (@relation(\"name\")). */\n name?: string;\n /** Local fields participating in the FK (`fields: [...]`). */\n fields?: string[];\n /** Referenced fields on the other model (`references: [...]`). */\n references?: string[];\n onDelete?: ReferentialAction;\n onUpdate?: ReferentialAction;\n}\n\nexport type ReferentialAction =\n | \"Cascade\"\n | \"Restrict\"\n | \"NoAction\"\n | \"SetNull\"\n | \"SetDefault\";\n\nexport interface NativeType {\n /** e.g. \"VarChar\", \"Decimal\". */\n name: string;\n /** e.g. [255] or [18, 4]. */\n args: number[];\n}\n\nexport interface FieldNode {\n name: string;\n /** Resolved type name: a ScalarType, an enum name, or a model name. */\n type: string;\n kind: FieldKind;\n isList: boolean;\n isRequired: boolean;\n isId: boolean;\n isUnique: boolean;\n isUpdatedAt: boolean;\n /** Column name in the database (@map). Defaults to `name`. */\n dbName?: string;\n default?: DefaultValue;\n relation?: RelationInfo;\n nativeType?: NativeType;\n /** documentation/comment attached above the field (///). */\n documentation?: string;\n}\n\nexport interface UniqueIndex {\n name?: string;\n fields: string[];\n}\n\nexport interface IndexNode {\n name?: string;\n fields: string[];\n unique: boolean;\n}\n\nexport interface ModelNode {\n name: string;\n /** Table name in the database (@@map). Defaults to `name`. */\n dbName?: string;\n fields: FieldNode[];\n /** Names of fields forming the primary key (composite supported via @@id). */\n primaryKey: string[];\n uniqueIndexes: UniqueIndex[];\n indexes: IndexNode[];\n documentation?: string;\n}\n\nexport interface EnumNode {\n name: string;\n dbName?: string;\n values: { name: string; dbName?: string }[];\n documentation?: string;\n}\n\nexport interface DatasourceNode {\n name: string;\n provider: string;\n /** Raw url expression; env(\"X\") resolved at runtime. */\n url: { kind: \"literal\" | \"env\"; value: string };\n}\n\nexport interface GeneratorNode {\n name: string;\n provider: string;\n output?: string;\n config: Record<string, string>;\n}\n\nexport interface SchemaDocument {\n datasource?: DatasourceNode;\n generators: GeneratorNode[];\n models: ModelNode[];\n enums: EnumNode[];\n}\n\nexport function emptySchema(): SchemaDocument {\n return { generators: [], models: [], enums: [] };\n}\n\nexport function findModel(\n schema: SchemaDocument,\n name: string,\n): ModelNode | undefined {\n return schema.models.find((m) => m.name === name);\n}\n\nexport function findEnum(\n schema: SchemaDocument,\n name: string,\n): EnumNode | undefined {\n return schema.enums.find((e) => e.name === name);\n}\n\n/**\n * Physical column name. Firebird folds unquoted identifiers to UPPER CASE, and\n * EmberORM always quotes identifiers, so a field without an explicit `@map`\n * resolves to its UPPER-CASED name to match the stored column. Use `@map` to\n * target a column created with case-sensitive (quoted) lower/mixed case.\n */\nexport function fieldColumn(field: FieldNode): string {\n return field.dbName ?? field.name.toUpperCase();\n}\n\n/** Physical table name; same UPPER-CASE folding rule as {@link fieldColumn}. */\nexport function modelTable(model: ModelNode): string {\n return model.dbName ?? model.name.toUpperCase();\n}\n\n/** Returns scalar fields only (excludes relation/object fields). */\nexport function scalarFields(model: ModelNode): FieldNode[] {\n return model.fields.filter((f) => f.kind !== \"object\");\n}\n\n/** Returns relation (object) fields only. */\nexport function relationFields(model: ModelNode): FieldNode[] {\n return model.fields.filter((f) => f.kind === \"object\");\n}\n\nexport function idFields(model: ModelNode): FieldNode[] {\n if (model.primaryKey.length > 0) {\n return model.primaryKey\n .map((n) => model.fields.find((f) => f.name === n))\n .filter((f): f is FieldNode => !!f);\n }\n return model.fields.filter((f) => f.isId);\n}\n","import { readFileSync, existsSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport type { SchemaDocument } from \"@ember/ast\";\nimport { Parser } from \"./parser\";\nimport { validateSchema } from \"./validator\";\nimport { printSchema } from \"./printer\";\nimport { completeRelations } from \"./relations-complete\";\n\nexport { Parser } from \"./parser\";\nexport { Lexer } from \"./lexer\";\nexport { validateSchema, printSchema, completeRelations };\n\n/**\n * Canonical formatter: parse, auto-complete missing relation sides (like\n * Prisma's formatter), validate, and re-print with aligned formatting.\n */\nexport function formatSchema(source: string, file?: string): string {\n const doc = completeRelations(parseSchema(source, file));\n validateSchema(doc);\n return printSchema(doc);\n}\n\n/** Parse schema source text into an AST (no validation). */\nexport function parseSchema(source: string, file?: string): SchemaDocument {\n return new Parser(source, file).parse();\n}\n\n/** Parse and validate schema source text. */\nexport function parseAndValidate(source: string, file?: string): SchemaDocument {\n const doc = parseSchema(source, file);\n validateSchema(doc);\n return doc;\n}\n\nexport interface LoadedSchema {\n document: SchemaDocument;\n path: string;\n /** Resolved connection URL (env() expanded). */\n databaseUrl?: string;\n}\n\nconst DEFAULT_SCHEMA_PATHS = [\n \"ember/schema.ember\",\n \"schema.ember\",\n \"prisma/schema.ember\",\n];\n\n/** Locate the schema file relative to a base directory. */\nexport function findSchemaPath(\n base = process.cwd(),\n explicit?: string,\n): string | undefined {\n if (explicit) {\n const p = resolve(base, explicit);\n return existsSync(p) ? p : undefined;\n }\n for (const candidate of DEFAULT_SCHEMA_PATHS) {\n const p = resolve(base, candidate);\n if (existsSync(p)) return p;\n }\n return undefined;\n}\n\n/** Load, parse, validate a schema file and resolve its datasource URL. */\nexport function loadSchema(path: string): LoadedSchema {\n const source = readFileSync(path, \"utf8\");\n const document = parseAndValidate(source, path);\n return {\n document,\n path,\n databaseUrl: resolveDatasourceUrl(document, dirname(path)),\n };\n}\n\nexport function resolveDatasourceUrl(\n doc: SchemaDocument,\n _base: string,\n): string | undefined {\n const ds = doc.datasource;\n if (!ds) return undefined;\n if (ds.url.kind === \"literal\") return ds.url.value;\n return process.env[ds.url.value];\n}\n","/** Base class for every error thrown by EmberORM. */\nexport class EmberError extends Error {\n constructor(message: string) {\n super(message);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Raised while lexing/parsing a `.ember` schema file. */\nexport class SchemaParseError extends EmberError {\n constructor(\n message: string,\n public readonly line: number,\n public readonly column: number,\n public readonly file?: string,\n ) {\n super(\n `${message} (at ${file ? `${file}:` : \"\"}${line}:${column})`,\n );\n }\n}\n\n/** Raised when a parsed schema is structurally invalid. */\nexport class SchemaValidationError extends EmberError {\n constructor(\n message: string,\n public readonly details: string[] = [],\n ) {\n super(\n details.length > 0 ? `${message}\\n - ${details.join(\"\\n - \")}` : message,\n );\n }\n}\n\n/** Raised when a query is malformed before it reaches the database. */\nexport class QueryValidationError extends EmberError {}\n\n/** Wraps a low-level driver/database failure with EmberORM context. */\nexport class DatabaseError extends EmberError {\n constructor(\n message: string,\n public override readonly cause?: unknown,\n public readonly sql?: string,\n ) {\n super(message);\n }\n}\n\n/** Thrown by `*OrThrow` operations when no record matches. */\nexport class RecordNotFoundError extends EmberError {\n constructor(model: string) {\n super(`No '${model}' record found matching the given criteria.`);\n }\n}\n\n/** Thrown on unique constraint violations (mapped from Firebird errors). */\nexport class UniqueConstraintError extends EmberError {\n constructor(\n public readonly target: string,\n cause?: unknown,\n ) {\n super(`Unique constraint failed on: ${target}`);\n if (cause !== undefined) this.cause = cause;\n }\n}\n","import { SchemaParseError } from \"@ember/errors\";\n\nexport type TokenType =\n | \"identifier\"\n | \"string\"\n | \"number\"\n | \"lbrace\"\n | \"rbrace\"\n | \"lparen\"\n | \"rparen\"\n | \"lbracket\"\n | \"rbracket\"\n | \"equals\"\n | \"comma\"\n | \"colon\"\n | \"at\"\n | \"double_at\"\n | \"question\"\n | \"dot\"\n | \"doc_comment\"\n | \"eof\";\n\nexport interface Token {\n type: TokenType;\n value: string;\n line: number;\n column: number;\n}\n\nconst SINGLE_CHAR_TOKENS: Record<string, TokenType> = {\n \"{\": \"lbrace\",\n \"}\": \"rbrace\",\n \"(\": \"lparen\",\n \")\": \"rparen\",\n \"[\": \"lbracket\",\n \"]\": \"rbracket\",\n \"=\": \"equals\",\n \",\": \"comma\",\n \":\": \"colon\",\n \"?\": \"question\",\n \".\": \"dot\",\n};\n\nconst IDENT_START = /[A-Za-z_]/;\nconst IDENT_PART = /[A-Za-z0-9_]/;\n\n/**\n * Converts schema source text into a flat token stream.\n * Regular `//` comments are discarded; `///` doc comments are preserved as\n * `doc_comment` tokens so the parser can attach documentation to nodes.\n */\nexport class Lexer {\n private pos = 0;\n private line = 1;\n private column = 1;\n\n constructor(\n private readonly source: string,\n private readonly file?: string,\n ) {}\n\n tokenize(): Token[] {\n const tokens: Token[] = [];\n let token = this.next();\n while (token.type !== \"eof\") {\n tokens.push(token);\n token = this.next();\n }\n tokens.push(token); // eof\n return tokens;\n }\n\n private next(): Token {\n this.skipWhitespaceAndComments();\n if (this.pos >= this.source.length) {\n return this.make(\"eof\", \"\");\n }\n\n const startLine = this.line;\n const startColumn = this.column;\n const ch = this.source[this.pos]!;\n\n // Doc comment (/// ...) — re-check here because skip kept them.\n if (ch === \"/\" && this.peek(1) === \"/\" && this.peek(2) === \"/\") {\n return this.readDocComment(startLine, startColumn);\n }\n\n if (ch === '\"') {\n return this.readString(startLine, startColumn);\n }\n\n if (ch === \"@\") {\n this.advance();\n if (this.source[this.pos] === \"@\") {\n this.advance();\n return { type: \"double_at\", value: \"@@\", line: startLine, column: startColumn };\n }\n return { type: \"at\", value: \"@\", line: startLine, column: startColumn };\n }\n\n const single = SINGLE_CHAR_TOKENS[ch];\n if (single) {\n this.advance();\n return { type: single, value: ch, line: startLine, column: startColumn };\n }\n\n if (ch === \"-\" || /[0-9]/.test(ch)) {\n return this.readNumber(startLine, startColumn);\n }\n\n if (IDENT_START.test(ch)) {\n return this.readIdentifier(startLine, startColumn);\n }\n\n throw new SchemaParseError(\n `Unexpected character '${ch}'`,\n startLine,\n startColumn,\n this.file,\n );\n }\n\n private readDocComment(line: number, column: number): Token {\n this.advance(); // /\n this.advance(); // /\n this.advance(); // /\n let value = \"\";\n while (this.pos < this.source.length && this.source[this.pos] !== \"\\n\") {\n value += this.source[this.pos];\n this.advance();\n }\n return { type: \"doc_comment\", value: value.trim(), line, column };\n }\n\n private readString(line: number, column: number): Token {\n this.advance(); // opening quote\n let value = \"\";\n while (this.pos < this.source.length && this.source[this.pos] !== '\"') {\n const c = this.source[this.pos]!;\n if (c === \"\\\\\") {\n this.advance();\n const escaped = this.source[this.pos];\n if (escaped === undefined) break;\n value += escapeChar(escaped);\n this.advance();\n continue;\n }\n if (c === \"\\n\") {\n throw new SchemaParseError(\n \"Unterminated string literal\",\n line,\n column,\n this.file,\n );\n }\n value += c;\n this.advance();\n }\n if (this.source[this.pos] !== '\"') {\n throw new SchemaParseError(\n \"Unterminated string literal\",\n line,\n column,\n this.file,\n );\n }\n this.advance(); // closing quote\n return { type: \"string\", value, line, column };\n }\n\n private readNumber(line: number, column: number): Token {\n let value = \"\";\n if (this.source[this.pos] === \"-\") {\n value += \"-\";\n this.advance();\n }\n while (\n this.pos < this.source.length &&\n /[0-9.]/.test(this.source[this.pos]!)\n ) {\n value += this.source[this.pos];\n this.advance();\n }\n return { type: \"number\", value, line, column };\n }\n\n private readIdentifier(line: number, column: number): Token {\n let value = \"\";\n while (\n this.pos < this.source.length &&\n IDENT_PART.test(this.source[this.pos]!)\n ) {\n value += this.source[this.pos];\n this.advance();\n }\n return { type: \"identifier\", value, line, column };\n }\n\n private skipWhitespaceAndComments(): void {\n while (this.pos < this.source.length) {\n const ch = this.source[this.pos]!;\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\r\" || ch === \"\\n\") {\n this.advance();\n continue;\n }\n // Keep doc comments (///) — only skip plain // comments.\n if (ch === \"/\" && this.peek(1) === \"/\" && this.peek(2) !== \"/\") {\n while (this.pos < this.source.length && this.source[this.pos] !== \"\\n\") {\n this.advance();\n }\n continue;\n }\n if (ch === \"/\" && this.peek(1) === \"*\") {\n this.advance();\n this.advance();\n while (\n this.pos < this.source.length &&\n !(this.source[this.pos] === \"*\" && this.peek(1) === \"/\")\n ) {\n this.advance();\n }\n this.advance();\n this.advance();\n continue;\n }\n break;\n }\n }\n\n private peek(offset: number): string | undefined {\n return this.source[this.pos + offset];\n }\n\n private advance(): void {\n if (this.source[this.pos] === \"\\n\") {\n this.line++;\n this.column = 1;\n } else {\n this.column++;\n }\n this.pos++;\n }\n\n private make(type: TokenType, value: string): Token {\n return { type, value, line: this.line, column: this.column };\n }\n}\n\nfunction escapeChar(c: string): string {\n switch (c) {\n case \"n\":\n return \"\\n\";\n case \"t\":\n return \"\\t\";\n case \"r\":\n return \"\\r\";\n case '\"':\n return '\"';\n case \"\\\\\":\n return \"\\\\\";\n default:\n return c;\n }\n}\n","import { SchemaParseError } from \"@ember/errors\";\nimport {\n type AttributeArgValue,\n type DatasourceNode,\n type DefaultValue,\n type EnumNode,\n type FieldNode,\n type GeneratorNode,\n type ModelNode,\n type NativeType,\n type ReferentialAction,\n type RelationInfo,\n type SchemaDocument,\n} from \"@ember/ast\";\nimport { Lexer, type Token, type TokenType } from \"./lexer\";\n\ninterface RawAttribute {\n name: string; // e.g. \"id\", \"default\", \"relation\", \"db.VarChar\"\n args: AttributeArgValue[];\n line: number;\n column: number;\n}\n\n/**\n * Recursive-descent parser that turns a token stream into a SchemaDocument.\n * Field `kind` (scalar/enum/object) is resolved in a second pass once all\n * model and enum names are known (see `resolveKinds`).\n */\nexport class Parser {\n private tokens: Token[];\n private pos = 0;\n\n constructor(\n source: string,\n private readonly file?: string,\n ) {\n this.tokens = new Lexer(source, file).tokenize();\n }\n\n parse(): SchemaDocument {\n const doc: SchemaDocument = { generators: [], models: [], enums: [] };\n let pendingDoc: string[] = [];\n\n while (!this.isEof()) {\n const tok = this.peek();\n if (tok.type === \"doc_comment\") {\n pendingDoc.push(tok.value);\n this.advance();\n continue;\n }\n if (tok.type !== \"identifier\") {\n throw this.error(`Unexpected token '${tok.value}'`, tok);\n }\n const documentation = pendingDoc.length\n ? pendingDoc.join(\"\\n\")\n : undefined;\n pendingDoc = [];\n\n switch (tok.value) {\n case \"datasource\":\n doc.datasource = this.parseDatasource();\n break;\n case \"generator\":\n doc.generators.push(this.parseGenerator());\n break;\n case \"model\":\n doc.models.push(this.parseModel(documentation));\n break;\n case \"enum\":\n doc.enums.push(this.parseEnum(documentation));\n break;\n default:\n throw this.error(`Unknown top-level keyword '${tok.value}'`, tok);\n }\n }\n\n resolveKinds(doc);\n return doc;\n }\n\n // ---- Top-level blocks -------------------------------------------------\n\n private parseDatasource(): DatasourceNode {\n this.expectKeyword(\"datasource\");\n const name = this.expect(\"identifier\").value;\n this.expect(\"lbrace\");\n const assignments = this.parseAssignments();\n this.expect(\"rbrace\");\n\n const provider = literalString(assignments[\"provider\"]);\n const urlAssign = assignments[\"url\"];\n let url: DatasourceNode[\"url\"] = { kind: \"literal\", value: \"\" };\n if (urlAssign) {\n if (urlAssign.kind === \"function\" && urlAssign.name === \"env\") {\n url = { kind: \"env\", value: literalString(urlAssign.args[0]) };\n } else if (urlAssign.kind === \"string\") {\n url = { kind: \"literal\", value: urlAssign.value };\n }\n }\n return { name, provider: provider ?? \"firebird\", url };\n }\n\n private parseGenerator(): GeneratorNode {\n this.expectKeyword(\"generator\");\n const name = this.expect(\"identifier\").value;\n this.expect(\"lbrace\");\n const assignments = this.parseAssignments();\n this.expect(\"rbrace\");\n\n const config: Record<string, string> = {};\n for (const [key, value] of Object.entries(assignments)) {\n if (value.kind === \"string\") config[key] = value.value;\n }\n return {\n name,\n provider: literalString(assignments[\"provider\"]) ?? \"ember-client-js\",\n output: assignments[\"output\"]\n ? literalString(assignments[\"output\"])\n : undefined,\n config,\n };\n }\n\n private parseAssignments(): Record<string, AttributeArgValue> {\n const out: Record<string, AttributeArgValue> = {};\n while (!this.check(\"rbrace\") && !this.isEof()) {\n if (this.check(\"doc_comment\")) {\n this.advance();\n continue;\n }\n const key = this.expect(\"identifier\").value;\n this.expect(\"equals\");\n out[key] = this.parseValue();\n }\n return out;\n }\n\n private parseModel(documentation?: string): ModelNode {\n this.expectKeyword(\"model\");\n const name = this.expect(\"identifier\").value;\n this.expect(\"lbrace\");\n\n const model: ModelNode = {\n name,\n fields: [],\n primaryKey: [],\n uniqueIndexes: [],\n indexes: [],\n documentation,\n };\n\n let pendingDoc: string[] = [];\n while (!this.check(\"rbrace\") && !this.isEof()) {\n const tok = this.peek();\n if (tok.type === \"doc_comment\") {\n pendingDoc.push(tok.value);\n this.advance();\n continue;\n }\n if (tok.type === \"double_at\") {\n this.parseBlockAttribute(model);\n pendingDoc = [];\n continue;\n }\n const field = this.parseField(\n pendingDoc.length ? pendingDoc.join(\"\\n\") : undefined,\n );\n pendingDoc = [];\n model.fields.push(field);\n // Promote inline @id / @unique to model metadata.\n if (field.isId && !model.primaryKey.includes(field.name)) {\n model.primaryKey.push(field.name);\n }\n }\n this.expect(\"rbrace\");\n return model;\n }\n\n private parseField(documentation?: string): FieldNode {\n const name = this.expect(\"identifier\").value;\n const typeName = this.expect(\"identifier\").value;\n\n let isList = false;\n let isRequired = true;\n // Order-independent handling of `[]` and `?`.\n while (this.check(\"lbracket\") || this.check(\"question\")) {\n if (this.check(\"lbracket\")) {\n this.advance();\n this.expect(\"rbracket\");\n isList = true;\n } else {\n this.advance();\n isRequired = false;\n }\n }\n\n const field: FieldNode = {\n name,\n type: typeName,\n kind: \"scalar\", // resolved later\n isList,\n isRequired,\n isId: false,\n isUnique: false,\n isUpdatedAt: false,\n documentation,\n };\n\n while (this.check(\"at\")) {\n const attr = this.parseAttribute();\n this.applyFieldAttribute(field, attr);\n }\n return field;\n }\n\n private applyFieldAttribute(field: FieldNode, attr: RawAttribute): void {\n if (attr.name.startsWith(\"db.\")) {\n field.nativeType = toNativeType(attr);\n return;\n }\n switch (attr.name) {\n case \"id\":\n field.isId = true;\n break;\n case \"unique\":\n field.isUnique = true;\n break;\n case \"updatedAt\":\n field.isUpdatedAt = true;\n break;\n case \"default\":\n field.default = toDefaultValue(attr.args[0]);\n break;\n case \"map\":\n field.dbName = literalString(attr.args[0]);\n break;\n case \"relation\":\n field.relation = toRelationInfo(attr.args);\n break;\n default:\n throw this.error(`Unknown field attribute '@${attr.name}'`, attr);\n }\n }\n\n private parseBlockAttribute(model: ModelNode): void {\n const start = this.expect(\"double_at\");\n const name = this.expect(\"identifier\").value;\n const args = this.check(\"lparen\") ? this.parseArgList() : [];\n\n switch (name) {\n case \"id\":\n model.primaryKey = fieldNameList(args);\n break;\n case \"unique\":\n model.uniqueIndexes.push({\n fields: fieldNameList(args),\n name: namedArg(args, \"map\"),\n });\n break;\n case \"index\":\n model.indexes.push({\n fields: fieldNameList(args),\n name: namedArg(args, \"map\"),\n unique: false,\n });\n break;\n case \"map\":\n model.dbName = literalString(args[0]);\n break;\n default:\n throw this.error(`Unknown block attribute '@@${name}'`, start);\n }\n }\n\n private parseEnum(documentation?: string): EnumNode {\n this.expectKeyword(\"enum\");\n const name = this.expect(\"identifier\").value;\n this.expect(\"lbrace\");\n const node: EnumNode = { name, values: [], documentation };\n\n while (!this.check(\"rbrace\") && !this.isEof()) {\n if (this.check(\"doc_comment\")) {\n this.advance();\n continue;\n }\n if (this.check(\"double_at\")) {\n this.advance();\n const attrName = this.expect(\"identifier\").value;\n const args = this.check(\"lparen\") ? this.parseArgList() : [];\n if (attrName === \"map\") node.dbName = literalString(args[0]);\n continue;\n }\n const valueName = this.expect(\"identifier\").value;\n let dbName: string | undefined;\n while (this.check(\"at\")) {\n const attr = this.parseAttribute();\n if (attr.name === \"map\") dbName = literalString(attr.args[0]);\n }\n node.values.push({ name: valueName, dbName });\n }\n this.expect(\"rbrace\");\n return node;\n }\n\n // ---- Attributes & values ---------------------------------------------\n\n private parseAttribute(): RawAttribute {\n const at = this.expect(\"at\");\n let name = this.expect(\"identifier\").value;\n // Native type attributes look like @db.VarChar(255).\n if (this.check(\"dot\")) {\n this.advance();\n name += \".\" + this.expect(\"identifier\").value;\n }\n const args = this.check(\"lparen\") ? this.parseArgList() : [];\n return { name, args, line: at.line, column: at.column };\n }\n\n private parseArgList(): AttributeArgValue[] {\n this.expect(\"lparen\");\n const args: AttributeArgValue[] = [];\n while (!this.check(\"rparen\") && !this.isEof()) {\n args.push(this.parseArg());\n if (this.check(\"comma\")) this.advance();\n }\n this.expect(\"rparen\");\n return args;\n }\n\n /** Handles both positional values and `name: value` named arguments. */\n private parseArg(): AttributeArgValue {\n if (this.check(\"identifier\") && this.peek(1)?.type === \"colon\") {\n const key = this.expect(\"identifier\").value;\n this.expect(\"colon\");\n const value = this.parseValue();\n return { kind: \"function\", name: `__named:${key}`, args: [value] };\n }\n return this.parseValue();\n }\n\n private parseValue(): AttributeArgValue {\n const tok = this.peek();\n switch (tok.type) {\n case \"string\":\n this.advance();\n return { kind: \"string\", value: tok.value };\n case \"number\":\n this.advance();\n return { kind: \"number\", value: Number(tok.value) };\n case \"lbracket\": {\n this.advance();\n const items: AttributeArgValue[] = [];\n while (!this.check(\"rbracket\") && !this.isEof()) {\n items.push(this.parseValue());\n if (this.check(\"comma\")) this.advance();\n }\n this.expect(\"rbracket\");\n return { kind: \"array\", items };\n }\n case \"identifier\": {\n this.advance();\n if (tok.value === \"true\" || tok.value === \"false\") {\n return { kind: \"boolean\", value: tok.value === \"true\" };\n }\n if (this.check(\"lparen\")) {\n const args = this.parseArgList();\n return { kind: \"function\", name: tok.value, args };\n }\n return { kind: \"ref\", value: tok.value };\n }\n default:\n throw this.error(`Unexpected value token '${tok.value}'`, tok);\n }\n }\n\n // ---- Token helpers ----------------------------------------------------\n\n private peek(offset = 0): Token {\n return this.tokens[this.pos + offset] ?? this.tokens[this.tokens.length - 1]!;\n }\n\n private advance(): Token {\n const tok = this.tokens[this.pos]!;\n if (this.pos < this.tokens.length - 1) this.pos++;\n return tok;\n }\n\n private check(type: TokenType): boolean {\n return this.peek().type === type;\n }\n\n private isEof(): boolean {\n return this.peek().type === \"eof\";\n }\n\n private expect(type: TokenType): Token {\n const tok = this.peek();\n if (tok.type !== type) {\n throw this.error(`Expected ${type} but found '${tok.value}' (${tok.type})`, tok);\n }\n return this.advance();\n }\n\n private expectKeyword(keyword: string): Token {\n const tok = this.peek();\n if (tok.type !== \"identifier\" || tok.value !== keyword) {\n throw this.error(`Expected keyword '${keyword}'`, tok);\n }\n return this.advance();\n }\n\n private error(message: string, at: { line: number; column: number }) {\n return new SchemaParseError(message, at.line, at.column, this.file);\n }\n}\n\n// ---- Value coercion helpers --------------------------------------------\n\nfunction literalString(v: AttributeArgValue | undefined): string {\n if (!v) return \"\";\n if (v.kind === \"string\") return v.value;\n if (v.kind === \"ref\") return v.value;\n return String(\"value\" in v ? v.value : \"\");\n}\n\nfunction toNativeType(attr: RawAttribute): NativeType {\n const name = attr.name.slice(\"db.\".length);\n const args = attr.args\n .filter((a) => a.kind === \"number\")\n .map((a) => (a as { value: number }).value);\n return { name, args };\n}\n\nfunction toDefaultValue(v: AttributeArgValue | undefined): DefaultValue {\n if (!v) return {};\n switch (v.kind) {\n case \"function\":\n return { function: { name: v.name, args: v.args } };\n case \"string\":\n return { literal: v.value };\n case \"number\":\n return { literal: v.value };\n case \"boolean\":\n return { literal: v.value };\n case \"ref\":\n // enum value default such as @default(USER)\n return { literal: v.value };\n default:\n return {};\n }\n}\n\nfunction toRelationInfo(args: AttributeArgValue[]): RelationInfo {\n const info: RelationInfo = {};\n for (const arg of args) {\n if (arg.kind === \"string\") {\n info.name = arg.value;\n continue;\n }\n const named = asNamed(arg);\n if (!named) continue;\n const [key, value] = named;\n if (key === \"name\" && value.kind === \"string\") info.name = value.value;\n if (key === \"fields\") info.fields = refArray(value);\n if (key === \"references\") info.references = refArray(value);\n if (key === \"onDelete\") info.onDelete = refName(value) as ReferentialAction;\n if (key === \"onUpdate\") info.onUpdate = refName(value) as ReferentialAction;\n }\n return info;\n}\n\nfunction asNamed(\n arg: AttributeArgValue,\n): [string, AttributeArgValue] | undefined {\n if (arg.kind === \"function\" && arg.name.startsWith(\"__named:\")) {\n return [arg.name.slice(\"__named:\".length), arg.args[0]!];\n }\n return undefined;\n}\n\nfunction namedArg(args: AttributeArgValue[], key: string): string | undefined {\n for (const arg of args) {\n const named = asNamed(arg);\n if (named && named[0] === key && named[1].kind === \"string\") {\n return named[1].value;\n }\n }\n return undefined;\n}\n\nfunction refArray(v: AttributeArgValue): string[] {\n if (v.kind === \"array\") {\n return v.items.map((i) => refName(i)).filter((s): s is string => !!s);\n }\n const single = refName(v);\n return single ? [single] : [];\n}\n\nfunction refName(v: AttributeArgValue): string | undefined {\n if (v.kind === \"ref\") return v.value;\n if (v.kind === \"string\") return v.value;\n return undefined;\n}\n\n/** A list of bare field references, used by @@id/@@unique/@@index. */\nfunction fieldNameList(args: AttributeArgValue[]): string[] {\n for (const arg of args) {\n if (arg.kind === \"array\") return refArray(arg);\n const named = asNamed(arg);\n if (named && named[0] === \"fields\") return refArray(named[1]);\n }\n // single bare ref form: @@id(field)\n return args.map((a) => refName(a)).filter((s): s is string => !!s);\n}\n\n/**\n * Second pass: now that all model and enum names are known, classify each\n * field as scalar, enum, or object (relation).\n */\nfunction resolveKinds(doc: SchemaDocument): void {\n const modelNames = new Set(doc.models.map((m) => m.name));\n const enumNames = new Set(doc.enums.map((e) => e.name));\n for (const model of doc.models) {\n for (const field of model.fields) {\n if (modelNames.has(field.type)) field.kind = \"object\";\n else if (enumNames.has(field.type)) field.kind = \"enum\";\n else field.kind = \"scalar\";\n }\n }\n}\n","import { SchemaValidationError } from \"@ember/errors\";\nimport {\n SCALAR_TYPES,\n type SchemaDocument,\n findModel,\n} from \"@ember/ast\";\n\n/**\n * Structural validation of a parsed schema. Throws SchemaValidationError with\n * all detected problems at once so the user can fix them in a single pass.\n */\nexport function validateSchema(doc: SchemaDocument): void {\n const errors: string[] = [];\n const scalar = new Set<string>(SCALAR_TYPES);\n const enumNames = new Set(doc.enums.map((e) => e.name));\n const modelNames = new Set(doc.models.map((m) => m.name));\n\n const duplicateModels = findDuplicates(doc.models.map((m) => m.name));\n for (const name of duplicateModels) {\n errors.push(`Duplicate model '${name}'.`);\n }\n\n for (const model of doc.models) {\n const fieldNames = new Set<string>();\n for (const field of model.fields) {\n if (fieldNames.has(field.name)) {\n errors.push(`Duplicate field '${model.name}.${field.name}'.`);\n }\n fieldNames.add(field.name);\n\n const known =\n scalar.has(field.type) ||\n enumNames.has(field.type) ||\n modelNames.has(field.type);\n if (!known) {\n errors.push(\n `Field '${model.name}.${field.name}' has unknown type '${field.type}'.`,\n );\n }\n\n if (field.kind === \"object\" && field.relation) {\n validateRelation(doc, model.name, field.name, field.relation, errors);\n }\n }\n\n for (const pk of model.primaryKey) {\n if (!fieldNames.has(pk)) {\n errors.push(\n `Primary key field '${pk}' does not exist on model '${model.name}'.`,\n );\n }\n }\n\n const hasId =\n model.primaryKey.length > 0 || model.fields.some((f) => f.isId);\n if (!hasId) {\n errors.push(\n `Model '${model.name}' has no @id / @@id. Every model needs a primary key.`,\n );\n }\n }\n\n for (const enumNode of doc.enums) {\n if (enumNode.values.length === 0) {\n errors.push(`Enum '${enumNode.name}' has no values.`);\n }\n }\n\n if (errors.length > 0) {\n throw new SchemaValidationError(\"Schema validation failed\", errors);\n }\n}\n\nfunction validateRelation(\n doc: SchemaDocument,\n modelName: string,\n fieldName: string,\n relation: { fields?: string[]; references?: string[] },\n errors: string[],\n): void {\n const model = findModel(doc, modelName);\n if (!model) return;\n for (const f of relation.fields ?? []) {\n if (!model.fields.some((mf) => mf.name === f)) {\n errors.push(\n `Relation '${modelName}.${fieldName}' references local field '${f}' which does not exist.`,\n );\n }\n }\n}\n\nfunction findDuplicates(values: string[]): string[] {\n const seen = new Set<string>();\n const dups = new Set<string>();\n for (const v of values) {\n if (seen.has(v)) dups.add(v);\n seen.add(v);\n }\n return [...dups];\n}\n","import {\n type AttributeArgValue,\n type DefaultValue,\n type EnumNode,\n type FieldNode,\n type ModelNode,\n type SchemaDocument,\n} from \"@ember/ast\";\n\n/**\n * Serializes a SchemaDocument back into `.ember` source text.\n * Used by `ember db pull` (introspection output) and `ember format`.\n * Field columns are aligned for readability, mirroring Prisma's formatter.\n */\nexport function printSchema(doc: SchemaDocument): string {\n const blocks: string[] = [];\n\n if (doc.datasource) {\n const ds = doc.datasource;\n const url =\n ds.url.kind === \"env\"\n ? `env(\"${ds.url.value}\")`\n : `\"${ds.url.value}\"`;\n blocks.push(\n `datasource ${ds.name} {\\n provider = \"${ds.provider}\"\\n url = ${url}\\n}`,\n );\n }\n\n for (const gen of doc.generators) {\n const lines = [` provider = \"${gen.provider}\"`];\n if (gen.output) lines.push(` output = \"${gen.output}\"`);\n for (const [k, v] of Object.entries(gen.config)) {\n if (k === \"provider\" || k === \"output\") continue;\n lines.push(` ${k} = \"${v}\"`);\n }\n blocks.push(`generator ${gen.name} {\\n${lines.join(\"\\n\")}\\n}`);\n }\n\n for (const enumNode of doc.enums) {\n blocks.push(printEnum(enumNode));\n }\n\n for (const model of doc.models) {\n blocks.push(printModel(model));\n }\n\n return blocks.join(\"\\n\\n\") + \"\\n\";\n}\n\nfunction printEnum(node: EnumNode): string {\n const lines: string[] = [];\n if (node.documentation) lines.push(...docLines(node.documentation));\n lines.push(`enum ${node.name} {`);\n for (const v of node.values) {\n lines.push(` ${v.name}${v.dbName ? ` @map(\"${v.dbName}\")` : \"\"}`);\n }\n if (node.dbName) lines.push(`\\n @@map(\"${node.dbName}\")`);\n lines.push(`}`);\n return lines.join(\"\\n\");\n}\n\nfunction printModel(model: ModelNode): string {\n const lines: string[] = [];\n if (model.documentation) lines.push(...docLines(model.documentation));\n lines.push(`model ${model.name} {`);\n\n const nameWidth = Math.max(...model.fields.map((f) => f.name.length), 0);\n const typeWidth = Math.max(...model.fields.map((f) => fieldType(f).length), 0);\n\n for (const field of model.fields) {\n if (field.documentation) {\n lines.push(...docLines(field.documentation).map((l) => ` ${l}`));\n }\n const attrs = fieldAttributes(field);\n const name = field.name.padEnd(nameWidth);\n const type = fieldType(field).padEnd(typeWidth);\n lines.push(` ${name} ${type}${attrs ? ` ${attrs}` : \"\"}`.trimEnd());\n }\n\n const blockAttrs = modelBlockAttributes(model);\n if (blockAttrs.length > 0) {\n lines.push(\"\");\n for (const a of blockAttrs) lines.push(` ${a}`);\n }\n\n lines.push(`}`);\n return lines.join(\"\\n\");\n}\n\nfunction fieldType(field: FieldNode): string {\n let t = field.type;\n if (field.isList) t += \"[]\";\n else if (!field.isRequired) t += \"?\";\n return t;\n}\n\nfunction fieldAttributes(field: FieldNode): string {\n const parts: string[] = [];\n if (field.isId) parts.push(\"@id\");\n if (field.isUnique) parts.push(\"@unique\");\n if (field.default) parts.push(`@default(${printDefault(field.default)})`);\n if (field.isUpdatedAt) parts.push(\"@updatedAt\");\n if (field.relation) {\n const rel = field.relation;\n const args: string[] = [];\n if (rel.name) args.push(`\"${rel.name}\"`);\n if (rel.fields?.length) args.push(`fields: [${rel.fields.join(\", \")}]`);\n if (rel.references?.length)\n args.push(`references: [${rel.references.join(\", \")}]`);\n if (rel.onDelete) args.push(`onDelete: ${rel.onDelete}`);\n if (rel.onUpdate) args.push(`onUpdate: ${rel.onUpdate}`);\n parts.push(args.length ? `@relation(${args.join(\", \")})` : \"@relation\");\n }\n if (field.nativeType) {\n const a = field.nativeType.args.length\n ? `(${field.nativeType.args.join(\", \")})`\n : \"\";\n parts.push(`@db.${field.nativeType.name}${a}`);\n }\n if (field.dbName) parts.push(`@map(\"${field.dbName}\")`);\n return parts.join(\" \");\n}\n\nfunction printDefault(def: DefaultValue): string {\n if (def.function) {\n return `${def.function.name}(${def.function.args\n .map(printArgValue)\n .join(\", \")})`;\n }\n if (typeof def.literal === \"string\") {\n // enum/ref defaults are unquoted identifiers\n return /^[A-Za-z_][A-Za-z0-9_]*$/.test(def.literal)\n ? def.literal\n : `\"${def.literal}\"`;\n }\n return String(def.literal);\n}\n\nfunction printArgValue(v: AttributeArgValue): string {\n switch (v.kind) {\n case \"string\":\n return `\"${v.value}\"`;\n case \"number\":\n return String(v.value);\n case \"boolean\":\n return String(v.value);\n case \"ref\":\n return v.value;\n case \"array\":\n return `[${v.items.map(printArgValue).join(\", \")}]`;\n case \"function\":\n return `${v.name}(${v.args.map(printArgValue).join(\", \")})`;\n }\n}\n\nfunction modelBlockAttributes(model: ModelNode): string[] {\n const out: string[] = [];\n const inlineId =\n model.primaryKey.length === 1 &&\n model.fields.find((f) => f.name === model.primaryKey[0])?.isId;\n if (model.primaryKey.length > 0 && !inlineId) {\n out.push(`@@id([${model.primaryKey.join(\", \")}])`);\n }\n for (const u of model.uniqueIndexes) {\n out.push(\n `@@unique([${u.fields.join(\", \")}]${u.name ? `, map: \"${u.name}\"` : \"\"})`,\n );\n }\n for (const i of model.indexes) {\n out.push(\n `@@index([${i.fields.join(\", \")}]${i.name ? `, map: \"${i.name}\"` : \"\"})`,\n );\n }\n if (model.dbName) out.push(`@@map(\"${model.dbName}\")`);\n return out;\n}\n\nfunction docLines(documentation: string): string[] {\n return documentation.split(\"\\n\").map((l) => `/// ${l}`);\n}\n","/** Small, dependency-free helpers shared across layers. */\n\nexport function isPlainObject(v: unknown): v is Record<string, unknown> {\n return (\n typeof v === \"object\" &&\n v !== null &&\n !Array.isArray(v) &&\n !(v instanceof Date) &&\n !Buffer.isBuffer(v)\n );\n}\n\nexport function isEmptyObject(v: unknown): boolean {\n return isPlainObject(v) && Object.keys(v).length === 0;\n}\n\nexport function uniq<T>(items: T[]): T[] {\n return [...new Set(items)];\n}\n\nexport function pascalCase(input: string): string {\n return input\n .toLowerCase()\n .replace(/[^a-zA-Z0-9]+(.)?/g, (_, c: string | undefined) =>\n c ? c.toUpperCase() : \"\",\n )\n .replace(/^(.)/, (_, c: string) => c.toUpperCase());\n}\n\nexport function camelCase(input: string): string {\n const pascal = pascalCase(input);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\nexport function pluralize(word: string): string {\n if (/[^aeiou]y$/i.test(word)) return word.replace(/y$/i, \"ies\");\n if (/(s|x|z|ch|sh)$/i.test(word)) return `${word}es`;\n return `${word}s`;\n}\n\n/** First char lowercased — used to derive delegate names from model names. */\nexport function lowerFirst(input: string): string {\n return input.charAt(0).toLowerCase() + input.slice(1);\n}\n\nexport function indent(text: string, level = 1, unit = \" \"): string {\n const pad = unit.repeat(level);\n return text\n .split(\"\\n\")\n .map((l) => (l.length > 0 ? pad + l : l))\n .join(\"\\n\");\n}\n\nexport function assertNever(value: never, message = \"Unexpected value\"): never {\n throw new Error(`${message}: ${JSON.stringify(value)}`);\n}\n","import { AsyncLocalStorage } from \"node:async_hooks\";\nimport Firebird from \"node-firebird\";\nimport { DatabaseError } from \"@ember/errors\";\nimport type {\n ConnectionConfig,\n DriverOptions,\n IsolationLevel,\n SqlDriver,\n SqlValue,\n TransactionContext,\n TransactionOptions,\n} from \"./types\";\n\n// node-firebird is callback-based and weakly typed; these aliases keep the\n// rest of the file readable without leaking `any` outward.\ntype FbDatabase = {\n query(sql: string, params: unknown[], cb: (err: unknown, result: unknown) => void): void;\n transaction(isolation: unknown, cb: (err: unknown, tr: FbTransaction) => void): void;\n detach(cb?: (err: unknown) => void): void;\n};\ntype FbTransaction = {\n query(sql: string, params: unknown[], cb: (err: unknown, result: unknown) => void): void;\n commit(cb: (err: unknown) => void): void;\n rollback(cb: (err: unknown) => void): void;\n};\ntype FbPool = {\n get(cb: (err: unknown, db: FbDatabase) => void): void;\n destroy(): void;\n};\n\nconst fb = Firebird as unknown as {\n pool(max: number, options: unknown, cb?: unknown): FbPool;\n ISOLATION_READ_COMMITTED: unknown;\n ISOLATION_READ_COMMITTED_READ_ONLY: unknown;\n ISOLATION_REPEATABLE_READ: unknown;\n ISOLATION_SERIALIZABLE: unknown;\n};\n\nfunction isolationConstant(level: IsolationLevel | undefined): unknown {\n switch (level) {\n case \"READ_COMMITTED_READ_ONLY\":\n return fb.ISOLATION_READ_COMMITTED_READ_ONLY;\n case \"REPEATABLE_READ\":\n return fb.ISOLATION_REPEATABLE_READ;\n case \"SERIALIZABLE\":\n return fb.ISOLATION_SERIALIZABLE;\n case \"READ_COMMITTED\":\n default:\n return fb.ISOLATION_READ_COMMITTED;\n }\n}\n\n/**\n * Firebird implementation of SqlDriver. Wraps node-firebird's callback API in\n * promises, manages a connection pool, and guarantees every query executes\n * inside a transaction. Nested `transaction()` calls reuse the active one via\n * AsyncLocalStorage so `client.$transaction(...)` composes naturally.\n */\nexport class FirebirdDriver implements SqlDriver {\n private pool: FbPool | null = null;\n private readonly options: Record<string, unknown>;\n private readonly poolMax: number;\n private readonly onQuery?: DriverOptions[\"onQuery\"];\n private readonly activeTx = new AsyncLocalStorage<TransactionContext>();\n\n constructor(config: ConnectionConfig, driverOptions?: DriverOptions) {\n this.poolMax = config.poolMax ?? 5;\n this.onQuery = driverOptions?.onQuery;\n this.options = {\n host: config.host,\n port: config.port,\n database: config.database,\n user: config.user,\n password: config.password,\n role: config.role ?? \"\",\n pageSize: config.pageSize ?? 4096,\n encoding: config.encoding ?? \"UTF8\",\n blobAsText: config.blobAsText ?? true,\n lowercase_keys: config.lowercaseKeys ?? false,\n retryConnectionInterval: 1000,\n // FB3+ secure auth (Srp) is negotiated by default; set explicitly to force\n // a plugin, or \"Legacy_Auth\" for Firebird 2.1/2.5 servers.\n ...(config.authPlugin ? { pluginName: config.authPlugin } : {}),\n ...(config.wireCompression != null\n ? { wireCompression: config.wireCompression }\n : {}),\n };\n }\n\n async connect(): Promise<void> {\n if (this.pool) return;\n this.pool = fb.pool(this.poolMax, this.options);\n }\n\n async disconnect(): Promise<void> {\n if (!this.pool) return;\n this.pool.destroy();\n this.pool = null;\n }\n\n async transaction<T>(\n fn: (tx: TransactionContext) => Promise<T>,\n options?: TransactionOptions,\n ): Promise<T> {\n const existing = this.activeTx.getStore();\n if (existing) {\n // Reuse the enclosing transaction; do not commit here.\n return fn(existing);\n }\n await this.connect();\n const db = await this.acquire();\n const tr = await this.begin(db, options?.isolation);\n const ctx: TransactionContext = {\n query: (sql, params) => this.runOnTransaction(tr, sql, params),\n };\n try {\n const result = await this.activeTx.run(ctx, () => fn(ctx));\n await this.commit(tr);\n return result;\n } catch (err) {\n await this.safeRollback(tr);\n throw err;\n } finally {\n db.detach();\n }\n }\n\n // ---- promise wrappers over node-firebird -------------------------------\n\n private acquire(): Promise<FbDatabase> {\n return new Promise((resolve, reject) => {\n this.pool!.get((err, db) => {\n if (err) return reject(wrap(err, \"Failed to acquire connection\"));\n resolve(db);\n });\n });\n }\n\n private begin(\n db: FbDatabase,\n isolation?: IsolationLevel,\n ): Promise<FbTransaction> {\n return new Promise((resolve, reject) => {\n db.transaction(isolationConstant(isolation), (err, tr) => {\n if (err) return reject(wrap(err, \"Failed to start transaction\"));\n resolve(tr);\n });\n });\n }\n\n private runOnTransaction<T>(\n tr: FbTransaction,\n sql: string,\n params: readonly SqlValue[] = [],\n ): Promise<T[]> {\n const start = this.onQuery ? performance.now() : 0;\n return new Promise((resolve, reject) => {\n tr.query(sql, [...params], (err, result) => {\n if (err) return reject(wrap(err, \"Query failed\", sql));\n const rows = normalizeRows<T>(result);\n if (this.onQuery) {\n this.onQuery({\n sql,\n params,\n durationMs: performance.now() - start,\n rowCount: rows.length,\n });\n }\n resolve(rows);\n });\n });\n }\n\n private commit(tr: FbTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n tr.commit((err) => {\n if (err) return reject(wrap(err, \"Failed to commit transaction\"));\n resolve();\n });\n });\n }\n\n private safeRollback(tr: FbTransaction): Promise<void> {\n return new Promise((resolve) => {\n tr.rollback(() => resolve());\n });\n }\n}\n\nfunction normalizeRows<T>(result: unknown): T[] {\n if (Array.isArray(result)) return result as T[];\n if (result === undefined || result === null) return [];\n return [result as T];\n}\n\nfunction wrap(err: unknown, message: string, sql?: string): DatabaseError {\n const detail =\n err && typeof err === \"object\" && \"message\" in err\n ? String((err as { message: unknown }).message)\n : String(err);\n return new DatabaseError(`${message}: ${detail}`, err, sql);\n}\n","import { EmberError } from \"@ember/errors\";\nimport type { ConnectionConfig } from \"./types\";\n\n/**\n * Parse a Firebird connection URL into a ConnectionConfig.\n *\n * Supported forms:\n * firebird://user:password@host:port/path/to/database.fdb?role=RDB$ADMIN\n * firebird://SYSDBA:masterkey@localhost:3050//var/lib/firebird/data/app.fdb\n *\n * The path after the host is treated as the absolute database path. A leading\n * double slash (`//var/...`) yields an absolute POSIX path; a single slash with\n * a Windows drive (`/C:/...`) is normalized too.\n */\nexport function parseConnectionUrl(url: string): ConnectionConfig {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new EmberError(`Invalid Firebird connection URL: ${url}`);\n }\n\n if (!/^firebird:?$/.test(parsed.protocol.replace(\":\", \"\") + \":\")) {\n if (parsed.protocol !== \"firebird:\") {\n throw new EmberError(\n `Unsupported protocol '${parsed.protocol}'. Expected 'firebird:'.`,\n );\n }\n }\n\n const database = normalizeDatabasePath(parsed.pathname);\n if (!database) {\n throw new EmberError(`Connection URL is missing a database path: ${url}`);\n }\n\n const params = parsed.searchParams;\n const config: ConnectionConfig = {\n host: parsed.hostname || \"127.0.0.1\",\n port: parsed.port ? Number(parsed.port) : 3050,\n database,\n user: decodeURIComponent(parsed.username || \"SYSDBA\"),\n password: decodeURIComponent(parsed.password || \"masterkey\"),\n encoding: params.get(\"encoding\") ?? \"UTF8\",\n };\n\n const role = params.get(\"role\");\n if (role) config.role = role;\n const poolMax = params.get(\"poolMax\") ?? params.get(\"connection_limit\");\n if (poolMax) config.poolMax = Number(poolMax);\n const pageSize = params.get(\"pageSize\");\n if (pageSize) config.pageSize = Number(pageSize);\n\n const auth = (params.get(\"authPlugin\") ?? params.get(\"auth\"))?.toLowerCase();\n if (auth === \"legacy\" || auth === \"legacy_auth\") config.authPlugin = \"Legacy_Auth\";\n else if (auth === \"srp\") config.authPlugin = \"Srp\";\n\n const wireCompression = params.get(\"wireCompression\");\n if (wireCompression != null) {\n config.wireCompression = wireCompression !== \"false\" && wireCompression !== \"0\";\n }\n\n const version = params.get(\"version\");\n if (version) config.version = normalizeVersion(version);\n\n return config;\n}\n\nconst VERSIONS = new Set([\"2.1\", \"2.5\", \"3\", \"4\", \"5\"]);\n\nfunction normalizeVersion(raw: string): ConnectionConfig[\"version\"] {\n const trimmed = raw.trim();\n if (VERSIONS.has(trimmed)) return trimmed as ConnectionConfig[\"version\"];\n // Accept \"3.0\", \"4.0.1\" etc. by taking the major (or major.minor for 2.x).\n if (/^2\\.1/.test(trimmed)) return \"2.1\";\n if (/^2\\.5/.test(trimmed)) return \"2.5\";\n const major = trimmed.split(\".\")[0];\n if (major && VERSIONS.has(major)) return major as ConnectionConfig[\"version\"];\n return undefined;\n}\n\nfunction normalizeDatabasePath(pathname: string): string {\n let p = decodeURIComponent(pathname);\n // `//var/lib/app.fdb` -> `/var/lib/app.fdb`\n if (p.startsWith(\"//\")) p = p.slice(1);\n // `/C:/db.fdb` -> `C:/db.fdb`\n if (/^\\/[A-Za-z]:\\//.test(p)) p = p.slice(1);\n return p;\n}\n\nexport function buildConnectionUrl(config: ConnectionConfig): string {\n const auth = `${encodeURIComponent(config.user)}:${encodeURIComponent(\n config.password,\n )}`;\n const dbPath = config.database.startsWith(\"/\")\n ? `/${config.database}`\n : `/${config.database}`;\n const url = new URL(`firebird://${auth}@${config.host}:${config.port}${dbPath}`);\n if (config.role) url.searchParams.set(\"role\", config.role);\n return url.toString();\n}\n","export type {\n ConnectionConfig,\n FirebirdVersion,\n DriverOptions,\n QueryEvent,\n QueryLogger,\n SqlDriver,\n SqlValue,\n TransactionContext,\n TransactionOptions,\n IsolationLevel,\n} from \"./types\";\nexport { FirebirdDriver } from \"./firebird-driver\";\nexport { parseConnectionUrl, buildConnectionUrl } from \"./url\";\n\nimport type { ConnectionConfig, DriverOptions, SqlDriver } from \"./types\";\nimport { FirebirdDriver } from \"./firebird-driver\";\nimport { parseConnectionUrl } from \"./url\";\n\n/**\n * Factory that builds a driver from either a connection URL or an explicit\n * config object. Centralizing creation here keeps the client decoupled from a\n * concrete driver class (Factory pattern / DIP).\n */\nexport function createDriver(\n source: string | ConnectionConfig,\n options?: DriverOptions,\n): SqlDriver {\n const config =\n typeof source === \"string\" ? parseConnectionUrl(source) : source;\n return new FirebirdDriver(config, options);\n}\n","import type { SqlValue } from \"@ember/driver\";\n\n/**\n * An accumulating SQL fragment that keeps text and bound parameters together,\n * so values are always parameterized (`?`) and never string-interpolated.\n * This is the core defense against SQL injection in the query layer.\n */\nexport class Sql {\n private parts: string[] = [];\n public readonly params: SqlValue[] = [];\n\n static raw(text: string): Sql {\n return new Sql().push(text);\n }\n\n static value(value: SqlValue): Sql {\n return new Sql().bind(value);\n }\n\n static join(fragments: Sql[], separator: string): Sql {\n const out = new Sql();\n fragments.forEach((frag, i) => {\n if (i > 0) out.push(separator);\n out.append(frag);\n });\n return out;\n }\n\n /** Append raw, trusted SQL text (keywords, already-escaped identifiers). */\n push(text: string): this {\n this.parts.push(text);\n return this;\n }\n\n /** Append a `?` placeholder bound to `value`. */\n bind(value: SqlValue): this {\n this.parts.push(\"?\");\n this.params.push(value);\n return this;\n }\n\n /** Append a comma-separated list of placeholders bound to `values`. */\n bindList(values: readonly SqlValue[]): this {\n this.parts.push(values.map(() => \"?\").join(\", \"));\n this.params.push(...values);\n return this;\n }\n\n /** Merge another fragment (text + params) into this one. */\n append(other: Sql): this {\n this.parts.push(other.text);\n this.params.push(...other.params);\n return this;\n }\n\n get text(): string {\n return this.parts.join(\"\");\n }\n\n isEmpty(): boolean {\n return this.text.trim().length === 0;\n }\n\n toQuery(): { sql: string; params: SqlValue[] } {\n return { sql: this.text, params: this.params };\n }\n}\n","import type { FirebirdVersion, SqlValue } from \"@ember/driver\";\nimport { Sql } from \"./fragment\";\n\n/**\n * Strategy interface for SQL generation. Encapsulates every dialect-specific\n * decision so the query compiler stays backend-agnostic. Only FirebirdDialect\n * is implemented today, but the engine never assumes Firebird directly.\n */\nexport interface SqlDialect {\n /** Quote an identifier (table/column/alias). */\n quoteId(name: string): string;\n /** Quote a `table.column` reference. */\n quoteRef(table: string, column: string): string;\n /** Pagination clause placed right after SELECT (e.g. `FIRST 10 SKIP 5`). */\n paginationClause(take?: number, skip?: number): string;\n /** Wrap a value for LIKE with case-insensitive mode. */\n caseInsensitive(expr: string): string;\n /** Map a default function name (now/uuid/...) to a SQL expression, if any. */\n defaultFunctionSql(name: string): string | null;\n /** Coerce a JS value into a driver-bindable SqlValue. */\n coerceValue(value: unknown): SqlValue;\n /** True if the dialect can paginate (controls FIRST/SKIP usage). */\n readonly supportsReturning: boolean;\n /** Native BOOLEAN type (Firebird 3+) vs SMALLINT fallback (2.1/2.5). */\n readonly supportsBooleanType: boolean;\n /** IDENTITY columns (Firebird 3+) vs generator+trigger (2.1/2.5). */\n readonly supportsIdentity: boolean;\n /** Window functions like ROW_NUMBER() OVER (...) (Firebird 3+). */\n readonly supportsWindowFunctions: boolean;\n /** DDL type used for boolean columns. */\n booleanColumnType(): string;\n}\n\n/**\n * Firebird 3+/4+ dialect.\n * - Identifiers are double-quoted to preserve case (introspection yields\n * UPPER-CASE names and quoting avoids accidental folding).\n * - Pagination uses `FIRST n SKIP m` after the SELECT keyword.\n * - Case-insensitive matching uses UPPER() on both sides.\n */\nexport interface FirebirdDialectOptions {\n version?: FirebirdVersion;\n}\n\nexport class FirebirdDialect implements SqlDialect {\n readonly supportsReturning = true;\n readonly version: FirebirdVersion;\n readonly supportsBooleanType: boolean;\n readonly supportsIdentity: boolean;\n readonly supportsWindowFunctions: boolean;\n\n constructor(options: FirebirdDialectOptions = {}) {\n this.version = options.version ?? \"3\";\n const rank = versionRank(this.version);\n this.supportsBooleanType = rank >= 30;\n this.supportsIdentity = rank >= 30;\n this.supportsWindowFunctions = rank >= 30;\n }\n\n booleanColumnType(): string {\n return this.supportsBooleanType ? \"BOOLEAN\" : \"SMALLINT\";\n }\n\n quoteId(name: string): string {\n // Escape embedded double quotes by doubling them.\n return `\"${name.replace(/\"/g, '\"\"')}\"`;\n }\n\n quoteRef(table: string, column: string): string {\n return `${this.quoteId(table)}.${this.quoteId(column)}`;\n }\n\n paginationClause(take?: number, skip?: number): string {\n const parts: string[] = [];\n if (typeof take === \"number\" && take >= 0) {\n parts.push(`FIRST ${Math.trunc(take)}`);\n }\n if (typeof skip === \"number\" && skip > 0) {\n parts.push(`SKIP ${Math.trunc(skip)}`);\n }\n return parts.join(\" \");\n }\n\n caseInsensitive(expr: string): string {\n return `UPPER(${expr})`;\n }\n\n defaultFunctionSql(name: string): string | null {\n switch (name) {\n case \"now\":\n return \"CURRENT_TIMESTAMP\";\n case \"uuid\":\n case \"cuid\":\n // Firebird can generate a 16-byte GUID; expose as a string-friendly UUID.\n return \"UUID_TO_CHAR(GEN_UUID())\";\n case \"autoincrement\":\n return null; // handled via generators/identity, not an inline default\n default:\n return null;\n }\n }\n\n coerceValue(value: unknown): SqlValue {\n if (value === null || value === undefined) return null;\n if (value instanceof Date) return value;\n if (Buffer.isBuffer(value)) return value;\n if (typeof value === \"boolean\") {\n // Firebird 2.1/2.5 have no BOOLEAN type: store as SMALLINT 0/1.\n return this.supportsBooleanType ? value : value ? 1 : 0;\n }\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") return value;\n // Json / objects are serialized to text.\n return JSON.stringify(value);\n }\n}\n\nfunction versionRank(version: FirebirdVersion): number {\n switch (version) {\n case \"2.1\":\n return 21;\n case \"2.5\":\n return 25;\n case \"3\":\n return 30;\n case \"4\":\n return 40;\n case \"5\":\n return 50;\n default:\n return 30;\n }\n}\n\n/** Helper to build `SELECT <pagination> ...` with the dialect's clause. */\nexport function selectKeyword(\n dialect: SqlDialect,\n take?: number,\n skip?: number,\n): Sql {\n const pagination = dialect.paginationClause(take, skip);\n return Sql.raw(pagination ? `SELECT ${pagination}` : \"SELECT\");\n}\n","import { type ModelNode, fieldColumn } from \"@ember/ast\";\nimport { QueryValidationError } from \"@ember/errors\";\nimport { Sql, type SqlDialect } from \"@ember/sql\";\nimport type { OrderByInput, SortOrder } from \"./args\";\n\n/**\n * Compile an `orderBy` argument into an `ORDER BY` fragment (without the\n * keyword). Accepts a single object or an ordered array of single-key objects,\n * matching Prisma's deterministic ordering semantics.\n */\nexport function compileOrderBy(\n model: ModelNode,\n tableAlias: string,\n orderBy: OrderByInput | undefined,\n dialect: SqlDialect,\n): Sql {\n if (!orderBy) return new Sql();\n const entries = normalize(orderBy);\n if (entries.length === 0) return new Sql();\n\n const parts = entries.map(([fieldName, dir]) => {\n const field = model.fields.find((f) => f.name === fieldName);\n if (!field || field.kind === \"object\") {\n throw new QueryValidationError(\n `Cannot order '${model.name}' by '${fieldName}'.`,\n );\n }\n const ref = dialect.quoteRef(tableAlias, fieldColumn(field));\n return Sql.raw(`${ref} ${dir === \"desc\" ? \"DESC\" : \"ASC\"}`);\n });\n\n return Sql.join(parts, \", \");\n}\n\nfunction normalize(orderBy: OrderByInput): [string, SortOrder][] {\n const list = Array.isArray(orderBy) ? orderBy : [orderBy];\n const out: [string, SortOrder][] = [];\n for (const obj of list) {\n for (const [key, value] of Object.entries(obj)) {\n if (value === \"asc\" || value === \"desc\") out.push([key, value]);\n }\n }\n return out;\n}\n","import {\n type FieldNode,\n type ModelNode,\n type SchemaDocument,\n fieldColumn,\n findModel,\n idFields,\n} from \"@ember/ast\";\nimport { QueryValidationError } from \"@ember/errors\";\n\nexport interface ResolvedRelation {\n field: FieldNode;\n relatedModel: ModelNode;\n /** Field names on the owning model joined to the related model. */\n fromFields: string[];\n /** Field names on the related model. */\n toFields: string[];\n /** Column names (db) on the owning model. */\n fromColumns: string[];\n /** Column names (db) on the related model. */\n toColumns: string[];\n isList: boolean;\n /** True when this side physically holds the foreign key. */\n owns: boolean;\n}\n\n/**\n * Resolve how a relation field joins its two models, regardless of which side\n * declared `@relation(fields/references)`. Returns the column pairs the engine\n * uses to load and stitch related rows.\n */\nexport function resolveRelation(\n schema: SchemaDocument,\n model: ModelNode,\n field: FieldNode,\n): ResolvedRelation {\n if (field.kind !== \"object\") {\n throw new QueryValidationError(\n `Field '${model.name}.${field.name}' is not a relation.`,\n );\n }\n const relatedModel = findModel(schema, field.type);\n if (!relatedModel) {\n throw new QueryValidationError(\n `Relation '${model.name}.${field.name}' points to unknown model '${field.type}'.`,\n );\n }\n\n // Owning side: this field declares fields/references directly.\n if (field.relation?.fields?.length) {\n const fromFields = field.relation.fields;\n const toFields =\n field.relation.references ?? idFields(relatedModel).map((f) => f.name);\n return build(field, model, relatedModel, fromFields, toFields, true);\n }\n\n // Back side: find the partner field on the related model that owns the FK.\n const partner = findPartnerField(schema, model, field, relatedModel);\n if (partner?.relation?.fields?.length) {\n // related.partner.fields -> related columns; references -> this model columns\n const toFields = partner.relation.fields;\n const fromFields =\n partner.relation.references ?? idFields(model).map((f) => f.name);\n return build(field, model, relatedModel, fromFields, toFields, false);\n }\n\n // Fallback: implicit relation by primary keys (rare, e.g. 1:1 by id).\n const fromFields = idFields(model).map((f) => f.name);\n const toFields = idFields(relatedModel).map((f) => f.name);\n return build(field, model, relatedModel, fromFields, toFields, false);\n}\n\nfunction build(\n field: FieldNode,\n model: ModelNode,\n relatedModel: ModelNode,\n fromFields: string[],\n toFields: string[],\n owns: boolean,\n): ResolvedRelation {\n return {\n field,\n relatedModel,\n fromFields,\n toFields,\n fromColumns: fromFields.map((n) => columnOf(model, n)),\n toColumns: toFields.map((n) => columnOf(relatedModel, n)),\n isList: field.isList,\n owns,\n };\n}\n\nfunction columnOf(model: ModelNode, fieldName: string): string {\n const f = model.fields.find((x) => x.name === fieldName);\n if (!f) {\n throw new QueryValidationError(\n `Field '${fieldName}' not found on model '${model.name}'.`,\n );\n }\n return fieldColumn(f);\n}\n\nfunction findPartnerField(\n _schema: SchemaDocument,\n model: ModelNode,\n field: FieldNode,\n relatedModel: ModelNode,\n): FieldNode | undefined {\n const candidates = relatedModel.fields.filter(\n (f) => f.kind === \"object\" && f.type === model.name,\n );\n if (field.relation?.name) {\n const byName = candidates.find(\n (f) => f.relation?.name === field.relation?.name,\n );\n if (byName) return byName;\n }\n // Prefer the side that owns the FK.\n const owning = candidates.find((f) => f.relation?.fields?.length);\n return owning ?? candidates[0];\n}\n","import {\n type FieldNode,\n type ModelNode,\n type SchemaDocument,\n fieldColumn,\n modelTable,\n} from \"@ember/ast\";\nimport { QueryValidationError } from \"@ember/errors\";\nimport { Sql, type SqlDialect } from \"@ember/sql\";\nimport { isPlainObject } from \"@ember/utils\";\nimport type { ScalarFilter, WhereInput } from \"./args\";\nimport { resolveRelation } from \"./relations\";\n\nexport interface CompileContext {\n schema: SchemaDocument;\n dialect: SqlDialect;\n alias: { next: number };\n}\n\nconst SCALAR_OPERATORS = new Set([\n \"equals\",\n \"not\",\n \"in\",\n \"notIn\",\n \"lt\",\n \"lte\",\n \"gt\",\n \"gte\",\n \"contains\",\n \"startsWith\",\n \"endsWith\",\n \"mode\",\n]);\n\n/**\n * Compile a `where` object for `model` (referenced by `tableAlias`) into a\n * boolean Sql fragment. All literal values are bound as `?` parameters.\n * Returns an empty fragment when the filter is empty (caller omits WHERE).\n */\nexport function compileWhere(\n model: ModelNode,\n tableAlias: string,\n where: WhereInput | undefined,\n ctx: CompileContext,\n): Sql {\n if (!where || Object.keys(where).length === 0) return new Sql();\n const conditions: Sql[] = [];\n\n for (const [key, value] of Object.entries(where)) {\n if (value === undefined) continue;\n\n if (key === \"AND\") {\n conditions.push(combineList(asArray(value), model, tableAlias, ctx, \"AND\"));\n continue;\n }\n if (key === \"OR\") {\n conditions.push(combineList(asArray(value), model, tableAlias, ctx, \"OR\"));\n continue;\n }\n if (key === \"NOT\") {\n const inner = combineList(asArray(value), model, tableAlias, ctx, \"AND\");\n if (!inner.isEmpty()) {\n conditions.push(new Sql().push(\"NOT (\").append(inner).push(\")\"));\n }\n continue;\n }\n\n const field = model.fields.find((f) => f.name === key);\n if (!field) {\n throw new QueryValidationError(\n `Unknown field '${key}' in where clause of model '${model.name}'.`,\n );\n }\n\n if (field.kind === \"object\") {\n conditions.push(\n compileRelationFilter(model, tableAlias, field, value, ctx),\n );\n } else {\n conditions.push(compileScalar(tableAlias, field, value, ctx));\n }\n }\n\n const nonEmpty = conditions.filter((c) => !c.isEmpty());\n if (nonEmpty.length === 0) return new Sql();\n return wrapAnd(nonEmpty);\n}\n\nfunction combineList(\n list: WhereInput[],\n model: ModelNode,\n tableAlias: string,\n ctx: CompileContext,\n op: \"AND\" | \"OR\",\n): Sql {\n const parts = list\n .map((w) => compileWhere(model, tableAlias, w, ctx))\n .filter((p) => !p.isEmpty());\n if (parts.length === 0) return new Sql();\n if (parts.length === 1) return parts[0]!;\n const joined = Sql.join(\n parts.map((p) => new Sql().push(\"(\").append(p).push(\")\")),\n ` ${op} `,\n );\n return new Sql().push(\"(\").append(joined).push(\")\");\n}\n\nfunction wrapAnd(parts: Sql[]): Sql {\n if (parts.length === 1) return parts[0]!;\n const joined = Sql.join(\n parts.map((p) => new Sql().push(\"(\").append(p).push(\")\")),\n \" AND \",\n );\n return new Sql().push(\"(\").append(joined).push(\")\");\n}\n\nfunction compileScalar(\n tableAlias: string,\n field: FieldNode,\n value: unknown,\n ctx: CompileContext,\n): Sql {\n const ref = ctx.dialect.quoteRef(tableAlias, fieldColumn(field));\n\n // JSON fields are stored as text; filter on the serialized representation.\n if (field.type === \"Json\" && isJsonFilterObject(value)) {\n return compileJsonFilter(ref, field, value as Record<string, unknown>, ctx);\n }\n\n // Direct value shorthand: `{ field: value }` == `{ field: { equals: value } }`.\n if (!isFilterObject(value)) {\n if (value === null) return Sql.raw(`${ref} IS NULL`);\n return new Sql().push(`${ref} = `).bind(ctx.dialect.coerceValue(value));\n }\n\n const filter = value as ScalarFilter;\n const insensitive = filter.mode === \"insensitive\";\n const parts: Sql[] = [];\n\n for (const [op, opValue] of Object.entries(filter)) {\n if (op === \"mode\") continue;\n if (opValue === undefined) continue;\n parts.push(compileOperator(ref, op, opValue, insensitive, ctx));\n }\n if (parts.length === 0) return new Sql();\n return wrapAnd(parts);\n}\n\nconst JSON_OPERATORS = new Set([\n \"equals\",\n \"not\",\n \"string_contains\",\n \"string_starts_with\",\n \"string_ends_with\",\n \"path\",\n]);\n\nfunction isJsonFilterObject(value: unknown): boolean {\n return (\n isPlainObject(value) &&\n Object.keys(value).some((k) => JSON_OPERATORS.has(k))\n );\n}\n\n/**\n * Filter a Json field. Firebird has no JSON SQL functions, so filtering works\n * on the serialized text: `equals`/`not` compare the stored JSON string and\n * `string_contains`/`string_starts_with`/`string_ends_with` use LIKE. The\n * `path` operator is rejected (no JSON path support in Firebird).\n */\nfunction compileJsonFilter(\n ref: string,\n field: FieldNode,\n filter: Record<string, unknown>,\n ctx: CompileContext,\n): Sql {\n const parts: Sql[] = [];\n for (const [op, raw] of Object.entries(filter)) {\n if (raw === undefined) continue;\n switch (op) {\n case \"path\":\n throw new QueryValidationError(\n `JSON 'path' filtering is not supported on Firebird (no JSON SQL functions). ` +\n `Filter '${field.name}' in application code or with a generated column.`,\n );\n case \"equals\":\n parts.push(\n raw === null\n ? Sql.raw(`${ref} IS NULL`)\n : new Sql().push(`${ref} = `).bind(jsonText(raw)),\n );\n break;\n case \"not\":\n parts.push(\n raw === null\n ? Sql.raw(`${ref} IS NOT NULL`)\n : new Sql().push(`${ref} <> `).bind(jsonText(raw)),\n );\n break;\n case \"string_contains\":\n parts.push(jsonLike(ref, `%${escapeLike(String(raw))}%`));\n break;\n case \"string_starts_with\":\n parts.push(jsonLike(ref, `${escapeLike(String(raw))}%`));\n break;\n case \"string_ends_with\":\n parts.push(jsonLike(ref, `%${escapeLike(String(raw))}`));\n break;\n default:\n throw new QueryValidationError(`Unsupported JSON filter operator '${op}'.`);\n }\n }\n return parts.length ? wrapAnd(parts) : new Sql();\n}\n\nfunction jsonText(value: unknown): string {\n return typeof value === \"string\" ? value : JSON.stringify(value);\n}\n\nfunction jsonLike(ref: string, pattern: string): Sql {\n return new Sql().push(`${ref} LIKE `).bind(pattern).push(\" ESCAPE '\\\\'\");\n}\n\nfunction compileOperator(\n ref: string,\n op: string,\n value: unknown,\n insensitive: boolean,\n ctx: CompileContext,\n): Sql {\n const d = ctx.dialect;\n const bound = (v: unknown) => d.coerceValue(v);\n const lhs = insensitive ? d.caseInsensitive(ref) : ref;\n const rhs = (v: unknown) =>\n insensitive && typeof v === \"string\"\n ? new Sql().push(\"UPPER(\").bind(bound(v)).push(\")\")\n : Sql.value(bound(v));\n\n switch (op) {\n case \"equals\":\n if (value === null) return Sql.raw(`${ref} IS NULL`);\n return new Sql().push(`${lhs} = `).append(rhs(value));\n case \"not\":\n if (value === null) return Sql.raw(`${ref} IS NOT NULL`);\n if (isFilterObject(value)) {\n const inner = compileScalarFromRef(ref, value as ScalarFilter, insensitive, ctx);\n return new Sql().push(\"NOT (\").append(inner).push(\")\");\n }\n return new Sql().push(`${lhs} <> `).append(rhs(value));\n case \"in\":\n return inClause(lhs, asUnknownArray(value), insensitive, ctx, false);\n case \"notIn\":\n return inClause(lhs, asUnknownArray(value), insensitive, ctx, true);\n case \"lt\":\n return new Sql().push(`${lhs} < `).append(rhs(value));\n case \"lte\":\n return new Sql().push(`${lhs} <= `).append(rhs(value));\n case \"gt\":\n return new Sql().push(`${lhs} > `).append(rhs(value));\n case \"gte\":\n return new Sql().push(`${lhs} >= `).append(rhs(value));\n case \"contains\":\n return likeClause(lhs, `%${escapeLike(String(value))}%`, insensitive);\n case \"startsWith\":\n return likeClause(lhs, `${escapeLike(String(value))}%`, insensitive);\n case \"endsWith\":\n return likeClause(lhs, `%${escapeLike(String(value))}`, insensitive);\n default:\n throw new QueryValidationError(`Unsupported filter operator '${op}'.`);\n }\n}\n\nfunction compileScalarFromRef(\n ref: string,\n filter: ScalarFilter,\n insensitive: boolean,\n ctx: CompileContext,\n): Sql {\n const parts: Sql[] = [];\n for (const [op, opValue] of Object.entries(filter)) {\n if (op === \"mode\" || opValue === undefined) continue;\n parts.push(compileOperator(ref, op, opValue, insensitive, ctx));\n }\n return parts.length ? wrapAnd(parts) : new Sql();\n}\n\nfunction inClause(\n lhs: string,\n values: unknown[],\n insensitive: boolean,\n ctx: CompileContext,\n negate: boolean,\n): Sql {\n if (values.length === 0) {\n // `IN ()` is invalid; emulate the empty-set semantics.\n return Sql.raw(negate ? \"1 = 1\" : \"1 = 0\");\n }\n const coerced = values.map((v) =>\n insensitive && typeof v === \"string\"\n ? String(v).toUpperCase()\n : ctx.dialect.coerceValue(v),\n );\n const sql = new Sql().push(`${lhs} ${negate ? \"NOT IN\" : \"IN\"} (`);\n sql.bindList(coerced);\n sql.push(\")\");\n return sql;\n}\n\nfunction likeClause(lhs: string, pattern: string, insensitive: boolean): Sql {\n const value = insensitive ? pattern.toUpperCase() : pattern;\n return new Sql().push(`${lhs} LIKE `).bind(value).push(\" ESCAPE '\\\\'\");\n}\n\nfunction compileRelationFilter(\n model: ModelNode,\n tableAlias: string,\n field: FieldNode,\n value: unknown,\n ctx: CompileContext,\n): Sql {\n const rel = resolveRelation(ctx.schema, model, field);\n const filter = (isPlainObject(value) ? value : {}) as Record<string, WhereInput | null>;\n\n // To-one shorthand: `{ author: { name: \"x\" } }` behaves like `is`.\n const hasOperator =\n \"some\" in filter || \"every\" in filter || \"none\" in filter ||\n \"is\" in filter || \"isNot\" in filter;\n\n if (!rel.isList && !hasOperator) {\n return existsClause(model, tableAlias, rel, value as WhereInput, ctx, false);\n }\n\n const parts: Sql[] = [];\n if (filter.some !== undefined) {\n parts.push(existsClause(model, tableAlias, rel, filter.some ?? {}, ctx, false));\n }\n if (filter.none !== undefined) {\n parts.push(existsClause(model, tableAlias, rel, filter.none ?? {}, ctx, true));\n }\n if (filter.every !== undefined) {\n // NOT EXISTS (related WHERE join AND NOT (sub))\n parts.push(\n existsClause(model, tableAlias, rel, filter.every ?? {}, ctx, true, true),\n );\n }\n if (filter.is !== undefined) {\n if (filter.is === null) {\n parts.push(notExists(model, tableAlias, rel, {}, ctx));\n } else {\n parts.push(existsClause(model, tableAlias, rel, filter.is, ctx, false));\n }\n }\n if (filter.isNot !== undefined) {\n if (filter.isNot === null) {\n parts.push(existsClause(model, tableAlias, rel, {}, ctx, false));\n } else {\n parts.push(existsClause(model, tableAlias, rel, filter.isNot, ctx, true));\n }\n }\n return parts.length ? wrapAnd(parts) : new Sql();\n}\n\nfunction notExists(\n model: ModelNode,\n tableAlias: string,\n rel: ReturnType<typeof resolveRelation>,\n sub: WhereInput,\n ctx: CompileContext,\n): Sql {\n return existsClause(model, tableAlias, rel, sub, ctx, true);\n}\n\n/**\n * Build `[NOT] EXISTS (SELECT 1 FROM related child WHERE join [AND sub])`.\n * When `everyMode` is set, the subfilter is negated to express `every`.\n */\nfunction existsClause(\n _model: ModelNode,\n tableAlias: string,\n rel: ReturnType<typeof resolveRelation>,\n sub: WhereInput,\n ctx: CompileContext,\n negate: boolean,\n everyMode = false,\n): Sql {\n const childAlias = `r${ctx.alias.next++}`;\n const childTable = ctx.dialect.quoteId(modelTable(rel.relatedModel));\n const sql = new Sql();\n sql.push(`${negate ? \"NOT EXISTS\" : \"EXISTS\"} (SELECT 1 FROM ${childTable} ${ctx.dialect.quoteId(childAlias)} WHERE `);\n\n const joins = rel.fromColumns.map((fromCol, i) => {\n const toCol = rel.toColumns[i]!;\n return `${ctx.dialect.quoteRef(childAlias, toCol)} = ${ctx.dialect.quoteRef(tableAlias, fromCol)}`;\n });\n sql.push(joins.join(\" AND \"));\n\n const subSql = compileWhere(rel.relatedModel, childAlias, sub, ctx);\n if (!subSql.isEmpty()) {\n if (everyMode) {\n sql.push(\" AND NOT (\").append(subSql).push(\")\");\n } else {\n sql.push(\" AND \").append(subSql);\n }\n }\n sql.push(\")\");\n return sql;\n}\n\n// ---- helpers ------------------------------------------------------------\n\nfunction isFilterObject(value: unknown): boolean {\n if (!isPlainObject(value)) return false;\n return Object.keys(value).some((k) => SCALAR_OPERATORS.has(k));\n}\n\nfunction asArray(value: unknown): WhereInput[] {\n const list = Array.isArray(value) ? value : [value];\n return list.filter(\n (v): v is WhereInput => v !== null && typeof v === \"object\",\n );\n}\n\nfunction asUnknownArray(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [value];\n}\n\nfunction escapeLike(input: string): string {\n return input.replace(/[\\\\%_]/g, (c) => `\\\\${c}`);\n}\n","import { type ModelNode, fieldColumn } from \"@ember/ast\";\nimport { QueryValidationError } from \"@ember/errors\";\nimport { Sql, type SqlDialect } from \"@ember/sql\";\nimport { isPlainObject } from \"@ember/utils\";\nimport type { WhereInput } from \"./args\";\nimport { type CompileContext, compileWhere } from \"./where\";\n\nconst AGG_FN: Record<string, string> = {\n _count: \"COUNT\",\n _sum: \"SUM\",\n _avg: \"AVG\",\n _min: \"MIN\",\n _max: \"MAX\",\n};\n\nconst COMPARATORS: Record<string, string> = {\n equals: \"=\",\n not: \"<>\",\n gt: \">\",\n gte: \">=\",\n lt: \"<\",\n lte: \"<=\",\n};\n\n/**\n * Compile a groupBy `having` clause. Keys may be:\n * - `AND` / `OR` / `NOT` — boolean composition;\n * - a scalar field with a normal filter — a condition on the group column;\n * - a scalar field wrapping aggregates (`{ field: { _sum: { gt } } }`) — a\n * condition on `SUM(col)`, `AVG(col)`, etc.;\n * - a top-level aggregate (`{ _count: { field: { gt } } }`).\n */\nexport function compileHaving(\n model: ModelNode,\n alias: string,\n having: WhereInput | undefined,\n ctx: CompileContext,\n): Sql {\n if (!having || Object.keys(having).length === 0) return new Sql();\n const parts: Sql[] = [];\n\n for (const [key, value] of Object.entries(having)) {\n if (value === undefined) continue;\n\n if (key === \"AND\" || key === \"OR\") {\n const list = (Array.isArray(value) ? value : [value]) as WhereInput[];\n const compiled = list\n .map((w) => compileHaving(model, alias, w, ctx))\n .filter((s) => !s.isEmpty());\n if (compiled.length) parts.push(joinBool(compiled, key));\n continue;\n }\n if (key === \"NOT\") {\n const inner = compileHaving(model, alias, value as WhereInput, ctx);\n if (!inner.isEmpty()) parts.push(new Sql().push(\"NOT (\").append(inner).push(\")\"));\n continue;\n }\n\n // Top-level aggregate, e.g. { _count: { id: { gt: 1 } } }.\n if (key in AGG_FN) {\n parts.push(...aggregateConditions(model, alias, key, value, ctx));\n continue;\n }\n\n const field = model.fields.find((f) => f.name === key && f.kind !== \"object\");\n if (!field) {\n throw new QueryValidationError(\n `Unknown having field '${model.name}.${key}'.`,\n );\n }\n\n if (isAggregateWrapper(value)) {\n const ref = ctx.dialect.quoteRef(alias, fieldColumn(field));\n for (const [agg, filter] of Object.entries(value as Record<string, unknown>)) {\n if (!(agg in AGG_FN)) continue;\n parts.push(comparison(`${AGG_FN[agg]}(${ref})`, filter, ctx.dialect));\n }\n } else {\n // Plain condition on the group column — reuse the where compiler.\n const cond = compileWhere(model, alias, { [key]: value }, ctx);\n if (!cond.isEmpty()) parts.push(cond);\n }\n }\n\n const nonEmpty = parts.filter((p) => !p.isEmpty());\n if (nonEmpty.length === 0) return new Sql();\n return joinBool(nonEmpty, \"AND\");\n}\n\nfunction aggregateConditions(\n model: ModelNode,\n alias: string,\n agg: string,\n spec: unknown,\n ctx: CompileContext,\n): Sql[] {\n if (!isPlainObject(spec)) return [];\n const out: Sql[] = [];\n for (const [fieldName, filter] of Object.entries(spec)) {\n const field = model.fields.find((f) => f.name === fieldName && f.kind !== \"object\");\n if (!field) continue;\n const ref = ctx.dialect.quoteRef(alias, fieldColumn(field));\n out.push(comparison(`${AGG_FN[agg]}(${ref})`, filter, ctx.dialect));\n }\n return out;\n}\n\nfunction comparison(lhs: string, filter: unknown, dialect: SqlDialect): Sql {\n if (!isPlainObject(filter)) {\n return new Sql().push(`${lhs} = `).bind(dialect.coerceValue(filter));\n }\n const parts: Sql[] = [];\n for (const [op, v] of Object.entries(filter)) {\n const sqlOp = COMPARATORS[op];\n if (!sqlOp) {\n throw new QueryValidationError(`Unsupported having operator '${op}'.`);\n }\n parts.push(new Sql().push(`${lhs} ${sqlOp} `).bind(dialect.coerceValue(v)));\n }\n return parts.length === 1 ? parts[0]! : joinBool(parts, \"AND\");\n}\n\nfunction isAggregateWrapper(value: unknown): boolean {\n return isPlainObject(value) && Object.keys(value).some((k) => k in AGG_FN);\n}\n\nfunction joinBool(parts: Sql[], op: \"AND\" | \"OR\"): Sql {\n if (parts.length === 1) return parts[0]!;\n const joined = Sql.join(\n parts.map((p) => new Sql().push(\"(\").append(p).push(\")\")),\n ` ${op} `,\n );\n return new Sql().push(\"(\").append(joined).push(\")\");\n}\n","import {\n type FieldNode,\n type ModelNode,\n fieldColumn,\n idFields,\n modelTable,\n} from \"@ember/ast\";\nimport { QueryValidationError } from \"@ember/errors\";\nimport { Sql, type SqlDialect } from \"@ember/sql\";\nimport type { SqlValue } from \"@ember/driver\";\nimport type { AggregateArgs, OrderByInput, SortOrder, WhereInput } from \"./args\";\nimport { compileOrderBy } from \"./order\";\nimport { compileHaving } from \"./having\";\nimport { type CompileContext, compileWhere } from \"./where\";\n\nexport interface SelectStatement {\n sql: Sql;\n /** Scalar fields projected, in result order. */\n columns: FieldNode[];\n}\n\n/**\n * A single column assignment in an UPDATE. `set` binds a literal value;\n * `arith` produces `\"COL\" = \"COL\" <op> ?` for atomic numeric operators\n * (increment/decrement/multiply/divide).\n */\nexport type ColumnUpdate =\n | { kind: \"set\"; value: SqlValue }\n | { kind: \"arith\"; op: \"+\" | \"-\" | \"*\" | \"/\"; value: SqlValue };\n\n/** Wrap a plain column→value map as a set-only ColumnUpdate map. */\nexport function setAssignments(\n values: Map<string, SqlValue>,\n): Map<string, ColumnUpdate> {\n const out = new Map<string, ColumnUpdate>();\n for (const [col, value] of values) out.set(col, { kind: \"set\", value });\n return out;\n}\n\nconst ROOT_ALIAS = \"t0\";\n\nexport function newContext(\n schema: CompileContext[\"schema\"],\n dialect: SqlDialect,\n): CompileContext {\n return { schema, dialect, alias: { next: 1 } };\n}\n\ninterface FindOptions {\n where?: WhereInput;\n orderBy?: OrderByInput;\n take?: number;\n skip?: number;\n}\n\n/** SELECT <projection> FROM model [WHERE] [ORDER BY] with FIRST/SKIP pagination. */\nexport function compileFindMany(\n model: ModelNode,\n options: FindOptions,\n projection: FieldNode[],\n ctx: CompileContext,\n): SelectStatement {\n const d = ctx.dialect;\n const cols = projection.map(\n (f) =>\n `${d.quoteRef(ROOT_ALIAS, fieldColumn(f))} AS ${d.quoteId(f.name)}`,\n );\n const sql = new Sql();\n const pagination = d.paginationClause(options.take, options.skip);\n sql.push(pagination ? `SELECT ${pagination} ` : \"SELECT \");\n sql.push(cols.join(\", \"));\n sql.push(` FROM ${d.quoteId(modelTable(model))} ${d.quoteId(ROOT_ALIAS)}`);\n\n appendWhere(sql, model, options.where, ctx);\n const order = compileOrderBy(model, ROOT_ALIAS, options.orderBy, d);\n if (!order.isEmpty()) sql.push(\" ORDER BY \").append(order);\n\n return { sql, columns: projection };\n}\n\n/**\n * SELECT ... with `distinct` pushed to SQL via ROW_NUMBER() (Firebird 3+).\n * Keeps the first row per distinct-field tuple in `orderBy` order, then applies\n * pagination on the outer query:\n *\n * SELECT FIRST/SKIP <cols> FROM (\n * SELECT <cols>, ROW_NUMBER() OVER (PARTITION BY <distinct> ORDER BY <ord>) \"__rn\"\n * FROM <table> t0 [WHERE ...]\n * ) sub WHERE sub.\"__rn\" = 1 [ORDER BY ...]\n */\nexport function compileDistinctFindMany(\n model: ModelNode,\n options: FindOptions,\n projection: FieldNode[],\n distinctFields: FieldNode[],\n ctx: CompileContext,\n): SelectStatement {\n const d = ctx.dialect;\n const innerOrder = options.orderBy\n ? compileOrderBy(model, ROOT_ALIAS, options.orderBy, d)\n : defaultOrder(model, d);\n const partitionBy = distinctFields\n .map((f) => d.quoteRef(ROOT_ALIAS, fieldColumn(f)))\n .join(\", \");\n\n const inner = new Sql();\n const innerCols = projection.map(\n (f) => `${d.quoteRef(ROOT_ALIAS, fieldColumn(f))} AS ${d.quoteId(f.name)}`,\n );\n inner.push(`SELECT ${innerCols.join(\", \")}, ROW_NUMBER() OVER (PARTITION BY ${partitionBy} ORDER BY `);\n inner.append(innerOrder);\n inner.push(`) AS ${d.quoteId(\"__rn\")}`);\n inner.push(` FROM ${d.quoteId(modelTable(model))} ${d.quoteId(ROOT_ALIAS)}`);\n appendWhere(inner, model, options.where, ctx);\n\n const sql = new Sql();\n const pagination = d.paginationClause(options.take, options.skip);\n const sub = \"sub\";\n const outerCols = projection\n .map((f) => `${d.quoteRef(sub, f.name)} AS ${d.quoteId(f.name)}`)\n .join(\", \");\n sql.push(pagination ? `SELECT ${pagination} ` : \"SELECT \");\n sql.push(outerCols);\n sql.push(` FROM (`).append(inner).push(`) ${d.quoteId(sub)}`);\n sql.push(` WHERE ${d.quoteRef(sub, \"__rn\")} = 1`);\n\n // Re-apply ordering on the outer query (referencing the projected aliases).\n const outerOrder = outerOrderBy(model, sub, options.orderBy, d);\n if (!outerOrder.isEmpty()) sql.push(\" ORDER BY \").append(outerOrder);\n\n return { sql, columns: projection };\n}\n\n/** SELECT COUNT(*) ... */\nexport function compileCount(\n model: ModelNode,\n where: WhereInput | undefined,\n ctx: CompileContext,\n pagination?: { take?: number; skip?: number },\n): Sql {\n const d = ctx.dialect;\n const sql = new Sql();\n const clause = pagination\n ? d.paginationClause(pagination.take, pagination.skip)\n : \"\";\n sql.push(clause ? `SELECT ${clause} COUNT(*) AS \"_count\"` : `SELECT COUNT(*) AS \"_count\"`);\n sql.push(` FROM ${d.quoteId(modelTable(model))} ${d.quoteId(ROOT_ALIAS)}`);\n appendWhere(sql, model, where, ctx);\n return sql;\n}\n\n/** Aggregate functions (_count/_avg/_sum/_min/_max) over a filtered set. */\nexport function compileAggregate(\n model: ModelNode,\n args: AggregateArgs,\n ctx: CompileContext,\n): Sql {\n const d = ctx.dialect;\n const selects = aggregateSelections(model, args, d);\n if (selects.length === 0) {\n throw new QueryValidationError(\"Aggregate requires at least one operator.\");\n }\n const sql = new Sql();\n sql.push(`SELECT ${selects.join(\", \")}`);\n sql.push(` FROM ${d.quoteId(modelTable(model))} ${d.quoteId(ROOT_ALIAS)}`);\n appendWhere(sql, model, args.where, ctx);\n return sql;\n}\n\n/** GROUP BY with aggregates and optional HAVING. */\nexport function compileGroupBy(\n model: ModelNode,\n args: AggregateArgs & { by: string[]; having?: WhereInput },\n ctx: CompileContext,\n): { sql: Sql; groupColumns: FieldNode[] } {\n const d = ctx.dialect;\n const groupColumns = args.by.map((name) => requireScalar(model, name));\n const groupSelects = groupColumns.map(\n (f) => `${d.quoteRef(ROOT_ALIAS, fieldColumn(f))} AS ${d.quoteId(f.name)}`,\n );\n const aggSelects = aggregateSelections(model, args, d);\n\n const sql = new Sql();\n sql.push(`SELECT ${[...groupSelects, ...aggSelects].join(\", \")}`);\n sql.push(` FROM ${d.quoteId(modelTable(model))} ${d.quoteId(ROOT_ALIAS)}`);\n appendWhere(sql, model, args.where, ctx);\n sql.push(\n ` GROUP BY ${groupColumns\n .map((f) => d.quoteRef(ROOT_ALIAS, fieldColumn(f)))\n .join(\", \")}`,\n );\n\n const having = compileHaving(model, ROOT_ALIAS, args.having, ctx);\n if (!having.isEmpty()) sql.push(\" HAVING \").append(having);\n\n const order = compileOrderBy(model, ROOT_ALIAS, args.orderBy, d);\n if (!order.isEmpty()) sql.push(\" ORDER BY \").append(order);\n return { sql, groupColumns };\n}\n\n/** INSERT ... [RETURNING ...]. `row` maps column->value (already coerced upstream). */\nexport function compileInsert(\n model: ModelNode,\n row: Map<string, SqlValue>,\n ctx: CompileContext,\n returning: FieldNode[],\n): SelectStatement {\n const d = ctx.dialect;\n const sql = new Sql();\n const columns = [...row.keys()];\n sql.push(`INSERT INTO ${d.quoteId(modelTable(model))} (`);\n sql.push(columns.map((c) => d.quoteId(c)).join(\", \"));\n sql.push(\") VALUES (\");\n sql.bindList(columns.map((c) => row.get(c)!));\n sql.push(\")\");\n appendReturning(sql, d, returning);\n return { sql, columns: returning };\n}\n\n/** UPDATE table alias SET ... WHERE ... [RETURNING ...]. */\nexport function compileUpdate(\n model: ModelNode,\n where: WhereInput | undefined,\n assignments: Map<string, ColumnUpdate>,\n ctx: CompileContext,\n returning?: FieldNode[],\n): SelectStatement {\n const d = ctx.dialect;\n if (assignments.size === 0) {\n throw new QueryValidationError(\"Update requires at least one field to set.\");\n }\n const sql = new Sql();\n sql.push(`UPDATE ${d.quoteId(modelTable(model))} ${d.quoteId(ROOT_ALIAS)} SET `);\n const cols = [...assignments.keys()];\n cols.forEach((col, i) => {\n if (i > 0) sql.push(\", \");\n const assignment = assignments.get(col)!;\n const quoted = d.quoteId(col);\n if (assignment.kind === \"arith\") {\n sql.push(`${quoted} = ${quoted} ${assignment.op} `).bind(assignment.value);\n } else {\n sql.push(`${quoted} = `).bind(assignment.value);\n }\n });\n appendWhere(sql, model, where, ctx);\n if (returning) appendReturning(sql, d, returning);\n return { sql, columns: returning ?? [] };\n}\n\n/** DELETE FROM table alias WHERE ... [RETURNING ...]. */\nexport function compileDelete(\n model: ModelNode,\n where: WhereInput | undefined,\n ctx: CompileContext,\n returning?: FieldNode[],\n): SelectStatement {\n const d = ctx.dialect;\n const sql = new Sql();\n sql.push(\n `DELETE FROM ${d.quoteId(modelTable(model))} ${d.quoteId(ROOT_ALIAS)}`,\n );\n appendWhere(sql, model, where, ctx);\n if (returning) appendReturning(sql, d, returning);\n return { sql, columns: returning ?? [] };\n}\n\n// ---- internals ----------------------------------------------------------\n\nfunction appendWhere(\n sql: Sql,\n model: ModelNode,\n where: WhereInput | undefined,\n ctx: CompileContext,\n): void {\n const compiled = compileWhere(model, ROOT_ALIAS, where, ctx);\n if (!compiled.isEmpty()) sql.push(\" WHERE \").append(compiled);\n}\n\n/** Deterministic default ordering (primary key, ascending) on the inner alias. */\nfunction defaultOrder(model: ModelNode, d: SqlDialect): Sql {\n const ids = idFields(model);\n const cols = (ids.length ? ids : model.fields.filter((f) => f.kind !== \"object\"))\n .map((f) => `${d.quoteRef(ROOT_ALIAS, fieldColumn(f))} ASC`);\n return Sql.raw(cols.join(\", \"));\n}\n\n/** ORDER BY for the outer distinct query, referencing projected name aliases. */\nfunction outerOrderBy(\n model: ModelNode,\n alias: string,\n orderBy: OrderByInput | undefined,\n d: SqlDialect,\n): Sql {\n if (!orderBy) return new Sql();\n const list = Array.isArray(orderBy) ? orderBy : [orderBy];\n const parts: Sql[] = [];\n for (const obj of list) {\n for (const [name, dir] of Object.entries(obj)) {\n if (dir !== \"asc\" && dir !== \"desc\") continue;\n if (!model.fields.some((f) => f.name === name && f.kind !== \"object\")) {\n continue;\n }\n parts.push(\n Sql.raw(`${d.quoteRef(alias, name)} ${(dir as SortOrder) === \"desc\" ? \"DESC\" : \"ASC\"}`),\n );\n }\n }\n return Sql.join(parts, \", \");\n}\n\nfunction appendReturning(sql: Sql, d: SqlDialect, returning: FieldNode[]): void {\n if (returning.length === 0) return;\n sql.push(\" RETURNING \");\n sql.push(\n returning\n .map((f) => `${d.quoteId(fieldColumn(f))} AS ${d.quoteId(f.name)}`)\n .join(\", \"),\n );\n}\n\nfunction aggregateSelections(\n model: ModelNode,\n args: AggregateArgs,\n d: SqlDialect,\n): string[] {\n const out: string[] = [];\n if (args._count) {\n if (args._count === true) {\n out.push(`COUNT(*) AS \"_count_all\"`);\n } else {\n for (const field of trueKeys(args._count)) {\n const col = d.quoteRef(ROOT_ALIAS, fieldColumn(requireScalar(model, field)));\n out.push(`COUNT(${col}) AS ${d.quoteId(`_count_${field}`)}`);\n }\n }\n }\n pushAgg(out, \"SUM\", \"_sum\", model, args._sum, d);\n pushAgg(out, \"AVG\", \"_avg\", model, args._avg, d);\n pushAgg(out, \"MIN\", \"_min\", model, args._min, d);\n pushAgg(out, \"MAX\", \"_max\", model, args._max, d);\n return out;\n}\n\nfunction pushAgg(\n out: string[],\n fn: string,\n prefix: string,\n model: ModelNode,\n spec: Record<string, boolean> | undefined,\n d: SqlDialect,\n): void {\n if (!spec) return;\n for (const field of trueKeys(spec)) {\n const col = d.quoteRef(ROOT_ALIAS, fieldColumn(requireScalar(model, field)));\n out.push(`${fn}(${col}) AS ${d.quoteId(`${prefix}_${field}`)}`);\n }\n}\n\nfunction trueKeys(spec: Record<string, boolean>): string[] {\n return Object.entries(spec)\n .filter(([, v]) => v === true)\n .map(([k]) => k);\n}\n\nfunction requireScalar(model: ModelNode, name: string): FieldNode {\n const field = model.fields.find((f) => f.name === name);\n if (!field || field.kind === \"object\") {\n throw new QueryValidationError(\n `'${name}' is not a scalar field on model '${model.name}'.`,\n );\n }\n return field;\n}\n","import { type FieldNode } from \"@ember/ast\";\n\n/**\n * Map a raw value returned by node-firebird into the JS type implied by the\n * field's schema type. Firebird has no native boolean in older versions and\n * returns JSON/decimal as text, so normalization happens here in one place.\n */\nexport function coerceFromDb(value: unknown, field: FieldNode): unknown {\n if (value === null || value === undefined) return null;\n\n switch (field.type) {\n case \"Boolean\":\n return toBoolean(value);\n case \"Int\":\n return typeof value === \"number\" ? value : Number(value);\n case \"BigInt\":\n return typeof value === \"bigint\" ? value : BigInt(String(value));\n case \"Float\":\n case \"Decimal\":\n return typeof value === \"number\" ? value : Number(value);\n case \"DateTime\":\n return value instanceof Date ? value : new Date(String(value));\n case \"Json\":\n return parseJson(value);\n case \"Bytes\":\n return Buffer.isBuffer(value) ? value : Buffer.from(String(value));\n case \"String\":\n default:\n return typeof value === \"string\" ? value : String(value);\n }\n}\n\n/** Map a full DB row keyed by field name into a typed plain object. */\nexport function coerceRow(\n row: Record<string, unknown>,\n fields: FieldNode[],\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const field of fields) {\n if (field.name in row) {\n out[field.name] = coerceFromDb(row[field.name], field);\n }\n }\n return out;\n}\n\nfunction toBoolean(value: unknown): boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return value !== 0;\n const s = String(value).trim().toUpperCase();\n return s === \"1\" || s === \"T\" || s === \"TRUE\" || s === \"Y\";\n}\n\nfunction parseJson(value: unknown): unknown {\n if (typeof value !== \"string\") return value;\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { type FieldNode, type ModelNode } from \"@ember/ast\";\n\n/**\n * Compute default values in JS at write time. Computing here (rather than\n * relying on DB-side DEFAULT clauses) keeps behavior identical across Firebird\n * versions and lets EmberORM return the generated values without extra reads.\n *\n * `autoincrement()` is intentionally skipped: it is produced by the database\n * identity/generator and read back via RETURNING.\n */\nexport function applyCreateDefaults(\n model: ModelNode,\n data: Record<string, unknown>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = { ...data };\n for (const field of model.fields) {\n if (field.kind === \"object\") continue;\n\n if (field.isUpdatedAt && out[field.name] === undefined) {\n out[field.name] = new Date();\n continue;\n }\n if (out[field.name] !== undefined) continue;\n\n const def = field.default;\n if (!def) continue;\n\n if (def.function) {\n const computed = computeFunctionDefault(def.function.name);\n if (computed !== SKIP) out[field.name] = computed;\n continue;\n }\n if (def.literal !== undefined) {\n out[field.name] = def.literal;\n }\n }\n return out;\n}\n\n/** Set @updatedAt fields on update operations. */\nexport function applyUpdateDefaults(\n model: ModelNode,\n data: Record<string, unknown>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = { ...data };\n for (const field of model.fields) {\n if (field.isUpdatedAt && out[field.name] === undefined) {\n out[field.name] = new Date();\n }\n }\n return out;\n}\n\nconst SKIP = Symbol(\"skip-default\");\n\nfunction computeFunctionDefault(name: string): unknown {\n switch (name) {\n case \"now\":\n return new Date();\n case \"uuid\":\n return randomUUID();\n case \"cuid\":\n return generateCuid();\n case \"autoincrement\":\n return SKIP;\n default:\n return SKIP;\n }\n}\n\n/** Minimal collision-resistant id (cuid-like) without external deps. */\nfunction generateCuid(): string {\n const time = Date.now().toString(36);\n const rand = Math.random().toString(36).slice(2, 10);\n return `c${time}${rand}`;\n}\n\nexport function isAutoincrement(field: FieldNode): boolean {\n return field.default?.function?.name === \"autoincrement\";\n}\n","import {\n type FieldNode,\n type ModelNode,\n type SchemaDocument,\n fieldColumn,\n idFields,\n modelTable,\n} from \"@ember/ast\";\nimport { QueryValidationError, RecordNotFoundError } from \"@ember/errors\";\nimport { Sql, type SqlDialect } from \"@ember/sql\";\nimport type { SqlValue } from \"@ember/driver\";\nimport { isPlainObject } from \"@ember/utils\";\nimport type { WhereInput } from \"./args\";\nimport {\n type ColumnUpdate,\n compileDelete,\n compileInsert,\n compileUpdate,\n newContext,\n setAssignments,\n} from \"./compiler\";\nimport { type CompileContext, compileWhere } from \"./where\";\nimport {\n applyCreateDefaults,\n applyUpdateDefaults,\n isAutoincrement,\n} from \"./defaults\";\nimport { resolveRelation, type ResolvedRelation } from \"./relations\";\n\nexport type Executor = (sql: Sql) => Promise<Record<string, unknown>[]>;\n\n/**\n * Handles INSERT/UPDATE with nested relation writes (connect/create/disconnect/\n * set/delete). Owning-side relations are resolved before the row is written so\n * the foreign key is part of the INSERT; child-side relations are written after\n * the parent exists so their foreign keys can point back.\n *\n * All FK maps are keyed by *field name* when feeding the scalar pipeline and by\n * *column name* when feeding compileUpdate directly (which expects columns).\n */\nexport class WriteProcessor {\n constructor(\n private readonly schema: SchemaDocument,\n private readonly dialect: SqlDialect,\n private readonly exec: Executor,\n ) {}\n\n private ctx(): CompileContext {\n return newContext(this.schema, this.dialect);\n }\n\n /** Insert one row (with nested writes) and return its key values. */\n async create(\n model: ModelNode,\n data: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n const { scalars, owning, children } = this.partition(model, data);\n\n for (const [field, op] of owning) {\n for (const [fieldName, value] of await this.resolveOwning(model, field, op)) {\n scalars.set(fieldName, value);\n }\n }\n\n const withDefaults = applyCreateDefaults(model, recordOf(scalars));\n const row = this.toColumnMap(model, withDefaults);\n\n const returning = idFields(model);\n const stmt = compileInsert(model, row, this.ctx(), returning);\n const result = await this.exec(stmt.sql);\n const keys = this.keyValues(model, result[0] ?? {}, withDefaults);\n\n for (const [field, op] of children) {\n await this.writeChildren(model, keys, field, op);\n }\n return keys;\n }\n\n /** Update rows matched by `where` (with nested writes). */\n async updateRow(\n model: ModelNode,\n where: WhereInput,\n data: Record<string, unknown>,\n keys: Record<string, unknown>,\n ): Promise<void> {\n const { scalars, owning, children } = this.partition(model, data, true);\n\n for (const [field, op] of owning) {\n for (const [fieldName, value] of await this.resolveOwningForUpdate(\n model,\n field,\n op,\n )) {\n scalars.set(fieldName, value);\n }\n }\n\n const withDefaults = applyUpdateDefaults(model, recordOf(scalars));\n const assignments = this.toUpdateColumnMap(model, withDefaults);\n\n if (assignments.size > 0) {\n const stmt = compileUpdate(model, where, assignments, this.ctx());\n await this.exec(stmt.sql);\n }\n\n for (const [field, op] of children) {\n await this.writeChildren(model, keys, field, op);\n }\n }\n\n /**\n * Scalar-only bulk update (for `updateMany`). Atomic operators are supported;\n * nested relation writes are rejected, matching Prisma's `updateMany`.\n */\n async updateManyRows(\n model: ModelNode,\n where: WhereInput | undefined,\n data: Record<string, unknown>,\n ): Promise<void> {\n for (const key of Object.keys(data)) {\n const field = model.fields.find((f) => f.name === key);\n if (field?.kind === \"object\") {\n throw new QueryValidationError(\n `updateMany does not support nested relation writes ('${model.name}.${key}'). Use update() per record.`,\n );\n }\n }\n const withDefaults = applyUpdateDefaults(model, data);\n const assignments = this.toUpdateColumnMap(model, withDefaults);\n if (assignments.size > 0) {\n const stmt = compileUpdate(model, where, assignments, this.ctx());\n await this.exec(stmt.sql);\n }\n }\n\n // ---- partition & mapping ------------------------------------------------\n\n private partition(\n model: ModelNode,\n data: Record<string, unknown>,\n isUpdate = false,\n ): {\n scalars: Map<string, unknown>;\n owning: [FieldNode, Record<string, unknown>][];\n children: [FieldNode, Record<string, unknown>][];\n } {\n const scalars = new Map<string, unknown>();\n const owning: [FieldNode, Record<string, unknown>][] = [];\n const children: [FieldNode, Record<string, unknown>][] = [];\n\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined) continue;\n const field = model.fields.find((f) => f.name === key);\n if (!field) {\n throw new QueryValidationError(\n `Unknown field '${key}' on model '${model.name}'.`,\n );\n }\n if (field.kind !== \"object\") {\n // For updates the raw value is preserved so atomic operators\n // ({ increment }, { set }, ...) can be interpreted later.\n scalars.set(key, value);\n continue;\n }\n if (!isPlainObject(value)) {\n throw new QueryValidationError(\n `Relation '${model.name}.${key}' expects a nested write object.`,\n );\n }\n const rel = resolveRelation(this.schema, model, field);\n if (rel.owns) owning.push([field, value]);\n else children.push([field, value]);\n }\n return { scalars, owning, children };\n }\n\n private toColumnMap(\n model: ModelNode,\n record: Record<string, unknown>,\n ): Map<string, SqlValue> {\n const out = new Map<string, SqlValue>();\n for (const [name, value] of Object.entries(record)) {\n const field = model.fields.find((f) => f.name === name);\n if (!field || field.kind === \"object\") continue;\n if (isAutoincrement(field) && (value === undefined || value === null)) {\n continue;\n }\n out.set(fieldColumn(field), this.dialect.coerceValue(value));\n }\n return out;\n }\n\n /**\n * Build UPDATE assignments, interpreting atomic scalar operators:\n * `{ set }`, `{ increment }`, `{ decrement }`, `{ multiply }`, `{ divide }`.\n * A bare value is a plain `set`.\n */\n private toUpdateColumnMap(\n model: ModelNode,\n record: Record<string, unknown>,\n ): Map<string, ColumnUpdate> {\n const out = new Map<string, ColumnUpdate>();\n for (const [name, value] of Object.entries(record)) {\n const field = model.fields.find((f) => f.name === name);\n if (!field || field.kind === \"object\") continue;\n out.set(fieldColumn(field), this.toColumnUpdate(field, value));\n }\n return out;\n }\n\n private toColumnUpdate(field: FieldNode, value: unknown): ColumnUpdate {\n const coerce = (v: unknown): SqlValue => this.dialect.coerceValue(v);\n if (isPlainObject(value)) {\n if (\"set\" in value) return { kind: \"set\", value: coerce(value.set) };\n const arith = ARITH_OPS.find((op) => op.key in value);\n if (arith) {\n requireNumeric(field, arith.key);\n return { kind: \"arith\", op: arith.op, value: coerce(value[arith.key]) };\n }\n }\n return { kind: \"set\", value: coerce(value) };\n }\n\n private keyValues(\n model: ModelNode,\n returnedRow: Record<string, unknown>,\n writtenData: Record<string, unknown>,\n ): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const f of idFields(model)) {\n out[f.name] =\n returnedRow[f.name] ??\n returnedRow[fieldColumn(f)] ??\n writtenData[f.name];\n }\n return out;\n }\n\n // ---- owning-side relations ---------------------------------------------\n\n private async resolveOwning(\n model: ModelNode,\n field: FieldNode,\n op: Record<string, unknown>,\n ): Promise<[string, SqlValue][]> {\n const rel = resolveRelation(this.schema, model, field);\n if (op.connect) {\n const ref = await this.lookupReference(rel, op.connect as WhereInput);\n return this.mapFkByField(rel, ref);\n }\n if (op.create) {\n const childKeys = await this.create(\n rel.relatedModel,\n op.create as Record<string, unknown>,\n );\n return this.mapFkByField(rel, childKeys);\n }\n if (op.connectOrCreate) {\n const spec = op.connectOrCreate as {\n where: WhereInput;\n create: Record<string, unknown>;\n };\n const existing = await this.tryLookupReference(rel, spec.where);\n const ref = existing ?? (await this.create(rel.relatedModel, spec.create));\n return this.mapFkByField(rel, ref);\n }\n throw new QueryValidationError(\n `Unsupported nested write on '${model.name}.${field.name}'.`,\n );\n }\n\n private async resolveOwningForUpdate(\n model: ModelNode,\n field: FieldNode,\n op: Record<string, unknown>,\n ): Promise<[string, SqlValue][]> {\n if (op.disconnect) {\n const rel = resolveRelation(this.schema, model, field);\n return rel.fromFields.map((name) => [name, null] as [string, SqlValue]);\n }\n return this.resolveOwning(model, field, op);\n }\n\n /** [localFieldName, value] pairs from the referenced model's key values. */\n private mapFkByField(\n rel: ResolvedRelation,\n refValues: Record<string, unknown>,\n ): [string, SqlValue][] {\n return rel.fromFields.map((fromField, i) => {\n const toField = rel.toFields[i]!;\n return [fromField, this.dialect.coerceValue(refValues[toField] ?? null)];\n });\n }\n\n private async lookupReference(\n rel: ResolvedRelation,\n where: WhereInput,\n ): Promise<Record<string, unknown>> {\n const found = await this.tryLookupReference(rel, where);\n if (!found) throw new RecordNotFoundError(rel.relatedModel.name);\n return found;\n }\n\n private async tryLookupReference(\n rel: ResolvedRelation,\n where: WhereInput,\n ): Promise<Record<string, unknown> | null> {\n const fields = rel.toFields.map((n) => requireField(rel.relatedModel, n));\n const stmt = this.selectKeys(rel.relatedModel, fields, where);\n const rows = await this.exec(stmt);\n return rows[0] ?? null;\n }\n\n private selectKeys(\n model: ModelNode,\n fields: FieldNode[],\n where: WhereInput,\n ): Sql {\n const d = this.dialect;\n const alias = \"t0\";\n const sql = new Sql();\n sql.push(\"SELECT FIRST 1 \");\n sql.push(\n fields\n .map((f) => `${d.quoteRef(alias, fieldColumn(f))} AS ${d.quoteId(f.name)}`)\n .join(\", \"),\n );\n sql.push(` FROM ${d.quoteId(modelTable(model))} ${d.quoteId(alias)}`);\n const cond = compileWhere(model, alias, where, this.ctx());\n if (!cond.isEmpty()) sql.push(\" WHERE \").append(cond);\n return sql;\n }\n\n // ---- child-side relations ----------------------------------------------\n\n private async writeChildren(\n parentModel: ModelNode,\n parentKeys: Record<string, unknown>,\n field: FieldNode,\n op: Record<string, unknown>,\n ): Promise<void> {\n const rel = resolveRelation(this.schema, parentModel, field);\n const fkColumns: [string, SqlValue][] = rel.toColumns.map((toCol, i) => {\n const fromField = rel.fromFields[i]!;\n return [toCol, this.dialect.coerceValue(parentKeys[fromField] ?? null)];\n });\n\n for (const childData of toArray(op.create)) {\n await this.create(rel.relatedModel, { ...childData, ...fkRecord(rel, parentKeys) });\n }\n for (const where of toArray(op.connect)) {\n await this.setChildForeignKey(rel, where as WhereInput, fkColumns);\n }\n if (op.set !== undefined) {\n await this.clearChildren(rel, parentKeys);\n for (const where of toArray(op.set)) {\n await this.setChildForeignKey(rel, where as WhereInput, fkColumns);\n }\n }\n for (const where of toArray(op.disconnect)) {\n await this.setChildForeignKey(\n rel,\n where as WhereInput,\n rel.toColumns.map((c) => [c, null] as [string, SqlValue]),\n );\n }\n for (const where of toArray(op.delete)) {\n const stmt = compileDelete(rel.relatedModel, where as WhereInput, this.ctx());\n await this.exec(stmt.sql);\n }\n }\n\n private async setChildForeignKey(\n rel: ResolvedRelation,\n where: WhereInput,\n fkColumns: [string, SqlValue][],\n ): Promise<void> {\n const assignments = setAssignments(new Map<string, SqlValue>(fkColumns));\n const stmt = compileUpdate(rel.relatedModel, where, assignments, this.ctx());\n await this.exec(stmt.sql);\n }\n\n private async clearChildren(\n rel: ResolvedRelation,\n parentKeys: Record<string, unknown>,\n ): Promise<void> {\n const matchWhere: WhereInput = {};\n rel.toFields.forEach((toField, i) => {\n const fromField = rel.fromFields[i]!;\n matchWhere[toField] = parentKeys[fromField];\n });\n const assignments = setAssignments(\n new Map<string, SqlValue>(\n rel.toColumns.map((c) => [c, null] as [string, SqlValue]),\n ),\n );\n const stmt = compileUpdate(rel.relatedModel, matchWhere, assignments, this.ctx());\n await this.exec(stmt.sql);\n }\n}\n\nconst ARITH_OPS = [\n { key: \"increment\", op: \"+\" as const },\n { key: \"decrement\", op: \"-\" as const },\n { key: \"multiply\", op: \"*\" as const },\n { key: \"divide\", op: \"/\" as const },\n];\n\nconst NUMERIC_TYPES = new Set([\"Int\", \"BigInt\", \"Float\", \"Decimal\"]);\n\nfunction requireNumeric(field: FieldNode, op: string): void {\n if (!NUMERIC_TYPES.has(field.type)) {\n throw new QueryValidationError(\n `Operator '${op}' is only valid on numeric fields, not '${field.name}' (${field.type}).`,\n );\n }\n}\n\n// ---- helpers --------------------------------------------------------------\n\nfunction requireField(model: ModelNode, name: string): FieldNode {\n const f = model.fields.find((x) => x.name === name);\n if (!f) {\n throw new QueryValidationError(`Field '${name}' not found on '${model.name}'.`);\n }\n return f;\n}\n\nfunction fkRecord(\n rel: ResolvedRelation,\n parentKeys: Record<string, unknown>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n rel.toFields.forEach((toField, i) => {\n const fromField = rel.fromFields[i]!;\n out[toField] = parentKeys[fromField];\n });\n return out;\n}\n\nfunction recordOf(scalars: Map<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of scalars) out[k] = v;\n return out;\n}\n\nfunction toArray<T = Record<string, unknown>>(value: unknown): T[] {\n if (value === undefined || value === null) return [];\n return (Array.isArray(value) ? value : [value]) as T[];\n}\n","import {\n type FieldNode,\n type ModelNode,\n type SchemaDocument,\n findModel,\n idFields,\n scalarFields,\n} from \"@ember/ast\";\nimport {\n type SqlDriver,\n type TransactionContext,\n type TransactionOptions,\n} from \"@ember/driver\";\nimport { QueryValidationError, RecordNotFoundError } from \"@ember/errors\";\nimport { Sql, type SqlDialect } from \"@ember/sql\";\nimport { uniq } from \"@ember/utils\";\nimport type {\n AggregateArgs,\n CountArgs,\n CreateArgs,\n CreateManyArgs,\n CreateManyAndReturnArgs,\n DeleteArgs,\n DeleteManyArgs,\n FindFirstArgs,\n FindManyArgs,\n FindUniqueArgs,\n GroupByArgs,\n IncludeInput,\n NestedReadArgs,\n OmitInput,\n SelectInput,\n SortOrder,\n UpdateArgs,\n UpdateManyArgs,\n UpsertArgs,\n WhereInput,\n} from \"./args\";\nimport {\n compileAggregate,\n compileCount,\n compileDelete,\n compileDistinctFindMany,\n compileFindMany,\n compileGroupBy,\n newContext,\n} from \"./compiler\";\nimport { coerceRow } from \"./coerce\";\nimport { resolveRelation } from \"./relations\";\nimport { WriteProcessor, type Executor } from \"./writer\";\n\ninterface RelationRead {\n field: FieldNode;\n args: NestedReadArgs;\n}\n\n/** The projection-shaping options shared by read-back of writes. */\ninterface ReadShape {\n select?: SelectInput;\n include?: IncludeInput;\n omit?: OmitInput;\n}\n\nfunction readShape(args: {\n select?: SelectInput;\n include?: IncludeInput;\n omit?: OmitInput;\n}): ReadShape {\n return { select: args.select, include: args.include, omit: args.omit };\n}\n\n/**\n * The query engine executes high-level operations against a driver. Reads use\n * a projection + relation-stitching pipeline (relations are loaded with\n * separate batched queries, Prisma-style). Writes are delegated to\n * WriteProcessor. Every operation runs inside a driver transaction.\n */\nexport class QueryEngine {\n constructor(\n private readonly schema: SchemaDocument,\n private readonly dialect: SqlDialect,\n private readonly driver: SqlDriver,\n ) {}\n\n model(name: string): ModelNode {\n const model = findModel(this.schema, name);\n if (!model) throw new QueryValidationError(`Unknown model '${name}'.`);\n return model;\n }\n\n private run<T>(\n fn: (tx: TransactionContext) => Promise<T>,\n options?: TransactionOptions,\n ): Promise<T> {\n return this.driver.transaction(fn, options);\n }\n\n private execOn(tx: TransactionContext): Executor {\n return (sql: Sql) => tx.query(sql.text, sql.params);\n }\n\n // ---- reads --------------------------------------------------------------\n\n findMany(name: string, args: FindManyArgs = {}): Promise<Record<string, unknown>[]> {\n const model = this.model(name);\n return this.run((tx) => this.readMany(model, args, this.execOn(tx)));\n }\n\n async findFirst(\n name: string,\n args: FindFirstArgs = {},\n ): Promise<Record<string, unknown> | null> {\n const rows = await this.findMany(name, { ...args, take: 1 });\n return rows[0] ?? null;\n }\n\n async findFirstOrThrow(name: string, args: FindFirstArgs = {}) {\n const row = await this.findFirst(name, args);\n if (!row) throw new RecordNotFoundError(name);\n return row;\n }\n\n async findUnique(\n name: string,\n args: FindUniqueArgs,\n ): Promise<Record<string, unknown> | null> {\n const model = this.model(name);\n this.assertUniqueWhere(model, args.where);\n const rows = await this.run((tx) =>\n this.readMany(\n model,\n { where: args.where, select: args.select, include: args.include, take: 1 },\n this.execOn(tx),\n ),\n );\n return rows[0] ?? null;\n }\n\n async findUniqueOrThrow(name: string, args: FindUniqueArgs) {\n const row = await this.findUnique(name, args);\n if (!row) throw new RecordNotFoundError(name);\n return row;\n }\n\n // ---- aggregations -------------------------------------------------------\n\n count(name: string, args: CountArgs = {}): Promise<number> {\n const model = this.model(name);\n return this.run(async (tx) => {\n const stmt = compileCount(model, args.where, newContext(this.schema, this.dialect), {\n take: args.take,\n skip: args.skip,\n });\n const rows = await tx.query<{ _count: unknown }>(stmt.text, stmt.params);\n return Number(rows[0]?._count ?? 0);\n });\n }\n\n aggregate(name: string, args: AggregateArgs = {}): Promise<Record<string, unknown>> {\n const model = this.model(name);\n return this.run(async (tx) => {\n const stmt = compileAggregate(model, args, newContext(this.schema, this.dialect));\n const rows = await tx.query<Record<string, unknown>>(stmt.text, stmt.params);\n return reshapeAggregate(rows[0] ?? {});\n });\n }\n\n groupBy(name: string, args: GroupByArgs): Promise<Record<string, unknown>[]> {\n const model = this.model(name);\n return this.run(async (tx) => {\n const { sql } = compileGroupBy(model, args, newContext(this.schema, this.dialect));\n const rows = await tx.query<Record<string, unknown>>(sql.text, sql.params);\n return rows.map((r) => reshapeGroupRow(model, args.by, r));\n });\n }\n\n // ---- writes -------------------------------------------------------------\n\n create(name: string, args: CreateArgs): Promise<Record<string, unknown>> {\n const model = this.model(name);\n return this.run(async (tx) => {\n const writer = new WriteProcessor(this.schema, this.dialect, this.execOn(tx));\n const keys = await writer.create(model, args.data);\n return this.readBack(model, keys, readShape(args), this.execOn(tx));\n });\n }\n\n createMany(name: string, args: CreateManyArgs): Promise<{ count: number }> {\n const model = this.model(name);\n return this.run(async (tx) => {\n const writer = new WriteProcessor(this.schema, this.dialect, this.execOn(tx));\n let count = 0;\n for (const data of args.data) {\n await writer.create(model, data);\n count++;\n }\n return { count };\n });\n }\n\n /** Like createMany, but returns the created records (no nested relations). */\n createManyAndReturn(\n name: string,\n args: CreateManyAndReturnArgs,\n ): Promise<Record<string, unknown>[]> {\n const model = this.model(name);\n return this.run(async (tx) => {\n const exec = this.execOn(tx);\n const writer = new WriteProcessor(this.schema, this.dialect, exec);\n const out: Record<string, unknown>[] = [];\n const shape: ReadShape = { select: args.select, omit: args.omit };\n for (const data of args.data) {\n const keys = await writer.create(model, data);\n out.push(await this.readBack(model, keys, shape, exec));\n }\n return out;\n });\n }\n\n update(name: string, args: UpdateArgs): Promise<Record<string, unknown>> {\n const model = this.model(name);\n this.assertUniqueWhere(model, args.where);\n return this.run(async (tx) => {\n const exec = this.execOn(tx);\n const target = await this.requireOne(model, args.where, exec);\n const keys = this.pickKeys(model, target);\n const writer = new WriteProcessor(this.schema, this.dialect, exec);\n await writer.updateRow(model, args.where, args.data, keys);\n return this.readBack(model, keys, readShape(args), exec);\n });\n }\n\n updateMany(name: string, args: UpdateManyArgs): Promise<{ count: number }> {\n const model = this.model(name);\n return this.run(async (tx) => {\n const exec = this.execOn(tx);\n const count = await this.countMatching(model, args.where, exec);\n const writer = new WriteProcessor(this.schema, this.dialect, exec);\n // updateMany is scalar-only (atomic operators allowed); relation writes\n // are rejected. Applies to the whole matched set.\n await writer.updateManyRows(model, args.where, args.data);\n return { count };\n });\n }\n\n upsert(name: string, args: UpsertArgs): Promise<Record<string, unknown>> {\n const model = this.model(name);\n this.assertUniqueWhere(model, args.where);\n return this.run(async (tx) => {\n const exec = this.execOn(tx);\n const existing = await this.findOneRaw(model, args.where, exec);\n const writer = new WriteProcessor(this.schema, this.dialect, exec);\n if (existing) {\n const keys = this.pickKeys(model, existing);\n await writer.updateRow(model, args.where, args.update, keys);\n return this.readBack(model, keys, readShape(args), exec);\n }\n const keys = await writer.create(model, args.create);\n return this.readBack(model, keys, readShape(args), exec);\n });\n }\n\n delete(name: string, args: DeleteArgs): Promise<Record<string, unknown>> {\n const model = this.model(name);\n this.assertUniqueWhere(model, args.where);\n return this.run(async (tx) => {\n const exec = this.execOn(tx);\n const row = await this.readBackOne(model, args.where, readShape(args), exec);\n if (!row) throw new RecordNotFoundError(name);\n const stmt = compileDelete(model, args.where, newContext(this.schema, this.dialect));\n await exec(stmt.sql);\n return row;\n });\n }\n\n deleteMany(name: string, args: DeleteManyArgs = {}): Promise<{ count: number }> {\n const model = this.model(name);\n return this.run(async (tx) => {\n const exec = this.execOn(tx);\n const count = await this.countMatching(model, args.where, exec);\n const stmt = compileDelete(model, args.where, newContext(this.schema, this.dialect));\n await exec(stmt.sql);\n return { count };\n });\n }\n\n // ---- read pipeline ------------------------------------------------------\n\n private async readMany(\n model: ModelNode,\n args: FindManyArgs,\n exec: Executor,\n forceKeep: string[] = [],\n ): Promise<Record<string, unknown>[]> {\n const relations = this.readRelations(model, args.select, args.include);\n const countFields = this.readCountRelations(model, args.select, args.include);\n const selectedScalars = applyOmit(\n model,\n selectedScalarNames(model, args.select),\n args.omit,\n );\n const distinctFields = normalizeDistinct(model, args.distinct);\n // On Firebird 3+ `distinct` is pushed to SQL via ROW_NUMBER(); on 2.x it is\n // de-duplicated in memory (and pagination is therefore also done in memory).\n const useWindowDistinct =\n distinctFields.length > 0 && this.dialect.supportsWindowFunctions;\n const memoryPaginate = distinctFields.length > 0 && !useWindowDistinct;\n\n // `cursor` augments the filter/order so SQL can start at the cursor row.\n const { where, orderBy } = applyCursor(model, args, distinctFields);\n\n const relationKeyFields = uniq(\n [...relations.map((r) => r.field), ...countFields].flatMap(\n (field) => resolveRelation(this.schema, model, field).fromFields,\n ),\n );\n const internalKeys = uniq([\n ...relationKeyFields,\n ...distinctFields, // fetched for de-dup; stripped below if not selected\n ]);\n const projectionNames = uniq([\n ...(selectedScalars ?? scalarFields(model).map((f) => f.name)),\n ...internalKeys,\n ...forceKeep,\n ]);\n const projection = projectionNames.map((n) => fieldByName(model, n));\n\n const findOptions = {\n where,\n orderBy,\n take: memoryPaginate ? undefined : args.take,\n skip: memoryPaginate ? undefined : args.skip,\n };\n const stmt = useWindowDistinct\n ? compileDistinctFindMany(\n model,\n findOptions,\n projection,\n distinctFields.map((n) => fieldByName(model, n)),\n newContext(this.schema, this.dialect),\n )\n : compileFindMany(\n model,\n findOptions,\n projection,\n newContext(this.schema, this.dialect),\n );\n const rawRows = await exec(stmt.sql);\n let rows = rawRows.map((r) => coerceRow(r, projection));\n\n if (memoryPaginate) {\n rows = dedupeBy(rows, distinctFields);\n rows = applyPagination(rows, args.take, args.skip);\n }\n\n for (const relation of relations) {\n await this.loadRelation(model, rows, relation, exec);\n }\n if (countFields.length > 0) {\n await this.loadCounts(model, rows, countFields, exec);\n }\n\n // Strip internal scalar keys added only for stitching/de-dup.\n if (selectedScalars) {\n const visible = new Set([...selectedScalars, ...forceKeep]);\n for (const row of rows) {\n for (const name of internalKeys) {\n if (!visible.has(name)) delete row[name];\n }\n }\n }\n return rows;\n }\n\n private async loadRelation(\n parentModel: ModelNode,\n parentRows: Record<string, unknown>[],\n relation: RelationRead,\n exec: Executor,\n ): Promise<void> {\n if (parentRows.length === 0) return;\n const rel = resolveRelation(this.schema, parentModel, relation.field);\n const fieldName = relation.field.name;\n const { fromFields, toFields } = rel;\n\n // Distinct parent key tuples (rows with a null key part can't match).\n const parentTuples = uniqueTuples(parentRows, fromFields);\n\n const grouped = new Map<string, Record<string, unknown>[]>();\n if (parentTuples.length > 0) {\n const childWhere = relationKeyWhere(\n toFields,\n parentTuples,\n relation.args.where,\n );\n const childRows = await this.readMany(\n rel.relatedModel,\n {\n where: childWhere,\n orderBy: relation.args.orderBy,\n select: relation.args.select,\n include: relation.args.include,\n // take/skip on to-many are applied per parent below; skip here.\n ...(rel.isList ? {} : { take: relation.args.take, skip: relation.args.skip }),\n },\n exec,\n toFields,\n );\n for (const child of childRows) {\n const k = tupleKey(child, toFields);\n const list = grouped.get(k) ?? [];\n list.push(child);\n grouped.set(k, list);\n }\n }\n\n // Strip the join key columns added only for stitching when not selected.\n const visible = selectedScalarNames(rel.relatedModel, relation.args.select);\n const stripFields = visible\n ? toFields.filter((f) => !visible.has(f))\n : [];\n\n for (const parent of parentRows) {\n const k = tupleKey(parent, fromFields);\n let matches = grouped.get(k) ?? [];\n if (rel.isList && (relation.args.take != null || relation.args.skip != null)) {\n matches = applyPagination(matches, relation.args.take, relation.args.skip);\n }\n const attached = stripFields.length\n ? matches.map((m) => omitAll(m, stripFields))\n : matches;\n parent[fieldName] = rel.isList ? attached : (attached[0] ?? null);\n }\n }\n\n private readRelations(\n model: ModelNode,\n select?: SelectInput,\n include?: IncludeInput,\n ): RelationRead[] {\n const out: RelationRead[] = [];\n const add = (key: string, value: boolean | NestedReadArgs) => {\n if (!value) return;\n const field = model.fields.find((f) => f.name === key && f.kind === \"object\");\n if (!field) return;\n out.push({ field, args: typeof value === \"object\" ? value : {} });\n };\n if (include) for (const [k, v] of Object.entries(include)) add(k, v);\n if (select) {\n for (const [k, v] of Object.entries(select)) {\n const field = model.fields.find((f) => f.name === k);\n if (field?.kind === \"object\") add(k, v);\n }\n }\n return out;\n }\n\n /**\n * Resolve which to-many relations to count for `_count` in select/include.\n * `_count: true` counts every list relation; `_count: { select: { rel } }`\n * counts the named ones.\n */\n private readCountRelations(\n model: ModelNode,\n select?: SelectInput,\n include?: IncludeInput,\n ): FieldNode[] {\n const spec =\n (include?._count as boolean | NestedReadArgs | undefined) ??\n (select?._count as boolean | NestedReadArgs | undefined);\n if (!spec) return [];\n const listRelations = model.fields.filter(\n (f) => f.kind === \"object\" && f.isList,\n );\n if (spec === true) return listRelations;\n const selected = (spec as { select?: Record<string, unknown> }).select;\n if (!selected) return listRelations;\n return listRelations.filter((f) => selected[f.name]);\n }\n\n /** Attach a `_count` object to each row with per-relation child counts. */\n private async loadCounts(\n model: ModelNode,\n rows: Record<string, unknown>[],\n countFields: FieldNode[],\n exec: Executor,\n ): Promise<void> {\n for (const row of rows) row._count = {};\n\n for (const field of countFields) {\n const rel = resolveRelation(this.schema, model, field);\n const tuples = uniqueTuples(rows, rel.fromFields);\n const grouped = new Map<string, number>();\n\n if (tuples.length > 0) {\n const where = relationKeyWhere(rel.toFields, tuples, undefined);\n const { sql } = compileGroupBy(\n rel.relatedModel,\n { by: rel.toFields, _count: true, where },\n newContext(this.schema, this.dialect),\n );\n const countRows = await exec(sql);\n for (const cr of countRows) {\n grouped.set(tupleKey(cr, rel.toFields), Number(cr._count_all ?? 0));\n }\n }\n\n for (const row of rows) {\n const count = grouped.get(tupleKey(row, rel.fromFields)) ?? 0;\n (row._count as Record<string, number>)[field.name] = count;\n }\n }\n }\n\n // ---- read-back & helpers ------------------------------------------------\n\n private async readBack(\n model: ModelNode,\n keys: Record<string, unknown>,\n shape: ReadShape,\n exec: Executor,\n ): Promise<Record<string, unknown>> {\n const where = keysToWhere(model, keys);\n const row = await this.readBackOne(model, where, shape, exec);\n if (!row) throw new RecordNotFoundError(model.name);\n return row;\n }\n\n private async readBackOne(\n model: ModelNode,\n where: WhereInput,\n shape: ReadShape,\n exec: Executor,\n ): Promise<Record<string, unknown> | null> {\n const rows = await this.readMany(\n model,\n { where, select: shape.select, include: shape.include, omit: shape.omit, take: 1 },\n exec,\n );\n return rows[0] ?? null;\n }\n\n private async requireOne(\n model: ModelNode,\n where: WhereInput,\n exec: Executor,\n ): Promise<Record<string, unknown>> {\n const row = await this.findOneRaw(model, where, exec);\n if (!row) throw new RecordNotFoundError(model.name);\n return row;\n }\n\n private async findOneRaw(\n model: ModelNode,\n where: WhereInput,\n exec: Executor,\n ): Promise<Record<string, unknown> | null> {\n const rows = await this.readMany(model, { where, take: 1 }, exec);\n return rows[0] ?? null;\n }\n\n private async countMatching(\n model: ModelNode,\n where: WhereInput | undefined,\n exec: Executor,\n ): Promise<number> {\n const stmt = compileCount(model, where, newContext(this.schema, this.dialect));\n const rows = await exec(stmt);\n return Number((rows[0] as { _count?: unknown })?._count ?? 0);\n }\n\n private pickKeys(\n model: ModelNode,\n row: Record<string, unknown>,\n ): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const f of idFields(model)) out[f.name] = row[f.name];\n return out;\n }\n\n private assertUniqueWhere(model: ModelNode, where: WhereInput): void {\n if (!where || Object.keys(where).length === 0) {\n throw new QueryValidationError(\n `A unique 'where' is required for this operation on '${model.name}'.`,\n );\n }\n }\n}\n\n// ---- pure helpers ---------------------------------------------------------\n\nfunction fieldByName(model: ModelNode, name: string): FieldNode {\n const f = model.fields.find((x) => x.name === name);\n if (!f) throw new QueryValidationError(`Field '${name}' not found on '${model.name}'.`);\n return f;\n}\n\nfunction selectedScalarNames(\n model: ModelNode,\n select?: SelectInput,\n): Set<string> | null {\n if (!select) return null;\n const names = new Set<string>();\n for (const [k, v] of Object.entries(select)) {\n if (!v) continue;\n const field = model.fields.find((f) => f.name === k);\n if (field && field.kind !== \"object\") names.add(k);\n }\n return names;\n}\n\n/**\n * Apply `omit` (the inverse of select). Only used when `select` is absent —\n * with select, the selection already determines visible fields. Returns the set\n * of scalar field names that remain visible.\n */\nfunction applyOmit(\n model: ModelNode,\n selected: Set<string> | null,\n omit: Record<string, boolean> | undefined,\n): Set<string> | null {\n if (selected || !omit) return selected;\n const omitted = new Set(\n Object.entries(omit)\n .filter(([, v]) => v)\n .map(([k]) => k),\n );\n if (omitted.size === 0) return null;\n return new Set(\n scalarFields(model)\n .map((f) => f.name)\n .filter((n) => !omitted.has(n)),\n );\n}\n\nfunction keysToWhere(\n model: ModelNode,\n keys: Record<string, unknown>,\n): WhereInput {\n const where: WhereInput = {};\n for (const f of idFields(model)) where[f.name] = keys[f.name];\n return where;\n}\n\nfunction keyOf(value: unknown): string {\n return value instanceof Date ? value.toISOString() : String(value);\n}\n\n/** Stable string key for a tuple of field values (composite-key grouping). */\nfunction tupleKey(row: Record<string, unknown>, fields: string[]): string {\n return fields.map((f) => keyOf(row[f])).join(\"\u0000\");\n}\n\n/** Distinct non-null parent key tuples, preserving field order. */\nfunction uniqueTuples(\n rows: Record<string, unknown>[],\n fields: string[],\n): unknown[][] {\n const seen = new Set<string>();\n const out: unknown[][] = [];\n for (const row of rows) {\n const tuple = fields.map((f) => row[f]);\n if (tuple.some((v) => v === null || v === undefined)) continue;\n const key = tuple.map(keyOf).join(\"\u0000\");\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(tuple);\n }\n return out;\n}\n\n/**\n * Build the child filter that matches any parent key tuple. Single-column keys\n * use an efficient `IN (...)`; composite keys expand to an `OR` of equality\n * groups, since Firebird has no portable row-value `IN`.\n */\nfunction relationKeyWhere(\n toFields: string[],\n parentTuples: unknown[][],\n baseWhere: WhereInput | undefined,\n): WhereInput {\n const base = baseWhere ?? {};\n if (toFields.length === 1) {\n const field = toFields[0]!;\n return { ...base, [field]: { in: parentTuples.map((t) => t[0]) } };\n }\n const or: WhereInput[] = parentTuples.map((tuple) => {\n const cond: WhereInput = {};\n toFields.forEach((f, i) => {\n cond[f] = tuple[i] as never;\n });\n return cond;\n });\n // Combine with any user-provided where via AND so both constraints hold.\n if (Object.keys(base).length === 0) return { OR: or };\n return { AND: [base, { OR: or }] };\n}\n\nfunction omitAll(\n obj: Record<string, unknown>,\n keys: string[],\n): Record<string, unknown> {\n const out: Record<string, unknown> = { ...obj };\n for (const k of keys) delete out[k];\n return out;\n}\n\nfunction applyPagination(\n rows: Record<string, unknown>[],\n take?: number,\n skip?: number,\n): Record<string, unknown>[] {\n const start = skip ?? 0;\n const end = take != null ? start + take : undefined;\n return rows.slice(start, end);\n}\n\n/** Validate and return the scalar field names for a `distinct` argument. */\nfunction normalizeDistinct(\n model: ModelNode,\n distinct: string[] | undefined,\n): string[] {\n if (!distinct || distinct.length === 0) return [];\n for (const name of distinct) {\n const field = model.fields.find((f) => f.name === name);\n if (!field || field.kind === \"object\") {\n throw new QueryValidationError(\n `Cannot apply distinct on '${model.name}.${name}' (not a scalar field).`,\n );\n }\n }\n return uniq(distinct);\n}\n\n/** Keep the first row for each distinct tuple, preserving order. */\nfunction dedupeBy(\n rows: Record<string, unknown>[],\n fields: string[],\n): Record<string, unknown>[] {\n const seen = new Set<string>();\n const out: Record<string, unknown>[] = [];\n for (const row of rows) {\n const key = tupleKey(row, fields);\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(row);\n }\n return out;\n}\n\ninterface CursorField {\n name: string;\n value: unknown;\n direction: SortOrder;\n}\n\n/**\n * Translate a `cursor` into an extra filter + ordering so SQL starts at the\n * cursor row. Supports composite cursors via a lexicographic keyset expansion:\n * for ordered fields (f1..fn) the condition is `(f1..fn) >= (v1..vn)` relative\n * to each field's direction, expanded into an OR of AND-ed comparisons so it\n * works without row-value comparisons (which Firebird lacks).\n */\nfunction applyCursor(\n model: ModelNode,\n args: FindManyArgs,\n _distinctFields: string[],\n): { where: WhereInput | undefined; orderBy: FindManyArgs[\"orderBy\"] } {\n if (!args.cursor || Object.keys(args.cursor).length === 0) {\n return { where: args.where, orderBy: args.orderBy };\n }\n const entries = Object.entries(args.cursor).filter(([, v]) => v !== undefined);\n if (entries.length === 0) return { where: args.where, orderBy: args.orderBy };\n\n const fields: CursorField[] = entries.map(([name, value]) => {\n if (!model.fields.some((f) => f.name === name && f.kind !== \"object\")) {\n throw new QueryValidationError(\n `Cursor field '${model.name}.${name}' must be a scalar field.`,\n );\n }\n return { name, value, direction: directionForField(args.orderBy, name) ?? \"asc\" };\n });\n\n const cursorCond = keysetCondition(fields);\n const where: WhereInput = args.where\n ? { AND: [args.where, cursorCond] }\n : cursorCond;\n const orderBy =\n args.orderBy ?? fields.map((f) => ({ [f.name]: f.direction }));\n return { where, orderBy };\n}\n\n/** Lexicographic `>=`/`<=` keyset comparison expanded to an OR of AND groups. */\nfunction keysetCondition(fields: CursorField[]): WhereInput {\n const clauses: WhereInput[] = [];\n for (let i = 0; i < fields.length; i++) {\n const clause: WhereInput = {};\n for (let j = 0; j < i; j++) {\n clause[fields[j]!.name] = fields[j]!.value;\n }\n const last = i === fields.length - 1;\n const f = fields[i]!;\n const op = comparator(f.direction, last);\n clause[f.name] = { [op]: f.value };\n clauses.push(clause);\n }\n return clauses.length === 1 ? clauses[0]! : { OR: clauses };\n}\n\nfunction comparator(direction: SortOrder, inclusive: boolean): string {\n if (direction === \"desc\") return inclusive ? \"lte\" : \"lt\";\n return inclusive ? \"gte\" : \"gt\";\n}\n\nfunction directionForField(\n orderBy: FindManyArgs[\"orderBy\"],\n field: string,\n): SortOrder | undefined {\n if (!orderBy) return undefined;\n const list = Array.isArray(orderBy) ? orderBy : [orderBy];\n for (const obj of list) {\n const dir = obj[field];\n if (dir === \"asc\" || dir === \"desc\") return dir;\n }\n return undefined;\n}\n\nfunction reshapeAggregate(row: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(row)) {\n if (key === \"_count_all\") {\n (out._count ??= {} as Record<string, unknown>);\n (out._count as Record<string, unknown>)._all = Number(value);\n continue;\n }\n const m = /^(_count|_sum|_avg|_min|_max)_(.+)$/.exec(key);\n if (m) {\n const group = (out[m[1]!] ??= {}) as Record<string, unknown>;\n group[m[2]!] = value === null ? null : Number(value);\n }\n }\n return out;\n}\n\nfunction reshapeGroupRow(\n model: ModelNode,\n by: string[],\n row: Record<string, unknown>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const groupFields = scalarFields(model).filter((f) => by.includes(f.name));\n for (const f of groupFields) {\n out[f.name] = f.name in row ? coerceField(row[f.name], f) : row[f.name];\n }\n const aggregates = reshapeAggregate(row);\n return { ...out, ...aggregates };\n}\n\nfunction coerceField(value: unknown, field: FieldNode): unknown {\n return coerceRow({ [field.name]: value }, [field])[field.name];\n}\n","import {\n type FieldNode,\n type ModelNode,\n type SchemaDocument,\n findModel,\n relationFields,\n} from \"@ember/ast\";\nimport type { QueryEngine } from \"@ember/query\";\n\n/**\n * Client Extensions ($extends), middleware ($use) and the fluent API live here.\n * The delegate factory composes per-operation query hooks, computes `result`\n * fields, and returns fluent thenables for single-record reads.\n */\n\nexport interface ResultFieldExtension {\n needs?: Record<string, boolean>;\n compute: (record: Record<string, unknown>) => unknown;\n}\n\nexport interface QueryHookParams {\n model: string;\n operation: string;\n args: Record<string, unknown>;\n query: (args: Record<string, unknown>) => Promise<unknown>;\n}\n\nexport type QueryHook = (params: QueryHookParams) => Promise<unknown>;\n\ntype HookMap = Record<string, QueryHook>;\n\nexport interface EmberExtensionArgs {\n name?: string;\n result?: Record<string, Record<string, ResultFieldExtension>>;\n model?: Record<string, Record<string, (...args: unknown[]) => unknown>>;\n query?: Record<string, HookMap>;\n client?: Record<string, unknown>;\n}\n\n/** Prisma-style middleware: `(params, next) => next(params)`. */\nexport type Middleware = (\n params: { model?: string; action: string; args: unknown },\n next: (params: { model?: string; action: string; args: unknown }) => Promise<unknown>,\n) => Promise<unknown>;\n\n/** Operations whose result is one or more records of the delegate's model. */\nconst RECORD_OPS = new Set([\n \"findMany\",\n \"findFirst\",\n \"findFirstOrThrow\",\n \"findUnique\",\n \"findUniqueOrThrow\",\n \"create\",\n \"createManyAndReturn\",\n \"update\",\n \"upsert\",\n \"delete\",\n]);\n\nconst ALL_OPS = [\n \"findMany\",\n \"findFirst\",\n \"findFirstOrThrow\",\n \"findUnique\",\n \"findUniqueOrThrow\",\n \"create\",\n \"createMany\",\n \"createManyAndReturn\",\n \"update\",\n \"updateMany\",\n \"upsert\",\n \"delete\",\n \"deleteMany\",\n \"count\",\n \"aggregate\",\n \"groupBy\",\n] as const;\n\nconst FLUENT_OPS = new Set([\n \"findUnique\",\n \"findUniqueOrThrow\",\n \"findFirst\",\n \"findFirstOrThrow\",\n]);\n\nexport interface DelegateContext {\n engine: QueryEngine;\n schema: SchemaDocument;\n extensions: EmberExtensionArgs[];\n middlewares: Middleware[];\n}\n\n/** Build a model delegate with extensions, middleware and fluent reads applied. */\nexport function buildDelegate(\n ctx: DelegateContext,\n modelName: string,\n): Record<string, unknown> {\n const model = findModel(ctx.schema, modelName);\n const delegate: Record<string, unknown> = {};\n\n for (const operation of ALL_OPS) {\n delegate[operation] = (args: Record<string, unknown> = {}) =>\n runOperation(ctx, modelName, operation, args, delegate);\n }\n\n // model extensions add/override delegate methods (bound to the delegate).\n for (const ext of ctx.extensions) {\n const methods = {\n ...(ext.model?.$allModels ?? {}),\n ...(ext.model?.[modelName] ?? {}),\n };\n for (const [name, fn] of Object.entries(methods)) {\n delegate[name] = (...args: unknown[]) => fn.apply(delegate, args);\n }\n }\n\n void model;\n return delegate;\n}\n\nfunction runOperation(\n ctx: DelegateContext,\n modelName: string,\n operation: string,\n args: Record<string, unknown>,\n delegate: Record<string, unknown>,\n): unknown {\n // The core executor: middleware -> engine, then compute result fields.\n const base = async (a: Record<string, unknown>): Promise<unknown> => {\n const expanded = expandComputedSelect(ctx, modelName, operation, a);\n const raw = await runMiddleware(ctx, modelName, operation, expanded.args);\n return applyResultExtensions(ctx, modelName, operation, raw, expanded.computeOnly);\n };\n\n const hooks = gatherQueryHooks(ctx, modelName, operation);\n const run = composeHooks(hooks, modelName, operation, base);\n\n if (FLUENT_OPS.has(operation)) {\n return makeFluent(ctx, modelName, args, () => run(args) as Promise<Record<string, unknown> | null>);\n }\n void delegate;\n return run(args);\n}\n\n// ---- query hooks ($extends.query) -----------------------------------------\n\nfunction gatherQueryHooks(\n ctx: DelegateContext,\n model: string,\n operation: string,\n): QueryHook[] {\n const hooks: QueryHook[] = [];\n for (const ext of ctx.extensions) {\n const q = ext.query;\n if (!q) continue;\n pushHook(hooks, q[model], operation);\n pushHook(hooks, q.$allModels, operation);\n }\n return hooks;\n}\n\nfunction pushHook(hooks: QueryHook[], map: HookMap | undefined, operation: string): void {\n if (!map) return;\n if (map[operation]) hooks.push(map[operation]!);\n if (map.$allOperations) hooks.push(map.$allOperations);\n}\n\nfunction composeHooks(\n hooks: QueryHook[],\n model: string,\n operation: string,\n base: (args: Record<string, unknown>) => Promise<unknown>,\n): (args: Record<string, unknown>) => Promise<unknown> {\n // Later-registered hooks wrap earlier ones (outermost = last registered).\n let next = base;\n for (const hook of hooks) {\n const inner = next;\n next = (args: Record<string, unknown>) =>\n hook({ model, operation, args, query: (a) => inner(a) }) as Promise<unknown>;\n }\n return next;\n}\n\n// ---- middleware ($use) ----------------------------------------------------\n\nfunction runMiddleware(\n ctx: DelegateContext,\n model: string,\n action: string,\n args: Record<string, unknown>,\n): Promise<unknown> {\n const engine = ctx.engine as unknown as Record<\n string,\n (m: string, x: unknown) => Promise<unknown>\n >;\n const engineCall = (a: { model?: string; action: string; args: unknown }) =>\n engine[a.action]!(model, a.args);\n\n let next = engineCall;\n for (const mw of ctx.middlewares) {\n const inner = next;\n next = (params) => mw(params, inner) as Promise<unknown>;\n }\n return next({ model, action, args });\n}\n\n// ---- result extensions ($extends.result) ----------------------------------\n\ninterface ResultComputer {\n field: string;\n compute: (record: Record<string, unknown>) => unknown;\n}\n\nfunction resultComputers(ctx: DelegateContext, model: string): ResultComputer[] {\n const out: ResultComputer[] = [];\n for (const ext of ctx.extensions) {\n const r = ext.result?.[model];\n if (!r) continue;\n for (const [field, def] of Object.entries(r)) {\n out.push({ field, compute: def.compute });\n }\n }\n return out;\n}\n\nfunction applyResultExtensions(\n ctx: DelegateContext,\n model: string,\n operation: string,\n value: unknown,\n computeFields: Set<string> | null,\n): unknown {\n if (!RECORD_OPS.has(operation)) return value;\n const computers = resultComputers(ctx, model).filter(\n (c) => !computeFields || computeFields.has(c.field),\n );\n if (computers.length === 0) return value;\n\n const compute = (rec: unknown): unknown => {\n if (!rec || typeof rec !== \"object\") return rec;\n const record = rec as Record<string, unknown>;\n for (const c of computers) {\n try {\n record[c.field] = c.compute(record);\n } catch {\n /* leave field unset if compute throws (e.g. missing `needs`) */\n }\n }\n return record;\n };\n\n return Array.isArray(value) ? value.map(compute) : compute(value);\n}\n\n/**\n * When `select` references a computed result field, replace it with the\n * field's `needs` (real columns) so the engine can fetch them, and remember to\n * compute only the requested computed fields.\n */\nfunction expandComputedSelect(\n ctx: DelegateContext,\n model: string,\n operation: string,\n args: Record<string, unknown>,\n): { args: Record<string, unknown>; computeOnly: Set<string> | null } {\n const computers = resultComputers(ctx, model);\n if (computers.length === 0) return { args, computeOnly: null };\n\n const select = args.select as Record<string, unknown> | undefined;\n if (!select) return { args, computeOnly: null };\n\n const byField = new Map(\n ctx.extensions\n .flatMap((e) => Object.entries(e.result?.[model] ?? {}))\n .map(([f, def]) => [f, def] as const),\n );\n\n const computeOnly = new Set<string>();\n const newSelect: Record<string, unknown> = { ...select };\n for (const key of Object.keys(select)) {\n const def = byField.get(key);\n if (!def) continue;\n computeOnly.add(key);\n delete newSelect[key];\n for (const need of Object.keys(def.needs ?? {})) newSelect[need] = true;\n }\n if (computeOnly.size === 0) return { args, computeOnly: null };\n return { args: { ...args, select: newSelect }, computeOnly };\n}\n\n// ---- fluent API -----------------------------------------------------------\n\ninterface Fluent {\n then: Promise<unknown>[\"then\"];\n catch: Promise<unknown>[\"catch\"];\n finally: Promise<unknown>[\"finally\"];\n [relation: string]: unknown;\n}\n\nfunction makeFluent(\n ctx: DelegateContext,\n modelName: string,\n args: Record<string, unknown>,\n exec: () => Promise<Record<string, unknown> | null>,\n): Fluent {\n const model = findModel(ctx.schema, modelName)!;\n const where = (args.where ?? {}) as Record<string, unknown>;\n\n let cached: Promise<unknown> | null = null;\n const run = () => (cached ??= exec());\n\n const fluent = {\n then: (res?: any, rej?: any) => run().then(res, rej),\n catch: (rej?: any) => run().catch(rej),\n finally: (f?: any) => run().finally(f),\n } as Fluent;\n\n for (const rel of relationFields(model)) {\n fluent[rel.name] = (subArgs: Record<string, unknown> = {}) =>\n traverse(ctx, model, rel, where, subArgs);\n }\n return fluent;\n}\n\nfunction traverse(\n ctx: DelegateContext,\n model: ModelNode,\n rel: FieldNode,\n parentWhere: Record<string, unknown>,\n subArgs: Record<string, unknown>,\n): unknown {\n const inverse = inverseField(ctx.schema, model, rel);\n const relatedWhere: Record<string, unknown> = inverse\n ? inverse.isList\n ? { [inverse.name]: { some: parentWhere } }\n : { [inverse.name]: parentWhere }\n : {};\n const where: Record<string, unknown> = subArgs.where\n ? { AND: [relatedWhere, subArgs.where] }\n : relatedWhere;\n\n const findArgs = { ...subArgs, where } as Record<string, unknown> as never;\n if (rel.isList) {\n return ctx.engine.findMany(rel.type, findArgs);\n }\n // to-one target: chainable fluent\n return makeFluent(ctx, rel.type, { ...subArgs, where }, () =>\n ctx.engine.findFirst(rel.type, findArgs),\n );\n}\n\nfunction inverseField(\n schema: SchemaDocument,\n model: ModelNode,\n rel: FieldNode,\n): FieldNode | undefined {\n const related = findModel(schema, rel.type);\n if (!related) return undefined;\n const candidates = related.fields.filter(\n (f) => f.kind === \"object\" && f.type === model.name,\n );\n if (rel.relation?.name) {\n const byName = candidates.find((f) => f.relation?.name === rel.relation?.name);\n if (byName) return byName;\n }\n return candidates[0];\n}\n","import type { SchemaDocument } from \"@ember/ast\";\nimport {\n createDriver,\n parseConnectionUrl,\n type ConnectionConfig,\n type QueryEvent,\n type QueryLogger,\n type SqlDriver,\n type TransactionOptions,\n} from \"@ember/driver\";\nimport { EmberError } from \"@ember/errors\";\nimport { FirebirdDialect, type SqlDialect } from \"@ember/sql\";\nimport { QueryEngine } from \"@ember/query\";\nimport { resolveDatasourceUrl } from \"@ember/schema\";\nimport { lowerFirst } from \"@ember/utils\";\nimport { type ModelDelegate } from \"./delegate\";\nimport {\n buildDelegate,\n type DelegateContext,\n type EmberExtensionArgs,\n type Middleware,\n} from \"./runtime\";\n\nexport type { ModelDelegate } from \"./delegate\";\nexport type {\n EmberExtensionArgs,\n Middleware,\n QueryHook,\n QueryHookParams,\n ResultFieldExtension,\n} from \"./runtime\";\nexport type { QueryEvent, QueryLogger } from \"@ember/driver\";\n\nexport interface ClientOptions {\n /** Connection URL or explicit config. Overrides the schema datasource. */\n datasourceUrl?: string;\n datasource?: ConnectionConfig;\n /** A pre-parsed schema document (the generated client passes its own). */\n schema: SchemaDocument;\n /**\n * Query logging: `true` logs each statement to the console; pass a function\n * to receive structured `QueryEvent`s (sql, params, durationMs, rowCount).\n */\n log?: boolean | QueryLogger;\n}\n\n/**\n * Runtime client. Builds one delegate per model from the schema and exposes\n * Prisma-style lifecycle and transaction helpers. The generated client extends\n * this and adds strongly-typed delegate properties.\n */\nexport class EmberClientBase {\n protected readonly driver: SqlDriver;\n protected readonly engine: QueryEngine;\n protected readonly dialect: SqlDialect;\n protected readonly schema: SchemaDocument;\n private connected = false;\n\n /** Mutated by $extends (per instance) and $use (shared). */\n protected extensions: EmberExtensionArgs[] = [];\n protected middlewares: Middleware[] = [];\n private readonly queryListeners: QueryLogger[] = [];\n private readonly baseLog?: QueryLogger;\n\n /** Dynamic model delegates, keyed by camelCased model name. */\n [delegate: string]: unknown;\n\n constructor(options: ClientOptions) {\n this.schema = options.schema;\n\n const url =\n options.datasourceUrl ?? resolveDatasourceUrl(options.schema, process.cwd());\n if (!options.datasource && !url) {\n throw new EmberError(\n \"No datasource configured. Provide datasourceUrl, datasource, or a datasource block with a resolvable url.\",\n );\n }\n const config: ConnectionConfig =\n options.datasource ?? parseConnectionUrl(url!);\n\n this.dialect = new FirebirdDialect({ version: config.version });\n this.baseLog = buildLogger(options.log);\n\n this.driver = createDriver(config, { onQuery: (e) => this.dispatchQuery(e) });\n this.engine = new QueryEngine(options.schema, this.dialect, this.driver);\n\n this.installDelegates();\n }\n\n private dispatchQuery(event: QueryEvent): void {\n this.baseLog?.(event);\n for (const listener of this.queryListeners) listener(event);\n }\n\n private delegateContext(): DelegateContext {\n return {\n engine: this.engine,\n schema: this.schema,\n extensions: this.extensions,\n middlewares: this.middlewares,\n };\n }\n\n /** (Re)define one delegate property per model using the current extensions. */\n private installDelegates(): void {\n const ctx = this.delegateContext();\n for (const model of this.schema.models) {\n Object.defineProperty(this, lowerFirst(model.name), {\n value: buildDelegate(ctx, model.name),\n enumerable: true,\n configurable: true,\n });\n }\n }\n\n /**\n * Prisma-style Client Extensions. Returns a new client (the original is\n * unchanged) that shares the connection/engine but applies the extension's\n * `result` / `model` / `query` / `client` definitions.\n */\n $extends(extension: EmberExtensionArgs): this {\n const clone: this = Object.create(this);\n clone.extensions = [...this.extensions, extension];\n clone.installDelegates();\n if (extension.client) {\n for (const [key, value] of Object.entries(extension.client)) {\n Object.defineProperty(clone, key, {\n value: typeof value === \"function\" ? value.bind(clone) : value,\n enumerable: true,\n configurable: true,\n });\n }\n }\n return clone;\n }\n\n /** Prisma-style middleware: runs around every operation. */\n $use(middleware: Middleware): void {\n this.middlewares.push(middleware);\n }\n\n /** Subscribe to query events (mirrors the `log` callback). */\n $on(event: \"query\", listener: QueryLogger): void {\n if (event === \"query\") this.queryListeners.push(listener);\n }\n\n /** Type-safe access to a delegate by model name. */\n model(name: string): ModelDelegate {\n return this[lowerFirst(name)] as ModelDelegate;\n }\n\n async $connect(): Promise<void> {\n if (this.connected) return;\n await this.driver.connect();\n this.connected = true;\n }\n\n async $disconnect(): Promise<void> {\n if (!this.connected) return;\n await this.driver.disconnect();\n this.connected = false;\n }\n\n /**\n * Run work inside a single transaction.\n * - Interactive form: `$transaction(async (tx) => { ... })`.\n * - Sequential form: `$transaction([(tx) => tx.user.create(...), ...])`.\n *\n * Because the driver tracks the active transaction via AsyncLocalStorage,\n * every delegate call made on the passed client runs in the same transaction.\n */\n $transaction<T>(\n fn: (tx: this) => Promise<T>,\n options?: TransactionOptions,\n ): Promise<T>;\n $transaction<T>(\n thunks: ((tx: this) => Promise<T>)[],\n options?: TransactionOptions,\n ): Promise<T[]>;\n $transaction<T>(\n arg: ((tx: this) => Promise<T>) | ((tx: this) => Promise<T>)[],\n options?: TransactionOptions,\n ): Promise<T | T[]> {\n if (Array.isArray(arg)) {\n return this.driver.transaction(async () => {\n const results: T[] = [];\n for (const thunk of arg) results.push(await thunk(this));\n return results;\n }, options);\n }\n return this.driver.transaction(() => arg(this), options);\n }\n\n /** Execute a raw read query (returns rows) inside a transaction. */\n $queryRawUnsafe<T = Record<string, unknown>>(\n sql: string,\n ...params: unknown[]\n ): Promise<T[]> {\n return this.driver.transaction((tx) =>\n tx.query<T>(sql, params.map(toSqlValue)),\n );\n }\n\n /** Execute a raw write statement inside a transaction; returns affected rows when available. */\n $executeRawUnsafe(sql: string, ...params: unknown[]): Promise<number> {\n return this.driver.transaction(async (tx) => {\n const rows = await tx.query(sql, params.map(toSqlValue));\n return Array.isArray(rows) ? rows.length : 0;\n });\n }\n\n /** Tagged-template raw query: `client.$queryRaw\\`SELECT * FROM T WHERE id = ${id}\\``. */\n $queryRaw<T = Record<string, unknown>>(\n strings: TemplateStringsArray,\n ...values: unknown[]\n ): Promise<T[]> {\n const { sql, params } = buildTemplate(strings, values);\n return this.$queryRawUnsafe<T>(sql, ...params);\n }\n\n $executeRaw(\n strings: TemplateStringsArray,\n ...values: unknown[]\n ): Promise<number> {\n const { sql, params } = buildTemplate(strings, values);\n return this.$executeRawUnsafe(sql, ...params);\n }\n}\n\nfunction buildTemplate(\n strings: TemplateStringsArray,\n values: unknown[],\n): { sql: string; params: unknown[] } {\n let sql = \"\";\n strings.forEach((part, i) => {\n sql += part;\n if (i < values.length) sql += \"?\";\n });\n return { sql, params: values };\n}\n\nfunction toSqlValue(v: unknown): never {\n return v as never;\n}\n\n/** Resolve the `log` option into a driver query hook. */\nfunction buildLogger(\n log: ClientOptions[\"log\"],\n): QueryLogger | undefined {\n if (!log) return undefined;\n if (typeof log === \"function\") return log;\n return (e: QueryEvent) => {\n const params = e.params.length ? ` -- ${JSON.stringify(e.params)}` : \"\";\n // eslint-disable-next-line no-console\n console.log(\n `ember:query (${e.durationMs.toFixed(1)}ms, ${e.rowCount} rows) ${e.sql}${params}`,\n );\n };\n}\n\n/**\n * Factory for an untyped client when you don't use the generated client.\n * Prefer the generated `EmberClient` for full type-safety.\n */\nexport function createClient(options: ClientOptions): EmberClientBase {\n return new EmberClientBase(options);\n}\n","import type { TransactionContext } from \"@ember/driver\";\n\n/** Raw column metadata as read from RDB$ system tables (already trimmed). */\nexport interface RawColumn {\n table: string;\n name: string;\n position: number;\n fieldType: number;\n fieldSubType: number | null;\n length: number | null;\n precision: number | null;\n scale: number | null;\n notNull: boolean;\n defaultSource: string | null;\n isIdentity: boolean;\n charLength: number | null;\n}\n\nexport interface RawConstraint {\n table: string;\n type: string; // PRIMARY KEY | UNIQUE | FOREIGN KEY\n name: string;\n indexName: string | null;\n columns: string[];\n // foreign key only:\n references?: { table: string; columns: string[] };\n updateRule?: string;\n deleteRule?: string;\n}\n\nconst trim = (v: unknown): string => (v == null ? \"\" : String(v).trim());\nconst numOrNull = (v: unknown): number | null =>\n v == null ? null : Number(v);\n\n/** Reads tables, columns and constraints from Firebird's metadata catalog. */\nexport class FirebirdMetadataReader {\n constructor(private readonly tx: TransactionContext) {}\n\n async tables(): Promise<string[]> {\n const rows = await this.tx.query<{ RDB$RELATION_NAME: string }>(\n `SELECT RDB$RELATION_NAME\n FROM RDB$RELATIONS\n WHERE RDB$VIEW_BLR IS NULL\n AND (RDB$SYSTEM_FLAG IS NULL OR RDB$SYSTEM_FLAG = 0)\n ORDER BY RDB$RELATION_NAME`,\n );\n return rows.map((r) => trim(r[\"RDB$RELATION_NAME\"]));\n }\n\n async columns(): Promise<RawColumn[]> {\n const rows = await this.tx.query<Record<string, unknown>>(\n `SELECT\n rf.RDB$RELATION_NAME AS TABLE_NAME,\n rf.RDB$FIELD_NAME AS FIELD_NAME,\n rf.RDB$FIELD_POSITION AS FIELD_POSITION,\n rf.RDB$NULL_FLAG AS NULL_FLAG,\n rf.RDB$DEFAULT_SOURCE AS DEFAULT_SOURCE,\n rf.RDB$IDENTITY_TYPE AS IDENTITY_TYPE,\n f.RDB$FIELD_TYPE AS FIELD_TYPE,\n f.RDB$FIELD_SUB_TYPE AS FIELD_SUB_TYPE,\n f.RDB$FIELD_LENGTH AS FIELD_LENGTH,\n f.RDB$CHARACTER_LENGTH AS CHAR_LENGTH,\n f.RDB$FIELD_PRECISION AS FIELD_PRECISION,\n f.RDB$FIELD_SCALE AS FIELD_SCALE\n FROM RDB$RELATION_FIELDS rf\n JOIN RDB$FIELDS f ON f.RDB$FIELD_NAME = rf.RDB$FIELD_SOURCE\n JOIN RDB$RELATIONS r ON r.RDB$RELATION_NAME = rf.RDB$RELATION_NAME\n WHERE r.RDB$VIEW_BLR IS NULL\n AND (r.RDB$SYSTEM_FLAG IS NULL OR r.RDB$SYSTEM_FLAG = 0)\n ORDER BY rf.RDB$RELATION_NAME, rf.RDB$FIELD_POSITION`,\n );\n return rows.map((r) => ({\n table: trim(r.TABLE_NAME),\n name: trim(r.FIELD_NAME),\n position: Number(r.FIELD_POSITION ?? 0),\n fieldType: Number(r.FIELD_TYPE ?? 0),\n fieldSubType: numOrNull(r.FIELD_SUB_TYPE),\n length: numOrNull(r.FIELD_LENGTH),\n charLength: numOrNull(r.CHAR_LENGTH),\n precision: numOrNull(r.FIELD_PRECISION),\n scale: numOrNull(r.FIELD_SCALE),\n notNull: r.NULL_FLAG != null && Number(r.NULL_FLAG) === 1,\n defaultSource: r.DEFAULT_SOURCE == null ? null : trim(r.DEFAULT_SOURCE),\n isIdentity: r.IDENTITY_TYPE != null,\n }));\n }\n\n async constraints(): Promise<RawConstraint[]> {\n const rows = await this.tx.query<Record<string, unknown>>(\n `SELECT\n rc.RDB$CONSTRAINT_NAME AS CONSTRAINT_NAME,\n rc.RDB$CONSTRAINT_TYPE AS CONSTRAINT_TYPE,\n rc.RDB$RELATION_NAME AS TABLE_NAME,\n rc.RDB$INDEX_NAME AS INDEX_NAME,\n seg.RDB$FIELD_NAME AS FIELD_NAME,\n seg.RDB$FIELD_POSITION AS SEG_POSITION,\n refc.RDB$UPDATE_RULE AS UPDATE_RULE,\n refc.RDB$DELETE_RULE AS DELETE_RULE,\n refc.RDB$CONST_NAME_UQ AS UQ_NAME\n FROM RDB$RELATION_CONSTRAINTS rc\n JOIN RDB$INDEX_SEGMENTS seg ON seg.RDB$INDEX_NAME = rc.RDB$INDEX_NAME\n LEFT JOIN RDB$REF_CONSTRAINTS refc ON refc.RDB$CONSTRAINT_NAME = rc.RDB$CONSTRAINT_NAME\n WHERE rc.RDB$CONSTRAINT_TYPE IN ('PRIMARY KEY', 'UNIQUE', 'FOREIGN KEY')\n ORDER BY rc.RDB$CONSTRAINT_NAME, seg.RDB$FIELD_POSITION`,\n );\n\n const byName = new Map<string, RawConstraint>();\n const uqByName = new Map<string, string>(); // constraint -> referenced UQ constraint name\n\n for (const r of rows) {\n const name = trim(r.CONSTRAINT_NAME);\n let c = byName.get(name);\n if (!c) {\n c = {\n table: trim(r.TABLE_NAME),\n type: trim(r.CONSTRAINT_TYPE),\n name,\n indexName: r.INDEX_NAME == null ? null : trim(r.INDEX_NAME),\n columns: [],\n };\n if (c.type === \"FOREIGN KEY\") {\n c.updateRule = trim(r.UPDATE_RULE) || undefined;\n c.deleteRule = trim(r.DELETE_RULE) || undefined;\n uqByName.set(name, trim(r.UQ_NAME));\n }\n byName.set(name, c);\n }\n const col = trim(r.FIELD_NAME);\n if (col && !c.columns.includes(col)) c.columns.push(col);\n }\n\n // Resolve foreign key targets via the referenced unique/PK constraint.\n for (const c of byName.values()) {\n if (c.type !== \"FOREIGN KEY\") continue;\n const uqName = uqByName.get(c.name);\n if (!uqName) continue;\n const target = byName.get(uqName);\n if (target) {\n c.references = { table: target.table, columns: [...target.columns] };\n } else {\n const resolved = await this.resolveConstraintColumns(uqName);\n if (resolved) c.references = resolved;\n }\n }\n\n return [...byName.values()];\n }\n\n private async resolveConstraintColumns(\n constraintName: string,\n ): Promise<{ table: string; columns: string[] } | null> {\n const rows = await this.tx.query<Record<string, unknown>>(\n `SELECT rc.RDB$RELATION_NAME AS TABLE_NAME, seg.RDB$FIELD_NAME AS FIELD_NAME\n FROM RDB$RELATION_CONSTRAINTS rc\n JOIN RDB$INDEX_SEGMENTS seg ON seg.RDB$INDEX_NAME = rc.RDB$INDEX_NAME\n WHERE rc.RDB$CONSTRAINT_NAME = ?\n ORDER BY seg.RDB$FIELD_POSITION`,\n [constraintName],\n );\n if (rows.length === 0) return null;\n return {\n table: trim(rows[0]!.TABLE_NAME),\n columns: rows.map((r) => trim(r.FIELD_NAME)),\n };\n }\n}\n","import type { NativeType, ScalarType } from \"@ember/ast\";\nimport type { RawColumn } from \"./firebird-meta\";\n\n// Firebird RDB$FIELD_TYPE codes.\nconst FB = {\n SMALLINT: 7,\n INTEGER: 8,\n QUAD: 9,\n FLOAT: 10,\n DATE_LEGACY: 11,\n DATE: 12,\n TIME: 13,\n CHAR: 14,\n INT64: 16, // BIGINT / numeric\n BOOLEAN: 23,\n DOUBLE: 27,\n TIMESTAMP: 35,\n VARCHAR: 37,\n BLOB: 261,\n} as const;\n\nexport interface MappedType {\n scalar: ScalarType;\n native?: NativeType;\n}\n\n/**\n * Translate a Firebird column type into an EmberORM scalar type plus the native\n * type annotation (`@db.*`) that preserves the exact column definition.\n */\nexport function mapColumnType(col: RawColumn): MappedType {\n const scale = col.scale ?? 0;\n switch (col.fieldType) {\n case FB.SMALLINT:\n return scale < 0\n ? decimal(col)\n : { scalar: \"Int\", native: { name: \"SmallInt\", args: [] } };\n case FB.INTEGER:\n return scale < 0\n ? decimal(col)\n : { scalar: \"Int\", native: { name: \"Integer\", args: [] } };\n case FB.INT64:\n return scale < 0\n ? decimal(col)\n : { scalar: \"BigInt\", native: { name: \"BigInt\", args: [] } };\n case FB.FLOAT:\n return { scalar: \"Float\", native: { name: \"Float\", args: [] } };\n case FB.DOUBLE:\n return { scalar: \"Float\", native: { name: \"DoublePrecision\", args: [] } };\n case FB.BOOLEAN:\n return { scalar: \"Boolean\", native: { name: \"Boolean\", args: [] } };\n case FB.CHAR:\n return {\n scalar: \"String\",\n native: { name: \"Char\", args: col.charLength ? [col.charLength] : [] },\n };\n case FB.VARCHAR:\n return {\n scalar: \"String\",\n native: { name: \"VarChar\", args: col.charLength ? [col.charLength] : [] },\n };\n case FB.DATE:\n case FB.DATE_LEGACY:\n return { scalar: \"DateTime\", native: { name: \"Date\", args: [] } };\n case FB.TIME:\n return { scalar: \"DateTime\", native: { name: \"Time\", args: [] } };\n case FB.TIMESTAMP:\n return { scalar: \"DateTime\", native: { name: \"Timestamp\", args: [] } };\n case FB.BLOB:\n // sub_type 1 is a text blob.\n return col.fieldSubType === 1\n ? { scalar: \"String\", native: { name: \"Text\", args: [] } }\n : { scalar: \"Bytes\", native: { name: \"Blob\", args: [] } };\n default:\n return { scalar: \"String\" };\n }\n}\n\nfunction decimal(col: RawColumn): MappedType {\n const precision = col.precision ?? 18;\n const scaleAbs = Math.abs(col.scale ?? 0);\n return {\n scalar: \"Decimal\",\n native: { name: \"Decimal\", args: [precision, scaleAbs] },\n };\n}\n","import {\n type DefaultValue,\n type EnumNode,\n type FieldNode,\n type ModelNode,\n type SchemaDocument,\n} from \"@ember/ast\";\nimport type { SqlDriver } from \"@ember/driver\";\nimport { camelCase, lowerFirst, pascalCase, pluralize, uniq } from \"@ember/utils\";\nimport {\n FirebirdMetadataReader,\n type RawColumn,\n type RawConstraint,\n} from \"./firebird-meta\";\nimport { mapColumnType } from \"./type-map\";\n\nexport { FirebirdMetadataReader } from \"./firebird-meta\";\nexport { mapColumnType } from \"./type-map\";\n\nexport interface IntrospectOptions {\n datasource?: { name: string; provider: string; envVar?: string; url?: string };\n}\n\n/**\n * Reverse-engineer a SchemaDocument from a live Firebird database.\n * Table/column names are kept as-is via `@@map`/`@map` when the idiomatic\n * Ember name differs, and foreign keys become relation fields on both sides.\n */\nexport class Introspector {\n constructor(private readonly driver: SqlDriver) {}\n\n async introspect(options: IntrospectOptions = {}): Promise<SchemaDocument> {\n const { tables, columns, constraints } = await this.driver.transaction(\n async (tx) => {\n const reader = new FirebirdMetadataReader(tx);\n return {\n tables: await reader.tables(),\n columns: await reader.columns(),\n constraints: await reader.constraints(),\n };\n },\n { isolation: \"READ_COMMITTED_READ_ONLY\" },\n );\n\n const columnsByTable = groupBy(columns, (c) => c.table);\n const constraintsByTable = groupBy(constraints, (c) => c.table);\n const modelNames = buildNameMap(tables);\n\n const models: ModelNode[] = tables.map((table) =>\n this.buildModel(\n table,\n modelNames,\n columnsByTable.get(table) ?? [],\n constraintsByTable.get(table) ?? [],\n ),\n );\n\n addRelations(models, modelNames, constraints);\n\n const enums: EnumNode[] = [];\n const doc: SchemaDocument = {\n generators: [\n { name: \"client\", provider: \"ember-client-js\", output: \"../generated\", config: {} },\n ],\n models,\n enums,\n };\n if (options.datasource) {\n doc.datasource = {\n name: options.datasource.name,\n provider: options.datasource.provider,\n url: options.datasource.envVar\n ? { kind: \"env\", value: options.datasource.envVar }\n : { kind: \"literal\", value: options.datasource.url ?? \"\" },\n };\n }\n return doc;\n }\n\n private buildModel(\n table: string,\n modelNames: Map<string, string>,\n columns: RawColumn[],\n constraints: RawConstraint[],\n ): ModelNode {\n const modelName = modelNames.get(table)!;\n const pk = constraints.find((c) => c.type === \"PRIMARY KEY\");\n const uniques = constraints.filter((c) => c.type === \"UNIQUE\");\n\n const fieldNameMap = buildNameMap(columns.map((c) => c.name), camelCase);\n const fields: FieldNode[] = columns.map((col) =>\n buildField(col, fieldNameMap, pk, uniques),\n );\n\n const model: ModelNode = {\n name: modelName,\n dbName: modelName !== table ? table : undefined,\n fields,\n primaryKey:\n pk && pk.columns.length > 1\n ? pk.columns.map((c) => fieldNameMap.get(c)!)\n : [],\n uniqueIndexes: uniques\n .filter((u) => u.columns.length > 1)\n .map((u) => ({ fields: u.columns.map((c) => fieldNameMap.get(c)!) })),\n indexes: [],\n };\n return model;\n }\n}\n\nfunction buildField(\n col: RawColumn,\n fieldNameMap: Map<string, string>,\n pk: RawConstraint | undefined,\n uniques: RawConstraint[],\n): FieldNode {\n const fieldName = fieldNameMap.get(col.name)!;\n const mapped = mapColumnType(col);\n const isSingleIdCol =\n !!pk && pk.columns.length === 1 && pk.columns[0] === col.name;\n const isSingleUnique = uniques.some(\n (u) => u.columns.length === 1 && u.columns[0] === col.name,\n );\n\n const field: FieldNode = {\n name: fieldName,\n type: mapped.scalar,\n kind: \"scalar\",\n isList: false,\n isRequired: col.notNull || isSingleIdCol,\n isId: isSingleIdCol,\n isUnique: isSingleUnique,\n isUpdatedAt: false,\n dbName: fieldName !== col.name ? col.name : undefined,\n nativeType: mapped.native,\n default: parseDefault(col),\n };\n return field;\n}\n\nfunction parseDefault(col: RawColumn): DefaultValue | undefined {\n if (col.isIdentity) return { function: { name: \"autoincrement\", args: [] } };\n if (!col.defaultSource) return undefined;\n const src = col.defaultSource.replace(/^DEFAULT\\s+/i, \"\").trim();\n if (/^CURRENT_TIMESTAMP/i.test(src)) return { function: { name: \"now\", args: [] } };\n if (/^(TRUE|FALSE)$/i.test(src)) return { literal: /^TRUE$/i.test(src) };\n if (/^-?\\d+(\\.\\d+)?$/.test(src)) return { literal: Number(src) };\n const str = /^'(.*)'$/.exec(src);\n if (str) return { literal: str[1]! };\n return undefined;\n}\n\n/**\n * Create relation fields on both sides of every foreign key:\n * - the child gets a to-one field with `@relation(fields, references)`;\n * - the parent gets a to-many back relation (a list).\n */\nfunction addRelations(\n models: ModelNode[],\n modelNames: Map<string, string>,\n constraints: RawConstraint[],\n): void {\n const byName = new Map(models.map((m) => [m.name, m]));\n for (const fk of constraints) {\n if (fk.type !== \"FOREIGN KEY\" || !fk.references) continue;\n const childModel = byName.get(modelNames.get(fk.table)!);\n const parentModel = byName.get(modelNames.get(fk.references.table)!);\n if (!childModel || !parentModel) continue;\n\n const localFieldNames = fk.columns.map((c) => columnToField(childModel, c));\n const refFieldNames = fk.references.columns.map((c) =>\n columnToField(parentModel, c),\n );\n\n const childFieldName = uniqueFieldName(childModel, lowerFirst(parentModel.name));\n childModel.fields.push({\n name: childFieldName,\n type: parentModel.name,\n kind: \"object\",\n isList: false,\n isRequired: localFieldNames.every(\n (n) => childModel.fields.find((f) => f.name === n)?.isRequired,\n ),\n isId: false,\n isUnique: false,\n isUpdatedAt: false,\n relation: {\n fields: localFieldNames,\n references: refFieldNames,\n onDelete: mapRule(fk.deleteRule),\n onUpdate: mapRule(fk.updateRule),\n },\n });\n\n const backName = uniqueFieldName(\n parentModel,\n lowerFirst(pluralize(childModel.name)),\n );\n parentModel.fields.push({\n name: backName,\n type: childModel.name,\n kind: \"object\",\n isList: true,\n isRequired: false,\n isId: false,\n isUnique: false,\n isUpdatedAt: false,\n });\n }\n}\n\nfunction columnToField(model: ModelNode, column: string): string {\n const f = model.fields.find((x) => (x.dbName ?? x.name) === column);\n return f ? f.name : camelCase(column);\n}\n\nfunction uniqueFieldName(model: ModelNode, base: string): string {\n let name = base;\n let i = 1;\n while (model.fields.some((f) => f.name === name)) name = `${base}_${++i}`;\n return name;\n}\n\nfunction mapRule(rule?: string) {\n switch ((rule ?? \"\").toUpperCase()) {\n case \"CASCADE\":\n return \"Cascade\" as const;\n case \"SET NULL\":\n return \"SetNull\" as const;\n case \"SET DEFAULT\":\n return \"SetDefault\" as const;\n case \"NO ACTION\":\n return \"NoAction\" as const;\n case \"RESTRICT\":\n return \"Restrict\" as const;\n default:\n return undefined;\n }\n}\n\n// ---- name helpers ---------------------------------------------------------\n\nfunction buildNameMap(\n dbNames: string[],\n transform: (s: string) => string = pascalCase,\n): Map<string, string> {\n const map = new Map<string, string>();\n const used = new Set<string>();\n for (const dbName of uniq(dbNames)) {\n let name = transform(dbName);\n if (!name) name = dbName;\n let candidate = name;\n let i = 1;\n while (used.has(candidate)) candidate = `${name}_${++i}`;\n used.add(candidate);\n map.set(dbName, candidate);\n }\n return map;\n}\n\nfunction groupBy<T>(items: T[], key: (t: T) => string): Map<string, T[]> {\n const map = new Map<string, T[]>();\n for (const item of items) {\n const k = key(item);\n const list = map.get(k) ?? [];\n list.push(item);\n map.set(k, list);\n }\n return map;\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport {\n type EnumNode,\n type FieldNode,\n type ModelNode,\n type SchemaDocument,\n relationFields,\n scalarFields,\n} from \"@ember/ast\";\nimport { lowerFirst } from \"@ember/utils\";\nimport { baseTsType } from \"./ts-types\";\n\nexport { baseTsType, fieldTsType } from \"./ts-types\";\n\n/**\n * Generates a fully-typed TypeScript client from a schema. Produces per-model\n * scalar types, relation payloads, filter/where/select/include/create/update\n * input types, typed delegates, and the `EmberClient` class (which embeds the\n * schema so it can run with no extra wiring).\n */\nexport class ClientGenerator {\n constructor(private readonly schema: SchemaDocument) {}\n\n generate(): string {\n const parts: string[] = [];\n parts.push(this.header());\n parts.push(this.enums());\n parts.push(this.modelTypes());\n parts.push(this.registry());\n parts.push(PAYLOAD_RESOLVER);\n parts.push(this.namespace());\n parts.push(this.clientClass());\n return parts.filter(Boolean).join(\"\\n\\n\") + \"\\n\";\n }\n\n // ---- header & shared ----------------------------------------------------\n\n private header(): string {\n return `// AUTO-GENERATED by EmberORM. Do not edit by hand.\n/* eslint-disable */\nimport { EmberClientBase } from \"ember-orm/client\";\nimport type { ClientOptions } from \"ember-orm/client\";\n\nexport type JsonValue =\n | string\n | number\n | boolean\n | null\n | { [key: string]: JsonValue }\n | JsonValue[];\n\nexport type SortOrder = \"asc\" | \"desc\";\nexport type QueryMode = \"default\" | \"insensitive\";\n\nconst schemaDocument = ${JSON.stringify(this.schema)} as unknown as ClientOptions[\"schema\"];`;\n }\n\n private enums(): string {\n return this.schema.enums.map((e) => this.enumType(e)).join(\"\\n\\n\");\n }\n\n private enumType(node: EnumNode): string {\n const values = node.values.map((v) => ` ${v.name}: \"${v.name}\"`).join(\",\\n\");\n return `export const ${node.name} = {\\n${values}\\n} as const;\nexport type ${node.name} = (typeof ${node.name})[keyof typeof ${node.name}];`;\n }\n\n private modelTypes(): string {\n return this.schema.models.map((m) => this.modelType(m)).join(\"\\n\\n\");\n }\n\n private modelType(model: ModelNode): string {\n const scalars = scalarFields(model)\n .map((f) => ` ${f.name}: ${this.scalarType(f)};`)\n .join(\"\\n\");\n\n const lines: string[] = [];\n // Public model type is scalar-only; relations are resolved per-query.\n lines.push(`export type ${model.name} = {\\n${scalars}\\n};`);\n // Recursive payload resolver (handles nested select/include narrowing).\n lines.push(`export type ${model.name}GetPayload<A> = $Payload<\"${model.name}\", A>;`);\n lines.push(this.fluentType(model));\n return lines.join(\"\\n\");\n }\n\n /**\n * Fluent-API return type for single-record reads: a Promise of the payload\n * that also exposes a method per relation (to-many -> array; to-one ->\n * chainable fluent).\n */\n private fluentType(model: ModelNode): string {\n const n = model.name;\n const methods = relationFields(model).map((f) => {\n if (f.isList) {\n return ` ${f.name}<S extends Prisma.${f.type}FindManyArgs = {}>(args?: S): Promise<${f.type}GetPayload<S>[]>;`;\n }\n return ` ${f.name}<S extends Prisma.${f.type}FindFirstArgs = {}>(args?: S): ${f.type}Fluent<S, null>;`;\n });\n return `export type ${n}Fluent<A, Null = null> = Promise<${n}GetPayload<A> | Null> & {\n${methods.join(\"\\n\")}\n};`;\n }\n\n /**\n * Type-level registry powering recursive payload resolution: a model-name\n * union, a scalar-payload map, and a relation map carrying each relation's\n * target model, list-ness and nullability.\n */\n private registry(): string {\n const names = this.schema.models.map((m) => `\"${m.name}\"`).join(\" | \");\n\n const scalarEntries = this.schema.models\n .map((m) => ` ${m.name}: ${m.name};`)\n .join(\"\\n\");\n\n const relationEntries = this.schema.models\n .map((m) => {\n const rels = relationFields(m)\n .map((f) => {\n const nullable = !f.isList && !f.isRequired ? \"; isNullable: true\" : \"\";\n return ` ${f.name}: { model: \"${f.type}\"; isList: ${f.isList}${nullable} }`;\n })\n .join(\";\\n\");\n return ` ${m.name}: {${rels ? `\\n${rels}\\n ` : \"\"}};`;\n })\n .join(\"\\n\");\n\n return `export type $ModelName = ${names || \"never\"};\n\nexport interface $ScalarPayload {\n${scalarEntries}\n}\n\nexport interface $RelationMap {\n${relationEntries}\n}`;\n }\n\n private scalarType(field: FieldNode): string {\n const base = baseTsType(field, this.schema);\n if (field.isList) return `${base}[]`;\n return field.isRequired ? base : `${base} | null`;\n }\n\n // ---- input types (Prisma namespace) -------------------------------------\n\n private namespace(): string {\n const blocks: string[] = [SHARED_FILTERS];\n for (const model of this.schema.models) {\n blocks.push(this.whereInput(model));\n blocks.push(this.orderByInput(model));\n blocks.push(this.selectInclude(model));\n blocks.push(this.dataInputs(model));\n blocks.push(this.argsTypes(model));\n blocks.push(this.delegateInterface(model));\n }\n return `export namespace Prisma {\\n${indentBlock(blocks.join(\"\\n\\n\"))}\\n}`;\n }\n\n private whereInput(model: ModelNode): string {\n const fields: string[] = [];\n for (const f of model.fields) {\n if (f.kind === \"object\") {\n fields.push(` ${f.name}?: ${this.relationFilter(f)};`);\n } else {\n fields.push(` ${f.name}?: ${this.fieldFilter(f)};`);\n }\n }\n return `export type ${model.name}WhereInput = {\n AND?: ${model.name}WhereInput | ${model.name}WhereInput[];\n OR?: ${model.name}WhereInput[];\n NOT?: ${model.name}WhereInput | ${model.name}WhereInput[];\n${fields.join(\"\\n\")}\n};\n\nexport type ${model.name}WhereUniqueInput = ${this.whereUnique(model)};`;\n }\n\n private whereUnique(model: ModelNode): string {\n const uniques = new Set<string>();\n for (const f of model.fields) if (f.isId || f.isUnique) uniques.add(f.name);\n for (const f of model.primaryKey) uniques.add(f);\n const parts = [...uniques].map((name) => {\n const field = model.fields.find((x) => x.name === name)!;\n return `{ ${name}: ${baseTsType(field, this.schema)} }`;\n });\n const base = `Partial<${model.name}WhereInput>`;\n return parts.length ? `(${parts.join(\" | \")}) & ${base}` : base;\n }\n\n private fieldFilter(field: FieldNode): string {\n const base = baseTsType(field, this.schema);\n const filterName = FILTER_FOR_SCALAR[field.type] ?? null;\n if (field.kind === \"enum\") {\n return `${base} | { equals?: ${base}; in?: ${base}[]; notIn?: ${base}[]; not?: ${base} }`;\n }\n if (filterName) return `${base} | ${filterName}`;\n return `${base}`;\n }\n\n private relationFilter(field: FieldNode): string {\n if (field.isList) {\n return `{ some?: ${field.type}WhereInput; every?: ${field.type}WhereInput; none?: ${field.type}WhereInput }`;\n }\n return `${field.type}WhereInput | { is?: ${field.type}WhereInput | null; isNot?: ${field.type}WhereInput | null } | null`;\n }\n\n private orderByInput(model: ModelNode): string {\n const fields = scalarFields(model)\n .map((f) => ` ${f.name}?: SortOrder;`)\n .join(\"\\n\");\n return `export type ${model.name}OrderByInput = {\\n${fields}\\n};`;\n }\n\n private selectInclude(model: ModelNode): string {\n const scalarSel = scalarFields(model)\n .map((f) => ` ${f.name}?: boolean;`)\n .join(\"\\n\");\n const relSel = relationFields(model)\n .map((f) => ` ${f.name}?: boolean | ${f.type}FindManyArgs;`)\n .join(\"\\n\");\n const include = relationFields(model)\n .map((f) => ` ${f.name}?: boolean | ${f.type}FindManyArgs;`)\n .join(\"\\n\");\n\n const listRelations = relationFields(model).filter((f) => f.isList);\n const countLine = listRelations.length\n ? `\\n _count?: boolean | { select?: { ${listRelations\n .map((f) => `${f.name}?: boolean`)\n .join(\"; \")} } };`\n : \"\";\n\n return `export type ${model.name}Select = {\n${scalarSel}${relSel ? \"\\n\" + relSel : \"\"}${countLine}\n};\n\nexport type ${model.name}Include = {\n${include || \" [k: string]: never;\"}${countLine}\n};`;\n }\n\n private dataInputs(model: ModelNode): string {\n // Foreign-key scalars can be supplied via their relation, so they are\n // optional in CreateInput (mirrors Prisma's CreateWithout* inputs).\n const foreignKeys = new Set<string>();\n for (const rel of relationFields(model)) {\n for (const fk of rel.relation?.fields ?? []) foreignKeys.add(fk);\n }\n const createScalars = scalarFields(model)\n .filter((f) => !isGeneratedOnCreate(f))\n .map((f) => {\n const optional =\n isOptionalOnCreate(f) || foreignKeys.has(f.name) ? \"?\" : \"\";\n return ` ${f.name}${optional}: ${this.inputScalarType(f)};`;\n });\n const createRelations = relationFields(model).map(\n (f) => ` ${f.name}?: ${this.nestedCreate(f)};`,\n );\n const updateScalars = scalarFields(model).map(\n (f) => ` ${f.name}?: ${this.updateScalarType(f)};`,\n );\n const updateRelations = relationFields(model).map(\n (f) => ` ${f.name}?: ${this.nestedUpdate(f)};`,\n );\n\n return `export type ${model.name}CreateInput = {\n${[...createScalars, ...createRelations].join(\"\\n\")}\n};\n\nexport type ${model.name}UpdateInput = {\n${[...updateScalars, ...updateRelations].join(\"\\n\")}\n};`;\n }\n\n private inputScalarType(field: FieldNode): string {\n const base = baseTsType(field, this.schema);\n if (field.isList) return `${base}[]`;\n return field.isRequired ? base : `${base} | null`;\n }\n\n /**\n * Update value for a scalar field: a bare value, `{ set }`, and — for numeric\n * fields — the atomic operators increment/decrement/multiply/divide.\n */\n private updateScalarType(field: FieldNode): string {\n const value = this.inputScalarType(field);\n if (field.isList) return value;\n const base = baseTsType(field, this.schema);\n if (NUMERIC_SCALARS.has(field.type)) {\n const nullable = field.isRequired ? \"\" : \" | null\";\n return `${value} | { set?: ${base}${nullable}; increment?: ${base}; decrement?: ${base}; multiply?: ${base}; divide?: ${base} }`;\n }\n return `${value} | { set?: ${value} }`;\n }\n\n private nestedCreate(field: FieldNode): string {\n const t = field.type;\n if (field.isList) {\n return `{ create?: ${t}CreateInput | ${t}CreateInput[]; connect?: ${t}WhereUniqueInput | ${t}WhereUniqueInput[]; connectOrCreate?: { where: ${t}WhereUniqueInput; create: ${t}CreateInput } | { where: ${t}WhereUniqueInput; create: ${t}CreateInput }[] }`;\n }\n return `{ create?: ${t}CreateInput; connect?: ${t}WhereUniqueInput; connectOrCreate?: { where: ${t}WhereUniqueInput; create: ${t}CreateInput } }`;\n }\n\n private nestedUpdate(field: FieldNode): string {\n const t = field.type;\n if (field.isList) {\n return `{ create?: ${t}CreateInput | ${t}CreateInput[]; connect?: ${t}WhereUniqueInput | ${t}WhereUniqueInput[]; disconnect?: ${t}WhereUniqueInput | ${t}WhereUniqueInput[]; set?: ${t}WhereUniqueInput | ${t}WhereUniqueInput[]; delete?: ${t}WhereUniqueInput | ${t}WhereUniqueInput[] }`;\n }\n return `{ create?: ${t}CreateInput; connect?: ${t}WhereUniqueInput; disconnect?: boolean }`;\n }\n\n private argsTypes(model: ModelNode): string {\n const n = model.name;\n return `export type ${n}Omit = Partial<Record<keyof ${n}, boolean>>;\n\nexport type ${n}FindManyArgs = {\n where?: ${n}WhereInput;\n orderBy?: ${n}OrderByInput | ${n}OrderByInput[];\n select?: ${n}Select;\n include?: ${n}Include;\n omit?: ${n}Omit;\n take?: number;\n skip?: number;\n cursor?: ${n}WhereUniqueInput;\n distinct?: (keyof ${n})[];\n};\n\nexport type ${n}FindFirstArgs = ${n}FindManyArgs;\n\nexport type ${n}FindUniqueArgs = {\n where: ${n}WhereUniqueInput;\n select?: ${n}Select;\n include?: ${n}Include;\n omit?: ${n}Omit;\n};\n\nexport type ${n}CreateArgs = {\n data: ${n}CreateInput;\n select?: ${n}Select;\n include?: ${n}Include;\n omit?: ${n}Omit;\n};\n\nexport type ${n}CreateManyArgs = { data: ${n}CreateInput[]; skipDuplicates?: boolean };\n\nexport type ${n}CreateManyAndReturnArgs = {\n data: ${n}CreateInput[];\n select?: ${n}Select;\n omit?: ${n}Omit;\n skipDuplicates?: boolean;\n};\n\nexport type ${n}UpdateArgs = {\n where: ${n}WhereUniqueInput;\n data: ${n}UpdateInput;\n select?: ${n}Select;\n include?: ${n}Include;\n omit?: ${n}Omit;\n};\n\nexport type ${n}UpdateManyArgs = { where?: ${n}WhereInput; data: ${n}UpdateInput };\n\nexport type ${n}UpsertArgs = {\n where: ${n}WhereUniqueInput;\n create: ${n}CreateInput;\n update: ${n}UpdateInput;\n select?: ${n}Select;\n include?: ${n}Include;\n omit?: ${n}Omit;\n};\n\nexport type ${n}DeleteArgs = { where: ${n}WhereUniqueInput; select?: ${n}Select; include?: ${n}Include };\nexport type ${n}DeleteManyArgs = { where?: ${n}WhereInput };\n\nexport type ${n}CountArgs = { where?: ${n}WhereInput; take?: number; skip?: number };\n\nexport type ${n}AggregateArgs = {\n where?: ${n}WhereInput;\n _count?: true | Partial<Record<keyof ${n}, boolean>>;\n _avg?: Partial<Record<keyof ${n}, boolean>>;\n _sum?: Partial<Record<keyof ${n}, boolean>>;\n _min?: Partial<Record<keyof ${n}, boolean>>;\n _max?: Partial<Record<keyof ${n}, boolean>>;\n};\n\nexport type ${n}GroupByArgs = ${n}AggregateArgs & {\n by: (keyof ${n})[];\n having?: ${n}WhereInput;\n orderBy?: ${n}OrderByInput | ${n}OrderByInput[];\n};`;\n }\n\n private delegateInterface(model: ModelNode): string {\n const n = model.name;\n return `export interface ${n}Delegate {\n findMany<A extends ${n}FindManyArgs>(args?: A): Promise<${n}GetPayload<A>[]>;\n findFirst<A extends ${n}FindFirstArgs>(args?: A): ${n}Fluent<A, null>;\n findFirstOrThrow<A extends ${n}FindFirstArgs>(args?: A): ${n}Fluent<A, never>;\n findUnique<A extends ${n}FindUniqueArgs>(args: A): ${n}Fluent<A, null>;\n findUniqueOrThrow<A extends ${n}FindUniqueArgs>(args: A): ${n}Fluent<A, never>;\n create<A extends ${n}CreateArgs>(args: A): Promise<${n}GetPayload<A>>;\n createMany(args: ${n}CreateManyArgs): Promise<{ count: number }>;\n createManyAndReturn<A extends ${n}CreateManyAndReturnArgs>(args: A): Promise<${n}GetPayload<A>[]>;\n update<A extends ${n}UpdateArgs>(args: A): Promise<${n}GetPayload<A>>;\n updateMany(args: ${n}UpdateManyArgs): Promise<{ count: number }>;\n upsert<A extends ${n}UpsertArgs>(args: A): Promise<${n}GetPayload<A>>;\n delete<A extends ${n}DeleteArgs>(args: A): Promise<${n}GetPayload<A>>;\n deleteMany(args?: ${n}DeleteManyArgs): Promise<{ count: number }>;\n count(args?: ${n}CountArgs): Promise<number>;\n aggregate(args?: ${n}AggregateArgs): Promise<Record<string, any>>;\n groupBy(args: ${n}GroupByArgs): Promise<Record<string, any>[]>;\n}`;\n }\n\n // ---- client class -------------------------------------------------------\n\n private clientClass(): string {\n const delegates = this.schema.models\n .map((m) => ` declare readonly ${lowerFirst(m.name)}: Prisma.${m.name}Delegate;`)\n .join(\"\\n\");\n return `export type EmberClientOptions = {\n datasourceUrl?: string;\n datasource?: ClientOptions[\"datasource\"];\n log?: ClientOptions[\"log\"];\n};\n\nexport class EmberClient extends EmberClientBase {\n constructor(options: EmberClientOptions = {}) {\n super({ schema: schemaDocument, ...options });\n }\n\n${delegates}\n}`;\n }\n}\n\nexport function generateClientSource(schema: SchemaDocument): string {\n return new ClientGenerator(schema).generate();\n}\n\n/** Generate and write the client to `<outDir>/index.ts`. Returns the path. */\nexport function writeClient(schema: SchemaDocument, outDir: string): string {\n const source = generateClientSource(schema);\n const file = resolve(outDir, \"index.ts\");\n mkdirSync(dirname(file), { recursive: true });\n writeFileSync(file, source, \"utf8\");\n return file;\n}\n\n// ---- static template fragments -------------------------------------------\n\n/**\n * Generic, recursive payload resolver shared by every model's GetPayload.\n * Resolves nested `select`/`include` narrowing to arbitrary depth using the\n * `$ScalarPayload` / `$RelationMap` registries emitted per schema.\n */\nconst PAYLOAD_RESOLVER = `type $Scalar<M extends $ModelName> = $ScalarPayload[M];\ntype $Relations<M extends $ModelName> = M extends keyof $RelationMap\n ? $RelationMap[M]\n : {};\n\n// A relation sub-arg may be \\`true\\` (full payload) or a nested args object.\ntype $NormalizeArgs<Sub> = Sub extends object ? Sub : {};\n\ntype $RelationResult<Info, Sub> = Info extends {\n model: infer RM extends $ModelName;\n isList: infer L;\n}\n ? L extends true\n ? $Payload<RM, $NormalizeArgs<Sub>>[]\n : Info extends { isNullable: true }\n ? $Payload<RM, $NormalizeArgs<Sub>> | null\n : $Payload<RM, $NormalizeArgs<Sub>>\n : never;\n\n// To-many relation keys of a model (eligible for _count).\ntype $ListRelations<M extends $ModelName> = {\n [K in keyof $Relations<M>]: $Relations<M>[K] extends { isList: true }\n ? K\n : never;\n}[keyof $Relations<M>];\n\ntype $CountResult<M extends $ModelName, C> = C extends { select: infer SC }\n ? { [K in keyof SC & $ListRelations<M>]: number }\n : { [K in $ListRelations<M> & string]: number };\n\ntype $CountPart<M extends $ModelName, A> = A extends { _count: infer C }\n ? { _count: $CountResult<M, C> }\n : {};\n\ntype $SelectResult<M extends $ModelName, S> = {\n [K in keyof S & keyof $Scalar<M>]: $Scalar<M>[K];\n} & {\n [K in keyof S & keyof $Relations<M>]: $RelationResult<$Relations<M>[K], S[K]>;\n} & $CountPart<M, S>;\n\ntype $IncludeResult<M extends $ModelName, I> = {\n [K in keyof I & keyof $Relations<M>]: $RelationResult<$Relations<M>[K], I[K]>;\n} & $CountPart<M, I>;\n\nexport type $Payload<M extends $ModelName, A> = A extends { select: infer S }\n ? $SelectResult<M, S>\n : A extends { include: infer I }\n ? $Scalar<M> & $IncludeResult<M, I>\n : $Scalar<M>;`;\n\nconst NUMERIC_SCALARS = new Set([\"Int\", \"BigInt\", \"Float\", \"Decimal\"]);\n\nconst FILTER_FOR_SCALAR: Record<string, string> = {\n String: \"StringFilter\",\n Int: \"IntFilter\",\n BigInt: \"BigIntFilter\",\n Float: \"FloatFilter\",\n Decimal: \"FloatFilter\",\n Boolean: \"BoolFilter\",\n DateTime: \"DateTimeFilter\",\n Bytes: \"BytesFilter\",\n Json: \"JsonFilter\",\n};\n\nconst SHARED_FILTERS = `export type StringFilter = {\n equals?: string;\n not?: string | StringFilter;\n in?: string[];\n notIn?: string[];\n lt?: string;\n lte?: string;\n gt?: string;\n gte?: string;\n contains?: string;\n startsWith?: string;\n endsWith?: string;\n mode?: QueryMode;\n};\n\nexport type IntFilter = {\n equals?: number;\n not?: number | IntFilter;\n in?: number[];\n notIn?: number[];\n lt?: number;\n lte?: number;\n gt?: number;\n gte?: number;\n};\n\nexport type FloatFilter = IntFilter;\nexport type BigIntFilter = {\n equals?: bigint;\n not?: bigint | BigIntFilter;\n in?: bigint[];\n notIn?: bigint[];\n lt?: bigint;\n lte?: bigint;\n gt?: bigint;\n gte?: bigint;\n};\n\nexport type BoolFilter = { equals?: boolean; not?: boolean };\n\nexport type DateTimeFilter = {\n equals?: Date;\n not?: Date | DateTimeFilter;\n in?: Date[];\n notIn?: Date[];\n lt?: Date;\n lte?: Date;\n gt?: Date;\n gte?: Date;\n};\n\nexport type BytesFilter = { equals?: Buffer; not?: Buffer };\n\n// Firebird has no JSON SQL functions: filters operate on the serialized text.\n// 'path' is accepted by the type but rejected at runtime on Firebird.\nexport type JsonFilter = {\n equals?: JsonValue;\n not?: JsonValue;\n string_contains?: string;\n string_starts_with?: string;\n string_ends_with?: string;\n path?: string[];\n};`;\n\nfunction isGeneratedOnCreate(field: FieldNode): boolean {\n return field.default?.function?.name === \"autoincrement\";\n}\n\nfunction isOptionalOnCreate(field: FieldNode): boolean {\n return !field.isRequired || !!field.default || field.isUpdatedAt || field.isList;\n}\n\nfunction indentBlock(text: string): string {\n return text\n .split(\"\\n\")\n .map((l) => (l ? \" \" + l : l))\n .join(\"\\n\");\n}\n","import {\n type FieldNode,\n type ScalarType,\n type SchemaDocument,\n} from \"@ember/ast\";\n\nconst SCALAR_TS: Record<ScalarType, string> = {\n String: \"string\",\n Boolean: \"boolean\",\n Int: \"number\",\n BigInt: \"bigint\",\n Float: \"number\",\n Decimal: \"number\",\n DateTime: \"Date\",\n Bytes: \"Buffer\",\n Json: \"JsonValue\",\n};\n\n/** TS type for a scalar/enum field value (without null/array decoration). */\nexport function baseTsType(field: FieldNode, schema: SchemaDocument): string {\n if (field.kind === \"enum\") return field.type;\n if (field.kind === \"object\") return field.type;\n return SCALAR_TS[field.type as ScalarType] ?? \"unknown\";\n}\n\n/** Full TS type for a field, including null and array decoration. */\nexport function fieldTsType(field: FieldNode, schema: SchemaDocument): string {\n const base = baseTsType(field, schema);\n if (field.isList) return `${base}[]`;\n return field.isRequired ? base : `${base} | null`;\n}\n\n/** TS type usable as a filter value for a scalar field. */\nexport function scalarFilterType(field: FieldNode): string {\n const base = SCALAR_TS[field.type as ScalarType] ?? \"unknown\";\n return base;\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { type SchemaDocument, modelTable } from \"@ember/ast\";\nimport type { SqlDriver } from \"@ember/driver\";\nimport { FirebirdDialect, type SqlDialect } from \"@ember/sql\";\nimport { Introspector } from \"@ember/introspect\";\nimport { diffSchemas, type SchemaDiff } from \"./diff\";\nimport { planMigration, renderMigrationSql, splitStatements } from \"./planner\";\nimport {\n HISTORY_TABLE,\n appliedMigrations,\n checksum,\n ensureHistoryTable,\n listLocalMigrations,\n recordMigration,\n} from \"./history\";\n\nexport { diffSchemas } from \"./diff\";\nexport { planMigration, renderMigrationSql, splitStatements } from \"./planner\";\nexport { FirebirdDdl } from \"./ddl\";\nexport {\n HISTORY_TABLE,\n listLocalMigrations,\n appliedMigrations,\n ensureHistoryTable,\n} from \"./history\";\n\nexport interface DevResult {\n empty: boolean;\n id?: string;\n dir?: string;\n statements: string[];\n}\n\nexport interface DeployResult {\n applied: { id: string; steps: number }[];\n}\n\nexport interface StatusResult {\n applied: string[];\n pending: string[];\n}\n\n/**\n * Drives schema migrations against a live Firebird database. Diffs the desired\n * `.ember` schema against the introspected current state and emits/applies DDL.\n * The history table `_EMBER_MIGRATIONS` is always excluded from the diff.\n */\nexport class Migrator {\n private readonly dialect: SqlDialect;\n\n constructor(\n private readonly driver: SqlDriver,\n private readonly desired: SchemaDocument,\n private readonly migrationsDir: string,\n dialect?: SqlDialect,\n ) {\n this.dialect = dialect ?? new FirebirdDialect();\n }\n\n /** Compute the diff between the desired schema and the live database. */\n async diff(): Promise<SchemaDiff> {\n const current = await this.currentSchema();\n return diffSchemas(this.desired, current);\n }\n\n /** Plan (but do not apply) the DDL needed to reach the desired schema. */\n async plan(): Promise<string[]> {\n const diff = await this.diff();\n return planMigration(diff, this.desired, this.dialect);\n }\n\n /**\n * `migrate dev`: create a timestamped migration from the current diff, apply\n * it, and record it in history.\n */\n async dev(name = \"migration\"): Promise<DevResult> {\n const statements = await this.plan();\n if (statements.length === 0) return { empty: true, statements: [] };\n\n const id = `${timestamp()}_${slug(name)}`;\n const dir = join(this.migrationsDir, id);\n const body = renderMigrationSql(statements);\n mkdirSync(dir, { recursive: true });\n writeFileSync(join(dir, \"migration.sql\"), body, \"utf8\");\n\n await this.driver.transaction(async (tx) => {\n await ensureHistoryTable(tx, this.dialect);\n for (const stmt of statements) await tx.query(stmt);\n await recordMigration(tx, this.dialect, {\n id,\n checksum: checksum(body),\n steps: statements.length,\n });\n });\n\n return { empty: false, id, dir, statements };\n }\n\n /**\n * `db push`: apply the diff directly to the database without writing a\n * migration file (prototyping flow).\n */\n async push(): Promise<{ statements: string[] }> {\n const statements = await this.plan();\n if (statements.length === 0) return { statements: [] };\n await this.driver.transaction(async (tx) => {\n for (const stmt of statements) await tx.query(stmt);\n });\n return { statements };\n }\n\n /** `migrate deploy`: apply every on-disk migration not yet recorded. */\n async deploy(): Promise<DeployResult> {\n const local = listLocalMigrations(this.migrationsDir);\n const applied: { id: string; steps: number }[] = [];\n\n const known = await this.driver.transaction(async (tx) => {\n await ensureHistoryTable(tx, this.dialect);\n return new Set((await appliedMigrations(tx, this.dialect)).map((m) => m.id));\n });\n\n for (const migration of local) {\n if (known.has(migration.id)) continue;\n const statements = splitStatements(migration.sql);\n await this.driver.transaction(async (tx) => {\n for (const stmt of statements) await tx.query(stmt);\n await recordMigration(tx, this.dialect, {\n id: migration.id,\n checksum: checksum(migration.sql),\n steps: statements.length,\n });\n });\n applied.push({ id: migration.id, steps: statements.length });\n }\n return { applied };\n }\n\n /** `migrate status`: list applied vs pending migrations. */\n async status(): Promise<StatusResult> {\n const local = listLocalMigrations(this.migrationsDir).map((m) => m.id);\n const applied = await this.driver.transaction(async (tx) => {\n await ensureHistoryTable(tx, this.dialect);\n return (await appliedMigrations(tx, this.dialect)).map((m) => m.id);\n });\n const appliedSet = new Set(applied);\n return {\n applied,\n pending: local.filter((id) => !appliedSet.has(id)),\n };\n }\n\n private async currentSchema(): Promise<SchemaDocument> {\n const introspector = new Introspector(this.driver);\n const current = await introspector.introspect();\n // Never diff the migration bookkeeping table.\n current.models = current.models.filter(\n (m) => modelTable(m) !== HISTORY_TABLE,\n );\n return current;\n }\n}\n\nfunction timestamp(): string {\n const d = new Date();\n const p = (n: number, w = 2) => String(n).padStart(w, \"0\");\n return (\n `${d.getUTCFullYear()}${p(d.getUTCMonth() + 1)}${p(d.getUTCDate())}` +\n `${p(d.getUTCHours())}${p(d.getUTCMinutes())}${p(d.getUTCSeconds())}`\n );\n}\n\nfunction slug(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, \"_\").replace(/^_|_$/g, \"\") || \"migration\";\n}\n","import {\n type FieldNode,\n type ModelNode,\n type NativeType,\n type SchemaDocument,\n fieldColumn,\n modelTable,\n relationFields,\n scalarFields,\n} from \"@ember/ast\";\n\nexport interface ColumnChange {\n field: FieldNode;\n table: string;\n typeChanged: boolean;\n nullabilityChanged: boolean;\n}\n\nexport interface UniqueSpec {\n name: string;\n columns: string[];\n}\n\nexport interface ForeignKeySpec {\n name: string;\n columns: string[];\n refTable: string;\n refColumns: string[];\n onDelete?: string;\n onUpdate?: string;\n}\n\nexport interface IndexSpec {\n name: string;\n columns: string[];\n unique: boolean;\n}\n\nexport interface ModelChange {\n model: ModelNode; // desired\n table: string;\n addedColumns: FieldNode[];\n droppedColumns: string[];\n changedColumns: ColumnChange[];\n addedUniques: UniqueSpec[];\n addedForeignKeys: ForeignKeySpec[];\n}\n\nexport interface SchemaDiff {\n createdModels: ModelNode[];\n droppedTables: string[];\n modelChanges: ModelChange[];\n}\n\n/**\n * Structural diff turning `current` (usually introspected from the live DB)\n * into `desired` (the `.ember` schema). Pure and dialect-independent; the\n * planner converts it to DDL.\n *\n * Scope (safe subset): create/drop tables, add/drop/alter columns, and add\n * unique/foreign-key constraints that don't already exist. Dropping\n * constraints and plain (non-constraint) indexes on existing tables is left to\n * explicit user action — see doc/migrations.md.\n */\nexport function diffSchemas(\n desired: SchemaDocument,\n current: SchemaDocument,\n): SchemaDiff {\n const currentByTable = new Map(\n current.models.map((m) => [modelTable(m), m]),\n );\n const desiredTables = new Set(desired.models.map((m) => modelTable(m)));\n\n const createdModels: ModelNode[] = [];\n const modelChanges: ModelChange[] = [];\n\n for (const model of desired.models) {\n const table = modelTable(model);\n const currentModel = currentByTable.get(table);\n if (!currentModel) {\n createdModels.push(model);\n continue;\n }\n const change = diffModel(desired, model, currentModel, table);\n if (hasModelChanges(change)) modelChanges.push(change);\n }\n\n const droppedTables = current.models\n .map((m) => modelTable(m))\n .filter((t) => !desiredTables.has(t));\n\n return { createdModels, droppedTables, modelChanges };\n}\n\nfunction diffModel(\n desired: SchemaDocument,\n model: ModelNode,\n current: ModelNode,\n table: string,\n): ModelChange {\n const desiredCols = new Map(\n scalarFields(model).map((f) => [fieldColumn(f), f]),\n );\n const currentCols = new Map(\n scalarFields(current).map((f) => [fieldColumn(f), f]),\n );\n\n const addedColumns: FieldNode[] = [];\n const changedColumns: ColumnChange[] = [];\n for (const [col, field] of desiredCols) {\n const existing = currentCols.get(col);\n if (!existing) {\n addedColumns.push(field);\n continue;\n }\n const typeChanged = !sameColumnType(field, existing);\n const nullabilityChanged = field.isRequired !== existing.isRequired;\n if (typeChanged || nullabilityChanged) {\n changedColumns.push({ field, table, typeChanged, nullabilityChanged });\n }\n }\n\n const droppedColumns = [...currentCols.keys()].filter(\n (c) => !desiredCols.has(c),\n );\n\n const currentUniqueSets = uniqueColumnSets(current).map(setKey);\n const addedUniques = uniqueColumnSets(model)\n .filter((cols) => !currentUniqueSets.includes(setKey(cols)))\n .map((cols) => ({ name: constraintName(\"UQ\", table, cols), columns: cols }));\n\n const currentFkSets = foreignKeys(desired, current).map(fkKey);\n const addedForeignKeys = foreignKeys(desired, model)\n .filter((fk) => !currentFkSets.includes(fkKey(fk)))\n .map((fk) => ({ ...fk, name: constraintName(\"FK\", table, fk.columns) }));\n\n return {\n model,\n table,\n addedColumns,\n droppedColumns,\n changedColumns,\n addedUniques,\n addedForeignKeys,\n };\n}\n\nfunction hasModelChanges(c: ModelChange): boolean {\n return (\n c.addedColumns.length > 0 ||\n c.droppedColumns.length > 0 ||\n c.changedColumns.length > 0 ||\n c.addedUniques.length > 0 ||\n c.addedForeignKeys.length > 0\n );\n}\n\n// ---- extractors -----------------------------------------------------------\n\n/** Unique column-sets from single @unique fields and composite @@unique. */\nexport function uniqueColumnSets(model: ModelNode): string[][] {\n const sets: string[][] = [];\n for (const f of scalarFields(model)) {\n if (f.isUnique) sets.push([fieldColumn(f)]);\n }\n for (const u of model.uniqueIndexes) {\n sets.push(u.fields.map((name) => columnFor(model, name)));\n }\n return sets;\n}\n\nexport function indexSpecs(model: ModelNode): IndexSpec[] {\n return model.indexes.map((i) => ({\n name: i.name ?? constraintName(\"IDX\", modelTable(model), i.fields.map((n) => columnFor(model, n))),\n columns: i.fields.map((name) => columnFor(model, name)),\n unique: i.unique,\n }));\n}\n\n/** Owning-side foreign keys declared on this model. */\nexport function foreignKeys(\n schema: SchemaDocument,\n model: ModelNode,\n): Omit<ForeignKeySpec, \"name\">[] {\n const out: Omit<ForeignKeySpec, \"name\">[] = [];\n for (const f of relationFields(model)) {\n const rel = f.relation;\n if (!rel?.fields?.length) continue;\n const refModel = schema.models.find((m) => m.name === f.type);\n if (!refModel) continue;\n out.push({\n columns: rel.fields.map((name) => columnFor(model, name)),\n refTable: modelTable(refModel),\n refColumns: (rel.references ?? []).map((name) => columnFor(refModel, name)),\n onDelete: rel.onDelete,\n onUpdate: rel.onUpdate,\n });\n }\n return out;\n}\n\nfunction columnFor(model: ModelNode, fieldName: string): string {\n const f = model.fields.find((x) => x.name === fieldName);\n return f ? fieldColumn(f) : fieldName.toUpperCase();\n}\n\n// ---- comparison helpers ---------------------------------------------------\n\nfunction sameColumnType(a: FieldNode, b: FieldNode): boolean {\n if (a.type !== b.type) return false;\n return sameNative(a.nativeType, b.nativeType);\n}\n\nfunction sameNative(a?: NativeType, b?: NativeType): boolean {\n if (!a && !b) return true;\n if (!a || !b) return true; // one side unspecified: treat as compatible\n return a.name === b.name && a.args.join(\",\") === b.args.join(\",\");\n}\n\nfunction setKey(cols: string[]): string {\n return [...cols].sort().join(\",\");\n}\n\nfunction fkKey(fk: Omit<ForeignKeySpec, \"name\">): string {\n return `${setKey(fk.columns)}->${fk.refTable}(${setKey(fk.refColumns)})`;\n}\n\n/** Deterministic, length-capped constraint/index name. */\nexport function constraintName(\n prefix: string,\n table: string,\n columns: string[],\n): string {\n const base = `${prefix}_${table}_${columns.join(\"_\")}`.replace(/[^A-Za-z0-9_]/g, \"_\");\n if (base.length <= 31) return base;\n // Cap to Firebird's classic 31-char identifier limit with a stable hash.\n let hash = 0;\n for (let i = 0; i < base.length; i++) hash = (hash * 31 + base.charCodeAt(i)) | 0;\n const suffix = Math.abs(hash).toString(36).slice(0, 6);\n return `${base.slice(0, 24)}_${suffix}`;\n}\n","import {\n type DefaultValue,\n type FieldNode,\n type ModelNode,\n type ScalarType,\n fieldColumn,\n idFields,\n modelTable,\n scalarFields,\n} from \"@ember/ast\";\nimport { type SqlDialect } from \"@ember/sql\";\n\n/**\n * Generates Firebird DDL from schema nodes. Pure string generation (no I/O),\n * so it is fully unit-testable. Identifier quoting is delegated to the dialect\n * (Strategy) to stay backend-agnostic at the call sites.\n */\nexport class FirebirdDdl {\n constructor(private readonly d: SqlDialect) {}\n\n // ---- column types -------------------------------------------------------\n\n /** Firebird column type for a field, honoring its `@db.*` native type. */\n columnType(field: FieldNode): string {\n const native = field.nativeType;\n if (native) {\n const args = native.args.length ? `(${native.args.join(\", \")})` : \"\";\n switch (native.name) {\n case \"VarChar\":\n return `VARCHAR${args || \"(255)\"}`;\n case \"Char\":\n return `CHAR${args || \"(1)\"}`;\n case \"Text\":\n return \"BLOB SUB_TYPE TEXT\";\n case \"SmallInt\":\n return \"SMALLINT\";\n case \"Integer\":\n return \"INTEGER\";\n case \"BigInt\":\n return \"BIGINT\";\n case \"Float\":\n return \"FLOAT\";\n case \"DoublePrecision\":\n return \"DOUBLE PRECISION\";\n case \"Decimal\":\n return `DECIMAL${args || \"(18, 4)\"}`;\n case \"Boolean\":\n return this.d.booleanColumnType();\n case \"Date\":\n return \"DATE\";\n case \"Time\":\n return \"TIME\";\n case \"Timestamp\":\n return \"TIMESTAMP\";\n case \"Blob\":\n return \"BLOB SUB_TYPE BINARY\";\n }\n }\n if (field.type === \"Boolean\") return this.d.booleanColumnType();\n return DEFAULT_DDL_TYPE[field.type as ScalarType] ?? \"VARCHAR(255)\";\n }\n\n /** `\"COL\" <type> [GENERATED ...] [DEFAULT ...] [NOT NULL]`. */\n columnDefinition(field: FieldNode): string {\n const parts = [this.d.quoteId(fieldColumn(field)), this.columnType(field)];\n if (isIdentity(field) && this.d.supportsIdentity) {\n parts.push(\"GENERATED BY DEFAULT AS IDENTITY\");\n } else if (!isIdentity(field)) {\n const def = defaultClause(field.default);\n if (def) parts.push(def);\n }\n if (field.isRequired) parts.push(\"NOT NULL\");\n return parts.join(\" \");\n }\n\n /**\n * On Firebird 2.1/2.5 (no IDENTITY), emulate autoincrement with a SEQUENCE\n * and a BEFORE INSERT trigger. Returns the extra DDL objects to create after\n * the table; an empty array when IDENTITY is supported.\n */\n autoIncrementObjects(model: ModelNode): string[] {\n if (this.d.supportsIdentity) return [];\n const table = modelTable(model);\n const out: string[] = [];\n for (const field of scalarFields(model)) {\n if (isIdentity(field)) {\n out.push(...this.autoIncrementForColumn(table, fieldColumn(field)));\n }\n }\n return out;\n }\n\n autoIncrementForColumn(table: string, column: string): string[] {\n if (this.d.supportsIdentity) return [];\n const seq = capName(`GEN_${table}_${column}`);\n const trig = capName(`${table}_BI_${column}`);\n const qTable = this.d.quoteId(table);\n const qCol = this.d.quoteId(column);\n const qSeq = this.d.quoteId(seq);\n return [\n `CREATE SEQUENCE ${qSeq}`,\n `CREATE TRIGGER ${this.d.quoteId(trig)} FOR ${qTable} ACTIVE BEFORE INSERT POSITION 0 AS\\n` +\n `BEGIN\\n` +\n ` IF (NEW.${qCol} IS NULL) THEN NEW.${qCol} = GEN_ID(${qSeq}, 1);\\n` +\n `END`,\n ];\n }\n\n // ---- table-level --------------------------------------------------------\n\n createTable(model: ModelNode): string {\n const cols = scalarFields(model).map((f) => \" \" + this.columnDefinition(f));\n const pk = idFields(model);\n const lines = [...cols];\n if (pk.length > 0) {\n lines.push(\n ` PRIMARY KEY (${pk.map((f) => this.d.quoteId(fieldColumn(f))).join(\", \")})`,\n );\n }\n return `CREATE TABLE ${this.d.quoteId(modelTable(model))} (\\n${lines.join(\",\\n\")}\\n)`;\n }\n\n dropTable(table: string): string {\n return `DROP TABLE ${this.d.quoteId(table)}`;\n }\n\n addColumn(table: string, field: FieldNode): string {\n return `ALTER TABLE ${this.d.quoteId(table)} ADD ${this.columnDefinition(field)}`;\n }\n\n dropColumn(table: string, column: string): string {\n return `ALTER TABLE ${this.d.quoteId(table)} DROP ${this.d.quoteId(column)}`;\n }\n\n /** Change a column's data type (Firebird: ALTER COLUMN ... TYPE ...). */\n alterColumnType(table: string, field: FieldNode): string {\n return `ALTER TABLE ${this.d.quoteId(table)} ALTER COLUMN ${this.d.quoteId(\n fieldColumn(field),\n )} TYPE ${this.columnType(field)}`;\n }\n\n setNotNull(table: string, column: string, notNull: boolean): string {\n const action = notNull ? \"SET NOT NULL\" : \"DROP NOT NULL\";\n return `ALTER TABLE ${this.d.quoteId(table)} ALTER COLUMN ${this.d.quoteId(\n column,\n )} ${action}`;\n }\n\n // ---- constraints & indexes ---------------------------------------------\n\n addUnique(table: string, name: string, columns: string[]): string {\n return `ALTER TABLE ${this.d.quoteId(table)} ADD CONSTRAINT ${this.d.quoteId(\n name,\n )} UNIQUE (${columns.map((c) => this.d.quoteId(c)).join(\", \")})`;\n }\n\n dropConstraint(table: string, name: string): string {\n return `ALTER TABLE ${this.d.quoteId(table)} DROP CONSTRAINT ${this.d.quoteId(name)}`;\n }\n\n addForeignKey(\n table: string,\n name: string,\n columns: string[],\n refTable: string,\n refColumns: string[],\n onDelete?: string,\n onUpdate?: string,\n ): string {\n let sql = `ALTER TABLE ${this.d.quoteId(table)} ADD CONSTRAINT ${this.d.quoteId(\n name,\n )} FOREIGN KEY (${columns.map((c) => this.d.quoteId(c)).join(\", \")}) REFERENCES ${this.d.quoteId(\n refTable,\n )} (${refColumns.map((c) => this.d.quoteId(c)).join(\", \")})`;\n if (onUpdate) sql += ` ON UPDATE ${referentialSql(onUpdate)}`;\n if (onDelete) sql += ` ON DELETE ${referentialSql(onDelete)}`;\n return sql;\n }\n\n createIndex(\n table: string,\n name: string,\n columns: string[],\n unique: boolean,\n ): string {\n return `CREATE ${unique ? \"UNIQUE \" : \"\"}INDEX ${this.d.quoteId(name)} ON ${this.d.quoteId(\n table,\n )} (${columns.map((c) => this.d.quoteId(c)).join(\", \")})`;\n }\n\n dropIndex(name: string): string {\n return `DROP INDEX ${this.d.quoteId(name)}`;\n }\n}\n\n// ---- helpers --------------------------------------------------------------\n\nconst DEFAULT_DDL_TYPE: Record<ScalarType, string> = {\n String: \"VARCHAR(255)\",\n Boolean: \"BOOLEAN\",\n Int: \"INTEGER\",\n BigInt: \"BIGINT\",\n Float: \"DOUBLE PRECISION\",\n Decimal: \"DECIMAL(18, 4)\",\n DateTime: \"TIMESTAMP\",\n Bytes: \"BLOB SUB_TYPE BINARY\",\n Json: \"BLOB SUB_TYPE TEXT\",\n};\n\nexport function isIdentity(field: FieldNode): boolean {\n return field.default?.function?.name === \"autoincrement\";\n}\n\n/** Cap an identifier to Firebird's classic 31-char limit with a stable hash. */\nfunction capName(name: string): string {\n const safe = name.replace(/[^A-Za-z0-9_]/g, \"_\");\n if (safe.length <= 31) return safe;\n let hash = 0;\n for (let i = 0; i < safe.length; i++) hash = (hash * 31 + safe.charCodeAt(i)) | 0;\n return `${safe.slice(0, 24)}_${Math.abs(hash).toString(36).slice(0, 6)}`;\n}\n\nfunction defaultClause(def: DefaultValue | undefined): string | null {\n if (!def) return null;\n if (def.function) {\n switch (def.function.name) {\n case \"now\":\n return \"DEFAULT CURRENT_TIMESTAMP\";\n case \"uuid\":\n case \"cuid\":\n return null; // generated app-side\n default:\n return null;\n }\n }\n if (def.literal === undefined) return null;\n if (typeof def.literal === \"boolean\") {\n return `DEFAULT ${def.literal ? \"TRUE\" : \"FALSE\"}`;\n }\n if (typeof def.literal === \"number\") return `DEFAULT ${def.literal}`;\n return `DEFAULT '${String(def.literal).replace(/'/g, \"''\")}'`;\n}\n\nfunction referentialSql(action: string): string {\n switch (action) {\n case \"Cascade\":\n return \"CASCADE\";\n case \"SetNull\":\n return \"SET NULL\";\n case \"SetDefault\":\n return \"SET DEFAULT\";\n case \"NoAction\":\n return \"NO ACTION\";\n case \"Restrict\":\n return \"NO ACTION\"; // Firebird has no RESTRICT; NO ACTION is closest\n default:\n return \"NO ACTION\";\n }\n}\n","import { type SqlDialect } from \"@ember/sql\";\nimport { type SchemaDocument, fieldColumn, modelTable } from \"@ember/ast\";\nimport { FirebirdDdl, isIdentity } from \"./ddl\";\nimport {\n type SchemaDiff,\n constraintName,\n foreignKeys,\n indexSpecs,\n uniqueColumnSets,\n} from \"./diff\";\n\n/**\n * Convert a SchemaDiff into an ordered list of DDL statements. Order matters in\n * Firebird: tables and columns must exist before constraints reference them, so\n * foreign keys are always emitted last.\n */\nexport function planMigration(\n diff: SchemaDiff,\n desired: SchemaDocument,\n dialect: SqlDialect,\n): string[] {\n const ddl = new FirebirdDdl(dialect);\n const drops: string[] = [];\n const creates: string[] = [];\n const alters: string[] = [];\n const constraints: string[] = [];\n const indexes: string[] = [];\n const foreignKeyStmts: string[] = [];\n\n // 1. Drops (columns then tables).\n for (const change of diff.modelChanges) {\n for (const col of change.droppedColumns) {\n drops.push(ddl.dropColumn(change.table, col));\n }\n }\n for (const table of diff.droppedTables) {\n drops.push(ddl.dropTable(table));\n }\n\n // 2. Create tables (no FKs yet) + their uniques/indexes/FKs.\n for (const model of diff.createdModels) {\n const table = modelTable(model);\n creates.push(ddl.createTable(model));\n // Firebird 2.1/2.5: sequence + BEFORE INSERT trigger for autoincrement.\n creates.push(...ddl.autoIncrementObjects(model));\n for (const cols of uniqueColumnSets(model)) {\n // Single-column @unique already implies a unique index; skip to avoid\n // a redundant constraint. Composite @@unique becomes a constraint.\n if (cols.length === 1) continue;\n constraints.push(\n ddl.addUnique(table, constraintName(\"UQ\", table, cols), cols),\n );\n }\n for (const idx of indexSpecs(model)) {\n indexes.push(ddl.createIndex(table, idx.name, idx.columns, idx.unique));\n }\n for (const fk of foreignKeys(desired, model)) {\n foreignKeyStmts.push(\n ddl.addForeignKey(\n table,\n constraintName(\"FK\", table, fk.columns),\n fk.columns,\n fk.refTable,\n fk.refColumns,\n fk.onDelete,\n fk.onUpdate,\n ),\n );\n }\n }\n\n // 3. Existing-table changes.\n for (const change of diff.modelChanges) {\n for (const field of change.addedColumns) {\n alters.push(ddl.addColumn(change.table, field));\n if (isIdentity(field)) {\n creates.push(\n ...ddl.autoIncrementForColumn(change.table, fieldColumn(field)),\n );\n }\n }\n for (const cc of change.changedColumns) {\n if (cc.typeChanged) alters.push(ddl.alterColumnType(cc.table, cc.field));\n if (cc.nullabilityChanged) {\n alters.push(\n ddl.setNotNull(cc.table, columnName(cc), cc.field.isRequired),\n );\n }\n }\n for (const uq of change.addedUniques) {\n if (uq.columns.length === 1) {\n // single-column unique: a constraint is fine and idempotent-checked\n constraints.push(ddl.addUnique(change.table, uq.name, uq.columns));\n } else {\n constraints.push(ddl.addUnique(change.table, uq.name, uq.columns));\n }\n }\n for (const fk of change.addedForeignKeys) {\n foreignKeyStmts.push(\n ddl.addForeignKey(\n change.table,\n fk.name,\n fk.columns,\n fk.refTable,\n fk.refColumns,\n fk.onDelete,\n fk.onUpdate,\n ),\n );\n }\n }\n\n return [\n ...drops,\n ...creates,\n ...alters,\n ...constraints,\n ...indexes,\n ...foreignKeyStmts,\n ];\n}\n\n/**\n * Statements are separated by an explicit breakpoint line rather than `;`, so\n * PSQL bodies (triggers/procedures) that contain internal semicolons survive a\n * round-trip through the `.sql` file.\n */\nconst BREAKPOINT = \"--> statement-breakpoint\";\n\n/** Render DDL statements as a `.sql` migration file body. */\nexport function renderMigrationSql(statements: string[]): string {\n if (statements.length === 0) return \"-- This migration is empty.\\n\";\n return statements.join(`\\n${BREAKPOINT}\\n`) + \"\\n\";\n}\n\n/** Split a migration `.sql` body back into executable statements. */\nexport function splitStatements(sql: string): string[] {\n return sql\n .split(BREAKPOINT)\n .map((s) => stripComments(s).trim().replace(/;\\s*$/, \"\").trim())\n .filter((s) => s.length > 0);\n}\n\nfunction stripComments(sql: string): string {\n return sql\n .split(\"\\n\")\n .filter((line) => !line.trim().startsWith(\"--\"))\n .join(\"\\n\");\n}\n\nfunction columnName(cc: { field: { dbName?: string; name: string } }): string {\n return cc.field.dbName ?? cc.field.name.toUpperCase();\n}\n","import { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { TransactionContext } from \"@ember/driver\";\nimport { type SqlDialect } from \"@ember/sql\";\n\nexport const HISTORY_TABLE = \"_EMBER_MIGRATIONS\";\n\nexport interface AppliedMigration {\n id: string;\n checksum: string;\n steps: number;\n}\n\nexport interface LocalMigration {\n id: string;\n dir: string;\n sql: string;\n}\n\n/** Create the migration-history table if it does not exist yet. */\nexport async function ensureHistoryTable(\n tx: TransactionContext,\n dialect: SqlDialect,\n): Promise<void> {\n const exists = await tx.query<{ N: number }>(\n `SELECT COUNT(*) AS N FROM RDB$RELATIONS WHERE RDB$RELATION_NAME = ?`,\n [HISTORY_TABLE],\n );\n if (Number(exists[0]?.N ?? 0) > 0) return;\n\n const t = dialect.quoteId(HISTORY_TABLE);\n await tx.query(\n `CREATE TABLE ${t} (\n ${dialect.quoteId(\"ID\")} VARCHAR(128) NOT NULL PRIMARY KEY,\n ${dialect.quoteId(\"CHECKSUM\")} VARCHAR(64),\n ${dialect.quoteId(\"STEPS\")} INTEGER,\n ${dialect.quoteId(\"APPLIED_AT\")} TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n )`,\n );\n}\n\nexport async function appliedMigrations(\n tx: TransactionContext,\n dialect: SqlDialect,\n): Promise<AppliedMigration[]> {\n const t = dialect.quoteId(HISTORY_TABLE);\n const rows = await tx.query<Record<string, unknown>>(\n `SELECT ${dialect.quoteId(\"ID\")} AS \"id\", ${dialect.quoteId(\"CHECKSUM\")} AS \"checksum\", ${dialect.quoteId(\"STEPS\")} AS \"steps\" FROM ${t} ORDER BY ${dialect.quoteId(\"ID\")}`,\n );\n return rows.map((r) => ({\n id: String(r.id).trim(),\n checksum: r.checksum == null ? \"\" : String(r.checksum).trim(),\n steps: Number(r.steps ?? 0),\n }));\n}\n\nexport async function recordMigration(\n tx: TransactionContext,\n dialect: SqlDialect,\n migration: { id: string; checksum: string; steps: number },\n): Promise<void> {\n const t = dialect.quoteId(HISTORY_TABLE);\n await tx.query(\n `INSERT INTO ${t} (${dialect.quoteId(\"ID\")}, ${dialect.quoteId(\"CHECKSUM\")}, ${dialect.quoteId(\"STEPS\")}) VALUES (?, ?, ?)`,\n [migration.id, migration.checksum, migration.steps],\n );\n}\n\n/** Read migration folders (sorted) from `<migrationsDir>`. */\nexport function listLocalMigrations(migrationsDir: string): LocalMigration[] {\n if (!existsSync(migrationsDir)) return [];\n return readdirSync(migrationsDir, { withFileTypes: true })\n .filter((e) => e.isDirectory())\n .map((e) => e.name)\n .sort()\n .map((id) => {\n const dir = join(migrationsDir, id);\n const file = join(dir, \"migration.sql\");\n return {\n id,\n dir,\n sql: existsSync(file) ? readFileSync(file, \"utf8\") : \"\",\n };\n })\n .filter((m) => m.sql.length > 0);\n}\n\n/** FNV-1a checksum of a migration body. */\nexport function checksum(sql: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < sql.length; i++) {\n h ^= sql.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return (h >>> 0).toString(16).padStart(8, \"0\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;ACoBO,IAAM,eAAsC;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAmHO,SAAS,cAA8B;AAC5C,SAAO,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AACjD;AAEO,SAAS,UACd,QACA,MACuB;AACvB,SAAO,OAAO,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAClD;AAEO,SAAS,SACd,QACA,MACsB;AACtB,SAAO,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACjD;AAQO,SAAS,YAAY,OAA0B;AACpD,SAAO,MAAM,UAAU,MAAM,KAAK,YAAY;AAChD;AAGO,SAAS,WAAW,OAA0B;AACnD,SAAO,MAAM,UAAU,MAAM,KAAK,YAAY;AAChD;AAGO,SAAS,aAAa,OAA+B;AAC1D,SAAO,MAAM,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ;AACvD;AAGO,SAAS,eAAe,OAA+B;AAC5D,SAAO,MAAM,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ;AACvD;AAEO,SAAS,SAAS,OAA+B;AACtD,MAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,WAAO,MAAM,WACV,IAAI,CAAC,MAAM,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EACjD,OAAO,CAAC,MAAsB,CAAC,CAAC,CAAC;AAAA,EACtC;AACA,SAAO,MAAM,OAAO,OAAO,CAAC,MAAM,EAAE,IAAI;AAC1C;;;ACnMA,qBAAyC;AACzC,uBAAiC;;;ACA1B,IAAM,aAAN,cAAyB,MAAM;AAAA,EACpC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO,WAAW;AACvB,WAAO,eAAe,MAAM,WAAW,SAAS;AAAA,EAClD;AACF;AAGO,IAAM,mBAAN,cAA+B,WAAW;AAAA,EAC/C,YACE,SACgB,MACA,QACA,MAChB;AACA;AAAA,MACE,GAAG,OAAO,QAAQ,OAAO,GAAG,IAAI,MAAM,EAAE,GAAG,IAAI,IAAI,MAAM;AAAA,IAC3D;AANgB;AACA;AACA;AAAA,EAKlB;AAAA,EAPkB;AAAA,EACA;AAAA,EACA;AAMpB;AAGO,IAAM,wBAAN,cAAoC,WAAW;AAAA,EACpD,YACE,SACgB,UAAoB,CAAC,GACrC;AACA;AAAA,MACE,QAAQ,SAAS,IAAI,GAAG,OAAO;AAAA,KAAQ,QAAQ,KAAK,OAAO,CAAC,KAAK;AAAA,IACnE;AAJgB;AAAA,EAKlB;AAAA,EALkB;AAMpB;AAGO,IAAM,uBAAN,cAAmC,WAAW;AAAC;AAG/C,IAAM,gBAAN,cAA4B,WAAW;AAAA,EAC5C,YACE,SACyB,OACT,KAChB;AACA,UAAM,OAAO;AAHY;AACT;AAAA,EAGlB;AAAA,EAJ2B;AAAA,EACT;AAIpB;AAGO,IAAM,sBAAN,cAAkC,WAAW;AAAA,EAClD,YAAY,OAAe;AACzB,UAAM,OAAO,KAAK,6CAA6C;AAAA,EACjE;AACF;AAGO,IAAM,wBAAN,cAAoC,WAAW;AAAA,EACpD,YACkB,QAChB,OACA;AACA,UAAM,gCAAgC,MAAM,EAAE;AAH9B;AAIhB,QAAI,UAAU,OAAW,MAAK,QAAQ;AAAA,EACxC;AAAA,EALkB;AAMpB;;;ACpCA,IAAM,qBAAgD;AAAA,EACpD,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAEA,IAAM,cAAc;AACpB,IAAM,aAAa;AAOZ,IAAM,QAAN,MAAY;AAAA,EAKjB,YACmB,QACA,MACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EANX,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EAOjB,WAAoB;AAClB,UAAM,SAAkB,CAAC;AACzB,QAAI,QAAQ,KAAK,KAAK;AACtB,WAAO,MAAM,SAAS,OAAO;AAC3B,aAAO,KAAK,KAAK;AACjB,cAAQ,KAAK,KAAK;AAAA,IACpB;AACA,WAAO,KAAK,KAAK;AACjB,WAAO;AAAA,EACT;AAAA,EAEQ,OAAc;AACpB,SAAK,0BAA0B;AAC/B,QAAI,KAAK,OAAO,KAAK,OAAO,QAAQ;AAClC,aAAO,KAAK,KAAK,OAAO,EAAE;AAAA,IAC5B;AAEA,UAAM,YAAY,KAAK;AACvB,UAAM,cAAc,KAAK;AACzB,UAAM,KAAK,KAAK,OAAO,KAAK,GAAG;AAG/B,QAAI,OAAO,OAAO,KAAK,KAAK,CAAC,MAAM,OAAO,KAAK,KAAK,CAAC,MAAM,KAAK;AAC9D,aAAO,KAAK,eAAe,WAAW,WAAW;AAAA,IACnD;AAEA,QAAI,OAAO,KAAK;AACd,aAAO,KAAK,WAAW,WAAW,WAAW;AAAA,IAC/C;AAEA,QAAI,OAAO,KAAK;AACd,WAAK,QAAQ;AACb,UAAI,KAAK,OAAO,KAAK,GAAG,MAAM,KAAK;AACjC,aAAK,QAAQ;AACb,eAAO,EAAE,MAAM,aAAa,OAAO,MAAM,MAAM,WAAW,QAAQ,YAAY;AAAA,MAChF;AACA,aAAO,EAAE,MAAM,MAAM,OAAO,KAAK,MAAM,WAAW,QAAQ,YAAY;AAAA,IACxE;AAEA,UAAM,SAAS,mBAAmB,EAAE;AACpC,QAAI,QAAQ;AACV,WAAK,QAAQ;AACb,aAAO,EAAE,MAAM,QAAQ,OAAO,IAAI,MAAM,WAAW,QAAQ,YAAY;AAAA,IACzE;AAEA,QAAI,OAAO,OAAO,QAAQ,KAAK,EAAE,GAAG;AAClC,aAAO,KAAK,WAAW,WAAW,WAAW;AAAA,IAC/C;AAEA,QAAI,YAAY,KAAK,EAAE,GAAG;AACxB,aAAO,KAAK,eAAe,WAAW,WAAW;AAAA,IACnD;AAEA,UAAM,IAAI;AAAA,MACR,yBAAyB,EAAE;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEQ,eAAe,MAAc,QAAuB;AAC1D,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,QAAI,QAAQ;AACZ,WAAO,KAAK,MAAM,KAAK,OAAO,UAAU,KAAK,OAAO,KAAK,GAAG,MAAM,MAAM;AACtE,eAAS,KAAK,OAAO,KAAK,GAAG;AAC7B,WAAK,QAAQ;AAAA,IACf;AACA,WAAO,EAAE,MAAM,eAAe,OAAO,MAAM,KAAK,GAAG,MAAM,OAAO;AAAA,EAClE;AAAA,EAEQ,WAAW,MAAc,QAAuB;AACtD,SAAK,QAAQ;AACb,QAAI,QAAQ;AACZ,WAAO,KAAK,MAAM,KAAK,OAAO,UAAU,KAAK,OAAO,KAAK,GAAG,MAAM,KAAK;AACrE,YAAM,IAAI,KAAK,OAAO,KAAK,GAAG;AAC9B,UAAI,MAAM,MAAM;AACd,aAAK,QAAQ;AACb,cAAM,UAAU,KAAK,OAAO,KAAK,GAAG;AACpC,YAAI,YAAY,OAAW;AAC3B,iBAAS,WAAW,OAAO;AAC3B,aAAK,QAAQ;AACb;AAAA,MACF;AACA,UAAI,MAAM,MAAM;AACd,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,UACA,KAAK;AAAA,QACP;AAAA,MACF;AACA,eAAS;AACT,WAAK,QAAQ;AAAA,IACf;AACA,QAAI,KAAK,OAAO,KAAK,GAAG,MAAM,KAAK;AACjC,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK;AAAA,MACP;AAAA,IACF;AACA,SAAK,QAAQ;AACb,WAAO,EAAE,MAAM,UAAU,OAAO,MAAM,OAAO;AAAA,EAC/C;AAAA,EAEQ,WAAW,MAAc,QAAuB;AACtD,QAAI,QAAQ;AACZ,QAAI,KAAK,OAAO,KAAK,GAAG,MAAM,KAAK;AACjC,eAAS;AACT,WAAK,QAAQ;AAAA,IACf;AACA,WACE,KAAK,MAAM,KAAK,OAAO,UACvB,SAAS,KAAK,KAAK,OAAO,KAAK,GAAG,CAAE,GACpC;AACA,eAAS,KAAK,OAAO,KAAK,GAAG;AAC7B,WAAK,QAAQ;AAAA,IACf;AACA,WAAO,EAAE,MAAM,UAAU,OAAO,MAAM,OAAO;AAAA,EAC/C;AAAA,EAEQ,eAAe,MAAc,QAAuB;AAC1D,QAAI,QAAQ;AACZ,WACE,KAAK,MAAM,KAAK,OAAO,UACvB,WAAW,KAAK,KAAK,OAAO,KAAK,GAAG,CAAE,GACtC;AACA,eAAS,KAAK,OAAO,KAAK,GAAG;AAC7B,WAAK,QAAQ;AAAA,IACf;AACA,WAAO,EAAE,MAAM,cAAc,OAAO,MAAM,OAAO;AAAA,EACnD;AAAA,EAEQ,4BAAkC;AACxC,WAAO,KAAK,MAAM,KAAK,OAAO,QAAQ;AACpC,YAAM,KAAK,KAAK,OAAO,KAAK,GAAG;AAC/B,UAAI,OAAO,OAAO,OAAO,OAAQ,OAAO,QAAQ,OAAO,MAAM;AAC3D,aAAK,QAAQ;AACb;AAAA,MACF;AAEA,UAAI,OAAO,OAAO,KAAK,KAAK,CAAC,MAAM,OAAO,KAAK,KAAK,CAAC,MAAM,KAAK;AAC9D,eAAO,KAAK,MAAM,KAAK,OAAO,UAAU,KAAK,OAAO,KAAK,GAAG,MAAM,MAAM;AACtE,eAAK,QAAQ;AAAA,QACf;AACA;AAAA,MACF;AACA,UAAI,OAAO,OAAO,KAAK,KAAK,CAAC,MAAM,KAAK;AACtC,aAAK,QAAQ;AACb,aAAK,QAAQ;AACb,eACE,KAAK,MAAM,KAAK,OAAO,UACvB,EAAE,KAAK,OAAO,KAAK,GAAG,MAAM,OAAO,KAAK,KAAK,CAAC,MAAM,MACpD;AACA,eAAK,QAAQ;AAAA,QACf;AACA,aAAK,QAAQ;AACb,aAAK,QAAQ;AACb;AAAA,MACF;AACA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,KAAK,QAAoC;AAC/C,WAAO,KAAK,OAAO,KAAK,MAAM,MAAM;AAAA,EACtC;AAAA,EAEQ,UAAgB;AACtB,QAAI,KAAK,OAAO,KAAK,GAAG,MAAM,MAAM;AAClC,WAAK;AACL,WAAK,SAAS;AAAA,IAChB,OAAO;AACL,WAAK;AAAA,IACP;AACA,SAAK;AAAA,EACP;AAAA,EAEQ,KAAK,MAAiB,OAAsB;AAClD,WAAO,EAAE,MAAM,OAAO,MAAM,KAAK,MAAM,QAAQ,KAAK,OAAO;AAAA,EAC7D;AACF;AAEA,SAAS,WAAW,GAAmB;AACrC,UAAQ,GAAG;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;AC3OO,IAAM,SAAN,MAAa;AAAA,EAIlB,YACE,QACiB,MACjB;AADiB;AAEjB,SAAK,SAAS,IAAI,MAAM,QAAQ,IAAI,EAAE,SAAS;AAAA,EACjD;AAAA,EAHmB;AAAA,EALX;AAAA,EACA,MAAM;AAAA,EASd,QAAwB;AACtB,UAAM,MAAsB,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,EAAE;AACpE,QAAI,aAAuB,CAAC;AAE5B,WAAO,CAAC,KAAK,MAAM,GAAG;AACpB,YAAM,MAAM,KAAK,KAAK;AACtB,UAAI,IAAI,SAAS,eAAe;AAC9B,mBAAW,KAAK,IAAI,KAAK;AACzB,aAAK,QAAQ;AACb;AAAA,MACF;AACA,UAAI,IAAI,SAAS,cAAc;AAC7B,cAAM,KAAK,MAAM,qBAAqB,IAAI,KAAK,KAAK,GAAG;AAAA,MACzD;AACA,YAAM,gBAAgB,WAAW,SAC7B,WAAW,KAAK,IAAI,IACpB;AACJ,mBAAa,CAAC;AAEd,cAAQ,IAAI,OAAO;AAAA,QACjB,KAAK;AACH,cAAI,aAAa,KAAK,gBAAgB;AACtC;AAAA,QACF,KAAK;AACH,cAAI,WAAW,KAAK,KAAK,eAAe,CAAC;AACzC;AAAA,QACF,KAAK;AACH,cAAI,OAAO,KAAK,KAAK,WAAW,aAAa,CAAC;AAC9C;AAAA,QACF,KAAK;AACH,cAAI,MAAM,KAAK,KAAK,UAAU,aAAa,CAAC;AAC5C;AAAA,QACF;AACE,gBAAM,KAAK,MAAM,8BAA8B,IAAI,KAAK,KAAK,GAAG;AAAA,MACpE;AAAA,IACF;AAEA,iBAAa,GAAG;AAChB,WAAO;AAAA,EACT;AAAA;AAAA,EAIQ,kBAAkC;AACxC,SAAK,cAAc,YAAY;AAC/B,UAAM,OAAO,KAAK,OAAO,YAAY,EAAE;AACvC,SAAK,OAAO,QAAQ;AACpB,UAAM,cAAc,KAAK,iBAAiB;AAC1C,SAAK,OAAO,QAAQ;AAEpB,UAAM,WAAW,cAAc,YAAY,UAAU,CAAC;AACtD,UAAM,YAAY,YAAY,KAAK;AACnC,QAAI,MAA6B,EAAE,MAAM,WAAW,OAAO,GAAG;AAC9D,QAAI,WAAW;AACb,UAAI,UAAU,SAAS,cAAc,UAAU,SAAS,OAAO;AAC7D,cAAM,EAAE,MAAM,OAAO,OAAO,cAAc,UAAU,KAAK,CAAC,CAAC,EAAE;AAAA,MAC/D,WAAW,UAAU,SAAS,UAAU;AACtC,cAAM,EAAE,MAAM,WAAW,OAAO,UAAU,MAAM;AAAA,MAClD;AAAA,IACF;AACA,WAAO,EAAE,MAAM,UAAU,YAAY,YAAY,IAAI;AAAA,EACvD;AAAA,EAEQ,iBAAgC;AACtC,SAAK,cAAc,WAAW;AAC9B,UAAM,OAAO,KAAK,OAAO,YAAY,EAAE;AACvC,SAAK,OAAO,QAAQ;AACpB,UAAM,cAAc,KAAK,iBAAiB;AAC1C,SAAK,OAAO,QAAQ;AAEpB,UAAM,SAAiC,CAAC;AACxC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,WAAW,GAAG;AACtD,UAAI,MAAM,SAAS,SAAU,QAAO,GAAG,IAAI,MAAM;AAAA,IACnD;AACA,WAAO;AAAA,MACL;AAAA,MACA,UAAU,cAAc,YAAY,UAAU,CAAC,KAAK;AAAA,MACpD,QAAQ,YAAY,QAAQ,IACxB,cAAc,YAAY,QAAQ,CAAC,IACnC;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,mBAAsD;AAC5D,UAAM,MAAyC,CAAC;AAChD,WAAO,CAAC,KAAK,MAAM,QAAQ,KAAK,CAAC,KAAK,MAAM,GAAG;AAC7C,UAAI,KAAK,MAAM,aAAa,GAAG;AAC7B,aAAK,QAAQ;AACb;AAAA,MACF;AACA,YAAM,MAAM,KAAK,OAAO,YAAY,EAAE;AACtC,WAAK,OAAO,QAAQ;AACpB,UAAI,GAAG,IAAI,KAAK,WAAW;AAAA,IAC7B;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,WAAW,eAAmC;AACpD,SAAK,cAAc,OAAO;AAC1B,UAAM,OAAO,KAAK,OAAO,YAAY,EAAE;AACvC,SAAK,OAAO,QAAQ;AAEpB,UAAM,QAAmB;AAAA,MACvB;AAAA,MACA,QAAQ,CAAC;AAAA,MACT,YAAY,CAAC;AAAA,MACb,eAAe,CAAC;AAAA,MAChB,SAAS,CAAC;AAAA,MACV;AAAA,IACF;AAEA,QAAI,aAAuB,CAAC;AAC5B,WAAO,CAAC,KAAK,MAAM,QAAQ,KAAK,CAAC,KAAK,MAAM,GAAG;AAC7C,YAAM,MAAM,KAAK,KAAK;AACtB,UAAI,IAAI,SAAS,eAAe;AAC9B,mBAAW,KAAK,IAAI,KAAK;AACzB,aAAK,QAAQ;AACb;AAAA,MACF;AACA,UAAI,IAAI,SAAS,aAAa;AAC5B,aAAK,oBAAoB,KAAK;AAC9B,qBAAa,CAAC;AACd;AAAA,MACF;AACA,YAAM,QAAQ,KAAK;AAAA,QACjB,WAAW,SAAS,WAAW,KAAK,IAAI,IAAI;AAAA,MAC9C;AACA,mBAAa,CAAC;AACd,YAAM,OAAO,KAAK,KAAK;AAEvB,UAAI,MAAM,QAAQ,CAAC,MAAM,WAAW,SAAS,MAAM,IAAI,GAAG;AACxD,cAAM,WAAW,KAAK,MAAM,IAAI;AAAA,MAClC;AAAA,IACF;AACA,SAAK,OAAO,QAAQ;AACpB,WAAO;AAAA,EACT;AAAA,EAEQ,WAAW,eAAmC;AACpD,UAAM,OAAO,KAAK,OAAO,YAAY,EAAE;AACvC,UAAM,WAAW,KAAK,OAAO,YAAY,EAAE;AAE3C,QAAI,SAAS;AACb,QAAI,aAAa;AAEjB,WAAO,KAAK,MAAM,UAAU,KAAK,KAAK,MAAM,UAAU,GAAG;AACvD,UAAI,KAAK,MAAM,UAAU,GAAG;AAC1B,aAAK,QAAQ;AACb,aAAK,OAAO,UAAU;AACtB,iBAAS;AAAA,MACX,OAAO;AACL,aAAK,QAAQ;AACb,qBAAa;AAAA,MACf;AAAA,IACF;AAEA,UAAM,QAAmB;AAAA,MACvB;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA;AAAA,MACN;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,UAAU;AAAA,MACV,aAAa;AAAA,MACb;AAAA,IACF;AAEA,WAAO,KAAK,MAAM,IAAI,GAAG;AACvB,YAAM,OAAO,KAAK,eAAe;AACjC,WAAK,oBAAoB,OAAO,IAAI;AAAA,IACtC;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,OAAkB,MAA0B;AACtE,QAAI,KAAK,KAAK,WAAW,KAAK,GAAG;AAC/B,YAAM,aAAa,aAAa,IAAI;AACpC;AAAA,IACF;AACA,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,cAAM,OAAO;AACb;AAAA,MACF,KAAK;AACH,cAAM,WAAW;AACjB;AAAA,MACF,KAAK;AACH,cAAM,cAAc;AACpB;AAAA,MACF,KAAK;AACH,cAAM,UAAU,eAAe,KAAK,KAAK,CAAC,CAAC;AAC3C;AAAA,MACF,KAAK;AACH,cAAM,SAAS,cAAc,KAAK,KAAK,CAAC,CAAC;AACzC;AAAA,MACF,KAAK;AACH,cAAM,WAAW,eAAe,KAAK,IAAI;AACzC;AAAA,MACF;AACE,cAAM,KAAK,MAAM,6BAA6B,KAAK,IAAI,KAAK,IAAI;AAAA,IACpE;AAAA,EACF;AAAA,EAEQ,oBAAoB,OAAwB;AAClD,UAAM,QAAQ,KAAK,OAAO,WAAW;AACrC,UAAM,OAAO,KAAK,OAAO,YAAY,EAAE;AACvC,UAAM,OAAO,KAAK,MAAM,QAAQ,IAAI,KAAK,aAAa,IAAI,CAAC;AAE3D,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,cAAM,aAAa,cAAc,IAAI;AACrC;AAAA,MACF,KAAK;AACH,cAAM,cAAc,KAAK;AAAA,UACvB,QAAQ,cAAc,IAAI;AAAA,UAC1B,MAAM,SAAS,MAAM,KAAK;AAAA,QAC5B,CAAC;AACD;AAAA,MACF,KAAK;AACH,cAAM,QAAQ,KAAK;AAAA,UACjB,QAAQ,cAAc,IAAI;AAAA,UAC1B,MAAM,SAAS,MAAM,KAAK;AAAA,UAC1B,QAAQ;AAAA,QACV,CAAC;AACD;AAAA,MACF,KAAK;AACH,cAAM,SAAS,cAAc,KAAK,CAAC,CAAC;AACpC;AAAA,MACF;AACE,cAAM,KAAK,MAAM,8BAA8B,IAAI,KAAK,KAAK;AAAA,IACjE;AAAA,EACF;AAAA,EAEQ,UAAU,eAAkC;AAClD,SAAK,cAAc,MAAM;AACzB,UAAM,OAAO,KAAK,OAAO,YAAY,EAAE;AACvC,SAAK,OAAO,QAAQ;AACpB,UAAM,OAAiB,EAAE,MAAM,QAAQ,CAAC,GAAG,cAAc;AAEzD,WAAO,CAAC,KAAK,MAAM,QAAQ,KAAK,CAAC,KAAK,MAAM,GAAG;AAC7C,UAAI,KAAK,MAAM,aAAa,GAAG;AAC7B,aAAK,QAAQ;AACb;AAAA,MACF;AACA,UAAI,KAAK,MAAM,WAAW,GAAG;AAC3B,aAAK,QAAQ;AACb,cAAM,WAAW,KAAK,OAAO,YAAY,EAAE;AAC3C,cAAM,OAAO,KAAK,MAAM,QAAQ,IAAI,KAAK,aAAa,IAAI,CAAC;AAC3D,YAAI,aAAa,MAAO,MAAK,SAAS,cAAc,KAAK,CAAC,CAAC;AAC3D;AAAA,MACF;AACA,YAAM,YAAY,KAAK,OAAO,YAAY,EAAE;AAC5C,UAAI;AACJ,aAAO,KAAK,MAAM,IAAI,GAAG;AACvB,cAAM,OAAO,KAAK,eAAe;AACjC,YAAI,KAAK,SAAS,MAAO,UAAS,cAAc,KAAK,KAAK,CAAC,CAAC;AAAA,MAC9D;AACA,WAAK,OAAO,KAAK,EAAE,MAAM,WAAW,OAAO,CAAC;AAAA,IAC9C;AACA,SAAK,OAAO,QAAQ;AACpB,WAAO;AAAA,EACT;AAAA;AAAA,EAIQ,iBAA+B;AACrC,UAAM,KAAK,KAAK,OAAO,IAAI;AAC3B,QAAI,OAAO,KAAK,OAAO,YAAY,EAAE;AAErC,QAAI,KAAK,MAAM,KAAK,GAAG;AACrB,WAAK,QAAQ;AACb,cAAQ,MAAM,KAAK,OAAO,YAAY,EAAE;AAAA,IAC1C;AACA,UAAM,OAAO,KAAK,MAAM,QAAQ,IAAI,KAAK,aAAa,IAAI,CAAC;AAC3D,WAAO,EAAE,MAAM,MAAM,MAAM,GAAG,MAAM,QAAQ,GAAG,OAAO;AAAA,EACxD;AAAA,EAEQ,eAAoC;AAC1C,SAAK,OAAO,QAAQ;AACpB,UAAM,OAA4B,CAAC;AACnC,WAAO,CAAC,KAAK,MAAM,QAAQ,KAAK,CAAC,KAAK,MAAM,GAAG;AAC7C,WAAK,KAAK,KAAK,SAAS,CAAC;AACzB,UAAI,KAAK,MAAM,OAAO,EAAG,MAAK,QAAQ;AAAA,IACxC;AACA,SAAK,OAAO,QAAQ;AACpB,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,WAA8B;AACpC,QAAI,KAAK,MAAM,YAAY,KAAK,KAAK,KAAK,CAAC,GAAG,SAAS,SAAS;AAC9D,YAAM,MAAM,KAAK,OAAO,YAAY,EAAE;AACtC,WAAK,OAAO,OAAO;AACnB,YAAM,QAAQ,KAAK,WAAW;AAC9B,aAAO,EAAE,MAAM,YAAY,MAAM,WAAW,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE;AAAA,IACnE;AACA,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEQ,aAAgC;AACtC,UAAM,MAAM,KAAK,KAAK;AACtB,YAAQ,IAAI,MAAM;AAAA,MAChB,KAAK;AACH,aAAK,QAAQ;AACb,eAAO,EAAE,MAAM,UAAU,OAAO,IAAI,MAAM;AAAA,MAC5C,KAAK;AACH,aAAK,QAAQ;AACb,eAAO,EAAE,MAAM,UAAU,OAAO,OAAO,IAAI,KAAK,EAAE;AAAA,MACpD,KAAK,YAAY;AACf,aAAK,QAAQ;AACb,cAAM,QAA6B,CAAC;AACpC,eAAO,CAAC,KAAK,MAAM,UAAU,KAAK,CAAC,KAAK,MAAM,GAAG;AAC/C,gBAAM,KAAK,KAAK,WAAW,CAAC;AAC5B,cAAI,KAAK,MAAM,OAAO,EAAG,MAAK,QAAQ;AAAA,QACxC;AACA,aAAK,OAAO,UAAU;AACtB,eAAO,EAAE,MAAM,SAAS,MAAM;AAAA,MAChC;AAAA,MACA,KAAK,cAAc;AACjB,aAAK,QAAQ;AACb,YAAI,IAAI,UAAU,UAAU,IAAI,UAAU,SAAS;AACjD,iBAAO,EAAE,MAAM,WAAW,OAAO,IAAI,UAAU,OAAO;AAAA,QACxD;AACA,YAAI,KAAK,MAAM,QAAQ,GAAG;AACxB,gBAAM,OAAO,KAAK,aAAa;AAC/B,iBAAO,EAAE,MAAM,YAAY,MAAM,IAAI,OAAO,KAAK;AAAA,QACnD;AACA,eAAO,EAAE,MAAM,OAAO,OAAO,IAAI,MAAM;AAAA,MACzC;AAAA,MACA;AACE,cAAM,KAAK,MAAM,2BAA2B,IAAI,KAAK,KAAK,GAAG;AAAA,IACjE;AAAA,EACF;AAAA;AAAA,EAIQ,KAAK,SAAS,GAAU;AAC9B,WAAO,KAAK,OAAO,KAAK,MAAM,MAAM,KAAK,KAAK,OAAO,KAAK,OAAO,SAAS,CAAC;AAAA,EAC7E;AAAA,EAEQ,UAAiB;AACvB,UAAM,MAAM,KAAK,OAAO,KAAK,GAAG;AAChC,QAAI,KAAK,MAAM,KAAK,OAAO,SAAS,EAAG,MAAK;AAC5C,WAAO;AAAA,EACT;AAAA,EAEQ,MAAM,MAA0B;AACtC,WAAO,KAAK,KAAK,EAAE,SAAS;AAAA,EAC9B;AAAA,EAEQ,QAAiB;AACvB,WAAO,KAAK,KAAK,EAAE,SAAS;AAAA,EAC9B;AAAA,EAEQ,OAAO,MAAwB;AACrC,UAAM,MAAM,KAAK,KAAK;AACtB,QAAI,IAAI,SAAS,MAAM;AACrB,YAAM,KAAK,MAAM,YAAY,IAAI,eAAe,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,GAAG;AAAA,IACjF;AACA,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEQ,cAAc,SAAwB;AAC5C,UAAM,MAAM,KAAK,KAAK;AACtB,QAAI,IAAI,SAAS,gBAAgB,IAAI,UAAU,SAAS;AACtD,YAAM,KAAK,MAAM,qBAAqB,OAAO,KAAK,GAAG;AAAA,IACvD;AACA,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEQ,MAAM,SAAiB,IAAsC;AACnE,WAAO,IAAI,iBAAiB,SAAS,GAAG,MAAM,GAAG,QAAQ,KAAK,IAAI;AAAA,EACpE;AACF;AAIA,SAAS,cAAc,GAA0C;AAC/D,MAAI,CAAC,EAAG,QAAO;AACf,MAAI,EAAE,SAAS,SAAU,QAAO,EAAE;AAClC,MAAI,EAAE,SAAS,MAAO,QAAO,EAAE;AAC/B,SAAO,OAAO,WAAW,IAAI,EAAE,QAAQ,EAAE;AAC3C;AAEA,SAAS,aAAa,MAAgC;AACpD,QAAM,OAAO,KAAK,KAAK,MAAM,MAAM,MAAM;AACzC,QAAM,OAAO,KAAK,KACf,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ,EACjC,IAAI,CAAC,MAAO,EAAwB,KAAK;AAC5C,SAAO,EAAE,MAAM,KAAK;AACtB;AAEA,SAAS,eAAe,GAAgD;AACtE,MAAI,CAAC,EAAG,QAAO,CAAC;AAChB,UAAQ,EAAE,MAAM;AAAA,IACd,KAAK;AACH,aAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,KAAK,EAAE;AAAA,IACpD,KAAK;AACH,aAAO,EAAE,SAAS,EAAE,MAAM;AAAA,IAC5B,KAAK;AACH,aAAO,EAAE,SAAS,EAAE,MAAM;AAAA,IAC5B,KAAK;AACH,aAAO,EAAE,SAAS,EAAE,MAAM;AAAA,IAC5B,KAAK;AAEH,aAAO,EAAE,SAAS,EAAE,MAAM;AAAA,IAC5B;AACE,aAAO,CAAC;AAAA,EACZ;AACF;AAEA,SAAS,eAAe,MAAyC;AAC/D,QAAM,OAAqB,CAAC;AAC5B,aAAW,OAAO,MAAM;AACtB,QAAI,IAAI,SAAS,UAAU;AACzB,WAAK,OAAO,IAAI;AAChB;AAAA,IACF;AACA,UAAM,QAAQ,QAAQ,GAAG;AACzB,QAAI,CAAC,MAAO;AACZ,UAAM,CAAC,KAAK,KAAK,IAAI;AACrB,QAAI,QAAQ,UAAU,MAAM,SAAS,SAAU,MAAK,OAAO,MAAM;AACjE,QAAI,QAAQ,SAAU,MAAK,SAAS,SAAS,KAAK;AAClD,QAAI,QAAQ,aAAc,MAAK,aAAa,SAAS,KAAK;AAC1D,QAAI,QAAQ,WAAY,MAAK,WAAW,QAAQ,KAAK;AACrD,QAAI,QAAQ,WAAY,MAAK,WAAW,QAAQ,KAAK;AAAA,EACvD;AACA,SAAO;AACT;AAEA,SAAS,QACP,KACyC;AACzC,MAAI,IAAI,SAAS,cAAc,IAAI,KAAK,WAAW,UAAU,GAAG;AAC9D,WAAO,CAAC,IAAI,KAAK,MAAM,WAAW,MAAM,GAAG,IAAI,KAAK,CAAC,CAAE;AAAA,EACzD;AACA,SAAO;AACT;AAEA,SAAS,SAAS,MAA2B,KAAiC;AAC5E,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,QAAQ,GAAG;AACzB,QAAI,SAAS,MAAM,CAAC,MAAM,OAAO,MAAM,CAAC,EAAE,SAAS,UAAU;AAC3D,aAAO,MAAM,CAAC,EAAE;AAAA,IAClB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,SAAS,GAAgC;AAChD,MAAI,EAAE,SAAS,SAAS;AACtB,WAAO,EAAE,MAAM,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,MAAmB,CAAC,CAAC,CAAC;AAAA,EACtE;AACA,QAAM,SAAS,QAAQ,CAAC;AACxB,SAAO,SAAS,CAAC,MAAM,IAAI,CAAC;AAC9B;AAEA,SAAS,QAAQ,GAA0C;AACzD,MAAI,EAAE,SAAS,MAAO,QAAO,EAAE;AAC/B,MAAI,EAAE,SAAS,SAAU,QAAO,EAAE;AAClC,SAAO;AACT;AAGA,SAAS,cAAc,MAAqC;AAC1D,aAAW,OAAO,MAAM;AACtB,QAAI,IAAI,SAAS,QAAS,QAAO,SAAS,GAAG;AAC7C,UAAM,QAAQ,QAAQ,GAAG;AACzB,QAAI,SAAS,MAAM,CAAC,MAAM,SAAU,QAAO,SAAS,MAAM,CAAC,CAAC;AAAA,EAC9D;AAEA,SAAO,KAAK,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,MAAmB,CAAC,CAAC,CAAC;AACnE;AAMA,SAAS,aAAa,KAA2B;AAC/C,QAAM,aAAa,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AACxD,QAAM,YAAY,IAAI,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AACtD,aAAW,SAAS,IAAI,QAAQ;AAC9B,eAAW,SAAS,MAAM,QAAQ;AAChC,UAAI,WAAW,IAAI,MAAM,IAAI,EAAG,OAAM,OAAO;AAAA,eACpC,UAAU,IAAI,MAAM,IAAI,EAAG,OAAM,OAAO;AAAA,UAC5C,OAAM,OAAO;AAAA,IACpB;AAAA,EACF;AACF;;;ACtgBO,SAAS,eAAe,KAA2B;AACxD,QAAM,SAAmB,CAAC;AAC1B,QAAM,SAAS,IAAI,IAAY,YAAY;AAC3C,QAAM,YAAY,IAAI,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AACtD,QAAM,aAAa,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAExD,QAAM,kBAAkB,eAAe,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AACpE,aAAW,QAAQ,iBAAiB;AAClC,WAAO,KAAK,oBAAoB,IAAI,IAAI;AAAA,EAC1C;AAEA,aAAW,SAAS,IAAI,QAAQ;AAC9B,UAAM,aAAa,oBAAI,IAAY;AACnC,eAAW,SAAS,MAAM,QAAQ;AAChC,UAAI,WAAW,IAAI,MAAM,IAAI,GAAG;AAC9B,eAAO,KAAK,oBAAoB,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI;AAAA,MAC9D;AACA,iBAAW,IAAI,MAAM,IAAI;AAEzB,YAAM,QACJ,OAAO,IAAI,MAAM,IAAI,KACrB,UAAU,IAAI,MAAM,IAAI,KACxB,WAAW,IAAI,MAAM,IAAI;AAC3B,UAAI,CAAC,OAAO;AACV,eAAO;AAAA,UACL,UAAU,MAAM,IAAI,IAAI,MAAM,IAAI,uBAAuB,MAAM,IAAI;AAAA,QACrE;AAAA,MACF;AAEA,UAAI,MAAM,SAAS,YAAY,MAAM,UAAU;AAC7C,yBAAiB,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,UAAU,MAAM;AAAA,MACtE;AAAA,IACF;AAEA,eAAW,MAAM,MAAM,YAAY;AACjC,UAAI,CAAC,WAAW,IAAI,EAAE,GAAG;AACvB,eAAO;AAAA,UACL,sBAAsB,EAAE,8BAA8B,MAAM,IAAI;AAAA,QAClE;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QACJ,MAAM,WAAW,SAAS,KAAK,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,IAAI;AAChE,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,QACL,UAAU,MAAM,IAAI;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,aAAW,YAAY,IAAI,OAAO;AAChC,QAAI,SAAS,OAAO,WAAW,GAAG;AAChC,aAAO,KAAK,SAAS,SAAS,IAAI,kBAAkB;AAAA,IACtD;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,IAAI,sBAAsB,4BAA4B,MAAM;AAAA,EACpE;AACF;AAEA,SAAS,iBACP,KACA,WACA,WACA,UACA,QACM;AACN,QAAM,QAAQ,UAAU,KAAK,SAAS;AACtC,MAAI,CAAC,MAAO;AACZ,aAAW,KAAK,SAAS,UAAU,CAAC,GAAG;AACrC,QAAI,CAAC,MAAM,OAAO,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG;AAC7C,aAAO;AAAA,QACL,aAAa,SAAS,IAAI,SAAS,6BAA6B,CAAC;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,eAAe,QAA4B;AAClD,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,KAAK,QAAQ;AACtB,QAAI,KAAK,IAAI,CAAC,EAAG,MAAK,IAAI,CAAC;AAC3B,SAAK,IAAI,CAAC;AAAA,EACZ;AACA,SAAO,CAAC,GAAG,IAAI;AACjB;;;ACrFO,SAAS,YAAY,KAA6B;AACvD,QAAM,SAAmB,CAAC;AAE1B,MAAI,IAAI,YAAY;AAClB,UAAM,KAAK,IAAI;AACf,UAAM,MACJ,GAAG,IAAI,SAAS,QACZ,QAAQ,GAAG,IAAI,KAAK,OACpB,IAAI,GAAG,IAAI,KAAK;AACtB,WAAO;AAAA,MACL,cAAc,GAAG,IAAI;AAAA,gBAAqB,GAAG,QAAQ;AAAA,eAAmB,GAAG;AAAA;AAAA,IAC7E;AAAA,EACF;AAEA,aAAW,OAAO,IAAI,YAAY;AAChC,UAAM,QAAQ,CAAC,iBAAiB,IAAI,QAAQ,GAAG;AAC/C,QAAI,IAAI,OAAQ,OAAM,KAAK,iBAAiB,IAAI,MAAM,GAAG;AACzD,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,MAAM,GAAG;AAC/C,UAAI,MAAM,cAAc,MAAM,SAAU;AACxC,YAAM,KAAK,KAAK,CAAC,OAAO,CAAC,GAAG;AAAA,IAC9B;AACA,WAAO,KAAK,aAAa,IAAI,IAAI;AAAA,EAAO,MAAM,KAAK,IAAI,CAAC;AAAA,EAAK;AAAA,EAC/D;AAEA,aAAW,YAAY,IAAI,OAAO;AAChC,WAAO,KAAK,UAAU,QAAQ,CAAC;AAAA,EACjC;AAEA,aAAW,SAAS,IAAI,QAAQ;AAC9B,WAAO,KAAK,WAAW,KAAK,CAAC;AAAA,EAC/B;AAEA,SAAO,OAAO,KAAK,MAAM,IAAI;AAC/B;AAEA,SAAS,UAAU,MAAwB;AACzC,QAAM,QAAkB,CAAC;AACzB,MAAI,KAAK,cAAe,OAAM,KAAK,GAAG,SAAS,KAAK,aAAa,CAAC;AAClE,QAAM,KAAK,QAAQ,KAAK,IAAI,IAAI;AAChC,aAAW,KAAK,KAAK,QAAQ;AAC3B,UAAM,KAAK,KAAK,EAAE,IAAI,GAAG,EAAE,SAAS,UAAU,EAAE,MAAM,OAAO,EAAE,EAAE;AAAA,EACnE;AACA,MAAI,KAAK,OAAQ,OAAM,KAAK;AAAA,WAAc,KAAK,MAAM,IAAI;AACzD,QAAM,KAAK,GAAG;AACd,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,WAAW,OAA0B;AAC5C,QAAM,QAAkB,CAAC;AACzB,MAAI,MAAM,cAAe,OAAM,KAAK,GAAG,SAAS,MAAM,aAAa,CAAC;AACpE,QAAM,KAAK,SAAS,MAAM,IAAI,IAAI;AAElC,QAAM,YAAY,KAAK,IAAI,GAAG,MAAM,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,MAAM,GAAG,CAAC;AACvE,QAAM,YAAY,KAAK,IAAI,GAAG,MAAM,OAAO,IAAI,CAAC,MAAM,UAAU,CAAC,EAAE,MAAM,GAAG,CAAC;AAE7E,aAAW,SAAS,MAAM,QAAQ;AAChC,QAAI,MAAM,eAAe;AACvB,YAAM,KAAK,GAAG,SAAS,MAAM,aAAa,EAAE,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;AAAA,IAClE;AACA,UAAM,QAAQ,gBAAgB,KAAK;AACnC,UAAM,OAAO,MAAM,KAAK,OAAO,SAAS;AACxC,UAAM,OAAO,UAAU,KAAK,EAAE,OAAO,SAAS;AAC9C,UAAM,KAAK,KAAK,IAAI,IAAI,IAAI,GAAG,QAAQ,IAAI,KAAK,KAAK,EAAE,GAAG,QAAQ,CAAC;AAAA,EACrE;AAEA,QAAM,aAAa,qBAAqB,KAAK;AAC7C,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,KAAK,EAAE;AACb,eAAW,KAAK,WAAY,OAAM,KAAK,KAAK,CAAC,EAAE;AAAA,EACjD;AAEA,QAAM,KAAK,GAAG;AACd,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,UAAU,OAA0B;AAC3C,MAAI,IAAI,MAAM;AACd,MAAI,MAAM,OAAQ,MAAK;AAAA,WACd,CAAC,MAAM,WAAY,MAAK;AACjC,SAAO;AACT;AAEA,SAAS,gBAAgB,OAA0B;AACjD,QAAM,QAAkB,CAAC;AACzB,MAAI,MAAM,KAAM,OAAM,KAAK,KAAK;AAChC,MAAI,MAAM,SAAU,OAAM,KAAK,SAAS;AACxC,MAAI,MAAM,QAAS,OAAM,KAAK,YAAY,aAAa,MAAM,OAAO,CAAC,GAAG;AACxE,MAAI,MAAM,YAAa,OAAM,KAAK,YAAY;AAC9C,MAAI,MAAM,UAAU;AAClB,UAAM,MAAM,MAAM;AAClB,UAAM,OAAiB,CAAC;AACxB,QAAI,IAAI,KAAM,MAAK,KAAK,IAAI,IAAI,IAAI,GAAG;AACvC,QAAI,IAAI,QAAQ,OAAQ,MAAK,KAAK,YAAY,IAAI,OAAO,KAAK,IAAI,CAAC,GAAG;AACtE,QAAI,IAAI,YAAY;AAClB,WAAK,KAAK,gBAAgB,IAAI,WAAW,KAAK,IAAI,CAAC,GAAG;AACxD,QAAI,IAAI,SAAU,MAAK,KAAK,aAAa,IAAI,QAAQ,EAAE;AACvD,QAAI,IAAI,SAAU,MAAK,KAAK,aAAa,IAAI,QAAQ,EAAE;AACvD,UAAM,KAAK,KAAK,SAAS,aAAa,KAAK,KAAK,IAAI,CAAC,MAAM,WAAW;AAAA,EACxE;AACA,MAAI,MAAM,YAAY;AACpB,UAAM,IAAI,MAAM,WAAW,KAAK,SAC5B,IAAI,MAAM,WAAW,KAAK,KAAK,IAAI,CAAC,MACpC;AACJ,UAAM,KAAK,OAAO,MAAM,WAAW,IAAI,GAAG,CAAC,EAAE;AAAA,EAC/C;AACA,MAAI,MAAM,OAAQ,OAAM,KAAK,SAAS,MAAM,MAAM,IAAI;AACtD,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,aAAa,KAA2B;AAC/C,MAAI,IAAI,UAAU;AAChB,WAAO,GAAG,IAAI,SAAS,IAAI,IAAI,IAAI,SAAS,KACzC,IAAI,aAAa,EACjB,KAAK,IAAI,CAAC;AAAA,EACf;AACA,MAAI,OAAO,IAAI,YAAY,UAAU;AAEnC,WAAO,2BAA2B,KAAK,IAAI,OAAO,IAC9C,IAAI,UACJ,IAAI,IAAI,OAAO;AAAA,EACrB;AACA,SAAO,OAAO,IAAI,OAAO;AAC3B;AAEA,SAAS,cAAc,GAA8B;AACnD,UAAQ,EAAE,MAAM;AAAA,IACd,KAAK;AACH,aAAO,IAAI,EAAE,KAAK;AAAA,IACpB,KAAK;AACH,aAAO,OAAO,EAAE,KAAK;AAAA,IACvB,KAAK;AACH,aAAO,OAAO,EAAE,KAAK;AAAA,IACvB,KAAK;AACH,aAAO,EAAE;AAAA,IACX,KAAK;AACH,aAAO,IAAI,EAAE,MAAM,IAAI,aAAa,EAAE,KAAK,IAAI,CAAC;AAAA,IAClD,KAAK;AACH,aAAO,GAAG,EAAE,IAAI,IAAI,EAAE,KAAK,IAAI,aAAa,EAAE,KAAK,IAAI,CAAC;AAAA,EAC5D;AACF;AAEA,SAAS,qBAAqB,OAA4B;AACxD,QAAM,MAAgB,CAAC;AACvB,QAAM,WACJ,MAAM,WAAW,WAAW,KAC5B,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,WAAW,CAAC,CAAC,GAAG;AAC5D,MAAI,MAAM,WAAW,SAAS,KAAK,CAAC,UAAU;AAC5C,QAAI,KAAK,SAAS,MAAM,WAAW,KAAK,IAAI,CAAC,IAAI;AAAA,EACnD;AACA,aAAW,KAAK,MAAM,eAAe;AACnC,QAAI;AAAA,MACF,aAAa,EAAE,OAAO,KAAK,IAAI,CAAC,IAAI,EAAE,OAAO,WAAW,EAAE,IAAI,MAAM,EAAE;AAAA,IACxE;AAAA,EACF;AACA,aAAW,KAAK,MAAM,SAAS;AAC7B,QAAI;AAAA,MACF,YAAY,EAAE,OAAO,KAAK,IAAI,CAAC,IAAI,EAAE,OAAO,WAAW,EAAE,IAAI,MAAM,EAAE;AAAA,IACvE;AAAA,EACF;AACA,MAAI,MAAM,OAAQ,KAAI,KAAK,UAAU,MAAM,MAAM,IAAI;AACrD,SAAO;AACT;AAEA,SAAS,SAAS,eAAiC;AACjD,SAAO,cAAc,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE;AACxD;;;ACjLO,SAAS,cAAc,GAA0C;AACtE,SACE,OAAO,MAAM,YACb,MAAM,QACN,CAAC,MAAM,QAAQ,CAAC,KAChB,EAAE,aAAa,SACf,CAAC,OAAO,SAAS,CAAC;AAEtB;AAMO,SAAS,KAAQ,OAAiB;AACvC,SAAO,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;AAC3B;AAEO,SAAS,WAAW,OAAuB;AAChD,SAAO,MACJ,YAAY,EACZ;AAAA,IAAQ;AAAA,IAAsB,CAAC,GAAG,MACjC,IAAI,EAAE,YAAY,IAAI;AAAA,EACxB,EACC,QAAQ,QAAQ,CAAC,GAAG,MAAc,EAAE,YAAY,CAAC;AACtD;AAEO,SAAS,UAAU,OAAuB;AAC/C,QAAM,SAAS,WAAW,KAAK;AAC/B,SAAO,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC;AACxD;AAEO,SAAS,UAAU,MAAsB;AAC9C,MAAI,cAAc,KAAK,IAAI,EAAG,QAAO,KAAK,QAAQ,OAAO,KAAK;AAC9D,MAAI,kBAAkB,KAAK,IAAI,EAAG,QAAO,GAAG,IAAI;AAChD,SAAO,GAAG,IAAI;AAChB;AAGO,SAAS,WAAW,OAAuB;AAChD,SAAO,MAAM,OAAO,CAAC,EAAE,YAAY,IAAI,MAAM,MAAM,CAAC;AACtD;;;ANpBO,SAAS,YAAY,QAAgB,MAA+B;AACzE,SAAO,IAAI,OAAO,QAAQ,IAAI,EAAE,MAAM;AACxC;AAGO,SAAS,iBAAiB,QAAgB,MAA+B;AAC9E,QAAM,MAAM,YAAY,QAAQ,IAAI;AACpC,iBAAe,GAAG;AAClB,SAAO;AACT;AASA,IAAM,uBAAuB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF;AAGO,SAAS,eACd,OAAO,QAAQ,IAAI,GACnB,UACoB;AACpB,MAAI,UAAU;AACZ,UAAM,QAAI,0BAAQ,MAAM,QAAQ;AAChC,eAAO,2BAAW,CAAC,IAAI,IAAI;AAAA,EAC7B;AACA,aAAW,aAAa,sBAAsB;AAC5C,UAAM,QAAI,0BAAQ,MAAM,SAAS;AACjC,YAAI,2BAAW,CAAC,EAAG,QAAO;AAAA,EAC5B;AACA,SAAO;AACT;AAGO,SAAS,WAAW,MAA4B;AACrD,QAAM,aAAS,6BAAa,MAAM,MAAM;AACxC,QAAM,WAAW,iBAAiB,QAAQ,IAAI;AAC9C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,aAAa,qBAAqB,cAAU,0BAAQ,IAAI,CAAC;AAAA,EAC3D;AACF;AAEO,SAAS,qBACd,KACA,OACoB;AACpB,QAAM,KAAK,IAAI;AACf,MAAI,CAAC,GAAI,QAAO;AAChB,MAAI,GAAG,IAAI,SAAS,UAAW,QAAO,GAAG,IAAI;AAC7C,SAAO,QAAQ,IAAI,GAAG,IAAI,KAAK;AACjC;;;AOlFA,8BAAkC;AAClC,2BAAqB;AA6BrB,IAAM,KAAK,qBAAAA;AAQX,SAAS,kBAAkB,OAA4C;AACrE,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO,GAAG;AAAA,IACZ,KAAK;AACH,aAAO,GAAG;AAAA,IACZ,KAAK;AACH,aAAO,GAAG;AAAA,IACZ,KAAK;AAAA,IACL;AACE,aAAO,GAAG;AAAA,EACd;AACF;AAQO,IAAM,iBAAN,MAA0C;AAAA,EACvC,OAAsB;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW,IAAI,0CAAsC;AAAA,EAEtE,YAAY,QAA0B,eAA+B;AACnE,SAAK,UAAU,OAAO,WAAW;AACjC,SAAK,UAAU,eAAe;AAC9B,SAAK,UAAU;AAAA,MACb,MAAM,OAAO;AAAA,MACb,MAAM,OAAO;AAAA,MACb,UAAU,OAAO;AAAA,MACjB,MAAM,OAAO;AAAA,MACb,UAAU,OAAO;AAAA,MACjB,MAAM,OAAO,QAAQ;AAAA,MACrB,UAAU,OAAO,YAAY;AAAA,MAC7B,UAAU,OAAO,YAAY;AAAA,MAC7B,YAAY,OAAO,cAAc;AAAA,MACjC,gBAAgB,OAAO,iBAAiB;AAAA,MACxC,yBAAyB;AAAA;AAAA;AAAA,MAGzB,GAAI,OAAO,aAAa,EAAE,YAAY,OAAO,WAAW,IAAI,CAAC;AAAA,MAC7D,GAAI,OAAO,mBAAmB,OAC1B,EAAE,iBAAiB,OAAO,gBAAgB,IAC1C,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EAEA,MAAM,UAAyB;AAC7B,QAAI,KAAK,KAAM;AACf,SAAK,OAAO,GAAG,KAAK,KAAK,SAAS,KAAK,OAAO;AAAA,EAChD;AAAA,EAEA,MAAM,aAA4B;AAChC,QAAI,CAAC,KAAK,KAAM;AAChB,SAAK,KAAK,QAAQ;AAClB,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,MAAM,YACJ,IACA,SACY;AACZ,UAAM,WAAW,KAAK,SAAS,SAAS;AACxC,QAAI,UAAU;AAEZ,aAAO,GAAG,QAAQ;AAAA,IACpB;AACA,UAAM,KAAK,QAAQ;AACnB,UAAM,KAAK,MAAM,KAAK,QAAQ;AAC9B,UAAM,KAAK,MAAM,KAAK,MAAM,IAAI,SAAS,SAAS;AAClD,UAAM,MAA0B;AAAA,MAC9B,OAAO,CAAC,KAAK,WAAW,KAAK,iBAAiB,IAAI,KAAK,MAAM;AAAA,IAC/D;AACA,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,SAAS,IAAI,KAAK,MAAM,GAAG,GAAG,CAAC;AACzD,YAAM,KAAK,OAAO,EAAE;AACpB,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,YAAM,KAAK,aAAa,EAAE;AAC1B,YAAM;AAAA,IACR,UAAE;AACA,SAAG,OAAO;AAAA,IACZ;AAAA,EACF;AAAA;AAAA,EAIQ,UAA+B;AACrC,WAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,WAAK,KAAM,IAAI,CAAC,KAAK,OAAO;AAC1B,YAAI,IAAK,QAAO,OAAO,KAAK,KAAK,8BAA8B,CAAC;AAChE,QAAAA,SAAQ,EAAE;AAAA,MACZ,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEQ,MACN,IACA,WACwB;AACxB,WAAO,IAAI,QAAQ,CAACA,UAAS,WAAW;AACtC,SAAG,YAAY,kBAAkB,SAAS,GAAG,CAAC,KAAK,OAAO;AACxD,YAAI,IAAK,QAAO,OAAO,KAAK,KAAK,6BAA6B,CAAC;AAC/D,QAAAA,SAAQ,EAAE;AAAA,MACZ,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEQ,iBACN,IACA,KACA,SAA8B,CAAC,GACjB;AACd,UAAM,QAAQ,KAAK,UAAU,YAAY,IAAI,IAAI;AACjD,WAAO,IAAI,QAAQ,CAACA,UAAS,WAAW;AACtC,SAAG,MAAM,KAAK,CAAC,GAAG,MAAM,GAAG,CAAC,KAAK,WAAW;AAC1C,YAAI,IAAK,QAAO,OAAO,KAAK,KAAK,gBAAgB,GAAG,CAAC;AACrD,cAAM,OAAO,cAAiB,MAAM;AACpC,YAAI,KAAK,SAAS;AAChB,eAAK,QAAQ;AAAA,YACX;AAAA,YACA;AAAA,YACA,YAAY,YAAY,IAAI,IAAI;AAAA,YAChC,UAAU,KAAK;AAAA,UACjB,CAAC;AAAA,QACH;AACA,QAAAA,SAAQ,IAAI;AAAA,MACd,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEQ,OAAO,IAAkC;AAC/C,WAAO,IAAI,QAAQ,CAACA,UAAS,WAAW;AACtC,SAAG,OAAO,CAAC,QAAQ;AACjB,YAAI,IAAK,QAAO,OAAO,KAAK,KAAK,8BAA8B,CAAC;AAChE,QAAAA,SAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEQ,aAAa,IAAkC;AACrD,WAAO,IAAI,QAAQ,CAACA,aAAY;AAC9B,SAAG,SAAS,MAAMA,SAAQ,CAAC;AAAA,IAC7B,CAAC;AAAA,EACH;AACF;AAEA,SAAS,cAAiB,QAAsB;AAC9C,MAAI,MAAM,QAAQ,MAAM,EAAG,QAAO;AAClC,MAAI,WAAW,UAAa,WAAW,KAAM,QAAO,CAAC;AACrD,SAAO,CAAC,MAAW;AACrB;AAEA,SAAS,KAAK,KAAc,SAAiB,KAA6B;AACxE,QAAM,SACJ,OAAO,OAAO,QAAQ,YAAY,aAAa,MAC3C,OAAQ,IAA6B,OAAO,IAC5C,OAAO,GAAG;AAChB,SAAO,IAAI,cAAc,GAAG,OAAO,KAAK,MAAM,IAAI,KAAK,GAAG;AAC5D;;;AC3LO,SAAS,mBAAmB,KAA+B;AAChE,MAAI;AACJ,MAAI;AACF,aAAS,IAAI,IAAI,GAAG;AAAA,EACtB,QAAQ;AACN,UAAM,IAAI,WAAW,oCAAoC,GAAG,EAAE;AAAA,EAChE;AAEA,MAAI,CAAC,eAAe,KAAK,OAAO,SAAS,QAAQ,KAAK,EAAE,IAAI,GAAG,GAAG;AAChE,QAAI,OAAO,aAAa,aAAa;AACnC,YAAM,IAAI;AAAA,QACR,yBAAyB,OAAO,QAAQ;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,sBAAsB,OAAO,QAAQ;AACtD,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,WAAW,8CAA8C,GAAG,EAAE;AAAA,EAC1E;AAEA,QAAM,SAAS,OAAO;AACtB,QAAM,SAA2B;AAAA,IAC/B,MAAM,OAAO,YAAY;AAAA,IACzB,MAAM,OAAO,OAAO,OAAO,OAAO,IAAI,IAAI;AAAA,IAC1C;AAAA,IACA,MAAM,mBAAmB,OAAO,YAAY,QAAQ;AAAA,IACpD,UAAU,mBAAmB,OAAO,YAAY,WAAW;AAAA,IAC3D,UAAU,OAAO,IAAI,UAAU,KAAK;AAAA,EACtC;AAEA,QAAM,OAAO,OAAO,IAAI,MAAM;AAC9B,MAAI,KAAM,QAAO,OAAO;AACxB,QAAM,UAAU,OAAO,IAAI,SAAS,KAAK,OAAO,IAAI,kBAAkB;AACtE,MAAI,QAAS,QAAO,UAAU,OAAO,OAAO;AAC5C,QAAM,WAAW,OAAO,IAAI,UAAU;AACtC,MAAI,SAAU,QAAO,WAAW,OAAO,QAAQ;AAE/C,QAAM,QAAQ,OAAO,IAAI,YAAY,KAAK,OAAO,IAAI,MAAM,IAAI,YAAY;AAC3E,MAAI,SAAS,YAAY,SAAS,cAAe,QAAO,aAAa;AAAA,WAC5D,SAAS,MAAO,QAAO,aAAa;AAE7C,QAAM,kBAAkB,OAAO,IAAI,iBAAiB;AACpD,MAAI,mBAAmB,MAAM;AAC3B,WAAO,kBAAkB,oBAAoB,WAAW,oBAAoB;AAAA,EAC9E;AAEA,QAAM,UAAU,OAAO,IAAI,SAAS;AACpC,MAAI,QAAS,QAAO,UAAU,iBAAiB,OAAO;AAEtD,SAAO;AACT;AAEA,IAAM,WAAW,oBAAI,IAAI,CAAC,OAAO,OAAO,KAAK,KAAK,GAAG,CAAC;AAEtD,SAAS,iBAAiB,KAA0C;AAClE,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,SAAS,IAAI,OAAO,EAAG,QAAO;AAElC,MAAI,QAAQ,KAAK,OAAO,EAAG,QAAO;AAClC,MAAI,QAAQ,KAAK,OAAO,EAAG,QAAO;AAClC,QAAM,QAAQ,QAAQ,MAAM,GAAG,EAAE,CAAC;AAClC,MAAI,SAAS,SAAS,IAAI,KAAK,EAAG,QAAO;AACzC,SAAO;AACT;AAEA,SAAS,sBAAsB,UAA0B;AACvD,MAAI,IAAI,mBAAmB,QAAQ;AAEnC,MAAI,EAAE,WAAW,IAAI,EAAG,KAAI,EAAE,MAAM,CAAC;AAErC,MAAI,iBAAiB,KAAK,CAAC,EAAG,KAAI,EAAE,MAAM,CAAC;AAC3C,SAAO;AACT;AAEO,SAAS,mBAAmB,QAAkC;AACnE,QAAM,OAAO,GAAG,mBAAmB,OAAO,IAAI,CAAC,IAAI;AAAA,IACjD,OAAO;AAAA,EACT,CAAC;AACD,QAAM,SAAS,OAAO,SAAS,WAAW,GAAG,IACzC,IAAI,OAAO,QAAQ,KACnB,IAAI,OAAO,QAAQ;AACvB,QAAM,MAAM,IAAI,IAAI,cAAc,IAAI,IAAI,OAAO,IAAI,IAAI,OAAO,IAAI,GAAG,MAAM,EAAE;AAC/E,MAAI,OAAO,KAAM,KAAI,aAAa,IAAI,QAAQ,OAAO,IAAI;AACzD,SAAO,IAAI,SAAS;AACtB;;;AC3EO,SAAS,aACd,QACA,SACW;AACX,QAAM,SACJ,OAAO,WAAW,WAAW,mBAAmB,MAAM,IAAI;AAC5D,SAAO,IAAI,eAAe,QAAQ,OAAO;AAC3C;;;ACxBO,IAAM,MAAN,MAAM,KAAI;AAAA,EACP,QAAkB,CAAC;AAAA,EACX,SAAqB,CAAC;AAAA,EAEtC,OAAO,IAAI,MAAmB;AAC5B,WAAO,IAAI,KAAI,EAAE,KAAK,IAAI;AAAA,EAC5B;AAAA,EAEA,OAAO,MAAM,OAAsB;AACjC,WAAO,IAAI,KAAI,EAAE,KAAK,KAAK;AAAA,EAC7B;AAAA,EAEA,OAAO,KAAK,WAAkB,WAAwB;AACpD,UAAM,MAAM,IAAI,KAAI;AACpB,cAAU,QAAQ,CAAC,MAAM,MAAM;AAC7B,UAAI,IAAI,EAAG,KAAI,KAAK,SAAS;AAC7B,UAAI,OAAO,IAAI;AAAA,IACjB,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,KAAK,MAAoB;AACvB,SAAK,MAAM,KAAK,IAAI;AACpB,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,KAAK,OAAuB;AAC1B,SAAK,MAAM,KAAK,GAAG;AACnB,SAAK,OAAO,KAAK,KAAK;AACtB,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,SAAS,QAAmC;AAC1C,SAAK,MAAM,KAAK,OAAO,IAAI,MAAM,GAAG,EAAE,KAAK,IAAI,CAAC;AAChD,SAAK,OAAO,KAAK,GAAG,MAAM;AAC1B,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,OAAO,OAAkB;AACvB,SAAK,MAAM,KAAK,MAAM,IAAI;AAC1B,SAAK,OAAO,KAAK,GAAG,MAAM,MAAM;AAChC,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,OAAe;AACjB,WAAO,KAAK,MAAM,KAAK,EAAE;AAAA,EAC3B;AAAA,EAEA,UAAmB;AACjB,WAAO,KAAK,KAAK,KAAK,EAAE,WAAW;AAAA,EACrC;AAAA,EAEA,UAA+C;AAC7C,WAAO,EAAE,KAAK,KAAK,MAAM,QAAQ,KAAK,OAAO;AAAA,EAC/C;AACF;;;ACtBO,IAAM,kBAAN,MAA4C;AAAA,EACxC,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,UAAkC,CAAC,GAAG;AAChD,SAAK,UAAU,QAAQ,WAAW;AAClC,UAAM,OAAO,YAAY,KAAK,OAAO;AACrC,SAAK,sBAAsB,QAAQ;AACnC,SAAK,mBAAmB,QAAQ;AAChC,SAAK,0BAA0B,QAAQ;AAAA,EACzC;AAAA,EAEA,oBAA4B;AAC1B,WAAO,KAAK,sBAAsB,YAAY;AAAA,EAChD;AAAA,EAEA,QAAQ,MAAsB;AAE5B,WAAO,IAAI,KAAK,QAAQ,MAAM,IAAI,CAAC;AAAA,EACrC;AAAA,EAEA,SAAS,OAAe,QAAwB;AAC9C,WAAO,GAAG,KAAK,QAAQ,KAAK,CAAC,IAAI,KAAK,QAAQ,MAAM,CAAC;AAAA,EACvD;AAAA,EAEA,iBAAiB,MAAe,MAAuB;AACrD,UAAM,QAAkB,CAAC;AACzB,QAAI,OAAO,SAAS,YAAY,QAAQ,GAAG;AACzC,YAAM,KAAK,SAAS,KAAK,MAAM,IAAI,CAAC,EAAE;AAAA,IACxC;AACA,QAAI,OAAO,SAAS,YAAY,OAAO,GAAG;AACxC,YAAM,KAAK,QAAQ,KAAK,MAAM,IAAI,CAAC,EAAE;AAAA,IACvC;AACA,WAAO,MAAM,KAAK,GAAG;AAAA,EACvB;AAAA,EAEA,gBAAgB,MAAsB;AACpC,WAAO,SAAS,IAAI;AAAA,EACtB;AAAA,EAEA,mBAAmB,MAA6B;AAC9C,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AAEH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEA,YAAY,OAA0B;AACpC,QAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,QAAI,iBAAiB,KAAM,QAAO;AAClC,QAAI,OAAO,SAAS,KAAK,EAAG,QAAO;AACnC,QAAI,OAAO,UAAU,WAAW;AAE9B,aAAO,KAAK,sBAAsB,QAAQ,QAAQ,IAAI;AAAA,IACxD;AACA,QAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAI,OAAO,UAAU,SAAU,QAAO;AAEtC,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AACF;AAEA,SAAS,YAAY,SAAkC;AACrD,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;AC3HO,SAAS,eACd,OACA,YACA,SACA,SACK;AACL,MAAI,CAAC,QAAS,QAAO,IAAI,IAAI;AAC7B,QAAM,UAAU,UAAU,OAAO;AACjC,MAAI,QAAQ,WAAW,EAAG,QAAO,IAAI,IAAI;AAEzC,QAAM,QAAQ,QAAQ,IAAI,CAAC,CAAC,WAAW,GAAG,MAAM;AAC9C,UAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS;AAC3D,QAAI,CAAC,SAAS,MAAM,SAAS,UAAU;AACrC,YAAM,IAAI;AAAA,QACR,iBAAiB,MAAM,IAAI,SAAS,SAAS;AAAA,MAC/C;AAAA,IACF;AACA,UAAM,MAAM,QAAQ,SAAS,YAAY,YAAY,KAAK,CAAC;AAC3D,WAAO,IAAI,IAAI,GAAG,GAAG,IAAI,QAAQ,SAAS,SAAS,KAAK,EAAE;AAAA,EAC5D,CAAC;AAED,SAAO,IAAI,KAAK,OAAO,IAAI;AAC7B;AAEA,SAAS,UAAU,SAA8C;AAC/D,QAAM,OAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AACxD,QAAM,MAA6B,CAAC;AACpC,aAAW,OAAO,MAAM;AACtB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,UAAI,UAAU,SAAS,UAAU,OAAQ,KAAI,KAAK,CAAC,KAAK,KAAK,CAAC;AAAA,IAChE;AAAA,EACF;AACA,SAAO;AACT;;;ACZO,SAAS,gBACd,QACA,OACA,OACkB;AAClB,MAAI,MAAM,SAAS,UAAU;AAC3B,UAAM,IAAI;AAAA,MACR,UAAU,MAAM,IAAI,IAAI,MAAM,IAAI;AAAA,IACpC;AAAA,EACF;AACA,QAAM,eAAe,UAAU,QAAQ,MAAM,IAAI;AACjD,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI;AAAA,MACR,aAAa,MAAM,IAAI,IAAI,MAAM,IAAI,8BAA8B,MAAM,IAAI;AAAA,IAC/E;AAAA,EACF;AAGA,MAAI,MAAM,UAAU,QAAQ,QAAQ;AAClC,UAAMC,cAAa,MAAM,SAAS;AAClC,UAAMC,YACJ,MAAM,SAAS,cAAc,SAAS,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AACvE,WAAO,MAAM,OAAO,OAAO,cAAcD,aAAYC,WAAU,IAAI;AAAA,EACrE;AAGA,QAAM,UAAU,iBAAiB,QAAQ,OAAO,OAAO,YAAY;AACnE,MAAI,SAAS,UAAU,QAAQ,QAAQ;AAErC,UAAMA,YAAW,QAAQ,SAAS;AAClC,UAAMD,cACJ,QAAQ,SAAS,cAAc,SAAS,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAClE,WAAO,MAAM,OAAO,OAAO,cAAcA,aAAYC,WAAU,KAAK;AAAA,EACtE;AAGA,QAAM,aAAa,SAAS,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AACpD,QAAM,WAAW,SAAS,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AACzD,SAAO,MAAM,OAAO,OAAO,cAAc,YAAY,UAAU,KAAK;AACtE;AAEA,SAAS,MACP,OACA,OACA,cACA,YACA,UACA,MACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,WAAW,IAAI,CAAC,MAAM,SAAS,OAAO,CAAC,CAAC;AAAA,IACrD,WAAW,SAAS,IAAI,CAAC,MAAM,SAAS,cAAc,CAAC,CAAC;AAAA,IACxD,QAAQ,MAAM;AAAA,IACd;AAAA,EACF;AACF;AAEA,SAAS,SAAS,OAAkB,WAA2B;AAC7D,QAAM,IAAI,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS;AACvD,MAAI,CAAC,GAAG;AACN,UAAM,IAAI;AAAA,MACR,UAAU,SAAS,yBAAyB,MAAM,IAAI;AAAA,IACxD;AAAA,EACF;AACA,SAAO,YAAY,CAAC;AACtB;AAEA,SAAS,iBACP,SACA,OACA,OACA,cACuB;AACvB,QAAM,aAAa,aAAa,OAAO;AAAA,IACrC,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,SAAS,MAAM;AAAA,EACjD;AACA,MAAI,MAAM,UAAU,MAAM;AACxB,UAAM,SAAS,WAAW;AAAA,MACxB,CAAC,MAAM,EAAE,UAAU,SAAS,MAAM,UAAU;AAAA,IAC9C;AACA,QAAI,OAAQ,QAAO;AAAA,EACrB;AAEA,QAAM,SAAS,WAAW,KAAK,CAAC,MAAM,EAAE,UAAU,QAAQ,MAAM;AAChE,SAAO,UAAU,WAAW,CAAC;AAC/B;;;ACrGA,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAOM,SAAS,aACd,OACA,YACA,OACA,KACK;AACL,MAAI,CAAC,SAAS,OAAO,KAAK,KAAK,EAAE,WAAW,EAAG,QAAO,IAAI,IAAI;AAC9D,QAAM,aAAoB,CAAC;AAE3B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,UAAU,OAAW;AAEzB,QAAI,QAAQ,OAAO;AACjB,iBAAW,KAAK,YAAY,QAAQ,KAAK,GAAG,OAAO,YAAY,KAAK,KAAK,CAAC;AAC1E;AAAA,IACF;AACA,QAAI,QAAQ,MAAM;AAChB,iBAAW,KAAK,YAAY,QAAQ,KAAK,GAAG,OAAO,YAAY,KAAK,IAAI,CAAC;AACzE;AAAA,IACF;AACA,QAAI,QAAQ,OAAO;AACjB,YAAM,QAAQ,YAAY,QAAQ,KAAK,GAAG,OAAO,YAAY,KAAK,KAAK;AACvE,UAAI,CAAC,MAAM,QAAQ,GAAG;AACpB,mBAAW,KAAK,IAAI,IAAI,EAAE,KAAK,OAAO,EAAE,OAAO,KAAK,EAAE,KAAK,GAAG,CAAC;AAAA,MACjE;AACA;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG;AACrD,QAAI,CAAC,OAAO;AACV,YAAM,IAAI;AAAA,QACR,kBAAkB,GAAG,+BAA+B,MAAM,IAAI;AAAA,MAChE;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,UAAU;AAC3B,iBAAW;AAAA,QACT,sBAAsB,OAAO,YAAY,OAAO,OAAO,GAAG;AAAA,MAC5D;AAAA,IACF,OAAO;AACL,iBAAW,KAAK,cAAc,YAAY,OAAO,OAAO,GAAG,CAAC;AAAA,IAC9D;AAAA,EACF;AAEA,QAAM,WAAW,WAAW,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC;AACtD,MAAI,SAAS,WAAW,EAAG,QAAO,IAAI,IAAI;AAC1C,SAAO,QAAQ,QAAQ;AACzB;AAEA,SAAS,YACP,MACA,OACA,YACA,KACA,IACK;AACL,QAAM,QAAQ,KACX,IAAI,CAAC,MAAM,aAAa,OAAO,YAAY,GAAG,GAAG,CAAC,EAClD,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC;AAC7B,MAAI,MAAM,WAAW,EAAG,QAAO,IAAI,IAAI;AACvC,MAAI,MAAM,WAAW,EAAG,QAAO,MAAM,CAAC;AACtC,QAAM,SAAS,IAAI;AAAA,IACjB,MAAM,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,KAAK,GAAG,EAAE,OAAO,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,IACxD,IAAI,EAAE;AAAA,EACR;AACA,SAAO,IAAI,IAAI,EAAE,KAAK,GAAG,EAAE,OAAO,MAAM,EAAE,KAAK,GAAG;AACpD;AAEA,SAAS,QAAQ,OAAmB;AAClC,MAAI,MAAM,WAAW,EAAG,QAAO,MAAM,CAAC;AACtC,QAAM,SAAS,IAAI;AAAA,IACjB,MAAM,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,KAAK,GAAG,EAAE,OAAO,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,IACxD;AAAA,EACF;AACA,SAAO,IAAI,IAAI,EAAE,KAAK,GAAG,EAAE,OAAO,MAAM,EAAE,KAAK,GAAG;AACpD;AAEA,SAAS,cACP,YACA,OACA,OACA,KACK;AACL,QAAM,MAAM,IAAI,QAAQ,SAAS,YAAY,YAAY,KAAK,CAAC;AAG/D,MAAI,MAAM,SAAS,UAAU,mBAAmB,KAAK,GAAG;AACtD,WAAO,kBAAkB,KAAK,OAAO,OAAkC,GAAG;AAAA,EAC5E;AAGA,MAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,QAAI,UAAU,KAAM,QAAO,IAAI,IAAI,GAAG,GAAG,UAAU;AACnD,WAAO,IAAI,IAAI,EAAE,KAAK,GAAG,GAAG,KAAK,EAAE,KAAK,IAAI,QAAQ,YAAY,KAAK,CAAC;AAAA,EACxE;AAEA,QAAM,SAAS;AACf,QAAM,cAAc,OAAO,SAAS;AACpC,QAAM,QAAe,CAAC;AAEtB,aAAW,CAAC,IAAI,OAAO,KAAK,OAAO,QAAQ,MAAM,GAAG;AAClD,QAAI,OAAO,OAAQ;AACnB,QAAI,YAAY,OAAW;AAC3B,UAAM,KAAK,gBAAgB,KAAK,IAAI,SAAS,aAAa,GAAG,CAAC;AAAA,EAChE;AACA,MAAI,MAAM,WAAW,EAAG,QAAO,IAAI,IAAI;AACvC,SAAO,QAAQ,KAAK;AACtB;AAEA,IAAM,iBAAiB,oBAAI,IAAI;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,mBAAmB,OAAyB;AACnD,SACE,cAAc,KAAK,KACnB,OAAO,KAAK,KAAK,EAAE,KAAK,CAAC,MAAM,eAAe,IAAI,CAAC,CAAC;AAExD;AAQA,SAAS,kBACP,KACA,OACA,QACA,KACK;AACL,QAAM,QAAe,CAAC;AACtB,aAAW,CAAC,IAAI,GAAG,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC9C,QAAI,QAAQ,OAAW;AACvB,YAAQ,IAAI;AAAA,MACV,KAAK;AACH,cAAM,IAAI;AAAA,UACR,uFACa,MAAM,IAAI;AAAA,QACzB;AAAA,MACF,KAAK;AACH,cAAM;AAAA,UACJ,QAAQ,OACJ,IAAI,IAAI,GAAG,GAAG,UAAU,IACxB,IAAI,IAAI,EAAE,KAAK,GAAG,GAAG,KAAK,EAAE,KAAK,SAAS,GAAG,CAAC;AAAA,QACpD;AACA;AAAA,MACF,KAAK;AACH,cAAM;AAAA,UACJ,QAAQ,OACJ,IAAI,IAAI,GAAG,GAAG,cAAc,IAC5B,IAAI,IAAI,EAAE,KAAK,GAAG,GAAG,MAAM,EAAE,KAAK,SAAS,GAAG,CAAC;AAAA,QACrD;AACA;AAAA,MACF,KAAK;AACH,cAAM,KAAK,SAAS,KAAK,IAAI,WAAW,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC;AACxD;AAAA,MACF,KAAK;AACH,cAAM,KAAK,SAAS,KAAK,GAAG,WAAW,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC;AACvD;AAAA,MACF,KAAK;AACH,cAAM,KAAK,SAAS,KAAK,IAAI,WAAW,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC;AACvD;AAAA,MACF;AACE,cAAM,IAAI,qBAAqB,qCAAqC,EAAE,IAAI;AAAA,IAC9E;AAAA,EACF;AACA,SAAO,MAAM,SAAS,QAAQ,KAAK,IAAI,IAAI,IAAI;AACjD;AAEA,SAAS,SAAS,OAAwB;AACxC,SAAO,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,KAAK;AACjE;AAEA,SAAS,SAAS,KAAa,SAAsB;AACnD,SAAO,IAAI,IAAI,EAAE,KAAK,GAAG,GAAG,QAAQ,EAAE,KAAK,OAAO,EAAE,KAAK,cAAc;AACzE;AAEA,SAAS,gBACP,KACA,IACA,OACA,aACA,KACK;AACL,QAAM,IAAI,IAAI;AACd,QAAM,QAAQ,CAAC,MAAe,EAAE,YAAY,CAAC;AAC7C,QAAM,MAAM,cAAc,EAAE,gBAAgB,GAAG,IAAI;AACnD,QAAM,MAAM,CAAC,MACX,eAAe,OAAO,MAAM,WACxB,IAAI,IAAI,EAAE,KAAK,QAAQ,EAAE,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG,IAChD,IAAI,MAAM,MAAM,CAAC,CAAC;AAExB,UAAQ,IAAI;AAAA,IACV,KAAK;AACH,UAAI,UAAU,KAAM,QAAO,IAAI,IAAI,GAAG,GAAG,UAAU;AACnD,aAAO,IAAI,IAAI,EAAE,KAAK,GAAG,GAAG,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC;AAAA,IACtD,KAAK;AACH,UAAI,UAAU,KAAM,QAAO,IAAI,IAAI,GAAG,GAAG,cAAc;AACvD,UAAI,eAAe,KAAK,GAAG;AACzB,cAAM,QAAQ,qBAAqB,KAAK,OAAuB,aAAa,GAAG;AAC/E,eAAO,IAAI,IAAI,EAAE,KAAK,OAAO,EAAE,OAAO,KAAK,EAAE,KAAK,GAAG;AAAA,MACvD;AACA,aAAO,IAAI,IAAI,EAAE,KAAK,GAAG,GAAG,MAAM,EAAE,OAAO,IAAI,KAAK,CAAC;AAAA,IACvD,KAAK;AACH,aAAO,SAAS,KAAK,eAAe,KAAK,GAAG,aAAa,KAAK,KAAK;AAAA,IACrE,KAAK;AACH,aAAO,SAAS,KAAK,eAAe,KAAK,GAAG,aAAa,KAAK,IAAI;AAAA,IACpE,KAAK;AACH,aAAO,IAAI,IAAI,EAAE,KAAK,GAAG,GAAG,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC;AAAA,IACtD,KAAK;AACH,aAAO,IAAI,IAAI,EAAE,KAAK,GAAG,GAAG,MAAM,EAAE,OAAO,IAAI,KAAK,CAAC;AAAA,IACvD,KAAK;AACH,aAAO,IAAI,IAAI,EAAE,KAAK,GAAG,GAAG,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC;AAAA,IACtD,KAAK;AACH,aAAO,IAAI,IAAI,EAAE,KAAK,GAAG,GAAG,MAAM,EAAE,OAAO,IAAI,KAAK,CAAC;AAAA,IACvD,KAAK;AACH,aAAO,WAAW,KAAK,IAAI,WAAW,OAAO,KAAK,CAAC,CAAC,KAAK,WAAW;AAAA,IACtE,KAAK;AACH,aAAO,WAAW,KAAK,GAAG,WAAW,OAAO,KAAK,CAAC,CAAC,KAAK,WAAW;AAAA,IACrE,KAAK;AACH,aAAO,WAAW,KAAK,IAAI,WAAW,OAAO,KAAK,CAAC,CAAC,IAAI,WAAW;AAAA,IACrE;AACE,YAAM,IAAI,qBAAqB,gCAAgC,EAAE,IAAI;AAAA,EACzE;AACF;AAEA,SAAS,qBACP,KACA,QACA,aACA,KACK;AACL,QAAM,QAAe,CAAC;AACtB,aAAW,CAAC,IAAI,OAAO,KAAK,OAAO,QAAQ,MAAM,GAAG;AAClD,QAAI,OAAO,UAAU,YAAY,OAAW;AAC5C,UAAM,KAAK,gBAAgB,KAAK,IAAI,SAAS,aAAa,GAAG,CAAC;AAAA,EAChE;AACA,SAAO,MAAM,SAAS,QAAQ,KAAK,IAAI,IAAI,IAAI;AACjD;AAEA,SAAS,SACP,KACA,QACA,aACA,KACA,QACK;AACL,MAAI,OAAO,WAAW,GAAG;AAEvB,WAAO,IAAI,IAAI,SAAS,UAAU,OAAO;AAAA,EAC3C;AACA,QAAM,UAAU,OAAO;AAAA,IAAI,CAAC,MAC1B,eAAe,OAAO,MAAM,WACxB,OAAO,CAAC,EAAE,YAAY,IACtB,IAAI,QAAQ,YAAY,CAAC;AAAA,EAC/B;AACA,QAAM,MAAM,IAAI,IAAI,EAAE,KAAK,GAAG,GAAG,IAAI,SAAS,WAAW,IAAI,IAAI;AACjE,MAAI,SAAS,OAAO;AACpB,MAAI,KAAK,GAAG;AACZ,SAAO;AACT;AAEA,SAAS,WAAW,KAAa,SAAiB,aAA2B;AAC3E,QAAM,QAAQ,cAAc,QAAQ,YAAY,IAAI;AACpD,SAAO,IAAI,IAAI,EAAE,KAAK,GAAG,GAAG,QAAQ,EAAE,KAAK,KAAK,EAAE,KAAK,cAAc;AACvE;AAEA,SAAS,sBACP,OACA,YACA,OACA,OACA,KACK;AACL,QAAM,MAAM,gBAAgB,IAAI,QAAQ,OAAO,KAAK;AACpD,QAAM,SAAU,cAAc,KAAK,IAAI,QAAQ,CAAC;AAGhD,QAAM,cACJ,UAAU,UAAU,WAAW,UAAU,UAAU,UACnD,QAAQ,UAAU,WAAW;AAE/B,MAAI,CAAC,IAAI,UAAU,CAAC,aAAa;AAC/B,WAAO,aAAa,OAAO,YAAY,KAAK,OAAqB,KAAK,KAAK;AAAA,EAC7E;AAEA,QAAM,QAAe,CAAC;AACtB,MAAI,OAAO,SAAS,QAAW;AAC7B,UAAM,KAAK,aAAa,OAAO,YAAY,KAAK,OAAO,QAAQ,CAAC,GAAG,KAAK,KAAK,CAAC;AAAA,EAChF;AACA,MAAI,OAAO,SAAS,QAAW;AAC7B,UAAM,KAAK,aAAa,OAAO,YAAY,KAAK,OAAO,QAAQ,CAAC,GAAG,KAAK,IAAI,CAAC;AAAA,EAC/E;AACA,MAAI,OAAO,UAAU,QAAW;AAE9B,UAAM;AAAA,MACJ,aAAa,OAAO,YAAY,KAAK,OAAO,SAAS,CAAC,GAAG,KAAK,MAAM,IAAI;AAAA,IAC1E;AAAA,EACF;AACA,MAAI,OAAO,OAAO,QAAW;AAC3B,QAAI,OAAO,OAAO,MAAM;AACtB,YAAM,KAAK,UAAU,OAAO,YAAY,KAAK,CAAC,GAAG,GAAG,CAAC;AAAA,IACvD,OAAO;AACL,YAAM,KAAK,aAAa,OAAO,YAAY,KAAK,OAAO,IAAI,KAAK,KAAK,CAAC;AAAA,IACxE;AAAA,EACF;AACA,MAAI,OAAO,UAAU,QAAW;AAC9B,QAAI,OAAO,UAAU,MAAM;AACzB,YAAM,KAAK,aAAa,OAAO,YAAY,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC;AAAA,IACjE,OAAO;AACL,YAAM,KAAK,aAAa,OAAO,YAAY,KAAK,OAAO,OAAO,KAAK,IAAI,CAAC;AAAA,IAC1E;AAAA,EACF;AACA,SAAO,MAAM,SAAS,QAAQ,KAAK,IAAI,IAAI,IAAI;AACjD;AAEA,SAAS,UACP,OACA,YACA,KACA,KACA,KACK;AACL,SAAO,aAAa,OAAO,YAAY,KAAK,KAAK,KAAK,IAAI;AAC5D;AAMA,SAAS,aACP,QACA,YACA,KACA,KACA,KACA,QACA,YAAY,OACP;AACL,QAAM,aAAa,IAAI,IAAI,MAAM,MAAM;AACvC,QAAM,aAAa,IAAI,QAAQ,QAAQ,WAAW,IAAI,YAAY,CAAC;AACnE,QAAM,MAAM,IAAI,IAAI;AACpB,MAAI,KAAK,GAAG,SAAS,eAAe,QAAQ,mBAAmB,UAAU,IAAI,IAAI,QAAQ,QAAQ,UAAU,CAAC,SAAS;AAErH,QAAM,QAAQ,IAAI,YAAY,IAAI,CAAC,SAAS,MAAM;AAChD,UAAM,QAAQ,IAAI,UAAU,CAAC;AAC7B,WAAO,GAAG,IAAI,QAAQ,SAAS,YAAY,KAAK,CAAC,MAAM,IAAI,QAAQ,SAAS,YAAY,OAAO,CAAC;AAAA,EAClG,CAAC;AACD,MAAI,KAAK,MAAM,KAAK,OAAO,CAAC;AAE5B,QAAM,SAAS,aAAa,IAAI,cAAc,YAAY,KAAK,GAAG;AAClE,MAAI,CAAC,OAAO,QAAQ,GAAG;AACrB,QAAI,WAAW;AACb,UAAI,KAAK,YAAY,EAAE,OAAO,MAAM,EAAE,KAAK,GAAG;AAAA,IAChD,OAAO;AACL,UAAI,KAAK,OAAO,EAAE,OAAO,MAAM;AAAA,IACjC;AAAA,EACF;AACA,MAAI,KAAK,GAAG;AACZ,SAAO;AACT;AAIA,SAAS,eAAe,OAAyB;AAC/C,MAAI,CAAC,cAAc,KAAK,EAAG,QAAO;AAClC,SAAO,OAAO,KAAK,KAAK,EAAE,KAAK,CAAC,MAAM,iBAAiB,IAAI,CAAC,CAAC;AAC/D;AAEA,SAAS,QAAQ,OAA8B;AAC7C,QAAM,OAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAClD,SAAO,KAAK;AAAA,IACV,CAAC,MAAuB,MAAM,QAAQ,OAAO,MAAM;AAAA,EACrD;AACF;AAEA,SAAS,eAAe,OAA2B;AACjD,SAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAC9C;AAEA,SAAS,WAAW,OAAuB;AACzC,SAAO,MAAM,QAAQ,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;AACjD;;;ACraA,IAAM,SAAiC;AAAA,EACrC,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR;AAEA,IAAM,cAAsC;AAAA,EAC1C,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AACP;AAUO,SAAS,cACd,OACA,OACA,QACA,KACK;AACL,MAAI,CAAC,UAAU,OAAO,KAAK,MAAM,EAAE,WAAW,EAAG,QAAO,IAAI,IAAI;AAChE,QAAM,QAAe,CAAC;AAEtB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,UAAU,OAAW;AAEzB,QAAI,QAAQ,SAAS,QAAQ,MAAM;AACjC,YAAM,OAAQ,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AACnD,YAAM,WAAW,KACd,IAAI,CAAC,MAAM,cAAc,OAAO,OAAO,GAAG,GAAG,CAAC,EAC9C,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC;AAC7B,UAAI,SAAS,OAAQ,OAAM,KAAK,SAAS,UAAU,GAAG,CAAC;AACvD;AAAA,IACF;AACA,QAAI,QAAQ,OAAO;AACjB,YAAM,QAAQ,cAAc,OAAO,OAAO,OAAqB,GAAG;AAClE,UAAI,CAAC,MAAM,QAAQ,EAAG,OAAM,KAAK,IAAI,IAAI,EAAE,KAAK,OAAO,EAAE,OAAO,KAAK,EAAE,KAAK,GAAG,CAAC;AAChF;AAAA,IACF;AAGA,QAAI,OAAO,QAAQ;AACjB,YAAM,KAAK,GAAG,oBAAoB,OAAO,OAAO,KAAK,OAAO,GAAG,CAAC;AAChE;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,SAAS,QAAQ;AAC5E,QAAI,CAAC,OAAO;AACV,YAAM,IAAI;AAAA,QACR,yBAAyB,MAAM,IAAI,IAAI,GAAG;AAAA,MAC5C;AAAA,IACF;AAEA,QAAI,mBAAmB,KAAK,GAAG;AAC7B,YAAM,MAAM,IAAI,QAAQ,SAAS,OAAO,YAAY,KAAK,CAAC;AAC1D,iBAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,KAAgC,GAAG;AAC5E,YAAI,EAAE,OAAO,QAAS;AACtB,cAAM,KAAK,WAAW,GAAG,OAAO,GAAG,CAAC,IAAI,GAAG,KAAK,QAAQ,IAAI,OAAO,CAAC;AAAA,MACtE;AAAA,IACF,OAAO;AAEL,YAAM,OAAO,aAAa,OAAO,OAAO,EAAE,CAAC,GAAG,GAAG,MAAM,GAAG,GAAG;AAC7D,UAAI,CAAC,KAAK,QAAQ,EAAG,OAAM,KAAK,IAAI;AAAA,IACtC;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC;AACjD,MAAI,SAAS,WAAW,EAAG,QAAO,IAAI,IAAI;AAC1C,SAAO,SAAS,UAAU,KAAK;AACjC;AAEA,SAAS,oBACP,OACA,OACA,KACA,MACA,KACO;AACP,MAAI,CAAC,cAAc,IAAI,EAAG,QAAO,CAAC;AAClC,QAAM,MAAa,CAAC;AACpB,aAAW,CAAC,WAAW,MAAM,KAAK,OAAO,QAAQ,IAAI,GAAG;AACtD,UAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,SAAS,QAAQ;AAClF,QAAI,CAAC,MAAO;AACZ,UAAM,MAAM,IAAI,QAAQ,SAAS,OAAO,YAAY,KAAK,CAAC;AAC1D,QAAI,KAAK,WAAW,GAAG,OAAO,GAAG,CAAC,IAAI,GAAG,KAAK,QAAQ,IAAI,OAAO,CAAC;AAAA,EACpE;AACA,SAAO;AACT;AAEA,SAAS,WAAW,KAAa,QAAiB,SAA0B;AAC1E,MAAI,CAAC,cAAc,MAAM,GAAG;AAC1B,WAAO,IAAI,IAAI,EAAE,KAAK,GAAG,GAAG,KAAK,EAAE,KAAK,QAAQ,YAAY,MAAM,CAAC;AAAA,EACrE;AACA,QAAM,QAAe,CAAC;AACtB,aAAW,CAAC,IAAI,CAAC,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC5C,UAAM,QAAQ,YAAY,EAAE;AAC5B,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,qBAAqB,gCAAgC,EAAE,IAAI;AAAA,IACvE;AACA,UAAM,KAAK,IAAI,IAAI,EAAE,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,EAAE,KAAK,QAAQ,YAAY,CAAC,CAAC,CAAC;AAAA,EAC5E;AACA,SAAO,MAAM,WAAW,IAAI,MAAM,CAAC,IAAK,SAAS,OAAO,KAAK;AAC/D;AAEA,SAAS,mBAAmB,OAAyB;AACnD,SAAO,cAAc,KAAK,KAAK,OAAO,KAAK,KAAK,EAAE,KAAK,CAAC,MAAM,KAAK,MAAM;AAC3E;AAEA,SAAS,SAAS,OAAc,IAAuB;AACrD,MAAI,MAAM,WAAW,EAAG,QAAO,MAAM,CAAC;AACtC,QAAM,SAAS,IAAI;AAAA,IACjB,MAAM,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,KAAK,GAAG,EAAE,OAAO,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,IACxD,IAAI,EAAE;AAAA,EACR;AACA,SAAO,IAAI,IAAI,EAAE,KAAK,GAAG,EAAE,OAAO,MAAM,EAAE,KAAK,GAAG;AACpD;;;ACtGO,SAAS,eACd,QAC2B;AAC3B,QAAM,MAAM,oBAAI,IAA0B;AAC1C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAQ,KAAI,IAAI,KAAK,EAAE,MAAM,OAAO,MAAM,CAAC;AACtE,SAAO;AACT;AAEA,IAAM,aAAa;AAEZ,SAAS,WACd,QACA,SACgB;AAChB,SAAO,EAAE,QAAQ,SAAS,OAAO,EAAE,MAAM,EAAE,EAAE;AAC/C;AAUO,SAAS,gBACd,OACA,SACA,YACA,KACiB;AACjB,QAAM,IAAI,IAAI;AACd,QAAM,OAAO,WAAW;AAAA,IACtB,CAAC,MACC,GAAG,EAAE,SAAS,YAAY,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC;AAAA,EACrE;AACA,QAAM,MAAM,IAAI,IAAI;AACpB,QAAM,aAAa,EAAE,iBAAiB,QAAQ,MAAM,QAAQ,IAAI;AAChE,MAAI,KAAK,aAAa,UAAU,UAAU,MAAM,SAAS;AACzD,MAAI,KAAK,KAAK,KAAK,IAAI,CAAC;AACxB,MAAI,KAAK,SAAS,EAAE,QAAQ,WAAW,KAAK,CAAC,CAAC,IAAI,EAAE,QAAQ,UAAU,CAAC,EAAE;AAEzE,cAAY,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC1C,QAAM,QAAQ,eAAe,OAAO,YAAY,QAAQ,SAAS,CAAC;AAClE,MAAI,CAAC,MAAM,QAAQ,EAAG,KAAI,KAAK,YAAY,EAAE,OAAO,KAAK;AAEzD,SAAO,EAAE,KAAK,SAAS,WAAW;AACpC;AAYO,SAAS,wBACd,OACA,SACA,YACA,gBACA,KACiB;AACjB,QAAM,IAAI,IAAI;AACd,QAAM,aAAa,QAAQ,UACvB,eAAe,OAAO,YAAY,QAAQ,SAAS,CAAC,IACpD,aAAa,OAAO,CAAC;AACzB,QAAM,cAAc,eACjB,IAAI,CAAC,MAAM,EAAE,SAAS,YAAY,YAAY,CAAC,CAAC,CAAC,EACjD,KAAK,IAAI;AAEZ,QAAM,QAAQ,IAAI,IAAI;AACtB,QAAM,YAAY,WAAW;AAAA,IAC3B,CAAC,MAAM,GAAG,EAAE,SAAS,YAAY,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC;AAAA,EAC1E;AACA,QAAM,KAAK,UAAU,UAAU,KAAK,IAAI,CAAC,qCAAqC,WAAW,YAAY;AACrG,QAAM,OAAO,UAAU;AACvB,QAAM,KAAK,QAAQ,EAAE,QAAQ,MAAM,CAAC,EAAE;AACtC,QAAM,KAAK,SAAS,EAAE,QAAQ,WAAW,KAAK,CAAC,CAAC,IAAI,EAAE,QAAQ,UAAU,CAAC,EAAE;AAC3E,cAAY,OAAO,OAAO,QAAQ,OAAO,GAAG;AAE5C,QAAM,MAAM,IAAI,IAAI;AACpB,QAAM,aAAa,EAAE,iBAAiB,QAAQ,MAAM,QAAQ,IAAI;AAChE,QAAM,MAAM;AACZ,QAAM,YAAY,WACf,IAAI,CAAC,MAAM,GAAG,EAAE,SAAS,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,EAC/D,KAAK,IAAI;AACZ,MAAI,KAAK,aAAa,UAAU,UAAU,MAAM,SAAS;AACzD,MAAI,KAAK,SAAS;AAClB,MAAI,KAAK,SAAS,EAAE,OAAO,KAAK,EAAE,KAAK,KAAK,EAAE,QAAQ,GAAG,CAAC,EAAE;AAC5D,MAAI,KAAK,UAAU,EAAE,SAAS,KAAK,MAAM,CAAC,MAAM;AAGhD,QAAM,aAAa,aAAa,OAAO,KAAK,QAAQ,SAAS,CAAC;AAC9D,MAAI,CAAC,WAAW,QAAQ,EAAG,KAAI,KAAK,YAAY,EAAE,OAAO,UAAU;AAEnE,SAAO,EAAE,KAAK,SAAS,WAAW;AACpC;AAGO,SAAS,aACd,OACA,OACA,KACA,YACK;AACL,QAAM,IAAI,IAAI;AACd,QAAM,MAAM,IAAI,IAAI;AACpB,QAAM,SAAS,aACX,EAAE,iBAAiB,WAAW,MAAM,WAAW,IAAI,IACnD;AACJ,MAAI,KAAK,SAAS,UAAU,MAAM,0BAA0B,6BAA6B;AACzF,MAAI,KAAK,SAAS,EAAE,QAAQ,WAAW,KAAK,CAAC,CAAC,IAAI,EAAE,QAAQ,UAAU,CAAC,EAAE;AACzE,cAAY,KAAK,OAAO,OAAO,GAAG;AAClC,SAAO;AACT;AAGO,SAAS,iBACd,OACA,MACA,KACK;AACL,QAAM,IAAI,IAAI;AACd,QAAM,UAAU,oBAAoB,OAAO,MAAM,CAAC;AAClD,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,IAAI,qBAAqB,2CAA2C;AAAA,EAC5E;AACA,QAAM,MAAM,IAAI,IAAI;AACpB,MAAI,KAAK,UAAU,QAAQ,KAAK,IAAI,CAAC,EAAE;AACvC,MAAI,KAAK,SAAS,EAAE,QAAQ,WAAW,KAAK,CAAC,CAAC,IAAI,EAAE,QAAQ,UAAU,CAAC,EAAE;AACzE,cAAY,KAAK,OAAO,KAAK,OAAO,GAAG;AACvC,SAAO;AACT;AAGO,SAAS,eACd,OACA,MACA,KACyC;AACzC,QAAM,IAAI,IAAI;AACd,QAAM,eAAe,KAAK,GAAG,IAAI,CAAC,SAAS,cAAc,OAAO,IAAI,CAAC;AACrE,QAAM,eAAe,aAAa;AAAA,IAChC,CAAC,MAAM,GAAG,EAAE,SAAS,YAAY,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC;AAAA,EAC1E;AACA,QAAM,aAAa,oBAAoB,OAAO,MAAM,CAAC;AAErD,QAAM,MAAM,IAAI,IAAI;AACpB,MAAI,KAAK,UAAU,CAAC,GAAG,cAAc,GAAG,UAAU,EAAE,KAAK,IAAI,CAAC,EAAE;AAChE,MAAI,KAAK,SAAS,EAAE,QAAQ,WAAW,KAAK,CAAC,CAAC,IAAI,EAAE,QAAQ,UAAU,CAAC,EAAE;AACzE,cAAY,KAAK,OAAO,KAAK,OAAO,GAAG;AACvC,MAAI;AAAA,IACF,aAAa,aACV,IAAI,CAAC,MAAM,EAAE,SAAS,YAAY,YAAY,CAAC,CAAC,CAAC,EACjD,KAAK,IAAI,CAAC;AAAA,EACf;AAEA,QAAM,SAAS,cAAc,OAAO,YAAY,KAAK,QAAQ,GAAG;AAChE,MAAI,CAAC,OAAO,QAAQ,EAAG,KAAI,KAAK,UAAU,EAAE,OAAO,MAAM;AAEzD,QAAM,QAAQ,eAAe,OAAO,YAAY,KAAK,SAAS,CAAC;AAC/D,MAAI,CAAC,MAAM,QAAQ,EAAG,KAAI,KAAK,YAAY,EAAE,OAAO,KAAK;AACzD,SAAO,EAAE,KAAK,aAAa;AAC7B;AAGO,SAAS,cACd,OACA,KACA,KACA,WACiB;AACjB,QAAM,IAAI,IAAI;AACd,QAAM,MAAM,IAAI,IAAI;AACpB,QAAM,UAAU,CAAC,GAAG,IAAI,KAAK,CAAC;AAC9B,MAAI,KAAK,eAAe,EAAE,QAAQ,WAAW,KAAK,CAAC,CAAC,IAAI;AACxD,MAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AACpD,MAAI,KAAK,YAAY;AACrB,MAAI,SAAS,QAAQ,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAE,CAAC;AAC5C,MAAI,KAAK,GAAG;AACZ,kBAAgB,KAAK,GAAG,SAAS;AACjC,SAAO,EAAE,KAAK,SAAS,UAAU;AACnC;AAGO,SAAS,cACd,OACA,OACA,aACA,KACA,WACiB;AACjB,QAAM,IAAI,IAAI;AACd,MAAI,YAAY,SAAS,GAAG;AAC1B,UAAM,IAAI,qBAAqB,4CAA4C;AAAA,EAC7E;AACA,QAAM,MAAM,IAAI,IAAI;AACpB,MAAI,KAAK,UAAU,EAAE,QAAQ,WAAW,KAAK,CAAC,CAAC,IAAI,EAAE,QAAQ,UAAU,CAAC,OAAO;AAC/E,QAAM,OAAO,CAAC,GAAG,YAAY,KAAK,CAAC;AACnC,OAAK,QAAQ,CAAC,KAAK,MAAM;AACvB,QAAI,IAAI,EAAG,KAAI,KAAK,IAAI;AACxB,UAAM,aAAa,YAAY,IAAI,GAAG;AACtC,UAAM,SAAS,EAAE,QAAQ,GAAG;AAC5B,QAAI,WAAW,SAAS,SAAS;AAC/B,UAAI,KAAK,GAAG,MAAM,MAAM,MAAM,IAAI,WAAW,EAAE,GAAG,EAAE,KAAK,WAAW,KAAK;AAAA,IAC3E,OAAO;AACL,UAAI,KAAK,GAAG,MAAM,KAAK,EAAE,KAAK,WAAW,KAAK;AAAA,IAChD;AAAA,EACF,CAAC;AACD,cAAY,KAAK,OAAO,OAAO,GAAG;AAClC,MAAI,UAAW,iBAAgB,KAAK,GAAG,SAAS;AAChD,SAAO,EAAE,KAAK,SAAS,aAAa,CAAC,EAAE;AACzC;AAGO,SAAS,cACd,OACA,OACA,KACA,WACiB;AACjB,QAAM,IAAI,IAAI;AACd,QAAM,MAAM,IAAI,IAAI;AACpB,MAAI;AAAA,IACF,eAAe,EAAE,QAAQ,WAAW,KAAK,CAAC,CAAC,IAAI,EAAE,QAAQ,UAAU,CAAC;AAAA,EACtE;AACA,cAAY,KAAK,OAAO,OAAO,GAAG;AAClC,MAAI,UAAW,iBAAgB,KAAK,GAAG,SAAS;AAChD,SAAO,EAAE,KAAK,SAAS,aAAa,CAAC,EAAE;AACzC;AAIA,SAAS,YACP,KACA,OACA,OACA,KACM;AACN,QAAM,WAAW,aAAa,OAAO,YAAY,OAAO,GAAG;AAC3D,MAAI,CAAC,SAAS,QAAQ,EAAG,KAAI,KAAK,SAAS,EAAE,OAAO,QAAQ;AAC9D;AAGA,SAAS,aAAa,OAAkB,GAAoB;AAC1D,QAAM,MAAM,SAAS,KAAK;AAC1B,QAAM,QAAQ,IAAI,SAAS,MAAM,MAAM,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ,GAC5E,IAAI,CAAC,MAAM,GAAG,EAAE,SAAS,YAAY,YAAY,CAAC,CAAC,CAAC,MAAM;AAC7D,SAAO,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC;AAChC;AAGA,SAAS,aACP,OACA,OACA,SACA,GACK;AACL,MAAI,CAAC,QAAS,QAAO,IAAI,IAAI;AAC7B,QAAM,OAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AACxD,QAAM,QAAe,CAAC;AACtB,aAAW,OAAO,MAAM;AACtB,eAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC7C,UAAI,QAAQ,SAAS,QAAQ,OAAQ;AACrC,UAAI,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,SAAS,QAAQ,GAAG;AACrE;AAAA,MACF;AACA,YAAM;AAAA,QACJ,IAAI,IAAI,GAAG,EAAE,SAAS,OAAO,IAAI,CAAC,IAAK,QAAsB,SAAS,SAAS,KAAK,EAAE;AAAA,MACxF;AAAA,IACF;AAAA,EACF;AACA,SAAO,IAAI,KAAK,OAAO,IAAI;AAC7B;AAEA,SAAS,gBAAgB,KAAU,GAAe,WAA8B;AAC9E,MAAI,UAAU,WAAW,EAAG;AAC5B,MAAI,KAAK,aAAa;AACtB,MAAI;AAAA,IACF,UACG,IAAI,CAAC,MAAM,GAAG,EAAE,QAAQ,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,EACjE,KAAK,IAAI;AAAA,EACd;AACF;AAEA,SAAS,oBACP,OACA,MACA,GACU;AACV,QAAM,MAAgB,CAAC;AACvB,MAAI,KAAK,QAAQ;AACf,QAAI,KAAK,WAAW,MAAM;AACxB,UAAI,KAAK,0BAA0B;AAAA,IACrC,OAAO;AACL,iBAAW,SAAS,SAAS,KAAK,MAAM,GAAG;AACzC,cAAM,MAAM,EAAE,SAAS,YAAY,YAAY,cAAc,OAAO,KAAK,CAAC,CAAC;AAC3E,YAAI,KAAK,SAAS,GAAG,QAAQ,EAAE,QAAQ,UAAU,KAAK,EAAE,CAAC,EAAE;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AACA,UAAQ,KAAK,OAAO,QAAQ,OAAO,KAAK,MAAM,CAAC;AAC/C,UAAQ,KAAK,OAAO,QAAQ,OAAO,KAAK,MAAM,CAAC;AAC/C,UAAQ,KAAK,OAAO,QAAQ,OAAO,KAAK,MAAM,CAAC;AAC/C,UAAQ,KAAK,OAAO,QAAQ,OAAO,KAAK,MAAM,CAAC;AAC/C,SAAO;AACT;AAEA,SAAS,QACP,KACA,IACA,QACA,OACA,MACA,GACM;AACN,MAAI,CAAC,KAAM;AACX,aAAW,SAAS,SAAS,IAAI,GAAG;AAClC,UAAM,MAAM,EAAE,SAAS,YAAY,YAAY,cAAc,OAAO,KAAK,CAAC,CAAC;AAC3E,QAAI,KAAK,GAAG,EAAE,IAAI,GAAG,QAAQ,EAAE,QAAQ,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC,EAAE;AAAA,EAChE;AACF;AAEA,SAAS,SAAS,MAAyC;AACzD,SAAO,OAAO,QAAQ,IAAI,EACvB,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM,IAAI,EAC5B,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AACnB;AAEA,SAAS,cAAc,OAAkB,MAAyB;AAChE,QAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACtD,MAAI,CAAC,SAAS,MAAM,SAAS,UAAU;AACrC,UAAM,IAAI;AAAA,MACR,IAAI,IAAI,qCAAqC,MAAM,IAAI;AAAA,IACzD;AAAA,EACF;AACA,SAAO;AACT;;;AC7WO,SAAS,aAAa,OAAgB,OAA2B;AACtE,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAElD,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,UAAU,KAAK;AAAA,IACxB,KAAK;AACH,aAAO,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;AAAA,IACzD,KAAK;AACH,aAAO,OAAO,UAAU,WAAW,QAAQ,OAAO,OAAO,KAAK,CAAC;AAAA,IACjE,KAAK;AAAA,IACL,KAAK;AACH,aAAO,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;AAAA,IACzD,KAAK;AACH,aAAO,iBAAiB,OAAO,QAAQ,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,IAC/D,KAAK;AACH,aAAO,UAAU,KAAK;AAAA,IACxB,KAAK;AACH,aAAO,OAAO,SAAS,KAAK,IAAI,QAAQ,OAAO,KAAK,OAAO,KAAK,CAAC;AAAA,IACnE,KAAK;AAAA,IACL;AACE,aAAO,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAK;AAAA,EAC3D;AACF;AAGO,SAAS,UACd,KACA,QACyB;AACzB,QAAM,MAA+B,CAAC;AACtC,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,QAAQ,KAAK;AACrB,UAAI,MAAM,IAAI,IAAI,aAAa,IAAI,MAAM,IAAI,GAAG,KAAK;AAAA,IACvD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,UAAU,OAAyB;AAC1C,MAAI,OAAO,UAAU,UAAW,QAAO;AACvC,MAAI,OAAO,UAAU,SAAU,QAAO,UAAU;AAChD,QAAM,IAAI,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY;AAC3C,SAAO,MAAM,OAAO,MAAM,OAAO,MAAM,UAAU,MAAM;AACzD;AAEA,SAAS,UAAU,OAAyB;AAC1C,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI;AACF,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC5DA,yBAA2B;AAWpB,SAAS,oBACd,OACA,MACyB;AACzB,QAAM,MAA+B,EAAE,GAAG,KAAK;AAC/C,aAAW,SAAS,MAAM,QAAQ;AAChC,QAAI,MAAM,SAAS,SAAU;AAE7B,QAAI,MAAM,eAAe,IAAI,MAAM,IAAI,MAAM,QAAW;AACtD,UAAI,MAAM,IAAI,IAAI,oBAAI,KAAK;AAC3B;AAAA,IACF;AACA,QAAI,IAAI,MAAM,IAAI,MAAM,OAAW;AAEnC,UAAM,MAAM,MAAM;AAClB,QAAI,CAAC,IAAK;AAEV,QAAI,IAAI,UAAU;AAChB,YAAM,WAAW,uBAAuB,IAAI,SAAS,IAAI;AACzD,UAAI,aAAa,KAAM,KAAI,MAAM,IAAI,IAAI;AACzC;AAAA,IACF;AACA,QAAI,IAAI,YAAY,QAAW;AAC7B,UAAI,MAAM,IAAI,IAAI,IAAI;AAAA,IACxB;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,oBACd,OACA,MACyB;AACzB,QAAM,MAA+B,EAAE,GAAG,KAAK;AAC/C,aAAW,SAAS,MAAM,QAAQ;AAChC,QAAI,MAAM,eAAe,IAAI,MAAM,IAAI,MAAM,QAAW;AACtD,UAAI,MAAM,IAAI,IAAI,oBAAI,KAAK;AAAA,IAC7B;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,OAAO,uBAAO,cAAc;AAElC,SAAS,uBAAuB,MAAuB;AACrD,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,oBAAI,KAAK;AAAA,IAClB,KAAK;AACH,iBAAO,+BAAW;AAAA,IACpB,KAAK;AACH,aAAO,aAAa;AAAA,IACtB,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAGA,SAAS,eAAuB;AAC9B,QAAM,OAAO,KAAK,IAAI,EAAE,SAAS,EAAE;AACnC,QAAM,OAAO,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE;AACnD,SAAO,IAAI,IAAI,GAAG,IAAI;AACxB;AAEO,SAAS,gBAAgB,OAA2B;AACzD,SAAO,MAAM,SAAS,UAAU,SAAS;AAC3C;;;ACxCO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YACmB,QACA,SACA,MACjB;AAHiB;AACA;AACA;AAAA,EAChB;AAAA,EAHgB;AAAA,EACA;AAAA,EACA;AAAA,EAGX,MAAsB;AAC5B,WAAO,WAAW,KAAK,QAAQ,KAAK,OAAO;AAAA,EAC7C;AAAA;AAAA,EAGA,MAAM,OACJ,OACA,MACkC;AAClC,UAAM,EAAE,SAAS,QAAQ,SAAS,IAAI,KAAK,UAAU,OAAO,IAAI;AAEhE,eAAW,CAAC,OAAO,EAAE,KAAK,QAAQ;AAChC,iBAAW,CAAC,WAAW,KAAK,KAAK,MAAM,KAAK,cAAc,OAAO,OAAO,EAAE,GAAG;AAC3E,gBAAQ,IAAI,WAAW,KAAK;AAAA,MAC9B;AAAA,IACF;AAEA,UAAM,eAAe,oBAAoB,OAAO,SAAS,OAAO,CAAC;AACjE,UAAM,MAAM,KAAK,YAAY,OAAO,YAAY;AAEhD,UAAM,YAAY,SAAS,KAAK;AAChC,UAAM,OAAO,cAAc,OAAO,KAAK,KAAK,IAAI,GAAG,SAAS;AAC5D,UAAM,SAAS,MAAM,KAAK,KAAK,KAAK,GAAG;AACvC,UAAM,OAAO,KAAK,UAAU,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY;AAEhE,eAAW,CAAC,OAAO,EAAE,KAAK,UAAU;AAClC,YAAM,KAAK,cAAc,OAAO,MAAM,OAAO,EAAE;AAAA,IACjD;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,UACJ,OACA,OACA,MACA,MACe;AACf,UAAM,EAAE,SAAS,QAAQ,SAAS,IAAI,KAAK,UAAU,OAAO,MAAM,IAAI;AAEtE,eAAW,CAAC,OAAO,EAAE,KAAK,QAAQ;AAChC,iBAAW,CAAC,WAAW,KAAK,KAAK,MAAM,KAAK;AAAA,QAC1C;AAAA,QACA;AAAA,QACA;AAAA,MACF,GAAG;AACD,gBAAQ,IAAI,WAAW,KAAK;AAAA,MAC9B;AAAA,IACF;AAEA,UAAM,eAAe,oBAAoB,OAAO,SAAS,OAAO,CAAC;AACjE,UAAM,cAAc,KAAK,kBAAkB,OAAO,YAAY;AAE9D,QAAI,YAAY,OAAO,GAAG;AACxB,YAAM,OAAO,cAAc,OAAO,OAAO,aAAa,KAAK,IAAI,CAAC;AAChE,YAAM,KAAK,KAAK,KAAK,GAAG;AAAA,IAC1B;AAEA,eAAW,CAAC,OAAO,EAAE,KAAK,UAAU;AAClC,YAAM,KAAK,cAAc,OAAO,MAAM,OAAO,EAAE;AAAA,IACjD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eACJ,OACA,OACA,MACe;AACf,eAAW,OAAO,OAAO,KAAK,IAAI,GAAG;AACnC,YAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG;AACrD,UAAI,OAAO,SAAS,UAAU;AAC5B,cAAM,IAAI;AAAA,UACR,wDAAwD,MAAM,IAAI,IAAI,GAAG;AAAA,QAC3E;AAAA,MACF;AAAA,IACF;AACA,UAAM,eAAe,oBAAoB,OAAO,IAAI;AACpD,UAAM,cAAc,KAAK,kBAAkB,OAAO,YAAY;AAC9D,QAAI,YAAY,OAAO,GAAG;AACxB,YAAM,OAAO,cAAc,OAAO,OAAO,aAAa,KAAK,IAAI,CAAC;AAChE,YAAM,KAAK,KAAK,KAAK,GAAG;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA,EAIQ,UACN,OACA,MACA,WAAW,OAKX;AACA,UAAM,UAAU,oBAAI,IAAqB;AACzC,UAAM,SAAiD,CAAC;AACxD,UAAM,WAAmD,CAAC;AAE1D,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,UAAI,UAAU,OAAW;AACzB,YAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG;AACrD,UAAI,CAAC,OAAO;AACV,cAAM,IAAI;AAAA,UACR,kBAAkB,GAAG,eAAe,MAAM,IAAI;AAAA,QAChD;AAAA,MACF;AACA,UAAI,MAAM,SAAS,UAAU;AAG3B,gBAAQ,IAAI,KAAK,KAAK;AACtB;AAAA,MACF;AACA,UAAI,CAAC,cAAc,KAAK,GAAG;AACzB,cAAM,IAAI;AAAA,UACR,aAAa,MAAM,IAAI,IAAI,GAAG;AAAA,QAChC;AAAA,MACF;AACA,YAAM,MAAM,gBAAgB,KAAK,QAAQ,OAAO,KAAK;AACrD,UAAI,IAAI,KAAM,QAAO,KAAK,CAAC,OAAO,KAAK,CAAC;AAAA,UACnC,UAAS,KAAK,CAAC,OAAO,KAAK,CAAC;AAAA,IACnC;AACA,WAAO,EAAE,SAAS,QAAQ,SAAS;AAAA,EACrC;AAAA,EAEQ,YACN,OACA,QACuB;AACvB,UAAM,MAAM,oBAAI,IAAsB;AACtC,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAClD,YAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACtD,UAAI,CAAC,SAAS,MAAM,SAAS,SAAU;AACvC,UAAI,gBAAgB,KAAK,MAAM,UAAU,UAAa,UAAU,OAAO;AACrE;AAAA,MACF;AACA,UAAI,IAAI,YAAY,KAAK,GAAG,KAAK,QAAQ,YAAY,KAAK,CAAC;AAAA,IAC7D;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,kBACN,OACA,QAC2B;AAC3B,UAAM,MAAM,oBAAI,IAA0B;AAC1C,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAClD,YAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACtD,UAAI,CAAC,SAAS,MAAM,SAAS,SAAU;AACvC,UAAI,IAAI,YAAY,KAAK,GAAG,KAAK,eAAe,OAAO,KAAK,CAAC;AAAA,IAC/D;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,OAAkB,OAA8B;AACrE,UAAM,SAAS,CAAC,MAAyB,KAAK,QAAQ,YAAY,CAAC;AACnE,QAAI,cAAc,KAAK,GAAG;AACxB,UAAI,SAAS,MAAO,QAAO,EAAE,MAAM,OAAO,OAAO,OAAO,MAAM,GAAG,EAAE;AACnE,YAAM,QAAQ,UAAU,KAAK,CAAC,OAAO,GAAG,OAAO,KAAK;AACpD,UAAI,OAAO;AACT,uBAAe,OAAO,MAAM,GAAG;AAC/B,eAAO,EAAE,MAAM,SAAS,IAAI,MAAM,IAAI,OAAO,OAAO,MAAM,MAAM,GAAG,CAAC,EAAE;AAAA,MACxE;AAAA,IACF;AACA,WAAO,EAAE,MAAM,OAAO,OAAO,OAAO,KAAK,EAAE;AAAA,EAC7C;AAAA,EAEQ,UACN,OACA,aACA,aACyB;AACzB,UAAM,MAA+B,CAAC;AACtC,eAAW,KAAK,SAAS,KAAK,GAAG;AAC/B,UAAI,EAAE,IAAI,IACR,YAAY,EAAE,IAAI,KAClB,YAAY,YAAY,CAAC,CAAC,KAC1B,YAAY,EAAE,IAAI;AAAA,IACtB;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAIA,MAAc,cACZ,OACA,OACA,IAC+B;AAC/B,UAAM,MAAM,gBAAgB,KAAK,QAAQ,OAAO,KAAK;AACrD,QAAI,GAAG,SAAS;AACd,YAAM,MAAM,MAAM,KAAK,gBAAgB,KAAK,GAAG,OAAqB;AACpE,aAAO,KAAK,aAAa,KAAK,GAAG;AAAA,IACnC;AACA,QAAI,GAAG,QAAQ;AACb,YAAM,YAAY,MAAM,KAAK;AAAA,QAC3B,IAAI;AAAA,QACJ,GAAG;AAAA,MACL;AACA,aAAO,KAAK,aAAa,KAAK,SAAS;AAAA,IACzC;AACA,QAAI,GAAG,iBAAiB;AACtB,YAAM,OAAO,GAAG;AAIhB,YAAM,WAAW,MAAM,KAAK,mBAAmB,KAAK,KAAK,KAAK;AAC9D,YAAM,MAAM,YAAa,MAAM,KAAK,OAAO,IAAI,cAAc,KAAK,MAAM;AACxE,aAAO,KAAK,aAAa,KAAK,GAAG;AAAA,IACnC;AACA,UAAM,IAAI;AAAA,MACR,gCAAgC,MAAM,IAAI,IAAI,MAAM,IAAI;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,MAAc,uBACZ,OACA,OACA,IAC+B;AAC/B,QAAI,GAAG,YAAY;AACjB,YAAM,MAAM,gBAAgB,KAAK,QAAQ,OAAO,KAAK;AACrD,aAAO,IAAI,WAAW,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,CAAuB;AAAA,IACxE;AACA,WAAO,KAAK,cAAc,OAAO,OAAO,EAAE;AAAA,EAC5C;AAAA;AAAA,EAGQ,aACN,KACA,WACsB;AACtB,WAAO,IAAI,WAAW,IAAI,CAAC,WAAW,MAAM;AAC1C,YAAM,UAAU,IAAI,SAAS,CAAC;AAC9B,aAAO,CAAC,WAAW,KAAK,QAAQ,YAAY,UAAU,OAAO,KAAK,IAAI,CAAC;AAAA,IACzE,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,gBACZ,KACA,OACkC;AAClC,UAAM,QAAQ,MAAM,KAAK,mBAAmB,KAAK,KAAK;AACtD,QAAI,CAAC,MAAO,OAAM,IAAI,oBAAoB,IAAI,aAAa,IAAI;AAC/D,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,mBACZ,KACA,OACyC;AACzC,UAAM,SAAS,IAAI,SAAS,IAAI,CAAC,MAAM,aAAa,IAAI,cAAc,CAAC,CAAC;AACxE,UAAM,OAAO,KAAK,WAAW,IAAI,cAAc,QAAQ,KAAK;AAC5D,UAAM,OAAO,MAAM,KAAK,KAAK,IAAI;AACjC,WAAO,KAAK,CAAC,KAAK;AAAA,EACpB;AAAA,EAEQ,WACN,OACA,QACA,OACK;AACL,UAAM,IAAI,KAAK;AACf,UAAM,QAAQ;AACd,UAAM,MAAM,IAAI,IAAI;AACpB,QAAI,KAAK,iBAAiB;AAC1B,QAAI;AAAA,MACF,OACG,IAAI,CAAC,MAAM,GAAG,EAAE,SAAS,OAAO,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,EACzE,KAAK,IAAI;AAAA,IACd;AACA,QAAI,KAAK,SAAS,EAAE,QAAQ,WAAW,KAAK,CAAC,CAAC,IAAI,EAAE,QAAQ,KAAK,CAAC,EAAE;AACpE,UAAM,OAAO,aAAa,OAAO,OAAO,OAAO,KAAK,IAAI,CAAC;AACzD,QAAI,CAAC,KAAK,QAAQ,EAAG,KAAI,KAAK,SAAS,EAAE,OAAO,IAAI;AACpD,WAAO;AAAA,EACT;AAAA;AAAA,EAIA,MAAc,cACZ,aACA,YACA,OACA,IACe;AACf,UAAM,MAAM,gBAAgB,KAAK,QAAQ,aAAa,KAAK;AAC3D,UAAM,YAAkC,IAAI,UAAU,IAAI,CAAC,OAAO,MAAM;AACtE,YAAM,YAAY,IAAI,WAAW,CAAC;AAClC,aAAO,CAAC,OAAO,KAAK,QAAQ,YAAY,WAAW,SAAS,KAAK,IAAI,CAAC;AAAA,IACxE,CAAC;AAED,eAAW,aAAa,QAAQ,GAAG,MAAM,GAAG;AAC1C,YAAM,KAAK,OAAO,IAAI,cAAc,EAAE,GAAG,WAAW,GAAG,SAAS,KAAK,UAAU,EAAE,CAAC;AAAA,IACpF;AACA,eAAW,SAAS,QAAQ,GAAG,OAAO,GAAG;AACvC,YAAM,KAAK,mBAAmB,KAAK,OAAqB,SAAS;AAAA,IACnE;AACA,QAAI,GAAG,QAAQ,QAAW;AACxB,YAAM,KAAK,cAAc,KAAK,UAAU;AACxC,iBAAW,SAAS,QAAQ,GAAG,GAAG,GAAG;AACnC,cAAM,KAAK,mBAAmB,KAAK,OAAqB,SAAS;AAAA,MACnE;AAAA,IACF;AACA,eAAW,SAAS,QAAQ,GAAG,UAAU,GAAG;AAC1C,YAAM,KAAK;AAAA,QACT;AAAA,QACA;AAAA,QACA,IAAI,UAAU,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAuB;AAAA,MAC1D;AAAA,IACF;AACA,eAAW,SAAS,QAAQ,GAAG,MAAM,GAAG;AACtC,YAAM,OAAO,cAAc,IAAI,cAAc,OAAqB,KAAK,IAAI,CAAC;AAC5E,YAAM,KAAK,KAAK,KAAK,GAAG;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,MAAc,mBACZ,KACA,OACA,WACe;AACf,UAAM,cAAc,eAAe,IAAI,IAAsB,SAAS,CAAC;AACvE,UAAM,OAAO,cAAc,IAAI,cAAc,OAAO,aAAa,KAAK,IAAI,CAAC;AAC3E,UAAM,KAAK,KAAK,KAAK,GAAG;AAAA,EAC1B;AAAA,EAEA,MAAc,cACZ,KACA,YACe;AACf,UAAM,aAAyB,CAAC;AAChC,QAAI,SAAS,QAAQ,CAAC,SAAS,MAAM;AACnC,YAAM,YAAY,IAAI,WAAW,CAAC;AAClC,iBAAW,OAAO,IAAI,WAAW,SAAS;AAAA,IAC5C,CAAC;AACD,UAAM,cAAc;AAAA,MAClB,IAAI;AAAA,QACF,IAAI,UAAU,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAuB;AAAA,MAC1D;AAAA,IACF;AACA,UAAM,OAAO,cAAc,IAAI,cAAc,YAAY,aAAa,KAAK,IAAI,CAAC;AAChF,UAAM,KAAK,KAAK,KAAK,GAAG;AAAA,EAC1B;AACF;AAEA,IAAM,YAAY;AAAA,EAChB,EAAE,KAAK,aAAa,IAAI,IAAa;AAAA,EACrC,EAAE,KAAK,aAAa,IAAI,IAAa;AAAA,EACrC,EAAE,KAAK,YAAY,IAAI,IAAa;AAAA,EACpC,EAAE,KAAK,UAAU,IAAI,IAAa;AACpC;AAEA,IAAM,gBAAgB,oBAAI,IAAI,CAAC,OAAO,UAAU,SAAS,SAAS,CAAC;AAEnE,SAAS,eAAe,OAAkB,IAAkB;AAC1D,MAAI,CAAC,cAAc,IAAI,MAAM,IAAI,GAAG;AAClC,UAAM,IAAI;AAAA,MACR,aAAa,EAAE,2CAA2C,MAAM,IAAI,MAAM,MAAM,IAAI;AAAA,IACtF;AAAA,EACF;AACF;AAIA,SAAS,aAAa,OAAkB,MAAyB;AAC/D,QAAM,IAAI,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAClD,MAAI,CAAC,GAAG;AACN,UAAM,IAAI,qBAAqB,UAAU,IAAI,mBAAmB,MAAM,IAAI,IAAI;AAAA,EAChF;AACA,SAAO;AACT;AAEA,SAAS,SACP,KACA,YACyB;AACzB,QAAM,MAA+B,CAAC;AACtC,MAAI,SAAS,QAAQ,CAAC,SAAS,MAAM;AACnC,UAAM,YAAY,IAAI,WAAW,CAAC;AAClC,QAAI,OAAO,IAAI,WAAW,SAAS;AAAA,EACrC,CAAC;AACD,SAAO;AACT;AAEA,SAAS,SAAS,SAAwD;AACxE,QAAM,MAA+B,CAAC;AACtC,aAAW,CAAC,GAAG,CAAC,KAAK,QAAS,KAAI,CAAC,IAAI;AACvC,SAAO;AACT;AAEA,SAAS,QAAqC,OAAqB;AACjE,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO,CAAC;AACnD,SAAQ,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAC/C;;;AClYA,SAAS,UAAU,MAIL;AACZ,SAAO,EAAE,QAAQ,KAAK,QAAQ,SAAS,KAAK,SAAS,MAAM,KAAK,KAAK;AACvE;AAQO,IAAM,cAAN,MAAkB;AAAA,EACvB,YACmB,QACA,SACA,QACjB;AAHiB;AACA;AACA;AAAA,EAChB;AAAA,EAHgB;AAAA,EACA;AAAA,EACA;AAAA,EAGnB,MAAM,MAAyB;AAC7B,UAAM,QAAQ,UAAU,KAAK,QAAQ,IAAI;AACzC,QAAI,CAAC,MAAO,OAAM,IAAI,qBAAqB,kBAAkB,IAAI,IAAI;AACrE,WAAO;AAAA,EACT;AAAA,EAEQ,IACN,IACA,SACY;AACZ,WAAO,KAAK,OAAO,YAAY,IAAI,OAAO;AAAA,EAC5C;AAAA,EAEQ,OAAO,IAAkC;AAC/C,WAAO,CAAC,QAAa,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM;AAAA,EACpD;AAAA;AAAA,EAIA,SAAS,MAAc,OAAqB,CAAC,GAAuC;AAClF,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,WAAO,KAAK,IAAI,CAAC,OAAO,KAAK,SAAS,OAAO,MAAM,KAAK,OAAO,EAAE,CAAC,CAAC;AAAA,EACrE;AAAA,EAEA,MAAM,UACJ,MACA,OAAsB,CAAC,GACkB;AACzC,UAAM,OAAO,MAAM,KAAK,SAAS,MAAM,EAAE,GAAG,MAAM,MAAM,EAAE,CAAC;AAC3D,WAAO,KAAK,CAAC,KAAK;AAAA,EACpB;AAAA,EAEA,MAAM,iBAAiB,MAAc,OAAsB,CAAC,GAAG;AAC7D,UAAM,MAAM,MAAM,KAAK,UAAU,MAAM,IAAI;AAC3C,QAAI,CAAC,IAAK,OAAM,IAAI,oBAAoB,IAAI;AAC5C,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WACJ,MACA,MACyC;AACzC,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,SAAK,kBAAkB,OAAO,KAAK,KAAK;AACxC,UAAM,OAAO,MAAM,KAAK;AAAA,MAAI,CAAC,OAC3B,KAAK;AAAA,QACH;AAAA,QACA,EAAE,OAAO,KAAK,OAAO,QAAQ,KAAK,QAAQ,SAAS,KAAK,SAAS,MAAM,EAAE;AAAA,QACzE,KAAK,OAAO,EAAE;AAAA,MAChB;AAAA,IACF;AACA,WAAO,KAAK,CAAC,KAAK;AAAA,EACpB;AAAA,EAEA,MAAM,kBAAkB,MAAc,MAAsB;AAC1D,UAAM,MAAM,MAAM,KAAK,WAAW,MAAM,IAAI;AAC5C,QAAI,CAAC,IAAK,OAAM,IAAI,oBAAoB,IAAI;AAC5C,WAAO;AAAA,EACT;AAAA;AAAA,EAIA,MAAM,MAAc,OAAkB,CAAC,GAAoB;AACzD,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,WAAO,KAAK,IAAI,OAAO,OAAO;AAC5B,YAAM,OAAO,aAAa,OAAO,KAAK,OAAO,WAAW,KAAK,QAAQ,KAAK,OAAO,GAAG;AAAA,QAClF,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,MACb,CAAC;AACD,YAAM,OAAO,MAAM,GAAG,MAA2B,KAAK,MAAM,KAAK,MAAM;AACvE,aAAO,OAAO,KAAK,CAAC,GAAG,UAAU,CAAC;AAAA,IACpC,CAAC;AAAA,EACH;AAAA,EAEA,UAAU,MAAc,OAAsB,CAAC,GAAqC;AAClF,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,WAAO,KAAK,IAAI,OAAO,OAAO;AAC5B,YAAM,OAAO,iBAAiB,OAAO,MAAM,WAAW,KAAK,QAAQ,KAAK,OAAO,CAAC;AAChF,YAAM,OAAO,MAAM,GAAG,MAA+B,KAAK,MAAM,KAAK,MAAM;AAC3E,aAAO,iBAAiB,KAAK,CAAC,KAAK,CAAC,CAAC;AAAA,IACvC,CAAC;AAAA,EACH;AAAA,EAEA,QAAQ,MAAc,MAAuD;AAC3E,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,WAAO,KAAK,IAAI,OAAO,OAAO;AAC5B,YAAM,EAAE,IAAI,IAAI,eAAe,OAAO,MAAM,WAAW,KAAK,QAAQ,KAAK,OAAO,CAAC;AACjF,YAAM,OAAO,MAAM,GAAG,MAA+B,IAAI,MAAM,IAAI,MAAM;AACzE,aAAO,KAAK,IAAI,CAAC,MAAM,gBAAgB,OAAO,KAAK,IAAI,CAAC,CAAC;AAAA,IAC3D,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,OAAO,MAAc,MAAoD;AACvE,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,WAAO,KAAK,IAAI,OAAO,OAAO;AAC5B,YAAM,SAAS,IAAI,eAAe,KAAK,QAAQ,KAAK,SAAS,KAAK,OAAO,EAAE,CAAC;AAC5E,YAAM,OAAO,MAAM,OAAO,OAAO,OAAO,KAAK,IAAI;AACjD,aAAO,KAAK,SAAS,OAAO,MAAM,UAAU,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;AAAA,IACpE,CAAC;AAAA,EACH;AAAA,EAEA,WAAW,MAAc,MAAkD;AACzE,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,WAAO,KAAK,IAAI,OAAO,OAAO;AAC5B,YAAM,SAAS,IAAI,eAAe,KAAK,QAAQ,KAAK,SAAS,KAAK,OAAO,EAAE,CAAC;AAC5E,UAAI,QAAQ;AACZ,iBAAW,QAAQ,KAAK,MAAM;AAC5B,cAAM,OAAO,OAAO,OAAO,IAAI;AAC/B;AAAA,MACF;AACA,aAAO,EAAE,MAAM;AAAA,IACjB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,oBACE,MACA,MACoC;AACpC,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,WAAO,KAAK,IAAI,OAAO,OAAO;AAC5B,YAAM,OAAO,KAAK,OAAO,EAAE;AAC3B,YAAM,SAAS,IAAI,eAAe,KAAK,QAAQ,KAAK,SAAS,IAAI;AACjE,YAAM,MAAiC,CAAC;AACxC,YAAM,QAAmB,EAAE,QAAQ,KAAK,QAAQ,MAAM,KAAK,KAAK;AAChE,iBAAW,QAAQ,KAAK,MAAM;AAC5B,cAAM,OAAO,MAAM,OAAO,OAAO,OAAO,IAAI;AAC5C,YAAI,KAAK,MAAM,KAAK,SAAS,OAAO,MAAM,OAAO,IAAI,CAAC;AAAA,MACxD;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,MAAc,MAAoD;AACvE,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,SAAK,kBAAkB,OAAO,KAAK,KAAK;AACxC,WAAO,KAAK,IAAI,OAAO,OAAO;AAC5B,YAAM,OAAO,KAAK,OAAO,EAAE;AAC3B,YAAM,SAAS,MAAM,KAAK,WAAW,OAAO,KAAK,OAAO,IAAI;AAC5D,YAAM,OAAO,KAAK,SAAS,OAAO,MAAM;AACxC,YAAM,SAAS,IAAI,eAAe,KAAK,QAAQ,KAAK,SAAS,IAAI;AACjE,YAAM,OAAO,UAAU,OAAO,KAAK,OAAO,KAAK,MAAM,IAAI;AACzD,aAAO,KAAK,SAAS,OAAO,MAAM,UAAU,IAAI,GAAG,IAAI;AAAA,IACzD,CAAC;AAAA,EACH;AAAA,EAEA,WAAW,MAAc,MAAkD;AACzE,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,WAAO,KAAK,IAAI,OAAO,OAAO;AAC5B,YAAM,OAAO,KAAK,OAAO,EAAE;AAC3B,YAAM,QAAQ,MAAM,KAAK,cAAc,OAAO,KAAK,OAAO,IAAI;AAC9D,YAAM,SAAS,IAAI,eAAe,KAAK,QAAQ,KAAK,SAAS,IAAI;AAGjE,YAAM,OAAO,eAAe,OAAO,KAAK,OAAO,KAAK,IAAI;AACxD,aAAO,EAAE,MAAM;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,MAAc,MAAoD;AACvE,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,SAAK,kBAAkB,OAAO,KAAK,KAAK;AACxC,WAAO,KAAK,IAAI,OAAO,OAAO;AAC5B,YAAM,OAAO,KAAK,OAAO,EAAE;AAC3B,YAAM,WAAW,MAAM,KAAK,WAAW,OAAO,KAAK,OAAO,IAAI;AAC9D,YAAM,SAAS,IAAI,eAAe,KAAK,QAAQ,KAAK,SAAS,IAAI;AACjE,UAAI,UAAU;AACZ,cAAMC,QAAO,KAAK,SAAS,OAAO,QAAQ;AAC1C,cAAM,OAAO,UAAU,OAAO,KAAK,OAAO,KAAK,QAAQA,KAAI;AAC3D,eAAO,KAAK,SAAS,OAAOA,OAAM,UAAU,IAAI,GAAG,IAAI;AAAA,MACzD;AACA,YAAM,OAAO,MAAM,OAAO,OAAO,OAAO,KAAK,MAAM;AACnD,aAAO,KAAK,SAAS,OAAO,MAAM,UAAU,IAAI,GAAG,IAAI;AAAA,IACzD,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,MAAc,MAAoD;AACvE,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,SAAK,kBAAkB,OAAO,KAAK,KAAK;AACxC,WAAO,KAAK,IAAI,OAAO,OAAO;AAC5B,YAAM,OAAO,KAAK,OAAO,EAAE;AAC3B,YAAM,MAAM,MAAM,KAAK,YAAY,OAAO,KAAK,OAAO,UAAU,IAAI,GAAG,IAAI;AAC3E,UAAI,CAAC,IAAK,OAAM,IAAI,oBAAoB,IAAI;AAC5C,YAAM,OAAO,cAAc,OAAO,KAAK,OAAO,WAAW,KAAK,QAAQ,KAAK,OAAO,CAAC;AACnF,YAAM,KAAK,KAAK,GAAG;AACnB,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,WAAW,MAAc,OAAuB,CAAC,GAA+B;AAC9E,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,WAAO,KAAK,IAAI,OAAO,OAAO;AAC5B,YAAM,OAAO,KAAK,OAAO,EAAE;AAC3B,YAAM,QAAQ,MAAM,KAAK,cAAc,OAAO,KAAK,OAAO,IAAI;AAC9D,YAAM,OAAO,cAAc,OAAO,KAAK,OAAO,WAAW,KAAK,QAAQ,KAAK,OAAO,CAAC;AACnF,YAAM,KAAK,KAAK,GAAG;AACnB,aAAO,EAAE,MAAM;AAAA,IACjB,CAAC;AAAA,EACH;AAAA;AAAA,EAIA,MAAc,SACZ,OACA,MACA,MACA,YAAsB,CAAC,GACa;AACpC,UAAM,YAAY,KAAK,cAAc,OAAO,KAAK,QAAQ,KAAK,OAAO;AACrE,UAAM,cAAc,KAAK,mBAAmB,OAAO,KAAK,QAAQ,KAAK,OAAO;AAC5E,UAAM,kBAAkB;AAAA,MACtB;AAAA,MACA,oBAAoB,OAAO,KAAK,MAAM;AAAA,MACtC,KAAK;AAAA,IACP;AACA,UAAM,iBAAiB,kBAAkB,OAAO,KAAK,QAAQ;AAG7D,UAAM,oBACJ,eAAe,SAAS,KAAK,KAAK,QAAQ;AAC5C,UAAM,iBAAiB,eAAe,SAAS,KAAK,CAAC;AAGrD,UAAM,EAAE,OAAO,QAAQ,IAAI,YAAY,OAAO,MAAM,cAAc;AAElE,UAAM,oBAAoB;AAAA,MACxB,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,GAAG,WAAW,EAAE;AAAA,QACjD,CAAC,UAAU,gBAAgB,KAAK,QAAQ,OAAO,KAAK,EAAE;AAAA,MACxD;AAAA,IACF;AACA,UAAM,eAAe,KAAK;AAAA,MACxB,GAAG;AAAA,MACH,GAAG;AAAA;AAAA,IACL,CAAC;AACD,UAAM,kBAAkB,KAAK;AAAA,MAC3B,GAAI,mBAAmB,aAAa,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,MAC5D,GAAG;AAAA,MACH,GAAG;AAAA,IACL,CAAC;AACD,UAAM,aAAa,gBAAgB,IAAI,CAAC,MAAM,YAAY,OAAO,CAAC,CAAC;AAEnE,UAAM,cAAc;AAAA,MAClB;AAAA,MACA;AAAA,MACA,MAAM,iBAAiB,SAAY,KAAK;AAAA,MACxC,MAAM,iBAAiB,SAAY,KAAK;AAAA,IAC1C;AACA,UAAM,OAAO,oBACT;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe,IAAI,CAAC,MAAM,YAAY,OAAO,CAAC,CAAC;AAAA,MAC/C,WAAW,KAAK,QAAQ,KAAK,OAAO;AAAA,IACtC,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,KAAK,QAAQ,KAAK,OAAO;AAAA,IACtC;AACJ,UAAM,UAAU,MAAM,KAAK,KAAK,GAAG;AACnC,QAAI,OAAO,QAAQ,IAAI,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC;AAEtD,QAAI,gBAAgB;AAClB,aAAO,SAAS,MAAM,cAAc;AACpC,aAAO,gBAAgB,MAAM,KAAK,MAAM,KAAK,IAAI;AAAA,IACnD;AAEA,eAAW,YAAY,WAAW;AAChC,YAAM,KAAK,aAAa,OAAO,MAAM,UAAU,IAAI;AAAA,IACrD;AACA,QAAI,YAAY,SAAS,GAAG;AAC1B,YAAM,KAAK,WAAW,OAAO,MAAM,aAAa,IAAI;AAAA,IACtD;AAGA,QAAI,iBAAiB;AACnB,YAAM,UAAU,oBAAI,IAAI,CAAC,GAAG,iBAAiB,GAAG,SAAS,CAAC;AAC1D,iBAAW,OAAO,MAAM;AACtB,mBAAW,QAAQ,cAAc;AAC/B,cAAI,CAAC,QAAQ,IAAI,IAAI,EAAG,QAAO,IAAI,IAAI;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,aACZ,aACA,YACA,UACA,MACe;AACf,QAAI,WAAW,WAAW,EAAG;AAC7B,UAAM,MAAM,gBAAgB,KAAK,QAAQ,aAAa,SAAS,KAAK;AACpE,UAAM,YAAY,SAAS,MAAM;AACjC,UAAM,EAAE,YAAY,SAAS,IAAI;AAGjC,UAAM,eAAe,aAAa,YAAY,UAAU;AAExD,UAAM,UAAU,oBAAI,IAAuC;AAC3D,QAAI,aAAa,SAAS,GAAG;AAC3B,YAAM,aAAa;AAAA,QACjB;AAAA,QACA;AAAA,QACA,SAAS,KAAK;AAAA,MAChB;AACA,YAAM,YAAY,MAAM,KAAK;AAAA,QAC3B,IAAI;AAAA,QACJ;AAAA,UACE,OAAO;AAAA,UACP,SAAS,SAAS,KAAK;AAAA,UACvB,QAAQ,SAAS,KAAK;AAAA,UACtB,SAAS,SAAS,KAAK;AAAA;AAAA,UAEvB,GAAI,IAAI,SAAS,CAAC,IAAI,EAAE,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,KAAK,KAAK;AAAA,QAC7E;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,iBAAW,SAAS,WAAW;AAC7B,cAAM,IAAI,SAAS,OAAO,QAAQ;AAClC,cAAM,OAAO,QAAQ,IAAI,CAAC,KAAK,CAAC;AAChC,aAAK,KAAK,KAAK;AACf,gBAAQ,IAAI,GAAG,IAAI;AAAA,MACrB;AAAA,IACF;AAGA,UAAM,UAAU,oBAAoB,IAAI,cAAc,SAAS,KAAK,MAAM;AAC1E,UAAM,cAAc,UAChB,SAAS,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,IACtC,CAAC;AAEL,eAAW,UAAU,YAAY;AAC/B,YAAM,IAAI,SAAS,QAAQ,UAAU;AACrC,UAAI,UAAU,QAAQ,IAAI,CAAC,KAAK,CAAC;AACjC,UAAI,IAAI,WAAW,SAAS,KAAK,QAAQ,QAAQ,SAAS,KAAK,QAAQ,OAAO;AAC5E,kBAAU,gBAAgB,SAAS,SAAS,KAAK,MAAM,SAAS,KAAK,IAAI;AAAA,MAC3E;AACA,YAAM,WAAW,YAAY,SACzB,QAAQ,IAAI,CAAC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAC1C;AACJ,aAAO,SAAS,IAAI,IAAI,SAAS,WAAY,SAAS,CAAC,KAAK;AAAA,IAC9D;AAAA,EACF;AAAA,EAEQ,cACN,OACA,QACA,SACgB;AAChB,UAAM,MAAsB,CAAC;AAC7B,UAAM,MAAM,CAAC,KAAa,UAAoC;AAC5D,UAAI,CAAC,MAAO;AACZ,YAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,SAAS,QAAQ;AAC5E,UAAI,CAAC,MAAO;AACZ,UAAI,KAAK,EAAE,OAAO,MAAM,OAAO,UAAU,WAAW,QAAQ,CAAC,EAAE,CAAC;AAAA,IAClE;AACA,QAAI,QAAS,YAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,OAAO,EAAG,KAAI,GAAG,CAAC;AACnE,QAAI,QAAQ;AACV,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC3C,cAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC;AACnD,YAAI,OAAO,SAAS,SAAU,KAAI,GAAG,CAAC;AAAA,MACxC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,mBACN,OACA,QACA,SACa;AACb,UAAM,OACH,SAAS,UACT,QAAQ;AACX,QAAI,CAAC,KAAM,QAAO,CAAC;AACnB,UAAM,gBAAgB,MAAM,OAAO;AAAA,MACjC,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE;AAAA,IAClC;AACA,QAAI,SAAS,KAAM,QAAO;AAC1B,UAAM,WAAY,KAA8C;AAChE,QAAI,CAAC,SAAU,QAAO;AACtB,WAAO,cAAc,OAAO,CAAC,MAAM,SAAS,EAAE,IAAI,CAAC;AAAA,EACrD;AAAA;AAAA,EAGA,MAAc,WACZ,OACA,MACA,aACA,MACe;AACf,eAAW,OAAO,KAAM,KAAI,SAAS,CAAC;AAEtC,eAAW,SAAS,aAAa;AAC/B,YAAM,MAAM,gBAAgB,KAAK,QAAQ,OAAO,KAAK;AACrD,YAAM,SAAS,aAAa,MAAM,IAAI,UAAU;AAChD,YAAM,UAAU,oBAAI,IAAoB;AAExC,UAAI,OAAO,SAAS,GAAG;AACrB,cAAM,QAAQ,iBAAiB,IAAI,UAAU,QAAQ,MAAS;AAC9D,cAAM,EAAE,IAAI,IAAI;AAAA,UACd,IAAI;AAAA,UACJ,EAAE,IAAI,IAAI,UAAU,QAAQ,MAAM,MAAM;AAAA,UACxC,WAAW,KAAK,QAAQ,KAAK,OAAO;AAAA,QACtC;AACA,cAAM,YAAY,MAAM,KAAK,GAAG;AAChC,mBAAW,MAAM,WAAW;AAC1B,kBAAQ,IAAI,SAAS,IAAI,IAAI,QAAQ,GAAG,OAAO,GAAG,cAAc,CAAC,CAAC;AAAA,QACpE;AAAA,MACF;AAEA,iBAAW,OAAO,MAAM;AACtB,cAAM,QAAQ,QAAQ,IAAI,SAAS,KAAK,IAAI,UAAU,CAAC,KAAK;AAC5D,QAAC,IAAI,OAAkC,MAAM,IAAI,IAAI;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIA,MAAc,SACZ,OACA,MACA,OACA,MACkC;AAClC,UAAM,QAAQ,YAAY,OAAO,IAAI;AACrC,UAAM,MAAM,MAAM,KAAK,YAAY,OAAO,OAAO,OAAO,IAAI;AAC5D,QAAI,CAAC,IAAK,OAAM,IAAI,oBAAoB,MAAM,IAAI;AAClD,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,YACZ,OACA,OACA,OACA,MACyC;AACzC,UAAM,OAAO,MAAM,KAAK;AAAA,MACtB;AAAA,MACA,EAAE,OAAO,QAAQ,MAAM,QAAQ,SAAS,MAAM,SAAS,MAAM,MAAM,MAAM,MAAM,EAAE;AAAA,MACjF;AAAA,IACF;AACA,WAAO,KAAK,CAAC,KAAK;AAAA,EACpB;AAAA,EAEA,MAAc,WACZ,OACA,OACA,MACkC;AAClC,UAAM,MAAM,MAAM,KAAK,WAAW,OAAO,OAAO,IAAI;AACpD,QAAI,CAAC,IAAK,OAAM,IAAI,oBAAoB,MAAM,IAAI;AAClD,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,WACZ,OACA,OACA,MACyC;AACzC,UAAM,OAAO,MAAM,KAAK,SAAS,OAAO,EAAE,OAAO,MAAM,EAAE,GAAG,IAAI;AAChE,WAAO,KAAK,CAAC,KAAK;AAAA,EACpB;AAAA,EAEA,MAAc,cACZ,OACA,OACA,MACiB;AACjB,UAAM,OAAO,aAAa,OAAO,OAAO,WAAW,KAAK,QAAQ,KAAK,OAAO,CAAC;AAC7E,UAAM,OAAO,MAAM,KAAK,IAAI;AAC5B,WAAO,OAAQ,KAAK,CAAC,GAA4B,UAAU,CAAC;AAAA,EAC9D;AAAA,EAEQ,SACN,OACA,KACyB;AACzB,UAAM,MAA+B,CAAC;AACtC,eAAW,KAAK,SAAS,KAAK,EAAG,KAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI;AACzD,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,OAAkB,OAAyB;AACnE,QAAI,CAAC,SAAS,OAAO,KAAK,KAAK,EAAE,WAAW,GAAG;AAC7C,YAAM,IAAI;AAAA,QACR,uDAAuD,MAAM,IAAI;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AACF;AAIA,SAAS,YAAY,OAAkB,MAAyB;AAC9D,QAAM,IAAI,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAClD,MAAI,CAAC,EAAG,OAAM,IAAI,qBAAqB,UAAU,IAAI,mBAAmB,MAAM,IAAI,IAAI;AACtF,SAAO;AACT;AAEA,SAAS,oBACP,OACA,QACoB;AACpB,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,QAAQ,oBAAI,IAAY;AAC9B,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC3C,QAAI,CAAC,EAAG;AACR,UAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC;AACnD,QAAI,SAAS,MAAM,SAAS,SAAU,OAAM,IAAI,CAAC;AAAA,EACnD;AACA,SAAO;AACT;AAOA,SAAS,UACP,OACA,UACA,MACoB;AACpB,MAAI,YAAY,CAAC,KAAM,QAAO;AAC9B,QAAM,UAAU,IAAI;AAAA,IAClB,OAAO,QAAQ,IAAI,EAChB,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EACnB,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AAAA,EACnB;AACA,MAAI,QAAQ,SAAS,EAAG,QAAO;AAC/B,SAAO,IAAI;AAAA,IACT,aAAa,KAAK,EACf,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;AAAA,EAClC;AACF;AAEA,SAAS,YACP,OACA,MACY;AACZ,QAAM,QAAoB,CAAC;AAC3B,aAAW,KAAK,SAAS,KAAK,EAAG,OAAM,EAAE,IAAI,IAAI,KAAK,EAAE,IAAI;AAC5D,SAAO;AACT;AAEA,SAAS,MAAM,OAAwB;AACrC,SAAO,iBAAiB,OAAO,MAAM,YAAY,IAAI,OAAO,KAAK;AACnE;AAGA,SAAS,SAAS,KAA8B,QAA0B;AACxE,SAAO,OAAO,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAG;AAClD;AAGA,SAAS,aACP,MACA,QACa;AACb,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,MAAmB,CAAC;AAC1B,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;AACtC,QAAI,MAAM,KAAK,CAAC,MAAM,MAAM,QAAQ,MAAM,MAAS,EAAG;AACtD,UAAM,MAAM,MAAM,IAAI,KAAK,EAAE,KAAK,IAAG;AACrC,QAAI,KAAK,IAAI,GAAG,EAAG;AACnB,SAAK,IAAI,GAAG;AACZ,QAAI,KAAK,KAAK;AAAA,EAChB;AACA,SAAO;AACT;AAOA,SAAS,iBACP,UACA,cACA,WACY;AACZ,QAAM,OAAO,aAAa,CAAC;AAC3B,MAAI,SAAS,WAAW,GAAG;AACzB,UAAM,QAAQ,SAAS,CAAC;AACxB,WAAO,EAAE,GAAG,MAAM,CAAC,KAAK,GAAG,EAAE,IAAI,aAAa,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE;AAAA,EACnE;AACA,QAAM,KAAmB,aAAa,IAAI,CAAC,UAAU;AACnD,UAAM,OAAmB,CAAC;AAC1B,aAAS,QAAQ,CAAC,GAAG,MAAM;AACzB,WAAK,CAAC,IAAI,MAAM,CAAC;AAAA,IACnB,CAAC;AACD,WAAO;AAAA,EACT,CAAC;AAED,MAAI,OAAO,KAAK,IAAI,EAAE,WAAW,EAAG,QAAO,EAAE,IAAI,GAAG;AACpD,SAAO,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,EAAE;AACnC;AAEA,SAAS,QACP,KACA,MACyB;AACzB,QAAM,MAA+B,EAAE,GAAG,IAAI;AAC9C,aAAW,KAAK,KAAM,QAAO,IAAI,CAAC;AAClC,SAAO;AACT;AAEA,SAAS,gBACP,MACA,MACA,MAC2B;AAC3B,QAAM,QAAQ,QAAQ;AACtB,QAAM,MAAM,QAAQ,OAAO,QAAQ,OAAO;AAC1C,SAAO,KAAK,MAAM,OAAO,GAAG;AAC9B;AAGA,SAAS,kBACP,OACA,UACU;AACV,MAAI,CAAC,YAAY,SAAS,WAAW,EAAG,QAAO,CAAC;AAChD,aAAW,QAAQ,UAAU;AAC3B,UAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACtD,QAAI,CAAC,SAAS,MAAM,SAAS,UAAU;AACrC,YAAM,IAAI;AAAA,QACR,6BAA6B,MAAM,IAAI,IAAI,IAAI;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AACA,SAAO,KAAK,QAAQ;AACtB;AAGA,SAAS,SACP,MACA,QAC2B;AAC3B,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,MAAiC,CAAC;AACxC,aAAW,OAAO,MAAM;AACtB,UAAM,MAAM,SAAS,KAAK,MAAM;AAChC,QAAI,KAAK,IAAI,GAAG,EAAG;AACnB,SAAK,IAAI,GAAG;AACZ,QAAI,KAAK,GAAG;AAAA,EACd;AACA,SAAO;AACT;AAeA,SAAS,YACP,OACA,MACA,iBACqE;AACrE,MAAI,CAAC,KAAK,UAAU,OAAO,KAAK,KAAK,MAAM,EAAE,WAAW,GAAG;AACzD,WAAO,EAAE,OAAO,KAAK,OAAO,SAAS,KAAK,QAAQ;AAAA,EACpD;AACA,QAAM,UAAU,OAAO,QAAQ,KAAK,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,MAAM,MAAS;AAC7E,MAAI,QAAQ,WAAW,EAAG,QAAO,EAAE,OAAO,KAAK,OAAO,SAAS,KAAK,QAAQ;AAE5E,QAAM,SAAwB,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM;AAC3D,QAAI,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,SAAS,QAAQ,GAAG;AACrE,YAAM,IAAI;AAAA,QACR,iBAAiB,MAAM,IAAI,IAAI,IAAI;AAAA,MACrC;AAAA,IACF;AACA,WAAO,EAAE,MAAM,OAAO,WAAW,kBAAkB,KAAK,SAAS,IAAI,KAAK,MAAM;AAAA,EAClF,CAAC;AAED,QAAM,aAAa,gBAAgB,MAAM;AACzC,QAAM,QAAoB,KAAK,QAC3B,EAAE,KAAK,CAAC,KAAK,OAAO,UAAU,EAAE,IAChC;AACJ,QAAM,UACJ,KAAK,WAAW,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,GAAG,EAAE,UAAU,EAAE;AAC/D,SAAO,EAAE,OAAO,QAAQ;AAC1B;AAGA,SAAS,gBAAgB,QAAmC;AAC1D,QAAM,UAAwB,CAAC;AAC/B,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,SAAqB,CAAC;AAC5B,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,aAAO,OAAO,CAAC,EAAG,IAAI,IAAI,OAAO,CAAC,EAAG;AAAA,IACvC;AACA,UAAM,OAAO,MAAM,OAAO,SAAS;AACnC,UAAM,IAAI,OAAO,CAAC;AAClB,UAAM,KAAK,WAAW,EAAE,WAAW,IAAI;AACvC,WAAO,EAAE,IAAI,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM;AACjC,YAAQ,KAAK,MAAM;AAAA,EACrB;AACA,SAAO,QAAQ,WAAW,IAAI,QAAQ,CAAC,IAAK,EAAE,IAAI,QAAQ;AAC5D;AAEA,SAAS,WAAW,WAAsB,WAA4B;AACpE,MAAI,cAAc,OAAQ,QAAO,YAAY,QAAQ;AACrD,SAAO,YAAY,QAAQ;AAC7B;AAEA,SAAS,kBACP,SACA,OACuB;AACvB,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,OAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AACxD,aAAW,OAAO,MAAM;AACtB,UAAM,MAAM,IAAI,KAAK;AACrB,QAAI,QAAQ,SAAS,QAAQ,OAAQ,QAAO;AAAA,EAC9C;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,KAAuD;AAC/E,QAAM,MAA+B,CAAC;AACtC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,QAAI,QAAQ,cAAc;AACxB,MAAC,IAAI,WAAW,CAAC;AACjB,MAAC,IAAI,OAAmC,OAAO,OAAO,KAAK;AAC3D;AAAA,IACF;AACA,UAAM,IAAI,sCAAsC,KAAK,GAAG;AACxD,QAAI,GAAG;AACL,YAAM,QAAS,IAAI,EAAE,CAAC,CAAE,MAAM,CAAC;AAC/B,YAAM,EAAE,CAAC,CAAE,IAAI,UAAU,OAAO,OAAO,OAAO,KAAK;AAAA,IACrD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,gBACP,OACA,IACA,KACyB;AACzB,QAAM,MAA+B,CAAC;AACtC,QAAM,cAAc,aAAa,KAAK,EAAE,OAAO,CAAC,MAAM,GAAG,SAAS,EAAE,IAAI,CAAC;AACzE,aAAW,KAAK,aAAa;AAC3B,QAAI,EAAE,IAAI,IAAI,EAAE,QAAQ,MAAM,YAAY,IAAI,EAAE,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,IAAI;AAAA,EACxE;AACA,QAAM,aAAa,iBAAiB,GAAG;AACvC,SAAO,EAAE,GAAG,KAAK,GAAG,WAAW;AACjC;AAEA,SAAS,YAAY,OAAgB,OAA2B;AAC9D,SAAO,UAAU,EAAE,CAAC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI;AAC/D;;;AC9yBA,IAAM,aAAa,oBAAI,IAAI;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,UAAU;AAAA,EACd;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;AAEA,IAAM,aAAa,oBAAI,IAAI;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAUM,SAAS,cACd,KACA,WACyB;AACzB,QAAM,QAAQ,UAAU,IAAI,QAAQ,SAAS;AAC7C,QAAM,WAAoC,CAAC;AAE3C,aAAW,aAAa,SAAS;AAC/B,aAAS,SAAS,IAAI,CAAC,OAAgC,CAAC,MACtD,aAAa,KAAK,WAAW,WAAW,MAAM,QAAQ;AAAA,EAC1D;AAGA,aAAW,OAAO,IAAI,YAAY;AAChC,UAAM,UAAU;AAAA,MACd,GAAI,IAAI,OAAO,cAAc,CAAC;AAAA,MAC9B,GAAI,IAAI,QAAQ,SAAS,KAAK,CAAC;AAAA,IACjC;AACA,eAAW,CAAC,MAAM,EAAE,KAAK,OAAO,QAAQ,OAAO,GAAG;AAChD,eAAS,IAAI,IAAI,IAAI,SAAoB,GAAG,MAAM,UAAU,IAAI;AAAA,IAClE;AAAA,EACF;AAEA,OAAK;AACL,SAAO;AACT;AAEA,SAAS,aACP,KACA,WACA,WACA,MACA,UACS;AAET,QAAM,OAAO,OAAO,MAAiD;AACnE,UAAM,WAAW,qBAAqB,KAAK,WAAW,WAAW,CAAC;AAClE,UAAM,MAAM,MAAM,cAAc,KAAK,WAAW,WAAW,SAAS,IAAI;AACxE,WAAO,sBAAsB,KAAK,WAAW,WAAW,KAAK,SAAS,WAAW;AAAA,EACnF;AAEA,QAAM,QAAQ,iBAAiB,KAAK,WAAW,SAAS;AACxD,QAAM,MAAM,aAAa,OAAO,WAAW,WAAW,IAAI;AAE1D,MAAI,WAAW,IAAI,SAAS,GAAG;AAC7B,WAAO,WAAW,KAAK,WAAW,MAAM,MAAM,IAAI,IAAI,CAA4C;AAAA,EACpG;AACA,OAAK;AACL,SAAO,IAAI,IAAI;AACjB;AAIA,SAAS,iBACP,KACA,OACA,WACa;AACb,QAAM,QAAqB,CAAC;AAC5B,aAAW,OAAO,IAAI,YAAY;AAChC,UAAM,IAAI,IAAI;AACd,QAAI,CAAC,EAAG;AACR,aAAS,OAAO,EAAE,KAAK,GAAG,SAAS;AACnC,aAAS,OAAO,EAAE,YAAY,SAAS;AAAA,EACzC;AACA,SAAO;AACT;AAEA,SAAS,SAAS,OAAoB,KAA0B,WAAyB;AACvF,MAAI,CAAC,IAAK;AACV,MAAI,IAAI,SAAS,EAAG,OAAM,KAAK,IAAI,SAAS,CAAE;AAC9C,MAAI,IAAI,eAAgB,OAAM,KAAK,IAAI,cAAc;AACvD;AAEA,SAAS,aACP,OACA,OACA,WACA,MACqD;AAErD,MAAI,OAAO;AACX,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ;AACd,WAAO,CAAC,SACN,KAAK,EAAE,OAAO,WAAW,MAAM,OAAO,CAAC,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,EAC3D;AACA,SAAO;AACT;AAIA,SAAS,cACP,KACA,OACA,QACA,MACkB;AAClB,QAAM,SAAS,IAAI;AAInB,QAAM,aAAa,CAAC,MAClB,OAAO,EAAE,MAAM,EAAG,OAAO,EAAE,IAAI;AAEjC,MAAI,OAAO;AACX,aAAW,MAAM,IAAI,aAAa;AAChC,UAAM,QAAQ;AACd,WAAO,CAAC,WAAW,GAAG,QAAQ,KAAK;AAAA,EACrC;AACA,SAAO,KAAK,EAAE,OAAO,QAAQ,KAAK,CAAC;AACrC;AASA,SAAS,gBAAgB,KAAsB,OAAiC;AAC9E,QAAM,MAAwB,CAAC;AAC/B,aAAW,OAAO,IAAI,YAAY;AAChC,UAAM,IAAI,IAAI,SAAS,KAAK;AAC5B,QAAI,CAAC,EAAG;AACR,eAAW,CAAC,OAAO,GAAG,KAAK,OAAO,QAAQ,CAAC,GAAG;AAC5C,UAAI,KAAK,EAAE,OAAO,SAAS,IAAI,QAAQ,CAAC;AAAA,IAC1C;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,sBACP,KACA,OACA,WACA,OACA,eACS;AACT,MAAI,CAAC,WAAW,IAAI,SAAS,EAAG,QAAO;AACvC,QAAM,YAAY,gBAAgB,KAAK,KAAK,EAAE;AAAA,IAC5C,CAAC,MAAM,CAAC,iBAAiB,cAAc,IAAI,EAAE,KAAK;AAAA,EACpD;AACA,MAAI,UAAU,WAAW,EAAG,QAAO;AAEnC,QAAM,UAAU,CAAC,QAA0B;AACzC,QAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,UAAM,SAAS;AACf,eAAW,KAAK,WAAW;AACzB,UAAI;AACF,eAAO,EAAE,KAAK,IAAI,EAAE,QAAQ,MAAM;AAAA,MACpC,QAAQ;AAAA,MAER;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,IAAI,OAAO,IAAI,QAAQ,KAAK;AAClE;AAOA,SAAS,qBACP,KACA,OACA,WACA,MACoE;AACpE,QAAM,YAAY,gBAAgB,KAAK,KAAK;AAC5C,MAAI,UAAU,WAAW,EAAG,QAAO,EAAE,MAAM,aAAa,KAAK;AAE7D,QAAM,SAAS,KAAK;AACpB,MAAI,CAAC,OAAQ,QAAO,EAAE,MAAM,aAAa,KAAK;AAE9C,QAAM,UAAU,IAAI;AAAA,IAClB,IAAI,WACD,QAAQ,CAAC,MAAM,OAAO,QAAQ,EAAE,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,EACtD,IAAI,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,CAAU;AAAA,EACxC;AAEA,QAAM,cAAc,oBAAI,IAAY;AACpC,QAAM,YAAqC,EAAE,GAAG,OAAO;AACvD,aAAW,OAAO,OAAO,KAAK,MAAM,GAAG;AACrC,UAAM,MAAM,QAAQ,IAAI,GAAG;AAC3B,QAAI,CAAC,IAAK;AACV,gBAAY,IAAI,GAAG;AACnB,WAAO,UAAU,GAAG;AACpB,eAAW,QAAQ,OAAO,KAAK,IAAI,SAAS,CAAC,CAAC,EAAG,WAAU,IAAI,IAAI;AAAA,EACrE;AACA,MAAI,YAAY,SAAS,EAAG,QAAO,EAAE,MAAM,aAAa,KAAK;AAC7D,SAAO,EAAE,MAAM,EAAE,GAAG,MAAM,QAAQ,UAAU,GAAG,YAAY;AAC7D;AAWA,SAAS,WACP,KACA,WACA,MACA,MACQ;AACR,QAAM,QAAQ,UAAU,IAAI,QAAQ,SAAS;AAC7C,QAAM,QAAS,KAAK,SAAS,CAAC;AAE9B,MAAI,SAAkC;AACtC,QAAM,MAAM,MAAO,WAAW,KAAK;AAEnC,QAAM,SAAS;AAAA,IACb,MAAM,CAAC,KAAW,QAAc,IAAI,EAAE,KAAK,KAAK,GAAG;AAAA,IACnD,OAAO,CAAC,QAAc,IAAI,EAAE,MAAM,GAAG;AAAA,IACrC,SAAS,CAAC,MAAY,IAAI,EAAE,QAAQ,CAAC;AAAA,EACvC;AAEA,aAAW,OAAO,eAAe,KAAK,GAAG;AACvC,WAAO,IAAI,IAAI,IAAI,CAAC,UAAmC,CAAC,MACtD,SAAS,KAAK,OAAO,KAAK,OAAO,OAAO;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,SAAS,SACP,KACA,OACA,KACA,aACA,SACS;AACT,QAAM,UAAU,aAAa,IAAI,QAAQ,OAAO,GAAG;AACnD,QAAM,eAAwC,UAC1C,QAAQ,SACN,EAAE,CAAC,QAAQ,IAAI,GAAG,EAAE,MAAM,YAAY,EAAE,IACxC,EAAE,CAAC,QAAQ,IAAI,GAAG,YAAY,IAChC,CAAC;AACL,QAAM,QAAiC,QAAQ,QAC3C,EAAE,KAAK,CAAC,cAAc,QAAQ,KAAK,EAAE,IACrC;AAEJ,QAAM,WAAW,EAAE,GAAG,SAAS,MAAM;AACrC,MAAI,IAAI,QAAQ;AACd,WAAO,IAAI,OAAO,SAAS,IAAI,MAAM,QAAQ;AAAA,EAC/C;AAEA,SAAO;AAAA,IAAW;AAAA,IAAK,IAAI;AAAA,IAAM,EAAE,GAAG,SAAS,MAAM;AAAA,IAAG,MACtD,IAAI,OAAO,UAAU,IAAI,MAAM,QAAQ;AAAA,EACzC;AACF;AAEA,SAAS,aACP,QACA,OACA,KACuB;AACvB,QAAM,UAAU,UAAU,QAAQ,IAAI,IAAI;AAC1C,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,aAAa,QAAQ,OAAO;AAAA,IAChC,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,SAAS,MAAM;AAAA,EACjD;AACA,MAAI,IAAI,UAAU,MAAM;AACtB,UAAM,SAAS,WAAW,KAAK,CAAC,MAAM,EAAE,UAAU,SAAS,IAAI,UAAU,IAAI;AAC7E,QAAI,OAAQ,QAAO;AAAA,EACrB;AACA,SAAO,WAAW,CAAC;AACrB;;;AC3TO,IAAM,kBAAN,MAAsB;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACX,YAAY;AAAA;AAAA,EAGV,aAAmC,CAAC;AAAA,EACpC,cAA4B,CAAC;AAAA,EACtB,iBAAgC,CAAC;AAAA,EACjC;AAAA,EAKjB,YAAY,SAAwB;AAClC,SAAK,SAAS,QAAQ;AAEtB,UAAM,MACJ,QAAQ,iBAAiB,qBAAqB,QAAQ,QAAQ,QAAQ,IAAI,CAAC;AAC7E,QAAI,CAAC,QAAQ,cAAc,CAAC,KAAK;AAC/B,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,UAAM,SACJ,QAAQ,cAAc,mBAAmB,GAAI;AAE/C,SAAK,UAAU,IAAI,gBAAgB,EAAE,SAAS,OAAO,QAAQ,CAAC;AAC9D,SAAK,UAAU,YAAY,QAAQ,GAAG;AAEtC,SAAK,SAAS,aAAa,QAAQ,EAAE,SAAS,CAAC,MAAM,KAAK,cAAc,CAAC,EAAE,CAAC;AAC5E,SAAK,SAAS,IAAI,YAAY,QAAQ,QAAQ,KAAK,SAAS,KAAK,MAAM;AAEvE,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEQ,cAAc,OAAyB;AAC7C,SAAK,UAAU,KAAK;AACpB,eAAW,YAAY,KAAK,eAAgB,UAAS,KAAK;AAAA,EAC5D;AAAA,EAEQ,kBAAmC;AACzC,WAAO;AAAA,MACL,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,MACb,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAAA;AAAA,EAGQ,mBAAyB;AAC/B,UAAM,MAAM,KAAK,gBAAgB;AACjC,eAAW,SAAS,KAAK,OAAO,QAAQ;AACtC,aAAO,eAAe,MAAM,WAAW,MAAM,IAAI,GAAG;AAAA,QAClD,OAAO,cAAc,KAAK,MAAM,IAAI;AAAA,QACpC,YAAY;AAAA,QACZ,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS,WAAqC;AAC5C,UAAM,QAAc,OAAO,OAAO,IAAI;AACtC,UAAM,aAAa,CAAC,GAAG,KAAK,YAAY,SAAS;AACjD,UAAM,iBAAiB;AACvB,QAAI,UAAU,QAAQ;AACpB,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,MAAM,GAAG;AAC3D,eAAO,eAAe,OAAO,KAAK;AAAA,UAChC,OAAO,OAAO,UAAU,aAAa,MAAM,KAAK,KAAK,IAAI;AAAA,UACzD,YAAY;AAAA,UACZ,cAAc;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,KAAK,YAA8B;AACjC,SAAK,YAAY,KAAK,UAAU;AAAA,EAClC;AAAA;AAAA,EAGA,IAAI,OAAgB,UAA6B;AAC/C,QAAI,UAAU,QAAS,MAAK,eAAe,KAAK,QAAQ;AAAA,EAC1D;AAAA;AAAA,EAGA,MAAM,MAA6B;AACjC,WAAO,KAAK,WAAW,IAAI,CAAC;AAAA,EAC9B;AAAA,EAEA,MAAM,WAA0B;AAC9B,QAAI,KAAK,UAAW;AACpB,UAAM,KAAK,OAAO,QAAQ;AAC1B,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,MAAM,cAA6B;AACjC,QAAI,CAAC,KAAK,UAAW;AACrB,UAAM,KAAK,OAAO,WAAW;AAC7B,SAAK,YAAY;AAAA,EACnB;AAAA,EAkBA,aACE,KACA,SACkB;AAClB,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,aAAO,KAAK,OAAO,YAAY,YAAY;AACzC,cAAM,UAAe,CAAC;AACtB,mBAAW,SAAS,IAAK,SAAQ,KAAK,MAAM,MAAM,IAAI,CAAC;AACvD,eAAO;AAAA,MACT,GAAG,OAAO;AAAA,IACZ;AACA,WAAO,KAAK,OAAO,YAAY,MAAM,IAAI,IAAI,GAAG,OAAO;AAAA,EACzD;AAAA;AAAA,EAGA,gBACE,QACG,QACW;AACd,WAAO,KAAK,OAAO;AAAA,MAAY,CAAC,OAC9B,GAAG,MAAS,KAAK,OAAO,IAAI,UAAU,CAAC;AAAA,IACzC;AAAA,EACF;AAAA;AAAA,EAGA,kBAAkB,QAAgB,QAAoC;AACpE,WAAO,KAAK,OAAO,YAAY,OAAO,OAAO;AAC3C,YAAM,OAAO,MAAM,GAAG,MAAM,KAAK,OAAO,IAAI,UAAU,CAAC;AACvD,aAAO,MAAM,QAAQ,IAAI,IAAI,KAAK,SAAS;AAAA,IAC7C,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,UACE,YACG,QACW;AACd,UAAM,EAAE,KAAK,OAAO,IAAI,cAAc,SAAS,MAAM;AACrD,WAAO,KAAK,gBAAmB,KAAK,GAAG,MAAM;AAAA,EAC/C;AAAA,EAEA,YACE,YACG,QACc;AACjB,UAAM,EAAE,KAAK,OAAO,IAAI,cAAc,SAAS,MAAM;AACrD,WAAO,KAAK,kBAAkB,KAAK,GAAG,MAAM;AAAA,EAC9C;AACF;AAEA,SAAS,cACP,SACA,QACoC;AACpC,MAAI,MAAM;AACV,UAAQ,QAAQ,CAAC,MAAM,MAAM;AAC3B,WAAO;AACP,QAAI,IAAI,OAAO,OAAQ,QAAO;AAAA,EAChC,CAAC;AACD,SAAO,EAAE,KAAK,QAAQ,OAAO;AAC/B;AAEA,SAAS,WAAW,GAAmB;AACrC,SAAO;AACT;AAGA,SAAS,YACP,KACyB;AACzB,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,OAAO,QAAQ,WAAY,QAAO;AACtC,SAAO,CAAC,MAAkB;AACxB,UAAM,SAAS,EAAE,OAAO,SAAS,OAAO,KAAK,UAAU,EAAE,MAAM,CAAC,KAAK;AAErE,YAAQ;AAAA,MACN,gBAAgB,EAAE,WAAW,QAAQ,CAAC,CAAC,OAAO,EAAE,QAAQ,UAAU,EAAE,GAAG,GAAG,MAAM;AAAA,IAClF;AAAA,EACF;AACF;AAMO,SAAS,aAAa,SAAyC;AACpE,SAAO,IAAI,gBAAgB,OAAO;AACpC;;;AC5OA,IAAM,OAAO,CAAC,MAAwB,KAAK,OAAO,KAAK,OAAO,CAAC,EAAE,KAAK;AACtE,IAAM,YAAY,CAAC,MACjB,KAAK,OAAO,OAAO,OAAO,CAAC;AAGtB,IAAM,yBAAN,MAA6B;AAAA,EAClC,YAA6B,IAAwB;AAAxB;AAAA,EAAyB;AAAA,EAAzB;AAAA,EAE7B,MAAM,SAA4B;AAChC,UAAM,OAAO,MAAM,KAAK,GAAG;AAAA,MACzB;AAAA;AAAA;AAAA;AAAA;AAAA,IAKF;AACA,WAAO,KAAK,IAAI,CAAC,MAAM,KAAK,EAAE,mBAAmB,CAAC,CAAC;AAAA,EACrD;AAAA,EAEA,MAAM,UAAgC;AACpC,UAAM,OAAO,MAAM,KAAK,GAAG;AAAA,MACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAmBF;AACA,WAAO,KAAK,IAAI,CAAC,OAAO;AAAA,MACtB,OAAO,KAAK,EAAE,UAAU;AAAA,MACxB,MAAM,KAAK,EAAE,UAAU;AAAA,MACvB,UAAU,OAAO,EAAE,kBAAkB,CAAC;AAAA,MACtC,WAAW,OAAO,EAAE,cAAc,CAAC;AAAA,MACnC,cAAc,UAAU,EAAE,cAAc;AAAA,MACxC,QAAQ,UAAU,EAAE,YAAY;AAAA,MAChC,YAAY,UAAU,EAAE,WAAW;AAAA,MACnC,WAAW,UAAU,EAAE,eAAe;AAAA,MACtC,OAAO,UAAU,EAAE,WAAW;AAAA,MAC9B,SAAS,EAAE,aAAa,QAAQ,OAAO,EAAE,SAAS,MAAM;AAAA,MACxD,eAAe,EAAE,kBAAkB,OAAO,OAAO,KAAK,EAAE,cAAc;AAAA,MACtE,YAAY,EAAE,iBAAiB;AAAA,IACjC,EAAE;AAAA,EACJ;AAAA,EAEA,MAAM,cAAwC;AAC5C,UAAM,OAAO,MAAM,KAAK,GAAG;AAAA,MACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAeF;AAEA,UAAM,SAAS,oBAAI,IAA2B;AAC9C,UAAM,WAAW,oBAAI,IAAoB;AAEzC,eAAW,KAAK,MAAM;AACpB,YAAM,OAAO,KAAK,EAAE,eAAe;AACnC,UAAI,IAAI,OAAO,IAAI,IAAI;AACvB,UAAI,CAAC,GAAG;AACN,YAAI;AAAA,UACF,OAAO,KAAK,EAAE,UAAU;AAAA,UACxB,MAAM,KAAK,EAAE,eAAe;AAAA,UAC5B;AAAA,UACA,WAAW,EAAE,cAAc,OAAO,OAAO,KAAK,EAAE,UAAU;AAAA,UAC1D,SAAS,CAAC;AAAA,QACZ;AACA,YAAI,EAAE,SAAS,eAAe;AAC5B,YAAE,aAAa,KAAK,EAAE,WAAW,KAAK;AACtC,YAAE,aAAa,KAAK,EAAE,WAAW,KAAK;AACtC,mBAAS,IAAI,MAAM,KAAK,EAAE,OAAO,CAAC;AAAA,QACpC;AACA,eAAO,IAAI,MAAM,CAAC;AAAA,MACpB;AACA,YAAM,MAAM,KAAK,EAAE,UAAU;AAC7B,UAAI,OAAO,CAAC,EAAE,QAAQ,SAAS,GAAG,EAAG,GAAE,QAAQ,KAAK,GAAG;AAAA,IACzD;AAGA,eAAW,KAAK,OAAO,OAAO,GAAG;AAC/B,UAAI,EAAE,SAAS,cAAe;AAC9B,YAAM,SAAS,SAAS,IAAI,EAAE,IAAI;AAClC,UAAI,CAAC,OAAQ;AACb,YAAM,SAAS,OAAO,IAAI,MAAM;AAChC,UAAI,QAAQ;AACV,UAAE,aAAa,EAAE,OAAO,OAAO,OAAO,SAAS,CAAC,GAAG,OAAO,OAAO,EAAE;AAAA,MACrE,OAAO;AACL,cAAM,WAAW,MAAM,KAAK,yBAAyB,MAAM;AAC3D,YAAI,SAAU,GAAE,aAAa;AAAA,MAC/B;AAAA,IACF;AAEA,WAAO,CAAC,GAAG,OAAO,OAAO,CAAC;AAAA,EAC5B;AAAA,EAEA,MAAc,yBACZC,iBACsD;AACtD,UAAM,OAAO,MAAM,KAAK,GAAG;AAAA,MACzB;AAAA;AAAA;AAAA;AAAA;AAAA,MAKA,CAACA,eAAc;AAAA,IACjB;AACA,QAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,WAAO;AAAA,MACL,OAAO,KAAK,KAAK,CAAC,EAAG,UAAU;AAAA,MAC/B,SAAS,KAAK,IAAI,CAAC,MAAM,KAAK,EAAE,UAAU,CAAC;AAAA,IAC7C;AAAA,EACF;AACF;;;ACjKA,IAAM,KAAK;AAAA,EACT,UAAU;AAAA,EACV,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA,EACb,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,SAAS;AAAA,EACT,MAAM;AACR;AAWO,SAAS,cAAc,KAA4B;AACxD,QAAM,QAAQ,IAAI,SAAS;AAC3B,UAAQ,IAAI,WAAW;AAAA,IACrB,KAAK,GAAG;AACN,aAAO,QAAQ,IACX,QAAQ,GAAG,IACX,EAAE,QAAQ,OAAO,QAAQ,EAAE,MAAM,YAAY,MAAM,CAAC,EAAE,EAAE;AAAA,IAC9D,KAAK,GAAG;AACN,aAAO,QAAQ,IACX,QAAQ,GAAG,IACX,EAAE,QAAQ,OAAO,QAAQ,EAAE,MAAM,WAAW,MAAM,CAAC,EAAE,EAAE;AAAA,IAC7D,KAAK,GAAG;AACN,aAAO,QAAQ,IACX,QAAQ,GAAG,IACX,EAAE,QAAQ,UAAU,QAAQ,EAAE,MAAM,UAAU,MAAM,CAAC,EAAE,EAAE;AAAA,IAC/D,KAAK,GAAG;AACN,aAAO,EAAE,QAAQ,SAAS,QAAQ,EAAE,MAAM,SAAS,MAAM,CAAC,EAAE,EAAE;AAAA,IAChE,KAAK,GAAG;AACN,aAAO,EAAE,QAAQ,SAAS,QAAQ,EAAE,MAAM,mBAAmB,MAAM,CAAC,EAAE,EAAE;AAAA,IAC1E,KAAK,GAAG;AACN,aAAO,EAAE,QAAQ,WAAW,QAAQ,EAAE,MAAM,WAAW,MAAM,CAAC,EAAE,EAAE;AAAA,IACpE,KAAK,GAAG;AACN,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,EAAE,MAAM,QAAQ,MAAM,IAAI,aAAa,CAAC,IAAI,UAAU,IAAI,CAAC,EAAE;AAAA,MACvE;AAAA,IACF,KAAK,GAAG;AACN,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,EAAE,MAAM,WAAW,MAAM,IAAI,aAAa,CAAC,IAAI,UAAU,IAAI,CAAC,EAAE;AAAA,MAC1E;AAAA,IACF,KAAK,GAAG;AAAA,IACR,KAAK,GAAG;AACN,aAAO,EAAE,QAAQ,YAAY,QAAQ,EAAE,MAAM,QAAQ,MAAM,CAAC,EAAE,EAAE;AAAA,IAClE,KAAK,GAAG;AACN,aAAO,EAAE,QAAQ,YAAY,QAAQ,EAAE,MAAM,QAAQ,MAAM,CAAC,EAAE,EAAE;AAAA,IAClE,KAAK,GAAG;AACN,aAAO,EAAE,QAAQ,YAAY,QAAQ,EAAE,MAAM,aAAa,MAAM,CAAC,EAAE,EAAE;AAAA,IACvE,KAAK,GAAG;AAEN,aAAO,IAAI,iBAAiB,IACxB,EAAE,QAAQ,UAAU,QAAQ,EAAE,MAAM,QAAQ,MAAM,CAAC,EAAE,EAAE,IACvD,EAAE,QAAQ,SAAS,QAAQ,EAAE,MAAM,QAAQ,MAAM,CAAC,EAAE,EAAE;AAAA,IAC5D;AACE,aAAO,EAAE,QAAQ,SAAS;AAAA,EAC9B;AACF;AAEA,SAAS,QAAQ,KAA4B;AAC3C,QAAM,YAAY,IAAI,aAAa;AACnC,QAAM,WAAW,KAAK,IAAI,IAAI,SAAS,CAAC;AACxC,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ,EAAE,MAAM,WAAW,MAAM,CAAC,WAAW,QAAQ,EAAE;AAAA,EACzD;AACF;;;ACzDO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,QAAmB;AAAnB;AAAA,EAAoB;AAAA,EAApB;AAAA,EAE7B,MAAM,WAAW,UAA6B,CAAC,GAA4B;AACzE,UAAM,EAAE,QAAQ,SAAS,YAAY,IAAI,MAAM,KAAK,OAAO;AAAA,MACzD,OAAO,OAAO;AACZ,cAAM,SAAS,IAAI,uBAAuB,EAAE;AAC5C,eAAO;AAAA,UACL,QAAQ,MAAM,OAAO,OAAO;AAAA,UAC5B,SAAS,MAAM,OAAO,QAAQ;AAAA,UAC9B,aAAa,MAAM,OAAO,YAAY;AAAA,QACxC;AAAA,MACF;AAAA,MACA,EAAE,WAAW,2BAA2B;AAAA,IAC1C;AAEA,UAAM,iBAAiB,QAAQ,SAAS,CAAC,MAAM,EAAE,KAAK;AACtD,UAAM,qBAAqB,QAAQ,aAAa,CAAC,MAAM,EAAE,KAAK;AAC9D,UAAM,aAAa,aAAa,MAAM;AAEtC,UAAM,SAAsB,OAAO;AAAA,MAAI,CAAC,UACtC,KAAK;AAAA,QACH;AAAA,QACA;AAAA,QACA,eAAe,IAAI,KAAK,KAAK,CAAC;AAAA,QAC9B,mBAAmB,IAAI,KAAK,KAAK,CAAC;AAAA,MACpC;AAAA,IACF;AAEA,iBAAa,QAAQ,YAAY,WAAW;AAE5C,UAAM,QAAoB,CAAC;AAC3B,UAAM,MAAsB;AAAA,MAC1B,YAAY;AAAA,QACV,EAAE,MAAM,UAAU,UAAU,mBAAmB,QAAQ,gBAAgB,QAAQ,CAAC,EAAE;AAAA,MACpF;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,QAAQ,YAAY;AACtB,UAAI,aAAa;AAAA,QACf,MAAM,QAAQ,WAAW;AAAA,QACzB,UAAU,QAAQ,WAAW;AAAA,QAC7B,KAAK,QAAQ,WAAW,SACpB,EAAE,MAAM,OAAO,OAAO,QAAQ,WAAW,OAAO,IAChD,EAAE,MAAM,WAAW,OAAO,QAAQ,WAAW,OAAO,GAAG;AAAA,MAC7D;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,WACN,OACA,YACA,SACA,aACW;AACX,UAAM,YAAY,WAAW,IAAI,KAAK;AACtC,UAAM,KAAK,YAAY,KAAK,CAAC,MAAM,EAAE,SAAS,aAAa;AAC3D,UAAM,UAAU,YAAY,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ;AAE7D,UAAM,eAAe,aAAa,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,SAAS;AACvE,UAAM,SAAsB,QAAQ;AAAA,MAAI,CAAC,QACvC,WAAW,KAAK,cAAc,IAAI,OAAO;AAAA,IAC3C;AAEA,UAAM,QAAmB;AAAA,MACvB,MAAM;AAAA,MACN,QAAQ,cAAc,QAAQ,QAAQ;AAAA,MACtC;AAAA,MACA,YACE,MAAM,GAAG,QAAQ,SAAS,IACtB,GAAG,QAAQ,IAAI,CAAC,MAAM,aAAa,IAAI,CAAC,CAAE,IAC1C,CAAC;AAAA,MACP,eAAe,QACZ,OAAO,CAAC,MAAM,EAAE,QAAQ,SAAS,CAAC,EAClC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,IAAI,CAAC,MAAM,aAAa,IAAI,CAAC,CAAE,EAAE,EAAE;AAAA,MACtE,SAAS,CAAC;AAAA,IACZ;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,WACP,KACA,cACA,IACA,SACW;AACX,QAAM,YAAY,aAAa,IAAI,IAAI,IAAI;AAC3C,QAAM,SAAS,cAAc,GAAG;AAChC,QAAM,gBACJ,CAAC,CAAC,MAAM,GAAG,QAAQ,WAAW,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI;AAC3D,QAAM,iBAAiB,QAAQ;AAAA,IAC7B,CAAC,MAAM,EAAE,QAAQ,WAAW,KAAK,EAAE,QAAQ,CAAC,MAAM,IAAI;AAAA,EACxD;AAEA,QAAM,QAAmB;AAAA,IACvB,MAAM;AAAA,IACN,MAAM,OAAO;AAAA,IACb,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,YAAY,IAAI,WAAW;AAAA,IAC3B,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,QAAQ,cAAc,IAAI,OAAO,IAAI,OAAO;AAAA,IAC5C,YAAY,OAAO;AAAA,IACnB,SAAS,aAAa,GAAG;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,SAAS,aAAa,KAA0C;AAC9D,MAAI,IAAI,WAAY,QAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,MAAM,CAAC,EAAE,EAAE;AAC3E,MAAI,CAAC,IAAI,cAAe,QAAO;AAC/B,QAAM,MAAM,IAAI,cAAc,QAAQ,gBAAgB,EAAE,EAAE,KAAK;AAC/D,MAAI,sBAAsB,KAAK,GAAG,EAAG,QAAO,EAAE,UAAU,EAAE,MAAM,OAAO,MAAM,CAAC,EAAE,EAAE;AAClF,MAAI,kBAAkB,KAAK,GAAG,EAAG,QAAO,EAAE,SAAS,UAAU,KAAK,GAAG,EAAE;AACvE,MAAI,kBAAkB,KAAK,GAAG,EAAG,QAAO,EAAE,SAAS,OAAO,GAAG,EAAE;AAC/D,QAAM,MAAM,WAAW,KAAK,GAAG;AAC/B,MAAI,IAAK,QAAO,EAAE,SAAS,IAAI,CAAC,EAAG;AACnC,SAAO;AACT;AAOA,SAAS,aACP,QACA,YACA,aACM;AACN,QAAM,SAAS,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AACrD,aAAW,MAAM,aAAa;AAC5B,QAAI,GAAG,SAAS,iBAAiB,CAAC,GAAG,WAAY;AACjD,UAAM,aAAa,OAAO,IAAI,WAAW,IAAI,GAAG,KAAK,CAAE;AACvD,UAAM,cAAc,OAAO,IAAI,WAAW,IAAI,GAAG,WAAW,KAAK,CAAE;AACnE,QAAI,CAAC,cAAc,CAAC,YAAa;AAEjC,UAAM,kBAAkB,GAAG,QAAQ,IAAI,CAAC,MAAM,cAAc,YAAY,CAAC,CAAC;AAC1E,UAAM,gBAAgB,GAAG,WAAW,QAAQ;AAAA,MAAI,CAAC,MAC/C,cAAc,aAAa,CAAC;AAAA,IAC9B;AAEA,UAAM,iBAAiB,gBAAgB,YAAY,WAAW,YAAY,IAAI,CAAC;AAC/E,eAAW,OAAO,KAAK;AAAA,MACrB,MAAM;AAAA,MACN,MAAM,YAAY;AAAA,MAClB,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,YAAY,gBAAgB;AAAA,QAC1B,CAAC,MAAM,WAAW,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG;AAAA,MACtD;AAAA,MACA,MAAM;AAAA,MACN,UAAU;AAAA,MACV,aAAa;AAAA,MACb,UAAU;AAAA,QACR,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,UAAU,QAAQ,GAAG,UAAU;AAAA,QAC/B,UAAU,QAAQ,GAAG,UAAU;AAAA,MACjC;AAAA,IACF,CAAC;AAED,UAAM,WAAW;AAAA,MACf;AAAA,MACA,WAAW,UAAU,WAAW,IAAI,CAAC;AAAA,IACvC;AACA,gBAAY,OAAO,KAAK;AAAA,MACtB,MAAM;AAAA,MACN,MAAM,WAAW;AAAA,MACjB,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,UAAU;AAAA,MACV,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AACF;AAEA,SAAS,cAAc,OAAkB,QAAwB;AAC/D,QAAM,IAAI,MAAM,OAAO,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,MAAM;AAClE,SAAO,IAAI,EAAE,OAAO,UAAU,MAAM;AACtC;AAEA,SAAS,gBAAgB,OAAkB,MAAsB;AAC/D,MAAI,OAAO;AACX,MAAI,IAAI;AACR,SAAO,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,EAAG,QAAO,GAAG,IAAI,IAAI,EAAE,CAAC;AACvE,SAAO;AACT;AAEA,SAAS,QAAQ,MAAe;AAC9B,WAAS,QAAQ,IAAI,YAAY,GAAG;AAAA,IAClC,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAIA,SAAS,aACP,SACA,YAAmC,YACd;AACrB,QAAM,MAAM,oBAAI,IAAoB;AACpC,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,UAAU,KAAK,OAAO,GAAG;AAClC,QAAI,OAAO,UAAU,MAAM;AAC3B,QAAI,CAAC,KAAM,QAAO;AAClB,QAAI,YAAY;AAChB,QAAI,IAAI;AACR,WAAO,KAAK,IAAI,SAAS,EAAG,aAAY,GAAG,IAAI,IAAI,EAAE,CAAC;AACtD,SAAK,IAAI,SAAS;AAClB,QAAI,IAAI,QAAQ,SAAS;AAAA,EAC3B;AACA,SAAO;AACT;AAEA,SAAS,QAAW,OAAY,KAAyC;AACvE,QAAM,MAAM,oBAAI,IAAiB;AACjC,aAAW,QAAQ,OAAO;AACxB,UAAM,IAAI,IAAI,IAAI;AAClB,UAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC;AAC5B,SAAK,KAAK,IAAI;AACd,QAAI,IAAI,GAAG,IAAI;AAAA,EACjB;AACA,SAAO;AACT;;;AC9QA,IAAAC,kBAAyC;AACzC,IAAAC,oBAAiC;;;ACKjC,IAAM,YAAwC;AAAA,EAC5C,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM;AACR;AAGO,SAAS,WAAW,OAAkB,QAAgC;AAC3E,MAAI,MAAM,SAAS,OAAQ,QAAO,MAAM;AACxC,MAAI,MAAM,SAAS,SAAU,QAAO,MAAM;AAC1C,SAAO,UAAU,MAAM,IAAkB,KAAK;AAChD;;;ADFO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,QAAwB;AAAxB;AAAA,EAAyB;AAAA,EAAzB;AAAA,EAE7B,WAAmB;AACjB,UAAM,QAAkB,CAAC;AACzB,UAAM,KAAK,KAAK,OAAO,CAAC;AACxB,UAAM,KAAK,KAAK,MAAM,CAAC;AACvB,UAAM,KAAK,KAAK,WAAW,CAAC;AAC5B,UAAM,KAAK,KAAK,SAAS,CAAC;AAC1B,UAAM,KAAK,gBAAgB;AAC3B,UAAM,KAAK,KAAK,UAAU,CAAC;AAC3B,UAAM,KAAK,KAAK,YAAY,CAAC;AAC7B,WAAO,MAAM,OAAO,OAAO,EAAE,KAAK,MAAM,IAAI;AAAA,EAC9C;AAAA;AAAA,EAIQ,SAAiB;AACvB,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAgBc,KAAK,UAAU,KAAK,MAAM,CAAC;AAAA,EAClD;AAAA,EAEQ,QAAgB;AACtB,WAAO,KAAK,OAAO,MAAM,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,EAAE,KAAK,MAAM;AAAA,EACnE;AAAA,EAEQ,SAAS,MAAwB;AACvC,UAAM,SAAS,KAAK,OAAO,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,MAAM,EAAE,IAAI,GAAG,EAAE,KAAK,KAAK;AAC5E,WAAO,gBAAgB,KAAK,IAAI;AAAA,EAAS,MAAM;AAAA;AAAA,cACrC,KAAK,IAAI,cAAc,KAAK,IAAI,kBAAkB,KAAK,IAAI;AAAA,EACvE;AAAA,EAEQ,aAAqB;AAC3B,WAAO,KAAK,OAAO,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK,MAAM;AAAA,EACrE;AAAA,EAEQ,UAAU,OAA0B;AAC1C,UAAM,UAAU,aAAa,KAAK,EAC/B,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,KAAK,KAAK,WAAW,CAAC,CAAC,GAAG,EAChD,KAAK,IAAI;AAEZ,UAAM,QAAkB,CAAC;AAEzB,UAAM,KAAK,eAAe,MAAM,IAAI;AAAA,EAAS,OAAO;AAAA,GAAM;AAE1D,UAAM,KAAK,eAAe,MAAM,IAAI,6BAA6B,MAAM,IAAI,QAAQ;AACnF,UAAM,KAAK,KAAK,WAAW,KAAK,CAAC;AACjC,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,WAAW,OAA0B;AAC3C,UAAM,IAAI,MAAM;AAChB,UAAM,UAAU,eAAe,KAAK,EAAE,IAAI,CAAC,MAAM;AAC/C,UAAI,EAAE,QAAQ;AACZ,eAAO,KAAK,EAAE,IAAI,qBAAqB,EAAE,IAAI,yCAAyC,EAAE,IAAI;AAAA,MAC9F;AACA,aAAO,KAAK,EAAE,IAAI,qBAAqB,EAAE,IAAI,kCAAkC,EAAE,IAAI;AAAA,IACvF,CAAC;AACD,WAAO,eAAe,CAAC,oCAAoC,CAAC;AAAA,EAC9D,QAAQ,KAAK,IAAI,CAAC;AAAA;AAAA,EAElB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,WAAmB;AACzB,UAAM,QAAQ,KAAK,OAAO,OAAO,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,GAAG,EAAE,KAAK,KAAK;AAErE,UAAM,gBAAgB,KAAK,OAAO,OAC/B,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,KAAK,EAAE,IAAI,GAAG,EACpC,KAAK,IAAI;AAEZ,UAAM,kBAAkB,KAAK,OAAO,OACjC,IAAI,CAAC,MAAM;AACV,YAAM,OAAO,eAAe,CAAC,EAC1B,IAAI,CAAC,MAAM;AACV,cAAM,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,aAAa,uBAAuB;AACrE,eAAO,OAAO,EAAE,IAAI,eAAe,EAAE,IAAI,cAAc,EAAE,MAAM,GAAG,QAAQ;AAAA,MAC5E,CAAC,EACA,KAAK,KAAK;AACb,aAAO,KAAK,EAAE,IAAI,MAAM,OAAO;AAAA,EAAK,IAAI;AAAA,MAAS,EAAE;AAAA,IACrD,CAAC,EACA,KAAK,IAAI;AAEZ,WAAO,4BAA4B,SAAS,OAAO;AAAA;AAAA;AAAA,EAGrD,aAAa;AAAA;AAAA;AAAA;AAAA,EAIb,eAAe;AAAA;AAAA,EAEf;AAAA,EAEQ,WAAW,OAA0B;AAC3C,UAAM,OAAO,WAAW,OAAO,KAAK,MAAM;AAC1C,QAAI,MAAM,OAAQ,QAAO,GAAG,IAAI;AAChC,WAAO,MAAM,aAAa,OAAO,GAAG,IAAI;AAAA,EAC1C;AAAA;AAAA,EAIQ,YAAoB;AAC1B,UAAM,SAAmB,CAAC,cAAc;AACxC,eAAW,SAAS,KAAK,OAAO,QAAQ;AACtC,aAAO,KAAK,KAAK,WAAW,KAAK,CAAC;AAClC,aAAO,KAAK,KAAK,aAAa,KAAK,CAAC;AACpC,aAAO,KAAK,KAAK,cAAc,KAAK,CAAC;AACrC,aAAO,KAAK,KAAK,WAAW,KAAK,CAAC;AAClC,aAAO,KAAK,KAAK,UAAU,KAAK,CAAC;AACjC,aAAO,KAAK,KAAK,kBAAkB,KAAK,CAAC;AAAA,IAC3C;AACA,WAAO;AAAA,EAA8B,YAAY,OAAO,KAAK,MAAM,CAAC,CAAC;AAAA;AAAA,EACvE;AAAA,EAEQ,WAAW,OAA0B;AAC3C,UAAM,SAAmB,CAAC;AAC1B,eAAW,KAAK,MAAM,QAAQ;AAC5B,UAAI,EAAE,SAAS,UAAU;AACvB,eAAO,KAAK,KAAK,EAAE,IAAI,MAAM,KAAK,eAAe,CAAC,CAAC,GAAG;AAAA,MACxD,OAAO;AACL,eAAO,KAAK,KAAK,EAAE,IAAI,MAAM,KAAK,YAAY,CAAC,CAAC,GAAG;AAAA,MACrD;AAAA,IACF;AACA,WAAO,eAAe,MAAM,IAAI;AAAA,UAC1B,MAAM,IAAI,gBAAgB,MAAM,IAAI;AAAA,SACrC,MAAM,IAAI;AAAA,UACT,MAAM,IAAI,gBAAgB,MAAM,IAAI;AAAA,EAC5C,OAAO,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,cAGL,MAAM,IAAI,sBAAsB,KAAK,YAAY,KAAK,CAAC;AAAA,EACnE;AAAA,EAEQ,YAAY,OAA0B;AAC5C,UAAM,UAAU,oBAAI,IAAY;AAChC,eAAW,KAAK,MAAM,OAAQ,KAAI,EAAE,QAAQ,EAAE,SAAU,SAAQ,IAAI,EAAE,IAAI;AAC1E,eAAW,KAAK,MAAM,WAAY,SAAQ,IAAI,CAAC;AAC/C,UAAM,QAAQ,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,SAAS;AACvC,YAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACtD,aAAO,KAAK,IAAI,KAAK,WAAW,OAAO,KAAK,MAAM,CAAC;AAAA,IACrD,CAAC;AACD,UAAM,OAAO,WAAW,MAAM,IAAI;AAClC,WAAO,MAAM,SAAS,IAAI,MAAM,KAAK,KAAK,CAAC,OAAO,IAAI,KAAK;AAAA,EAC7D;AAAA,EAEQ,YAAY,OAA0B;AAC5C,UAAM,OAAO,WAAW,OAAO,KAAK,MAAM;AAC1C,UAAM,aAAa,kBAAkB,MAAM,IAAI,KAAK;AACpD,QAAI,MAAM,SAAS,QAAQ;AACzB,aAAO,GAAG,IAAI,iBAAiB,IAAI,UAAU,IAAI,eAAe,IAAI,aAAa,IAAI;AAAA,IACvF;AACA,QAAI,WAAY,QAAO,GAAG,IAAI,MAAM,UAAU;AAC9C,WAAO,GAAG,IAAI;AAAA,EAChB;AAAA,EAEQ,eAAe,OAA0B;AAC/C,QAAI,MAAM,QAAQ;AAChB,aAAO,YAAY,MAAM,IAAI,uBAAuB,MAAM,IAAI,sBAAsB,MAAM,IAAI;AAAA,IAChG;AACA,WAAO,GAAG,MAAM,IAAI,uBAAuB,MAAM,IAAI,8BAA8B,MAAM,IAAI;AAAA,EAC/F;AAAA,EAEQ,aAAa,OAA0B;AAC7C,UAAM,SAAS,aAAa,KAAK,EAC9B,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,eAAe,EACrC,KAAK,IAAI;AACZ,WAAO,eAAe,MAAM,IAAI;AAAA,EAAqB,MAAM;AAAA;AAAA,EAC7D;AAAA,EAEQ,cAAc,OAA0B;AAC9C,UAAM,YAAY,aAAa,KAAK,EACjC,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,aAAa,EACnC,KAAK,IAAI;AACZ,UAAM,SAAS,eAAe,KAAK,EAChC,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,gBAAgB,EAAE,IAAI,eAAe,EAC3D,KAAK,IAAI;AACZ,UAAM,UAAU,eAAe,KAAK,EACjC,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,gBAAgB,EAAE,IAAI,eAAe,EAC3D,KAAK,IAAI;AAEZ,UAAM,gBAAgB,eAAe,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM;AAClE,UAAM,YAAY,cAAc,SAC5B;AAAA,oCAAuC,cACpC,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,YAAY,EAChC,KAAK,IAAI,CAAC,UACb;AAEJ,WAAO,eAAe,MAAM,IAAI;AAAA,EAClC,SAAS,GAAG,SAAS,OAAO,SAAS,EAAE,GAAG,SAAS;AAAA;AAAA;AAAA,cAGvC,MAAM,IAAI;AAAA,EACtB,WAAW,uBAAuB,GAAG,SAAS;AAAA;AAAA,EAE9C;AAAA,EAEQ,WAAW,OAA0B;AAG3C,UAAMC,eAAc,oBAAI,IAAY;AACpC,eAAW,OAAO,eAAe,KAAK,GAAG;AACvC,iBAAW,MAAM,IAAI,UAAU,UAAU,CAAC,EAAG,CAAAA,aAAY,IAAI,EAAE;AAAA,IACjE;AACA,UAAM,gBAAgB,aAAa,KAAK,EACrC,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,EACrC,IAAI,CAAC,MAAM;AACV,YAAM,WACJ,mBAAmB,CAAC,KAAKA,aAAY,IAAI,EAAE,IAAI,IAAI,MAAM;AAC3D,aAAO,KAAK,EAAE,IAAI,GAAG,QAAQ,KAAK,KAAK,gBAAgB,CAAC,CAAC;AAAA,IAC3D,CAAC;AACH,UAAM,kBAAkB,eAAe,KAAK,EAAE;AAAA,MAC5C,CAAC,MAAM,KAAK,EAAE,IAAI,MAAM,KAAK,aAAa,CAAC,CAAC;AAAA,IAC9C;AACA,UAAM,gBAAgB,aAAa,KAAK,EAAE;AAAA,MACxC,CAAC,MAAM,KAAK,EAAE,IAAI,MAAM,KAAK,iBAAiB,CAAC,CAAC;AAAA,IAClD;AACA,UAAM,kBAAkB,eAAe,KAAK,EAAE;AAAA,MAC5C,CAAC,MAAM,KAAK,EAAE,IAAI,MAAM,KAAK,aAAa,CAAC,CAAC;AAAA,IAC9C;AAEA,WAAO,eAAe,MAAM,IAAI;AAAA,EAClC,CAAC,GAAG,eAAe,GAAG,eAAe,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,cAGrC,MAAM,IAAI;AAAA,EACtB,CAAC,GAAG,eAAe,GAAG,eAAe,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,EAEjD;AAAA,EAEQ,gBAAgB,OAA0B;AAChD,UAAM,OAAO,WAAW,OAAO,KAAK,MAAM;AAC1C,QAAI,MAAM,OAAQ,QAAO,GAAG,IAAI;AAChC,WAAO,MAAM,aAAa,OAAO,GAAG,IAAI;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAiB,OAA0B;AACjD,UAAM,QAAQ,KAAK,gBAAgB,KAAK;AACxC,QAAI,MAAM,OAAQ,QAAO;AACzB,UAAM,OAAO,WAAW,OAAO,KAAK,MAAM;AAC1C,QAAI,gBAAgB,IAAI,MAAM,IAAI,GAAG;AACnC,YAAM,WAAW,MAAM,aAAa,KAAK;AACzC,aAAO,GAAG,KAAK,cAAc,IAAI,GAAG,QAAQ,iBAAiB,IAAI,iBAAiB,IAAI,gBAAgB,IAAI,cAAc,IAAI;AAAA,IAC9H;AACA,WAAO,GAAG,KAAK,cAAc,KAAK;AAAA,EACpC;AAAA,EAEQ,aAAa,OAA0B;AAC7C,UAAM,IAAI,MAAM;AAChB,QAAI,MAAM,QAAQ;AAChB,aAAO,cAAc,CAAC,iBAAiB,CAAC,4BAA4B,CAAC,sBAAsB,CAAC,kDAAkD,CAAC,6BAA6B,CAAC,4BAA4B,CAAC,6BAA6B,CAAC;AAAA,IAC1O;AACA,WAAO,cAAc,CAAC,0BAA0B,CAAC,gDAAgD,CAAC,6BAA6B,CAAC;AAAA,EAClI;AAAA,EAEQ,aAAa,OAA0B;AAC7C,UAAM,IAAI,MAAM;AAChB,QAAI,MAAM,QAAQ;AAChB,aAAO,cAAc,CAAC,iBAAiB,CAAC,4BAA4B,CAAC,sBAAsB,CAAC,oCAAoC,CAAC,sBAAsB,CAAC,6BAA6B,CAAC,sBAAsB,CAAC,gCAAgC,CAAC,sBAAsB,CAAC;AAAA,IACvQ;AACA,WAAO,cAAc,CAAC,0BAA0B,CAAC;AAAA,EACnD;AAAA,EAEQ,UAAU,OAA0B;AAC1C,UAAM,IAAI,MAAM;AAChB,WAAO,eAAe,CAAC,+BAA+B,CAAC;AAAA;AAAA,cAE7C,CAAC;AAAA,YACH,CAAC;AAAA,cACC,CAAC,kBAAkB,CAAC;AAAA,aACrB,CAAC;AAAA,cACA,CAAC;AAAA,WACJ,CAAC;AAAA;AAAA;AAAA,aAGC,CAAC;AAAA,sBACQ,CAAC;AAAA;AAAA;AAAA,cAGT,CAAC,mBAAmB,CAAC;AAAA;AAAA,cAErB,CAAC;AAAA,WACJ,CAAC;AAAA,aACC,CAAC;AAAA,cACA,CAAC;AAAA,WACJ,CAAC;AAAA;AAAA;AAAA,cAGE,CAAC;AAAA,UACL,CAAC;AAAA,aACE,CAAC;AAAA,cACA,CAAC;AAAA,WACJ,CAAC;AAAA;AAAA;AAAA,cAGE,CAAC,4BAA4B,CAAC;AAAA;AAAA,cAE9B,CAAC;AAAA,UACL,CAAC;AAAA,aACE,CAAC;AAAA,WACH,CAAC;AAAA;AAAA;AAAA;AAAA,cAIE,CAAC;AAAA,WACJ,CAAC;AAAA,UACF,CAAC;AAAA,aACE,CAAC;AAAA,cACA,CAAC;AAAA,WACJ,CAAC;AAAA;AAAA;AAAA,cAGE,CAAC,8BAA8B,CAAC,qBAAqB,CAAC;AAAA;AAAA,cAEtD,CAAC;AAAA,WACJ,CAAC;AAAA,YACA,CAAC;AAAA,YACD,CAAC;AAAA,aACA,CAAC;AAAA,cACA,CAAC;AAAA,WACJ,CAAC;AAAA;AAAA;AAAA,cAGE,CAAC,yBAAyB,CAAC,8BAA8B,CAAC,qBAAqB,CAAC;AAAA,cAChF,CAAC,8BAA8B,CAAC;AAAA;AAAA,cAEhC,CAAC,yBAAyB,CAAC;AAAA;AAAA,cAE3B,CAAC;AAAA,YACH,CAAC;AAAA,yCAC4B,CAAC;AAAA,gCACV,CAAC;AAAA,gCACD,CAAC;AAAA,gCACD,CAAC;AAAA,gCACD,CAAC;AAAA;AAAA;AAAA,cAGnB,CAAC,iBAAiB,CAAC;AAAA,eAClB,CAAC;AAAA,aACH,CAAC;AAAA,cACA,CAAC,kBAAkB,CAAC;AAAA;AAAA,EAEhC;AAAA,EAEQ,kBAAkB,OAA0B;AAClD,UAAM,IAAI,MAAM;AAChB,WAAO,oBAAoB,CAAC;AAAA,uBACT,CAAC,oCAAoC,CAAC;AAAA,wBACrC,CAAC,6BAA6B,CAAC;AAAA,+BACxB,CAAC,6BAA6B,CAAC;AAAA,yBACrC,CAAC,6BAA6B,CAAC;AAAA,gCACxB,CAAC,6BAA6B,CAAC;AAAA,qBAC1C,CAAC,iCAAiC,CAAC;AAAA,qBACnC,CAAC;AAAA,kCACY,CAAC,8CAA8C,CAAC;AAAA,qBAC7D,CAAC,iCAAiC,CAAC;AAAA,qBACnC,CAAC;AAAA,qBACD,CAAC,iCAAiC,CAAC;AAAA,qBACnC,CAAC,iCAAiC,CAAC;AAAA,sBAClC,CAAC;AAAA,iBACN,CAAC;AAAA,qBACG,CAAC;AAAA,kBACJ,CAAC;AAAA;AAAA,EAEjB;AAAA;AAAA,EAIQ,cAAsB;AAC5B,UAAM,YAAY,KAAK,OAAO,OAC3B,IAAI,CAAC,MAAM,sBAAsB,WAAW,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,WAAW,EAChF,KAAK,IAAI;AACZ,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWT,SAAS;AAAA;AAAA,EAET;AACF;AAEO,SAAS,qBAAqB,QAAgC;AACnE,SAAO,IAAI,gBAAgB,MAAM,EAAE,SAAS;AAC9C;AAGO,SAAS,YAAY,QAAwB,QAAwB;AAC1E,QAAM,SAAS,qBAAqB,MAAM;AAC1C,QAAM,WAAO,2BAAQ,QAAQ,UAAU;AACvC,qCAAU,2BAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,qCAAc,MAAM,QAAQ,MAAM;AAClC,SAAO;AACT;AASA,IAAM,mBAAmB;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;AAkDzB,IAAM,kBAAkB,oBAAI,IAAI,CAAC,OAAO,UAAU,SAAS,SAAS,CAAC;AAErE,IAAM,oBAA4C;AAAA,EAChD,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM;AACR;AAEA,IAAM,iBAAiB;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;AAgEvB,SAAS,oBAAoB,OAA2B;AACtD,SAAO,MAAM,SAAS,UAAU,SAAS;AAC3C;AAEA,SAAS,mBAAmB,OAA2B;AACrD,SAAO,CAAC,MAAM,cAAc,CAAC,CAAC,MAAM,WAAW,MAAM,eAAe,MAAM;AAC5E;AAEA,SAAS,YAAY,MAAsB;AACzC,SAAO,KACJ,MAAM,IAAI,EACV,IAAI,CAAC,MAAO,IAAI,OAAO,IAAI,CAAE,EAC7B,KAAK,IAAI;AACd;;;AEtlBA,IAAAC,kBAAyC;AACzC,IAAAC,oBAAqB;;;AC+Dd,SAAS,YACd,SACA,SACY;AACZ,QAAM,iBAAiB,IAAI;AAAA,IACzB,QAAQ,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;AAAA,EAC9C;AACA,QAAM,gBAAgB,IAAI,IAAI,QAAQ,OAAO,IAAI,CAAC,MAAM,WAAW,CAAC,CAAC,CAAC;AAEtE,QAAM,gBAA6B,CAAC;AACpC,QAAM,eAA8B,CAAC;AAErC,aAAW,SAAS,QAAQ,QAAQ;AAClC,UAAM,QAAQ,WAAW,KAAK;AAC9B,UAAM,eAAe,eAAe,IAAI,KAAK;AAC7C,QAAI,CAAC,cAAc;AACjB,oBAAc,KAAK,KAAK;AACxB;AAAA,IACF;AACA,UAAM,SAAS,UAAU,SAAS,OAAO,cAAc,KAAK;AAC5D,QAAI,gBAAgB,MAAM,EAAG,cAAa,KAAK,MAAM;AAAA,EACvD;AAEA,QAAM,gBAAgB,QAAQ,OAC3B,IAAI,CAAC,MAAM,WAAW,CAAC,CAAC,EACxB,OAAO,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC;AAEtC,SAAO,EAAE,eAAe,eAAe,aAAa;AACtD;AAEA,SAAS,UACP,SACA,OACA,SACA,OACa;AACb,QAAM,cAAc,IAAI;AAAA,IACtB,aAAa,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;AAAA,EACpD;AACA,QAAM,cAAc,IAAI;AAAA,IACtB,aAAa,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;AAAA,EACtD;AAEA,QAAM,eAA4B,CAAC;AACnC,QAAM,iBAAiC,CAAC;AACxC,aAAW,CAAC,KAAK,KAAK,KAAK,aAAa;AACtC,UAAM,WAAW,YAAY,IAAI,GAAG;AACpC,QAAI,CAAC,UAAU;AACb,mBAAa,KAAK,KAAK;AACvB;AAAA,IACF;AACA,UAAM,cAAc,CAAC,eAAe,OAAO,QAAQ;AACnD,UAAM,qBAAqB,MAAM,eAAe,SAAS;AACzD,QAAI,eAAe,oBAAoB;AACrC,qBAAe,KAAK,EAAE,OAAO,OAAO,aAAa,mBAAmB,CAAC;AAAA,IACvE;AAAA,EACF;AAEA,QAAM,iBAAiB,CAAC,GAAG,YAAY,KAAK,CAAC,EAAE;AAAA,IAC7C,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC;AAAA,EAC3B;AAEA,QAAM,oBAAoB,iBAAiB,OAAO,EAAE,IAAI,MAAM;AAC9D,QAAM,eAAe,iBAAiB,KAAK,EACxC,OAAO,CAAC,SAAS,CAAC,kBAAkB,SAAS,OAAO,IAAI,CAAC,CAAC,EAC1D,IAAI,CAAC,UAAU,EAAE,MAAM,eAAe,MAAM,OAAO,IAAI,GAAG,SAAS,KAAK,EAAE;AAE7E,QAAM,gBAAgB,YAAY,SAAS,OAAO,EAAE,IAAI,KAAK;AAC7D,QAAM,mBAAmB,YAAY,SAAS,KAAK,EAChD,OAAO,CAAC,OAAO,CAAC,cAAc,SAAS,MAAM,EAAE,CAAC,CAAC,EACjD,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,MAAM,eAAe,MAAM,OAAO,GAAG,OAAO,EAAE,EAAE;AAEzE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,GAAyB;AAChD,SACE,EAAE,aAAa,SAAS,KACxB,EAAE,eAAe,SAAS,KAC1B,EAAE,eAAe,SAAS,KAC1B,EAAE,aAAa,SAAS,KACxB,EAAE,iBAAiB,SAAS;AAEhC;AAKO,SAAS,iBAAiB,OAA8B;AAC7D,QAAM,OAAmB,CAAC;AAC1B,aAAW,KAAK,aAAa,KAAK,GAAG;AACnC,QAAI,EAAE,SAAU,MAAK,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;AAAA,EAC5C;AACA,aAAW,KAAK,MAAM,eAAe;AACnC,SAAK,KAAK,EAAE,OAAO,IAAI,CAAC,SAAS,UAAU,OAAO,IAAI,CAAC,CAAC;AAAA,EAC1D;AACA,SAAO;AACT;AAEO,SAAS,WAAW,OAA+B;AACxD,SAAO,MAAM,QAAQ,IAAI,CAAC,OAAO;AAAA,IAC/B,MAAM,EAAE,QAAQ,eAAe,OAAO,WAAW,KAAK,GAAG,EAAE,OAAO,IAAI,CAAC,MAAM,UAAU,OAAO,CAAC,CAAC,CAAC;AAAA,IACjG,SAAS,EAAE,OAAO,IAAI,CAAC,SAAS,UAAU,OAAO,IAAI,CAAC;AAAA,IACtD,QAAQ,EAAE;AAAA,EACZ,EAAE;AACJ;AAGO,SAAS,YACd,QACA,OACgC;AAChC,QAAM,MAAsC,CAAC;AAC7C,aAAW,KAAK,eAAe,KAAK,GAAG;AACrC,UAAM,MAAM,EAAE;AACd,QAAI,CAAC,KAAK,QAAQ,OAAQ;AAC1B,UAAM,WAAW,OAAO,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI;AAC5D,QAAI,CAAC,SAAU;AACf,QAAI,KAAK;AAAA,MACP,SAAS,IAAI,OAAO,IAAI,CAAC,SAAS,UAAU,OAAO,IAAI,CAAC;AAAA,MACxD,UAAU,WAAW,QAAQ;AAAA,MAC7B,aAAa,IAAI,cAAc,CAAC,GAAG,IAAI,CAAC,SAAS,UAAU,UAAU,IAAI,CAAC;AAAA,MAC1E,UAAU,IAAI;AAAA,MACd,UAAU,IAAI;AAAA,IAChB,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,UAAU,OAAkB,WAA2B;AAC9D,QAAM,IAAI,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS;AACvD,SAAO,IAAI,YAAY,CAAC,IAAI,UAAU,YAAY;AACpD;AAIA,SAAS,eAAe,GAAc,GAAuB;AAC3D,MAAI,EAAE,SAAS,EAAE,KAAM,QAAO;AAC9B,SAAO,WAAW,EAAE,YAAY,EAAE,UAAU;AAC9C;AAEA,SAAS,WAAW,GAAgB,GAAyB;AAC3D,MAAI,CAAC,KAAK,CAAC,EAAG,QAAO;AACrB,MAAI,CAAC,KAAK,CAAC,EAAG,QAAO;AACrB,SAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,KAAK,GAAG,MAAM,EAAE,KAAK,KAAK,GAAG;AAClE;AAEA,SAAS,OAAO,MAAwB;AACtC,SAAO,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG;AAClC;AAEA,SAAS,MAAM,IAA0C;AACvD,SAAO,GAAG,OAAO,GAAG,OAAO,CAAC,KAAK,GAAG,QAAQ,IAAI,OAAO,GAAG,UAAU,CAAC;AACvE;AAGO,SAAS,eACd,QACA,OACA,SACQ;AACR,QAAM,OAAO,GAAG,MAAM,IAAI,KAAK,IAAI,QAAQ,KAAK,GAAG,CAAC,GAAG,QAAQ,kBAAkB,GAAG;AACpF,MAAI,KAAK,UAAU,GAAI,QAAO;AAE9B,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAK,QAAQ,OAAO,KAAK,KAAK,WAAW,CAAC,IAAK;AAChF,QAAM,SAAS,KAAK,IAAI,IAAI,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC;AACrD,SAAO,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC,IAAI,MAAM;AACvC;;;AC/NO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAA6B,GAAe;AAAf;AAAA,EAAgB;AAAA,EAAhB;AAAA;AAAA;AAAA,EAK7B,WAAW,OAA0B;AACnC,UAAM,SAAS,MAAM;AACrB,QAAI,QAAQ;AACV,YAAM,OAAO,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,IAAI,CAAC,MAAM;AAClE,cAAQ,OAAO,MAAM;AAAA,QACnB,KAAK;AACH,iBAAO,UAAU,QAAQ,OAAO;AAAA,QAClC,KAAK;AACH,iBAAO,OAAO,QAAQ,KAAK;AAAA,QAC7B,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO,UAAU,QAAQ,SAAS;AAAA,QACpC,KAAK;AACH,iBAAO,KAAK,EAAE,kBAAkB;AAAA,QAClC,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,QACT,KAAK;AACH,iBAAO;AAAA,MACX;AAAA,IACF;AACA,QAAI,MAAM,SAAS,UAAW,QAAO,KAAK,EAAE,kBAAkB;AAC9D,WAAO,iBAAiB,MAAM,IAAkB,KAAK;AAAA,EACvD;AAAA;AAAA,EAGA,iBAAiB,OAA0B;AACzC,UAAM,QAAQ,CAAC,KAAK,EAAE,QAAQ,YAAY,KAAK,CAAC,GAAG,KAAK,WAAW,KAAK,CAAC;AACzE,QAAI,WAAW,KAAK,KAAK,KAAK,EAAE,kBAAkB;AAChD,YAAM,KAAK,kCAAkC;AAAA,IAC/C,WAAW,CAAC,WAAW,KAAK,GAAG;AAC7B,YAAM,MAAM,cAAc,MAAM,OAAO;AACvC,UAAI,IAAK,OAAM,KAAK,GAAG;AAAA,IACzB;AACA,QAAI,MAAM,WAAY,OAAM,KAAK,UAAU;AAC3C,WAAO,MAAM,KAAK,GAAG;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,qBAAqB,OAA4B;AAC/C,QAAI,KAAK,EAAE,iBAAkB,QAAO,CAAC;AACrC,UAAM,QAAQ,WAAW,KAAK;AAC9B,UAAM,MAAgB,CAAC;AACvB,eAAW,SAAS,aAAa,KAAK,GAAG;AACvC,UAAI,WAAW,KAAK,GAAG;AACrB,YAAI,KAAK,GAAG,KAAK,uBAAuB,OAAO,YAAY,KAAK,CAAC,CAAC;AAAA,MACpE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,uBAAuB,OAAe,QAA0B;AAC9D,QAAI,KAAK,EAAE,iBAAkB,QAAO,CAAC;AACrC,UAAM,MAAM,QAAQ,OAAO,KAAK,IAAI,MAAM,EAAE;AAC5C,UAAM,OAAO,QAAQ,GAAG,KAAK,OAAO,MAAM,EAAE;AAC5C,UAAM,SAAS,KAAK,EAAE,QAAQ,KAAK;AACnC,UAAM,OAAO,KAAK,EAAE,QAAQ,MAAM;AAClC,UAAM,OAAO,KAAK,EAAE,QAAQ,GAAG;AAC/B,WAAO;AAAA,MACL,mBAAmB,IAAI;AAAA,MACvB,kBAAkB,KAAK,EAAE,QAAQ,IAAI,CAAC,QAAQ,MAAM;AAAA;AAAA,YAErC,IAAI,sBAAsB,IAAI,aAAa,IAAI;AAAA;AAAA,IAEhE;AAAA,EACF;AAAA;AAAA,EAIA,YAAY,OAA0B;AACpC,UAAM,OAAO,aAAa,KAAK,EAAE,IAAI,CAAC,MAAM,OAAO,KAAK,iBAAiB,CAAC,CAAC;AAC3E,UAAM,KAAK,SAAS,KAAK;AACzB,UAAM,QAAQ,CAAC,GAAG,IAAI;AACtB,QAAI,GAAG,SAAS,GAAG;AACjB,YAAM;AAAA,QACJ,kBAAkB,GAAG,IAAI,CAAC,MAAM,KAAK,EAAE,QAAQ,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,MAC5E;AAAA,IACF;AACA,WAAO,gBAAgB,KAAK,EAAE,QAAQ,WAAW,KAAK,CAAC,CAAC;AAAA,EAAO,MAAM,KAAK,KAAK,CAAC;AAAA;AAAA,EAClF;AAAA,EAEA,UAAU,OAAuB;AAC/B,WAAO,cAAc,KAAK,EAAE,QAAQ,KAAK,CAAC;AAAA,EAC5C;AAAA,EAEA,UAAU,OAAe,OAA0B;AACjD,WAAO,eAAe,KAAK,EAAE,QAAQ,KAAK,CAAC,QAAQ,KAAK,iBAAiB,KAAK,CAAC;AAAA,EACjF;AAAA,EAEA,WAAW,OAAe,QAAwB;AAChD,WAAO,eAAe,KAAK,EAAE,QAAQ,KAAK,CAAC,SAAS,KAAK,EAAE,QAAQ,MAAM,CAAC;AAAA,EAC5E;AAAA;AAAA,EAGA,gBAAgB,OAAe,OAA0B;AACvD,WAAO,eAAe,KAAK,EAAE,QAAQ,KAAK,CAAC,iBAAiB,KAAK,EAAE;AAAA,MACjE,YAAY,KAAK;AAAA,IACnB,CAAC,SAAS,KAAK,WAAW,KAAK,CAAC;AAAA,EAClC;AAAA,EAEA,WAAW,OAAe,QAAgB,SAA0B;AAClE,UAAM,SAAS,UAAU,iBAAiB;AAC1C,WAAO,eAAe,KAAK,EAAE,QAAQ,KAAK,CAAC,iBAAiB,KAAK,EAAE;AAAA,MACjE;AAAA,IACF,CAAC,IAAI,MAAM;AAAA,EACb;AAAA;AAAA,EAIA,UAAU,OAAe,MAAc,SAA2B;AAChE,WAAO,eAAe,KAAK,EAAE,QAAQ,KAAK,CAAC,mBAAmB,KAAK,EAAE;AAAA,MACnE;AAAA,IACF,CAAC,YAAY,QAAQ,IAAI,CAAC,MAAM,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,EAC/D;AAAA,EAEA,eAAe,OAAe,MAAsB;AAClD,WAAO,eAAe,KAAK,EAAE,QAAQ,KAAK,CAAC,oBAAoB,KAAK,EAAE,QAAQ,IAAI,CAAC;AAAA,EACrF;AAAA,EAEA,cACE,OACA,MACA,SACA,UACA,YACA,UACA,UACQ;AACR,QAAI,MAAM,eAAe,KAAK,EAAE,QAAQ,KAAK,CAAC,mBAAmB,KAAK,EAAE;AAAA,MACtE;AAAA,IACF,CAAC,iBAAiB,QAAQ,IAAI,CAAC,MAAM,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,gBAAgB,KAAK,EAAE;AAAA,MACvF;AAAA,IACF,CAAC,KAAK,WAAW,IAAI,CAAC,MAAM,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AACzD,QAAI,SAAU,QAAO,cAAc,eAAe,QAAQ,CAAC;AAC3D,QAAI,SAAU,QAAO,cAAc,eAAe,QAAQ,CAAC;AAC3D,WAAO;AAAA,EACT;AAAA,EAEA,YACE,OACA,MACA,SACA,QACQ;AACR,WAAO,UAAU,SAAS,YAAY,EAAE,SAAS,KAAK,EAAE,QAAQ,IAAI,CAAC,OAAO,KAAK,EAAE;AAAA,MACjF;AAAA,IACF,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,EACxD;AAAA,EAEA,UAAU,MAAsB;AAC9B,WAAO,cAAc,KAAK,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC3C;AACF;AAIA,IAAM,mBAA+C;AAAA,EACnD,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM;AACR;AAEO,SAAS,WAAW,OAA2B;AACpD,SAAO,MAAM,SAAS,UAAU,SAAS;AAC3C;AAGA,SAAS,QAAQ,MAAsB;AACrC,QAAM,OAAO,KAAK,QAAQ,kBAAkB,GAAG;AAC/C,MAAI,KAAK,UAAU,GAAI,QAAO;AAC9B,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAK,QAAQ,OAAO,KAAK,KAAK,WAAW,CAAC,IAAK;AAChF,SAAO,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACxE;AAEA,SAAS,cAAc,KAA8C;AACnE,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,IAAI,UAAU;AAChB,YAAQ,IAAI,SAAS,MAAM;AAAA,MACzB,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AACA,MAAI,IAAI,YAAY,OAAW,QAAO;AACtC,MAAI,OAAO,IAAI,YAAY,WAAW;AACpC,WAAO,WAAW,IAAI,UAAU,SAAS,OAAO;AAAA,EAClD;AACA,MAAI,OAAO,IAAI,YAAY,SAAU,QAAO,WAAW,IAAI,OAAO;AAClE,SAAO,YAAY,OAAO,IAAI,OAAO,EAAE,QAAQ,MAAM,IAAI,CAAC;AAC5D;AAEA,SAAS,eAAe,QAAwB;AAC9C,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;AClPO,SAAS,cACd,MACA,SACA,SACU;AACV,QAAM,MAAM,IAAI,YAAY,OAAO;AACnC,QAAM,QAAkB,CAAC;AACzB,QAAM,UAAoB,CAAC;AAC3B,QAAM,SAAmB,CAAC;AAC1B,QAAM,cAAwB,CAAC;AAC/B,QAAM,UAAoB,CAAC;AAC3B,QAAM,kBAA4B,CAAC;AAGnC,aAAW,UAAU,KAAK,cAAc;AACtC,eAAW,OAAO,OAAO,gBAAgB;AACvC,YAAM,KAAK,IAAI,WAAW,OAAO,OAAO,GAAG,CAAC;AAAA,IAC9C;AAAA,EACF;AACA,aAAW,SAAS,KAAK,eAAe;AACtC,UAAM,KAAK,IAAI,UAAU,KAAK,CAAC;AAAA,EACjC;AAGA,aAAW,SAAS,KAAK,eAAe;AACtC,UAAM,QAAQ,WAAW,KAAK;AAC9B,YAAQ,KAAK,IAAI,YAAY,KAAK,CAAC;AAEnC,YAAQ,KAAK,GAAG,IAAI,qBAAqB,KAAK,CAAC;AAC/C,eAAW,QAAQ,iBAAiB,KAAK,GAAG;AAG1C,UAAI,KAAK,WAAW,EAAG;AACvB,kBAAY;AAAA,QACV,IAAI,UAAU,OAAO,eAAe,MAAM,OAAO,IAAI,GAAG,IAAI;AAAA,MAC9D;AAAA,IACF;AACA,eAAW,OAAO,WAAW,KAAK,GAAG;AACnC,cAAQ,KAAK,IAAI,YAAY,OAAO,IAAI,MAAM,IAAI,SAAS,IAAI,MAAM,CAAC;AAAA,IACxE;AACA,eAAW,MAAM,YAAY,SAAS,KAAK,GAAG;AAC5C,sBAAgB;AAAA,QACd,IAAI;AAAA,UACF;AAAA,UACA,eAAe,MAAM,OAAO,GAAG,OAAO;AAAA,UACtC,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,aAAW,UAAU,KAAK,cAAc;AACtC,eAAW,SAAS,OAAO,cAAc;AACvC,aAAO,KAAK,IAAI,UAAU,OAAO,OAAO,KAAK,CAAC;AAC9C,UAAI,WAAW,KAAK,GAAG;AACrB,gBAAQ;AAAA,UACN,GAAG,IAAI,uBAAuB,OAAO,OAAO,YAAY,KAAK,CAAC;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AACA,eAAW,MAAM,OAAO,gBAAgB;AACtC,UAAI,GAAG,YAAa,QAAO,KAAK,IAAI,gBAAgB,GAAG,OAAO,GAAG,KAAK,CAAC;AACvE,UAAI,GAAG,oBAAoB;AACzB,eAAO;AAAA,UACL,IAAI,WAAW,GAAG,OAAO,WAAW,EAAE,GAAG,GAAG,MAAM,UAAU;AAAA,QAC9D;AAAA,MACF;AAAA,IACF;AACA,eAAW,MAAM,OAAO,cAAc;AACpC,UAAI,GAAG,QAAQ,WAAW,GAAG;AAE3B,oBAAY,KAAK,IAAI,UAAU,OAAO,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAAA,MACnE,OAAO;AACL,oBAAY,KAAK,IAAI,UAAU,OAAO,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAAA,MACnE;AAAA,IACF;AACA,eAAW,MAAM,OAAO,kBAAkB;AACxC,sBAAgB;AAAA,QACd,IAAI;AAAA,UACF,OAAO;AAAA,UACP,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AACF;AAOA,IAAM,aAAa;AAGZ,SAAS,mBAAmB,YAA8B;AAC/D,MAAI,WAAW,WAAW,EAAG,QAAO;AACpC,SAAO,WAAW,KAAK;AAAA,EAAK,UAAU;AAAA,CAAI,IAAI;AAChD;AAGO,SAAS,gBAAgB,KAAuB;AACrD,SAAO,IACJ,MAAM,UAAU,EAChB,IAAI,CAAC,MAAM,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,SAAS,EAAE,EAAE,KAAK,CAAC,EAC9D,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC/B;AAEA,SAAS,cAAc,KAAqB;AAC1C,SAAO,IACJ,MAAM,IAAI,EACV,OAAO,CAAC,SAAS,CAAC,KAAK,KAAK,EAAE,WAAW,IAAI,CAAC,EAC9C,KAAK,IAAI;AACd;AAEA,SAAS,WAAW,IAA0D;AAC5E,SAAO,GAAG,MAAM,UAAU,GAAG,MAAM,KAAK,YAAY;AACtD;;;ACxJA,IAAAC,kBAAsD;AACtD,IAAAC,oBAAqB;AAId,IAAM,gBAAgB;AAe7B,eAAsB,mBACpB,IACA,SACe;AACf,QAAM,SAAS,MAAM,GAAG;AAAA,IACtB;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AACA,MAAI,OAAO,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,EAAG;AAEnC,QAAM,IAAI,QAAQ,QAAQ,aAAa;AACvC,QAAM,GAAG;AAAA,IACP,gBAAgB,CAAC;AAAA,SACZ,QAAQ,QAAQ,IAAI,CAAC;AAAA,SACrB,QAAQ,QAAQ,UAAU,CAAC;AAAA,SAC3B,QAAQ,QAAQ,OAAO,CAAC;AAAA,SACxB,QAAQ,QAAQ,YAAY,CAAC;AAAA;AAAA,EAEpC;AACF;AAEA,eAAsB,kBACpB,IACA,SAC6B;AAC7B,QAAM,IAAI,QAAQ,QAAQ,aAAa;AACvC,QAAM,OAAO,MAAM,GAAG;AAAA,IACpB,UAAU,QAAQ,QAAQ,IAAI,CAAC,aAAa,QAAQ,QAAQ,UAAU,CAAC,mBAAmB,QAAQ,QAAQ,OAAO,CAAC,oBAAoB,CAAC,aAAa,QAAQ,QAAQ,IAAI,CAAC;AAAA,EAC3K;AACA,SAAO,KAAK,IAAI,CAAC,OAAO;AAAA,IACtB,IAAI,OAAO,EAAE,EAAE,EAAE,KAAK;AAAA,IACtB,UAAU,EAAE,YAAY,OAAO,KAAK,OAAO,EAAE,QAAQ,EAAE,KAAK;AAAA,IAC5D,OAAO,OAAO,EAAE,SAAS,CAAC;AAAA,EAC5B,EAAE;AACJ;AAEA,eAAsB,gBACpB,IACA,SACA,WACe;AACf,QAAM,IAAI,QAAQ,QAAQ,aAAa;AACvC,QAAM,GAAG;AAAA,IACP,eAAe,CAAC,KAAK,QAAQ,QAAQ,IAAI,CAAC,KAAK,QAAQ,QAAQ,UAAU,CAAC,KAAK,QAAQ,QAAQ,OAAO,CAAC;AAAA,IACvG,CAAC,UAAU,IAAI,UAAU,UAAU,UAAU,KAAK;AAAA,EACpD;AACF;AAGO,SAAS,oBAAoB,eAAyC;AAC3E,MAAI,KAAC,4BAAW,aAAa,EAAG,QAAO,CAAC;AACxC,aAAO,6BAAY,eAAe,EAAE,eAAe,KAAK,CAAC,EACtD,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EAC7B,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,EACL,IAAI,CAAC,OAAO;AACX,UAAM,UAAM,wBAAK,eAAe,EAAE;AAClC,UAAM,WAAO,wBAAK,KAAK,eAAe;AACtC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAK,4BAAW,IAAI,QAAI,8BAAa,MAAM,MAAM,IAAI;AAAA,IACvD;AAAA,EACF,CAAC,EACA,OAAO,CAAC,MAAM,EAAE,IAAI,SAAS,CAAC;AACnC;AAGO,SAAS,SAAS,KAAqB;AAC5C,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,SAAK,IAAI,WAAW,CAAC;AACrB,QAAI,KAAK,KAAK,GAAG,QAAU;AAAA,EAC7B;AACA,UAAQ,MAAM,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAC/C;;;AJ/CO,IAAM,WAAN,MAAe;AAAA,EAGpB,YACmB,QACA,SACA,eACjB,SACA;AAJiB;AACA;AACA;AAGjB,SAAK,UAAU,WAAW,IAAI,gBAAgB;AAAA,EAChD;AAAA,EANmB;AAAA,EACA;AAAA,EACA;AAAA,EALF;AAAA;AAAA,EAYjB,MAAM,OAA4B;AAChC,UAAM,UAAU,MAAM,KAAK,cAAc;AACzC,WAAO,YAAY,KAAK,SAAS,OAAO;AAAA,EAC1C;AAAA;AAAA,EAGA,MAAM,OAA0B;AAC9B,UAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,WAAO,cAAc,MAAM,KAAK,SAAS,KAAK,OAAO;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,IAAI,OAAO,aAAiC;AAChD,UAAM,aAAa,MAAM,KAAK,KAAK;AACnC,QAAI,WAAW,WAAW,EAAG,QAAO,EAAE,OAAO,MAAM,YAAY,CAAC,EAAE;AAElE,UAAM,KAAK,GAAG,UAAU,CAAC,IAAI,KAAK,IAAI,CAAC;AACvC,UAAM,UAAM,wBAAK,KAAK,eAAe,EAAE;AACvC,UAAM,OAAO,mBAAmB,UAAU;AAC1C,mCAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAClC,2CAAc,wBAAK,KAAK,eAAe,GAAG,MAAM,MAAM;AAEtD,UAAM,KAAK,OAAO,YAAY,OAAO,OAAO;AAC1C,YAAM,mBAAmB,IAAI,KAAK,OAAO;AACzC,iBAAW,QAAQ,WAAY,OAAM,GAAG,MAAM,IAAI;AAClD,YAAM,gBAAgB,IAAI,KAAK,SAAS;AAAA,QACtC;AAAA,QACA,UAAU,SAAS,IAAI;AAAA,QACvB,OAAO,WAAW;AAAA,MACpB,CAAC;AAAA,IACH,CAAC;AAED,WAAO,EAAE,OAAO,OAAO,IAAI,KAAK,WAAW;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAA0C;AAC9C,UAAM,aAAa,MAAM,KAAK,KAAK;AACnC,QAAI,WAAW,WAAW,EAAG,QAAO,EAAE,YAAY,CAAC,EAAE;AACrD,UAAM,KAAK,OAAO,YAAY,OAAO,OAAO;AAC1C,iBAAW,QAAQ,WAAY,OAAM,GAAG,MAAM,IAAI;AAAA,IACpD,CAAC;AACD,WAAO,EAAE,WAAW;AAAA,EACtB;AAAA;AAAA,EAGA,MAAM,SAAgC;AACpC,UAAM,QAAQ,oBAAoB,KAAK,aAAa;AACpD,UAAM,UAA2C,CAAC;AAElD,UAAM,QAAQ,MAAM,KAAK,OAAO,YAAY,OAAO,OAAO;AACxD,YAAM,mBAAmB,IAAI,KAAK,OAAO;AACzC,aAAO,IAAI,KAAK,MAAM,kBAAkB,IAAI,KAAK,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAAA,IAC7E,CAAC;AAED,eAAW,aAAa,OAAO;AAC7B,UAAI,MAAM,IAAI,UAAU,EAAE,EAAG;AAC7B,YAAM,aAAa,gBAAgB,UAAU,GAAG;AAChD,YAAM,KAAK,OAAO,YAAY,OAAO,OAAO;AAC1C,mBAAW,QAAQ,WAAY,OAAM,GAAG,MAAM,IAAI;AAClD,cAAM,gBAAgB,IAAI,KAAK,SAAS;AAAA,UACtC,IAAI,UAAU;AAAA,UACd,UAAU,SAAS,UAAU,GAAG;AAAA,UAChC,OAAO,WAAW;AAAA,QACpB,CAAC;AAAA,MACH,CAAC;AACD,cAAQ,KAAK,EAAE,IAAI,UAAU,IAAI,OAAO,WAAW,OAAO,CAAC;AAAA,IAC7D;AACA,WAAO,EAAE,QAAQ;AAAA,EACnB;AAAA;AAAA,EAGA,MAAM,SAAgC;AACpC,UAAM,QAAQ,oBAAoB,KAAK,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;AACrE,UAAM,UAAU,MAAM,KAAK,OAAO,YAAY,OAAO,OAAO;AAC1D,YAAM,mBAAmB,IAAI,KAAK,OAAO;AACzC,cAAQ,MAAM,kBAAkB,IAAI,KAAK,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IACpE,CAAC;AACD,UAAM,aAAa,IAAI,IAAI,OAAO;AAClC,WAAO;AAAA,MACL;AAAA,MACA,SAAS,MAAM,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,MAAc,gBAAyC;AACrD,UAAM,eAAe,IAAI,aAAa,KAAK,MAAM;AACjD,UAAM,UAAU,MAAM,aAAa,WAAW;AAE9C,YAAQ,SAAS,QAAQ,OAAO;AAAA,MAC9B,CAAC,MAAM,WAAW,CAAC,MAAM;AAAA,IAC3B;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,YAAoB;AAC3B,QAAM,IAAI,oBAAI,KAAK;AACnB,QAAM,IAAI,CAAC,GAAW,IAAI,MAAM,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG;AACzD,SACE,GAAG,EAAE,eAAe,CAAC,GAAG,EAAE,EAAE,YAAY,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC,GAC/D,EAAE,EAAE,YAAY,CAAC,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;AAEvE;AAEA,SAAS,KAAK,MAAsB;AAClC,SAAO,KAAK,YAAY,EAAE,QAAQ,eAAe,GAAG,EAAE,QAAQ,UAAU,EAAE,KAAK;AACjF;","names":["Firebird","resolve","fromFields","toFields","keys","constraintName","import_node_fs","import_node_path","foreignKeys","import_node_fs","import_node_path","import_node_fs","import_node_path"]}