@farming-labs/orm-dynamodb 0.0.37

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"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport {\n DeleteCommand,\n GetCommand,\n PutCommand,\n ScanCommand,\n TransactWriteCommand,\n DynamoDBDocumentClient,\n} from \"@aws-sdk/lib-dynamodb\";\nimport {\n createDriverHandle,\n createManifest,\n equalValues,\n isOperatorFilterObject,\n mergeUniqueLookupCreateData,\n type CountArgs,\n type CreateArgs,\n type CreateManyArgs,\n type DeleteArgs,\n type DeleteManyArgs,\n type FindFirstArgs,\n type FindManyArgs,\n type FindUniqueArgs,\n type ManifestField,\n type ManifestModel,\n type OrmDriver,\n type OrmDriverHandle,\n requireUniqueLookup,\n type SchemaManifest,\n type SchemaDefinition,\n type SelectShape,\n type SelectedRecord,\n type UpdateArgs,\n type UpdateManyArgs,\n type UpsertArgs,\n validateUniqueLookupUpdateData,\n type Where,\n} from \"@farming-labs/orm\";\nimport type { ModelName, RelationName } from \"@farming-labs/orm\";\n\ntype DynamoDbRow = Record<string, unknown>;\ntype DynamoDbWhere = Where<Record<string, unknown>>;\ntype DynamoDbSort = Partial<Record<string, \"asc\" | \"desc\">>;\n\nconst ormPrimaryKey = \"__orm_pk\";\nconst ormKindKey = \"__orm_kind\";\nconst ormTargetKey = \"__orm_target\";\nconst ormRecordKind = \"record\";\nconst ormUniqueKind = \"unique\";\n\nexport type DynamoDbBaseClientLike = {\n send(command: unknown): Promise<unknown>;\n destroy?(): void;\n config?: unknown;\n};\n\nexport type DynamoDbDocumentClientLike = DynamoDbBaseClientLike;\n\nexport type DynamoDbTableMap<TSchema extends SchemaDefinition<any>> = Partial<\n Record<ModelName<TSchema>, string>\n>;\n\nexport type DynamoDbFieldTransform = {\n encode?: (value: unknown) => unknown;\n decode?: (value: unknown) => unknown;\n};\n\nexport type DynamoDbDriverConfig<TSchema extends SchemaDefinition<any>> = {\n client: DynamoDbBaseClientLike | DynamoDbDocumentClientLike;\n documentClient?: DynamoDbDocumentClientLike;\n tables?: DynamoDbTableMap<TSchema>;\n transforms?: Partial<Record<string, Partial<Record<string, DynamoDbFieldTransform>>>>;\n};\n\nexport type DynamoDbDriverClient<TSchema extends SchemaDefinition<any>> = {\n client: DynamoDbBaseClientLike | DynamoDbDocumentClientLike;\n documentClient: DynamoDbDocumentClientLike;\n tables?: DynamoDbTableMap<TSchema>;\n};\n\nexport type DynamoDbDriverHandle<TSchema extends SchemaDefinition<any>> = OrmDriverHandle<\n \"dynamodb\",\n DynamoDbDriverClient<TSchema>\n>;\n\ntype LoadedRow = {\n docId: string;\n pk: string;\n data: DynamoDbRow;\n stored: DynamoDbRow;\n};\n\ntype UniqueLock = {\n pk: string;\n target: string;\n fields: string[];\n};\n\ntype DynamoDbStoredItem = Record<string, unknown>;\n\nconst manifestCache = new WeakMap<object, SchemaManifest>();\n\nfunction getManifest(schema: SchemaDefinition<any>) {\n const cached = manifestCache.get(schema);\n if (cached) return cached;\n const next = createManifest(schema);\n manifestCache.set(schema, next);\n return next;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\";\n}\n\nfunction normalizeDecimalString(value: string) {\n const trimmed = value.trim();\n const match = /^(-?\\d+)(?:\\.(\\d+))?$/.exec(trimmed);\n if (!match) {\n return trimmed;\n }\n\n const [, integerPart, fractionalPart] = match;\n if (!fractionalPart) {\n return integerPart;\n }\n\n const normalizedFraction = fractionalPart.replace(/0+$/g, \"\");\n return normalizedFraction.length ? `${integerPart}.${normalizedFraction}` : integerPart;\n}\n\nfunction isDocumentClientLike(\n client: DynamoDbBaseClientLike | DynamoDbDocumentClientLike,\n): client is DynamoDbDocumentClientLike {\n const constructorName = client?.constructor?.name ?? \"\";\n return (\n constructorName.includes(\"DocumentClient\") ||\n (isRecord(client.config) && \"translateConfig\" in client.config)\n );\n}\n\nfunction createDocumentClient(\n client: DynamoDbBaseClientLike | DynamoDbDocumentClientLike,\n override?: DynamoDbDocumentClientLike,\n) {\n if (override) return override;\n if (isDocumentClientLike(client)) {\n return client;\n }\n\n return DynamoDBDocumentClient.from(client as any, {\n marshallOptions: {\n removeUndefinedValues: true,\n },\n }) as unknown as DynamoDbDocumentClientLike;\n}\n\nfunction applyDefault(value: unknown, field: ManifestField) {\n if (value !== undefined) return value;\n if (field.generated === \"id\") return randomUUID();\n if (field.generated === \"now\") return new Date();\n if (typeof field.defaultValue === \"function\") {\n return (field.defaultValue as () => unknown)();\n }\n return field.defaultValue;\n}\n\nfunction isComparable(value: unknown) {\n return (\n value instanceof Date ||\n typeof value === \"number\" ||\n typeof value === \"string\" ||\n typeof value === \"bigint\"\n );\n}\n\nfunction evaluateFilter(value: unknown, filter: unknown) {\n if (!isOperatorFilterObject(filter)) {\n return equalValues(value, filter);\n }\n\n if (\"eq\" in filter && !equalValues(value, filter.eq)) return false;\n if (\"not\" in filter && equalValues(value, filter.not)) return false;\n if (\"in\" in filter) {\n const values = Array.isArray(filter.in) ? filter.in : [];\n if (!values.some((candidate) => equalValues(candidate, value))) return false;\n }\n if (\"contains\" in filter) {\n if (typeof value !== \"string\" || typeof filter.contains !== \"string\") return false;\n if (!value.includes(filter.contains)) return false;\n }\n if (\"gt\" in filter) {\n if (!isComparable(value) || value <= filter.gt!) return false;\n }\n if (\"gte\" in filter) {\n if (!isComparable(value) || value < filter.gte!) return false;\n }\n if (\"lt\" in filter) {\n if (!isComparable(value) || value >= filter.lt!) return false;\n }\n if (\"lte\" in filter) {\n if (!isComparable(value) || value > filter.lte!) return false;\n }\n\n return true;\n}\n\nfunction sortRows(rows: LoadedRow[], orderBy?: DynamoDbSort) {\n if (!orderBy) return rows;\n const entries = Object.entries(orderBy);\n if (!entries.length) return rows;\n\n return [...rows].sort((left, right) => {\n for (const [field, direction] of entries) {\n const a = left.data[field];\n const b = right.data[field];\n if (equalValues(a, b)) continue;\n if (a === undefined) return direction === \"asc\" ? -1 : 1;\n if (b === undefined) return direction === \"asc\" ? 1 : -1;\n if (a == null) return direction === \"asc\" ? -1 : 1;\n if (b == null) return direction === \"asc\" ? 1 : -1;\n if (a < b) return direction === \"asc\" ? -1 : 1;\n if (a > b) return direction === \"asc\" ? 1 : -1;\n }\n\n return 0;\n });\n}\n\nfunction pageRows(rows: LoadedRow[], skip?: number, take?: number) {\n const start = skip ?? 0;\n const end = take === undefined ? undefined : start + take;\n return rows.slice(start, end);\n}\n\nfunction dynamodbConstraintError(target?: string | string[]) {\n const fields = Array.isArray(target) ? target.join(\", \") : (target ?? \"unique fields\");\n const error = new Error(`DynamoDB unique constraint violation on ${fields}.`);\n Object.assign(error, {\n code: \"ConditionalCheckFailedException\",\n target,\n });\n return error;\n}\n\nfunction isUnsupportedTransactionWrite(error: unknown) {\n if (!isRecord(error)) return false;\n return (\n error.name === \"UnknownOperationException\" ||\n error.code === \"UnknownOperationException\" ||\n String(error.message ?? \"\").includes(\"UnknownOperation\")\n );\n}\n\nfunction recordPk(docId: string) {\n return `record#${docId}`;\n}\n\nfunction getStoredItemPk(item: DynamoDbStoredItem) {\n const value = item[ormPrimaryKey];\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction hasTransactionWriteSupport(client: DynamoDbDocumentClientLike) {\n return typeof client.send === \"function\";\n}\n\nexport function normalizeDynamoDbDocumentClient(\n client: DynamoDbBaseClientLike | DynamoDbDocumentClientLike,\n documentClient?: DynamoDbDocumentClientLike,\n) {\n return createDocumentClient(client, documentClient);\n}\n\nfunction createDynamoDbDriverInternal<TSchema extends SchemaDefinition<any>>(\n config: DynamoDbDriverConfig<TSchema>,\n): OrmDriver<TSchema, DynamoDbDriverHandle<TSchema>> {\n const documentClient = createDocumentClient(config.client, config.documentClient);\n\n function getSupportedManifest(schema: TSchema) {\n const manifest = getManifest(schema);\n\n for (const model of Object.values(manifest.models)) {\n if (model.schema) {\n throw new Error(\n `The DynamoDB runtime does not support schema-qualified tables for model \"${model.name}\". Use flat table names instead.`,\n );\n }\n\n const idField = model.fields.id;\n if (\n idField?.kind === \"id\" &&\n idField.idType === \"integer\" &&\n idField.generated === \"increment\"\n ) {\n throw new Error(\n `The DynamoDB runtime does not support generated integer ids for model \"${model.name}\". Use manual numeric ids or a string id instead.`,\n );\n }\n }\n\n return manifest;\n }\n\n function getTableName(schema: TSchema, modelName: ModelName<TSchema>) {\n const manifest = getSupportedManifest(schema);\n return config.tables?.[modelName] ?? manifest.models[modelName].table;\n }\n\n function fieldTransform(modelName: string, fieldName: string) {\n return config.transforms?.[modelName]?.[fieldName];\n }\n\n function encodeValue(modelName: string, field: ManifestField, value: unknown) {\n if (value === undefined) return value;\n if (value === null) return null;\n\n const transform = fieldTransform(modelName, field.name);\n if (transform?.encode) {\n return transform.encode(value);\n }\n\n if (field.kind === \"id\" && field.idType === \"integer\") {\n return Number(value);\n }\n\n if (field.kind === \"enum\") {\n return String(value);\n }\n\n if (field.kind === \"boolean\") {\n return Boolean(value);\n }\n\n if (field.kind === \"integer\") {\n return Number(value);\n }\n\n if (field.kind === \"bigint\") {\n return typeof value === \"bigint\"\n ? value.toString()\n : BigInt(value as string | number).toString();\n }\n\n if (field.kind === \"decimal\") {\n return typeof value === \"string\" ? normalizeDecimalString(value) : String(value);\n }\n\n if (field.kind === \"datetime\") {\n if (value instanceof Date) return value.toISOString();\n return new Date(value as string | number).toISOString();\n }\n\n return value;\n }\n\n function decodeValue(modelName: string, field: ManifestField, value: unknown, docId?: string) {\n const transform = fieldTransform(modelName, field.name);\n if (transform?.decode) {\n return transform.decode(value);\n }\n\n if (value === undefined && field.kind === \"id\" && docId !== undefined) {\n if (field.idType === \"integer\") {\n const numeric = Number(docId);\n return Number.isFinite(numeric) ? numeric : undefined;\n }\n return docId;\n }\n\n if (value === undefined || value === null) return value ?? null;\n\n if (field.kind === \"id\" && field.idType === \"integer\") {\n return Number(value);\n }\n\n if (field.kind === \"enum\") {\n return String(value);\n }\n\n if (field.kind === \"boolean\") {\n return Boolean(value);\n }\n\n if (field.kind === \"integer\") {\n return Number(value);\n }\n\n if (field.kind === \"bigint\") {\n return typeof value === \"bigint\" ? value : BigInt(value as string | number);\n }\n\n if (field.kind === \"decimal\") {\n return normalizeDecimalString(String(value));\n }\n\n if (field.kind === \"datetime\") {\n return value instanceof Date ? value : new Date(value as string | number);\n }\n\n return value;\n }\n\n function buildStoredRow(model: ManifestModel, data: Partial<Record<string, unknown>>) {\n const stored: DynamoDbRow = {};\n const decoded: DynamoDbRow = {};\n\n for (const field of Object.values(model.fields)) {\n const value = applyDefault(data[field.name], field);\n if (value === undefined) continue;\n const encoded = encodeValue(model.name, field, value);\n stored[field.column] = encoded;\n decoded[field.name] = decodeValue(model.name, field, encoded);\n }\n\n const idField = model.fields.id;\n if (!idField) {\n return {\n docId: randomUUID(),\n stored,\n decoded,\n };\n }\n\n let idValue = decoded[idField.name];\n\n if (idValue === undefined || idValue === null) {\n if (idField.idType === \"integer\") {\n throw new Error(\n `The DynamoDB runtime requires an explicit numeric id for model \"${model.name}\" when using manual integer ids.`,\n );\n }\n\n idValue = randomUUID();\n const encodedId = encodeValue(model.name, idField, idValue);\n stored[idField.column] = encodedId;\n decoded[idField.name] = decodeValue(model.name, idField, encodedId);\n idValue = decoded[idField.name];\n }\n\n return {\n docId: String(idValue),\n stored,\n decoded,\n };\n }\n\n function buildUpdatedRow(\n model: ManifestModel,\n current: LoadedRow,\n data: Partial<Record<string, unknown>>,\n ) {\n const stored = {\n ...current.stored,\n };\n const decoded = {\n ...current.data,\n };\n\n for (const [fieldName, value] of Object.entries(data)) {\n if (value === undefined) continue;\n const field = model.fields[fieldName];\n if (!field) {\n throw new Error(`Unknown field \"${fieldName}\" on model \"${model.name}\".`);\n }\n if (field.name === \"id\" && !equalValues(current.data.id, value)) {\n throw new Error(\n `The DynamoDB runtime does not support updating the id field for model \"${model.name}\".`,\n );\n }\n\n const encoded = encodeValue(model.name, field, value);\n stored[field.column] = encoded;\n decoded[field.name] = decodeValue(model.name, field, encoded);\n }\n\n return {\n docId: current.docId,\n stored,\n decoded,\n };\n }\n\n async function scanAllItems(tableName: string) {\n const items: DynamoDbStoredItem[] = [];\n let exclusiveStartKey: Record<string, unknown> | undefined;\n\n do {\n const result = (await documentClient.send(\n new ScanCommand({\n TableName: tableName,\n ExclusiveStartKey: exclusiveStartKey,\n }),\n )) as { Items?: DynamoDbStoredItem[]; LastEvaluatedKey?: Record<string, unknown> };\n\n items.push(...(result.Items ?? []));\n exclusiveStartKey = result.LastEvaluatedKey;\n } while (exclusiveStartKey);\n\n return items;\n }\n\n async function loadRowByPk(model: ManifestModel, tableName: string, pk: string) {\n const result = (await documentClient.send(\n new GetCommand({\n TableName: tableName,\n Key: {\n [ormPrimaryKey]: pk,\n },\n }),\n )) as { Item?: DynamoDbStoredItem };\n const stored = result.Item;\n\n if (!stored || stored[ormKindKey] !== ormRecordKind) {\n return null;\n }\n\n const decoded: DynamoDbRow = {};\n const docId = pk.slice(\"record#\".length);\n\n for (const field of Object.values(model.fields)) {\n decoded[field.name] = decodeValue(model.name, field, stored[field.column], docId);\n }\n\n return {\n docId,\n pk,\n data: decoded,\n stored,\n } satisfies LoadedRow;\n }\n\n async function loadRows<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n modelName: TModelName,\n ) {\n const model = getSupportedManifest(schema).models[modelName];\n const tableName = getTableName(schema, modelName);\n const items = await scanAllItems(tableName);\n\n return items\n .filter((item) => item[ormKindKey] === ormRecordKind)\n .map((stored) => {\n const pk = getStoredItemPk(stored) ?? \"\";\n const docId = pk.slice(\"record#\".length);\n const decoded: DynamoDbRow = {};\n\n for (const field of Object.values(model.fields)) {\n decoded[field.name] = decodeValue(model.name, field, stored[field.column], docId);\n }\n\n return {\n docId,\n pk,\n data: decoded,\n stored,\n } satisfies LoadedRow;\n });\n }\n\n function normalizeFilterValue(model: ManifestModel, fieldName: string, value: unknown) {\n const field = model.fields[fieldName];\n if (!field || value === undefined || value === null) {\n return value;\n }\n\n return decodeValue(model.name, field, encodeValue(model.name, field, value));\n }\n\n function evaluateModelFilter(\n model: ManifestModel,\n fieldName: string,\n value: unknown,\n filter: unknown,\n ) {\n if (!isOperatorFilterObject(filter)) {\n return equalValues(value, normalizeFilterValue(model, fieldName, filter));\n }\n\n const normalized = {\n ...(filter.eq !== undefined ? { eq: normalizeFilterValue(model, fieldName, filter.eq) } : {}),\n ...(filter.not !== undefined\n ? { not: normalizeFilterValue(model, fieldName, filter.not) }\n : {}),\n ...(filter.in !== undefined\n ? {\n in: (Array.isArray(filter.in) ? filter.in : []).map((entry) =>\n normalizeFilterValue(model, fieldName, entry),\n ),\n }\n : {}),\n ...(filter.contains !== undefined ? { contains: String(filter.contains) } : {}),\n ...(filter.gt !== undefined ? { gt: normalizeFilterValue(model, fieldName, filter.gt) } : {}),\n ...(filter.gte !== undefined\n ? { gte: normalizeFilterValue(model, fieldName, filter.gte) }\n : {}),\n ...(filter.lt !== undefined ? { lt: normalizeFilterValue(model, fieldName, filter.lt) } : {}),\n ...(filter.lte !== undefined\n ? { lte: normalizeFilterValue(model, fieldName, filter.lte) }\n : {}),\n };\n\n return evaluateFilter(value, normalized);\n }\n\n function matchesModelWhere(model: ManifestModel, record: DynamoDbRow, where?: DynamoDbWhere) {\n if (!where) return true;\n\n if (where.AND && !where.AND.every((clause) => matchesModelWhere(model, record, clause))) {\n return false;\n }\n\n if (where.OR && !where.OR.some((clause) => matchesModelWhere(model, record, clause))) {\n return false;\n }\n\n if (where.NOT && matchesModelWhere(model, record, where.NOT)) {\n return false;\n }\n\n for (const [key, filter] of Object.entries(where)) {\n if (key === \"AND\" || key === \"OR\" || key === \"NOT\") continue;\n if (!evaluateModelFilter(model, key, record[key], filter)) return false;\n }\n\n return true;\n }\n\n function applyModelQuery(\n model: ManifestModel,\n rows: LoadedRow[],\n args: {\n where?: DynamoDbWhere;\n orderBy?: DynamoDbSort;\n skip?: number;\n take?: number;\n } = {},\n ) {\n const filtered = rows.filter((row) => matchesModelWhere(model, row.data, args.where));\n const sorted = sortRows(filtered, args.orderBy);\n return pageRows(sorted, args.skip, args.take);\n }\n\n function serializeUniqueValue(model: ManifestModel, fieldName: string, value: unknown) {\n const field = model.fields[fieldName];\n const normalized = decodeValue(model.name, field, encodeValue(model.name, field, value));\n\n if (normalized instanceof Date) {\n return normalized.toISOString();\n }\n\n if (typeof normalized === \"bigint\") {\n return normalized.toString();\n }\n\n return JSON.stringify(normalized);\n }\n\n function uniqueLockPk(model: ManifestModel, fields: string[], row: DynamoDbRow) {\n const values = fields.map((fieldName) => row[fieldName]);\n if (values.some((value) => value === undefined || value === null)) {\n return null;\n }\n\n const encodedValues = fields.map((fieldName) =>\n encodeURIComponent(serializeUniqueValue(model, fieldName, row[fieldName])),\n );\n\n return `unique#${model.name}#${fields.join(\"+\")}#${encodedValues.join(\"#\")}`;\n }\n\n function uniqueLocksForRow(model: ManifestModel, row: DynamoDbRow, docId: string) {\n const target = recordPk(docId);\n const locks: UniqueLock[] = [];\n\n for (const field of Object.values(model.fields)) {\n if (!field.unique) continue;\n const pk = uniqueLockPk(model, [field.name], row);\n if (!pk) continue;\n locks.push({\n pk,\n target,\n fields: [field.name],\n });\n }\n\n for (const constraint of model.constraints.unique) {\n const pk = uniqueLockPk(model, [...constraint.fields], row);\n if (!pk) continue;\n locks.push({\n pk,\n target,\n fields: [...constraint.fields],\n });\n }\n\n return locks;\n }\n\n async function loadUniqueRow<TModelName extends ModelName<TSchema>>(\n schema: TSchema,\n modelName: TModelName,\n where: Record<string, unknown>,\n ) {\n const manifest = getSupportedManifest(schema);\n const model = manifest.models[modelName];\n const lookup = requireUniqueLookup(model, where, \"FindUnique\");\n const tableName = getTableName(schema, modelName);\n\n if (lookup.kind === \"id\") {\n return loadRowByPk(model, tableName, recordPk(String(lookup.values[lookup.fields[0]!.name])));\n }\n\n const normalizedLookupRow = Object.fromEntries(\n lookup.fields.map((field) => [\n field.name,\n decodeValue(model.name, field, encodeValue(model.name, field, lookup.values[field.name])),\n ]),\n );\n const lockPk = uniqueLockPk(\n model,\n lookup.fields.map((field) => field.name),\n normalizedLookupRow,\n );\n if (!lockPk) {\n return null;\n }\n\n const lockResult = (await documentClient.send(\n new GetCommand({\n TableName: tableName,\n Key: {\n [ormPrimaryKey]: lockPk,\n },\n }),\n )) as { Item?: DynamoDbStoredItem };\n const target =\n typeof lockResult.Item?.[ormTargetKey] === \"string\"\n ? lockResult.Item[ormTargetKey]\n : undefined;\n if (!target) {\n return null;\n }\n\n return loadRowByPk(model, tableName, target);\n }\n\n function findUniqueConflict(\n model: ManifestModel,\n candidate: DynamoDbRow,\n existingRows: LoadedRow[],\n ignoreDocIds: Set<string> = new Set(),\n ) {\n const idField = model.fields.id;\n\n for (const row of existingRows) {\n if (ignoreDocIds.has(row.docId)) continue;\n\n if (\n idField &&\n candidate[idField.name] !== undefined &&\n candidate[idField.name] !== null &&\n row.data[idField.name] !== undefined &&\n row.data[idField.name] !== null &&\n equalValues(candidate[idField.name], row.data[idField.name])\n ) {\n return [idField.name];\n }\n\n for (const field of Object.values(model.fields)) {\n if (!field.unique) continue;\n if (candidate[field.name] === undefined || candidate[field.name] === null) continue;\n if (row.data[field.name] === undefined || row.data[field.name] === null) continue;\n if (equalValues(candidate[field.name], row.data[field.name])) {\n return [field.name];\n }\n }\n\n for (const constraint of model.constraints.unique) {\n if (\n !constraint.fields.every(\n (fieldName) =>\n candidate[fieldName] !== undefined &&\n candidate[fieldName] !== null &&\n row.data[fieldName] !== undefined &&\n row.data[fieldName] !== null,\n )\n ) {\n continue;\n }\n\n if (\n constraint.fields.every((fieldName) =>\n equalValues(candidate[fieldName], row.data[fieldName]),\n )\n ) {\n return [...constraint.fields];\n }\n }\n }\n\n return null;\n }\n\n function buildRecordItem(row: { docId: string; stored: DynamoDbRow }) {\n return {\n [ormPrimaryKey]: recordPk(row.docId),\n [ormKindKey]: ormRecordKind,\n ...row.stored,\n };\n }\n\n function putRecordCreateItem(tableName: string, row: { docId: string; stored: DynamoDbRow }) {\n return {\n Put: {\n TableName: tableName,\n Item: buildRecordItem(row),\n ConditionExpression: \"attribute_not_exists(#pk)\",\n ExpressionAttributeNames: {\n \"#pk\": ormPrimaryKey,\n },\n },\n };\n }\n\n function putRecordUpdateItem(tableName: string, row: { docId: string; stored: DynamoDbRow }) {\n return {\n Put: {\n TableName: tableName,\n Item: buildRecordItem(row),\n },\n };\n }\n\n function putUniqueItem(tableName: string, lock: UniqueLock) {\n return {\n Put: {\n TableName: tableName,\n Item: {\n [ormPrimaryKey]: lock.pk,\n [ormKindKey]: ormUniqueKind,\n [ormTargetKey]: lock.target,\n },\n ConditionExpression: \"attribute_not_exists(#pk)\",\n ExpressionAttributeNames: {\n \"#pk\": ormPrimaryKey,\n },\n },\n };\n }\n\n function deleteItem(tableName: string, pk: string) {\n return {\n Delete: {\n TableName: tableName,\n Key: {\n [ormPrimaryKey]: pk,\n },\n },\n };\n }\n\n async function putRecordSequential(\n tableName: string,\n row: { docId: string; stored: DynamoDbRow },\n conditionallyCreate: boolean,\n ) {\n await documentClient.send(\n new PutCommand({\n TableName: tableName,\n Item: buildRecordItem(row),\n ...(conditionallyCreate\n ? {\n ConditionExpression: \"attribute_not_exists(#pk)\",\n ExpressionAttributeNames: {\n \"#pk\": ormPrimaryKey,\n },\n }\n : {}),\n }),\n );\n }\n\n async function putUniqueSequential(tableName: string, lock: UniqueLock) {\n await documentClient.send(\n new PutCommand({\n TableName: tableName,\n Item: {\n [ormPrimaryKey]: lock.pk,\n [ormKindKey]: ormUniqueKind,\n [ormTargetKey]: lock.target,\n },\n ConditionExpression: \"attribute_not_exists(#pk)\",\n ExpressionAttributeNames: {\n \"#pk\": ormPrimaryKey,\n },\n }),\n );\n }\n\n async function deleteSequential(tableName: string, pk: string) {\n await documentClient.send(\n new DeleteCommand({\n TableName: tableName,\n Key: {\n [ormPrimaryKey]: pk,\n },\n }),\n );\n }\n\n async function acquireUniqueLocksSequential(tableName: string, locks: UniqueLock[]) {\n const acquired: UniqueLock[] = [];\n\n try {\n for (const lock of locks) {\n await putUniqueSequential(tableName, lock);\n acquired.push(lock);\n }\n } catch (error) {\n await releaseUniqueLocksSequential(tableName, acquired);\n throw error;\n }\n\n return acquired;\n }\n\n async function releaseUniqueLocksSequential(tableName: string, locks: UniqueLock[]) {\n for (const lock of [...locks].reverse()) {\n try {\n await deleteSequential(tableName, lock.pk);\n } catch {\n // Best-effort cleanup for the sequential fallback path.\n }\n }\n }\n\n async function createRecordWithLocks(\n tableName: string,\n row: { docId: string; stored: DynamoDbRow; decoded: DynamoDbRow },\n model: ManifestModel,\n ) {\n const locks = uniqueLocksForRow(model, row.decoded, row.docId);\n const transactItems = [\n putRecordCreateItem(tableName, row),\n ...locks.map((lock) => putUniqueItem(tableName, lock)),\n ];\n\n try {\n await documentClient.send(\n new TransactWriteCommand({\n TransactItems: transactItems,\n }),\n );\n } catch (error) {\n if (!isUnsupportedTransactionWrite(error)) {\n throw error;\n }\n\n const acquiredLocks = await acquireUniqueLocksSequential(tableName, locks);\n\n try {\n await putRecordSequential(tableName, row, true);\n } catch (recordError) {\n await releaseUniqueLocksSequential(tableName, acquiredLocks);\n throw recordError;\n }\n }\n }\n\n async function updateRecordWithLocks(\n tableName: string,\n model: ManifestModel,\n current: LoadedRow,\n next: { docId: string; stored: DynamoDbRow; decoded: DynamoDbRow },\n ) {\n const currentLocks = new Map(\n uniqueLocksForRow(model, current.data, current.docId).map((lock) => [lock.pk, lock]),\n );\n const nextLocks = new Map(\n uniqueLocksForRow(model, next.decoded, next.docId).map((lock) => [lock.pk, lock]),\n );\n const deleteOps = [...currentLocks.keys()]\n .filter((pk) => !nextLocks.has(pk))\n .map((pk) => deleteItem(tableName, pk));\n const putOps = [...nextLocks.entries()]\n .filter(([pk]) => !currentLocks.has(pk))\n .map(([, lock]) => putUniqueItem(tableName, lock));\n\n try {\n await documentClient.send(\n new TransactWriteCommand({\n TransactItems: [putRecordUpdateItem(tableName, next), ...deleteOps, ...putOps],\n }),\n );\n } catch (error) {\n if (!isUnsupportedTransactionWrite(error)) {\n throw error;\n }\n\n const addedLocks = [...nextLocks.values()].filter((lock) => !currentLocks.has(lock.pk));\n const acquiredLocks = await acquireUniqueLocksSequential(tableName, addedLocks);\n\n try {\n await putRecordSequential(tableName, next, false);\n } catch (recordError) {\n await releaseUniqueLocksSequential(tableName, acquiredLocks);\n throw recordError;\n }\n\n for (const operation of deleteOps) {\n await deleteSequential(tableName, operation.Delete.Key[ormPrimaryKey]);\n }\n }\n }\n\n async function deleteRecordWithLocks(\n tableName: string,\n model: ManifestModel,\n current: LoadedRow,\n ) {\n const locks = uniqueLocksForRow(model, current.data, current.docId);\n try {\n await documentClient.send(\n new TransactWriteCommand({\n TransactItems: [\n deleteItem(tableName, current.pk),\n ...locks.map((lock) => deleteItem(tableName, lock.pk)),\n ],\n }),\n );\n } catch (error) {\n if (!isUnsupportedTransactionWrite(error)) {\n throw error;\n }\n\n await deleteSequential(tableName, current.pk);\n for (const lock of locks) {\n await deleteSequential(tableName, lock.pk);\n }\n }\n }\n\n async function projectRow<\n TModelName extends ModelName<TSchema>,\n TSelect extends SelectShape<TSchema, TModelName> | undefined,\n >(\n schema: TSchema,\n modelName: TModelName,\n row: DynamoDbRow,\n select?: TSelect,\n ): Promise<SelectedRecord<TSchema, TModelName, TSelect>> {\n const modelDefinition = schema.models[modelName];\n const output: DynamoDbRow = {};\n\n if (!select) {\n for (const fieldName of Object.keys(modelDefinition.fields)) {\n output[fieldName] = row[fieldName];\n }\n\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n for (const [key, value] of Object.entries(select)) {\n if (value !== true && value === undefined) continue;\n\n if (key in modelDefinition.fields && value === true) {\n output[key] = row[key];\n continue;\n }\n\n if (key in modelDefinition.relations) {\n output[key] = await resolveRelation(\n schema,\n modelName,\n key as RelationName<TSchema, TModelName>,\n row,\n value as true | FindManyArgs<TSchema, any, any>,\n );\n }\n }\n\n return output as SelectedRecord<TSchema, TModelName, TSelect>;\n }\n\n async function resolveRelation<\n TModelName extends ModelName<TSchema>,\n TRelationName extends RelationName<TSchema, TModelName>,\n >(\n schema: TSchema,\n modelName: TModelName,\n relationName: TRelationName,\n row: DynamoDbRow,\n value: true | FindManyArgs<TSchema, any, any>,\n ) {\n const relation = schema.models[modelName].relations[relationName];\n const relationArgs = value === true ? {} : value;\n\n if (relation.kind === \"belongsTo\") {\n const foreignValue = row[relation.foreignKey];\n const targetRows = (await loadRows(schema, relation.target as ModelName<TSchema>)).filter(\n (item) => equalValues(item.data.id, foreignValue),\n );\n const target = applyModelQuery(\n relationTargetManifest(schema, relation.target),\n targetRows,\n relationArgs,\n )[0];\n return target\n ? projectRow(\n schema,\n relation.target as ModelName<TSchema>,\n target.data,\n relationArgs.select,\n )\n : null;\n }\n\n if (relation.kind === \"hasOne\") {\n const targetRows = (await loadRows(schema, relation.target as ModelName<TSchema>)).filter(\n (item) => equalValues(item.data[relation.foreignKey], row.id),\n );\n const target = applyModelQuery(\n relationTargetManifest(schema, relation.target),\n targetRows,\n relationArgs,\n )[0];\n return target\n ? projectRow(\n schema,\n relation.target as ModelName<TSchema>,\n target.data,\n relationArgs.select,\n )\n : null;\n }\n\n if (relation.kind === \"hasMany\") {\n const targetRows = (await loadRows(schema, relation.target as ModelName<TSchema>)).filter(\n (item) => equalValues(item.data[relation.foreignKey], row.id),\n );\n const matchedRows = applyModelQuery(\n relationTargetManifest(schema, relation.target),\n targetRows,\n relationArgs,\n );\n return Promise.all(\n matchedRows.map((item) =>\n projectRow(schema, relation.target as ModelName<TSchema>, item.data, relationArgs.select),\n ),\n );\n }\n\n const throughRows = (await loadRows(schema, relation.through as ModelName<TSchema>)).filter(\n (item) => equalValues(item.data[relation.from], row.id),\n );\n const targetIds = throughRows.map((item) => item.data[relation.to]);\n const targetRows = (await loadRows(schema, relation.target as ModelName<TSchema>)).filter(\n (item) => targetIds.some((targetId) => equalValues(targetId, item.data.id)),\n );\n const matchedRows = applyModelQuery(\n relationTargetManifest(schema, relation.target),\n targetRows,\n relationArgs,\n );\n\n return Promise.all(\n matchedRows.map((item) =>\n projectRow(schema, relation.target as ModelName<TSchema>, item.data, relationArgs.select),\n ),\n );\n }\n\n function relationTargetManifest(schema: TSchema, modelName: string) {\n return getSupportedManifest(schema).models[modelName as ModelName<TSchema>];\n }\n\n let driver!: OrmDriver<TSchema, DynamoDbDriverHandle<TSchema>>;\n\n driver = {\n handle: createDriverHandle({\n kind: \"dynamodb\",\n client: {\n client: config.client,\n documentClient,\n tables: config.tables,\n },\n capabilities: {\n supportsNumericIds: true,\n numericIds: \"manual\",\n supportsJSON: true,\n supportsDates: true,\n supportsBooleans: true,\n supportsTransactions: false,\n supportsSchemaNamespaces: false,\n supportsTransactionalDDL: false,\n supportsJoin: false,\n nativeRelationLoading: \"none\",\n textComparison: \"case-sensitive\",\n textMatching: {\n equality: \"case-sensitive\",\n contains: \"case-sensitive\",\n ordering: \"case-sensitive\",\n },\n upsert: \"emulated\",\n returning: {\n create: true,\n update: true,\n delete: false,\n },\n returningMode: {\n create: \"record\",\n update: \"record\",\n delete: \"none\",\n },\n nativeRelations: {\n singularChains: false,\n hasMany: false,\n manyToMany: false,\n filtered: false,\n ordered: false,\n paginated: false,\n },\n },\n }),\n async findMany(schema, modelName, args) {\n const model = getSupportedManifest(schema).models[modelName];\n const rows = applyModelQuery(model, await loadRows(schema, modelName), args);\n return Promise.all(rows.map((row) => projectRow(schema, modelName, row.data, args.select)));\n },\n async findFirst(schema, modelName, args) {\n const model = getSupportedManifest(schema).models[modelName];\n const row = applyModelQuery(model, await loadRows(schema, modelName), args)[0];\n if (!row) return null;\n return projectRow(schema, modelName, row.data, args.select);\n },\n async findUnique(schema, modelName, args) {\n const model = getSupportedManifest(schema).models[modelName];\n const row = await loadUniqueRow(schema, modelName, args.where as Record<string, unknown>);\n if (!row || !matchesModelWhere(model, row.data, args.where as DynamoDbWhere)) {\n return null;\n }\n\n return projectRow(schema, modelName, row.data, args.select);\n },\n async count(schema, modelName, args) {\n const model = getSupportedManifest(schema).models[modelName];\n return applyModelQuery(model, await loadRows(schema, modelName), args).length;\n },\n async create(schema, modelName, args) {\n const model = getSupportedManifest(schema).models[modelName];\n const existingRows = await loadRows(schema, modelName);\n const built = buildStoredRow(model, args.data as Partial<Record<string, unknown>>);\n const conflict = findUniqueConflict(model, built.decoded, existingRows);\n\n if (conflict) {\n throw dynamodbConstraintError(conflict);\n }\n\n await createRecordWithLocks(getTableName(schema, modelName), built, model);\n return projectRow(schema, modelName, built.decoded, args.select);\n },\n async createMany(schema, modelName, args) {\n const model = getSupportedManifest(schema).models[modelName];\n const existingRows = await loadRows(schema, modelName);\n const created: Array<{ docId: string; stored: DynamoDbRow; decoded: DynamoDbRow }> = [];\n\n for (const entry of args.data) {\n const built = buildStoredRow(model, entry as Partial<Record<string, unknown>>);\n const conflict = findUniqueConflict(model, built.decoded, [\n ...existingRows,\n ...created.map((row) => ({\n docId: row.docId,\n pk: recordPk(row.docId),\n data: row.decoded,\n stored: row.stored,\n })),\n ]);\n\n if (conflict) {\n throw dynamodbConstraintError(conflict);\n }\n\n created.push(built);\n }\n\n for (const row of created) {\n await createRecordWithLocks(getTableName(schema, modelName), row, model);\n }\n\n return Promise.all(\n created.map((row) => projectRow(schema, modelName, row.decoded, args.select)),\n );\n },\n async update(schema, modelName, args) {\n const model = getSupportedManifest(schema).models[modelName];\n const rows = await loadRows(schema, modelName);\n const current = applyModelQuery(model, rows, {\n where: args.where as DynamoDbWhere,\n take: 1,\n })[0];\n if (!current) return null;\n\n const next = buildUpdatedRow(model, current, args.data as Partial<Record<string, unknown>>);\n const conflict = findUniqueConflict(model, next.decoded, rows, new Set([current.docId]));\n if (conflict) {\n throw dynamodbConstraintError(conflict);\n }\n\n await updateRecordWithLocks(getTableName(schema, modelName), model, current, next);\n return projectRow(schema, modelName, next.decoded, args.select);\n },\n async updateMany(schema, modelName, args) {\n const model = getSupportedManifest(schema).models[modelName];\n const rows = await loadRows(schema, modelName);\n const matched = applyModelQuery(model, rows, {\n where: args.where as DynamoDbWhere,\n });\n if (!matched.length) return 0;\n\n const nextRows = matched.map((row) =>\n buildUpdatedRow(model, row, args.data as Partial<Record<string, unknown>>),\n );\n const keepIds = new Set(matched.map((row) => row.docId));\n const remaining = rows.filter((row) => !keepIds.has(row.docId));\n const pending: LoadedRow[] = [];\n\n for (const next of nextRows) {\n const conflict = findUniqueConflict(model, next.decoded, [...remaining, ...pending]);\n if (conflict) {\n throw dynamodbConstraintError(conflict);\n }\n\n pending.push({\n docId: next.docId,\n pk: recordPk(next.docId),\n data: next.decoded,\n stored: next.stored,\n });\n }\n\n for (let index = 0; index < matched.length; index += 1) {\n await updateRecordWithLocks(\n getTableName(schema, modelName),\n model,\n matched[index]!,\n nextRows[index]!,\n );\n }\n\n return nextRows.length;\n },\n async upsert(schema, modelName, args) {\n const model = getSupportedManifest(schema).models[modelName];\n const lookup = requireUniqueLookup(model, args.where as Record<string, unknown>, \"Upsert\");\n validateUniqueLookupUpdateData(\n model,\n args.update as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n );\n\n const current = await loadUniqueRow(schema, modelName, args.where as Record<string, unknown>);\n if (current && matchesModelWhere(model, current.data, args.where as DynamoDbWhere)) {\n const rows = await loadRows(schema, modelName);\n const next = buildUpdatedRow(\n model,\n current,\n args.update as Partial<Record<string, unknown>>,\n );\n const conflict = findUniqueConflict(model, next.decoded, rows, new Set([current.docId]));\n if (conflict) {\n throw dynamodbConstraintError(conflict);\n }\n\n await updateRecordWithLocks(getTableName(schema, modelName), model, current, next);\n return projectRow(schema, modelName, next.decoded, args.select);\n }\n\n const created = buildStoredRow(\n model,\n mergeUniqueLookupCreateData(\n model,\n args.create as Partial<Record<string, unknown>>,\n lookup,\n \"Upsert\",\n ),\n );\n const rows = await loadRows(schema, modelName);\n const conflict = findUniqueConflict(model, created.decoded, rows);\n if (conflict) {\n throw dynamodbConstraintError(conflict);\n }\n\n await createRecordWithLocks(getTableName(schema, modelName), created, model);\n return projectRow(schema, modelName, created.decoded, args.select);\n },\n async delete(schema, modelName, args) {\n const model = getSupportedManifest(schema).models[modelName];\n const row = applyModelQuery(model, await loadRows(schema, modelName), {\n where: args.where as DynamoDbWhere,\n take: 1,\n })[0];\n if (!row) return 0;\n\n await deleteRecordWithLocks(getTableName(schema, modelName), model, row);\n return 1;\n },\n async deleteMany(schema, modelName, args) {\n const model = getSupportedManifest(schema).models[modelName];\n const rows = applyModelQuery(model, await loadRows(schema, modelName), {\n where: args.where as DynamoDbWhere,\n });\n\n for (const row of rows) {\n await deleteRecordWithLocks(getTableName(schema, modelName), model, row);\n }\n\n return rows.length;\n },\n async transaction(schema, run) {\n getSupportedManifest(schema);\n return run(driver);\n },\n };\n\n return driver;\n}\n\nexport function createDynamodbDriver<TSchema extends SchemaDefinition<any>>(\n config: DynamoDbDriverConfig<TSchema>,\n): OrmDriver<TSchema, DynamoDbDriverHandle<TSchema>> {\n return createDynamoDbDriverInternal(config);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAA2B;AAC3B,0BAOO;AACP,iBA4BO;AAOP,IAAM,gBAAgB;AACtB,IAAM,aAAa;AACnB,IAAM,eAAe;AACrB,IAAM,gBAAgB;AACtB,IAAM,gBAAgB;AAoDtB,IAAM,gBAAgB,oBAAI,QAAgC;AAE1D,SAAS,YAAY,QAA+B;AAClD,QAAM,SAAS,cAAc,IAAI,MAAM;AACvC,MAAI,OAAQ,QAAO;AACnB,QAAM,WAAO,2BAAe,MAAM;AAClC,gBAAc,IAAI,QAAQ,IAAI;AAC9B,SAAO;AACT;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU;AACrC;AAEA,SAAS,uBAAuB,OAAe;AAC7C,QAAM,UAAU,MAAM,KAAK;AAC3B,QAAM,QAAQ,wBAAwB,KAAK,OAAO;AAClD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,EAAE,aAAa,cAAc,IAAI;AACxC,MAAI,CAAC,gBAAgB;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,qBAAqB,eAAe,QAAQ,QAAQ,EAAE;AAC5D,SAAO,mBAAmB,SAAS,GAAG,WAAW,IAAI,kBAAkB,KAAK;AAC9E;AAEA,SAAS,qBACP,QACsC;AACtC,QAAM,kBAAkB,QAAQ,aAAa,QAAQ;AACrD,SACE,gBAAgB,SAAS,gBAAgB,KACxC,SAAS,OAAO,MAAM,KAAK,qBAAqB,OAAO;AAE5D;AAEA,SAAS,qBACP,QACA,UACA;AACA,MAAI,SAAU,QAAO;AACrB,MAAI,qBAAqB,MAAM,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,SAAO,2CAAuB,KAAK,QAAe;AAAA,IAChD,iBAAiB;AAAA,MACf,uBAAuB;AAAA,IACzB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,aAAa,OAAgB,OAAsB;AAC1D,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,MAAM,cAAc,KAAM,YAAO,+BAAW;AAChD,MAAI,MAAM,cAAc,MAAO,QAAO,oBAAI,KAAK;AAC/C,MAAI,OAAO,MAAM,iBAAiB,YAAY;AAC5C,WAAQ,MAAM,aAA+B;AAAA,EAC/C;AACA,SAAO,MAAM;AACf;AAEA,SAAS,aAAa,OAAgB;AACpC,SACE,iBAAiB,QACjB,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU;AAErB;AAEA,SAAS,eAAe,OAAgB,QAAiB;AACvD,MAAI,KAAC,mCAAuB,MAAM,GAAG;AACnC,eAAO,wBAAY,OAAO,MAAM;AAAA,EAClC;AAEA,MAAI,QAAQ,UAAU,KAAC,wBAAY,OAAO,OAAO,EAAE,EAAG,QAAO;AAC7D,MAAI,SAAS,cAAU,wBAAY,OAAO,OAAO,GAAG,EAAG,QAAO;AAC9D,MAAI,QAAQ,QAAQ;AAClB,UAAM,SAAS,MAAM,QAAQ,OAAO,EAAE,IAAI,OAAO,KAAK,CAAC;AACvD,QAAI,CAAC,OAAO,KAAK,CAAC,kBAAc,wBAAY,WAAW,KAAK,CAAC,EAAG,QAAO;AAAA,EACzE;AACA,MAAI,cAAc,QAAQ;AACxB,QAAI,OAAO,UAAU,YAAY,OAAO,OAAO,aAAa,SAAU,QAAO;AAC7E,QAAI,CAAC,MAAM,SAAS,OAAO,QAAQ,EAAG,QAAO;AAAA,EAC/C;AACA,MAAI,QAAQ,QAAQ;AAClB,QAAI,CAAC,aAAa,KAAK,KAAK,SAAS,OAAO,GAAK,QAAO;AAAA,EAC1D;AACA,MAAI,SAAS,QAAQ;AACnB,QAAI,CAAC,aAAa,KAAK,KAAK,QAAQ,OAAO,IAAM,QAAO;AAAA,EAC1D;AACA,MAAI,QAAQ,QAAQ;AAClB,QAAI,CAAC,aAAa,KAAK,KAAK,SAAS,OAAO,GAAK,QAAO;AAAA,EAC1D;AACA,MAAI,SAAS,QAAQ;AACnB,QAAI,CAAC,aAAa,KAAK,KAAK,QAAQ,OAAO,IAAM,QAAO;AAAA,EAC1D;AAEA,SAAO;AACT;AAEA,SAAS,SAAS,MAAmB,SAAwB;AAC3D,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,UAAU,OAAO,QAAQ,OAAO;AACtC,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAE5B,SAAO,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,MAAM,UAAU;AACrC,eAAW,CAAC,OAAO,SAAS,KAAK,SAAS;AACxC,YAAM,IAAI,KAAK,KAAK,KAAK;AACzB,YAAM,IAAI,MAAM,KAAK,KAAK;AAC1B,cAAI,wBAAY,GAAG,CAAC,EAAG;AACvB,UAAI,MAAM,OAAW,QAAO,cAAc,QAAQ,KAAK;AACvD,UAAI,MAAM,OAAW,QAAO,cAAc,QAAQ,IAAI;AACtD,UAAI,KAAK,KAAM,QAAO,cAAc,QAAQ,KAAK;AACjD,UAAI,KAAK,KAAM,QAAO,cAAc,QAAQ,IAAI;AAChD,UAAI,IAAI,EAAG,QAAO,cAAc,QAAQ,KAAK;AAC7C,UAAI,IAAI,EAAG,QAAO,cAAc,QAAQ,IAAI;AAAA,IAC9C;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,SAAS,MAAmB,MAAe,MAAe;AACjE,QAAM,QAAQ,QAAQ;AACtB,QAAM,MAAM,SAAS,SAAY,SAAY,QAAQ;AACrD,SAAO,KAAK,MAAM,OAAO,GAAG;AAC9B;AAEA,SAAS,wBAAwB,QAA4B;AAC3D,QAAM,SAAS,MAAM,QAAQ,MAAM,IAAI,OAAO,KAAK,IAAI,IAAK,UAAU;AACtE,QAAM,QAAQ,IAAI,MAAM,2CAA2C,MAAM,GAAG;AAC5E,SAAO,OAAO,OAAO;AAAA,IACnB,MAAM;AAAA,IACN;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAEA,SAAS,8BAA8B,OAAgB;AACrD,MAAI,CAAC,SAAS,KAAK,EAAG,QAAO;AAC7B,SACE,MAAM,SAAS,+BACf,MAAM,SAAS,+BACf,OAAO,MAAM,WAAW,EAAE,EAAE,SAAS,kBAAkB;AAE3D;AAEA,SAAS,SAAS,OAAe;AAC/B,SAAO,UAAU,KAAK;AACxB;AAEA,SAAS,gBAAgB,MAA0B;AACjD,QAAM,QAAQ,KAAK,aAAa;AAChC,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAMO,SAAS,gCACd,QACA,gBACA;AACA,SAAO,qBAAqB,QAAQ,cAAc;AACpD;AAEA,SAAS,6BACP,QACmD;AACnD,QAAM,iBAAiB,qBAAqB,OAAO,QAAQ,OAAO,cAAc;AAEhF,WAAS,qBAAqB,QAAiB;AAC7C,UAAM,WAAW,YAAY,MAAM;AAEnC,eAAW,SAAS,OAAO,OAAO,SAAS,MAAM,GAAG;AAClD,UAAI,MAAM,QAAQ;AAChB,cAAM,IAAI;AAAA,UACR,4EAA4E,MAAM,IAAI;AAAA,QACxF;AAAA,MACF;AAEA,YAAM,UAAU,MAAM,OAAO;AAC7B,UACE,SAAS,SAAS,QAClB,QAAQ,WAAW,aACnB,QAAQ,cAAc,aACtB;AACA,cAAM,IAAI;AAAA,UACR,0EAA0E,MAAM,IAAI;AAAA,QACtF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa,QAAiB,WAA+B;AACpE,UAAM,WAAW,qBAAqB,MAAM;AAC5C,WAAO,OAAO,SAAS,SAAS,KAAK,SAAS,OAAO,SAAS,EAAE;AAAA,EAClE;AAEA,WAAS,eAAe,WAAmB,WAAmB;AAC5D,WAAO,OAAO,aAAa,SAAS,IAAI,SAAS;AAAA,EACnD;AAEA,WAAS,YAAY,WAAmB,OAAsB,OAAgB;AAC5E,QAAI,UAAU,OAAW,QAAO;AAChC,QAAI,UAAU,KAAM,QAAO;AAE3B,UAAM,YAAY,eAAe,WAAW,MAAM,IAAI;AACtD,QAAI,WAAW,QAAQ;AACrB,aAAO,UAAU,OAAO,KAAK;AAAA,IAC/B;AAEA,QAAI,MAAM,SAAS,QAAQ,MAAM,WAAW,WAAW;AACrD,aAAO,OAAO,KAAK;AAAA,IACrB;AAEA,QAAI,MAAM,SAAS,QAAQ;AACzB,aAAO,OAAO,KAAK;AAAA,IACrB;AAEA,QAAI,MAAM,SAAS,WAAW;AAC5B,aAAO,QAAQ,KAAK;AAAA,IACtB;AAEA,QAAI,MAAM,SAAS,WAAW;AAC5B,aAAO,OAAO,KAAK;AAAA,IACrB;AAEA,QAAI,MAAM,SAAS,UAAU;AAC3B,aAAO,OAAO,UAAU,WACpB,MAAM,SAAS,IACf,OAAO,KAAwB,EAAE,SAAS;AAAA,IAChD;AAEA,QAAI,MAAM,SAAS,WAAW;AAC5B,aAAO,OAAO,UAAU,WAAW,uBAAuB,KAAK,IAAI,OAAO,KAAK;AAAA,IACjF;AAEA,QAAI,MAAM,SAAS,YAAY;AAC7B,UAAI,iBAAiB,KAAM,QAAO,MAAM,YAAY;AACpD,aAAO,IAAI,KAAK,KAAwB,EAAE,YAAY;AAAA,IACxD;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,YAAY,WAAmB,OAAsB,OAAgB,OAAgB;AAC5F,UAAM,YAAY,eAAe,WAAW,MAAM,IAAI;AACtD,QAAI,WAAW,QAAQ;AACrB,aAAO,UAAU,OAAO,KAAK;AAAA,IAC/B;AAEA,QAAI,UAAU,UAAa,MAAM,SAAS,QAAQ,UAAU,QAAW;AACrE,UAAI,MAAM,WAAW,WAAW;AAC9B,cAAM,UAAU,OAAO,KAAK;AAC5B,eAAO,OAAO,SAAS,OAAO,IAAI,UAAU;AAAA,MAC9C;AACA,aAAO;AAAA,IACT;AAEA,QAAI,UAAU,UAAa,UAAU,KAAM,QAAO,SAAS;AAE3D,QAAI,MAAM,SAAS,QAAQ,MAAM,WAAW,WAAW;AACrD,aAAO,OAAO,KAAK;AAAA,IACrB;AAEA,QAAI,MAAM,SAAS,QAAQ;AACzB,aAAO,OAAO,KAAK;AAAA,IACrB;AAEA,QAAI,MAAM,SAAS,WAAW;AAC5B,aAAO,QAAQ,KAAK;AAAA,IACtB;AAEA,QAAI,MAAM,SAAS,WAAW;AAC5B,aAAO,OAAO,KAAK;AAAA,IACrB;AAEA,QAAI,MAAM,SAAS,UAAU;AAC3B,aAAO,OAAO,UAAU,WAAW,QAAQ,OAAO,KAAwB;AAAA,IAC5E;AAEA,QAAI,MAAM,SAAS,WAAW;AAC5B,aAAO,uBAAuB,OAAO,KAAK,CAAC;AAAA,IAC7C;AAEA,QAAI,MAAM,SAAS,YAAY;AAC7B,aAAO,iBAAiB,OAAO,QAAQ,IAAI,KAAK,KAAwB;AAAA,IAC1E;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,eAAe,OAAsB,MAAwC;AACpF,UAAM,SAAsB,CAAC;AAC7B,UAAM,UAAuB,CAAC;AAE9B,eAAW,SAAS,OAAO,OAAO,MAAM,MAAM,GAAG;AAC/C,YAAM,QAAQ,aAAa,KAAK,MAAM,IAAI,GAAG,KAAK;AAClD,UAAI,UAAU,OAAW;AACzB,YAAM,UAAU,YAAY,MAAM,MAAM,OAAO,KAAK;AACpD,aAAO,MAAM,MAAM,IAAI;AACvB,cAAQ,MAAM,IAAI,IAAI,YAAY,MAAM,MAAM,OAAO,OAAO;AAAA,IAC9D;AAEA,UAAM,UAAU,MAAM,OAAO;AAC7B,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,QACL,WAAO,+BAAW;AAAA,QAClB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,UAAU,QAAQ,QAAQ,IAAI;AAElC,QAAI,YAAY,UAAa,YAAY,MAAM;AAC7C,UAAI,QAAQ,WAAW,WAAW;AAChC,cAAM,IAAI;AAAA,UACR,mEAAmE,MAAM,IAAI;AAAA,QAC/E;AAAA,MACF;AAEA,oBAAU,+BAAW;AACrB,YAAM,YAAY,YAAY,MAAM,MAAM,SAAS,OAAO;AAC1D,aAAO,QAAQ,MAAM,IAAI;AACzB,cAAQ,QAAQ,IAAI,IAAI,YAAY,MAAM,MAAM,SAAS,SAAS;AAClE,gBAAU,QAAQ,QAAQ,IAAI;AAAA,IAChC;AAEA,WAAO;AAAA,MACL,OAAO,OAAO,OAAO;AAAA,MACrB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,gBACP,OACA,SACA,MACA;AACA,UAAM,SAAS;AAAA,MACb,GAAG,QAAQ;AAAA,IACb;AACA,UAAM,UAAU;AAAA,MACd,GAAG,QAAQ;AAAA,IACb;AAEA,eAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AACrD,UAAI,UAAU,OAAW;AACzB,YAAM,QAAQ,MAAM,OAAO,SAAS;AACpC,UAAI,CAAC,OAAO;AACV,cAAM,IAAI,MAAM,kBAAkB,SAAS,eAAe,MAAM,IAAI,IAAI;AAAA,MAC1E;AACA,UAAI,MAAM,SAAS,QAAQ,KAAC,wBAAY,QAAQ,KAAK,IAAI,KAAK,GAAG;AAC/D,cAAM,IAAI;AAAA,UACR,0EAA0E,MAAM,IAAI;AAAA,QACtF;AAAA,MACF;AAEA,YAAM,UAAU,YAAY,MAAM,MAAM,OAAO,KAAK;AACpD,aAAO,MAAM,MAAM,IAAI;AACvB,cAAQ,MAAM,IAAI,IAAI,YAAY,MAAM,MAAM,OAAO,OAAO;AAAA,IAC9D;AAEA,WAAO;AAAA,MACL,OAAO,QAAQ;AAAA,MACf;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,iBAAe,aAAa,WAAmB;AAC7C,UAAM,QAA8B,CAAC;AACrC,QAAI;AAEJ,OAAG;AACD,YAAM,SAAU,MAAM,eAAe;AAAA,QACnC,IAAI,gCAAY;AAAA,UACd,WAAW;AAAA,UACX,mBAAmB;AAAA,QACrB,CAAC;AAAA,MACH;AAEA,YAAM,KAAK,GAAI,OAAO,SAAS,CAAC,CAAE;AAClC,0BAAoB,OAAO;AAAA,IAC7B,SAAS;AAET,WAAO;AAAA,EACT;AAEA,iBAAe,YAAY,OAAsB,WAAmB,IAAY;AAC9E,UAAM,SAAU,MAAM,eAAe;AAAA,MACnC,IAAI,+BAAW;AAAA,QACb,WAAW;AAAA,QACX,KAAK;AAAA,UACH,CAAC,aAAa,GAAG;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,IACH;AACA,UAAM,SAAS,OAAO;AAEtB,QAAI,CAAC,UAAU,OAAO,UAAU,MAAM,eAAe;AACnD,aAAO;AAAA,IACT;AAEA,UAAM,UAAuB,CAAC;AAC9B,UAAM,QAAQ,GAAG,MAAM,UAAU,MAAM;AAEvC,eAAW,SAAS,OAAO,OAAO,MAAM,MAAM,GAAG;AAC/C,cAAQ,MAAM,IAAI,IAAI,YAAY,MAAM,MAAM,OAAO,OAAO,MAAM,MAAM,GAAG,KAAK;AAAA,IAClF;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAEA,iBAAe,SACb,QACA,WACA;AACA,UAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,UAAM,YAAY,aAAa,QAAQ,SAAS;AAChD,UAAM,QAAQ,MAAM,aAAa,SAAS;AAE1C,WAAO,MACJ,OAAO,CAAC,SAAS,KAAK,UAAU,MAAM,aAAa,EACnD,IAAI,CAAC,WAAW;AACf,YAAM,KAAK,gBAAgB,MAAM,KAAK;AACtC,YAAM,QAAQ,GAAG,MAAM,UAAU,MAAM;AACvC,YAAM,UAAuB,CAAC;AAE9B,iBAAW,SAAS,OAAO,OAAO,MAAM,MAAM,GAAG;AAC/C,gBAAQ,MAAM,IAAI,IAAI,YAAY,MAAM,MAAM,OAAO,OAAO,MAAM,MAAM,GAAG,KAAK;AAAA,MAClF;AAEA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACL;AAEA,WAAS,qBAAqB,OAAsB,WAAmB,OAAgB;AACrF,UAAM,QAAQ,MAAM,OAAO,SAAS;AACpC,QAAI,CAAC,SAAS,UAAU,UAAa,UAAU,MAAM;AACnD,aAAO;AAAA,IACT;AAEA,WAAO,YAAY,MAAM,MAAM,OAAO,YAAY,MAAM,MAAM,OAAO,KAAK,CAAC;AAAA,EAC7E;AAEA,WAAS,oBACP,OACA,WACA,OACA,QACA;AACA,QAAI,KAAC,mCAAuB,MAAM,GAAG;AACnC,iBAAO,wBAAY,OAAO,qBAAqB,OAAO,WAAW,MAAM,CAAC;AAAA,IAC1E;AAEA,UAAM,aAAa;AAAA,MACjB,GAAI,OAAO,OAAO,SAAY,EAAE,IAAI,qBAAqB,OAAO,WAAW,OAAO,EAAE,EAAE,IAAI,CAAC;AAAA,MAC3F,GAAI,OAAO,QAAQ,SACf,EAAE,KAAK,qBAAqB,OAAO,WAAW,OAAO,GAAG,EAAE,IAC1D,CAAC;AAAA,MACL,GAAI,OAAO,OAAO,SACd;AAAA,QACE,KAAK,MAAM,QAAQ,OAAO,EAAE,IAAI,OAAO,KAAK,CAAC,GAAG;AAAA,UAAI,CAAC,UACnD,qBAAqB,OAAO,WAAW,KAAK;AAAA,QAC9C;AAAA,MACF,IACA,CAAC;AAAA,MACL,GAAI,OAAO,aAAa,SAAY,EAAE,UAAU,OAAO,OAAO,QAAQ,EAAE,IAAI,CAAC;AAAA,MAC7E,GAAI,OAAO,OAAO,SAAY,EAAE,IAAI,qBAAqB,OAAO,WAAW,OAAO,EAAE,EAAE,IAAI,CAAC;AAAA,MAC3F,GAAI,OAAO,QAAQ,SACf,EAAE,KAAK,qBAAqB,OAAO,WAAW,OAAO,GAAG,EAAE,IAC1D,CAAC;AAAA,MACL,GAAI,OAAO,OAAO,SAAY,EAAE,IAAI,qBAAqB,OAAO,WAAW,OAAO,EAAE,EAAE,IAAI,CAAC;AAAA,MAC3F,GAAI,OAAO,QAAQ,SACf,EAAE,KAAK,qBAAqB,OAAO,WAAW,OAAO,GAAG,EAAE,IAC1D,CAAC;AAAA,IACP;AAEA,WAAO,eAAe,OAAO,UAAU;AAAA,EACzC;AAEA,WAAS,kBAAkB,OAAsB,QAAqB,OAAuB;AAC3F,QAAI,CAAC,MAAO,QAAO;AAEnB,QAAI,MAAM,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,kBAAkB,OAAO,QAAQ,MAAM,CAAC,GAAG;AACvF,aAAO;AAAA,IACT;AAEA,QAAI,MAAM,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW,kBAAkB,OAAO,QAAQ,MAAM,CAAC,GAAG;AACpF,aAAO;AAAA,IACT;AAEA,QAAI,MAAM,OAAO,kBAAkB,OAAO,QAAQ,MAAM,GAAG,GAAG;AAC5D,aAAO;AAAA,IACT;AAEA,eAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,KAAK,GAAG;AACjD,UAAI,QAAQ,SAAS,QAAQ,QAAQ,QAAQ,MAAO;AACpD,UAAI,CAAC,oBAAoB,OAAO,KAAK,OAAO,GAAG,GAAG,MAAM,EAAG,QAAO;AAAA,IACpE;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,gBACP,OACA,MACA,OAKI,CAAC,GACL;AACA,UAAM,WAAW,KAAK,OAAO,CAAC,QAAQ,kBAAkB,OAAO,IAAI,MAAM,KAAK,KAAK,CAAC;AACpF,UAAM,SAAS,SAAS,UAAU,KAAK,OAAO;AAC9C,WAAO,SAAS,QAAQ,KAAK,MAAM,KAAK,IAAI;AAAA,EAC9C;AAEA,WAAS,qBAAqB,OAAsB,WAAmB,OAAgB;AACrF,UAAM,QAAQ,MAAM,OAAO,SAAS;AACpC,UAAM,aAAa,YAAY,MAAM,MAAM,OAAO,YAAY,MAAM,MAAM,OAAO,KAAK,CAAC;AAEvF,QAAI,sBAAsB,MAAM;AAC9B,aAAO,WAAW,YAAY;AAAA,IAChC;AAEA,QAAI,OAAO,eAAe,UAAU;AAClC,aAAO,WAAW,SAAS;AAAA,IAC7B;AAEA,WAAO,KAAK,UAAU,UAAU;AAAA,EAClC;AAEA,WAAS,aAAa,OAAsB,QAAkB,KAAkB;AAC9E,UAAM,SAAS,OAAO,IAAI,CAAC,cAAc,IAAI,SAAS,CAAC;AACvD,QAAI,OAAO,KAAK,CAAC,UAAU,UAAU,UAAa,UAAU,IAAI,GAAG;AACjE,aAAO;AAAA,IACT;AAEA,UAAM,gBAAgB,OAAO;AAAA,MAAI,CAAC,cAChC,mBAAmB,qBAAqB,OAAO,WAAW,IAAI,SAAS,CAAC,CAAC;AAAA,IAC3E;AAEA,WAAO,UAAU,MAAM,IAAI,IAAI,OAAO,KAAK,GAAG,CAAC,IAAI,cAAc,KAAK,GAAG,CAAC;AAAA,EAC5E;AAEA,WAAS,kBAAkB,OAAsB,KAAkB,OAAe;AAChF,UAAM,SAAS,SAAS,KAAK;AAC7B,UAAM,QAAsB,CAAC;AAE7B,eAAW,SAAS,OAAO,OAAO,MAAM,MAAM,GAAG;AAC/C,UAAI,CAAC,MAAM,OAAQ;AACnB,YAAM,KAAK,aAAa,OAAO,CAAC,MAAM,IAAI,GAAG,GAAG;AAChD,UAAI,CAAC,GAAI;AACT,YAAM,KAAK;AAAA,QACT;AAAA,QACA;AAAA,QACA,QAAQ,CAAC,MAAM,IAAI;AAAA,MACrB,CAAC;AAAA,IACH;AAEA,eAAW,cAAc,MAAM,YAAY,QAAQ;AACjD,YAAM,KAAK,aAAa,OAAO,CAAC,GAAG,WAAW,MAAM,GAAG,GAAG;AAC1D,UAAI,CAAC,GAAI;AACT,YAAM,KAAK;AAAA,QACT;AAAA,QACA;AAAA,QACA,QAAQ,CAAC,GAAG,WAAW,MAAM;AAAA,MAC/B,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAEA,iBAAe,cACb,QACA,WACA,OACA;AACA,UAAM,WAAW,qBAAqB,MAAM;AAC5C,UAAM,QAAQ,SAAS,OAAO,SAAS;AACvC,UAAM,aAAS,gCAAoB,OAAO,OAAO,YAAY;AAC7D,UAAM,YAAY,aAAa,QAAQ,SAAS;AAEhD,QAAI,OAAO,SAAS,MAAM;AACxB,aAAO,YAAY,OAAO,WAAW,SAAS,OAAO,OAAO,OAAO,OAAO,OAAO,CAAC,EAAG,IAAI,CAAC,CAAC,CAAC;AAAA,IAC9F;AAEA,UAAM,sBAAsB,OAAO;AAAA,MACjC,OAAO,OAAO,IAAI,CAAC,UAAU;AAAA,QAC3B,MAAM;AAAA,QACN,YAAY,MAAM,MAAM,OAAO,YAAY,MAAM,MAAM,OAAO,OAAO,OAAO,MAAM,IAAI,CAAC,CAAC;AAAA,MAC1F,CAAC;AAAA,IACH;AACA,UAAM,SAAS;AAAA,MACb;AAAA,MACA,OAAO,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,MACvC;AAAA,IACF;AACA,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAEA,UAAM,aAAc,MAAM,eAAe;AAAA,MACvC,IAAI,+BAAW;AAAA,QACb,WAAW;AAAA,QACX,KAAK;AAAA,UACH,CAAC,aAAa,GAAG;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,IACH;AACA,UAAM,SACJ,OAAO,WAAW,OAAO,YAAY,MAAM,WACvC,WAAW,KAAK,YAAY,IAC5B;AACN,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAEA,WAAO,YAAY,OAAO,WAAW,MAAM;AAAA,EAC7C;AAEA,WAAS,mBACP,OACA,WACA,cACA,eAA4B,oBAAI,IAAI,GACpC;AACA,UAAM,UAAU,MAAM,OAAO;AAE7B,eAAW,OAAO,cAAc;AAC9B,UAAI,aAAa,IAAI,IAAI,KAAK,EAAG;AAEjC,UACE,WACA,UAAU,QAAQ,IAAI,MAAM,UAC5B,UAAU,QAAQ,IAAI,MAAM,QAC5B,IAAI,KAAK,QAAQ,IAAI,MAAM,UAC3B,IAAI,KAAK,QAAQ,IAAI,MAAM,YAC3B,wBAAY,UAAU,QAAQ,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAI,CAAC,GAC3D;AACA,eAAO,CAAC,QAAQ,IAAI;AAAA,MACtB;AAEA,iBAAW,SAAS,OAAO,OAAO,MAAM,MAAM,GAAG;AAC/C,YAAI,CAAC,MAAM,OAAQ;AACnB,YAAI,UAAU,MAAM,IAAI,MAAM,UAAa,UAAU,MAAM,IAAI,MAAM,KAAM;AAC3E,YAAI,IAAI,KAAK,MAAM,IAAI,MAAM,UAAa,IAAI,KAAK,MAAM,IAAI,MAAM,KAAM;AACzE,gBAAI,wBAAY,UAAU,MAAM,IAAI,GAAG,IAAI,KAAK,MAAM,IAAI,CAAC,GAAG;AAC5D,iBAAO,CAAC,MAAM,IAAI;AAAA,QACpB;AAAA,MACF;AAEA,iBAAW,cAAc,MAAM,YAAY,QAAQ;AACjD,YACE,CAAC,WAAW,OAAO;AAAA,UACjB,CAAC,cACC,UAAU,SAAS,MAAM,UACzB,UAAU,SAAS,MAAM,QACzB,IAAI,KAAK,SAAS,MAAM,UACxB,IAAI,KAAK,SAAS,MAAM;AAAA,QAC5B,GACA;AACA;AAAA,QACF;AAEA,YACE,WAAW,OAAO;AAAA,UAAM,CAAC,kBACvB,wBAAY,UAAU,SAAS,GAAG,IAAI,KAAK,SAAS,CAAC;AAAA,QACvD,GACA;AACA,iBAAO,CAAC,GAAG,WAAW,MAAM;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,gBAAgB,KAA6C;AACpE,WAAO;AAAA,MACL,CAAC,aAAa,GAAG,SAAS,IAAI,KAAK;AAAA,MACnC,CAAC,UAAU,GAAG;AAAA,MACd,GAAG,IAAI;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,WAAmB,KAA6C;AAC3F,WAAO;AAAA,MACL,KAAK;AAAA,QACH,WAAW;AAAA,QACX,MAAM,gBAAgB,GAAG;AAAA,QACzB,qBAAqB;AAAA,QACrB,0BAA0B;AAAA,UACxB,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBAAoB,WAAmB,KAA6C;AAC3F,WAAO;AAAA,MACL,KAAK;AAAA,QACH,WAAW;AAAA,QACX,MAAM,gBAAgB,GAAG;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,WAAS,cAAc,WAAmB,MAAkB;AAC1D,WAAO;AAAA,MACL,KAAK;AAAA,QACH,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,CAAC,aAAa,GAAG,KAAK;AAAA,UACtB,CAAC,UAAU,GAAG;AAAA,UACd,CAAC,YAAY,GAAG,KAAK;AAAA,QACvB;AAAA,QACA,qBAAqB;AAAA,QACrB,0BAA0B;AAAA,UACxB,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,WAAS,WAAW,WAAmB,IAAY;AACjD,WAAO;AAAA,MACL,QAAQ;AAAA,QACN,WAAW;AAAA,QACX,KAAK;AAAA,UACH,CAAC,aAAa,GAAG;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,iBAAe,oBACb,WACA,KACA,qBACA;AACA,UAAM,eAAe;AAAA,MACnB,IAAI,+BAAW;AAAA,QACb,WAAW;AAAA,QACX,MAAM,gBAAgB,GAAG;AAAA,QACzB,GAAI,sBACA;AAAA,UACE,qBAAqB;AAAA,UACrB,0BAA0B;AAAA,YACxB,OAAO;AAAA,UACT;AAAA,QACF,IACA,CAAC;AAAA,MACP,CAAC;AAAA,IACH;AAAA,EACF;AAEA,iBAAe,oBAAoB,WAAmB,MAAkB;AACtE,UAAM,eAAe;AAAA,MACnB,IAAI,+BAAW;AAAA,QACb,WAAW;AAAA,QACX,MAAM;AAAA,UACJ,CAAC,aAAa,GAAG,KAAK;AAAA,UACtB,CAAC,UAAU,GAAG;AAAA,UACd,CAAC,YAAY,GAAG,KAAK;AAAA,QACvB;AAAA,QACA,qBAAqB;AAAA,QACrB,0BAA0B;AAAA,UACxB,OAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,iBAAe,iBAAiB,WAAmB,IAAY;AAC7D,UAAM,eAAe;AAAA,MACnB,IAAI,kCAAc;AAAA,QAChB,WAAW;AAAA,QACX,KAAK;AAAA,UACH,CAAC,aAAa,GAAG;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,iBAAe,6BAA6B,WAAmB,OAAqB;AAClF,UAAM,WAAyB,CAAC;AAEhC,QAAI;AACF,iBAAW,QAAQ,OAAO;AACxB,cAAM,oBAAoB,WAAW,IAAI;AACzC,iBAAS,KAAK,IAAI;AAAA,MACpB;AAAA,IACF,SAAS,OAAO;AACd,YAAM,6BAA6B,WAAW,QAAQ;AACtD,YAAM;AAAA,IACR;AAEA,WAAO;AAAA,EACT;AAEA,iBAAe,6BAA6B,WAAmB,OAAqB;AAClF,eAAW,QAAQ,CAAC,GAAG,KAAK,EAAE,QAAQ,GAAG;AACvC,UAAI;AACF,cAAM,iBAAiB,WAAW,KAAK,EAAE;AAAA,MAC3C,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,iBAAe,sBACb,WACA,KACA,OACA;AACA,UAAM,QAAQ,kBAAkB,OAAO,IAAI,SAAS,IAAI,KAAK;AAC7D,UAAM,gBAAgB;AAAA,MACpB,oBAAoB,WAAW,GAAG;AAAA,MAClC,GAAG,MAAM,IAAI,CAAC,SAAS,cAAc,WAAW,IAAI,CAAC;AAAA,IACvD;AAEA,QAAI;AACF,YAAM,eAAe;AAAA,QACnB,IAAI,yCAAqB;AAAA,UACvB,eAAe;AAAA,QACjB,CAAC;AAAA,MACH;AAAA,IACF,SAAS,OAAO;AACd,UAAI,CAAC,8BAA8B,KAAK,GAAG;AACzC,cAAM;AAAA,MACR;AAEA,YAAM,gBAAgB,MAAM,6BAA6B,WAAW,KAAK;AAEzE,UAAI;AACF,cAAM,oBAAoB,WAAW,KAAK,IAAI;AAAA,MAChD,SAAS,aAAa;AACpB,cAAM,6BAA6B,WAAW,aAAa;AAC3D,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,iBAAe,sBACb,WACA,OACA,SACA,MACA;AACA,UAAM,eAAe,IAAI;AAAA,MACvB,kBAAkB,OAAO,QAAQ,MAAM,QAAQ,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC;AAAA,IACrF;AACA,UAAM,YAAY,IAAI;AAAA,MACpB,kBAAkB,OAAO,KAAK,SAAS,KAAK,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC;AAAA,IAClF;AACA,UAAM,YAAY,CAAC,GAAG,aAAa,KAAK,CAAC,EACtC,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,EACjC,IAAI,CAAC,OAAO,WAAW,WAAW,EAAE,CAAC;AACxC,UAAM,SAAS,CAAC,GAAG,UAAU,QAAQ,CAAC,EACnC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC,EACtC,IAAI,CAAC,CAAC,EAAE,IAAI,MAAM,cAAc,WAAW,IAAI,CAAC;AAEnD,QAAI;AACF,YAAM,eAAe;AAAA,QACnB,IAAI,yCAAqB;AAAA,UACvB,eAAe,CAAC,oBAAoB,WAAW,IAAI,GAAG,GAAG,WAAW,GAAG,MAAM;AAAA,QAC/E,CAAC;AAAA,MACH;AAAA,IACF,SAAS,OAAO;AACd,UAAI,CAAC,8BAA8B,KAAK,GAAG;AACzC,cAAM;AAAA,MACR;AAEA,YAAM,aAAa,CAAC,GAAG,UAAU,OAAO,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,aAAa,IAAI,KAAK,EAAE,CAAC;AACtF,YAAM,gBAAgB,MAAM,6BAA6B,WAAW,UAAU;AAE9E,UAAI;AACF,cAAM,oBAAoB,WAAW,MAAM,KAAK;AAAA,MAClD,SAAS,aAAa;AACpB,cAAM,6BAA6B,WAAW,aAAa;AAC3D,cAAM;AAAA,MACR;AAEA,iBAAW,aAAa,WAAW;AACjC,cAAM,iBAAiB,WAAW,UAAU,OAAO,IAAI,aAAa,CAAC;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AAEA,iBAAe,sBACb,WACA,OACA,SACA;AACA,UAAM,QAAQ,kBAAkB,OAAO,QAAQ,MAAM,QAAQ,KAAK;AAClE,QAAI;AACF,YAAM,eAAe;AAAA,QACnB,IAAI,yCAAqB;AAAA,UACvB,eAAe;AAAA,YACb,WAAW,WAAW,QAAQ,EAAE;AAAA,YAChC,GAAG,MAAM,IAAI,CAAC,SAAS,WAAW,WAAW,KAAK,EAAE,CAAC;AAAA,UACvD;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,SAAS,OAAO;AACd,UAAI,CAAC,8BAA8B,KAAK,GAAG;AACzC,cAAM;AAAA,MACR;AAEA,YAAM,iBAAiB,WAAW,QAAQ,EAAE;AAC5C,iBAAW,QAAQ,OAAO;AACxB,cAAM,iBAAiB,WAAW,KAAK,EAAE;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAEA,iBAAe,WAIb,QACA,WACA,KACA,QACuD;AACvD,UAAM,kBAAkB,OAAO,OAAO,SAAS;AAC/C,UAAM,SAAsB,CAAC;AAE7B,QAAI,CAAC,QAAQ;AACX,iBAAW,aAAa,OAAO,KAAK,gBAAgB,MAAM,GAAG;AAC3D,eAAO,SAAS,IAAI,IAAI,SAAS;AAAA,MACnC;AAEA,aAAO;AAAA,IACT;AAEA,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,UAAI,UAAU,QAAQ,UAAU,OAAW;AAE3C,UAAI,OAAO,gBAAgB,UAAU,UAAU,MAAM;AACnD,eAAO,GAAG,IAAI,IAAI,GAAG;AACrB;AAAA,MACF;AAEA,UAAI,OAAO,gBAAgB,WAAW;AACpC,eAAO,GAAG,IAAI,MAAM;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,iBAAe,gBAIb,QACA,WACA,cACA,KACA,OACA;AACA,UAAM,WAAW,OAAO,OAAO,SAAS,EAAE,UAAU,YAAY;AAChE,UAAM,eAAe,UAAU,OAAO,CAAC,IAAI;AAE3C,QAAI,SAAS,SAAS,aAAa;AACjC,YAAM,eAAe,IAAI,SAAS,UAAU;AAC5C,YAAMA,eAAc,MAAM,SAAS,QAAQ,SAAS,MAA4B,GAAG;AAAA,QACjF,CAAC,aAAS,wBAAY,KAAK,KAAK,IAAI,YAAY;AAAA,MAClD;AACA,YAAM,SAAS;AAAA,QACb,uBAAuB,QAAQ,SAAS,MAAM;AAAA,QAC9CA;AAAA,QACA;AAAA,MACF,EAAE,CAAC;AACH,aAAO,SACH;AAAA,QACE;AAAA,QACA,SAAS;AAAA,QACT,OAAO;AAAA,QACP,aAAa;AAAA,MACf,IACA;AAAA,IACN;AAEA,QAAI,SAAS,SAAS,UAAU;AAC9B,YAAMA,eAAc,MAAM,SAAS,QAAQ,SAAS,MAA4B,GAAG;AAAA,QACjF,CAAC,aAAS,wBAAY,KAAK,KAAK,SAAS,UAAU,GAAG,IAAI,EAAE;AAAA,MAC9D;AACA,YAAM,SAAS;AAAA,QACb,uBAAuB,QAAQ,SAAS,MAAM;AAAA,QAC9CA;AAAA,QACA;AAAA,MACF,EAAE,CAAC;AACH,aAAO,SACH;AAAA,QACE;AAAA,QACA,SAAS;AAAA,QACT,OAAO;AAAA,QACP,aAAa;AAAA,MACf,IACA;AAAA,IACN;AAEA,QAAI,SAAS,SAAS,WAAW;AAC/B,YAAMA,eAAc,MAAM,SAAS,QAAQ,SAAS,MAA4B,GAAG;AAAA,QACjF,CAAC,aAAS,wBAAY,KAAK,KAAK,SAAS,UAAU,GAAG,IAAI,EAAE;AAAA,MAC9D;AACA,YAAMC,eAAc;AAAA,QAClB,uBAAuB,QAAQ,SAAS,MAAM;AAAA,QAC9CD;AAAA,QACA;AAAA,MACF;AACA,aAAO,QAAQ;AAAA,QACbC,aAAY;AAAA,UAAI,CAAC,SACf,WAAW,QAAQ,SAAS,QAA8B,KAAK,MAAM,aAAa,MAAM;AAAA,QAC1F;AAAA,MACF;AAAA,IACF;AAEA,UAAM,eAAe,MAAM,SAAS,QAAQ,SAAS,OAA6B,GAAG;AAAA,MACnF,CAAC,aAAS,wBAAY,KAAK,KAAK,SAAS,IAAI,GAAG,IAAI,EAAE;AAAA,IACxD;AACA,UAAM,YAAY,YAAY,IAAI,CAAC,SAAS,KAAK,KAAK,SAAS,EAAE,CAAC;AAClE,UAAM,cAAc,MAAM,SAAS,QAAQ,SAAS,MAA4B,GAAG;AAAA,MACjF,CAAC,SAAS,UAAU,KAAK,CAAC,iBAAa,wBAAY,UAAU,KAAK,KAAK,EAAE,CAAC;AAAA,IAC5E;AACA,UAAM,cAAc;AAAA,MAClB,uBAAuB,QAAQ,SAAS,MAAM;AAAA,MAC9C;AAAA,MACA;AAAA,IACF;AAEA,WAAO,QAAQ;AAAA,MACb,YAAY;AAAA,QAAI,CAAC,SACf,WAAW,QAAQ,SAAS,QAA8B,KAAK,MAAM,aAAa,MAAM;AAAA,MAC1F;AAAA,IACF;AAAA,EACF;AAEA,WAAS,uBAAuB,QAAiB,WAAmB;AAClE,WAAO,qBAAqB,MAAM,EAAE,OAAO,SAA+B;AAAA,EAC5E;AAEA,MAAI;AAEJ,WAAS;AAAA,IACP,YAAQ,+BAAmB;AAAA,MACzB,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,QAAQ,OAAO;AAAA,QACf;AAAA,QACA,QAAQ,OAAO;AAAA,MACjB;AAAA,MACA,cAAc;AAAA,QACZ,oBAAoB;AAAA,QACpB,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,eAAe;AAAA,QACf,kBAAkB;AAAA,QAClB,sBAAsB;AAAA,QACtB,0BAA0B;AAAA,QAC1B,0BAA0B;AAAA,QAC1B,cAAc;AAAA,QACd,uBAAuB;AAAA,QACvB,gBAAgB;AAAA,QAChB,cAAc;AAAA,UACZ,UAAU;AAAA,UACV,UAAU;AAAA,UACV,UAAU;AAAA,QACZ;AAAA,QACA,QAAQ;AAAA,QACR,WAAW;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA,eAAe;AAAA,UACb,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,QACA,iBAAiB;AAAA,UACf,gBAAgB;AAAA,UAChB,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,SAAS;AAAA,UACT,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IACD,MAAM,SAAS,QAAQ,WAAW,MAAM;AACtC,YAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,YAAM,OAAO,gBAAgB,OAAO,MAAM,SAAS,QAAQ,SAAS,GAAG,IAAI;AAC3E,aAAO,QAAQ,IAAI,KAAK,IAAI,CAAC,QAAQ,WAAW,QAAQ,WAAW,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC;AAAA,IAC5F;AAAA,IACA,MAAM,UAAU,QAAQ,WAAW,MAAM;AACvC,YAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,YAAM,MAAM,gBAAgB,OAAO,MAAM,SAAS,QAAQ,SAAS,GAAG,IAAI,EAAE,CAAC;AAC7E,UAAI,CAAC,IAAK,QAAO;AACjB,aAAO,WAAW,QAAQ,WAAW,IAAI,MAAM,KAAK,MAAM;AAAA,IAC5D;AAAA,IACA,MAAM,WAAW,QAAQ,WAAW,MAAM;AACxC,YAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,YAAM,MAAM,MAAM,cAAc,QAAQ,WAAW,KAAK,KAAgC;AACxF,UAAI,CAAC,OAAO,CAAC,kBAAkB,OAAO,IAAI,MAAM,KAAK,KAAsB,GAAG;AAC5E,eAAO;AAAA,MACT;AAEA,aAAO,WAAW,QAAQ,WAAW,IAAI,MAAM,KAAK,MAAM;AAAA,IAC5D;AAAA,IACA,MAAM,MAAM,QAAQ,WAAW,MAAM;AACnC,YAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,aAAO,gBAAgB,OAAO,MAAM,SAAS,QAAQ,SAAS,GAAG,IAAI,EAAE;AAAA,IACzE;AAAA,IACA,MAAM,OAAO,QAAQ,WAAW,MAAM;AACpC,YAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,YAAM,eAAe,MAAM,SAAS,QAAQ,SAAS;AACrD,YAAM,QAAQ,eAAe,OAAO,KAAK,IAAwC;AACjF,YAAM,WAAW,mBAAmB,OAAO,MAAM,SAAS,YAAY;AAEtE,UAAI,UAAU;AACZ,cAAM,wBAAwB,QAAQ;AAAA,MACxC;AAEA,YAAM,sBAAsB,aAAa,QAAQ,SAAS,GAAG,OAAO,KAAK;AACzE,aAAO,WAAW,QAAQ,WAAW,MAAM,SAAS,KAAK,MAAM;AAAA,IACjE;AAAA,IACA,MAAM,WAAW,QAAQ,WAAW,MAAM;AACxC,YAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,YAAM,eAAe,MAAM,SAAS,QAAQ,SAAS;AACrD,YAAM,UAA+E,CAAC;AAEtF,iBAAW,SAAS,KAAK,MAAM;AAC7B,cAAM,QAAQ,eAAe,OAAO,KAAyC;AAC7E,cAAM,WAAW,mBAAmB,OAAO,MAAM,SAAS;AAAA,UACxD,GAAG;AAAA,UACH,GAAG,QAAQ,IAAI,CAAC,SAAS;AAAA,YACvB,OAAO,IAAI;AAAA,YACX,IAAI,SAAS,IAAI,KAAK;AAAA,YACtB,MAAM,IAAI;AAAA,YACV,QAAQ,IAAI;AAAA,UACd,EAAE;AAAA,QACJ,CAAC;AAED,YAAI,UAAU;AACZ,gBAAM,wBAAwB,QAAQ;AAAA,QACxC;AAEA,gBAAQ,KAAK,KAAK;AAAA,MACpB;AAEA,iBAAW,OAAO,SAAS;AACzB,cAAM,sBAAsB,aAAa,QAAQ,SAAS,GAAG,KAAK,KAAK;AAAA,MACzE;AAEA,aAAO,QAAQ;AAAA,QACb,QAAQ,IAAI,CAAC,QAAQ,WAAW,QAAQ,WAAW,IAAI,SAAS,KAAK,MAAM,CAAC;AAAA,MAC9E;AAAA,IACF;AAAA,IACA,MAAM,OAAO,QAAQ,WAAW,MAAM;AACpC,YAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,YAAM,OAAO,MAAM,SAAS,QAAQ,SAAS;AAC7C,YAAM,UAAU,gBAAgB,OAAO,MAAM;AAAA,QAC3C,OAAO,KAAK;AAAA,QACZ,MAAM;AAAA,MACR,CAAC,EAAE,CAAC;AACJ,UAAI,CAAC,QAAS,QAAO;AAErB,YAAM,OAAO,gBAAgB,OAAO,SAAS,KAAK,IAAwC;AAC1F,YAAM,WAAW,mBAAmB,OAAO,KAAK,SAAS,MAAM,oBAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC;AACvF,UAAI,UAAU;AACZ,cAAM,wBAAwB,QAAQ;AAAA,MACxC;AAEA,YAAM,sBAAsB,aAAa,QAAQ,SAAS,GAAG,OAAO,SAAS,IAAI;AACjF,aAAO,WAAW,QAAQ,WAAW,KAAK,SAAS,KAAK,MAAM;AAAA,IAChE;AAAA,IACA,MAAM,WAAW,QAAQ,WAAW,MAAM;AACxC,YAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,YAAM,OAAO,MAAM,SAAS,QAAQ,SAAS;AAC7C,YAAM,UAAU,gBAAgB,OAAO,MAAM;AAAA,QAC3C,OAAO,KAAK;AAAA,MACd,CAAC;AACD,UAAI,CAAC,QAAQ,OAAQ,QAAO;AAE5B,YAAM,WAAW,QAAQ;AAAA,QAAI,CAAC,QAC5B,gBAAgB,OAAO,KAAK,KAAK,IAAwC;AAAA,MAC3E;AACA,YAAM,UAAU,IAAI,IAAI,QAAQ,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC;AACvD,YAAM,YAAY,KAAK,OAAO,CAAC,QAAQ,CAAC,QAAQ,IAAI,IAAI,KAAK,CAAC;AAC9D,YAAM,UAAuB,CAAC;AAE9B,iBAAW,QAAQ,UAAU;AAC3B,cAAM,WAAW,mBAAmB,OAAO,KAAK,SAAS,CAAC,GAAG,WAAW,GAAG,OAAO,CAAC;AACnF,YAAI,UAAU;AACZ,gBAAM,wBAAwB,QAAQ;AAAA,QACxC;AAEA,gBAAQ,KAAK;AAAA,UACX,OAAO,KAAK;AAAA,UACZ,IAAI,SAAS,KAAK,KAAK;AAAA,UACvB,MAAM,KAAK;AAAA,UACX,QAAQ,KAAK;AAAA,QACf,CAAC;AAAA,MACH;AAEA,eAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACtD,cAAM;AAAA,UACJ,aAAa,QAAQ,SAAS;AAAA,UAC9B;AAAA,UACA,QAAQ,KAAK;AAAA,UACb,SAAS,KAAK;AAAA,QAChB;AAAA,MACF;AAEA,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,MAAM,OAAO,QAAQ,WAAW,MAAM;AACpC,YAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,YAAM,aAAS,gCAAoB,OAAO,KAAK,OAAkC,QAAQ;AACzF;AAAA,QACE;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAEA,YAAM,UAAU,MAAM,cAAc,QAAQ,WAAW,KAAK,KAAgC;AAC5F,UAAI,WAAW,kBAAkB,OAAO,QAAQ,MAAM,KAAK,KAAsB,GAAG;AAClF,cAAMC,QAAO,MAAM,SAAS,QAAQ,SAAS;AAC7C,cAAM,OAAO;AAAA,UACX;AAAA,UACA;AAAA,UACA,KAAK;AAAA,QACP;AACA,cAAMC,YAAW,mBAAmB,OAAO,KAAK,SAASD,OAAM,oBAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC;AACvF,YAAIC,WAAU;AACZ,gBAAM,wBAAwBA,SAAQ;AAAA,QACxC;AAEA,cAAM,sBAAsB,aAAa,QAAQ,SAAS,GAAG,OAAO,SAAS,IAAI;AACjF,eAAO,WAAW,QAAQ,WAAW,KAAK,SAAS,KAAK,MAAM;AAAA,MAChE;AAEA,YAAM,UAAU;AAAA,QACd;AAAA,YACA;AAAA,UACE;AAAA,UACA,KAAK;AAAA,UACL;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,YAAM,OAAO,MAAM,SAAS,QAAQ,SAAS;AAC7C,YAAM,WAAW,mBAAmB,OAAO,QAAQ,SAAS,IAAI;AAChE,UAAI,UAAU;AACZ,cAAM,wBAAwB,QAAQ;AAAA,MACxC;AAEA,YAAM,sBAAsB,aAAa,QAAQ,SAAS,GAAG,SAAS,KAAK;AAC3E,aAAO,WAAW,QAAQ,WAAW,QAAQ,SAAS,KAAK,MAAM;AAAA,IACnE;AAAA,IACA,MAAM,OAAO,QAAQ,WAAW,MAAM;AACpC,YAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,YAAM,MAAM,gBAAgB,OAAO,MAAM,SAAS,QAAQ,SAAS,GAAG;AAAA,QACpE,OAAO,KAAK;AAAA,QACZ,MAAM;AAAA,MACR,CAAC,EAAE,CAAC;AACJ,UAAI,CAAC,IAAK,QAAO;AAEjB,YAAM,sBAAsB,aAAa,QAAQ,SAAS,GAAG,OAAO,GAAG;AACvE,aAAO;AAAA,IACT;AAAA,IACA,MAAM,WAAW,QAAQ,WAAW,MAAM;AACxC,YAAM,QAAQ,qBAAqB,MAAM,EAAE,OAAO,SAAS;AAC3D,YAAM,OAAO,gBAAgB,OAAO,MAAM,SAAS,QAAQ,SAAS,GAAG;AAAA,QACrE,OAAO,KAAK;AAAA,MACd,CAAC;AAED,iBAAW,OAAO,MAAM;AACtB,cAAM,sBAAsB,aAAa,QAAQ,SAAS,GAAG,OAAO,GAAG;AAAA,MACzE;AAEA,aAAO,KAAK;AAAA,IACd;AAAA,IACA,MAAM,YAAY,QAAQ,KAAK;AAC7B,2BAAqB,MAAM;AAC3B,aAAO,IAAI,MAAM;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,qBACd,QACmD;AACnD,SAAO,6BAA6B,MAAM;AAC5C;","names":["targetRows","matchedRows","rows","conflict"]}
@@ -0,0 +1,29 @@
1
+ import { SchemaDefinition, ModelName, OrmDriverHandle, OrmDriver } from '@farming-labs/orm';
2
+
3
+ type DynamoDbBaseClientLike = {
4
+ send(command: unknown): Promise<unknown>;
5
+ destroy?(): void;
6
+ config?: unknown;
7
+ };
8
+ type DynamoDbDocumentClientLike = DynamoDbBaseClientLike;
9
+ type DynamoDbTableMap<TSchema extends SchemaDefinition<any>> = Partial<Record<ModelName<TSchema>, string>>;
10
+ type DynamoDbFieldTransform = {
11
+ encode?: (value: unknown) => unknown;
12
+ decode?: (value: unknown) => unknown;
13
+ };
14
+ type DynamoDbDriverConfig<TSchema extends SchemaDefinition<any>> = {
15
+ client: DynamoDbBaseClientLike | DynamoDbDocumentClientLike;
16
+ documentClient?: DynamoDbDocumentClientLike;
17
+ tables?: DynamoDbTableMap<TSchema>;
18
+ transforms?: Partial<Record<string, Partial<Record<string, DynamoDbFieldTransform>>>>;
19
+ };
20
+ type DynamoDbDriverClient<TSchema extends SchemaDefinition<any>> = {
21
+ client: DynamoDbBaseClientLike | DynamoDbDocumentClientLike;
22
+ documentClient: DynamoDbDocumentClientLike;
23
+ tables?: DynamoDbTableMap<TSchema>;
24
+ };
25
+ type DynamoDbDriverHandle<TSchema extends SchemaDefinition<any>> = OrmDriverHandle<"dynamodb", DynamoDbDriverClient<TSchema>>;
26
+ declare function normalizeDynamoDbDocumentClient(client: DynamoDbBaseClientLike | DynamoDbDocumentClientLike, documentClient?: DynamoDbDocumentClientLike): DynamoDbBaseClientLike;
27
+ declare function createDynamodbDriver<TSchema extends SchemaDefinition<any>>(config: DynamoDbDriverConfig<TSchema>): OrmDriver<TSchema, DynamoDbDriverHandle<TSchema>>;
28
+
29
+ export { type DynamoDbBaseClientLike, type DynamoDbDocumentClientLike, type DynamoDbDriverClient, type DynamoDbDriverConfig, type DynamoDbDriverHandle, type DynamoDbFieldTransform, type DynamoDbTableMap, createDynamodbDriver, normalizeDynamoDbDocumentClient };
@@ -0,0 +1,29 @@
1
+ import { SchemaDefinition, ModelName, OrmDriverHandle, OrmDriver } from '@farming-labs/orm';
2
+
3
+ type DynamoDbBaseClientLike = {
4
+ send(command: unknown): Promise<unknown>;
5
+ destroy?(): void;
6
+ config?: unknown;
7
+ };
8
+ type DynamoDbDocumentClientLike = DynamoDbBaseClientLike;
9
+ type DynamoDbTableMap<TSchema extends SchemaDefinition<any>> = Partial<Record<ModelName<TSchema>, string>>;
10
+ type DynamoDbFieldTransform = {
11
+ encode?: (value: unknown) => unknown;
12
+ decode?: (value: unknown) => unknown;
13
+ };
14
+ type DynamoDbDriverConfig<TSchema extends SchemaDefinition<any>> = {
15
+ client: DynamoDbBaseClientLike | DynamoDbDocumentClientLike;
16
+ documentClient?: DynamoDbDocumentClientLike;
17
+ tables?: DynamoDbTableMap<TSchema>;
18
+ transforms?: Partial<Record<string, Partial<Record<string, DynamoDbFieldTransform>>>>;
19
+ };
20
+ type DynamoDbDriverClient<TSchema extends SchemaDefinition<any>> = {
21
+ client: DynamoDbBaseClientLike | DynamoDbDocumentClientLike;
22
+ documentClient: DynamoDbDocumentClientLike;
23
+ tables?: DynamoDbTableMap<TSchema>;
24
+ };
25
+ type DynamoDbDriverHandle<TSchema extends SchemaDefinition<any>> = OrmDriverHandle<"dynamodb", DynamoDbDriverClient<TSchema>>;
26
+ declare function normalizeDynamoDbDocumentClient(client: DynamoDbBaseClientLike | DynamoDbDocumentClientLike, documentClient?: DynamoDbDocumentClientLike): DynamoDbBaseClientLike;
27
+ declare function createDynamodbDriver<TSchema extends SchemaDefinition<any>>(config: DynamoDbDriverConfig<TSchema>): OrmDriver<TSchema, DynamoDbDriverHandle<TSchema>>;
28
+
29
+ export { type DynamoDbBaseClientLike, type DynamoDbDocumentClientLike, type DynamoDbDriverClient, type DynamoDbDriverConfig, type DynamoDbDriverHandle, type DynamoDbFieldTransform, type DynamoDbTableMap, createDynamodbDriver, normalizeDynamoDbDocumentClient };