@tanstack/db-sqlite-persistence-core 0.2.23 → 0.4.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.
- package/README.md +258 -7
- package/dist/cjs/broadcast-coordinator.cjs +1689 -0
- package/dist/cjs/broadcast-coordinator.cjs.map +1 -0
- package/dist/cjs/broadcast-coordinator.d.cts +116 -0
- package/dist/cjs/errors.cjs +73 -0
- package/dist/cjs/errors.cjs.map +1 -1
- package/dist/cjs/errors.d.cts +44 -0
- package/dist/cjs/index.cjs +19 -0
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +2 -0
- package/dist/cjs/persisted.cjs +1782 -394
- package/dist/cjs/persisted.cjs.map +1 -1
- package/dist/cjs/persisted.d.cts +176 -11
- package/dist/cjs/remote-subset-owner.cjs +20 -0
- package/dist/cjs/remote-subset-owner.cjs.map +1 -0
- package/dist/cjs/remote-subset-owner.d.cts +7 -0
- package/dist/cjs/remote-subset-wire.cjs +681 -0
- package/dist/cjs/remote-subset-wire.cjs.map +1 -0
- package/dist/cjs/remote-subset-wire.d.cts +59 -0
- package/dist/cjs/sqlite-core-adapter.cjs +969 -364
- package/dist/cjs/sqlite-core-adapter.cjs.map +1 -1
- package/dist/cjs/sqlite-core-adapter.d.cts +45 -1
- package/dist/cjs/sqlite-value.cjs +31 -0
- package/dist/cjs/sqlite-value.cjs.map +1 -0
- package/dist/cjs/sqlite-value.d.cts +10 -0
- package/dist/esm/broadcast-coordinator.d.ts +116 -0
- package/dist/esm/broadcast-coordinator.js +1689 -0
- package/dist/esm/broadcast-coordinator.js.map +1 -0
- package/dist/esm/errors.d.ts +44 -0
- package/dist/esm/errors.js +74 -1
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +21 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/persisted.d.ts +176 -11
- package/dist/esm/persisted.js +1784 -396
- package/dist/esm/persisted.js.map +1 -1
- package/dist/esm/remote-subset-owner.d.ts +7 -0
- package/dist/esm/remote-subset-owner.js +20 -0
- package/dist/esm/remote-subset-owner.js.map +1 -0
- package/dist/esm/remote-subset-wire.d.ts +59 -0
- package/dist/esm/remote-subset-wire.js +681 -0
- package/dist/esm/remote-subset-wire.js.map +1 -0
- package/dist/esm/sqlite-core-adapter.d.ts +45 -1
- package/dist/esm/sqlite-core-adapter.js +955 -350
- package/dist/esm/sqlite-core-adapter.js.map +1 -1
- package/dist/esm/sqlite-value.d.ts +10 -0
- package/dist/esm/sqlite-value.js +31 -0
- package/dist/esm/sqlite-value.js.map +1 -0
- package/package.json +12 -2
- package/src/broadcast-coordinator.ts +2456 -0
- package/src/errors.ts +120 -0
- package/src/index.ts +2 -0
- package/src/persisted.ts +2617 -442
- package/src/remote-subset-owner.ts +36 -0
- package/src/remote-subset-wire.ts +946 -0
- package/src/sqlite-core-adapter.ts +1297 -410
- package/src/sqlite-value.ts +30 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persisted.cjs","sources":["../../src/persisted.ts"],"sourcesContent":["import {\n SyncTransactionAbortedError,\n compileSingleRowExpression,\n safeRandomUUID,\n toBooleanPredicate,\n withCollectionConfigFactory,\n} from '@tanstack/db'\nimport {\n InvalidPersistedCollectionConfigError,\n InvalidPersistedCollectionCoordinatorError,\n InvalidPersistedStorageKeyEncodingError,\n InvalidPersistedStorageKeyError,\n InvalidPersistenceAdapterError,\n InvalidSyncConfigError,\n} from './errors'\nimport type { StandardSchemaV1 } from '@standard-schema/spec'\nimport type {\n ChangeMessageOrDeleteKeyMessage,\n Collection,\n CollectionConfig,\n CollectionIndexMetadata,\n DeleteMutationFnParams,\n InsertMutationFnParams,\n LoadSubsetFn,\n LoadSubsetOptions,\n PendingMutation,\n SyncAppliedReceipt,\n SyncConfig,\n SyncConfigRes,\n SyncMetadataApi,\n UpdateMutationFnParams,\n UtilsRecord,\n} from '@tanstack/db'\n\nexport type PersistedMutationEnvelope =\n | {\n mutationId: string\n type: `insert`\n key: string | number\n value: Record<string, unknown>\n }\n | {\n mutationId: string\n type: `update`\n key: string | number\n value: Record<string, unknown>\n }\n | {\n mutationId: string\n type: `delete`\n key: string | number\n value: Record<string, unknown>\n }\n\nexport type ProtocolEnvelope<TPayload> = {\n v: 1\n dbName: string\n collectionId: string\n senderId: string\n ts: number\n payload: TPayload\n}\n\nexport type LeaderHeartbeat = {\n type: `leader:heartbeat`\n term: number\n leaderId: string\n latestSeq: number\n latestRowVersion: number\n}\n\nexport type TxCommitted = {\n type: `tx:committed`\n term: number\n seq: number\n txId: string\n latestRowVersion: number\n} & (\n | {\n requiresFullReload: true\n }\n | {\n requiresFullReload: false\n changedRows: Array<{\n key: string | number\n value: Record<string, unknown>\n }>\n deletedKeys: Array<string | number>\n rowMetadataMutations?: Array<\n PersistedRowMetadataMutation<string | number>\n >\n collectionMetadataMutations?: Array<PersistedCollectionMetadataMutation>\n }\n)\n\nexport type EnsureRemoteSubsetRequest = {\n type: `rpc:ensureRemoteSubset:req`\n rpcId: string\n options: LoadSubsetOptions\n}\n\nexport type EnsureRemoteSubsetResponse =\n | {\n type: `rpc:ensureRemoteSubset:res`\n rpcId: string\n ok: true\n }\n | {\n type: `rpc:ensureRemoteSubset:res`\n rpcId: string\n ok: false\n error: string\n }\n\nexport type ApplyLocalMutationsRequest = {\n type: `rpc:applyLocalMutations:req`\n rpcId: string\n envelopeId: string\n mutations: Array<PersistedMutationEnvelope>\n}\n\nexport type ApplyLocalMutationsResponse =\n | {\n type: `rpc:applyLocalMutations:res`\n rpcId: string\n ok: true\n term: number\n seq: number\n latestRowVersion: number\n acceptedMutationIds: Array<string>\n }\n | {\n type: `rpc:applyLocalMutations:res`\n rpcId: string\n ok: false\n code: `NOT_LEADER` | `VALIDATION_ERROR` | `CONFLICT` | `TIMEOUT`\n error: string\n }\n\nexport type PullSinceRequest = {\n type: `rpc:pullSince:req`\n rpcId: string\n fromRowVersion: number\n}\n\nexport type PullSinceResponse =\n | {\n type: `rpc:pullSince:res`\n rpcId: string\n ok: true\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n requiresFullReload: true\n }\n | {\n type: `rpc:pullSince:res`\n rpcId: string\n ok: true\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n requiresFullReload: false\n changedKeys: Array<string | number>\n deletedKeys: Array<string | number>\n deltas?: Array<\n ReplayableTxDelta<Record<string, unknown>, string | number>\n >\n }\n | {\n type: `rpc:pullSince:res`\n rpcId: string\n ok: false\n error: string\n }\n\nexport type CollectionReset = {\n type: `collection:reset`\n schemaVersion: number\n resetEpoch: number\n}\n\nexport interface PersistedIndexSpec {\n readonly expressionSql: ReadonlyArray<string>\n readonly whereSql?: string\n readonly metadata?: Readonly<Record<string, unknown>>\n}\n\nexport type PersistedRowMetadataMutation<\n TKey extends string | number = string | number,\n> = { type: `set`; key: TKey; value: unknown } | { type: `delete`; key: TKey }\n\nexport type PersistedCollectionMetadataMutation =\n | { type: `set`; key: string; value: unknown }\n | { type: `delete`; key: string }\n\nexport type ReplayableTxDelta<\n T extends Record<string, unknown> = Record<string, unknown>,\n TKey extends string | number = string | number,\n> = {\n txId: string\n latestRowVersion: number\n changedRows: Array<{ key: TKey; value: T }>\n deletedKeys: Array<TKey>\n rowMetadataMutations: Array<PersistedRowMetadataMutation<TKey>>\n collectionMetadataMutations: Array<PersistedCollectionMetadataMutation>\n}\n\nexport type PersistedScannedRow<\n T extends object = Record<string, unknown>,\n TKey extends string | number = string | number,\n> = {\n key: TKey\n value: T\n metadata?: unknown\n}\n\nexport type PersistedRowScanOptions = {\n metadataOnly?: boolean\n}\n\nexport type PersistedTx<\n T extends object = Record<string, unknown>,\n TKey extends string | number = string | number,\n> = {\n txId: string\n term: number\n seq: number\n rowVersion: number\n truncate?: boolean\n mutations: Array<\n | {\n type: `insert`\n key: TKey\n value: T\n metadata?: unknown\n metadataChanged?: boolean\n }\n | {\n type: `update`\n key: TKey\n value: T\n metadata?: unknown\n metadataChanged?: boolean\n }\n | { type: `delete`; key: TKey; value: T }\n >\n rowMetadataMutations?: Array<PersistedRowMetadataMutation<TKey>>\n collectionMetadataMutations?: Array<PersistedCollectionMetadataMutation>\n}\n\nexport interface PersistenceAdapter {\n loadSubset: (\n collectionId: string,\n options: LoadSubsetOptions,\n ctx?: { requiredIndexSignatures?: ReadonlyArray<string> },\n ) => Promise<\n Array<{\n key: string | number\n value: Record<string, unknown>\n metadata?: unknown\n }>\n >\n applyCommittedTx: (collectionId: string, tx: PersistedTx) => Promise<void>\n loadCollectionMetadata?: (\n collectionId: string,\n ) => Promise<Array<{ key: string; value: unknown }>>\n scanRows?: (\n collectionId: string,\n options?: PersistedRowScanOptions,\n ) => Promise<Array<PersistedScannedRow>>\n ensureIndex: (\n collectionId: string,\n signature: string,\n spec: PersistedIndexSpec,\n ) => Promise<void>\n markIndexRemoved?: (collectionId: string, signature: string) => Promise<void>\n getStreamPosition?: (collectionId: string) => Promise<{\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n }>\n}\n\nexport interface SQLiteDriver {\n exec: (sql: string) => Promise<void>\n query: <T>(\n sql: string,\n params?: ReadonlyArray<unknown>,\n ) => Promise<ReadonlyArray<T>>\n run: (sql: string, params?: ReadonlyArray<unknown>) => Promise<void>\n transaction: <T>(\n fn: (transactionDriver: SQLiteDriver) => Promise<T>,\n ) => Promise<T>\n transactionWithDriver?: <T>(\n fn: (transactionDriver: SQLiteDriver) => Promise<T>,\n ) => Promise<T>\n}\n\nexport interface PersistedCollectionCoordinator {\n getNodeId: () => string\n subscribe: (\n collectionId: string,\n onMessage: (message: ProtocolEnvelope<unknown>) => void,\n ) => () => void\n publish: (collectionId: string, message: ProtocolEnvelope<unknown>) => void\n isLeader: (collectionId: string) => boolean\n ensureLeadership: (collectionId: string) => Promise<void>\n requestEnsureRemoteSubset?: (\n collectionId: string,\n options: LoadSubsetOptions,\n ) => Promise<void>\n requestEnsurePersistedIndex: (\n collectionId: string,\n signature: string,\n spec: PersistedIndexSpec,\n ) => Promise<void>\n requestApplyLocalMutations?: (\n collectionId: string,\n mutations: Array<PersistedMutationEnvelope>,\n ) => Promise<ApplyLocalMutationsResponse>\n pullSince?: (\n collectionId: string,\n fromRowVersion: number,\n ) => Promise<PullSinceResponse>\n}\n\nexport interface PersistedCollectionPersistence {\n adapter: PersistenceAdapter\n coordinator?: PersistedCollectionCoordinator\n resolvePersistenceForCollection?: (options: {\n collectionId: string\n mode: PersistedCollectionMode\n schemaVersion?: number\n }) => PersistedCollectionPersistence\n resolvePersistenceForMode?: (\n mode: PersistedCollectionMode,\n ) => PersistedCollectionPersistence\n}\n\ntype PersistedResolvedPersistence = PersistedCollectionPersistence & {\n coordinator: PersistedCollectionCoordinator\n}\n\nexport type PersistedCollectionLeadershipState = {\n nodeId: string\n isLeader: boolean\n}\n\nexport interface PersistedCollectionUtils extends UtilsRecord {\n acceptMutations: (transaction: {\n mutations: Array<PendingMutation<Record<string, unknown>>>\n }) => Promise<void> | void\n getLeadershipState?: () => PersistedCollectionLeadershipState\n /** Hydrate once without acquiring a new ongoing subset lease. */\n forceReloadSubset?: (options: LoadSubsetOptions) => Promise<void> | void\n}\n\nexport type PersistedSyncWrappedOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1 = never,\n TUtils extends UtilsRecord = UtilsRecord,\n> = CollectionConfig<T, TKey, TSchema, TUtils> & {\n sync: SyncConfig<T, TKey>\n persistence: PersistedCollectionPersistence\n schemaVersion?: number\n}\n\nexport type PersistedLocalOnlyOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1 = never,\n TUtils extends UtilsRecord = UtilsRecord,\n> = Omit<CollectionConfig<T, TKey, TSchema, TUtils>, `sync`> & {\n persistence: PersistedCollectionPersistence\n schemaVersion?: number\n}\n\ntype PersistedSyncOptionsResult<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n TUtils extends UtilsRecord,\n> = CollectionConfig<T, TKey, TSchema, TUtils> & {\n persistence: PersistedResolvedPersistence\n}\n\ntype PersistedLocalOnlyOptionsResult<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n TUtils extends UtilsRecord,\n> = CollectionConfig<T, TKey, TSchema, TUtils & PersistedCollectionUtils> & {\n id: string\n persistence: PersistedResolvedPersistence\n utils: TUtils & PersistedCollectionUtils\n}\n\nconst REQUIRED_COORDINATOR_METHODS: ReadonlyArray<\n keyof Pick<\n PersistedCollectionCoordinator,\n | `getNodeId`\n | `subscribe`\n | `publish`\n | `isLeader`\n | `ensureLeadership`\n | `requestEnsurePersistedIndex`\n >\n> = [\n `getNodeId`,\n `subscribe`,\n `publish`,\n `isLeader`,\n `ensureLeadership`,\n `requestEnsurePersistedIndex`,\n]\n\nconst REQUIRED_ADAPTER_METHODS: ReadonlyArray<\n keyof Pick<\n PersistenceAdapter,\n `loadSubset` | `applyCommittedTx` | `ensureIndex`\n >\n> = [`loadSubset`, `applyCommittedTx`, `ensureIndex`]\n\nconst TARGETED_INVALIDATION_KEY_LIMIT = 128\nconst DEFAULT_DB_NAME = `tanstack-db`\nconst REMOTE_ENSURE_RETRY_DELAY_MS = 50\n\ntype SyncControlFns<T extends object, TKey extends string | number> = {\n begin: ((options?: { immediate?: boolean }) => void) | null\n write:\n | ((\n message:\n | { type: `insert`; value: T; metadata?: Record<string, unknown> }\n | { type: `update`; value: T; metadata?: Record<string, unknown> }\n | { type: `delete`; key: TKey },\n ) => void)\n | null\n commit: ((signal?: AbortSignal) => SyncAppliedReceipt) | null\n truncate: (() => void) | null\n metadata: SyncMetadataApi<TKey> | null\n}\n\n/**\n * Phase-0 coordinator implementation for single-process runtimes.\n * It satisfies the coordinator contract without cross-process transport.\n */\nexport class SingleProcessCoordinator implements PersistedCollectionCoordinator {\n private readonly nodeId: string\n\n constructor(nodeId: string = safeRandomUUID()) {\n this.nodeId = nodeId\n }\n\n public getNodeId(): string {\n return this.nodeId\n }\n\n public subscribe(): () => void {\n return () => {}\n }\n\n public publish(): void {}\n\n public isLeader(): boolean {\n return true\n }\n\n public async ensureLeadership(): Promise<void> {}\n\n public async requestEnsureRemoteSubset(): Promise<void> {}\n\n public async requestEnsurePersistedIndex(): Promise<void> {}\n\n public pullSince(): Promise<PullSinceResponse> {\n return Promise.resolve({\n type: `rpc:pullSince:res`,\n rpcId: safeRandomUUID(),\n ok: true,\n latestTerm: 1,\n latestSeq: 0,\n latestRowVersion: 0,\n requiresFullReload: false,\n changedKeys: [],\n deletedKeys: [],\n deltas: [],\n })\n }\n}\n\nexport function validatePersistedCollectionCoordinator(\n coordinator: PersistedCollectionCoordinator,\n): void {\n for (const method of REQUIRED_COORDINATOR_METHODS) {\n if (typeof coordinator[method] !== `function`) {\n throw new InvalidPersistedCollectionCoordinatorError(method)\n }\n }\n}\n\nfunction validatePersistenceAdapter(adapter: PersistenceAdapter): void {\n for (const method of REQUIRED_ADAPTER_METHODS) {\n if (typeof adapter[method] !== `function`) {\n throw new InvalidPersistenceAdapterError(method)\n }\n }\n}\n\nfunction resolvePersistence(\n persistence: PersistedCollectionPersistence,\n): PersistedResolvedPersistence {\n validatePersistenceAdapter(persistence.adapter)\n\n const coordinator = persistence.coordinator ?? new SingleProcessCoordinator()\n validatePersistedCollectionCoordinator(coordinator)\n\n return {\n ...persistence,\n coordinator,\n }\n}\n\nfunction resolvePersistenceForMode(\n persistence: PersistedCollectionPersistence,\n mode: PersistedCollectionMode,\n): PersistedResolvedPersistence {\n const modeSpecificPersistence = persistence.resolvePersistenceForMode?.(mode)\n return resolvePersistence(modeSpecificPersistence ?? persistence)\n}\n\nfunction resolvePersistenceForCollection(\n persistence: PersistedCollectionPersistence,\n options: {\n collectionId: string\n mode: PersistedCollectionMode\n schemaVersion?: number\n },\n): PersistedResolvedPersistence {\n const collectionSpecificPersistence =\n persistence.resolvePersistenceForCollection?.(options)\n if (collectionSpecificPersistence) {\n return resolvePersistence(collectionSpecificPersistence)\n }\n\n return resolvePersistenceForMode(persistence, options.mode)\n}\n\nfunction hasOwnSyncKey(options: object): options is { sync: unknown } {\n return Object.prototype.hasOwnProperty.call(options, `sync`)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === `object` && value !== null\n}\n\nfunction isValidSyncConfig(value: unknown): value is SyncConfig<object> {\n if (!isRecord(value)) {\n return false\n }\n\n return typeof value.sync === `function`\n}\n\nexport type PersistedCollectionMode = `sync-present` | `sync-absent`\ntype PersistedMode = PersistedCollectionMode\n\ntype NormalizedSyncOperation<T extends object, TKey extends string | number> =\n | {\n type: `update`\n key: TKey\n value: T\n metadata?: Record<string, unknown>\n }\n | {\n type: `delete`\n key: TKey\n value: T\n }\n\ntype BufferedSyncTransaction<T extends object, TKey extends string | number> = {\n operations: Array<NormalizedSyncOperation<T, TKey>>\n rowMetadataWrites: Map<\n TKey,\n { type: `set`; value: unknown } | { type: `delete` }\n >\n collectionMetadataWrites: Map<\n string,\n { type: `set`; value: unknown } | { type: `delete` }\n >\n truncate: boolean\n internal: boolean\n signal?: AbortSignal\n resolveApplied?: () => void\n rejectApplied?: (error: unknown) => void\n}\n\ntype OpenSyncTransaction<\n T extends object,\n TKey extends string | number,\n> = BufferedSyncTransaction<T, TKey> & {\n queuedBecauseHydrating: boolean\n}\n\ntype SyncWriteNormalization<T extends object, TKey extends string | number> = {\n forwardMessage:\n | {\n type: `update`\n value: T\n metadata?: Record<string, unknown>\n }\n | {\n type: `delete`\n key: TKey\n }\n operation: NormalizedSyncOperation<T, TKey>\n}\n\nclass ApplyMutex {\n private queue: Promise<void> = Promise.resolve()\n\n async run<T>(task: () => Promise<T>): Promise<T> {\n const taskPromise = this.queue.then(() => task())\n this.queue = taskPromise.then(\n () => undefined,\n () => undefined,\n )\n return taskPromise\n }\n}\n\nfunction toStableSerializable(value: unknown): unknown {\n if (value == null) {\n return value\n }\n\n switch (typeof value) {\n case `string`:\n case `number`:\n case `boolean`:\n return value\n case `bigint`:\n return value.toString()\n case `function`:\n case `symbol`:\n case `undefined`:\n return undefined\n }\n\n if (value instanceof Date) {\n return value.toISOString()\n }\n\n if (Array.isArray(value)) {\n return value\n .map((entry) => toStableSerializable(entry))\n .filter((entry) => entry !== undefined)\n }\n\n if (value instanceof Set) {\n return Array.from(value)\n .map((entry) => toStableSerializable(entry))\n .filter((entry) => entry !== undefined)\n .sort((left, right) => {\n const leftSerialized = JSON.stringify(left)\n const rightSerialized = JSON.stringify(right)\n return leftSerialized < rightSerialized\n ? -1\n : leftSerialized > rightSerialized\n ? 1\n : 0\n })\n }\n\n if (value instanceof Map) {\n return Array.from(value.entries())\n .map(([key, mapValue]) => ({\n key: toStableSerializable(key),\n value: toStableSerializable(mapValue),\n }))\n .filter((entry) => entry.key !== undefined && entry.value !== undefined)\n .sort((left, right) => {\n const leftSerialized = JSON.stringify(left.key)\n const rightSerialized = JSON.stringify(right.key)\n return leftSerialized < rightSerialized\n ? -1\n : leftSerialized > rightSerialized\n ? 1\n : 0\n })\n }\n\n const record = value as Record<string, unknown>\n const orderedKeys = Object.keys(record).sort((left, right) =>\n left < right ? -1 : left > right ? 1 : 0,\n )\n const serializableRecord: Record<string, unknown> = {}\n for (const key of orderedKeys) {\n const serializableValue = toStableSerializable(record[key])\n if (serializableValue !== undefined) {\n serializableRecord[key] = serializableValue\n }\n }\n return serializableRecord\n}\n\nfunction stableSerialize(value: unknown): string {\n return JSON.stringify(toStableSerializable(value) ?? null)\n}\n\nfunction normalizeSyncFnResult(result: void | (() => void) | SyncConfigRes) {\n if (typeof result === `function`) {\n return { cleanup: result } satisfies SyncConfigRes\n }\n\n if (result === undefined) {\n return {} satisfies SyncConfigRes\n }\n\n return result\n}\n\nfunction isTxCommittedPayload(payload: unknown): payload is TxCommitted {\n if (!isRecord(payload) || payload.type !== `tx:committed`) {\n return false\n }\n\n if (\n typeof payload.term !== `number` ||\n typeof payload.seq !== `number` ||\n typeof payload.txId !== `string` ||\n typeof payload.latestRowVersion !== `number` ||\n typeof payload.requiresFullReload !== `boolean`\n ) {\n return false\n }\n\n if (payload.requiresFullReload) {\n return true\n }\n\n return (\n Array.isArray(payload.changedRows) &&\n Array.isArray(payload.deletedKeys) &&\n (payload.rowMetadataMutations === undefined ||\n Array.isArray(payload.rowMetadataMutations)) &&\n (payload.collectionMetadataMutations === undefined ||\n Array.isArray(payload.collectionMetadataMutations))\n )\n}\n\nfunction isCollectionResetPayload(\n payload: unknown,\n): payload is CollectionReset {\n return (\n isRecord(payload) &&\n payload.type === `collection:reset` &&\n typeof payload.schemaVersion === `number` &&\n typeof payload.resetEpoch === `number`\n )\n}\n\nfunction toPersistedMutationEnvelope(\n mutation: PendingMutation<Record<string, unknown>>,\n): PersistedMutationEnvelope {\n const key = mutation.key as string | number\n const value =\n mutation.type === `delete`\n ? (mutation.original as Record<string, unknown>)\n : mutation.modified\n\n return {\n mutationId: mutation.mutationId,\n type: mutation.type,\n key,\n value,\n }\n}\n\nclass PersistedCollectionRuntime<\n T extends object,\n TKey extends string | number,\n> {\n private readonly applyMutex = new ApplyMutex()\n private readonly activeSubsets = new Map<string, LoadSubsetOptions>()\n private readonly pendingRemoteSubsetEnsures = new Map<\n string,\n LoadSubsetOptions\n >()\n private readonly queuedHydrationTransactions: Array<\n BufferedSyncTransaction<T, TKey>\n > = []\n private readonly queuedTxCommitted: Array<TxCommitted> = []\n private readonly requestIds = new WeakMap<LoadSubsetOptions, string>()\n\n private collection: Collection<T, TKey, PersistedCollectionUtils> | null =\n null\n private syncControls: SyncControlFns<T, TKey> = {\n begin: null,\n write: null,\n commit: null,\n truncate: null,\n metadata: null,\n }\n private started = false\n private startupMetadataPromise: Promise<void> | null = null\n private startPromise: Promise<void> | null = null\n private resumeBaselinePromise: Promise<void> | null = null\n private lifecycleGeneration = 0\n private internalApplyDepth = 0\n private appliedReceiptSequence = 0\n private readonly pendingAppliedReceipts = new Map<number, Promise<void>>()\n private hydratingGeneration: number | null = null\n private coordinatorUnsubscribe: (() => void) | null = null\n private indexAddedUnsubscribe: (() => void) | null = null\n private indexRemovedUnsubscribe: (() => void) | null = null\n private remoteEnsureRetryTimer: ReturnType<typeof setTimeout> | null = null\n private nextRequestId = 0\n\n private latestTerm = 0\n private latestSeq = 0\n private latestRowVersion = 0\n private localTerm = 1\n private localSeq = 0\n private localRowVersion = 0\n\n constructor(\n private readonly mode: PersistedMode,\n private readonly collectionId: string,\n private readonly persistence: PersistedResolvedPersistence,\n private readonly syncMode: `eager` | `on-demand`,\n private readonly dbName: string,\n ) {}\n\n setSyncControls(syncControls: SyncControlFns<T, TKey>): void {\n this.advanceLifecycle()\n\n const commit = syncControls.commit\n this.syncControls = {\n ...syncControls,\n commit: commit\n ? (signal) => this.trackAppliedReceipt(commit(signal))\n : null,\n }\n }\n\n private trackAppliedReceipt(receipt: SyncAppliedReceipt): SyncAppliedReceipt {\n const sequence = ++this.appliedReceiptSequence\n if (receipt === true) {\n return true\n }\n this.pendingAppliedReceipts.set(sequence, receipt)\n const removeReceipt = () => this.pendingAppliedReceipts.delete(sequence)\n void receipt.then(removeReceipt, removeReceipt)\n return receipt\n }\n\n private async waitForAppliedReceiptsAfter(cursor: number): Promise<void> {\n await Promise.all(\n Array.from(this.pendingAppliedReceipts, ([sequence, receipt]) =>\n sequence > cursor ? receipt : undefined,\n ),\n )\n }\n\n clearSyncControls(): void {\n this.syncControls = {\n begin: null,\n write: null,\n commit: null,\n truncate: null,\n metadata: null,\n }\n }\n\n isHydratingNow(): boolean {\n return this.hydratingGeneration === this.lifecycleGeneration\n }\n\n isApplyingInternally(): boolean {\n return this.internalApplyDepth > 0\n }\n\n setCollection(\n collection: Collection<T, TKey, PersistedCollectionUtils>,\n ): void {\n if (this.collection === collection) {\n return\n }\n\n this.collection = collection\n this.attachCoordinatorSubscription()\n }\n\n getLeadershipState(): PersistedCollectionLeadershipState {\n return {\n nodeId: this.persistence.coordinator.getNodeId(),\n isLeader: this.persistence.coordinator.isLeader(this.collectionId),\n }\n }\n\n async ensureStarted(): Promise<void> {\n if (this.startPromise) {\n return this.startPromise\n }\n\n const lifecycleGeneration = this.lifecycleGeneration\n this.startPromise = this.startInternal(lifecycleGeneration)\n return this.startPromise\n }\n\n ensureResumeBaselineHydrated(): Promise<void> {\n if (this.resumeBaselinePromise) {\n return this.resumeBaselinePromise\n }\n\n const lifecycleGeneration = this.lifecycleGeneration\n this.resumeBaselinePromise = (async () => {\n await this.ensureStarted()\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n if (this.syncMode !== `on-demand`) return\n\n await this.hydrateBaseline(lifecycleGeneration)\n })()\n return this.resumeBaselinePromise\n }\n\n private async hydrateBaseline(lifecycleGeneration: number): Promise<void> {\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n\n const baseline = {}\n this.activeSubsets.set(this.getSubsetKey(baseline), baseline)\n const appliedCursor = this.appliedReceiptSequence\n await this.applyMutex.run(async () => {\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n await this.hydrateSubsetUnsafe(baseline, {\n requestRemoteEnsure: false,\n lifecycleGeneration,\n })\n })\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n await this.waitForAppliedReceiptsAfter(appliedCursor)\n }\n\n async ensureStartupMetadataLoaded(): Promise<void> {\n if (this.startupMetadataPromise) {\n return this.startupMetadataPromise\n }\n\n const lifecycleGeneration = this.lifecycleGeneration\n this.startupMetadataPromise =\n this.loadStartupMetadataInternal(lifecycleGeneration)\n return this.startupMetadataPromise\n }\n\n private async startInternal(lifecycleGeneration: number): Promise<void> {\n if (this.started) {\n return\n }\n\n this.started = true\n\n await this.ensureStartupMetadataLoaded()\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n\n const indexBootstrapSnapshot = this.collection?.getIndexMetadata() ?? []\n this.attachIndexLifecycleListeners()\n await this.bootstrapPersistedIndexes(indexBootstrapSnapshot)\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n\n if (this.syncMode !== `on-demand`) {\n await this.hydrateBaseline(lifecycleGeneration)\n }\n }\n\n private async loadStartupMetadataInternal(\n lifecycleGeneration: number,\n ): Promise<void> {\n // Restore stream position from the database so that new mutations\n // don't collide with previously applied transactions.\n if (this.persistence.adapter.getStreamPosition) {\n const position = await this.persistence.adapter.getStreamPosition(\n this.collectionId,\n )\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n this.observeStreamPosition(\n position.latestTerm,\n position.latestSeq,\n position.latestRowVersion,\n )\n }\n\n const collectionMetadata = await this.loadCollectionMetadataSnapshot()\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n this.replaceCollectionMetadataSnapshot(collectionMetadata)\n }\n\n private async loadCollectionMetadataSnapshot(): Promise<\n Array<{ key: string; value: unknown }>\n > {\n if (!this.persistence.adapter.loadCollectionMetadata) {\n return []\n }\n\n return this.persistence.adapter.loadCollectionMetadata(this.collectionId)\n }\n\n private replaceCollectionMetadataSnapshot(\n collectionMetadata: Array<{ key: string; value: unknown }>,\n ): void {\n if (\n !this.syncControls.begin ||\n !this.syncControls.commit ||\n !this.syncControls.metadata\n ) {\n return\n }\n\n const nextMetadata = new Map(\n collectionMetadata.map(({ key, value }) => [key, value]),\n )\n const currentKeys = this.syncControls.metadata.collection\n .list()\n .map(({ key }) => key)\n\n this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n\n currentKeys.forEach((key) => {\n if (!nextMetadata.has(key)) {\n this.syncControls.metadata?.collection.delete(key)\n }\n })\n\n nextMetadata.forEach((value, key) => {\n this.syncControls.metadata?.collection.set(key, value)\n })\n\n this.syncControls.commit?.()\n })\n }\n\n async loadSubset(\n options: LoadSubsetOptions,\n upstreamLoadSubset?: LoadSubsetFn,\n ): Promise<void> {\n const lifecycleGeneration = this.lifecycleGeneration\n this.activeSubsets.set(this.getSubsetKey(options), options)\n\n const appliedCursor = this.appliedReceiptSequence\n await this.applyMutex.run(() =>\n this.hydrateSubsetUnsafe(options, {\n requestRemoteEnsure: this.mode === `sync-present`,\n lifecycleGeneration,\n }),\n )\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n await this.waitForAppliedReceiptsAfter(appliedCursor)\n\n if (upstreamLoadSubset) {\n try {\n await upstreamLoadSubset(options)\n } catch (error) {\n if (\n options.signal?.aborted ||\n (typeof error === `object` &&\n error !== null &&\n `name` in error &&\n error.name === `AbortError`)\n ) {\n this.pendingRemoteSubsetEnsures.delete(this.getSubsetKey(options))\n throw error\n }\n console.warn(`Failed to trigger remote subset load:`, error)\n this.queueRemoteSubsetEnsure(options)\n // Hydration remains readable, but it does not satisfy remote demand.\n throw error\n }\n }\n }\n\n unloadSubset(\n options: LoadSubsetOptions,\n upstreamUnloadSubset?: (options: LoadSubsetOptions) => void,\n ): void {\n this.activeSubsets.delete(this.getSubsetKey(options))\n this.pendingRemoteSubsetEnsures.delete(this.getSubsetKey(options))\n upstreamUnloadSubset?.(options)\n }\n\n async forceReloadSubset(options: LoadSubsetOptions): Promise<void> {\n const lifecycleGeneration = this.lifecycleGeneration\n // A one-shot refresh does not acquire an enduring subscription lease.\n await this.applyMutex.run(() =>\n this.hydrateSubsetUnsafe(options, {\n requestRemoteEnsure: false,\n lifecycleGeneration,\n }),\n )\n }\n\n queueHydrationBufferedTransaction(\n transaction: BufferedSyncTransaction<T, TKey>,\n ): void {\n this.queuedHydrationTransactions.push(transaction)\n }\n\n async persistAndBroadcastExternalSyncTransaction(\n transaction: BufferedSyncTransaction<T, TKey>,\n ): Promise<void> {\n await this.applyMutex.run(() =>\n this.persistAndBroadcastExternalSyncTransactionUnsafe(transaction),\n )\n }\n\n normalizeSyncWriteMessage(\n message: ChangeMessageOrDeleteKeyMessage<T, TKey>,\n ): SyncWriteNormalization<T, TKey> {\n if (!this.collection) {\n throw new InvalidPersistedCollectionConfigError(\n `collection must be attached before sync writes are processed`,\n )\n }\n\n if (`key` in message) {\n const key = message.key\n const previousValue = this.collection.get(key) ?? ({} as T)\n\n return {\n forwardMessage: {\n type: `delete`,\n key,\n },\n operation: {\n type: `delete`,\n key,\n value: previousValue,\n },\n }\n }\n\n // Handle delete messages that include the full value instead of just a key\n // (e.g. from queryCollectionOptions which sends { type: 'delete', value: oldItem })\n if (message.type === `delete`) {\n const key = this.collection.getKeyFromItem(message.value)\n const previousValue = this.collection.get(key) ?? message.value\n\n return {\n forwardMessage: {\n type: `delete`,\n key,\n },\n operation: {\n type: `delete`,\n key,\n value: previousValue,\n },\n }\n }\n\n const key = this.collection.getKeyFromItem(message.value)\n return {\n forwardMessage: {\n type: `update`,\n value: message.value,\n metadata: message.metadata,\n },\n operation: {\n type: `update`,\n key,\n value: message.value,\n metadata: message.metadata,\n },\n }\n }\n\n async persistAndConfirmCollectionMutations(\n mutations: Array<PendingMutation<T>>,\n ): Promise<void> {\n if (mutations.length === 0) {\n return\n }\n\n await this.applyMutex.run(async () => {\n const acceptedMutationIds =\n await this.persistCollectionMutationsUnsafe(mutations)\n const acceptedMutationIdSet = new Set(acceptedMutationIds)\n const acceptedMutations = mutations.filter((mutation) =>\n acceptedMutationIdSet.has(mutation.mutationId),\n )\n\n if (acceptedMutations.length !== mutations.length) {\n throw new Error(\n `persistence coordinator accepted ${acceptedMutations.length} of ${mutations.length} mutations; partial acceptance is not supported`,\n )\n }\n\n this.confirmMutationsSyncUnsafe(acceptedMutations)\n })\n }\n\n async acceptTransactionMutations(transaction: {\n mutations: Array<PendingMutation<Record<string, unknown>>>\n }): Promise<void> {\n const collectionMutations = this.filterMutationsForCollection(\n transaction.mutations,\n )\n\n if (collectionMutations.length === 0) {\n return\n }\n\n await this.persistAndConfirmCollectionMutations(collectionMutations)\n }\n\n cleanup(): void {\n this.advanceLifecycle()\n\n this.coordinatorUnsubscribe?.()\n this.coordinatorUnsubscribe = null\n\n this.indexAddedUnsubscribe?.()\n this.indexAddedUnsubscribe = null\n\n this.indexRemovedUnsubscribe?.()\n this.indexRemovedUnsubscribe = null\n\n if (this.remoteEnsureRetryTimer !== null) {\n clearTimeout(this.remoteEnsureRetryTimer)\n this.remoteEnsureRetryTimer = null\n }\n\n this.pendingRemoteSubsetEnsures.clear()\n this.activeSubsets.clear()\n for (const transaction of this.queuedHydrationTransactions) {\n transaction.rejectApplied?.(new SyncTransactionAbortedError())\n }\n this.queuedHydrationTransactions.length = 0\n this.queuedTxCommitted.length = 0\n this.clearSyncControls()\n this.collection = null\n }\n\n private advanceLifecycle(): void {\n this.lifecycleGeneration++\n this.started = false\n this.startupMetadataPromise = null\n this.startPromise = null\n this.resumeBaselinePromise = null\n }\n\n private withInternalApply<TResult>(task: () => TResult): TResult {\n this.internalApplyDepth++\n try {\n return task()\n } finally {\n this.internalApplyDepth--\n }\n }\n\n private getRequiredIndexSignatures(): ReadonlyArray<string> {\n if (!this.collection) {\n return []\n }\n\n return this.collection\n .getIndexMetadata()\n .map((metadata) => metadata.signature)\n }\n\n private loadSubsetRowsUnsafe(\n options: LoadSubsetOptions,\n ): Promise<Array<{ key: TKey; value: T; metadata?: unknown }>> {\n return this.persistence.adapter.loadSubset(this.collectionId, options, {\n requiredIndexSignatures: this.getRequiredIndexSignatures(),\n }) as Promise<Array<{ key: TKey; value: T; metadata?: unknown }>>\n }\n\n private async scanPersistedRowsUnsafe(\n options?: PersistedRowScanOptions,\n ): Promise<Array<PersistedScannedRow<T, TKey>>> {\n if (!this.persistence.adapter.scanRows) {\n return []\n }\n\n return this.persistence.adapter.scanRows(\n this.collectionId,\n options,\n ) as Promise<Array<PersistedScannedRow<T, TKey>>>\n }\n\n async scanPersistedRows(\n options?: PersistedRowScanOptions,\n ): Promise<Array<PersistedScannedRow<T, TKey>>> {\n return this.applyMutex.run(() => this.scanPersistedRowsUnsafe(options))\n }\n\n private async hydrateSubsetUnsafe(\n options: LoadSubsetOptions,\n config: {\n requestRemoteEnsure: boolean\n lifecycleGeneration: number\n },\n ): Promise<void> {\n this.hydratingGeneration = config.lifecycleGeneration\n try {\n const rows = await this.loadSubsetRowsUnsafe(options)\n if (config.lifecycleGeneration !== this.lifecycleGeneration) return\n\n this.applyRowsToCollection(rows)\n } finally {\n if (this.hydratingGeneration === config.lifecycleGeneration) {\n this.hydratingGeneration = null\n }\n }\n\n await this.flushQueuedHydrationTransactionsUnsafe()\n await this.flushQueuedTxCommittedUnsafe()\n\n if (config.requestRemoteEnsure) {\n this.queueRemoteSubsetEnsure(options)\n }\n }\n\n private applyRowsToCollection(\n rows: Array<{ key: TKey; value: T; metadata?: unknown }>,\n ): void {\n if (\n !this.syncControls.begin ||\n !this.syncControls.write ||\n !this.syncControls.commit\n ) {\n return\n }\n\n this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n\n for (const row of rows) {\n if (this.collection?._hasHydratedKey(row.key)) {\n continue\n }\n this.syncControls.write?.({\n type: `update`,\n value: row.value,\n metadata: row.metadata as Record<string, unknown> | undefined,\n })\n }\n\n this.syncControls.commit?.()\n })\n }\n\n private replaceCollectionSnapshot(\n rows: Array<{ key: TKey; value: T; metadata?: unknown }>,\n collectionMetadata: Array<{ key: string; value: unknown }>,\n ): void {\n if (\n !this.syncControls.begin ||\n !this.syncControls.write ||\n !this.syncControls.commit ||\n !this.syncControls.metadata\n ) {\n return\n }\n\n const nextMetadata = new Map(\n collectionMetadata.map(({ key, value }) => [key, value]),\n )\n const currentKeys = this.syncControls.metadata.collection\n .list()\n .map(({ key }) => key)\n\n this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n this.syncControls.truncate?.()\n\n for (const row of rows) {\n this.syncControls.write?.({\n type: `update`,\n value: row.value,\n metadata: row.metadata as Record<string, unknown> | undefined,\n })\n }\n\n currentKeys.forEach((key) => {\n if (!nextMetadata.has(key)) {\n this.syncControls.metadata?.collection.delete(key)\n }\n })\n\n nextMetadata.forEach((value, key) => {\n this.syncControls.metadata?.collection.set(key, value)\n })\n\n this.syncControls.commit?.()\n })\n }\n\n private async flushQueuedHydrationTransactionsUnsafe(): Promise<void> {\n while (this.queuedHydrationTransactions.length > 0) {\n const transaction = this.queuedHydrationTransactions.shift()\n if (!transaction) {\n continue\n }\n try {\n await this.applyBufferedSyncTransactionUnsafe(transaction)\n } catch (error) {\n transaction.rejectApplied?.(error)\n for (const abandoned of this.queuedHydrationTransactions) {\n abandoned.rejectApplied?.(error)\n }\n this.queuedHydrationTransactions.length = 0\n throw error\n }\n }\n }\n\n private async applyBufferedSyncTransactionUnsafe(\n transaction: BufferedSyncTransaction<T, TKey>,\n ): Promise<void> {\n if (transaction.signal?.aborted) {\n transaction.rejectApplied?.(new SyncTransactionAbortedError())\n return\n }\n\n const { begin, write, commit, truncate, metadata } = this.syncControls\n if (!begin || !write || !commit) {\n transaction.rejectApplied?.(new SyncTransactionAbortedError())\n return\n }\n\n const applyToCollection = (): SyncAppliedReceipt => {\n begin()\n\n if (transaction.truncate) {\n truncate?.()\n }\n\n for (const operation of transaction.operations) {\n if (operation.type === `delete`) {\n write({\n type: `delete`,\n key: operation.key,\n })\n } else {\n write({\n type: `update`,\n value: operation.value,\n metadata: operation.metadata,\n })\n }\n }\n\n for (const [key, metadataWrite] of transaction.rowMetadataWrites) {\n if (metadataWrite.type === `delete`) {\n metadata?.row.delete(key)\n } else {\n metadata?.row.set(key, metadataWrite.value)\n }\n }\n\n for (const [key, metadataWrite] of transaction.collectionMetadataWrites) {\n if (metadataWrite.type === `delete`) {\n metadata?.collection.delete(key)\n } else {\n metadata?.collection.set(key, metadataWrite.value)\n }\n }\n\n return commit(transaction.signal)\n }\n\n try {\n const applied = transaction.internal\n ? this.withInternalApply(applyToCollection)\n : applyToCollection()\n if (applied !== true) {\n await applied\n }\n\n if (!transaction.internal) {\n await this.persistAndBroadcastExternalSyncTransactionUnsafe(transaction)\n }\n transaction.resolveApplied?.()\n } catch (error) {\n transaction.rejectApplied?.(error)\n throw error\n }\n }\n\n private async persistAndBroadcastExternalSyncTransactionUnsafe(\n transaction: BufferedSyncTransaction<T, TKey>,\n ): Promise<void> {\n if (transaction.internal) {\n return\n }\n\n const streamPosition = this.nextLocalStreamPosition()\n\n if (\n !transaction.truncate &&\n transaction.operations.length === 0 &&\n transaction.rowMetadataWrites.size === 0 &&\n transaction.collectionMetadataWrites.size === 0\n ) {\n this.publishTxCommittedEvent(\n this.createTxCommittedPayload({\n term: streamPosition.term,\n seq: streamPosition.seq,\n txId: safeRandomUUID(),\n latestRowVersion: streamPosition.rowVersion,\n changedRows: [],\n deletedKeys: [],\n requiresFullReload: true,\n }),\n )\n return\n }\n\n const tx = this.createPersistedTxFromOperations(transaction, streamPosition)\n\n await this.persistence.adapter.applyCommittedTx(this.collectionId, tx)\n this.publishTxCommittedEvent(\n this.createTxCommittedPayload({\n term: tx.term,\n seq: tx.seq,\n txId: tx.txId,\n latestRowVersion: tx.rowVersion,\n requiresFullReload: transaction.truncate,\n changedRows: transaction.operations\n .filter((operation) => operation.type === `update`)\n .map((operation) => ({\n key: operation.key,\n value: operation.value as Record<string, unknown>,\n })),\n deletedKeys: transaction.operations\n .filter((operation) => operation.type === `delete`)\n .map((operation) => operation.key),\n rowMetadataMutations: tx.rowMetadataMutations,\n collectionMetadataMutations: tx.collectionMetadataMutations,\n }),\n )\n }\n\n private createPersistedTxFromOperations(\n transaction: BufferedSyncTransaction<T, TKey>,\n streamPosition: { term: number; seq: number; rowVersion: number },\n ): PersistedTx {\n return {\n txId: safeRandomUUID(),\n term: streamPosition.term,\n seq: streamPosition.seq,\n rowVersion: streamPosition.rowVersion,\n truncate: transaction.truncate,\n mutations: transaction.operations.map((operation) =>\n operation.type === `update`\n ? {\n type: `update` as const,\n key: operation.key,\n value: operation.value as Record<string, unknown>,\n }\n : {\n type: `delete` as const,\n key: operation.key,\n value: operation.value as Record<string, unknown>,\n },\n ),\n rowMetadataMutations: Array.from(\n transaction.rowMetadataWrites.entries(),\n ).map(([key, metadataWrite]) =>\n metadataWrite.type === `delete`\n ? { type: `delete` as const, key: key }\n : {\n type: `set` as const,\n key: key,\n value: metadataWrite.value,\n },\n ),\n collectionMetadataMutations: Array.from(\n transaction.collectionMetadataWrites.entries(),\n ).map(([key, metadataWrite]) =>\n metadataWrite.type === `delete`\n ? { type: `delete`, key }\n : { type: `set`, key, value: metadataWrite.value },\n ),\n }\n }\n\n private createPersistedTxFromMutations(\n mutations: Array<PendingMutation<T>>,\n streamPosition: { term: number; seq: number; rowVersion: number },\n ): PersistedTx {\n return {\n txId: safeRandomUUID(),\n term: streamPosition.term,\n seq: streamPosition.seq,\n rowVersion: streamPosition.rowVersion,\n mutations: mutations.map((mutation) => {\n if (mutation.type === `delete`) {\n return {\n type: `delete` as const,\n key: mutation.key as string | number,\n value: mutation.original as Record<string, unknown>,\n }\n }\n\n if (mutation.type === `insert`) {\n return {\n type: `insert` as const,\n key: mutation.key as string | number,\n value: mutation.modified as Record<string, unknown>,\n }\n }\n\n return {\n type: `update` as const,\n key: mutation.key as string | number,\n value: mutation.modified as Record<string, unknown>,\n }\n }),\n }\n }\n\n private confirmMutationsSyncUnsafe(\n mutations: Array<PendingMutation<T>>,\n ): void {\n if (\n !this.syncControls.begin ||\n !this.syncControls.write ||\n !this.syncControls.commit\n ) {\n return\n }\n\n this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n\n for (const mutation of mutations) {\n if (mutation.type === `delete`) {\n this.syncControls.write?.({\n type: `delete`,\n key: mutation.key as TKey,\n })\n } else {\n this.syncControls.write?.({\n type: `update`,\n value: mutation.modified,\n })\n }\n }\n\n this.syncControls.commit?.()\n })\n }\n\n private filterMutationsForCollection(\n mutations: Array<PendingMutation<Record<string, unknown>>>,\n ): Array<PendingMutation<T>> {\n const collection = this.collection\n return mutations.filter((mutation) => {\n if (collection) {\n return mutation.collection === collection\n }\n return mutation.collection.id === this.collectionId\n }) as Array<PendingMutation<T>>\n }\n\n private async persistCollectionMutationsUnsafe(\n mutations: Array<PendingMutation<T>>,\n ): Promise<Array<string>> {\n // When a coordinator with requestApplyLocalMutations is available, always\n // route through it — even on the leader tab. This ensures the coordinator's\n // seq/rowVersion counters stay in sync with actual writes. Without this,\n // the leader's direct-path writes would increment the runtime's localSeq\n // but leave the coordinator's state.latestSeq stale, causing seq collisions\n // when follower RPCs later arrive.\n if (this.persistence.coordinator.requestApplyLocalMutations) {\n const envelopeMutations = mutations.map((mutation) =>\n toPersistedMutationEnvelope(\n mutation as unknown as PendingMutation<Record<string, unknown>>,\n ),\n )\n\n const response =\n await this.persistence.coordinator.requestApplyLocalMutations(\n this.collectionId,\n envelopeMutations,\n )\n\n if (!response.ok) {\n throw new Error(\n `failed to apply local mutations through coordinator: ${response.error}`,\n )\n }\n\n this.observeStreamPosition(\n response.term,\n response.seq,\n response.latestRowVersion,\n )\n\n const uniqueAcceptedMutationIds = Array.from(\n new Set(response.acceptedMutationIds),\n )\n const submittedMutationIds = new Set(\n mutations.map((mutation) => mutation.mutationId),\n )\n const hasUnknownAcceptedMutationId = uniqueAcceptedMutationIds.some(\n (mutationId) => !submittedMutationIds.has(mutationId),\n )\n\n if (hasUnknownAcceptedMutationId) {\n throw new Error(\n `persistence coordinator returned unknown mutation ids in applyLocalMutations response`,\n )\n }\n\n return uniqueAcceptedMutationIds\n }\n\n // Fallback: no coordinator with requestApplyLocalMutations (e.g.\n // SingleProcessCoordinator). Apply directly and broadcast.\n const streamPosition = this.nextLocalStreamPosition()\n const tx = this.createPersistedTxFromMutations(mutations, streamPosition)\n await this.persistence.adapter.applyCommittedTx(this.collectionId, tx)\n\n this.publishTxCommittedEvent(\n this.createTxCommittedPayload({\n term: tx.term,\n seq: tx.seq,\n txId: tx.txId,\n latestRowVersion: tx.rowVersion,\n changedRows: mutations\n .filter((mutation) => mutation.type !== `delete`)\n .map((mutation) => ({\n key: mutation.key as string | number,\n value: mutation.modified as Record<string, unknown>,\n })),\n deletedKeys: mutations\n .filter((mutation) => mutation.type === `delete`)\n .map((mutation) => mutation.key as string | number),\n rowMetadataMutations: tx.rowMetadataMutations,\n collectionMetadataMutations: tx.collectionMetadataMutations,\n }),\n )\n\n return mutations.map((mutation) => mutation.mutationId)\n }\n\n private createTxCommittedPayload(args: {\n term: number\n seq: number\n txId: string\n latestRowVersion: number\n changedRows: Array<{ key: string | number; value: Record<string, unknown> }>\n deletedKeys: Array<string | number>\n rowMetadataMutations?: Array<PersistedRowMetadataMutation>\n collectionMetadataMutations?: Array<PersistedCollectionMetadataMutation>\n hasMetadataChanges?: boolean\n requiresFullReload?: boolean\n }): TxCommitted {\n const rowMetadataMutations = args.rowMetadataMutations ?? []\n const collectionMetadataMutations = args.collectionMetadataMutations ?? []\n const requiresFullReload =\n args.requiresFullReload === true ||\n args.changedRows.length +\n args.deletedKeys.length +\n rowMetadataMutations.length +\n collectionMetadataMutations.length >\n TARGETED_INVALIDATION_KEY_LIMIT\n\n if (requiresFullReload) {\n return {\n type: `tx:committed`,\n term: args.term,\n seq: args.seq,\n txId: args.txId,\n latestRowVersion: args.latestRowVersion,\n requiresFullReload: true,\n }\n }\n\n return {\n type: `tx:committed`,\n term: args.term,\n seq: args.seq,\n txId: args.txId,\n latestRowVersion: args.latestRowVersion,\n requiresFullReload: false,\n changedRows: args.changedRows,\n deletedKeys: args.deletedKeys,\n rowMetadataMutations,\n collectionMetadataMutations,\n }\n }\n\n private publishTxCommittedEvent(txCommitted: TxCommitted): void {\n this.observeStreamPosition(\n txCommitted.term,\n txCommitted.seq,\n txCommitted.latestRowVersion,\n )\n\n const envelope: ProtocolEnvelope<TxCommitted> = {\n v: 1,\n dbName: this.dbName,\n collectionId: this.collectionId,\n senderId: this.persistence.coordinator.getNodeId(),\n ts: Date.now(),\n payload: txCommitted,\n }\n this.persistence.coordinator.publish(this.collectionId, envelope)\n }\n\n private observeStreamPosition(\n term: number,\n seq: number,\n rowVersion: number,\n ): void {\n if (\n term > this.latestTerm ||\n (term === this.latestTerm && seq > this.latestSeq)\n ) {\n this.latestTerm = term\n this.latestSeq = seq\n }\n if (rowVersion > this.latestRowVersion) {\n this.latestRowVersion = rowVersion\n }\n\n if (term > this.localTerm) {\n this.localTerm = term\n this.localSeq = seq\n } else if (term === this.localTerm && seq > this.localSeq) {\n this.localSeq = seq\n }\n if (rowVersion > this.localRowVersion) {\n this.localRowVersion = rowVersion\n }\n }\n\n private nextLocalStreamPosition(): {\n term: number\n seq: number\n rowVersion: number\n } {\n this.localTerm = Math.max(this.localTerm, this.latestTerm || 1)\n this.localSeq = Math.max(this.localSeq, this.latestSeq) + 1\n this.localRowVersion =\n Math.max(this.localRowVersion, this.latestRowVersion) + 1\n\n return {\n term: this.localTerm,\n seq: this.localSeq,\n rowVersion: this.localRowVersion,\n }\n }\n\n private getSubsetKey(options: LoadSubsetOptions): string {\n // A subscription can own several independent acquisitions, including\n // identical requests. Only releasing this options object ends its lease.\n let id = this.requestIds.get(options)\n if (id === undefined) {\n id = `request:${++this.nextRequestId}`\n this.requestIds.set(options, id)\n }\n return id\n }\n\n private queueRemoteSubsetEnsure(options: LoadSubsetOptions): void {\n if (\n this.mode !== `sync-present` ||\n !this.persistence.coordinator.requestEnsureRemoteSubset ||\n this.activeSubsets.get(this.getSubsetKey(options)) !== options\n ) {\n return\n }\n\n this.pendingRemoteSubsetEnsures.set(this.getSubsetKey(options), options)\n void this.flushPendingRemoteSubsetEnsures()\n }\n\n private scheduleRemoteEnsureRetry(): void {\n if (\n this.mode !== `sync-present` ||\n !this.persistence.coordinator.requestEnsureRemoteSubset\n ) {\n return\n }\n\n if (\n this.pendingRemoteSubsetEnsures.size === 0 ||\n this.remoteEnsureRetryTimer !== null\n ) {\n return\n }\n\n this.remoteEnsureRetryTimer = setTimeout(() => {\n this.remoteEnsureRetryTimer = null\n void this.flushPendingRemoteSubsetEnsures()\n }, REMOTE_ENSURE_RETRY_DELAY_MS)\n }\n\n private async flushPendingRemoteSubsetEnsures(): Promise<void> {\n if (\n this.mode !== `sync-present` ||\n !this.persistence.coordinator.requestEnsureRemoteSubset\n ) {\n return\n }\n\n if (this.remoteEnsureRetryTimer !== null) {\n clearTimeout(this.remoteEnsureRetryTimer)\n this.remoteEnsureRetryTimer = null\n }\n\n for (const [subsetKey, options] of this.pendingRemoteSubsetEnsures) {\n try {\n await this.persistence.coordinator.requestEnsureRemoteSubset(\n this.collectionId,\n options,\n )\n this.pendingRemoteSubsetEnsures.delete(subsetKey)\n } catch (error) {\n console.warn(`Failed to ensure remote subset:`, error)\n }\n }\n\n this.scheduleRemoteEnsureRetry()\n }\n\n private attachCoordinatorSubscription(): void {\n if (this.coordinatorUnsubscribe) {\n return\n }\n\n this.coordinatorUnsubscribe = this.persistence.coordinator.subscribe(\n this.collectionId,\n (message) => {\n this.onCoordinatorMessage(message)\n },\n )\n }\n\n private onCoordinatorMessage(message: ProtocolEnvelope<unknown>): void {\n if (message.collectionId !== this.collectionId) {\n return\n }\n\n const { payload } = message\n const isSelf = message.senderId === this.persistence.coordinator.getNodeId()\n\n // Allow tx:committed from self — the coordinator produces these on behalf\n // of both local and remote mutations. The seq dedup in\n // processCommittedTxUnsafe prevents double-processing of our own writes.\n if (isTxCommittedPayload(payload)) {\n if (this.isHydratingNow()) {\n this.queuedTxCommitted.push(payload)\n return\n }\n\n void this.applyMutex\n .run(() => this.processCommittedTxUnsafe(payload))\n .catch((error) => {\n console.warn(`Failed to process tx:committed message:`, error)\n })\n return\n }\n\n // Skip remaining message types from self (e.g. heartbeats, resets)\n if (isSelf) {\n return\n }\n\n if (isCollectionResetPayload(payload)) {\n void this.applyMutex\n .run(() => this.truncateAndReloadUnsafe())\n .catch((error) => {\n console.warn(`Failed to process collection reset message:`, error)\n })\n }\n }\n\n private async flushQueuedTxCommittedUnsafe(): Promise<void> {\n while (this.queuedTxCommitted.length > 0) {\n const queued = this.queuedTxCommitted.shift()\n if (!queued) {\n continue\n }\n await this.processCommittedTxUnsafe(queued)\n }\n }\n\n private async processCommittedTxUnsafe(\n txCommitted: TxCommitted,\n ): Promise<void> {\n if (txCommitted.term < this.latestTerm) {\n return\n }\n\n if (\n txCommitted.term === this.latestTerm &&\n txCommitted.seq <= this.latestSeq\n ) {\n return\n }\n\n const hasGapInCurrentTerm =\n txCommitted.term === this.latestTerm &&\n txCommitted.seq > this.latestSeq + 1\n const hasGapAcrossTerms =\n txCommitted.term > this.latestTerm && txCommitted.seq > 1\n const hasGap = hasGapInCurrentTerm || hasGapAcrossTerms\n\n if (hasGap) {\n await this.recoverFromSeqGapUnsafe()\n if (\n txCommitted.term < this.latestTerm ||\n (txCommitted.term === this.latestTerm &&\n txCommitted.seq <= this.latestSeq)\n ) {\n return\n }\n }\n\n this.observeStreamPosition(\n txCommitted.term,\n txCommitted.seq,\n txCommitted.latestRowVersion,\n )\n\n await this.invalidateFromCommittedTxUnsafe(txCommitted)\n }\n\n private async recoverFromSeqGapUnsafe(): Promise<void> {\n if (this.persistence.coordinator.pullSince && this.latestRowVersion >= 0) {\n try {\n const pullResponse = await this.persistence.coordinator.pullSince(\n this.collectionId,\n this.latestRowVersion,\n )\n\n if (pullResponse.ok) {\n this.observeStreamPosition(\n pullResponse.latestTerm,\n pullResponse.latestSeq,\n pullResponse.latestRowVersion,\n )\n if (pullResponse.requiresFullReload || !pullResponse.deltas) {\n await this.reloadActiveSubsetsUnsafe()\n return\n }\n\n for (const delta of pullResponse.deltas) {\n await this.invalidateFromCommittedTxUnsafe({\n type: `tx:committed`,\n term: pullResponse.latestTerm,\n seq: pullResponse.latestSeq,\n txId: delta.txId,\n latestRowVersion: delta.latestRowVersion,\n requiresFullReload: false,\n changedRows: delta.changedRows,\n deletedKeys: delta.deletedKeys,\n rowMetadataMutations: delta.rowMetadataMutations,\n collectionMetadataMutations: delta.collectionMetadataMutations,\n })\n }\n return\n }\n } catch (error) {\n console.warn(`Failed pullSince recovery attempt:`, error)\n }\n }\n\n await this.truncateAndReloadUnsafe()\n\n if (this.mode === `sync-present`) {\n for (const options of this.activeSubsets.values()) {\n this.queueRemoteSubsetEnsure(options)\n }\n }\n }\n\n private async truncateAndReloadUnsafe(): Promise<void> {\n if (this.syncControls.begin && this.syncControls.commit) {\n this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n this.syncControls.truncate?.()\n this.syncControls.commit?.()\n })\n }\n\n await this.reloadActiveSubsetsUnsafe()\n }\n\n private async invalidateFromCommittedTxUnsafe(\n txCommitted: TxCommitted,\n ): Promise<void> {\n if (txCommitted.requiresFullReload) {\n await this.reloadActiveSubsetsUnsafe()\n return\n }\n\n const changedKeyCount =\n txCommitted.changedRows.length + txCommitted.deletedKeys.length\n if (changedKeyCount > TARGETED_INVALIDATION_KEY_LIMIT) {\n await this.reloadActiveSubsetsUnsafe()\n return\n }\n\n const hasPaginatedSubset = Array.from(this.activeSubsets.values()).some(\n (opt) => opt.limit != null || opt.offset != null || opt.cursor != null,\n )\n\n if (!hasPaginatedSubset || changedKeyCount === 0) {\n await this.applyTargetedInvalidationUnsafe(txCommitted)\n return\n }\n\n // Has paginated subsets — fall back to full reload.\n // Targeted invalidation for paginated subsets is deferred to a future iteration.\n await this.reloadActiveSubsetsUnsafe()\n }\n\n private async applyTargetedInvalidationUnsafe(\n txCommitted: TxCommitted & { requiresFullReload: false },\n ): Promise<void> {\n const subsetEvaluators = Array.from(this.activeSubsets.values()).map(\n (opt) => (opt.where ? compileSingleRowExpression(opt.where) : null),\n )\n\n this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n\n for (const {\n key: changedKey,\n value: newValue,\n } of txCommitted.changedRows) {\n const matchesAnySubset = subsetEvaluators.some((evaluator) => {\n if (!evaluator) return true\n return toBooleanPredicate(evaluator(newValue) as boolean | null)\n })\n\n if (matchesAnySubset) {\n this.syncControls.write?.({ type: `update`, value: newValue as T })\n } else if (this.collection?.get(changedKey as TKey) !== undefined) {\n this.syncControls.write?.({ type: `delete`, key: changedKey as TKey })\n }\n }\n\n for (const deletedKey of txCommitted.deletedKeys) {\n this.syncControls.write?.({ type: `delete`, key: deletedKey as TKey })\n }\n\n txCommitted.rowMetadataMutations?.forEach((mutation) => {\n if (mutation.type === `delete`) {\n this.syncControls.metadata?.row.delete(mutation.key as TKey)\n } else {\n this.syncControls.metadata?.row.set(\n mutation.key as TKey,\n mutation.value,\n )\n }\n })\n\n txCommitted.collectionMetadataMutations?.forEach((mutation) => {\n if (mutation.type === `delete`) {\n this.syncControls.metadata?.collection.delete(mutation.key)\n } else {\n this.syncControls.metadata?.collection.set(\n mutation.key,\n mutation.value,\n )\n }\n })\n\n this.syncControls.commit?.()\n })\n }\n\n private async reloadActiveSubsetsUnsafe(): Promise<void> {\n const lifecycleGeneration = this.lifecycleGeneration\n const activeSubsetOptions =\n this.activeSubsets.size > 0\n ? Array.from(this.activeSubsets.values())\n : [{}]\n\n this.hydratingGeneration = lifecycleGeneration\n try {\n const mergedRows = new Map<TKey, { value: T; metadata?: unknown }>()\n const collectionMetadata = await this.loadCollectionMetadataSnapshot()\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n for (const options of activeSubsetOptions) {\n const subsetRows = await this.loadSubsetRowsUnsafe(options)\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n for (const row of subsetRows) {\n mergedRows.set(row.key, {\n value: row.value,\n metadata: row.metadata,\n })\n }\n }\n\n this.replaceCollectionSnapshot(\n Array.from(mergedRows.entries()).map(([key, row]) => ({\n key,\n value: row.value,\n metadata: row.metadata,\n })),\n collectionMetadata,\n )\n } finally {\n if (this.hydratingGeneration === lifecycleGeneration) {\n this.hydratingGeneration = null\n }\n }\n\n await this.flushQueuedHydrationTransactionsUnsafe()\n await this.flushQueuedTxCommittedUnsafe()\n }\n\n private attachIndexLifecycleListeners(): void {\n if (\n !this.collection ||\n this.indexAddedUnsubscribe ||\n this.indexRemovedUnsubscribe\n ) {\n return\n }\n\n this.indexAddedUnsubscribe = this.collection.on(`index:added`, (event) => {\n void this.ensurePersistedIndex(event.index)\n })\n this.indexRemovedUnsubscribe = this.collection.on(\n `index:removed`,\n (event) => {\n void this.markIndexRemoved(event.index)\n },\n )\n }\n\n private async bootstrapPersistedIndexes(\n indexMetadataSnapshot?: Array<CollectionIndexMetadata>,\n ): Promise<void> {\n const collection = this.collection\n if (!collection && !indexMetadataSnapshot) {\n return\n }\n\n const indexMetadata =\n indexMetadataSnapshot ?? collection?.getIndexMetadata() ?? []\n for (const metadata of indexMetadata) {\n await this.ensurePersistedIndex(metadata)\n }\n }\n\n private buildPersistedIndexSpec(\n index: CollectionIndexMetadata,\n ): PersistedIndexSpec {\n return {\n expressionSql: [stableSerialize(index.expression)],\n metadata: {\n name: index.name ?? null,\n resolver: toStableSerializable(index.resolver),\n options: toStableSerializable(index.options),\n },\n }\n }\n\n private async ensurePersistedIndex(\n indexMetadata: CollectionIndexMetadata,\n ): Promise<void> {\n const spec = this.buildPersistedIndexSpec(indexMetadata)\n\n try {\n await this.persistence.adapter.ensureIndex(\n this.collectionId,\n indexMetadata.signature,\n spec,\n )\n } catch (error) {\n console.warn(`Failed to ensure persisted index in adapter:`, error)\n }\n\n try {\n await this.persistence.coordinator.requestEnsurePersistedIndex(\n this.collectionId,\n indexMetadata.signature,\n spec,\n )\n } catch (error) {\n console.warn(\n `Failed to ensure persisted index through coordinator:`,\n error,\n )\n }\n }\n\n private async markIndexRemoved(\n indexMetadata: CollectionIndexMetadata,\n ): Promise<void> {\n if (!this.persistence.adapter.markIndexRemoved) {\n return\n }\n\n try {\n await this.persistence.adapter.markIndexRemoved(\n this.collectionId,\n indexMetadata.signature,\n )\n } catch (error) {\n console.warn(`Failed to mark persisted index removed:`, error)\n }\n }\n}\n\nfunction createWrappedSyncConfig<\n T extends object,\n TKey extends string | number,\n>(\n sourceSyncConfig: SyncConfig<T, TKey>,\n runtime: PersistedCollectionRuntime<T, TKey>,\n): SyncConfig<T, TKey> {\n return {\n ...sourceSyncConfig,\n sync: (params) => {\n const transactionStack: Array<OpenSyncTransaction<T, TKey>> = []\n const getOpenTransaction = () =>\n transactionStack[transactionStack.length - 1]\n let fullStartPromise: Promise<void> | null = null\n const startupState = { cleanedUp: false }\n const acquisitions = new Map<LoadSubsetOptions, { forwarded: boolean }>()\n runtime.setSyncControls({\n begin: params.begin,\n write: params.write as SyncControlFns<T, TKey>[`write`],\n commit: params.commit,\n truncate: params.truncate,\n metadata: params.metadata ?? null,\n })\n runtime.setCollection(\n params.collection as Collection<T, TKey, PersistedCollectionUtils>,\n )\n\n const wrappedParams = {\n ...params,\n markReady: () => {\n if (startupState.cleanedUp) return\n void (fullStartPromise ?? runtime.ensureStarted())\n .then(() => {\n if (startupState.cleanedUp) return\n params.markReady()\n })\n .catch((error) => {\n if (startupState.cleanedUp) return\n console.warn(\n `Failed persisted sync startup before markReady:`,\n error,\n )\n params.markReady()\n })\n },\n begin: (options?: { immediate?: boolean }) => {\n if (startupState.cleanedUp) return\n const transaction: OpenSyncTransaction<T, TKey> = {\n operations: [],\n rowMetadataWrites: new Map(),\n collectionMetadataWrites: new Map(),\n truncate: false,\n internal: runtime.isApplyingInternally(),\n queuedBecauseHydrating:\n !runtime.isApplyingInternally() && runtime.isHydratingNow(),\n }\n transactionStack.push(transaction)\n\n if (!transaction.queuedBecauseHydrating) {\n params.begin(options)\n }\n },\n write: (message: ChangeMessageOrDeleteKeyMessage<T, TKey>) => {\n if (startupState.cleanedUp) return\n const normalization = runtime.normalizeSyncWriteMessage(message)\n const openTransaction = getOpenTransaction()\n\n if (!openTransaction) {\n params.write(normalization.forwardMessage)\n return\n }\n\n openTransaction.operations.push(normalization.operation)\n if (normalization.operation.type === `delete`) {\n openTransaction.rowMetadataWrites.set(normalization.operation.key, {\n type: `delete`,\n })\n } else if (\n message.type === `insert` &&\n normalization.operation.metadata === undefined\n ) {\n // Reset stale metadata for a fresh insert, but don't clobber an\n // explicit metadata write already queued for this key in the same\n // transaction (e.g. query reconcile stamps owners, then inserts).\n if (\n !openTransaction.rowMetadataWrites.has(\n normalization.operation.key,\n )\n ) {\n openTransaction.rowMetadataWrites.set(\n normalization.operation.key,\n {\n type: `delete`,\n },\n )\n }\n } else if (normalization.operation.metadata !== undefined) {\n openTransaction.rowMetadataWrites.set(normalization.operation.key, {\n type: `set`,\n value: normalization.operation.metadata,\n })\n }\n if (!openTransaction.queuedBecauseHydrating) {\n params.write(normalization.forwardMessage)\n }\n },\n metadata: params.metadata\n ? {\n row: {\n whenHydrated: () =>\n startupState.cleanedUp\n ? Promise.resolve()\n : runtime.ensureResumeBaselineHydrated(),\n get: (key: TKey) => {\n if (startupState.cleanedUp) return undefined\n const openTransaction = getOpenTransaction()\n const pendingWrite =\n openTransaction?.rowMetadataWrites.get(key)\n if (pendingWrite) {\n return pendingWrite.type === `delete`\n ? undefined\n : pendingWrite.value\n }\n if (openTransaction?.truncate) {\n return undefined\n }\n return params.metadata!.row.get(key)\n },\n scanPersisted: (options?: PersistedRowScanOptions) =>\n startupState.cleanedUp\n ? Promise.resolve([])\n : runtime.scanPersistedRows(options),\n set: (key: TKey, value: unknown) => {\n if (startupState.cleanedUp) return\n const openTransaction = getOpenTransaction()\n if (!openTransaction) {\n throw new InvalidPersistedCollectionConfigError(\n `metadata.row.set must be called within an open sync transaction`,\n )\n }\n openTransaction.rowMetadataWrites.set(key, {\n type: `set`,\n value,\n })\n if (!openTransaction.queuedBecauseHydrating) {\n params.metadata!.row.set(key, value)\n }\n },\n delete: (key: TKey) => {\n if (startupState.cleanedUp) return\n const openTransaction = getOpenTransaction()\n if (!openTransaction) {\n throw new InvalidPersistedCollectionConfigError(\n `metadata.row.delete must be called within an open sync transaction`,\n )\n }\n openTransaction.rowMetadataWrites.set(key, {\n type: `delete`,\n })\n if (!openTransaction.queuedBecauseHydrating) {\n params.metadata!.row.delete(key)\n }\n },\n },\n collection: {\n get: (key: string) => {\n if (startupState.cleanedUp) return undefined\n const openTransaction = getOpenTransaction()\n const pendingWrite =\n openTransaction?.collectionMetadataWrites.get(key)\n if (pendingWrite) {\n return pendingWrite.type === `delete`\n ? undefined\n : pendingWrite.value\n }\n return params.metadata!.collection.get(key)\n },\n set: (key: string, value: unknown) => {\n if (startupState.cleanedUp) return\n const openTransaction = getOpenTransaction()\n if (!openTransaction) {\n throw new InvalidPersistedCollectionConfigError(\n `metadata.collection.set must be called within an open sync transaction`,\n )\n }\n openTransaction.collectionMetadataWrites.set(key, {\n type: `set`,\n value,\n })\n if (!openTransaction.queuedBecauseHydrating) {\n params.metadata!.collection.set(key, value)\n }\n },\n delete: (key: string) => {\n if (startupState.cleanedUp) return\n const openTransaction = getOpenTransaction()\n if (!openTransaction) {\n throw new InvalidPersistedCollectionConfigError(\n `metadata.collection.delete must be called within an open sync transaction`,\n )\n }\n openTransaction.collectionMetadataWrites.set(key, {\n type: `delete`,\n })\n if (!openTransaction.queuedBecauseHydrating) {\n params.metadata!.collection.delete(key)\n }\n },\n list: (prefix?: string) => {\n if (startupState.cleanedUp) return []\n const merged = new Map(\n params\n .metadata!.collection.list()\n .map(({ key, value }) => [key, value]),\n )\n const openTransaction = getOpenTransaction()\n if (openTransaction) {\n for (const [\n key,\n metadataWrite,\n ] of openTransaction.collectionMetadataWrites) {\n if (metadataWrite.type === `delete`) {\n merged.delete(key)\n } else {\n merged.set(key, metadataWrite.value)\n }\n }\n }\n\n return Array.from(merged.entries())\n .filter(([key]) => (prefix ? key.startsWith(prefix) : true))\n .map(([key, value]) => ({\n key,\n value,\n }))\n },\n },\n }\n : undefined,\n truncate: () => {\n if (startupState.cleanedUp) return\n const openTransaction = getOpenTransaction()\n if (!openTransaction) {\n params.truncate()\n return\n }\n\n openTransaction.operations = []\n openTransaction.rowMetadataWrites.clear()\n // Intentionally preserve collectionMetadataWrites across truncate.\n // Callers (for example electric resume/reset handling) may stage\n // collection-scoped metadata before truncating row data, and those\n // writes must commit atomically with the truncate transaction.\n openTransaction.truncate = true\n if (!openTransaction.queuedBecauseHydrating) {\n params.truncate()\n }\n },\n commit: (signal?: AbortSignal) => {\n if (startupState.cleanedUp) return true\n const openTransaction = transactionStack.pop()\n if (!openTransaction) {\n return params.commit(signal)\n }\n\n if (openTransaction.queuedBecauseHydrating) {\n if (signal?.aborted) {\n const aborted = Promise.reject(new SyncTransactionAbortedError())\n void aborted.catch(() => undefined)\n return aborted\n }\n let resolveApplied!: () => void\n let rejectApplied!: (error: unknown) => void\n const applied = new Promise<void>((resolve, reject) => {\n resolveApplied = resolve\n rejectApplied = reject\n })\n void applied.catch(() => undefined)\n runtime.queueHydrationBufferedTransaction({\n operations: openTransaction.operations,\n rowMetadataWrites: openTransaction.rowMetadataWrites,\n collectionMetadataWrites:\n openTransaction.collectionMetadataWrites,\n truncate: openTransaction.truncate,\n internal: openTransaction.internal,\n signal,\n resolveApplied,\n rejectApplied,\n })\n return applied\n }\n\n const applied = params.commit(signal)\n if (!openTransaction.internal) {\n const persistAfterApplication = async () => {\n if (applied !== true) await applied\n await runtime.persistAndBroadcastExternalSyncTransaction({\n operations: openTransaction.operations,\n rowMetadataWrites: openTransaction.rowMetadataWrites,\n collectionMetadataWrites:\n openTransaction.collectionMetadataWrites,\n truncate: openTransaction.truncate,\n internal: false,\n })\n }\n const persisted = persistAfterApplication()\n void persisted.catch(() => undefined)\n return persisted\n }\n return applied\n },\n }\n\n let sourceResult: SyncConfigRes = {}\n fullStartPromise = runtime.ensureStarted()\n const sourceResultPromise = (async () => {\n await runtime.ensureStartupMetadataLoaded()\n\n if (startupState.cleanedUp) {\n return sourceResult\n }\n\n sourceResult = normalizeSyncFnResult(\n sourceSyncConfig.sync(wrappedParams),\n )\n return sourceResult\n })()\n\n return {\n cleanup: () => {\n startupState.cleanedUp = true\n acquisitions.clear()\n sourceResult.cleanup?.()\n runtime.cleanup()\n runtime.clearSyncControls()\n },\n loadSubset: async (options: LoadSubsetOptions) => {\n const acquisition = { forwarded: false }\n acquisitions.set(options, acquisition)\n await fullStartPromise\n const resolvedSourceResult = await sourceResultPromise\n if (\n startupState.cleanedUp ||\n acquisitions.get(options) !== acquisition\n ) {\n return\n }\n return runtime.loadSubset(options, (loadOptions) => {\n // Hydration is another async boundary. A release before this\n // point owns no upstream lease and must not start one later.\n if (\n startupState.cleanedUp ||\n acquisitions.get(options) !== acquisition\n ) {\n return true\n }\n if (!resolvedSourceResult.loadSubset) return true\n acquisition.forwarded = true\n try {\n // Returning a promise transfers its lease even if it rejects.\n // Only a synchronous throw leaves no upstream lease to release.\n return resolvedSourceResult.loadSubset(loadOptions)\n } catch (error) {\n acquisition.forwarded = false\n throw error\n }\n })\n },\n unloadSubset: (options: LoadSubsetOptions) => {\n const acquisition = acquisitions.get(options)\n acquisitions.delete(options)\n runtime.unloadSubset(\n options,\n acquisition?.forwarded ? sourceResult.unloadSubset : undefined,\n )\n },\n }\n },\n }\n}\n\nfunction createLoopbackSyncConfig<\n T extends object,\n TKey extends string | number,\n>(runtime: PersistedCollectionRuntime<T, TKey>): SyncConfig<T, TKey> {\n return {\n sync: (params) => {\n runtime.setSyncControls({\n begin: params.begin,\n write: params.write as SyncControlFns<T, TKey>[`write`],\n commit: params.commit,\n truncate: params.truncate,\n metadata: params.metadata ?? null,\n })\n runtime.setCollection(\n params.collection as Collection<T, TKey, PersistedCollectionUtils>,\n )\n\n void runtime\n .ensureStarted()\n .then(() => {\n params.markReady()\n })\n .catch((error) => {\n console.warn(`Failed persisted loopback startup:`, error)\n params.markReady()\n })\n\n return {\n cleanup: () => {\n runtime.cleanup()\n runtime.clearSyncControls()\n },\n loadSubset: (options: LoadSubsetOptions) => runtime.loadSubset(options),\n unloadSubset: (options: LoadSubsetOptions) =>\n runtime.unloadSubset(options),\n }\n },\n getSyncMetadata: () => ({\n source: `persisted-phase-2-loopback`,\n }),\n }\n}\n\nexport function persistedCollectionOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1 = never,\n TUtils extends UtilsRecord = UtilsRecord,\n>(\n options: PersistedSyncWrappedOptions<T, TKey, TSchema, TUtils>,\n): PersistedSyncOptionsResult<T, TKey, TSchema, TUtils>\n\nexport function persistedCollectionOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1 = never,\n TUtils extends UtilsRecord = UtilsRecord,\n>(\n options: PersistedLocalOnlyOptions<T, TKey, TSchema, TUtils>,\n): PersistedLocalOnlyOptionsResult<T, TKey, TSchema, TUtils>\n\nexport function persistedCollectionOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1 = never,\n TUtils extends UtilsRecord = UtilsRecord,\n>(\n options:\n | PersistedSyncWrappedOptions<T, TKey, TSchema, TUtils>\n | PersistedLocalOnlyOptions<T, TKey, TSchema, TUtils>,\n):\n | PersistedSyncOptionsResult<T, TKey, TSchema, TUtils>\n | PersistedLocalOnlyOptionsResult<T, TKey, TSchema, TUtils> {\n if (!isRecord(options.persistence)) {\n throw new InvalidPersistedCollectionConfigError(\n `persistedCollectionOptions requires a persistence adapter`,\n )\n }\n\n if (hasOwnSyncKey(options)) {\n if (!isValidSyncConfig(options.sync)) {\n throw new InvalidSyncConfigError(\n `when the \"sync\" key is present it must provide a callable sync function`,\n )\n }\n\n const { schemaVersion, ...syncOptions } = options\n const collectionId =\n syncOptions.id ?? `persisted-collection:${safeRandomUUID()}`\n const persistence = resolvePersistenceForCollection(\n syncOptions.persistence,\n {\n collectionId,\n mode: `sync-present`,\n schemaVersion,\n },\n )\n\n const runtime = new PersistedCollectionRuntime<T, TKey>(\n `sync-present`,\n collectionId,\n persistence,\n syncOptions.syncMode ?? `eager`,\n collectionId,\n )\n\n const result = {\n ...syncOptions,\n id: collectionId,\n sync: createWrappedSyncConfig<T, TKey>(syncOptions.sync, runtime),\n persistence,\n }\n\n return withCollectionConfigFactory(\n result,\n () =>\n persistedCollectionOptions({\n ...options,\n id: collectionId,\n }) as typeof result,\n )\n }\n\n const { schemaVersion, ...localOnlyOptions } = options\n const collectionId =\n localOnlyOptions.id ?? `persisted-collection:${safeRandomUUID()}`\n const persistence = resolvePersistenceForCollection(\n localOnlyOptions.persistence,\n {\n collectionId,\n mode: `sync-absent`,\n schemaVersion,\n },\n )\n const runtime = new PersistedCollectionRuntime<T, TKey>(\n `sync-absent`,\n collectionId,\n persistence,\n localOnlyOptions.syncMode ?? `eager`,\n localOnlyOptions.id ?? DEFAULT_DB_NAME,\n )\n\n const wrappedOnInsert = async (\n params: InsertMutationFnParams<T, TKey, TUtils & PersistedCollectionUtils>,\n ) => {\n const handlerResult = localOnlyOptions.onInsert\n ? await localOnlyOptions.onInsert(\n params as unknown as InsertMutationFnParams<T, TKey, TUtils>,\n )\n : undefined\n\n await runtime.persistAndConfirmCollectionMutations(\n params.transaction.mutations as Array<PendingMutation<T>>,\n )\n\n return handlerResult ?? {}\n }\n\n const wrappedOnUpdate = async (\n params: UpdateMutationFnParams<T, TKey, TUtils & PersistedCollectionUtils>,\n ) => {\n const handlerResult = localOnlyOptions.onUpdate\n ? await localOnlyOptions.onUpdate(\n params as unknown as UpdateMutationFnParams<T, TKey, TUtils>,\n )\n : undefined\n\n await runtime.persistAndConfirmCollectionMutations(\n params.transaction.mutations as Array<PendingMutation<T>>,\n )\n\n return handlerResult ?? {}\n }\n\n const wrappedOnDelete = async (\n params: DeleteMutationFnParams<T, TKey, TUtils & PersistedCollectionUtils>,\n ) => {\n const handlerResult = localOnlyOptions.onDelete\n ? await localOnlyOptions.onDelete(\n params as unknown as DeleteMutationFnParams<T, TKey, TUtils>,\n )\n : undefined\n\n await runtime.persistAndConfirmCollectionMutations(\n params.transaction.mutations as Array<PendingMutation<T>>,\n )\n\n return handlerResult ?? {}\n }\n\n const acceptMutations = async (transaction: {\n mutations: Array<PendingMutation<Record<string, unknown>>>\n }) => {\n await runtime.acceptTransactionMutations(transaction)\n }\n\n const persistedUtils: PersistedCollectionUtils = {\n acceptMutations,\n getLeadershipState: () => runtime.getLeadershipState(),\n forceReloadSubset: (subsetOptions: LoadSubsetOptions) =>\n runtime.forceReloadSubset(subsetOptions),\n }\n\n const mergedUtils = {\n ...(localOnlyOptions.utils ?? ({} as TUtils)),\n ...persistedUtils,\n }\n\n const result = {\n ...localOnlyOptions,\n id: collectionId,\n persistence,\n sync: createLoopbackSyncConfig(runtime),\n onInsert: wrappedOnInsert,\n onUpdate: wrappedOnUpdate,\n onDelete: wrappedOnDelete,\n utils: mergedUtils,\n startSync: true,\n gcTime: localOnlyOptions.gcTime ?? 0,\n }\n\n return withCollectionConfigFactory(\n result,\n () =>\n persistedCollectionOptions({\n ...options,\n id: collectionId,\n }) as typeof result,\n )\n}\n\nexport function encodePersistedStorageKey(key: string | number): string {\n if (typeof key === `number`) {\n if (!Number.isFinite(key)) {\n throw new InvalidPersistedStorageKeyError(key)\n }\n\n if (Object.is(key, -0)) {\n return `n:-0`\n }\n\n return `n:${key}`\n }\n\n return `s:${key}`\n}\n\nexport function decodePersistedStorageKey(encoded: string): string | number {\n if (encoded === `n:-0`) {\n return -0\n }\n\n if (encoded.startsWith(`n:`)) {\n return Number(encoded.slice(2))\n }\n\n if (encoded.startsWith(`s:`)) {\n return encoded.slice(2)\n }\n\n throw new InvalidPersistedStorageKeyEncodingError(encoded)\n}\n\nconst PERSISTED_TABLE_NAME_ALPHABET = `abcdefghijklmnopqrstuvwxyz234567`\n\nfunction hashCollectionId(collectionId: string): number {\n let hash = 0x811c9dc5\n\n for (let index = 0; index < collectionId.length; index++) {\n hash ^= collectionId.charCodeAt(index)\n hash = Math.imul(hash, 0x01000193)\n }\n\n return hash >>> 0\n}\n\nfunction toBase32(input: number): string {\n if (input === 0) {\n return PERSISTED_TABLE_NAME_ALPHABET.charAt(0)\n }\n\n let value = input >>> 0\n let output = ``\n\n while (value > 0) {\n output = `${PERSISTED_TABLE_NAME_ALPHABET.charAt(value % 32)}${output}`\n value = Math.floor(value / 32)\n }\n\n return output\n}\n\nexport function createPersistedTableName(\n collectionId: string,\n prefix: `c` | `t` = `c`,\n): string {\n if (!collectionId) {\n throw new InvalidPersistedCollectionConfigError(\n `collectionId is required to derive a persisted table name`,\n )\n }\n\n const hashPart = toBase32(hashCollectionId(collectionId))\n const lengthPart = collectionId.length.toString(36)\n\n return `${prefix}_${hashPart}_${lengthPart}`\n}\n"],"names":["safeRandomUUID","InvalidPersistedCollectionCoordinatorError","InvalidPersistenceAdapterError","InvalidPersistedCollectionConfigError","key","SyncTransactionAbortedError","compileSingleRowExpression","toBooleanPredicate","applied","InvalidSyncConfigError","schemaVersion","collectionId","persistence","runtime","result","withCollectionConfigFactory","InvalidPersistedStorageKeyError","InvalidPersistedStorageKeyEncodingError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"persisted.cjs","sources":["../../src/persisted.ts"],"sourcesContent":["import {\n NoPendingSyncTransactionCommitError,\n NoPendingSyncTransactionWriteError,\n PERSISTED_READINESS,\n SYNC_PERSISTENCE_PROTOCOL,\n SYNC_PERSISTENCE_VERSION,\n SyncTransactionAbortedError,\n compileSingleRowExpression,\n getLoadSubsetDemandKey,\n safeRandomUUID,\n toBooleanPredicate,\n withCollectionConfigFactory,\n} from '@tanstack/db'\nimport {\n DuplicateRemoteSubsetOwnerError,\n InvalidPersistedCollectionConfigError,\n InvalidPersistedCollectionCoordinatorError,\n InvalidPersistedStorageKeyEncodingError,\n InvalidPersistedStorageKeyError,\n InvalidPersistenceAdapterError,\n InvalidSyncConfigError,\n PersistedCollectionDurabilityError,\n toPersistedCollectionDurabilityError,\n} from './errors'\nimport { serializeSQLiteBigInt } from './sqlite-value'\nimport {\n toProcessLocalLoadSubsetOptions,\n toTransportedLoadSubsetOptions,\n} from './remote-subset-wire'\nimport {\n reportRemoteSubsetOwnerError,\n unloadRemoteSubsetOwner,\n} from './remote-subset-owner'\nimport type { TransportedLoadSubsetOptions } from './remote-subset-wire'\nimport type { RemoteSubsetOwner } from './remote-subset-owner'\nimport type { StandardSchemaV1 } from '@standard-schema/spec'\nimport type {\n ChangeMessageOrDeleteKeyMessage,\n Collection,\n CollectionConfig,\n CollectionIndexMetadata,\n DeleteMutationFnParams,\n InferSchemaOutput,\n InsertMutationFnParams,\n LoadSubsetFn,\n LoadSubsetOptions,\n PendingMutation,\n PersistedReadinessSnapshot,\n PersistedReadinessSource,\n SyncAppliedReceipt,\n SyncConfig,\n SyncConfigRes,\n SyncMetadataApi,\n SyncPersistenceCapabilityV1,\n SyncPersistenceKeySetEvidence,\n SyncPersistenceScanOptions,\n UpdateMutationFnParams,\n UtilsRecord,\n} from '@tanstack/db'\n\nexport type PersistedMutationEnvelope =\n | {\n mutationId: string\n type: `insert`\n key: string | number\n value: Record<string, unknown>\n /** Persisted row metadata, not optimistic-transaction metadata. */\n metadata?: unknown\n /** Whether this envelope replaces or deletes the persisted row metadata. */\n metadataChanged?: boolean\n }\n | {\n mutationId: string\n type: `update`\n key: string | number\n value: Record<string, unknown>\n /** Persisted row metadata, not optimistic-transaction metadata. */\n metadata?: unknown\n /** Whether this envelope replaces or deletes the persisted row metadata. */\n metadataChanged?: boolean\n }\n | {\n mutationId: string\n type: `delete`\n key: string | number\n value: Record<string, unknown>\n }\n\nexport type ProtocolEnvelope<TPayload> = {\n v: 1\n dbName: string\n collectionId: string\n senderId: string\n ts: number\n payload: TPayload\n}\n\nexport type LeaderHeartbeat = {\n type: `leader:heartbeat`\n term: number\n leaderId: string\n latestSeq: number\n latestRowVersion: number\n}\n\nexport type TxCommitted = {\n type: `tx:committed`\n term: number\n seq: number\n txId: string\n latestRowVersion: number\n} & (\n | {\n requiresFullReload: true\n }\n | {\n requiresFullReload: false\n changedRows: Array<{\n key: string | number\n value: Record<string, unknown>\n }>\n deletedKeys: Array<string | number>\n rowMetadataMutations?: Array<\n PersistedRowMetadataMutation<string | number>\n >\n collectionMetadataMutations?: Array<PersistedCollectionMetadataMutation>\n }\n)\n\nexport type EnsureRemoteSubsetRequest = {\n type: `rpc:ensureRemoteSubset:req`\n rpcId: string\n acquisitionId: string\n options: TransportedLoadSubsetOptions\n}\n\nexport type EnsureRemoteSubsetResponse =\n | {\n type: `rpc:ensureRemoteSubset:res`\n rpcId: string\n ok: true\n leaderId: string\n }\n | {\n type: `rpc:ensureRemoteSubset:res`\n rpcId: string\n ok: false\n error: string\n retryable?: true\n }\n\nexport type ReleaseRemoteSubsetRequest = {\n type: `rpc:releaseRemoteSubset:req`\n rpcId: string\n acquisitionId: string\n}\n\nexport type ReleaseRemoteSubsetResponse =\n | {\n type: `rpc:releaseRemoteSubset:res`\n rpcId: string\n ok: true\n }\n | {\n type: `rpc:releaseRemoteSubset:res`\n rpcId: string\n ok: false\n error: string\n }\n\nexport type ApplyLocalMutationsRequest = {\n type: `rpc:applyLocalMutations:req`\n rpcId: string\n envelopeId: string\n mutations: Array<PersistedMutationEnvelope>\n}\n\nexport type ApplyLocalMutationsResponse =\n | {\n type: `rpc:applyLocalMutations:res`\n rpcId: string\n ok: true\n term: number\n seq: number\n latestRowVersion: number\n acceptedMutationIds: Array<string>\n }\n | {\n type: `rpc:applyLocalMutations:res`\n rpcId: string\n ok: false\n code: `NOT_LEADER` | `VALIDATION_ERROR` | `CONFLICT` | `TIMEOUT`\n error: string\n }\n | {\n type: `rpc:applyLocalMutations:res`\n rpcId: string\n ok: false\n code: `PERSISTENCE_ERROR`\n error: string\n sourceCode?: string | number\n path?: string | ReadonlyArray<string | number>\n }\n\nexport type ApplyCommittedTxRequest = {\n type: `rpc:applyCommittedTx:req`\n rpcId: string\n envelopeId: string\n tx: PersistedTx\n}\n\nexport type ApplyCommittedTxResponse =\n | {\n type: `rpc:applyCommittedTx:res`\n rpcId: string\n ok: true\n term: number\n seq: number\n latestRowVersion: number\n }\n | {\n type: `rpc:applyCommittedTx:res`\n rpcId: string\n ok: false\n code: `NOT_LEADER` | `CONFLICT` | `TIMEOUT`\n error: string\n }\n | {\n type: `rpc:applyCommittedTx:res`\n rpcId: string\n ok: false\n code: `PERSISTENCE_ERROR`\n error: string\n sourceCode?: string | number\n path?: string | ReadonlyArray<string | number>\n }\n\nexport type PullSinceRequest = {\n type: `rpc:pullSince:req`\n rpcId: string\n fromRowVersion: number\n}\n\nexport type PullSinceResponse =\n | {\n type: `rpc:pullSince:res`\n rpcId: string\n ok: true\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n requiresFullReload: true\n }\n | {\n type: `rpc:pullSince:res`\n rpcId: string\n ok: true\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n requiresFullReload: false\n changedKeys: Array<string | number>\n deletedKeys: Array<string | number>\n deltas?: Array<\n ReplayableTxDelta<Record<string, unknown>, string | number>\n >\n }\n | {\n type: `rpc:pullSince:res`\n rpcId: string\n ok: false\n error: string\n }\n\nexport type CollectionReset = {\n type: `collection:reset`\n schemaVersion: number\n resetEpoch: number\n}\n\nexport interface PersistedIndexSpec {\n readonly expressionSql: ReadonlyArray<string>\n readonly whereSql?: string\n readonly metadata?: Readonly<Record<string, unknown>>\n}\n\nexport type PersistedRowMetadataMutation<\n TKey extends string | number = string | number,\n> = { type: `set`; key: TKey; value: unknown } | { type: `delete`; key: TKey }\n\nexport type PersistedCollectionMetadataMutation =\n | { type: `set`; key: string; value: unknown }\n | { type: `delete`; key: string }\n\nexport type ReplayableTxDelta<\n T extends Record<string, unknown> = Record<string, unknown>,\n TKey extends string | number = string | number,\n> = {\n txId: string\n latestRowVersion: number\n changedRows: Array<{ key: TKey; value: T }>\n deletedKeys: Array<TKey>\n rowMetadataMutations: Array<PersistedRowMetadataMutation<TKey>>\n collectionMetadataMutations: Array<PersistedCollectionMetadataMutation>\n}\n\nexport type PersistedScannedRow<\n T extends object = Record<string, unknown>,\n TKey extends string | number = string | number,\n> = {\n key: TKey\n value: T\n metadata?: unknown\n}\n\nexport type PersistedRowScanOptions = SyncPersistenceScanOptions\n\nexport type PersistedKeySetEvidence = SyncPersistenceKeySetEvidence\n\ntype PersistedResumeGeneration = {\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n resetEpoch: number\n}\n\nexport type PersistencePullSinceResult =\n | {\n latestRowVersion: number\n requiresFullReload: true\n }\n | {\n latestRowVersion: number\n requiresFullReload: false\n changedKeys: Array<string | number>\n deletedKeys: Array<string | number>\n deltas?: Array<\n ReplayableTxDelta<Record<string, unknown>, string | number>\n >\n }\n\nexport type PersistedTx<\n T extends object = Record<string, unknown>,\n TKey extends string | number = string | number,\n> = {\n txId: string\n term: number\n seq: number\n rowVersion: number\n truncate?: boolean\n mutations: Array<\n | {\n type: `insert`\n key: TKey\n value: T\n metadata?: unknown\n metadataChanged?: boolean\n }\n | {\n type: `update`\n key: TKey\n value: T\n metadata?: unknown\n metadataChanged?: boolean\n }\n | { type: `delete`; key: TKey; value: T }\n >\n rowMetadataMutations?: Array<PersistedRowMetadataMutation<TKey>>\n collectionMetadataMutations?: Array<PersistedCollectionMetadataMutation>\n}\n\n/**\n * Opaque identity shared by every adapter over the same physical SQLite driver.\n * The core adapter uses it to serialize non-preemptible logical operations\n * while alternating one regular operation between queued hydrations.\n *\n * Delegating drivers must forward this property before they are passed to a\n * SQLite persistence adapter. A driver may also brand each returned Promise\n * with the same key for late capability discovery, but a wrapper must return\n * that exact Promise: discovering the key after a call cannot retroactively\n * schedule the wrapper's first logical operation.\n */\nexport const SQLITE_DRIVER_SHARED_LOGICAL_SCHEDULING_KEY = Symbol.for(\n `tanstack-db.sqlite-driver-supports-shared-logical-scheduling`,\n)\n\nexport interface PersistenceAdapter {\n loadSubset: (\n collectionId: string,\n options: LoadSubsetOptions,\n ctx?: { requiredIndexSignatures?: ReadonlyArray<string> },\n ) => Promise<\n Array<{\n key: string | number\n value: Record<string, unknown>\n metadata?: unknown\n }>\n >\n loadResumeSnapshot: (\n collectionId: string,\n ctx?: {\n requiredIndexSignatures?: ReadonlyArray<string>\n includeRows?: boolean\n },\n ) => Promise<{\n rows: Array<{\n key: string | number\n value: Record<string, unknown>\n metadata?: unknown\n }>\n keySet?: PersistedKeySetEvidence\n collectionMetadata: Array<{ key: string; value: unknown }>\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n resetEpoch: number\n }>\n applyCommittedTx: (collectionId: string, tx: PersistedTx) => Promise<void>\n loadCollectionMetadata?: (\n collectionId: string,\n ) => Promise<Array<{ key: string; value: unknown }>>\n scanRows?: (\n collectionId: string,\n options?: PersistedRowScanOptions,\n ) => Promise<Array<PersistedScannedRow>>\n ensureIndex: (\n collectionId: string,\n signature: string,\n spec: PersistedIndexSpec,\n ) => Promise<void>\n markIndexRemoved?: (collectionId: string, signature: string) => Promise<void>\n getStreamPosition?: (collectionId: string) => Promise<{\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n }>\n /**\n * Runs one complete logical hydrate as a non-preemptible scheduler unit.\n * The callback must use the supplied unscheduled adapter for all nested\n * persistence work and must not retain it after the callback settles.\n */\n runInHydrationScope?: <T>(\n task: (adapter: HydrationPersistenceAdapter) => Promise<T>,\n ) => Promise<T>\n /** Schedule one regular operation before it acquires external writer locks. */\n runInRegularScope?: <T>(\n task: (adapter: HydrationPersistenceAdapter) => Promise<T>,\n ) => Promise<T>\n /** Whether hydration scopes currently enter a shared driver scheduler. */\n isHydrationScopeScheduled?: () => boolean\n}\n\nexport type HydrationPersistenceAdapter = PersistenceAdapter & {\n pullSince?: (\n collectionId: string,\n fromRowVersion: number,\n ) => Promise<PersistencePullSinceResult>\n}\n\nexport type { RemoteSubsetOwner } from './remote-subset-owner'\n\ntype SingleProcessRemoteSubsetAcquisition = {\n owner: RemoteSubsetOwner\n options: TransportedLoadSubsetOptions\n load: Promise<void>\n}\n\nexport interface SQLiteDriver {\n readonly [SQLITE_DRIVER_SHARED_LOGICAL_SCHEDULING_KEY]?: object\n /** Host-specific limit on bound parameters in one query, when lower than SQLite's. */\n readonly maxBoundParameters?: number\n exec: (sql: string) => Promise<void>\n query: <T>(\n sql: string,\n params?: ReadonlyArray<unknown>,\n ) => Promise<ReadonlyArray<T>>\n run: (sql: string, params?: ReadonlyArray<unknown>) => Promise<void>\n transaction: <T>(\n fn: (transactionDriver: SQLiteDriver) => Promise<T>,\n ) => Promise<T>\n transactionWithDriver?: <T>(\n fn: (transactionDriver: SQLiteDriver) => Promise<T>,\n ) => Promise<T>\n}\n\n/**\n * Forwards a driver's shared logical scheduling identity to a transparent\n * delegating driver before the wrapper is used by a persistence adapter.\n */\nexport function forwardSQLiteDriverSharedLogicalScheduling<\n TDriver extends SQLiteDriver,\n>(source: SQLiteDriver, wrapper: TDriver): TDriver {\n const key = source[SQLITE_DRIVER_SHARED_LOGICAL_SCHEDULING_KEY]\n if (key) {\n Object.defineProperty(\n wrapper,\n SQLITE_DRIVER_SHARED_LOGICAL_SCHEDULING_KEY,\n { value: key },\n )\n }\n return wrapper\n}\n\nexport interface PersistedCollectionCoordinator {\n getNodeId: () => string\n setAdapterForCollection?: (\n collectionId: string,\n adapter: PersistenceAdapter,\n ) => void\n subscribe: (\n collectionId: string,\n onMessage: (message: ProtocolEnvelope<unknown>) => void,\n ) => () => void\n publish: (collectionId: string, message: ProtocolEnvelope<unknown>) => void\n isLeader: (collectionId: string) => boolean\n ensureLeadership: (collectionId: string) => Promise<void>\n requestEnsureRemoteSubset: (\n collectionId: string,\n options: LoadSubsetOptions,\n ) => Promise<void>\n requestReleaseRemoteSubset: (\n collectionId: string,\n options: LoadSubsetOptions,\n ) => Promise<void>\n registerRemoteSubsetOwner: (\n collectionId: string,\n owner: RemoteSubsetOwner,\n ) => () => void\n /**\n * Requests leader-side index creation. The scoped adapter is leader-local\n * and is never serialized to a follower. `localEnsureCompleted` lets the\n * built-in leader avoid repeating successful local work.\n */\n requestEnsurePersistedIndex: (\n collectionId: string,\n signature: string,\n spec: PersistedIndexSpec,\n scopedAdapter?: HydrationPersistenceAdapter,\n localEnsureCompleted?: boolean,\n ) => Promise<void>\n requestApplyLocalMutations?: (\n collectionId: string,\n mutations: Array<PersistedMutationEnvelope>,\n ) => Promise<ApplyLocalMutationsResponse>\n requestApplyCommittedTx: (\n collectionId: string,\n tx: PersistedTx,\n scopedAdapter?: HydrationPersistenceAdapter,\n ) => Promise<ApplyCommittedTxResponse>\n /** The scoped adapter is leader-local and is never serialized to a follower. */\n pullSince?: (\n collectionId: string,\n fromRowVersion: number,\n scopedAdapter?: HydrationPersistenceAdapter,\n ) => Promise<PullSinceResponse>\n}\n\nexport interface PersistedCollectionPersistence {\n adapter: PersistenceAdapter\n coordinator?: PersistedCollectionCoordinator\n resolvePersistenceForCollection?: (options: {\n collectionId: string\n mode: PersistedCollectionMode\n schemaVersion?: number\n }) => PersistedCollectionPersistence\n resolvePersistenceForMode?: (\n mode: PersistedCollectionMode,\n ) => PersistedCollectionPersistence\n}\n\ntype PersistedResolvedPersistence = PersistedCollectionPersistence & {\n coordinator: PersistedCollectionCoordinator\n}\n\nexport type PersistedCollectionLeadershipState = {\n nodeId: string\n isLeader: boolean\n}\n\nexport interface PersistedCollectionUtils extends UtilsRecord {\n acceptMutations: (transaction: {\n mutations: Array<PendingMutation<Record<string, unknown>>>\n }) => Promise<void> | void\n getLeadershipState?: () => PersistedCollectionLeadershipState\n /** Hydrate once without acquiring a new ongoing subset lease. */\n forceReloadSubset?: (options: LoadSubsetOptions) => Promise<void> | void\n}\n\nclass PersistedReadinessTracker implements PersistedReadinessSource {\n private snapshot: PersistedReadinessSnapshot = { status: `loading` }\n private networkDeadlineAt: number | undefined\n private readonly listeners = new Set<() => void>()\n\n constructor(readonly networkTimeoutMs: number) {}\n\n getSnapshot = (): PersistedReadinessSnapshot => this.snapshot\n\n getOrStartNetworkDeadline = (): number => {\n return (this.networkDeadlineAt ??= Date.now() + this.networkTimeoutMs)\n }\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener)\n return () => this.listeners.delete(listener)\n }\n\n set(snapshot: PersistedReadinessSnapshot): void {\n const deadlineRestarted =\n snapshot.status === `loading` && this.networkDeadlineAt !== undefined\n if (deadlineRestarted) {\n this.networkDeadlineAt = Date.now() + this.networkTimeoutMs\n }\n if (\n this.snapshot.status === snapshot.status &&\n this.snapshot.error === snapshot.error &&\n !deadlineRestarted\n ) {\n return\n }\n this.snapshot = snapshot\n for (const listener of this.listeners) listener()\n }\n}\n\nexport type PersistedInitialRenderOptions = {\n strategy: `network-first`\n /** Time to prefer network before restored rows may render; defaults to 3s. */\n networkTimeoutMs?: number\n}\n\nconst DEFAULT_NETWORK_TIMEOUT_MS = 3_000\nconst MAX_TIMER_TIMEOUT_MS = 2_147_483_647\n\nfunction getNetworkTimeoutMs(\n initialRender: PersistedInitialRenderOptions | undefined,\n): number | undefined {\n if (initialRender === undefined) return undefined\n const strategy = (initialRender as { strategy: unknown }).strategy\n if (strategy !== `network-first`) {\n throw new InvalidPersistedCollectionConfigError(\n `initialRender.strategy must be \"network-first\"`,\n )\n }\n const timeoutMs = initialRender.networkTimeoutMs ?? DEFAULT_NETWORK_TIMEOUT_MS\n if (\n !Number.isFinite(timeoutMs) ||\n timeoutMs < 0 ||\n timeoutMs > MAX_TIMER_TIMEOUT_MS\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `initialRender.networkTimeoutMs must be between 0 and ${MAX_TIMER_TIMEOUT_MS}`,\n )\n }\n return timeoutMs\n}\n\nexport type PersistedSyncWrappedOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1 = never,\n TUtils extends UtilsRecord = UtilsRecord,\n> = CollectionConfig<T, TKey, TSchema, TUtils> & {\n sync: SyncConfig<T, TKey>\n persistence: PersistedCollectionPersistence\n schemaVersion?: number\n /** Opt into network-first rendering with a persisted fallback. */\n initialRender?: PersistedInitialRenderOptions\n}\n\nexport type PersistedLocalOnlyOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1 = never,\n TUtils extends UtilsRecord = UtilsRecord,\n> = Omit<CollectionConfig<T, TKey, TSchema, TUtils>, `sync`> & {\n persistence: PersistedCollectionPersistence\n schemaVersion?: number\n /** Opt into network-first rendering with a persisted fallback. */\n initialRender?: PersistedInitialRenderOptions\n}\n\ntype PersistedSyncOptionsResult<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n TUtils extends UtilsRecord,\n> = CollectionConfig<T, TKey, TSchema, TUtils> & {\n persistence: PersistedResolvedPersistence\n}\n\ntype PersistedLocalOnlyOptionsResult<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1,\n TUtils extends UtilsRecord,\n> = CollectionConfig<T, TKey, TSchema, TUtils & PersistedCollectionUtils> & {\n id: string\n persistence: PersistedResolvedPersistence\n utils: TUtils & PersistedCollectionUtils\n}\n\nconst REQUIRED_COORDINATOR_METHODS: ReadonlyArray<\n keyof Pick<\n PersistedCollectionCoordinator,\n | `getNodeId`\n | `subscribe`\n | `publish`\n | `isLeader`\n | `ensureLeadership`\n | `requestEnsureRemoteSubset`\n | `requestReleaseRemoteSubset`\n | `registerRemoteSubsetOwner`\n | `requestEnsurePersistedIndex`\n | `requestApplyCommittedTx`\n >\n> = [\n `getNodeId`,\n `subscribe`,\n `publish`,\n `isLeader`,\n `ensureLeadership`,\n `requestEnsureRemoteSubset`,\n `requestReleaseRemoteSubset`,\n `registerRemoteSubsetOwner`,\n `requestEnsurePersistedIndex`,\n `requestApplyCommittedTx`,\n]\n\nconst REQUIRED_ADAPTER_METHODS: ReadonlyArray<\n keyof Pick<\n PersistenceAdapter,\n `loadSubset` | `loadResumeSnapshot` | `applyCommittedTx` | `ensureIndex`\n >\n> = [`loadSubset`, `loadResumeSnapshot`, `applyCommittedTx`, `ensureIndex`]\n\nconst TARGETED_INVALIDATION_KEY_LIMIT = 128\nconst DEFAULT_DB_NAME = `tanstack-db`\nconst REMOTE_ENSURE_RETRY_DELAY_MS = 50\n\ntype SyncControlFns<T extends object, TKey extends string | number> = {\n begin: ((options?: { immediate?: boolean }) => void) | null\n write:\n | ((\n message:\n | { type: `insert`; value: T; metadata?: Record<string, unknown> }\n | { type: `update`; value: T; metadata?: Record<string, unknown> }\n | { type: `delete`; key: TKey },\n ) => void)\n | null\n commit: ((signal?: AbortSignal) => SyncAppliedReceipt) | null\n truncate: (() => void) | null\n metadata: SyncMetadataApi<TKey> | null\n markError: ((error: unknown) => void) | null\n}\n\n/**\n * Phase-0 coordinator implementation for single-process runtimes.\n * It satisfies the coordinator contract without cross-process transport.\n */\nexport class SingleProcessCoordinator implements PersistedCollectionCoordinator {\n private readonly nodeId: string\n private readonly collectionAdapters = new Map<string, PersistenceAdapter>()\n private readonly remoteSubsetOwners = new Map<string, RemoteSubsetOwner>()\n private readonly remoteSubsetAcquisitions = new Map<\n string,\n Map<LoadSubsetOptions, SingleProcessRemoteSubsetAcquisition>\n >()\n\n constructor(nodeId: string = safeRandomUUID()) {\n this.nodeId = nodeId\n }\n\n public getNodeId(): string {\n return this.nodeId\n }\n\n public subscribe(): () => void {\n return () => {}\n }\n\n public publish(): void {}\n\n public isLeader(): boolean {\n return true\n }\n\n public async ensureLeadership(): Promise<void> {}\n\n public async requestEnsureRemoteSubset(\n collectionId: string,\n options: LoadSubsetOptions,\n ): Promise<void> {\n const transported = toTransportedLoadSubsetOptions(options)\n const localOptions = toProcessLocalLoadSubsetOptions(options, transported)\n const owner = this.remoteSubsetOwners.get(collectionId)\n if (!owner) {\n throw new InvalidPersistedCollectionConfigError(\n `SingleProcessCoordinator has no remote subset owner configured for collection \"${collectionId}\"`,\n )\n }\n let acquisitions = this.remoteSubsetAcquisitions.get(collectionId)\n if (!acquisitions) {\n acquisitions = new Map()\n this.remoteSubsetAcquisitions.set(collectionId, acquisitions)\n }\n const existing = acquisitions.get(options)\n if (existing) {\n await existing.load\n return\n }\n\n let resolveLoad!: () => void\n let rejectLoad!: (error: unknown) => void\n const load = new Promise<void>((resolve, reject) => {\n resolveLoad = resolve\n rejectLoad = reject\n })\n acquisitions.set(options, { owner, options: localOptions, load })\n try {\n const ownerLoad = owner(localOptions)\n void Promise.resolve(ownerLoad).then(resolveLoad, (error) => {\n reportRemoteSubsetOwnerError(owner, error)\n rejectLoad(error)\n })\n } catch (error) {\n reportRemoteSubsetOwnerError(owner, error)\n rejectLoad(error)\n }\n await load\n }\n\n public async requestReleaseRemoteSubset(\n collectionId: string,\n options: LoadSubsetOptions,\n ): Promise<void> {\n const acquisitions = this.remoteSubsetAcquisitions.get(collectionId)\n const acquisition = acquisitions?.get(options)\n if (!acquisition) return\n acquisitions!.delete(options)\n if (acquisitions!.size === 0) {\n this.remoteSubsetAcquisitions.delete(collectionId)\n }\n try {\n await acquisition.load\n } catch {\n // Calling the owner transferred the lease even when its load rejected.\n }\n await unloadRemoteSubsetOwner(acquisition.owner, acquisition.options)\n }\n\n public registerRemoteSubsetOwner(\n collectionId: string,\n owner: RemoteSubsetOwner,\n ): () => void {\n if (this.remoteSubsetOwners.has(collectionId)) {\n throw new DuplicateRemoteSubsetOwnerError(collectionId)\n }\n this.remoteSubsetOwners.set(collectionId, owner)\n return () => {\n if (this.remoteSubsetOwners.get(collectionId) !== owner) return\n const acquisitions = this.remoteSubsetAcquisitions.get(collectionId)\n this.remoteSubsetAcquisitions.delete(collectionId)\n this.remoteSubsetOwners.delete(collectionId)\n for (const acquisition of acquisitions?.values() ?? []) {\n void (async () => {\n try {\n await acquisition.load\n } catch {\n // Calling the owner transferred the lease even when its load rejected.\n }\n await unloadRemoteSubsetOwner(owner, acquisition.options)\n })().catch(() => undefined)\n }\n }\n }\n\n public async requestEnsurePersistedIndex(): Promise<void> {}\n\n public setAdapterForCollection(\n collectionId: string,\n adapter: PersistenceAdapter,\n ): void {\n this.collectionAdapters.set(collectionId, adapter)\n }\n\n public async requestApplyCommittedTx(\n collectionId: string,\n tx: PersistedTx,\n ): Promise<ApplyCommittedTxResponse> {\n const adapter = this.collectionAdapters.get(collectionId)\n if (!adapter) {\n throw new InvalidPersistedCollectionConfigError(\n `SingleProcessCoordinator has no persistence adapter configured for collection \"${collectionId}\"`,\n )\n }\n\n try {\n await adapter.applyCommittedTx(collectionId, tx)\n } catch (error) {\n throw toPersistedCollectionDurabilityError(collectionId, error)\n }\n return {\n type: `rpc:applyCommittedTx:res`,\n rpcId: safeRandomUUID(),\n ok: true,\n term: tx.term,\n seq: tx.seq,\n latestRowVersion: tx.rowVersion,\n }\n }\n\n public pullSince(): Promise<PullSinceResponse> {\n return Promise.resolve({\n type: `rpc:pullSince:res`,\n rpcId: safeRandomUUID(),\n ok: true,\n latestTerm: 1,\n latestSeq: 0,\n latestRowVersion: 0,\n requiresFullReload: false,\n changedKeys: [],\n deletedKeys: [],\n deltas: [],\n })\n }\n}\n\nexport function validatePersistedCollectionCoordinator(\n coordinator: PersistedCollectionCoordinator,\n): void {\n for (const method of REQUIRED_COORDINATOR_METHODS) {\n if (typeof coordinator[method] !== `function`) {\n throw new InvalidPersistedCollectionCoordinatorError(method)\n }\n }\n}\n\nfunction validatePersistenceAdapter(adapter: PersistenceAdapter): void {\n for (const method of REQUIRED_ADAPTER_METHODS) {\n if (typeof adapter[method] !== `function`) {\n throw new InvalidPersistenceAdapterError(method)\n }\n }\n}\n\nfunction resolvePersistence(\n persistence: PersistedCollectionPersistence,\n collectionId: string,\n): PersistedResolvedPersistence {\n validatePersistenceAdapter(persistence.adapter)\n\n const coordinator = persistence.coordinator ?? new SingleProcessCoordinator()\n if (coordinator instanceof SingleProcessCoordinator) {\n coordinator.setAdapterForCollection(collectionId, persistence.adapter)\n }\n validatePersistedCollectionCoordinator(coordinator)\n\n return {\n ...persistence,\n coordinator,\n }\n}\n\nfunction resolvePersistenceForMode(\n persistence: PersistedCollectionPersistence,\n mode: PersistedCollectionMode,\n collectionId: string,\n): PersistedResolvedPersistence {\n const modeSpecificPersistence = persistence.resolvePersistenceForMode?.(mode)\n return resolvePersistence(\n modeSpecificPersistence ?? persistence,\n collectionId,\n )\n}\n\nfunction resolvePersistenceForCollection(\n persistence: PersistedCollectionPersistence,\n options: {\n collectionId: string\n mode: PersistedCollectionMode\n schemaVersion?: number\n },\n): PersistedResolvedPersistence {\n const collectionSpecificPersistence =\n persistence.resolvePersistenceForCollection?.(options)\n if (collectionSpecificPersistence) {\n return resolvePersistence(\n collectionSpecificPersistence,\n options.collectionId,\n )\n }\n\n return resolvePersistenceForMode(\n persistence,\n options.mode,\n options.collectionId,\n )\n}\n\nfunction hasOwnSyncKey(options: object): options is { sync: unknown } {\n return Object.prototype.hasOwnProperty.call(options, `sync`)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === `object` && value !== null\n}\n\nfunction isValidSyncConfig(value: unknown): value is SyncConfig<object> {\n if (!isRecord(value)) {\n return false\n }\n\n return typeof value.sync === `function`\n}\n\nexport type PersistedCollectionMode = `sync-present` | `sync-absent`\ntype PersistedMode = PersistedCollectionMode\n\ntype NormalizedSyncOperation<T extends object, TKey extends string | number> =\n | {\n type: `update`\n key: TKey\n value: T\n metadata?: Record<string, unknown>\n }\n | {\n type: `delete`\n key: TKey\n value: T\n }\n\ntype BufferedSyncTransaction<T extends object, TKey extends string | number> = {\n operations: Array<NormalizedSyncOperation<T, TKey>>\n partialUpdateOperationIndexes: Set<number>\n rowMetadataWrites: Map<\n TKey,\n { type: `set`; value: unknown } | { type: `delete` }\n >\n collectionMetadataWrites: Map<\n string,\n { type: `set`; value: unknown } | { type: `delete` }\n >\n deferredHydrationMetadataDeleteKeys: Set<TKey>\n hydrationContext?: { suppliedRowKeys: Set<TKey> }\n hydrationSequence?: number\n truncate: boolean\n internal: boolean\n lifecycleGeneration: number\n beginOptions?: { immediate?: boolean }\n expectedResumeGenerationOwner?: symbol\n signal?: AbortSignal\n prependHydrationRows: (\n rows: Array<{ key: TKey; value: T; metadata?: unknown }>,\n ) => void\n applyToCollection: () => SyncAppliedReceipt\n shouldFailStopOnAbort?: () => boolean\n resolveApplied?: () => void\n rejectApplied?: (error: unknown) => void\n}\n\ntype OpenSyncTransaction<T extends object, TKey extends string | number> = Omit<\n BufferedSyncTransaction<T, TKey>,\n `applyToCollection` | `prependHydrationRows` | `shouldFailStopOnAbort`\n> & {\n signal?: AbortSignal\n applicationReceipt?: SyncAppliedReceipt\n operationKeys: Set<TKey>\n queuedBecauseHydrating: boolean\n hasDependentSuccessor: boolean\n publicationAdmissionWaiters?: Set<{\n resolve: () => void\n reject: (error: unknown) => void\n }>\n terminalFailure?: { error: unknown }\n}\n\ntype SyncWriteNormalization<T extends object, TKey extends string | number> = {\n operation: NormalizedSyncOperation<T, TKey>\n}\n\nclass ApplyMutex {\n private queue: Promise<void> = Promise.resolve()\n private pending = 0\n\n reserve(): {\n run: <T>(task: () => Promise<T> | T) => Promise<T>\n } {\n const runImmediately = this.pending === 0\n const predecessor = this.queue\n this.pending++\n\n let releaseReservation!: () => void\n const reservation = new Promise<void>((resolve) => {\n releaseReservation = resolve\n })\n this.queue = runImmediately\n ? reservation\n : predecessor.then(() => reservation)\n\n let used = false\n return {\n run: <T>(task: () => Promise<T> | T): Promise<T> => {\n if (used) {\n return Promise.reject(\n new Error(`an apply-mutex reservation can only run once`),\n )\n }\n used = true\n\n let taskPromise: Promise<T>\n if (runImmediately) {\n try {\n taskPromise = Promise.resolve(task())\n } catch (error) {\n taskPromise = Promise.reject(error)\n }\n } else {\n taskPromise = predecessor.then(() => task())\n }\n const markComplete = () => {\n this.pending--\n releaseReservation()\n }\n void taskPromise.then(markComplete, markComplete)\n return taskPromise\n },\n }\n }\n\n run<T>(task: () => Promise<T> | T): Promise<T> {\n return this.reserve().run(task)\n }\n}\n\nfunction toStableSerializable(value: unknown): unknown {\n if (value == null) {\n return value\n }\n\n switch (typeof value) {\n case `string`:\n case `number`:\n case `boolean`:\n return value\n case `bigint`:\n return serializeSQLiteBigInt(value)\n case `function`:\n case `symbol`:\n case `undefined`:\n return undefined\n }\n\n if (value instanceof Date) {\n return value.toISOString()\n }\n\n if (Array.isArray(value)) {\n return value\n .map((entry) => toStableSerializable(entry))\n .filter((entry) => entry !== undefined)\n }\n\n if (value instanceof Set) {\n return Array.from(value)\n .map((entry) => toStableSerializable(entry))\n .filter((entry) => entry !== undefined)\n .sort((left, right) => {\n const leftSerialized = JSON.stringify(left)\n const rightSerialized = JSON.stringify(right)\n return leftSerialized < rightSerialized\n ? -1\n : leftSerialized > rightSerialized\n ? 1\n : 0\n })\n }\n\n if (value instanceof Map) {\n return Array.from(value.entries())\n .map(([key, mapValue]) => ({\n key: toStableSerializable(key),\n value: toStableSerializable(mapValue),\n }))\n .filter((entry) => entry.key !== undefined && entry.value !== undefined)\n .sort((left, right) => {\n const leftSerialized = JSON.stringify(left.key)\n const rightSerialized = JSON.stringify(right.key)\n return leftSerialized < rightSerialized\n ? -1\n : leftSerialized > rightSerialized\n ? 1\n : 0\n })\n }\n\n const record = value as Record<string, unknown>\n const orderedKeys = Object.keys(record).sort((left, right) =>\n left < right ? -1 : left > right ? 1 : 0,\n )\n const serializableRecord: Record<string, unknown> = {}\n for (const key of orderedKeys) {\n const serializableValue = toStableSerializable(record[key])\n if (serializableValue !== undefined) {\n serializableRecord[key] = serializableValue\n }\n }\n return serializableRecord\n}\n\nfunction stableSerialize(value: unknown): string {\n return JSON.stringify(toStableSerializable(value) ?? null)\n}\n\nfunction normalizeSyncFnResult(result: void | (() => void) | SyncConfigRes) {\n if (typeof result === `function`) {\n return { cleanup: result } satisfies SyncConfigRes\n }\n\n if (result === undefined) {\n return {} satisfies SyncConfigRes\n }\n\n return result\n}\n\nfunction isTxCommittedPayload(payload: unknown): payload is TxCommitted {\n if (!isRecord(payload) || payload.type !== `tx:committed`) {\n return false\n }\n\n if (\n typeof payload.term !== `number` ||\n typeof payload.seq !== `number` ||\n typeof payload.txId !== `string` ||\n typeof payload.latestRowVersion !== `number` ||\n typeof payload.requiresFullReload !== `boolean`\n ) {\n return false\n }\n\n if (payload.requiresFullReload) {\n return true\n }\n\n return (\n Array.isArray(payload.changedRows) &&\n Array.isArray(payload.deletedKeys) &&\n (payload.rowMetadataMutations === undefined ||\n Array.isArray(payload.rowMetadataMutations)) &&\n (payload.collectionMetadataMutations === undefined ||\n Array.isArray(payload.collectionMetadataMutations))\n )\n}\n\nfunction isCollectionResetPayload(\n payload: unknown,\n): payload is CollectionReset {\n return (\n isRecord(payload) &&\n payload.type === `collection:reset` &&\n typeof payload.schemaVersion === `number` &&\n typeof payload.resetEpoch === `number`\n )\n}\n\nfunction toPersistedMutationEnvelope(\n mutation: PendingMutation<Record<string, unknown>>,\n): PersistedMutationEnvelope {\n const key = mutation.key as string | number\n const value =\n mutation.type === `delete`\n ? (mutation.original as Record<string, unknown>)\n : mutation.modified\n\n // PendingMutation.metadata belongs to the optimistic transaction and is\n // consumed by mutation handlers. It must not overwrite persisted row metadata.\n return {\n mutationId: mutation.mutationId,\n type: mutation.type,\n key,\n value,\n }\n}\n\nclass PersistedCollectionRuntime<\n T extends object,\n TKey extends string | number,\n> {\n private readonly applyMutex = new ApplyMutex()\n private readonly activeSubsets = new Map<string, LoadSubsetOptions>()\n private activeHydrationContext: { suppliedRowKeys: Set<TKey> } | undefined\n private hydrationSequence = 0\n // An unscheduled startup read may finish after a coordinator reset publishes.\n private resetSequence = 0\n private readonly pendingRemoteSubsetEnsures = new Map<\n string,\n LoadSubsetOptions\n >()\n private readonly queuedHydrationTransactions: Array<\n BufferedSyncTransaction<T, TKey>\n > = []\n private readonly queuedTxCommitted: Array<{\n txCommitted: TxCommitted\n lifecycleGeneration: number\n }> = []\n private readonly requestIds = new WeakMap<LoadSubsetOptions, string>()\n private readonly hydratedDemands = new Set<string | undefined>()\n\n private collection: Collection<T, TKey, PersistedCollectionUtils> | null =\n null\n private syncControls: SyncControlFns<T, TKey> = {\n begin: null,\n write: null,\n commit: null,\n truncate: null,\n metadata: null,\n markError: null,\n }\n private startupMetadataPromise: Promise<void> | null = null\n private startPromise: Promise<void> | null = null\n private hasAttemptedStartup = false\n private resumeBaselinePromise: Promise<void> | null = null\n private resumeCertificationPromise: Promise<void> | null = null\n private persistedKeySetEvidence: PersistedKeySetEvidence | undefined\n private persistedResumeGeneration: PersistedResumeGeneration | undefined\n private resumeGenerationOwner = Symbol(`persisted resume generation owner`)\n private lifecycleGeneration = 0\n private internalApplyDepth = 0\n private sourcePublicationWaitDepth = 0\n private appliedReceiptSequence = 0\n private syncErrorReported = false\n private reportedSyncError: unknown\n private readonly pendingAppliedReceipts = new Map<number, Promise<void>>()\n private hydratingGeneration: number | null = null\n private terminalFailure:\n | { lifecycleGeneration: number; error: unknown }\n | undefined\n private coordinatorUnsubscribe: (() => void) | null = null\n private remoteSubsetOwnerUnsubscribe: (() => void) | null = null\n private indexAddedUnsubscribe: (() => void) | null = null\n private indexRemovedUnsubscribe: (() => void) | null = null\n private remoteEnsureRetryTimer: ReturnType<typeof setTimeout> | null = null\n private nextRequestId = 0\n private startupSettled = false\n private sourceTruncateGeneration = 0\n\n private latestTerm = 0\n private latestSeq = 0\n private latestRowVersion = 0\n private localTerm = 1\n private localSeq = 0\n private localRowVersion = 0\n\n constructor(\n private readonly mode: PersistedMode,\n private readonly collectionId: string,\n private readonly persistence: PersistedResolvedPersistence,\n private readonly syncMode: `eager` | `on-demand`,\n private readonly dbName: string,\n private readonly persistedReadiness?: PersistedReadinessTracker,\n ) {}\n\n setSyncControls(syncControls: SyncControlFns<T, TKey>): void {\n this.advanceLifecycle()\n this.syncErrorReported = false\n this.reportedSyncError = undefined\n\n const commit = syncControls.commit\n this.syncControls = {\n ...syncControls,\n commit: commit\n ? (signal) => this.trackAppliedReceipt(commit(signal))\n : null,\n }\n }\n\n reportSyncError(error: unknown): unknown {\n const markError = this.syncControls.markError\n if (this.syncErrorReported) return this.reportedSyncError\n if (!markError) return error\n\n this.syncErrorReported = true\n this.reportedSyncError = error\n try {\n markError(error)\n } catch {\n // Reporting must not replace the original asynchronous failure.\n }\n return error\n }\n\n registerRemoteSubsetOwner(owner: RemoteSubsetOwner): void {\n this.remoteSubsetOwnerUnsubscribe?.()\n this.remoteSubsetOwnerUnsubscribe =\n this.persistence.coordinator.registerRemoteSubsetOwner(\n this.collectionId,\n owner,\n )\n }\n\n private trackAppliedReceipt(receipt: SyncAppliedReceipt): SyncAppliedReceipt {\n const sequence = ++this.appliedReceiptSequence\n if (receipt === true) {\n return true\n }\n this.pendingAppliedReceipts.set(sequence, receipt)\n const removeReceipt = () => this.pendingAppliedReceipts.delete(sequence)\n void receipt.then(removeReceipt, removeReceipt)\n return receipt\n }\n\n private async waitForAppliedReceiptsAfter(cursor: number): Promise<void> {\n await Promise.all(\n Array.from(this.pendingAppliedReceipts, ([sequence, receipt]) =>\n sequence > cursor ? receipt : undefined,\n ),\n )\n }\n\n private clearSyncControls(): void {\n this.syncControls = {\n begin: null,\n write: null,\n commit: null,\n truncate: null,\n metadata: null,\n markError: null,\n }\n }\n\n isHydratingNow(): boolean {\n return this.hydratingGeneration === this.lifecycleGeneration\n }\n\n getActiveHydrationContext(): { suppliedRowKeys: Set<TKey> } | undefined {\n return this.activeHydrationContext\n }\n\n getHydrationSequence(): number {\n return this.hydrationSequence\n }\n\n getCurrentTerminalFailure(): { error: unknown } | undefined {\n const failure = this.terminalFailure\n return failure?.lifecycleGeneration === this.lifecycleGeneration\n ? failure\n : undefined\n }\n\n getLifecycleGeneration(): number {\n return this.lifecycleGeneration\n }\n\n private throwIfLifecycleReplaced(lifecycleGeneration: number): void {\n if (lifecycleGeneration !== this.lifecycleGeneration) {\n throw new SyncTransactionAbortedError()\n }\n }\n\n private throwIfTerminal(): void {\n const failure = this.getCurrentTerminalFailure()\n if (failure) throw failure.error\n }\n\n private markTerminalFailure(\n error: unknown,\n lifecycleGeneration = this.lifecycleGeneration,\n ): unknown {\n if (lifecycleGeneration !== this.lifecycleGeneration) {\n return error\n }\n\n const existing = this.getCurrentTerminalFailure()\n if (existing) {\n return existing.error\n }\n\n this.terminalFailure = { lifecycleGeneration, error }\n this.persistedReadiness?.set({ status: `error`, error })\n this.pendingRemoteSubsetEnsures.clear()\n this.queuedTxCommitted.length = 0\n if (this.remoteEnsureRetryTimer !== null) {\n clearTimeout(this.remoteEnsureRetryTimer)\n this.remoteEnsureRetryTimer = null\n }\n this.rejectQueuedHydrationTransactions(error)\n this.reportSyncError(error)\n return error\n }\n\n isApplyingInternally(): boolean {\n return this.internalApplyDepth > 0\n }\n\n setCollection(\n collection: Collection<T, TKey, PersistedCollectionUtils>,\n ): void {\n if (this.collection === collection) {\n return\n }\n\n this.collection = collection\n this.attachCoordinatorSubscription()\n }\n\n getLeadershipState(): PersistedCollectionLeadershipState {\n return {\n nodeId: this.persistence.coordinator.getNodeId(),\n isLeader: this.persistence.coordinator.isLeader(this.collectionId),\n }\n }\n\n private runInHydrationScope<TResult>(\n task: (adapter: HydrationPersistenceAdapter) => Promise<TResult>,\n adapter: HydrationPersistenceAdapter = this.persistence.adapter,\n ): Promise<TResult> {\n if (adapter.runInHydrationScope) {\n return adapter.runInHydrationScope(task)\n }\n return Promise.resolve().then(() => task(adapter))\n }\n\n async ensureStarted(): Promise<void> {\n this.throwIfTerminal()\n if (this.startPromise) {\n return this.startPromise\n }\n\n const lifecycleGeneration = this.lifecycleGeneration\n const isRestart = this.hasAttemptedStartup\n this.hasAttemptedStartup = true\n let resolveStartupMetadata!: () => void\n let rejectStartupMetadata!: (error: unknown) => void\n this.startupMetadataPromise = new Promise<void>((resolve, reject) => {\n resolveStartupMetadata = resolve\n rejectStartupMetadata = reject\n })\n void this.startupMetadataPromise.catch(() => undefined)\n\n this.startPromise = (async () => {\n const loadStartupMetadata = async (\n adapter: HydrationPersistenceAdapter,\n ) => {\n if (lifecycleGeneration !== this.lifecycleGeneration) {\n resolveStartupMetadata()\n return false\n }\n\n try {\n await this.loadStartupMetadataInternal(lifecycleGeneration, adapter)\n return lifecycleGeneration === this.lifecycleGeneration\n } catch (error) {\n rejectStartupMetadata(error)\n throw error\n }\n }\n\n let startup:\n | {\n appliedCursor: number | undefined\n indexBootstrapSnapshot: Array<CollectionIndexMetadata>\n completedLocalIndexSignatures: Set<string>\n }\n | undefined\n const scheduleStartupAsOneHydrate =\n this.persistence.adapter.runInHydrationScope !== undefined &&\n (!isRestart ||\n (this.persistence.adapter.isHydrationScopeScheduled?.() ?? true))\n if (scheduleStartupAsOneHydrate) {\n startup = await this.applyMutex.run(async () => {\n const result = await this.runInHydrationScope(async (adapter) => {\n if (!(await loadStartupMetadata(adapter))) return undefined\n return this.startInternal(\n lifecycleGeneration,\n adapter,\n resolveStartupMetadata,\n )\n })\n if (lifecycleGeneration === this.lifecycleGeneration) {\n await this.flushQueuedTxCommittedUnsafe()\n }\n return result\n })\n } else {\n // Preserve the existing unscheduled-adapter lifecycle contract: a\n // replacement upstream may start while stale hydration is settling.\n if (await loadStartupMetadata(this.persistence.adapter)) {\n if (this.persistence.adapter.isHydrationScopeScheduled?.()) {\n startup = await this.applyMutex.run(async () => {\n const result = await this.runInHydrationScope((adapter) =>\n this.startInternal(\n lifecycleGeneration,\n adapter,\n resolveStartupMetadata,\n ),\n )\n if (lifecycleGeneration === this.lifecycleGeneration) {\n await this.flushQueuedTxCommittedUnsafe()\n }\n return result\n })\n } else {\n startup = await this.startInternal(\n lifecycleGeneration,\n this.persistence.adapter,\n resolveStartupMetadata,\n )\n if (lifecycleGeneration === this.lifecycleGeneration) {\n await this.flushQueuedTxCommittedUnsafe()\n }\n }\n }\n }\n if (\n startup !== undefined &&\n lifecycleGeneration === this.lifecycleGeneration\n ) {\n await this.requestCoordinatorPersistedIndexes(\n startup.indexBootstrapSnapshot,\n startup.completedLocalIndexSignatures,\n )\n if (\n startup.appliedCursor !== undefined &&\n lifecycleGeneration === this.lifecycleGeneration\n ) {\n await this.waitForAppliedReceiptsAfter(startup.appliedCursor)\n }\n }\n if (lifecycleGeneration === this.lifecycleGeneration) {\n this.startupSettled = true\n this.persistedReadiness?.set({ status: `ready` })\n }\n resolveStartupMetadata()\n })().catch((error) => {\n rejectStartupMetadata(error)\n throw this.markTerminalFailure(error, lifecycleGeneration)\n })\n void this.startPromise.catch(() => undefined)\n return this.startPromise\n }\n\n ensureResumeBaselineHydrated(): Promise<void> {\n this.throwIfTerminal()\n if (this.resumeBaselinePromise) {\n return this.resumeBaselinePromise\n }\n\n const lifecycleGeneration = this.lifecycleGeneration\n this.resumeBaselinePromise = (async () => {\n await this.ensureStarted()\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n if (this.syncMode !== `on-demand`) return\n\n const appliedCursor = await this.applyMutex.run(async () => {\n const result = await this.runInHydrationScope((adapter) =>\n this.hydrateBaseline(lifecycleGeneration, adapter),\n )\n if (lifecycleGeneration === this.lifecycleGeneration) {\n await this.flushQueuedTxCommittedUnsafe()\n }\n return result\n })\n if (\n appliedCursor !== undefined &&\n lifecycleGeneration === this.lifecycleGeneration\n ) {\n await this.waitForAppliedReceiptsAfter(appliedCursor)\n }\n })().catch((error) => {\n throw this.markTerminalFailure(error, lifecycleGeneration)\n })\n return this.resumeBaselinePromise\n }\n\n ensureResumeBaselineCertified(): Promise<void> {\n if (this.resumeCertificationPromise) {\n return this.resumeCertificationPromise\n }\n\n const lifecycleGeneration = this.lifecycleGeneration\n this.resumeCertificationPromise = (async () => {\n await this.ensureStarted()\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n\n const snapshot = await this.persistence.adapter.loadResumeSnapshot(\n this.collectionId,\n {\n requiredIndexSignatures: this.getRequiredIndexSignatures(),\n includeRows: false,\n },\n )\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n this.bindResumeSnapshotEvidence(snapshot)\n })()\n return this.resumeCertificationPromise\n }\n\n getKeySetEvidence(): PersistedKeySetEvidence | undefined {\n return this.persistedKeySetEvidence\n }\n\n getResumeGenerationOwner(): symbol {\n return this.resumeGenerationOwner\n }\n\n private async hydrateBaseline(\n lifecycleGeneration: number,\n adapter: HydrationPersistenceAdapter,\n ): Promise<number | undefined> {\n if (lifecycleGeneration !== this.lifecycleGeneration) return undefined\n\n // The baseline shares the unconstrained demand key. Its lease is never\n // released, and every reload rereads it, so that coverage stays valid.\n const baseline = {}\n this.activeSubsets.set(this.getSubsetKey(baseline), baseline)\n const appliedCursor = this.appliedReceiptSequence\n await this.hydrateSubsetUnsafe(\n baseline,\n {\n requestRemoteEnsure: false,\n lifecycleGeneration,\n bindKeySetEvidence: true,\n },\n adapter,\n )\n return lifecycleGeneration === this.lifecycleGeneration\n ? appliedCursor\n : undefined\n }\n\n async ensureStartupMetadataLoaded(): Promise<void> {\n this.throwIfTerminal()\n if (this.startupMetadataPromise) {\n return this.startupMetadataPromise\n }\n\n void this.ensureStarted()\n return this.startupMetadataPromise!\n }\n\n private async startInternal(\n lifecycleGeneration: number,\n adapter: HydrationPersistenceAdapter,\n onStartupMetadataLoaded: () => void,\n ): Promise<\n | {\n appliedCursor: number | undefined\n indexBootstrapSnapshot: Array<CollectionIndexMetadata>\n completedLocalIndexSignatures: Set<string>\n }\n | undefined\n > {\n if (lifecycleGeneration !== this.lifecycleGeneration) return undefined\n\n const indexBootstrapSnapshot = this.collection?.getIndexMetadata() ?? []\n this.attachIndexLifecycleListeners()\n const completedLocalIndexSignatures = await this.bootstrapPersistedIndexes(\n indexBootstrapSnapshot,\n adapter,\n )\n if (lifecycleGeneration !== this.lifecycleGeneration) return undefined\n\n // Let the source run only once the startup hydrate is about to begin.\n // Its first transaction must bind to that hydrate's sequence, not the\n // sequence before index bootstrap yielded.\n onStartupMetadataLoaded()\n const appliedCursor =\n this.syncMode !== `on-demand`\n ? await this.hydrateBaseline(lifecycleGeneration, adapter)\n : undefined\n return lifecycleGeneration === this.lifecycleGeneration\n ? {\n appliedCursor,\n indexBootstrapSnapshot,\n completedLocalIndexSignatures,\n }\n : undefined\n }\n\n private async loadStartupMetadataInternal(\n lifecycleGeneration: number,\n adapter: HydrationPersistenceAdapter,\n ): Promise<void> {\n const snapshot = await adapter.loadResumeSnapshot(this.collectionId, {\n includeRows: false,\n })\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n this.persistedResumeGeneration = this.getResumeSnapshotGeneration(snapshot)\n this.persistedKeySetEvidence = snapshot.keySet\n this.observeStreamPosition(\n snapshot.latestTerm,\n snapshot.latestSeq,\n snapshot.latestRowVersion,\n )\n const applied = this.replaceCollectionMetadataSnapshot(\n snapshot.collectionMetadata,\n )\n if (applied !== true) await applied\n }\n\n private async loadCollectionMetadataSnapshot(\n adapter: HydrationPersistenceAdapter,\n ): Promise<Array<{ key: string; value: unknown }>> {\n if (!adapter.loadCollectionMetadata) {\n return []\n }\n\n return adapter.loadCollectionMetadata(this.collectionId)\n }\n\n private replaceCollectionMetadataSnapshot(\n collectionMetadata: Array<{ key: string; value: unknown }>,\n ): SyncAppliedReceipt {\n if (\n !this.syncControls.begin ||\n !this.syncControls.commit ||\n !this.syncControls.metadata\n ) {\n return true\n }\n\n const nextMetadata = new Map(\n collectionMetadata.map(({ key, value }) => [key, value]),\n )\n const currentKeys = this.syncControls.metadata.collection\n .list()\n .map(({ key }) => key)\n\n return this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n\n currentKeys.forEach((key) => {\n if (!nextMetadata.has(key)) {\n this.syncControls.metadata?.collection.delete(key)\n }\n })\n\n nextMetadata.forEach((value, key) => {\n this.syncControls.metadata?.collection.set(key, value)\n })\n\n return this.syncControls.commit?.() ?? true\n })\n }\n\n async loadSubset(\n options: LoadSubsetOptions,\n upstreamLoadSubset?: LoadSubsetFn,\n ): Promise<void> {\n this.throwIfTerminal()\n const lifecycleGeneration = this.lifecycleGeneration\n const subsetKey = this.getSubsetKey(options)\n const truncateGeneration = this.sourceTruncateGeneration\n const routeRemoteDemandDuringHydration =\n this.canRouteRemoteDemandThroughCoordinator()\n this.activeSubsets.set(subsetKey, options)\n const appliedCursor = this.appliedReceiptSequence\n try {\n await this.applyMutex.run(async () => {\n try {\n await this.runInHydrationScope((adapter) =>\n this.hydrateSubsetUnsafe(\n options,\n {\n requestRemoteEnsure:\n this.mode === `sync-present` &&\n !routeRemoteDemandDuringHydration,\n lifecycleGeneration,\n requestLocalLoadFailure: true,\n rejectBufferedReplayFailure: true,\n },\n adapter,\n ),\n )\n } finally {\n if (\n lifecycleGeneration === this.lifecycleGeneration &&\n !this.getCurrentTerminalFailure()\n ) {\n await this.flushQueuedTxCommittedUnsafe()\n }\n }\n })\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n await this.waitForAppliedReceiptsAfter(appliedCursor)\n } catch (error) {\n if (this.activeSubsets.get(subsetKey) === options) {\n this.activeSubsets.delete(subsetKey)\n }\n throw error\n }\n\n if (\n options.signal?.aborted ||\n this.activeSubsets.get(this.getSubsetKey(options)) !== options\n ) {\n return\n }\n\n if (this.canRouteRemoteDemandThroughCoordinator()) {\n try {\n await this.persistence.coordinator.requestEnsureRemoteSubset(\n this.collectionId,\n options,\n )\n } catch (error) {\n if (\n options.signal?.aborted ||\n (typeof error === `object` &&\n error !== null &&\n `name` in error &&\n error.name === `AbortError`)\n ) {\n this.pendingRemoteSubsetEnsures.delete(this.getSubsetKey(options))\n throw error\n }\n this.queueRemoteSubsetEnsure(options)\n throw error\n }\n return\n }\n\n if (\n truncateGeneration === this.sourceTruncateGeneration &&\n this.activeSubsets.get(subsetKey) === options\n ) {\n this.hydratedDemands.add(getLoadSubsetDemandKey(options))\n }\n\n if (upstreamLoadSubset) {\n try {\n await upstreamLoadSubset(options)\n } catch (error) {\n this.noteUpstreamLoadFailure(options, error)\n throw error\n }\n }\n }\n\n loadHydratedSubset(\n options: LoadSubsetOptions,\n upstreamLoadSubset?: LoadSubsetFn,\n ): true | Promise<void> | undefined {\n const failure = this.getCurrentTerminalFailure()\n if (failure) return Promise.reject(failure.error)\n if (\n !this.startupSettled ||\n this.isHydratingNow() ||\n this.canRouteRemoteDemandThroughCoordinator() ||\n options.refetch === true ||\n !this.hydratedDemands.has(getLoadSubsetDemandKey(options))\n ) {\n return\n }\n\n this.activeSubsets.set(this.getSubsetKey(options), options)\n let result: true | Promise<void>\n try {\n result = upstreamLoadSubset?.(options) ?? true\n } catch (error) {\n this.noteUpstreamLoadFailure(options, error)\n return Promise.reject(error)\n }\n if (result === true) {\n return true\n }\n\n return result.then(\n () => {\n this.queueRemoteSubsetEnsure(options)\n },\n (error: unknown) => {\n this.noteUpstreamLoadFailure(options, error)\n throw error\n },\n )\n }\n\n private noteUpstreamLoadFailure(\n options: LoadSubsetOptions,\n error: unknown,\n ): void {\n if (\n options.signal?.aborted ||\n (typeof error === `object` &&\n error !== null &&\n `name` in error &&\n error.name === `AbortError`)\n ) {\n this.pendingRemoteSubsetEnsures.delete(this.getSubsetKey(options))\n return\n }\n console.warn(`Failed to trigger remote subset load:`, error)\n this.queueRemoteSubsetEnsure(options)\n }\n\n noteSourceTruncate(): void {\n this.sourceTruncateGeneration++\n this.hydratedDemands.clear()\n }\n\n unloadSubset(\n options: LoadSubsetOptions,\n upstreamUnloadSubset?: (options: LoadSubsetOptions) => void,\n ): void {\n const subsetKey = this.getSubsetKey(options)\n this.activeSubsets.delete(subsetKey)\n this.pendingRemoteSubsetEnsures.delete(subsetKey)\n const demandKey = getLoadSubsetDemandKey(options)\n const stillActive = Array.from(this.activeSubsets.values()).some(\n (active) => getLoadSubsetDemandKey(active) === demandKey,\n )\n if (!stillActive) this.hydratedDemands.delete(demandKey)\n if (this.mode === `sync-present`) {\n void this.persistence.coordinator\n .requestReleaseRemoteSubset(this.collectionId, options)\n .catch((error) => {\n this.reportSyncError(error)\n })\n }\n if (upstreamUnloadSubset) {\n try {\n const result = (\n upstreamUnloadSubset as unknown as (\n options: LoadSubsetOptions,\n ) => unknown\n )(options)\n void Promise.resolve(result).catch((error) => {\n this.reportSyncError(error)\n })\n } catch (error) {\n this.reportSyncError(error)\n }\n }\n }\n\n async forceReloadSubset(options: LoadSubsetOptions): Promise<void> {\n this.throwIfTerminal()\n const lifecycleGeneration = this.lifecycleGeneration\n // A one-shot refresh does not acquire an enduring subscription lease.\n await this.applyMutex.run(async () => {\n await this.runInHydrationScope((adapter) =>\n this.hydrateSubsetUnsafe(\n options,\n {\n requestRemoteEnsure: false,\n lifecycleGeneration,\n rejectBufferedReplayFailure: true,\n },\n adapter,\n ),\n )\n if (lifecycleGeneration === this.lifecycleGeneration) {\n await this.flushQueuedTxCommittedUnsafe()\n }\n })\n }\n\n queueHydrationBufferedTransaction(\n transaction: BufferedSyncTransaction<T, TKey>,\n ): void {\n const failure = this.getCurrentTerminalFailure()\n if (failure) {\n transaction.rejectApplied?.(failure.error)\n return\n }\n this.queuedHydrationTransactions.push(transaction)\n }\n\n applyHydrationBufferedTransaction(\n transaction: BufferedSyncTransaction<T, TKey>,\n ): Promise<void> {\n const failure = this.getCurrentTerminalFailure()\n if (failure) return Promise.reject(failure.error)\n if (\n transaction.beginOptions?.immediate &&\n this.sourcePublicationWaitDepth > 0\n ) {\n return Promise.reject(\n new InvalidPersistedCollectionConfigError(\n `immediate persisted source replay cannot enter while an earlier source publication is waiting`,\n ),\n )\n }\n return this.applyMutex.run(async () => {\n await this.applyBufferedSyncTransactionUnsafe(transaction)\n })\n }\n\n normalizeSyncWriteMessage(\n message: ChangeMessageOrDeleteKeyMessage<T, TKey>,\n ): SyncWriteNormalization<T, TKey> {\n if (!this.collection) {\n throw new InvalidPersistedCollectionConfigError(\n `collection must be attached before sync writes are processed`,\n )\n }\n\n if (`key` in message) {\n const key = message.key\n const previousValue = this.collection.get(key) ?? ({} as T)\n\n return {\n operation: {\n type: `delete`,\n key,\n value: previousValue,\n },\n }\n }\n\n // Handle delete messages that include the full value instead of just a key\n // (e.g. from queryCollectionOptions which sends { type: 'delete', value: oldItem })\n if (message.type === `delete`) {\n const key = this.collection.getKeyFromItem(message.value)\n const previousValue = this.collection.get(key) ?? message.value\n\n return {\n operation: {\n type: `delete`,\n key,\n value: previousValue,\n },\n }\n }\n\n const key = this.collection.getKeyFromItem(message.value)\n return {\n operation: {\n type: `update`,\n key,\n value: message.value,\n metadata: message.metadata,\n },\n }\n }\n\n async persistAndConfirmCollectionMutations(\n mutations: Array<PendingMutation<T>>,\n lifecycleGeneration = this.lifecycleGeneration,\n ): Promise<void> {\n this.throwIfTerminal()\n this.throwIfLifecycleReplaced(lifecycleGeneration)\n if (mutations.length === 0) {\n return\n }\n\n try {\n await this.applyMutex.run(async () => {\n // Startup metadata establishes the durable term/sequence boundary. A\n // mutation admitted before it resolves must wait rather than allocate a\n // default position that can collide with an already-applied transaction.\n await this.ensureStartupMetadataLoaded()\n this.throwIfLifecycleReplaced(lifecycleGeneration)\n const acceptedMutationIds = await this.persistCollectionMutationsUnsafe(\n mutations,\n lifecycleGeneration,\n )\n this.throwIfLifecycleReplaced(lifecycleGeneration)\n const acceptedMutationIdSet = new Set(acceptedMutationIds)\n const acceptedMutations = mutations.filter((mutation) =>\n acceptedMutationIdSet.has(mutation.mutationId),\n )\n\n if (acceptedMutations.length !== mutations.length) {\n throw new Error(\n `persistence coordinator accepted ${acceptedMutations.length} of ${mutations.length} mutations; partial acceptance is not supported`,\n )\n }\n\n try {\n await this.confirmMutationsSyncUnsafe(acceptedMutations)\n } catch (error) {\n throw this.markTerminalFailure(error, lifecycleGeneration)\n }\n })\n } catch (error) {\n if (error instanceof PersistedCollectionDurabilityError) {\n throw this.markTerminalFailure(error, lifecycleGeneration)\n }\n throw error\n }\n }\n\n async acceptTransactionMutations(transaction: {\n mutations: Array<PendingMutation<Record<string, unknown>>>\n }): Promise<void> {\n this.throwIfTerminal()\n const collectionMutations = this.filterMutationsForCollection(\n transaction.mutations,\n )\n\n if (collectionMutations.length === 0) {\n return\n }\n\n await this.persistAndConfirmCollectionMutations(collectionMutations)\n }\n\n cleanup(): Promise<void> {\n this.advanceLifecycle()\n const remoteReleases: Array<Promise<void>> = []\n const failures: Array<unknown> = []\n const attempt = (callback: () => void): void => {\n try {\n callback()\n } catch (error) {\n failures.push(error)\n }\n }\n\n if (this.mode === `sync-present`) {\n for (const options of this.activeSubsets.values()) {\n attempt(() => {\n remoteReleases.push(\n this.persistence.coordinator\n .requestReleaseRemoteSubset(this.collectionId, options)\n .catch((error) => {\n this.reportSyncError(error)\n }),\n )\n })\n }\n }\n\n attempt(() => this.coordinatorUnsubscribe?.())\n this.coordinatorUnsubscribe = null\n\n attempt(() => this.remoteSubsetOwnerUnsubscribe?.())\n this.remoteSubsetOwnerUnsubscribe = null\n\n attempt(() => this.indexAddedUnsubscribe?.())\n this.indexAddedUnsubscribe = null\n\n attempt(() => this.indexRemovedUnsubscribe?.())\n this.indexRemovedUnsubscribe = null\n\n if (this.remoteEnsureRetryTimer !== null) {\n clearTimeout(this.remoteEnsureRetryTimer)\n this.remoteEnsureRetryTimer = null\n }\n\n this.pendingRemoteSubsetEnsures.clear()\n this.activeSubsets.clear()\n this.hydratedDemands.clear()\n for (const transaction of this.queuedHydrationTransactions) {\n transaction.rejectApplied?.(new SyncTransactionAbortedError())\n }\n this.queuedHydrationTransactions.length = 0\n this.queuedTxCommitted.length = 0\n this.clearSyncControls()\n this.collection = null\n return Promise.all(remoteReleases).then(() => {\n if (failures.length === 1) throw failures[0]\n if (failures.length > 1) {\n throw new AggregateError(failures, `Persistence cleanup failed`, {\n cause: failures[0],\n })\n }\n })\n }\n\n private advanceLifecycle(): void {\n this.lifecycleGeneration++\n this.persistedReadiness?.set({ status: `loading` })\n this.startupSettled = false\n this.hydratedDemands.clear()\n this.startupMetadataPromise = null\n this.startPromise = null\n this.resumeBaselinePromise = null\n this.terminalFailure = undefined\n this.resumeCertificationPromise = null\n this.persistedKeySetEvidence = undefined\n this.persistedResumeGeneration = undefined\n this.resumeGenerationOwner = Symbol(`persisted resume generation owner`)\n }\n\n private withInternalApply<TResult>(task: () => TResult): TResult {\n this.internalApplyDepth++\n try {\n return task()\n } finally {\n this.internalApplyDepth--\n }\n }\n\n private getRequiredIndexSignatures(): ReadonlyArray<string> {\n if (!this.collection) {\n return []\n }\n\n return this.collection\n .getIndexMetadata()\n .map((metadata) => metadata.signature)\n }\n\n private loadSubsetRowsUnsafe(\n options: LoadSubsetOptions,\n adapter: HydrationPersistenceAdapter,\n ): Promise<Array<{ key: TKey; value: T; metadata?: unknown }>> {\n return adapter.loadSubset(this.collectionId, options, {\n requiredIndexSignatures: this.getRequiredIndexSignatures(),\n }) as Promise<Array<{ key: TKey; value: T; metadata?: unknown }>>\n }\n\n private async scanPersistedRowsUnsafe(\n options?: PersistedRowScanOptions,\n ): Promise<Array<PersistedScannedRow<T, TKey>>> {\n if (!this.persistence.adapter.scanRows) {\n return []\n }\n\n return this.persistence.adapter.scanRows(\n this.collectionId,\n options,\n ) as Promise<Array<PersistedScannedRow<T, TKey>>>\n }\n\n async scanPersistedRows(\n options?: PersistedRowScanOptions,\n ): Promise<Array<PersistedScannedRow<T, TKey>>> {\n this.throwIfTerminal()\n return this.applyMutex.run(() => this.scanPersistedRowsUnsafe(options))\n }\n\n private async hydrateSubsetUnsafe(\n options: LoadSubsetOptions,\n config: {\n requestRemoteEnsure: boolean\n lifecycleGeneration: number\n bindKeySetEvidence?: boolean\n requestLocalLoadFailure?: boolean\n rejectBufferedReplayFailure?: boolean\n },\n adapter: HydrationPersistenceAdapter,\n ): Promise<void> {\n let rowsLoaded = false\n let replayFailure: { reason: unknown } | undefined\n const resetSequence = this.resetSequence\n this.hydrationSequence++\n const hydrationContext = { suppliedRowKeys: new Set<TKey>() }\n this.activeHydrationContext = hydrationContext\n try {\n this.throwIfTerminal()\n this.hydratingGeneration = config.lifecycleGeneration\n try {\n let rows: Array<{ key: TKey; value: T; metadata?: unknown }>\n if (config.bindKeySetEvidence) {\n const snapshot = await adapter.loadResumeSnapshot(this.collectionId, {\n requiredIndexSignatures: this.getRequiredIndexSignatures(),\n includeRows: true,\n })\n rows = snapshot.rows as Array<{\n key: TKey\n value: T\n metadata?: unknown\n }>\n if (config.lifecycleGeneration !== this.lifecycleGeneration) return\n if (resetSequence !== this.resetSequence) return\n this.bindResumeSnapshotEvidence(snapshot)\n } else {\n rows = await this.loadSubsetRowsUnsafe(options, adapter)\n }\n rowsLoaded = true\n if (config.lifecycleGeneration !== this.lifecycleGeneration) return\n if (resetSequence !== this.resetSequence) return\n\n if (\n !config.bindKeySetEvidence ||\n this.persistedKeySetEvidence?.status !== `incompatible`\n ) {\n for (const row of rows) {\n hydrationContext.suppliedRowKeys.add(row.key)\n }\n const applied = this.applyRowsToCollection(rows)\n if (applied !== true) await applied\n }\n } finally {\n if (\n this.activeHydrationContext === hydrationContext &&\n this.hydratingGeneration === config.lifecycleGeneration\n ) {\n this.hydratingGeneration = null\n }\n }\n\n if (config.lifecycleGeneration !== this.lifecycleGeneration) return\n replayFailure = await this.flushQueuedHydrationTransactionsUnsafe(adapter)\n if (config.lifecycleGeneration !== this.lifecycleGeneration) return\n\n if (config.requestRemoteEnsure && !replayFailure) {\n this.queueRemoteSubsetEnsure(options)\n }\n } catch (error) {\n if (config.requestLocalLoadFailure && !rowsLoaded) {\n // Keep admitting source work to the hydration queue while recovery\n // reconstructs any persisted baseline required by partial updates.\n // The failed subset itself owns no rows, so recovery must evaluate\n // each queued transaction against the durable snapshot at its exact\n // FIFO cut instead of treating the snapshot as a successful load.\n this.hydratingGeneration = config.lifecycleGeneration\n try {\n await this.recoverBufferedTransactionsAfterLocalLoadFailureUnsafe(\n config.lifecycleGeneration,\n adapter,\n )\n } catch (baselineError) {\n const terminalError = this.markTerminalFailure(\n baselineError,\n config.lifecycleGeneration,\n )\n throw terminalError\n } finally {\n if (this.hydratingGeneration === config.lifecycleGeneration) {\n this.hydratingGeneration = null\n }\n }\n throw error\n }\n throw this.markTerminalFailure(error, config.lifecycleGeneration)\n } finally {\n if (this.activeHydrationContext === hydrationContext) {\n this.activeHydrationContext = undefined\n }\n }\n if (replayFailure && config.rejectBufferedReplayFailure) {\n throw replayFailure.reason\n }\n }\n\n private async recoverBufferedTransactionsAfterLocalLoadFailureUnsafe(\n lifecycleGeneration: number,\n adapter: HydrationPersistenceAdapter,\n ): Promise<void> {\n let snapshotRows:\n | Map<TKey, { key: TKey; value: T; metadata?: unknown }>\n | undefined\n type RecoveryPresence = `present` | `absent` | `unknown`\n const recoveredPresence = new Map<TKey, RecoveryPresence>()\n let snapshotInvalidatedByTruncate = false\n\n while (this.queuedHydrationTransactions.length > 0) {\n const transaction = this.queuedHydrationTransactions.shift()\n if (!transaction) continue\n\n try {\n this.throwIfLifecycleReplaced(lifecycleGeneration)\n const baselineRows = new Map<\n TKey,\n { key: TKey; value: T; metadata?: unknown }\n >()\n const transactionPresence = new Map<TKey, RecoveryPresence>()\n const transactionStartsWithTruncate = transaction.truncate\n const getPresence = (key: TKey): RecoveryPresence => {\n const known = transactionPresence.get(key)\n if (known !== undefined) return known\n if (transactionStartsWithTruncate) {\n transactionPresence.set(key, `absent`)\n return `absent`\n }\n const recovered = recoveredPresence.get(key)\n if (recovered !== undefined) {\n transactionPresence.set(key, recovered)\n return recovered\n }\n const present =\n this.collection?._hasHydratedKey(key) === true\n ? `present`\n : snapshotInvalidatedByTruncate\n ? `absent`\n : `unknown`\n transactionPresence.set(key, present)\n return present\n }\n\n if (!transaction.signal?.aborted) {\n for (const [index, operation] of transaction.operations.entries()) {\n const key = operation.key\n if (\n operation.type === `update` &&\n transaction.partialUpdateOperationIndexes.has(index) &&\n getPresence(key) === `unknown`\n ) {\n if (snapshotRows === undefined) {\n const snapshot = await adapter.loadResumeSnapshot(\n this.collectionId,\n {\n requiredIndexSignatures: this.getRequiredIndexSignatures(),\n includeRows: true,\n },\n )\n this.throwIfLifecycleReplaced(lifecycleGeneration)\n if (transaction.signal?.aborted) break\n snapshotRows = new Map(\n (\n snapshot.rows as Array<{\n key: TKey\n value: T\n metadata?: unknown\n }>\n ).map((row) => [row.key, row]),\n )\n }\n const baseline = snapshotRows.get(key)\n if (baseline === undefined) {\n transactionPresence.set(key, `absent`)\n } else {\n baselineRows.set(key, baseline)\n transactionPresence.set(key, `present`)\n }\n }\n\n transactionPresence.set(\n key,\n operation.type === `delete` ? `absent` : `present`,\n )\n }\n\n if (baselineRows.size > 0) {\n // Fold the durable baseline into the dependent reservation. It\n // must never become a separately observable publication: the\n // partial source value and its unseen fields are one atomic row.\n if (!transaction.signal?.aborted) {\n transaction.prependHydrationRows([...baselineRows.values()])\n }\n }\n }\n\n const transactionOutcome =\n await this.applyBufferedSyncTransactionUnsafe(transaction, adapter)\n if (transactionOutcome.applied) {\n if (transaction.truncate) {\n snapshotInvalidatedByTruncate = true\n recoveredPresence.clear()\n }\n for (const operation of transaction.operations) {\n recoveredPresence.set(\n operation.key,\n operation.type === `delete` ? `absent` : `present`,\n )\n }\n }\n } catch (error) {\n transaction.rejectApplied?.(error)\n for (const abandoned of this.queuedHydrationTransactions) {\n abandoned.rejectApplied?.(error)\n }\n this.queuedHydrationTransactions.length = 0\n throw error\n }\n }\n }\n\n private rejectQueuedHydrationTransactions(error: unknown): void {\n for (const transaction of this.queuedHydrationTransactions) {\n transaction.rejectApplied?.(error)\n }\n this.queuedHydrationTransactions.length = 0\n }\n\n private applyRowsToCollection(\n rows: Array<{ key: TKey; value: T; metadata?: unknown }>,\n ): SyncAppliedReceipt {\n if (\n !this.syncControls.begin ||\n !this.syncControls.write ||\n !this.syncControls.commit\n ) {\n return true\n }\n\n return this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n\n for (const row of rows) {\n if (this.collection?._hasHydratedKey(row.key)) {\n continue\n }\n this.syncControls.write?.({\n type: `update`,\n value: row.value,\n metadata: row.metadata as Record<string, unknown> | undefined,\n })\n }\n\n return this.syncControls.commit?.() ?? true\n })\n }\n\n private getResumeSnapshotGeneration(snapshot: {\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n resetEpoch: number\n }): PersistedResumeGeneration {\n return {\n latestTerm: snapshot.latestTerm,\n latestSeq: snapshot.latestSeq,\n latestRowVersion: snapshot.latestRowVersion,\n resetEpoch: snapshot.resetEpoch,\n }\n }\n\n private isExpectedResumeGeneration(\n generation: PersistedResumeGeneration,\n ): boolean {\n const expected = this.persistedResumeGeneration\n return (\n expected !== undefined &&\n expected.latestTerm === generation.latestTerm &&\n expected.latestSeq === generation.latestSeq &&\n expected.latestRowVersion === generation.latestRowVersion &&\n expected.resetEpoch === generation.resetEpoch\n )\n }\n\n private bindResumeSnapshotEvidence(snapshot: {\n keySet?: PersistedKeySetEvidence\n latestTerm: number\n latestSeq: number\n latestRowVersion: number\n resetEpoch: number\n }): void {\n const generation = this.getResumeSnapshotGeneration(snapshot)\n const previousEvidenceStatus = this.persistedKeySetEvidence?.status\n // An uncertified sync baseline never authorized a persisted resume cursor,\n // so a later atomic snapshot may replace its evidence while the source\n // performs the already-required fresh snapshot. Local-only collections\n // have no remote cursor to fence; a managed write may advance a still-\n // consistent SQLite baseline during startup. Incompatible evidence remains\n // fail-closed in both modes.\n const mayAcceptUnownedGeneration =\n (this.mode === `sync-present` &&\n previousEvidenceStatus !== `consistent` &&\n previousEvidenceStatus !== `incompatible`) ||\n (this.mode === `sync-absent` &&\n previousEvidenceStatus === `consistent` &&\n snapshot.keySet?.status === `consistent`)\n this.observeStreamPosition(\n snapshot.latestTerm,\n snapshot.latestSeq,\n snapshot.latestRowVersion,\n )\n this.persistedKeySetEvidence =\n this.isExpectedResumeGeneration(generation) || mayAcceptUnownedGeneration\n ? snapshot.keySet\n : { status: `incompatible` }\n }\n\n private replaceCollectionSnapshot(\n rows: Array<{ key: TKey; value: T; metadata?: unknown }>,\n collectionMetadata: Array<{ key: string; value: unknown }>,\n ): SyncAppliedReceipt {\n if (\n !this.syncControls.begin ||\n !this.syncControls.write ||\n !this.syncControls.commit ||\n !this.syncControls.metadata\n ) {\n return true\n }\n\n const nextMetadata = new Map(\n collectionMetadata.map(({ key, value }) => [key, value]),\n )\n const currentKeys = this.syncControls.metadata.collection\n .list()\n .map(({ key }) => key)\n\n return this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n this.syncControls.truncate?.()\n\n for (const row of rows) {\n this.syncControls.write?.({\n type: `update`,\n value: row.value,\n metadata: row.metadata as Record<string, unknown> | undefined,\n })\n }\n\n currentKeys.forEach((key) => {\n if (!nextMetadata.has(key)) {\n this.syncControls.metadata?.collection.delete(key)\n }\n })\n\n nextMetadata.forEach((value, key) => {\n this.syncControls.metadata?.collection.set(key, value)\n })\n\n return this.syncControls.commit?.() ?? true\n })\n }\n\n private async flushQueuedHydrationTransactionsUnsafe(\n adapter: HydrationPersistenceAdapter,\n ): Promise<{ reason: unknown } | undefined> {\n let operationFailure: { reason: unknown } | undefined\n while (this.queuedHydrationTransactions.length > 0) {\n const transaction = this.queuedHydrationTransactions.shift()\n if (!transaction) {\n continue\n }\n try {\n const outcome = await this.applyBufferedSyncTransactionUnsafe(\n transaction,\n adapter,\n )\n operationFailure ??= outcome.hydrationFailure\n } catch (error) {\n transaction.rejectApplied?.(error)\n for (const abandoned of this.queuedHydrationTransactions) {\n abandoned.rejectApplied?.(error)\n }\n this.queuedHydrationTransactions.length = 0\n throw error\n }\n }\n return operationFailure\n }\n\n private async applyBufferedSyncTransactionUnsafe(\n transaction: BufferedSyncTransaction<T, TKey>,\n scopedAdapter?: HydrationPersistenceAdapter,\n ): Promise<{\n applied: boolean\n hydrationFailure?: { reason: unknown }\n }> {\n this.throwIfTerminal()\n this.throwIfLifecycleReplaced(transaction.lifecycleGeneration)\n const abortedBeforeApplication = transaction.signal?.aborted === true\n let abortedDuringApplication = false\n let applicationReturned = false\n\n try {\n const applied = transaction.internal\n ? this.withInternalApply(transaction.applyToCollection)\n : transaction.applyToCollection()\n applicationReturned = true\n abortedDuringApplication = transaction.signal?.aborted === true\n if (applied !== true) {\n this.sourcePublicationWaitDepth++\n try {\n await applied\n } finally {\n this.sourcePublicationWaitDepth--\n }\n }\n this.throwIfLifecycleReplaced(transaction.lifecycleGeneration)\n\n if (!transaction.internal) {\n await this.persistAndBroadcastExternalSyncTransactionUnsafe(\n transaction,\n scopedAdapter,\n )\n }\n transaction.resolveApplied?.()\n return { applied: true }\n } catch (error) {\n if (!applicationReturned) {\n abortedDuringApplication = transaction.signal?.aborted === true\n }\n const aborted =\n transaction.signal?.aborted ||\n error instanceof SyncTransactionAbortedError\n const shouldFailStop =\n aborted && transaction.shouldFailStopOnAbort?.() === true\n const terminalError = this.classifyBufferedTransactionFailure(\n transaction,\n error,\n )\n transaction.rejectApplied?.(terminalError)\n if (aborted && !shouldFailStop && transaction.rejectApplied) {\n return {\n applied: false,\n hydrationFailure:\n !abortedBeforeApplication && abortedDuringApplication\n ? { reason: terminalError }\n : undefined,\n }\n }\n throw terminalError\n }\n }\n\n private classifyBufferedTransactionFailure(\n transaction: BufferedSyncTransaction<T, TKey>,\n error: unknown,\n ): unknown {\n if (error instanceof PersistedCollectionDurabilityError) {\n return this.markTerminalFailure(error, transaction.lifecycleGeneration)\n }\n const aborted =\n transaction.signal?.aborted ||\n error instanceof SyncTransactionAbortedError\n if (aborted && transaction.shouldFailStopOnAbort?.() !== true) {\n return error\n }\n return this.markTerminalFailure(error, transaction.lifecycleGeneration)\n }\n\n private async persistAndBroadcastExternalSyncTransactionUnsafe(\n transaction: BufferedSyncTransaction<T, TKey>,\n scopedAdapter?: HydrationPersistenceAdapter,\n ): Promise<void> {\n if (transaction.internal) {\n return\n }\n\n this.throwIfLifecycleReplaced(transaction.lifecycleGeneration)\n if (\n !transaction.truncate &&\n transaction.operations.length === 0 &&\n transaction.rowMetadataWrites.size === 0 &&\n transaction.collectionMetadataWrites.size === 0\n ) {\n return\n }\n\n const streamPosition = this.nextLocalStreamPosition()\n const tx = this.createPersistedTxFromOperations(transaction, streamPosition)\n const response = await this.persistence.coordinator.requestApplyCommittedTx(\n this.collectionId,\n tx,\n // A hydration-scoped adapter is already inside the shared scheduler.\n // Ordinary source commits pass no scoped adapter so the coordinator\n // enters that scheduler before taking the database-wide writer lock.\n scopedAdapter,\n )\n if (!response.ok) {\n if (response.code === `PERSISTENCE_ERROR`) {\n const error = new PersistedCollectionDurabilityError(\n `Failed to durably persist collection \"${this.collectionId}\": ${response.error}`,\n {\n cause: response,\n code: response.sourceCode ?? response.code,\n path: response.path,\n },\n )\n throw error\n }\n throw new Error(\n `failed to apply external sync transaction through coordinator: ${response.error}`,\n )\n }\n if (transaction.lifecycleGeneration !== this.lifecycleGeneration) return\n this.observeStreamPosition(\n response.term,\n response.seq,\n response.latestRowVersion,\n )\n if (\n transaction.expectedResumeGenerationOwner ===\n this.resumeGenerationOwner &&\n this.persistedResumeGeneration !== undefined\n ) {\n this.persistedResumeGeneration = {\n ...this.persistedResumeGeneration,\n latestTerm: response.term,\n latestSeq: response.seq,\n latestRowVersion: response.latestRowVersion,\n }\n }\n }\n\n private async applyCommittedTx(\n tx: PersistedTx,\n lifecycleGeneration: number,\n ): Promise<void> {\n this.throwIfTerminal()\n this.throwIfLifecycleReplaced(lifecycleGeneration)\n try {\n await this.persistence.adapter.applyCommittedTx(this.collectionId, tx)\n } catch (error) {\n throw this.markTerminalFailure(\n toPersistedCollectionDurabilityError(this.collectionId, error),\n lifecycleGeneration,\n )\n }\n this.throwIfLifecycleReplaced(lifecycleGeneration)\n }\n\n private createPersistedTxFromOperations(\n transaction: BufferedSyncTransaction<T, TKey>,\n streamPosition: { term: number; seq: number; rowVersion: number },\n ): PersistedTx {\n return {\n txId: safeRandomUUID(),\n term: streamPosition.term,\n seq: streamPosition.seq,\n rowVersion: streamPosition.rowVersion,\n truncate: transaction.truncate,\n mutations: transaction.operations.map((operation) =>\n operation.type === `update`\n ? {\n type: `update` as const,\n key: operation.key,\n value: operation.value as Record<string, unknown>,\n }\n : {\n type: `delete` as const,\n key: operation.key,\n value: operation.value as Record<string, unknown>,\n },\n ),\n rowMetadataMutations: Array.from(\n transaction.rowMetadataWrites.entries(),\n ).map(([key, metadataWrite]) =>\n metadataWrite.type === `delete`\n ? { type: `delete` as const, key: key }\n : {\n type: `set` as const,\n key: key,\n value: metadataWrite.value,\n },\n ),\n collectionMetadataMutations: Array.from(\n transaction.collectionMetadataWrites.entries(),\n ).map(([key, metadataWrite]) =>\n metadataWrite.type === `delete`\n ? { type: `delete`, key }\n : { type: `set`, key, value: metadataWrite.value },\n ),\n }\n }\n\n private createPersistedTxFromMutations(\n mutations: Array<PendingMutation<T>>,\n streamPosition: { term: number; seq: number; rowVersion: number },\n ): PersistedTx {\n return {\n txId: safeRandomUUID(),\n term: streamPosition.term,\n seq: streamPosition.seq,\n rowVersion: streamPosition.rowVersion,\n mutations: mutations.map((mutation) => {\n if (mutation.type === `delete`) {\n return {\n type: `delete` as const,\n key: mutation.key as string | number,\n value: mutation.original as Record<string, unknown>,\n }\n }\n\n if (mutation.type === `insert`) {\n return {\n type: `insert` as const,\n key: mutation.key as string | number,\n value: mutation.modified as Record<string, unknown>,\n }\n }\n\n return {\n type: `update` as const,\n key: mutation.key as string | number,\n value: mutation.modified as Record<string, unknown>,\n }\n }),\n }\n }\n\n private async confirmMutationsSyncUnsafe(\n mutations: Array<PendingMutation<T>>,\n ): Promise<void> {\n if (\n !this.syncControls.begin ||\n !this.syncControls.write ||\n !this.syncControls.commit\n ) {\n return\n }\n\n const applied = this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n\n for (const mutation of mutations) {\n if (mutation.type === `delete`) {\n this.syncControls.write?.({\n type: `delete`,\n key: mutation.key as TKey,\n })\n } else {\n this.syncControls.write?.({\n type: `update`,\n value: mutation.modified,\n })\n }\n }\n\n return this.syncControls.commit?.() ?? true\n })\n\n if (applied !== true) {\n await applied\n }\n }\n\n private filterMutationsForCollection(\n mutations: Array<PendingMutation<Record<string, unknown>>>,\n ): Array<PendingMutation<T>> {\n const collection = this.collection\n return mutations.filter((mutation) => {\n if (collection) {\n return mutation.collection === collection\n }\n return mutation.collection.id === this.collectionId\n }) as Array<PendingMutation<T>>\n }\n\n private async persistCollectionMutationsUnsafe(\n mutations: Array<PendingMutation<T>>,\n lifecycleGeneration: number,\n ): Promise<Array<string>> {\n this.throwIfLifecycleReplaced(lifecycleGeneration)\n // When a coordinator with requestApplyLocalMutations is available, always\n // route through it — even on the leader tab. This ensures the coordinator's\n // seq/rowVersion counters stay in sync with actual writes. Without this,\n // the leader's direct-path writes would increment the runtime's localSeq\n // but leave the coordinator's state.latestSeq stale, causing seq collisions\n // when follower RPCs later arrive.\n if (this.persistence.coordinator.requestApplyLocalMutations) {\n const envelopeMutations = mutations.map((mutation) =>\n toPersistedMutationEnvelope(\n mutation as unknown as PendingMutation<Record<string, unknown>>,\n ),\n )\n\n const response =\n await this.persistence.coordinator.requestApplyLocalMutations(\n this.collectionId,\n envelopeMutations,\n )\n\n this.throwIfLifecycleReplaced(lifecycleGeneration)\n\n if (!response.ok) {\n if (response.code === `PERSISTENCE_ERROR`) {\n const error = new PersistedCollectionDurabilityError(\n `Failed to durably persist collection \"${this.collectionId}\": ${response.error}`,\n {\n cause: response,\n code: response.sourceCode ?? response.code,\n path: response.path,\n },\n )\n throw error\n }\n throw new Error(\n `failed to apply local mutations through coordinator: ${response.error}`,\n )\n }\n\n this.observeStreamPosition(\n response.term,\n response.seq,\n response.latestRowVersion,\n )\n\n const uniqueAcceptedMutationIds = Array.from(\n new Set(response.acceptedMutationIds),\n )\n const submittedMutationIds = new Set(\n mutations.map((mutation) => mutation.mutationId),\n )\n const hasUnknownAcceptedMutationId = uniqueAcceptedMutationIds.some(\n (mutationId) => !submittedMutationIds.has(mutationId),\n )\n\n if (hasUnknownAcceptedMutationId) {\n throw new Error(\n `persistence coordinator returned unknown mutation ids in applyLocalMutations response`,\n )\n }\n\n return uniqueAcceptedMutationIds\n }\n\n // Fallback: no coordinator with requestApplyLocalMutations (e.g.\n // SingleProcessCoordinator). Apply directly and broadcast.\n const streamPosition = this.nextLocalStreamPosition()\n const tx = this.createPersistedTxFromMutations(mutations, streamPosition)\n await this.applyCommittedTx(tx, lifecycleGeneration)\n\n this.throwIfLifecycleReplaced(lifecycleGeneration)\n\n this.publishTxCommittedEvent(\n this.createTxCommittedPayload({\n term: tx.term,\n seq: tx.seq,\n txId: tx.txId,\n latestRowVersion: tx.rowVersion,\n changedRows: mutations\n .filter((mutation) => mutation.type !== `delete`)\n .map((mutation) => ({\n key: mutation.key as string | number,\n value: mutation.modified as Record<string, unknown>,\n })),\n deletedKeys: mutations\n .filter((mutation) => mutation.type === `delete`)\n .map((mutation) => mutation.key as string | number),\n rowMetadataMutations: tx.rowMetadataMutations,\n collectionMetadataMutations: tx.collectionMetadataMutations,\n }),\n )\n\n return mutations.map((mutation) => mutation.mutationId)\n }\n\n private createTxCommittedPayload(args: {\n term: number\n seq: number\n txId: string\n latestRowVersion: number\n changedRows: Array<{ key: string | number; value: Record<string, unknown> }>\n deletedKeys: Array<string | number>\n rowMetadataMutations?: Array<PersistedRowMetadataMutation>\n collectionMetadataMutations?: Array<PersistedCollectionMetadataMutation>\n hasMetadataChanges?: boolean\n requiresFullReload?: boolean\n }): TxCommitted {\n const rowMetadataMutations = args.rowMetadataMutations ?? []\n const collectionMetadataMutations = args.collectionMetadataMutations ?? []\n const requiresFullReload =\n args.requiresFullReload === true ||\n args.changedRows.length +\n args.deletedKeys.length +\n rowMetadataMutations.length +\n collectionMetadataMutations.length >\n TARGETED_INVALIDATION_KEY_LIMIT\n\n if (requiresFullReload) {\n return {\n type: `tx:committed`,\n term: args.term,\n seq: args.seq,\n txId: args.txId,\n latestRowVersion: args.latestRowVersion,\n requiresFullReload: true,\n }\n }\n\n return {\n type: `tx:committed`,\n term: args.term,\n seq: args.seq,\n txId: args.txId,\n latestRowVersion: args.latestRowVersion,\n requiresFullReload: false,\n changedRows: args.changedRows,\n deletedKeys: args.deletedKeys,\n rowMetadataMutations,\n collectionMetadataMutations,\n }\n }\n\n private publishTxCommittedEvent(txCommitted: TxCommitted): void {\n this.observeStreamPosition(\n txCommitted.term,\n txCommitted.seq,\n txCommitted.latestRowVersion,\n )\n\n const envelope: ProtocolEnvelope<TxCommitted> = {\n v: 1,\n dbName: this.dbName,\n collectionId: this.collectionId,\n senderId: this.persistence.coordinator.getNodeId(),\n ts: Date.now(),\n payload: txCommitted,\n }\n this.persistence.coordinator.publish(this.collectionId, envelope)\n }\n\n private observeStreamPosition(\n term: number,\n seq: number,\n rowVersion: number,\n ): void {\n if (\n term > this.latestTerm ||\n (term === this.latestTerm && seq > this.latestSeq)\n ) {\n this.latestTerm = term\n this.latestSeq = seq\n }\n if (rowVersion > this.latestRowVersion) {\n this.latestRowVersion = rowVersion\n }\n\n if (term > this.localTerm) {\n this.localTerm = term\n this.localSeq = seq\n } else if (term === this.localTerm && seq > this.localSeq) {\n this.localSeq = seq\n }\n if (rowVersion > this.localRowVersion) {\n this.localRowVersion = rowVersion\n }\n }\n\n private nextLocalStreamPosition(): {\n term: number\n seq: number\n rowVersion: number\n } {\n this.localTerm = Math.max(this.localTerm, this.latestTerm || 1)\n this.localSeq = Math.max(this.localSeq, this.latestSeq) + 1\n this.localRowVersion =\n Math.max(this.localRowVersion, this.latestRowVersion) + 1\n\n return {\n term: this.localTerm,\n seq: this.localSeq,\n rowVersion: this.localRowVersion,\n }\n }\n\n private getSubsetKey(options: LoadSubsetOptions): string {\n // A subscription can own several independent acquisitions, including\n // identical requests. Only releasing this options object ends its lease.\n let id = this.requestIds.get(options)\n if (id === undefined) {\n id = `request:${++this.nextRequestId}`\n this.requestIds.set(options, id)\n }\n return id\n }\n\n private canRouteRemoteDemandThroughCoordinator(): boolean {\n if (\n this.getCurrentTerminalFailure() ||\n this.mode !== `sync-present` ||\n this.persistence.coordinator instanceof SingleProcessCoordinator\n ) {\n return false\n }\n\n // A follower routes demand to the elected owner even when its own source\n // cannot own acquisitions. Only an elected node needs a local owner.\n return (\n !this.persistence.coordinator.isLeader(this.collectionId) ||\n this.remoteSubsetOwnerUnsubscribe !== null\n )\n }\n\n private queueRemoteSubsetEnsure(options: LoadSubsetOptions): void {\n if (\n options.signal?.aborted ||\n !this.canRouteRemoteDemandThroughCoordinator() ||\n this.activeSubsets.get(this.getSubsetKey(options)) !== options\n ) {\n return\n }\n\n const subsetKey = this.getSubsetKey(options)\n if (this.activeSubsets.get(subsetKey) !== options) return\n\n this.pendingRemoteSubsetEnsures.set(subsetKey, options)\n void this.flushPendingRemoteSubsetEnsures()\n }\n\n private scheduleRemoteEnsureRetry(): void {\n if (\n this.getCurrentTerminalFailure() ||\n this.mode !== `sync-present` ||\n this.persistence.coordinator instanceof SingleProcessCoordinator\n ) {\n return\n }\n\n if (\n this.pendingRemoteSubsetEnsures.size === 0 ||\n this.remoteEnsureRetryTimer !== null\n ) {\n return\n }\n\n this.remoteEnsureRetryTimer = setTimeout(() => {\n this.remoteEnsureRetryTimer = null\n void this.flushPendingRemoteSubsetEnsures()\n }, REMOTE_ENSURE_RETRY_DELAY_MS)\n }\n\n private async flushPendingRemoteSubsetEnsures(): Promise<void> {\n if (\n this.getCurrentTerminalFailure() ||\n this.mode !== `sync-present` ||\n this.persistence.coordinator instanceof SingleProcessCoordinator\n ) {\n return\n }\n\n if (this.remoteEnsureRetryTimer !== null) {\n clearTimeout(this.remoteEnsureRetryTimer)\n this.remoteEnsureRetryTimer = null\n }\n\n for (const [subsetKey, options] of this.pendingRemoteSubsetEnsures) {\n if (\n options.signal?.aborted ||\n this.activeSubsets.get(subsetKey) !== options\n ) {\n this.pendingRemoteSubsetEnsures.delete(subsetKey)\n continue\n }\n try {\n await this.persistence.coordinator.requestEnsureRemoteSubset(\n this.collectionId,\n options,\n )\n this.pendingRemoteSubsetEnsures.delete(subsetKey)\n } catch (error) {\n if (\n options.signal?.aborted ||\n this.activeSubsets.get(subsetKey) !== options\n ) {\n this.pendingRemoteSubsetEnsures.delete(subsetKey)\n } else {\n console.warn(`Failed to ensure remote subset:`, error)\n }\n }\n }\n\n this.scheduleRemoteEnsureRetry()\n }\n\n private attachCoordinatorSubscription(): void {\n if (this.coordinatorUnsubscribe) {\n return\n }\n\n this.persistence.coordinator.setAdapterForCollection?.(\n this.collectionId,\n this.persistence.adapter,\n )\n this.coordinatorUnsubscribe = this.persistence.coordinator.subscribe(\n this.collectionId,\n (message) => {\n this.onCoordinatorMessage(message)\n },\n )\n }\n\n private onCoordinatorMessage(message: ProtocolEnvelope<unknown>): void {\n if (message.collectionId !== this.collectionId) {\n return\n }\n if (this.getCurrentTerminalFailure()) {\n return\n }\n\n const { payload } = message\n const lifecycleGeneration = this.lifecycleGeneration\n const isSelf = message.senderId === this.persistence.coordinator.getNodeId()\n\n // Allow tx:committed from self — the coordinator produces these on behalf\n // of both local and remote mutations. The seq dedup in\n // processCommittedTxUnsafe prevents double-processing of our own writes.\n if (isTxCommittedPayload(payload)) {\n if (this.isHydratingNow()) {\n this.queuedTxCommitted.push({\n txCommitted: payload,\n lifecycleGeneration,\n })\n return\n }\n\n void this.applyMutex\n .run(() => this.processCommittedTxUnsafe(payload, lifecycleGeneration))\n .catch((error) => {\n this.markTerminalFailure(error, lifecycleGeneration)\n })\n return\n }\n\n // Skip remaining message types from self (e.g. heartbeats, resets)\n if (isSelf) {\n return\n }\n\n if (isCollectionResetPayload(payload)) {\n void this.applyMutex\n .run(async () => {\n await this.runInHydrationScope((adapter) =>\n this.truncateAndReloadUnsafe(adapter, lifecycleGeneration),\n )\n if (lifecycleGeneration === this.lifecycleGeneration) {\n await this.flushQueuedTxCommittedUnsafe()\n }\n })\n .catch((error) => {\n this.markTerminalFailure(error, lifecycleGeneration)\n })\n }\n }\n\n private async flushQueuedTxCommittedUnsafe(): Promise<void> {\n while (this.queuedTxCommitted.length > 0) {\n const queued = this.queuedTxCommitted.shift()\n if (!queued) {\n continue\n }\n await this.processCommittedTxUnsafe(\n queued.txCommitted,\n queued.lifecycleGeneration,\n )\n }\n }\n\n private async processCommittedTxUnsafe(\n txCommitted: TxCommitted,\n lifecycleGeneration = this.lifecycleGeneration,\n ): Promise<void> {\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n if (txCommitted.term < this.latestTerm) {\n return\n }\n\n if (\n txCommitted.term === this.latestTerm &&\n txCommitted.seq <= this.latestSeq\n ) {\n return\n }\n\n const hasGapInCurrentTerm =\n txCommitted.term === this.latestTerm &&\n txCommitted.seq > this.latestSeq + 1\n const hasGapAcrossTerms =\n txCommitted.term > this.latestTerm && txCommitted.seq > 1\n const hasGap = hasGapInCurrentTerm || hasGapAcrossTerms\n\n if (hasGap) {\n await this.recoverFromSeqGapUnsafe(lifecycleGeneration)\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n if (\n txCommitted.term < this.latestTerm ||\n (txCommitted.term === this.latestTerm &&\n txCommitted.seq <= this.latestSeq)\n ) {\n return\n }\n }\n\n this.observeStreamPosition(\n txCommitted.term,\n txCommitted.seq,\n txCommitted.latestRowVersion,\n )\n\n await this.invalidateFromCommittedTxUnsafe(\n txCommitted,\n this.persistence.adapter,\n )\n if (lifecycleGeneration === this.lifecycleGeneration) {\n await this.flushQueuedTxCommittedUnsafe()\n }\n }\n\n private async recoverFromSeqGapUnsafe(\n lifecycleGeneration: number,\n ): Promise<void> {\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n if (this.persistence.coordinator.pullSince && this.latestRowVersion >= 0) {\n let pullResponse: PullSinceResponse | undefined\n try {\n pullResponse = await this.persistence.coordinator.pullSince(\n this.collectionId,\n this.latestRowVersion,\n )\n } catch (error) {\n console.warn(`Failed pullSince recovery attempt:`, error)\n }\n\n if (pullResponse) {\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n\n if (pullResponse.ok) {\n this.observeStreamPosition(\n pullResponse.latestTerm,\n pullResponse.latestSeq,\n pullResponse.latestRowVersion,\n )\n if (pullResponse.requiresFullReload) {\n await this.runInHydrationScope((adapter) =>\n this.reloadActiveSubsetsUnsafe(adapter),\n )\n return\n }\n const deltas = pullResponse.deltas\n if (!deltas) {\n await this.runInHydrationScope((adapter) =>\n this.reloadActiveSubsetsUnsafe(adapter),\n )\n return\n }\n\n await this.runInHydrationScope(async (adapter) => {\n for (const delta of deltas) {\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n await this.invalidateFromCommittedTxUnsafe(\n {\n type: `tx:committed`,\n term: pullResponse.latestTerm,\n seq: pullResponse.latestSeq,\n txId: delta.txId,\n latestRowVersion: delta.latestRowVersion,\n requiresFullReload: false,\n changedRows: delta.changedRows,\n deletedKeys: delta.deletedKeys,\n rowMetadataMutations: delta.rowMetadataMutations,\n collectionMetadataMutations:\n delta.collectionMetadataMutations,\n },\n adapter,\n )\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n }\n })\n return\n }\n }\n }\n\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n await this.runInHydrationScope((adapter) =>\n this.truncateAndReloadUnsafe(adapter, lifecycleGeneration),\n )\n\n if (this.mode === `sync-present`) {\n for (const options of this.activeSubsets.values()) {\n this.queueRemoteSubsetEnsure(options)\n }\n }\n }\n\n private async truncateAndReloadUnsafe(\n adapter: HydrationPersistenceAdapter,\n lifecycleGeneration = this.lifecycleGeneration,\n ): Promise<void> {\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n // A subscriber may reacquire reentrantly from the truncate commit.\n this.hydratedDemands.clear()\n this.resetSequence++\n if (this.syncControls.begin && this.syncControls.commit) {\n const applied = this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n this.syncControls.truncate?.()\n return this.syncControls.commit?.() ?? true\n })\n if (applied !== true) await applied\n }\n\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n await this.reloadActiveSubsetsUnsafe(adapter)\n }\n\n private async invalidateFromCommittedTxUnsafe(\n txCommitted: TxCommitted,\n adapter: HydrationPersistenceAdapter,\n ): Promise<void> {\n const reloadActiveSubsets = () =>\n this.runInHydrationScope(\n (scopedAdapter) => this.reloadActiveSubsetsUnsafe(scopedAdapter),\n adapter,\n )\n\n if (txCommitted.requiresFullReload) {\n await reloadActiveSubsets()\n return\n }\n\n const changedKeyCount =\n txCommitted.changedRows.length + txCommitted.deletedKeys.length\n if (changedKeyCount > TARGETED_INVALIDATION_KEY_LIMIT) {\n await reloadActiveSubsets()\n return\n }\n\n const hasPaginatedSubset = Array.from(this.activeSubsets.values()).some(\n (opt) => opt.limit != null || opt.offset != null || opt.cursor != null,\n )\n\n if (!hasPaginatedSubset || changedKeyCount === 0) {\n await this.applyTargetedInvalidationUnsafe(txCommitted)\n return\n }\n\n // Has paginated subsets — fall back to full reload.\n // Targeted invalidation for paginated subsets is deferred to a future iteration.\n await reloadActiveSubsets()\n }\n\n private async applyTargetedInvalidationUnsafe(\n txCommitted: TxCommitted & { requiresFullReload: false },\n ): Promise<void> {\n const subsetEvaluators = Array.from(this.activeSubsets.values()).map(\n (opt) => (opt.where ? compileSingleRowExpression(opt.where) : null),\n )\n\n const applied = this.withInternalApply(() => {\n this.syncControls.begin?.({ immediate: true })\n\n for (const {\n key: changedKey,\n value: newValue,\n } of txCommitted.changedRows) {\n const matchesAnySubset = subsetEvaluators.some((evaluator) => {\n if (!evaluator) return true\n return toBooleanPredicate(evaluator(newValue) as boolean | null)\n })\n\n if (matchesAnySubset) {\n this.syncControls.write?.({ type: `update`, value: newValue as T })\n } else if (this.collection?.get(changedKey as TKey) !== undefined) {\n this.syncControls.write?.({ type: `delete`, key: changedKey as TKey })\n }\n }\n\n for (const deletedKey of txCommitted.deletedKeys) {\n this.syncControls.write?.({ type: `delete`, key: deletedKey as TKey })\n }\n\n txCommitted.rowMetadataMutations?.forEach((mutation) => {\n if (mutation.type === `delete`) {\n this.syncControls.metadata?.row.delete(mutation.key as TKey)\n } else {\n this.syncControls.metadata?.row.set(\n mutation.key as TKey,\n mutation.value,\n )\n }\n })\n\n txCommitted.collectionMetadataMutations?.forEach((mutation) => {\n if (mutation.type === `delete`) {\n this.syncControls.metadata?.collection.delete(mutation.key)\n } else {\n this.syncControls.metadata?.collection.set(\n mutation.key,\n mutation.value,\n )\n }\n })\n\n return this.syncControls.commit?.() ?? true\n })\n if (applied !== true) await applied\n }\n\n private async reloadActiveSubsetsUnsafe(\n adapter: HydrationPersistenceAdapter,\n ): Promise<void> {\n const lifecycleGeneration = this.lifecycleGeneration\n const truncateGeneration = this.sourceTruncateGeneration\n const activeSubsetOptions =\n this.activeSubsets.size > 0\n ? Array.from(this.activeSubsets.values())\n : [{}]\n\n this.hydratedDemands.clear()\n this.hydrationSequence++\n const hydrationContext = { suppliedRowKeys: new Set<TKey>() }\n this.activeHydrationContext = hydrationContext\n this.hydratingGeneration = lifecycleGeneration\n try {\n const mergedRows = new Map<TKey, { value: T; metadata?: unknown }>()\n const collectionMetadata =\n await this.loadCollectionMetadataSnapshot(adapter)\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n for (const options of activeSubsetOptions) {\n const subsetRows = await this.loadSubsetRowsUnsafe(options, adapter)\n if (lifecycleGeneration !== this.lifecycleGeneration) return\n for (const row of subsetRows) {\n mergedRows.set(row.key, {\n value: row.value,\n metadata: row.metadata,\n })\n }\n }\n\n for (const key of mergedRows.keys()) {\n hydrationContext.suppliedRowKeys.add(key)\n }\n\n const applied = this.replaceCollectionSnapshot(\n Array.from(mergedRows.entries()).map(([key, row]) => ({\n key,\n value: row.value,\n metadata: row.metadata,\n })),\n collectionMetadata,\n )\n if (applied !== true) await applied\n } finally {\n if (\n this.activeHydrationContext === hydrationContext &&\n this.hydratingGeneration === lifecycleGeneration\n ) {\n this.hydratingGeneration = null\n }\n if (this.activeHydrationContext === hydrationContext) {\n this.activeHydrationContext = undefined\n }\n }\n if (lifecycleGeneration === this.lifecycleGeneration) {\n await this.flushQueuedHydrationTransactionsUnsafe(adapter)\n // Coordinator commits queued during this hydrate are processed outside\n // its scope. Leave the synchronous fast path closed until a later load\n // if any such commit still needs to be applied.\n if (\n truncateGeneration === this.sourceTruncateGeneration &&\n this.queuedTxCommitted.length === 0\n ) {\n for (const options of activeSubsetOptions) {\n if (this.activeSubsets.get(this.getSubsetKey(options)) === options) {\n this.hydratedDemands.add(getLoadSubsetDemandKey(options))\n }\n }\n }\n }\n }\n\n private attachIndexLifecycleListeners(): void {\n if (\n !this.collection ||\n this.indexAddedUnsubscribe ||\n this.indexRemovedUnsubscribe\n ) {\n return\n }\n\n this.indexAddedUnsubscribe = this.collection.on(`index:added`, (event) => {\n void this.ensurePersistedIndex(event.index)\n })\n this.indexRemovedUnsubscribe = this.collection.on(\n `index:removed`,\n (event) => {\n void this.markIndexRemoved(event.index)\n },\n )\n }\n\n private async bootstrapPersistedIndexes(\n indexMetadataSnapshot?: Array<CollectionIndexMetadata>,\n adapter: HydrationPersistenceAdapter = this.persistence.adapter,\n ): Promise<Set<string>> {\n const collection = this.collection\n if (!collection && !indexMetadataSnapshot) {\n return new Set()\n }\n\n const indexMetadata =\n indexMetadataSnapshot ?? collection?.getIndexMetadata() ?? []\n const completedLocalIndexSignatures = new Set<string>()\n for (const metadata of indexMetadata) {\n if (await this.ensureLocalPersistedIndex(metadata, adapter)) {\n completedLocalIndexSignatures.add(metadata.signature)\n }\n }\n return completedLocalIndexSignatures\n }\n\n private async requestCoordinatorPersistedIndexes(\n indexMetadata: Array<CollectionIndexMetadata>,\n completedLocalIndexSignatures: ReadonlySet<string>,\n ): Promise<void> {\n for (const metadata of indexMetadata) {\n await this.requestCoordinatorPersistedIndex(\n metadata,\n completedLocalIndexSignatures.has(metadata.signature),\n )\n }\n }\n\n private buildPersistedIndexSpec(\n index: CollectionIndexMetadata,\n ): PersistedIndexSpec {\n return {\n expressionSql: [stableSerialize(index.expression)],\n metadata: {\n name: index.name ?? null,\n resolver: toStableSerializable(index.resolver),\n options: toStableSerializable(index.options),\n },\n }\n }\n\n private async ensurePersistedIndex(\n indexMetadata: CollectionIndexMetadata,\n adapter: HydrationPersistenceAdapter = this.persistence.adapter,\n ): Promise<void> {\n const completedLocally = await this.ensureLocalPersistedIndex(\n indexMetadata,\n adapter,\n )\n await this.requestCoordinatorPersistedIndex(indexMetadata, completedLocally)\n }\n\n private async ensureLocalPersistedIndex(\n indexMetadata: CollectionIndexMetadata,\n adapter: HydrationPersistenceAdapter,\n ): Promise<boolean> {\n const spec = this.buildPersistedIndexSpec(indexMetadata)\n\n try {\n await adapter.ensureIndex(\n this.collectionId,\n indexMetadata.signature,\n spec,\n )\n return true\n } catch (error) {\n console.warn(`Failed to ensure persisted index in adapter:`, error)\n return false\n }\n }\n\n private async requestCoordinatorPersistedIndex(\n indexMetadata: CollectionIndexMetadata,\n completedLocally: boolean,\n ): Promise<void> {\n const spec = this.buildPersistedIndexSpec(indexMetadata)\n\n try {\n await this.persistence.coordinator.requestEnsurePersistedIndex(\n this.collectionId,\n indexMetadata.signature,\n spec,\n completedLocally ? this.persistence.adapter : undefined,\n completedLocally,\n )\n } catch (error) {\n console.warn(\n `Failed to ensure persisted index through coordinator:`,\n error,\n )\n }\n }\n\n private async markIndexRemoved(\n indexMetadata: CollectionIndexMetadata,\n ): Promise<void> {\n if (!this.persistence.adapter.markIndexRemoved) {\n return\n }\n\n try {\n await this.persistence.adapter.markIndexRemoved(\n this.collectionId,\n indexMetadata.signature,\n )\n } catch (error) {\n console.warn(`Failed to mark persisted index removed:`, error)\n }\n }\n}\n\nfunction createWrappedSyncConfig<\n T extends object,\n TKey extends string | number,\n>(\n sourceSyncConfig: SyncConfig<T, TKey>,\n runtime: PersistedCollectionRuntime<T, TKey>,\n persistedReadiness?: PersistedReadinessTracker,\n): SyncConfig<T, TKey> {\n return {\n ...sourceSyncConfig,\n sync: (params) => {\n const transactionStack: Array<OpenSyncTransaction<T, TKey>> = []\n const pendingPublicationTransactions: Array<\n OpenSyncTransaction<T, TKey>\n > = []\n const getOpenTransaction = () =>\n transactionStack[transactionStack.length - 1]\n const settlePublicationAdmissionWaiters = (\n transaction: OpenSyncTransaction<T, TKey>,\n error?: unknown,\n ) => {\n const waiters = transaction.publicationAdmissionWaiters\n transaction.publicationAdmissionWaiters = undefined\n if (!waiters) return\n for (const waiter of waiters) {\n if (error === undefined) waiter.resolve()\n else waiter.reject(error)\n }\n }\n const bindToCurrentHydration = (\n transaction: OpenSyncTransaction<T, TKey>,\n ) => {\n if (transaction.internal || !runtime.isHydratingNow()) return\n const hydrationSequence = runtime.getHydrationSequence()\n if (\n transaction.hydrationSequence !== undefined &&\n transaction.hydrationSequence !== hydrationSequence\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `a persisted sync transaction cannot cross a hydration cycle`,\n )\n }\n transaction.queuedBecauseHydrating = true\n transaction.hydrationSequence = hydrationSequence\n transaction.hydrationContext = runtime.getActiveHydrationContext()\n }\n const assertHydrationSequenceCurrent = (\n transaction: OpenSyncTransaction<T, TKey>,\n ) => {\n if (\n transaction.hydrationSequence !== undefined &&\n transaction.hydrationSequence !== runtime.getHydrationSequence()\n ) {\n throw new InvalidPersistedCollectionConfigError(\n `a persisted sync transaction cannot cross a hydration cycle`,\n )\n }\n }\n const markPendingMetadataDependency = (\n transaction: OpenSyncTransaction<T, TKey>,\n ) => {\n const openTransaction = getOpenTransaction()\n if (openTransaction && !openTransaction.internal) {\n transaction.hasDependentSuccessor = true\n }\n }\n const removePendingPublicationTransaction = (\n transaction: OpenSyncTransaction<T, TKey>,\n ) => {\n const index = pendingPublicationTransactions.indexOf(transaction)\n if (index !== -1) pendingPublicationTransactions.splice(index, 1)\n }\n const settlePendingTransaction = (\n transaction: OpenSyncTransaction<T, TKey>,\n ) => {\n removePendingPublicationTransaction(transaction)\n }\n const settleRuntimeTransaction = (\n transaction: OpenSyncTransaction<T, TKey>,\n applied: Promise<void>,\n ) => {\n void applied.then(\n () => settlePendingTransaction(transaction),\n () => {\n settlePendingTransaction(transaction)\n },\n )\n }\n const getPendingRowMetadataWrite = (key: TKey) => {\n for (\n let index = pendingPublicationTransactions.length - 1;\n index >= 0;\n index--\n ) {\n const transaction = pendingPublicationTransactions[index]!\n const write = transaction.rowMetadataWrites.get(key)\n if (write) {\n markPendingMetadataDependency(transaction)\n return { found: true, write }\n }\n if (transaction.truncate) {\n markPendingMetadataDependency(transaction)\n return {\n found: true,\n write: { type: `delete` as const },\n }\n }\n }\n return { found: false as const }\n }\n const getPendingCollectionMetadataWrite = (key: string) => {\n for (\n let index = pendingPublicationTransactions.length - 1;\n index >= 0;\n index--\n ) {\n const transaction = pendingPublicationTransactions[index]!\n const write = transaction.collectionMetadataWrites.get(key)\n if (write) {\n markPendingMetadataDependency(transaction)\n return { found: true, write }\n }\n }\n return { found: false as const }\n }\n let fullStartPromise: Promise<void> | null = null\n let sourceResultPromise: Promise<SyncConfigRes> | null = null\n let resolveSourceResultAssigned!: () => void\n const sourceResultAssigned = new Promise<void>((resolve) => {\n resolveSourceResultAssigned = resolve\n })\n const startupState = { cleanedUp: false }\n const isCleanedUp = () => startupState.cleanedUp\n type SubsetAcquisition = {\n forwarded: boolean\n cancelAdmissionWait?: () => void\n }\n const acquisitions = new Map<LoadSubsetOptions, SubsetAcquisition>()\n const waitForPublicationAdmission = (\n transaction: OpenSyncTransaction<T, TKey>,\n options: LoadSubsetOptions,\n acquisition: SubsetAcquisition,\n ): Promise<void> => {\n if (options.signal?.aborted) {\n return Promise.reject(\n options.signal.reason ?? new SyncTransactionAbortedError(),\n )\n }\n return new Promise<void>((resolve, reject) => {\n const waiters =\n transaction.publicationAdmissionWaiters ??\n (transaction.publicationAdmissionWaiters = new Set())\n let settled = false\n const settle = (action: () => void) => {\n if (settled) return\n settled = true\n waiters.delete(waiter)\n options.signal?.removeEventListener(`abort`, abort)\n acquisition.cancelAdmissionWait = undefined\n action()\n }\n const waiter = {\n resolve: () => settle(resolve),\n reject: (error: unknown) => settle(() => reject(error)),\n }\n const abort = () =>\n waiter.reject(\n options.signal?.reason ?? new SyncTransactionAbortedError(),\n )\n waiters.add(waiter)\n options.signal?.addEventListener(`abort`, abort, { once: true })\n acquisition.cancelAdmissionWait = waiter.resolve\n })\n }\n const getTerminalFailure = () => runtime.getCurrentTerminalFailure()\n const reportUpstreamError = (error: unknown) => {\n if (persistedReadiness?.getSnapshot().status !== `loading`) {\n runtime.reportSyncError(error)\n return\n }\n // An early network error must not stop the live-query graph before\n // the persisted baseline has published its rows.\n void (fullStartPromise ?? runtime.ensureStarted()).then(\n () => {\n if (!isCleanedUp() && !getTerminalFailure()) {\n runtime.reportSyncError(error)\n }\n },\n () => undefined,\n )\n }\n const createHandledRejection = (error: unknown): Promise<never> => {\n const rejected = Promise.reject(error)\n void rejected.catch(() => undefined)\n return rejected\n }\n const applyTransactionToCollection = (\n transaction: OpenSyncTransaction<T, TKey>,\n signal?: AbortSignal,\n ): SyncAppliedReceipt => {\n if (transaction.applicationReceipt !== undefined) {\n return transaction.applicationReceipt\n }\n try {\n assertHydrationSequenceCurrent(transaction)\n for (const key of transaction.deferredHydrationMetadataDeleteKeys) {\n if (\n !transaction.hydrationContext?.suppliedRowKeys.has(key) &&\n !transaction.rowMetadataWrites.has(key)\n ) {\n transaction.rowMetadataWrites.set(key, { type: `delete` })\n }\n }\n transaction.deferredHydrationMetadataDeleteKeys.clear()\n\n // A buffered source replay is part of the hydrate that owns it.\n // It must not wait for a mutation whose persistence is queued\n // behind that hydrate's apply mutex.\n params.begin(\n transaction.queuedBecauseHydrating\n ? { immediate: true }\n : transaction.beginOptions,\n )\n if (transaction.truncate) params.truncate()\n for (const operation of transaction.operations) {\n if (operation.type === `delete`) {\n params.write({ type: `delete`, key: operation.key })\n } else {\n params.write({\n type: `update`,\n value: operation.value,\n metadata: operation.metadata,\n })\n }\n }\n if (params.metadata) {\n for (const [key, write] of transaction.rowMetadataWrites) {\n if (write.type === `delete`) params.metadata.row.delete(key)\n else params.metadata.row.set(key, write.value)\n }\n for (const [key, write] of transaction.collectionMetadataWrites) {\n if (write.type === `delete`)\n params.metadata.collection.delete(key)\n else params.metadata.collection.set(key, write.value)\n }\n }\n\n const applied = params.commit(signal)\n transaction.applicationReceipt = applied\n if (applied === true) {\n removePendingPublicationTransaction(transaction)\n } else {\n void applied.then(\n () => removePendingPublicationTransaction(transaction),\n () => removePendingPublicationTransaction(transaction),\n )\n }\n return applied\n } catch (error) {\n removePendingPublicationTransaction(transaction)\n throw error\n }\n }\n runtime.setSyncControls({\n begin: params.begin,\n write: params.write as SyncControlFns<T, TKey>[`write`],\n commit: params.commit,\n truncate: params.truncate,\n metadata: params.metadata ?? null,\n markError: params.markError,\n })\n runtime.setCollection(\n params.collection as Collection<T, TKey, PersistedCollectionUtils>,\n )\n\n const persistenceCapability: SyncPersistenceCapabilityV1<TKey> = {\n protocol: SYNC_PERSISTENCE_PROTOCOL,\n version: SYNC_PERSISTENCE_VERSION,\n hydrateBaseline: async () => {\n if (startupState.cleanedUp) return\n try {\n await runtime.ensureResumeBaselineHydrated()\n } catch (error) {\n throw runtime.reportSyncError(error)\n }\n },\n scanPersistedRows: (options) =>\n startupState.cleanedUp\n ? Promise.resolve([])\n : runtime.scanPersistedRows(options),\n resumeSnapshot: {\n certify: async () => {\n if (startupState.cleanedUp) return\n try {\n await runtime.ensureResumeBaselineCertified()\n } catch (error) {\n throw runtime.reportSyncError(error)\n }\n },\n getKeySetEvidence: () =>\n startupState.cleanedUp ? undefined : runtime.getKeySetEvidence(),\n expectCurrentCommit: () => {\n if (startupState.cleanedUp) return\n const openTransaction = getOpenTransaction()\n if (!openTransaction) {\n throw new InvalidPersistedCollectionConfigError(\n `resumeSnapshot.expectCurrentCommit must be called within an open sync transaction`,\n )\n }\n openTransaction.expectedResumeGenerationOwner =\n runtime.getResumeGenerationOwner()\n },\n },\n }\n\n const wrappedParams = {\n ...params,\n markError: reportUpstreamError,\n markReady: () => {\n if (startupState.cleanedUp || getTerminalFailure()) return\n void (fullStartPromise ?? runtime.ensureStarted())\n .then(async () => {\n if (isCleanedUp() || getTerminalFailure()) return\n await sourceResultAssigned\n try {\n await sourceResultPromise\n } catch (error) {\n reportUpstreamError(error)\n return\n }\n if (isCleanedUp() || getTerminalFailure()) return\n params.markReady()\n })\n .catch(() => undefined)\n },\n begin: (options?: { immediate?: boolean }) => {\n if (startupState.cleanedUp) return undefined\n const terminalFailure = getTerminalFailure()\n const internal = runtime.isApplyingInternally()\n const transaction: OpenSyncTransaction<T, TKey> = {\n operations: [],\n partialUpdateOperationIndexes: new Set(),\n rowMetadataWrites: new Map(),\n collectionMetadataWrites: new Map(),\n deferredHydrationMetadataDeleteKeys: new Set(),\n truncate: false,\n internal,\n lifecycleGeneration: runtime.getLifecycleGeneration(),\n beginOptions: options,\n operationKeys: new Set(),\n hasDependentSuccessor: false,\n queuedBecauseHydrating:\n terminalFailure === undefined &&\n !internal &&\n runtime.isHydratingNow(),\n hydrationSequence:\n terminalFailure === undefined && !internal\n ? runtime.getHydrationSequence()\n : undefined,\n hydrationContext:\n terminalFailure === undefined &&\n !internal &&\n runtime.isHydratingNow()\n ? runtime.getActiveHydrationContext()\n : undefined,\n ...(terminalFailure === undefined ? {} : { terminalFailure }),\n }\n transactionStack.push(transaction)\n },\n write: (message: ChangeMessageOrDeleteKeyMessage<T, TKey>) => {\n if (startupState.cleanedUp) return\n const openTransaction = getOpenTransaction()\n const terminalFailure =\n openTransaction?.terminalFailure ?? getTerminalFailure()\n if (terminalFailure) {\n if (openTransaction)\n openTransaction.terminalFailure = terminalFailure\n return\n }\n if (!openTransaction) {\n throw new NoPendingSyncTransactionWriteError()\n }\n bindToCurrentHydration(openTransaction)\n const normalization = runtime.normalizeSyncWriteMessage(message)\n\n if (\n message.type === `update` &&\n sourceSyncConfig.rowUpdateMode !== `full`\n ) {\n if (!openTransaction.internal) {\n openTransaction.partialUpdateOperationIndexes.add(\n openTransaction.operations.length,\n )\n }\n for (const pending of pendingPublicationTransactions) {\n if (\n pending.truncate ||\n pending.operationKeys.has(normalization.operation.key)\n ) {\n markPendingMetadataDependency(pending)\n }\n }\n }\n\n openTransaction.operations.push(normalization.operation)\n openTransaction.operationKeys.add(normalization.operation.key)\n if (normalization.operation.type === `delete`) {\n openTransaction.rowMetadataWrites.set(normalization.operation.key, {\n type: `delete`,\n })\n } else if (\n message.type === `insert` &&\n normalization.operation.metadata === undefined\n ) {\n // Reset stale metadata for a fresh insert, but don't clobber an\n // explicit metadata write already queued for this key in the same\n // transaction (e.g. query reconcile stamps owners, then inserts).\n if (openTransaction.queuedBecauseHydrating) {\n openTransaction.deferredHydrationMetadataDeleteKeys.add(\n normalization.operation.key,\n )\n } else if (\n !openTransaction.rowMetadataWrites.has(\n normalization.operation.key,\n )\n ) {\n openTransaction.rowMetadataWrites.set(\n normalization.operation.key,\n {\n type: `delete`,\n },\n )\n }\n } else if (normalization.operation.metadata !== undefined) {\n openTransaction.rowMetadataWrites.set(normalization.operation.key, {\n type: `set`,\n value: normalization.operation.metadata,\n })\n }\n },\n metadata: params.metadata\n ? {\n persistence: persistenceCapability,\n row: {\n get: (key: TKey) => {\n if (startupState.cleanedUp) return undefined\n const openTransaction = getOpenTransaction()\n const pendingWrite =\n openTransaction?.rowMetadataWrites.get(key)\n if (pendingWrite) {\n return pendingWrite.type === `delete`\n ? undefined\n : pendingWrite.value\n }\n if (openTransaction?.truncate) {\n return undefined\n }\n const pending = getPendingRowMetadataWrite(key)\n if (pending.found) {\n return pending.write.type === `delete`\n ? undefined\n : pending.write.value\n }\n return params.metadata!.row.get(key)\n },\n set: (key: TKey, value: unknown) => {\n if (startupState.cleanedUp) return\n const openTransaction = getOpenTransaction()\n if (openTransaction?.terminalFailure ?? getTerminalFailure())\n return\n if (!openTransaction) {\n throw new InvalidPersistedCollectionConfigError(\n `metadata.row.set must be called within an open sync transaction`,\n )\n }\n openTransaction.rowMetadataWrites.set(key, {\n type: `set`,\n value,\n })\n },\n delete: (key: TKey) => {\n if (startupState.cleanedUp) return\n const openTransaction = getOpenTransaction()\n if (openTransaction?.terminalFailure ?? getTerminalFailure())\n return\n if (!openTransaction) {\n throw new InvalidPersistedCollectionConfigError(\n `metadata.row.delete must be called within an open sync transaction`,\n )\n }\n openTransaction.rowMetadataWrites.set(key, {\n type: `delete`,\n })\n },\n },\n collection: {\n get: (key: string) => {\n if (startupState.cleanedUp) return undefined\n const openTransaction = getOpenTransaction()\n const pendingWrite =\n openTransaction?.collectionMetadataWrites.get(key)\n if (pendingWrite) {\n return pendingWrite.type === `delete`\n ? undefined\n : pendingWrite.value\n }\n const pending = getPendingCollectionMetadataWrite(key)\n if (pending.found) {\n return pending.write.type === `delete`\n ? undefined\n : pending.write.value\n }\n return params.metadata!.collection.get(key)\n },\n set: (key: string, value: unknown) => {\n if (startupState.cleanedUp) return\n const openTransaction = getOpenTransaction()\n if (openTransaction?.terminalFailure ?? getTerminalFailure())\n return\n if (!openTransaction) {\n throw new InvalidPersistedCollectionConfigError(\n `metadata.collection.set must be called within an open sync transaction`,\n )\n }\n openTransaction.collectionMetadataWrites.set(key, {\n type: `set`,\n value,\n })\n },\n delete: (key: string) => {\n if (startupState.cleanedUp) return\n const openTransaction = getOpenTransaction()\n if (openTransaction?.terminalFailure ?? getTerminalFailure())\n return\n if (!openTransaction) {\n throw new InvalidPersistedCollectionConfigError(\n `metadata.collection.delete must be called within an open sync transaction`,\n )\n }\n openTransaction.collectionMetadataWrites.set(key, {\n type: `delete`,\n })\n },\n list: (prefix?: string) => {\n if (startupState.cleanedUp) return []\n const merged = new Map(\n params\n .metadata!.collection.list()\n .map(({ key, value }) => [key, value]),\n )\n const pendingOwners = new Map<\n string,\n OpenSyncTransaction<T, TKey>\n >()\n for (const transaction of pendingPublicationTransactions) {\n for (const [\n key,\n metadataWrite,\n ] of transaction.collectionMetadataWrites) {\n if (!prefix || key.startsWith(prefix)) {\n pendingOwners.set(key, transaction)\n }\n if (metadataWrite.type === `delete`) {\n merged.delete(key)\n } else {\n merged.set(key, metadataWrite.value)\n }\n }\n }\n for (const owner of new Set(pendingOwners.values())) {\n markPendingMetadataDependency(owner)\n }\n const openTransaction = getOpenTransaction()\n if (openTransaction) {\n for (const [\n key,\n metadataWrite,\n ] of openTransaction.collectionMetadataWrites) {\n if (metadataWrite.type === `delete`) {\n merged.delete(key)\n } else {\n merged.set(key, metadataWrite.value)\n }\n }\n }\n\n return Array.from(merged.entries())\n .filter(([key]) => (prefix ? key.startsWith(prefix) : true))\n .map(([key, value]) => ({\n key,\n value,\n }))\n },\n },\n }\n : undefined,\n truncate: () => {\n if (startupState.cleanedUp) return\n runtime.noteSourceTruncate()\n const openTransaction = getOpenTransaction()\n if (openTransaction?.terminalFailure ?? getTerminalFailure()) return\n if (!openTransaction) {\n throw new NoPendingSyncTransactionWriteError()\n }\n\n openTransaction.operations = []\n openTransaction.operationKeys.clear()\n openTransaction.partialUpdateOperationIndexes.clear()\n openTransaction.rowMetadataWrites.clear()\n openTransaction.deferredHydrationMetadataDeleteKeys.clear()\n // Intentionally preserve collectionMetadataWrites across truncate.\n // Callers (for example electric resume/reset handling) may stage\n // collection-scoped metadata before truncating row data, and those\n // writes must commit atomically with the truncate transaction.\n openTransaction.truncate = true\n },\n commit: (signal?: AbortSignal) => {\n if (startupState.cleanedUp) return true\n const openTransaction = transactionStack.pop()\n const terminalFailure =\n openTransaction?.terminalFailure ?? getTerminalFailure()\n if (terminalFailure) {\n if (openTransaction) {\n settlePendingTransaction(openTransaction)\n settlePublicationAdmissionWaiters(\n openTransaction,\n terminalFailure.error,\n )\n }\n return createHandledRejection(terminalFailure.error)\n }\n if (!openTransaction) {\n throw new NoPendingSyncTransactionCommitError()\n }\n\n if (openTransaction.internal) {\n return applyTransactionToCollection(openTransaction, signal)\n }\n\n if (signal?.aborted) {\n settlePendingTransaction(openTransaction)\n const error = new SyncTransactionAbortedError()\n settlePublicationAdmissionWaiters(openTransaction, error)\n return createHandledRejection(error)\n }\n try {\n bindToCurrentHydration(openTransaction)\n assertHydrationSequenceCurrent(openTransaction)\n } catch (error) {\n settlePublicationAdmissionWaiters(openTransaction, error)\n throw error\n }\n const transaction = {\n operations: openTransaction.operations,\n partialUpdateOperationIndexes:\n openTransaction.partialUpdateOperationIndexes,\n rowMetadataWrites: openTransaction.rowMetadataWrites,\n collectionMetadataWrites: openTransaction.collectionMetadataWrites,\n deferredHydrationMetadataDeleteKeys:\n openTransaction.deferredHydrationMetadataDeleteKeys,\n hydrationContext: openTransaction.hydrationContext,\n hydrationSequence: openTransaction.hydrationSequence,\n truncate: openTransaction.truncate,\n internal: false,\n lifecycleGeneration: openTransaction.lifecycleGeneration,\n beginOptions: openTransaction.beginOptions,\n expectedResumeGenerationOwner:\n openTransaction.expectedResumeGenerationOwner,\n signal,\n prependHydrationRows: (\n rows: Array<{ key: TKey; value: T; metadata?: unknown }>,\n ) => {\n const baselineOperations: Array<\n NormalizedSyncOperation<T, TKey>\n > = rows.map(({ key, value, metadata }) => ({\n type: `update`,\n key,\n value,\n metadata: metadata as Record<string, unknown> | undefined,\n }))\n openTransaction.operations = baselineOperations.concat(\n openTransaction.operations,\n )\n for (const { key, metadata } of rows) {\n if (\n metadata !== undefined &&\n !openTransaction.rowMetadataWrites.has(key)\n ) {\n openTransaction.rowMetadataWrites.set(key, {\n type: `set`,\n value: metadata,\n })\n }\n }\n },\n applyToCollection: () =>\n applyTransactionToCollection(openTransaction, signal),\n shouldFailStopOnAbort: () => openTransaction.hasDependentSuccessor,\n }\n openTransaction.signal = signal\n pendingPublicationTransactions.push(openTransaction)\n if (\n openTransaction.queuedBecauseHydrating &&\n runtime.isHydratingNow()\n ) {\n let resolveApplied!: () => void\n let rejectApplied!: (error: unknown) => void\n const applied = new Promise<void>((resolve, reject) => {\n resolveApplied = resolve\n rejectApplied = reject\n })\n void applied.catch(() => undefined)\n runtime.queueHydrationBufferedTransaction({\n ...transaction,\n resolveApplied,\n rejectApplied,\n })\n settlePublicationAdmissionWaiters(openTransaction)\n settleRuntimeTransaction(openTransaction, applied)\n return applied\n }\n\n let applied: Promise<void>\n try {\n applied = runtime.applyHydrationBufferedTransaction(transaction)\n } catch (error) {\n settlePublicationAdmissionWaiters(openTransaction, error)\n throw error\n }\n settlePublicationAdmissionWaiters(openTransaction)\n settleRuntimeTransaction(openTransaction, applied)\n return applied\n },\n }\n\n let sourceResult: SyncConfigRes = {}\n let sourceResultSettled = false\n let activeSourceSyncEntry: Promise<void> | undefined\n fullStartPromise = runtime.ensureStarted()\n // Startup can fail before the source reaches markReady or loadSubset,\n // which are the two eventual consumers of this outer adopting promise.\n // The runtime-owned inner promise still installs and reports the exact\n // terminal failure; this observer only prevents the unused outer wrapper\n // from becoming an unhandled rejection on that fail-stop path.\n void fullStartPromise.catch(() => undefined)\n sourceResultPromise = (async () => {\n await runtime.ensureStartupMetadataLoaded()\n\n if (startupState.cleanedUp) {\n sourceResultSettled = true\n return sourceResult\n }\n\n let settleSourceSyncEntry!: () => void\n activeSourceSyncEntry = new Promise<void>((resolve) => {\n settleSourceSyncEntry = resolve\n })\n try {\n sourceResult = normalizeSyncFnResult(\n sourceSyncConfig.sync(wrappedParams),\n )\n } finally {\n activeSourceSyncEntry = undefined\n settleSourceSyncEntry()\n }\n // Cleanup can reenter while the source sync function is still active.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!startupState.cleanedUp && sourceResult.loadSubset) {\n const loadSubset = async (options: TransportedLoadSubsetOptions) => {\n if (startupState.cleanedUp) {\n throw new Error(`persisted sync source is no longer active`)\n }\n await sourceResult.loadSubset?.(\n options as unknown as LoadSubsetOptions,\n )\n }\n runtime.registerRemoteSubsetOwner(\n Object.assign(loadSubset, {\n unloadSubset: (options: TransportedLoadSubsetOptions) =>\n sourceResult.unloadSubset?.(\n options as unknown as LoadSubsetOptions,\n ),\n onError: reportUpstreamError,\n }),\n )\n }\n sourceResultSettled = true\n return sourceResult\n })()\n resolveSourceResultAssigned()\n void sourceResultPromise.catch((error) => {\n reportUpstreamError(error)\n })\n\n return {\n cleanup: async () => {\n startupState.cleanedUp = true\n // The optional source starts behind persistence metadata. If it\n // reenters cleanup before returning, wait for that exact synchronous\n // entry to publish its cleanup callback before sampling the result.\n const sourceSyncEntry = activeSourceSyncEntry\n const cleanupError = new SyncTransactionAbortedError()\n for (const acquisition of acquisitions.values()) {\n acquisition.cancelAdmissionWait?.()\n }\n acquisitions.clear()\n pendingPublicationTransactions.length = 0\n for (const transaction of transactionStack) {\n settlePublicationAdmissionWaiters(transaction, cleanupError)\n }\n transactionStack.length = 0\n let sourceCleanup: Promise<void>\n try {\n sourceCleanup = sourceSyncEntry\n ? sourceSyncEntry.then(() => sourceResult.cleanup?.())\n : Promise.resolve(sourceResult.cleanup?.())\n } catch (error) {\n sourceCleanup = Promise.reject(error)\n }\n let runtimeCleanup: Promise<void>\n try {\n runtimeCleanup = runtime.cleanup()\n } catch (error) {\n runtimeCleanup = Promise.reject(error)\n }\n const [sourceOutcome, runtimeOutcome] = await Promise.allSettled([\n sourceCleanup,\n runtimeCleanup,\n ])\n if (\n sourceOutcome.status === `rejected` &&\n runtimeOutcome.status === `rejected`\n ) {\n throw new AggregateError(\n [sourceOutcome.reason, runtimeOutcome.reason],\n `Source cleanup and persistence runtime teardown both failed`,\n { cause: sourceOutcome.reason },\n )\n }\n if (sourceOutcome.status === `rejected`) throw sourceOutcome.reason\n if (runtimeOutcome.status === `rejected`) throw runtimeOutcome.reason\n },\n loadSubset: (options: LoadSubsetOptions): true | Promise<void> => {\n const acquisition = { forwarded: false }\n acquisitions.set(options, acquisition)\n const forwardUpstream = (\n resolvedSourceResult: SyncConfigRes,\n loadOptions: LoadSubsetOptions,\n ): true | Promise<void> => {\n // Hydration is another async boundary. A release before this\n // point owns no upstream lease and must not start one later.\n if (\n startupState.cleanedUp ||\n acquisitions.get(options) !== acquisition\n ) {\n return true\n }\n if (!resolvedSourceResult.loadSubset) return true\n acquisition.forwarded = true\n try {\n // Returning a promise transfers its lease even if it rejects.\n // Only a synchronous throw leaves no upstream lease to release.\n return resolvedSourceResult.loadSubset(loadOptions)\n } catch (error) {\n acquisition.forwarded = false\n throw error\n }\n }\n\n const openTransaction = getOpenTransaction()\n const needsPublicationAdmission =\n openTransaction &&\n !openTransaction.internal &&\n openTransaction.beginOptions?.immediate\n const hydrated =\n sourceResultSettled && !needsPublicationAdmission\n ? runtime.loadHydratedSubset(options, (loadOptions) =>\n forwardUpstream(sourceResult, loadOptions),\n )\n : undefined\n if (hydrated !== undefined) {\n return hydrated\n }\n\n return (async () => {\n await fullStartPromise\n const resolvedSourceResult = await sourceResultPromise\n if (\n startupState.cleanedUp ||\n acquisitions.get(options) !== acquisition\n ) {\n return\n }\n const currentTransaction = getOpenTransaction()\n // An immediate source transaction reserves its FIFO turn before\n // subset hydration advances the generation it was built against.\n if (\n currentTransaction &&\n !currentTransaction.internal &&\n currentTransaction.beginOptions?.immediate\n ) {\n await waitForPublicationAdmission(\n currentTransaction,\n options,\n acquisition,\n )\n }\n if (\n options.signal?.aborted ||\n acquisitions.get(options) !== acquisition\n ) {\n return\n }\n return runtime.loadSubset(options, (loadOptions) =>\n forwardUpstream(resolvedSourceResult, loadOptions),\n )\n })()\n },\n unloadSubset: (options: LoadSubsetOptions) => {\n const acquisition = acquisitions.get(options)\n acquisition?.cancelAdmissionWait?.()\n acquisitions.delete(options)\n runtime.unloadSubset(\n options,\n acquisition?.forwarded ? sourceResult.unloadSubset : undefined,\n )\n },\n }\n },\n }\n}\n\nfunction createLoopbackSyncConfig<\n T extends object,\n TKey extends string | number,\n>(runtime: PersistedCollectionRuntime<T, TKey>): SyncConfig<T, TKey> {\n return {\n sync: (params) => {\n runtime.setSyncControls({\n begin: params.begin,\n write: params.write as SyncControlFns<T, TKey>[`write`],\n commit: params.commit,\n truncate: params.truncate,\n metadata: params.metadata ?? null,\n markError: params.markError,\n })\n runtime.setCollection(\n params.collection as Collection<T, TKey, PersistedCollectionUtils>,\n )\n\n void runtime\n .ensureStarted()\n .then(() => {\n if (runtime.getCurrentTerminalFailure()) return\n params.markReady()\n })\n .catch(() => undefined)\n\n return {\n loadSubset: (options: LoadSubsetOptions): true | Promise<void> =>\n runtime.loadHydratedSubset(options) ?? runtime.loadSubset(options),\n cleanup: () => runtime.cleanup(),\n unloadSubset: (options: LoadSubsetOptions) =>\n runtime.unloadSubset(options),\n }\n },\n getSyncMetadata: () => ({\n source: `persisted-phase-2-loopback`,\n }),\n }\n}\n\nexport function persistedCollectionOptions<\n TSchema extends StandardSchemaV1,\n TKey extends string | number,\n TUtils extends UtilsRecord = UtilsRecord,\n>(\n options: PersistedSyncWrappedOptions<\n InferSchemaOutput<TSchema>,\n TKey,\n TSchema,\n TUtils\n > & {\n schema: TSchema\n },\n): PersistedSyncOptionsResult<\n InferSchemaOutput<TSchema>,\n TKey,\n TSchema,\n TUtils\n> & {\n schema: TSchema\n}\n\nexport function persistedCollectionOptions<\n TSchema extends StandardSchemaV1,\n TKey extends string | number,\n TUtils extends UtilsRecord = UtilsRecord,\n>(\n options: PersistedLocalOnlyOptions<\n InferSchemaOutput<TSchema>,\n TKey,\n TSchema,\n TUtils\n > & {\n schema: TSchema\n },\n): PersistedLocalOnlyOptionsResult<\n InferSchemaOutput<TSchema>,\n TKey,\n TSchema,\n TUtils\n> & {\n schema: TSchema\n}\n\nexport function persistedCollectionOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1 = never,\n TUtils extends UtilsRecord = UtilsRecord,\n>(\n options: PersistedSyncWrappedOptions<T, TKey, TSchema, TUtils> & {\n schema?: never\n },\n): PersistedSyncOptionsResult<T, TKey, TSchema, TUtils>\n\nexport function persistedCollectionOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1 = never,\n TUtils extends UtilsRecord = UtilsRecord,\n>(\n options: PersistedLocalOnlyOptions<T, TKey, TSchema, TUtils> & {\n schema?: never\n },\n): PersistedLocalOnlyOptionsResult<T, TKey, TSchema, TUtils>\n\nexport function persistedCollectionOptions<\n T extends object,\n TKey extends string | number,\n TSchema extends StandardSchemaV1 = never,\n TUtils extends UtilsRecord = UtilsRecord,\n>(\n options:\n | PersistedSyncWrappedOptions<T, TKey, TSchema, TUtils>\n | PersistedLocalOnlyOptions<T, TKey, TSchema, TUtils>,\n):\n | PersistedSyncOptionsResult<T, TKey, TSchema, TUtils>\n | PersistedLocalOnlyOptionsResult<T, TKey, TSchema, TUtils> {\n if (!isRecord(options.persistence)) {\n throw new InvalidPersistedCollectionConfigError(\n `persistedCollectionOptions requires a persistence adapter`,\n )\n }\n\n const networkTimeoutMs = getNetworkTimeoutMs(options.initialRender)\n if (networkTimeoutMs !== undefined && options.syncMode === `on-demand`) {\n throw new InvalidPersistedCollectionConfigError(\n `network-first initial rendering requires eager persistence syncMode`,\n )\n }\n const persistedReadinessTracker =\n networkTimeoutMs !== undefined\n ? new PersistedReadinessTracker(networkTimeoutMs)\n : undefined\n\n if (hasOwnSyncKey(options)) {\n if (!isValidSyncConfig(options.sync)) {\n throw new InvalidSyncConfigError(\n `when the \"sync\" key is present it must provide a callable sync function`,\n )\n }\n\n const {\n schemaVersion,\n initialRender: _initialRender,\n ...syncOptions\n } = options\n const collectionId =\n syncOptions.id ?? `persisted-collection:${safeRandomUUID()}`\n const persistence = resolvePersistenceForCollection(\n syncOptions.persistence,\n {\n collectionId,\n mode: `sync-present`,\n schemaVersion,\n },\n )\n\n const runtime = new PersistedCollectionRuntime<T, TKey>(\n `sync-present`,\n collectionId,\n persistence,\n syncOptions.syncMode ?? `eager`,\n collectionId,\n persistedReadinessTracker,\n )\n\n const result = {\n ...syncOptions,\n id: collectionId,\n sync: createWrappedSyncConfig<T, TKey>(\n syncOptions.sync,\n runtime,\n persistedReadinessTracker,\n ),\n persistence,\n ...(persistedReadinessTracker\n ? { [PERSISTED_READINESS]: persistedReadinessTracker }\n : {}),\n }\n\n return withCollectionConfigFactory(\n result,\n () =>\n persistedCollectionOptions({\n ...options,\n id: collectionId,\n } as never) as typeof result,\n )\n }\n\n const {\n schemaVersion,\n initialRender: _initialRender,\n ...localOnlyOptions\n } = options\n const collectionId =\n localOnlyOptions.id ?? `persisted-collection:${safeRandomUUID()}`\n const persistence = resolvePersistenceForCollection(\n localOnlyOptions.persistence,\n {\n collectionId,\n mode: `sync-absent`,\n schemaVersion,\n },\n )\n const runtime = new PersistedCollectionRuntime<T, TKey>(\n `sync-absent`,\n collectionId,\n persistence,\n localOnlyOptions.syncMode ?? `eager`,\n localOnlyOptions.id ?? DEFAULT_DB_NAME,\n persistedReadinessTracker,\n )\n\n const wrappedOnInsert = async (\n params: InsertMutationFnParams<T, TKey, TUtils & PersistedCollectionUtils>,\n ) => {\n const lifecycleGeneration = runtime.getLifecycleGeneration()\n const handlerResult = localOnlyOptions.onInsert\n ? await localOnlyOptions.onInsert(\n params as unknown as InsertMutationFnParams<T, TKey, TUtils>,\n )\n : undefined\n\n await runtime.persistAndConfirmCollectionMutations(\n params.transaction.mutations as Array<PendingMutation<T>>,\n lifecycleGeneration,\n )\n\n return handlerResult ?? {}\n }\n\n const wrappedOnUpdate = async (\n params: UpdateMutationFnParams<T, TKey, TUtils & PersistedCollectionUtils>,\n ) => {\n const lifecycleGeneration = runtime.getLifecycleGeneration()\n const handlerResult = localOnlyOptions.onUpdate\n ? await localOnlyOptions.onUpdate(\n params as unknown as UpdateMutationFnParams<T, TKey, TUtils>,\n )\n : undefined\n\n await runtime.persistAndConfirmCollectionMutations(\n params.transaction.mutations as Array<PendingMutation<T>>,\n lifecycleGeneration,\n )\n\n return handlerResult ?? {}\n }\n\n const wrappedOnDelete = async (\n params: DeleteMutationFnParams<T, TKey, TUtils & PersistedCollectionUtils>,\n ) => {\n const lifecycleGeneration = runtime.getLifecycleGeneration()\n const handlerResult = localOnlyOptions.onDelete\n ? await localOnlyOptions.onDelete(\n params as unknown as DeleteMutationFnParams<T, TKey, TUtils>,\n )\n : undefined\n\n await runtime.persistAndConfirmCollectionMutations(\n params.transaction.mutations as Array<PendingMutation<T>>,\n lifecycleGeneration,\n )\n\n return handlerResult ?? {}\n }\n\n const acceptMutations = async (transaction: {\n mutations: Array<PendingMutation<Record<string, unknown>>>\n }) => {\n await runtime.acceptTransactionMutations(transaction)\n }\n\n const persistedUtils: PersistedCollectionUtils = {\n acceptMutations,\n getLeadershipState: () => runtime.getLeadershipState(),\n forceReloadSubset: (subsetOptions: LoadSubsetOptions) =>\n runtime.forceReloadSubset(subsetOptions),\n }\n\n const mergedUtils = {\n ...(localOnlyOptions.utils ?? ({} as TUtils)),\n ...persistedUtils,\n }\n\n const result = {\n ...localOnlyOptions,\n id: collectionId,\n persistence,\n ...(persistedReadinessTracker\n ? { [PERSISTED_READINESS]: persistedReadinessTracker }\n : {}),\n sync: createLoopbackSyncConfig(runtime),\n onInsert: wrappedOnInsert,\n onUpdate: wrappedOnUpdate,\n onDelete: wrappedOnDelete,\n utils: mergedUtils,\n startSync: true,\n gcTime: localOnlyOptions.gcTime ?? 0,\n }\n\n return withCollectionConfigFactory(\n result,\n () =>\n persistedCollectionOptions({\n ...options,\n id: collectionId,\n } as never) as typeof result,\n )\n}\n\nexport function encodePersistedStorageKey(key: string | number): string {\n if (typeof key === `number`) {\n if (!Number.isFinite(key)) {\n throw new InvalidPersistedStorageKeyError(key)\n }\n\n if (Object.is(key, -0)) {\n return `n:-0`\n }\n\n return `n:${key}`\n }\n\n return `s:${key}`\n}\n\nexport function decodePersistedStorageKey(encoded: string): string | number {\n if (encoded === `n:-0`) {\n return -0\n }\n\n if (encoded.startsWith(`n:`)) {\n return Number(encoded.slice(2))\n }\n\n if (encoded.startsWith(`s:`)) {\n return encoded.slice(2)\n }\n\n throw new InvalidPersistedStorageKeyEncodingError(encoded)\n}\n\nconst PERSISTED_TABLE_NAME_ALPHABET = `abcdefghijklmnopqrstuvwxyz234567`\n\nfunction hashCollectionId(collectionId: string): number {\n let hash = 0x811c9dc5\n\n for (let index = 0; index < collectionId.length; index++) {\n hash ^= collectionId.charCodeAt(index)\n hash = Math.imul(hash, 0x01000193)\n }\n\n return hash >>> 0\n}\n\nfunction toBase32(input: number): string {\n if (input === 0) {\n return PERSISTED_TABLE_NAME_ALPHABET.charAt(0)\n }\n\n let value = input >>> 0\n let output = ``\n\n while (value > 0) {\n output = `${PERSISTED_TABLE_NAME_ALPHABET.charAt(value % 32)}${output}`\n value = Math.floor(value / 32)\n }\n\n return output\n}\n\nexport function createPersistedTableName(\n collectionId: string,\n prefix: `c` | `t` = `c`,\n): string {\n if (!collectionId) {\n throw new InvalidPersistedCollectionConfigError(\n `collectionId is required to derive a persisted table name`,\n )\n }\n\n const hashPart = toBase32(hashCollectionId(collectionId))\n const lengthPart = collectionId.length.toString(36)\n\n return `${prefix}_${hashPart}_${lengthPart}`\n}\n"],"names":["InvalidPersistedCollectionConfigError","safeRandomUUID","toTransportedLoadSubsetOptions","toProcessLocalLoadSubsetOptions","reportRemoteSubsetOwnerError","unloadRemoteSubsetOwner","DuplicateRemoteSubsetOwnerError","toPersistedCollectionDurabilityError","InvalidPersistedCollectionCoordinatorError","InvalidPersistenceAdapterError","serializeSQLiteBigInt","SyncTransactionAbortedError","getLoadSubsetDemandKey","key","PersistedCollectionDurabilityError","compileSingleRowExpression","toBooleanPredicate","SYNC_PERSISTENCE_PROTOCOL","SYNC_PERSISTENCE_VERSION","NoPendingSyncTransactionWriteError","NoPendingSyncTransactionCommitError","applied","InvalidSyncConfigError","schemaVersion","_initialRender","collectionId","persistence","runtime","result","PERSISTED_READINESS","withCollectionConfigFactory","InvalidPersistedStorageKeyError","InvalidPersistedStorageKeyEncodingError"],"mappings":";;;;;;;AA8XO,MAAM,8CAA8C,uBAAO;AAAA,EAChE;AACF;AAyGO,SAAS,2CAEd,QAAsB,SAA2B;AACjD,QAAM,MAAM,OAAO,2CAA2C;AAC9D,MAAI,KAAK;AACP,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,EAAE,OAAO,IAAA;AAAA,IAAI;AAAA,EAEjB;AACA,SAAO;AACT;AAuFA,MAAM,0BAA8D;AAAA,EAKlE,YAAqB,kBAA0B;AAA1B,SAAA,mBAAA;AAJrB,SAAQ,WAAuC,EAAE,QAAQ,UAAA;AAEzD,SAAiB,gCAAgB,IAAA;AAIjC,SAAA,cAAc,MAAkC,KAAK;AAErD,SAAA,4BAA4B,MAAc;AACxC,aAAQ,KAAK,sBAAsB,KAAK,IAAA,IAAQ,KAAK;AAAA,IACvD;AAEA,SAAA,YAAY,CAAC,aAAuC;AAClD,WAAK,UAAU,IAAI,QAAQ;AAC3B,aAAO,MAAM,KAAK,UAAU,OAAO,QAAQ;AAAA,IAC7C;AAAA,EAXgD;AAAA,EAahD,IAAI,UAA4C;AAC9C,UAAM,oBACJ,SAAS,WAAW,aAAa,KAAK,sBAAsB;AAC9D,QAAI,mBAAmB;AACrB,WAAK,oBAAoB,KAAK,IAAA,IAAQ,KAAK;AAAA,IAC7C;AACA,QACE,KAAK,SAAS,WAAW,SAAS,UAClC,KAAK,SAAS,UAAU,SAAS,SACjC,CAAC,mBACD;AACA;AAAA,IACF;AACA,SAAK,WAAW;AAChB,eAAW,YAAY,KAAK,UAAW,UAAA;AAAA,EACzC;AACF;AAQA,MAAM,6BAA6B;AACnC,MAAM,uBAAuB;AAE7B,SAAS,oBACP,eACoB;AACpB,MAAI,kBAAkB,OAAW,QAAO;AACxC,QAAM,WAAY,cAAwC;AAC1D,MAAI,aAAa,iBAAiB;AAChC,UAAM,IAAIA,OAAAA;AAAAA,MACR;AAAA,IAAA;AAAA,EAEJ;AACA,QAAM,YAAY,cAAc,oBAAoB;AACpD,MACE,CAAC,OAAO,SAAS,SAAS,KAC1B,YAAY,KACZ,YAAY,sBACZ;AACA,UAAM,IAAIA,OAAAA;AAAAA,MACR,wDAAwD,oBAAoB;AAAA,IAAA;AAAA,EAEhF;AACA,SAAO;AACT;AA+CA,MAAM,+BAcF;AAAA,EACF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,MAAM,2BAKF,CAAC,cAAc,sBAAsB,oBAAoB,aAAa;AAE1E,MAAM,kCAAkC;AACxC,MAAM,kBAAkB;AACxB,MAAM,+BAA+B;AAsB9B,MAAM,yBAAmE;AAAA,EAS9E,YAAY,SAAiBC,GAAAA,kBAAkB;AAP/C,SAAiB,yCAAyB,IAAA;AAC1C,SAAiB,yCAAyB,IAAA;AAC1C,SAAiB,+CAA+B,IAAA;AAM9C,SAAK,SAAS;AAAA,EAChB;AAAA,EAEO,YAAoB;AACzB,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,YAAwB;AAC7B,WAAO,MAAM;AAAA,IAAC;AAAA,EAChB;AAAA,EAEO,UAAgB;AAAA,EAAC;AAAA,EAEjB,WAAoB;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,mBAAkC;AAAA,EAAC;AAAA,EAEhD,MAAa,0BACX,cACA,SACe;AACf,UAAM,cAAcC,iBAAAA,+BAA+B,OAAO;AAC1D,UAAM,eAAeC,iBAAAA,gCAAgC,SAAS,WAAW;AACzE,UAAM,QAAQ,KAAK,mBAAmB,IAAI,YAAY;AACtD,QAAI,CAAC,OAAO;AACV,YAAM,IAAIH,OAAAA;AAAAA,QACR,kFAAkF,YAAY;AAAA,MAAA;AAAA,IAElG;AACA,QAAI,eAAe,KAAK,yBAAyB,IAAI,YAAY;AACjE,QAAI,CAAC,cAAc;AACjB,yCAAmB,IAAA;AACnB,WAAK,yBAAyB,IAAI,cAAc,YAAY;AAAA,IAC9D;AACA,UAAM,WAAW,aAAa,IAAI,OAAO;AACzC,QAAI,UAAU;AACZ,YAAM,SAAS;AACf;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACJ,UAAM,OAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAClD,oBAAc;AACd,mBAAa;AAAA,IACf,CAAC;AACD,iBAAa,IAAI,SAAS,EAAE,OAAO,SAAS,cAAc,MAAM;AAChE,QAAI;AACF,YAAM,YAAY,MAAM,YAAY;AACpC,WAAK,QAAQ,QAAQ,SAAS,EAAE,KAAK,aAAa,CAAC,UAAU;AAC3DI,0BAAAA,6BAA6B,OAAO,KAAK;AACzC,mBAAW,KAAK;AAAA,MAClB,CAAC;AAAA,IACH,SAAS,OAAO;AACdA,wBAAAA,6BAA6B,OAAO,KAAK;AACzC,iBAAW,KAAK;AAAA,IAClB;AACA,UAAM;AAAA,EACR;AAAA,EAEA,MAAa,2BACX,cACA,SACe;AACf,UAAM,eAAe,KAAK,yBAAyB,IAAI,YAAY;AACnE,UAAM,cAAc,cAAc,IAAI,OAAO;AAC7C,QAAI,CAAC,YAAa;AAClB,iBAAc,OAAO,OAAO;AAC5B,QAAI,aAAc,SAAS,GAAG;AAC5B,WAAK,yBAAyB,OAAO,YAAY;AAAA,IACnD;AACA,QAAI;AACF,YAAM,YAAY;AAAA,IACpB,QAAQ;AAAA,IAER;AACA,UAAMC,kBAAAA,wBAAwB,YAAY,OAAO,YAAY,OAAO;AAAA,EACtE;AAAA,EAEO,0BACL,cACA,OACY;AACZ,QAAI,KAAK,mBAAmB,IAAI,YAAY,GAAG;AAC7C,YAAM,IAAIC,OAAAA,gCAAgC,YAAY;AAAA,IACxD;AACA,SAAK,mBAAmB,IAAI,cAAc,KAAK;AAC/C,WAAO,MAAM;AACX,UAAI,KAAK,mBAAmB,IAAI,YAAY,MAAM,MAAO;AACzD,YAAM,eAAe,KAAK,yBAAyB,IAAI,YAAY;AACnE,WAAK,yBAAyB,OAAO,YAAY;AACjD,WAAK,mBAAmB,OAAO,YAAY;AAC3C,iBAAW,eAAe,cAAc,OAAA,KAAY,CAAA,GAAI;AACtD,cAAM,YAAY;AAChB,cAAI;AACF,kBAAM,YAAY;AAAA,UACpB,QAAQ;AAAA,UAER;AACA,gBAAMD,0CAAwB,OAAO,YAAY,OAAO;AAAA,QAC1D,GAAA,EAAK,MAAM,MAAM,MAAS;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,8BAA6C;AAAA,EAAC;AAAA,EAEpD,wBACL,cACA,SACM;AACN,SAAK,mBAAmB,IAAI,cAAc,OAAO;AAAA,EACnD;AAAA,EAEA,MAAa,wBACX,cACA,IACmC;AACnC,UAAM,UAAU,KAAK,mBAAmB,IAAI,YAAY;AACxD,QAAI,CAAC,SAAS;AACZ,YAAM,IAAIL,OAAAA;AAAAA,QACR,kFAAkF,YAAY;AAAA,MAAA;AAAA,IAElG;AAEA,QAAI;AACF,YAAM,QAAQ,iBAAiB,cAAc,EAAE;AAAA,IACjD,SAAS,OAAO;AACd,YAAMO,OAAAA,qCAAqC,cAAc,KAAK;AAAA,IAChE;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAON,GAAAA,eAAA;AAAA,MACP,IAAI;AAAA,MACJ,MAAM,GAAG;AAAA,MACT,KAAK,GAAG;AAAA,MACR,kBAAkB,GAAG;AAAA,IAAA;AAAA,EAEzB;AAAA,EAEO,YAAwC;AAC7C,WAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM;AAAA,MACN,OAAOA,GAAAA,eAAA;AAAA,MACP,IAAI;AAAA,MACJ,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,aAAa,CAAA;AAAA,MACb,aAAa,CAAA;AAAA,MACb,QAAQ,CAAA;AAAA,IAAC,CACV;AAAA,EACH;AACF;AAEO,SAAS,uCACd,aACM;AACN,aAAW,UAAU,8BAA8B;AACjD,QAAI,OAAO,YAAY,MAAM,MAAM,YAAY;AAC7C,YAAM,IAAIO,OAAAA,2CAA2C,MAAM;AAAA,IAC7D;AAAA,EACF;AACF;AAEA,SAAS,2BAA2B,SAAmC;AACrE,aAAW,UAAU,0BAA0B;AAC7C,QAAI,OAAO,QAAQ,MAAM,MAAM,YAAY;AACzC,YAAM,IAAIC,OAAAA,+BAA+B,MAAM;AAAA,IACjD;AAAA,EACF;AACF;AAEA,SAAS,mBACP,aACA,cAC8B;AAC9B,6BAA2B,YAAY,OAAO;AAE9C,QAAM,cAAc,YAAY,eAAe,IAAI,yBAAA;AACnD,MAAI,uBAAuB,0BAA0B;AACnD,gBAAY,wBAAwB,cAAc,YAAY,OAAO;AAAA,EACvE;AACA,yCAAuC,WAAW;AAElD,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EAAA;AAEJ;AAEA,SAAS,0BACP,aACA,MACA,cAC8B;AAC9B,QAAM,0BAA0B,YAAY,4BAA4B,IAAI;AAC5E,SAAO;AAAA,IACL,2BAA2B;AAAA,IAC3B;AAAA,EAAA;AAEJ;AAEA,SAAS,gCACP,aACA,SAK8B;AAC9B,QAAM,gCACJ,YAAY,kCAAkC,OAAO;AACvD,MAAI,+BAA+B;AACjC,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,IAAA;AAAA,EAEZ;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,EAAA;AAEZ;AAEA,SAAS,cAAc,SAA+C;AACpE,SAAO,OAAO,UAAU,eAAe,KAAK,SAAS,MAAM;AAC7D;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,kBAAkB,OAA6C;AACtE,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,MAAM,SAAS;AAC/B;AAmEA,MAAM,WAAW;AAAA,EAAjB,cAAA;AACE,SAAQ,QAAuB,QAAQ,QAAA;AACvC,SAAQ,UAAU;AAAA,EAAA;AAAA,EAElB,UAEE;AACA,UAAM,iBAAiB,KAAK,YAAY;AACxC,UAAM,cAAc,KAAK;AACzB,SAAK;AAEL,QAAI;AACJ,UAAM,cAAc,IAAI,QAAc,CAAC,YAAY;AACjD,2BAAqB;AAAA,IACvB,CAAC;AACD,SAAK,QAAQ,iBACT,cACA,YAAY,KAAK,MAAM,WAAW;AAEtC,QAAI,OAAO;AACX,WAAO;AAAA,MACL,KAAK,CAAI,SAA2C;AAClD,YAAI,MAAM;AACR,iBAAO,QAAQ;AAAA,YACb,IAAI,MAAM,8CAA8C;AAAA,UAAA;AAAA,QAE5D;AACA,eAAO;AAEP,YAAI;AACJ,YAAI,gBAAgB;AAClB,cAAI;AACF,0BAAc,QAAQ,QAAQ,MAAM;AAAA,UACtC,SAAS,OAAO;AACd,0BAAc,QAAQ,OAAO,KAAK;AAAA,UACpC;AAAA,QACF,OAAO;AACL,wBAAc,YAAY,KAAK,MAAM,KAAA,CAAM;AAAA,QAC7C;AACA,cAAM,eAAe,MAAM;AACzB,eAAK;AACL,6BAAA;AAAA,QACF;AACA,aAAK,YAAY,KAAK,cAAc,YAAY;AAChD,eAAO;AAAA,MACT;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,IAAO,MAAwC;AAC7C,WAAO,KAAK,UAAU,IAAI,IAAI;AAAA,EAChC;AACF;AAEA,SAAS,qBAAqB,OAAyB;AACrD,MAAI,SAAS,MAAM;AACjB,WAAO;AAAA,EACT;AAEA,UAAQ,OAAO,OAAA;AAAA,IACb,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAOC,YAAAA,sBAAsB,KAAK;AAAA,IACpC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,EAAA;AAGX,MAAI,iBAAiB,MAAM;AACzB,WAAO,MAAM,YAAA;AAAA,EACf;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MACJ,IAAI,CAAC,UAAU,qBAAqB,KAAK,CAAC,EAC1C,OAAO,CAAC,UAAU,UAAU,MAAS;AAAA,EAC1C;AAEA,MAAI,iBAAiB,KAAK;AACxB,WAAO,MAAM,KAAK,KAAK,EACpB,IAAI,CAAC,UAAU,qBAAqB,KAAK,CAAC,EAC1C,OAAO,CAAC,UAAU,UAAU,MAAS,EACrC,KAAK,CAAC,MAAM,UAAU;AACrB,YAAM,iBAAiB,KAAK,UAAU,IAAI;AAC1C,YAAM,kBAAkB,KAAK,UAAU,KAAK;AAC5C,aAAO,iBAAiB,kBACpB,KACA,iBAAiB,kBACf,IACA;AAAA,IACR,CAAC;AAAA,EACL;AAEA,MAAI,iBAAiB,KAAK;AACxB,WAAO,MAAM,KAAK,MAAM,QAAA,CAAS,EAC9B,IAAI,CAAC,CAAC,KAAK,QAAQ,OAAO;AAAA,MACzB,KAAK,qBAAqB,GAAG;AAAA,MAC7B,OAAO,qBAAqB,QAAQ;AAAA,IAAA,EACpC,EACD,OAAO,CAAC,UAAU,MAAM,QAAQ,UAAa,MAAM,UAAU,MAAS,EACtE,KAAK,CAAC,MAAM,UAAU;AACrB,YAAM,iBAAiB,KAAK,UAAU,KAAK,GAAG;AAC9C,YAAM,kBAAkB,KAAK,UAAU,MAAM,GAAG;AAChD,aAAO,iBAAiB,kBACpB,KACA,iBAAiB,kBACf,IACA;AAAA,IACR,CAAC;AAAA,EACL;AAEA,QAAM,SAAS;AACf,QAAM,cAAc,OAAO,KAAK,MAAM,EAAE;AAAA,IAAK,CAAC,MAAM,UAClD,OAAO,QAAQ,KAAK,OAAO,QAAQ,IAAI;AAAA,EAAA;AAEzC,QAAM,qBAA8C,CAAA;AACpD,aAAW,OAAO,aAAa;AAC7B,UAAM,oBAAoB,qBAAqB,OAAO,GAAG,CAAC;AAC1D,QAAI,sBAAsB,QAAW;AACnC,yBAAmB,GAAG,IAAI;AAAA,IAC5B;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAwB;AAC/C,SAAO,KAAK,UAAU,qBAAqB,KAAK,KAAK,IAAI;AAC3D;AAEA,SAAS,sBAAsB,QAA6C;AAC1E,MAAI,OAAO,WAAW,YAAY;AAChC,WAAO,EAAE,SAAS,OAAA;AAAA,EACpB;AAEA,MAAI,WAAW,QAAW;AACxB,WAAO,CAAA;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,SAA0C;AACtE,MAAI,CAAC,SAAS,OAAO,KAAK,QAAQ,SAAS,gBAAgB;AACzD,WAAO;AAAA,EACT;AAEA,MACE,OAAO,QAAQ,SAAS,YACxB,OAAO,QAAQ,QAAQ,YACvB,OAAO,QAAQ,SAAS,YACxB,OAAO,QAAQ,qBAAqB,YACpC,OAAO,QAAQ,uBAAuB,WACtC;AACA,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,oBAAoB;AAC9B,WAAO;AAAA,EACT;AAEA,SACE,MAAM,QAAQ,QAAQ,WAAW,KACjC,MAAM,QAAQ,QAAQ,WAAW,MAChC,QAAQ,yBAAyB,UAChC,MAAM,QAAQ,QAAQ,oBAAoB,OAC3C,QAAQ,gCAAgC,UACvC,MAAM,QAAQ,QAAQ,2BAA2B;AAEvD;AAEA,SAAS,yBACP,SAC4B;AAC5B,SACE,SAAS,OAAO,KAChB,QAAQ,SAAS,sBACjB,OAAO,QAAQ,kBAAkB,YACjC,OAAO,QAAQ,eAAe;AAElC;AAEA,SAAS,4BACP,UAC2B;AAC3B,QAAM,MAAM,SAAS;AACrB,QAAM,QACJ,SAAS,SAAS,WACb,SAAS,WACV,SAAS;AAIf,SAAO;AAAA,IACL,YAAY,SAAS;AAAA,IACrB,MAAM,SAAS;AAAA,IACf;AAAA,IACA;AAAA,EAAA;AAEJ;AAEA,MAAM,2BAGJ;AAAA,EAkEA,YACmB,MACA,cACA,aACA,UACA,QACA,oBACjB;AANiB,SAAA,OAAA;AACA,SAAA,eAAA;AACA,SAAA,cAAA;AACA,SAAA,WAAA;AACA,SAAA,SAAA;AACA,SAAA,qBAAA;AAvEnB,SAAiB,aAAa,IAAI,WAAA;AAClC,SAAiB,oCAAoB,IAAA;AAErC,SAAQ,oBAAoB;AAE5B,SAAQ,gBAAgB;AACxB,SAAiB,iDAAiC,IAAA;AAIlD,SAAiB,8BAEb,CAAA;AACJ,SAAiB,oBAGZ,CAAA;AACL,SAAiB,iCAAiB,QAAA;AAClC,SAAiB,sCAAsB,IAAA;AAEvC,SAAQ,aACN;AACF,SAAQ,eAAwC;AAAA,MAC9C,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,IAAA;AAEb,SAAQ,yBAA+C;AACvD,SAAQ,eAAqC;AAC7C,SAAQ,sBAAsB;AAC9B,SAAQ,wBAA8C;AACtD,SAAQ,6BAAmD;AAG3D,SAAQ,+CAA+B,mCAAmC;AAC1E,SAAQ,sBAAsB;AAC9B,SAAQ,qBAAqB;AAC7B,SAAQ,6BAA6B;AACrC,SAAQ,yBAAyB;AACjC,SAAQ,oBAAoB;AAE5B,SAAiB,6CAA6B,IAAA;AAC9C,SAAQ,sBAAqC;AAI7C,SAAQ,yBAA8C;AACtD,SAAQ,+BAAoD;AAC5D,SAAQ,wBAA6C;AACrD,SAAQ,0BAA+C;AACvD,SAAQ,yBAA+D;AACvE,SAAQ,gBAAgB;AACxB,SAAQ,iBAAiB;AACzB,SAAQ,2BAA2B;AAEnC,SAAQ,aAAa;AACrB,SAAQ,YAAY;AACpB,SAAQ,mBAAmB;AAC3B,SAAQ,YAAY;AACpB,SAAQ,WAAW;AACnB,SAAQ,kBAAkB;AAAA,EASvB;AAAA,EAEH,gBAAgB,cAA6C;AAC3D,SAAK,iBAAA;AACL,SAAK,oBAAoB;AACzB,SAAK,oBAAoB;AAEzB,UAAM,SAAS,aAAa;AAC5B,SAAK,eAAe;AAAA,MAClB,GAAG;AAAA,MACH,QAAQ,SACJ,CAAC,WAAW,KAAK,oBAAoB,OAAO,MAAM,CAAC,IACnD;AAAA,IAAA;AAAA,EAER;AAAA,EAEA,gBAAgB,OAAyB;AACvC,UAAM,YAAY,KAAK,aAAa;AACpC,QAAI,KAAK,kBAAmB,QAAO,KAAK;AACxC,QAAI,CAAC,UAAW,QAAO;AAEvB,SAAK,oBAAoB;AACzB,SAAK,oBAAoB;AACzB,QAAI;AACF,gBAAU,KAAK;AAAA,IACjB,QAAQ;AAAA,IAER;AACA,WAAO;AAAA,EACT;AAAA,EAEA,0BAA0B,OAAgC;AACxD,SAAK,+BAAA;AACL,SAAK,+BACH,KAAK,YAAY,YAAY;AAAA,MAC3B,KAAK;AAAA,MACL;AAAA,IAAA;AAAA,EAEN;AAAA,EAEQ,oBAAoB,SAAiD;AAC3E,UAAM,WAAW,EAAE,KAAK;AACxB,QAAI,YAAY,MAAM;AACpB,aAAO;AAAA,IACT;AACA,SAAK,uBAAuB,IAAI,UAAU,OAAO;AACjD,UAAM,gBAAgB,MAAM,KAAK,uBAAuB,OAAO,QAAQ;AACvE,SAAK,QAAQ,KAAK,eAAe,aAAa;AAC9C,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,4BAA4B,QAA+B;AACvE,UAAM,QAAQ;AAAA,MACZ,MAAM;AAAA,QAAK,KAAK;AAAA,QAAwB,CAAC,CAAC,UAAU,OAAO,MACzD,WAAW,SAAS,UAAU;AAAA,MAAA;AAAA,IAChC;AAAA,EAEJ;AAAA,EAEQ,oBAA0B;AAChC,SAAK,eAAe;AAAA,MAClB,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,IAAA;AAAA,EAEf;AAAA,EAEA,iBAA0B;AACxB,WAAO,KAAK,wBAAwB,KAAK;AAAA,EAC3C;AAAA,EAEA,4BAAwE;AACtE,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,uBAA+B;AAC7B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,4BAA4D;AAC1D,UAAM,UAAU,KAAK;AACrB,WAAO,SAAS,wBAAwB,KAAK,sBACzC,UACA;AAAA,EACN;AAAA,EAEA,yBAAiC;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,yBAAyB,qBAAmC;AAClE,QAAI,wBAAwB,KAAK,qBAAqB;AACpD,YAAM,IAAIC,GAAAA,4BAAA;AAAA,IACZ;AAAA,EACF;AAAA,EAEQ,kBAAwB;AAC9B,UAAM,UAAU,KAAK,0BAAA;AACrB,QAAI,eAAe,QAAQ;AAAA,EAC7B;AAAA,EAEQ,oBACN,OACA,sBAAsB,KAAK,qBAClB;AACT,QAAI,wBAAwB,KAAK,qBAAqB;AACpD,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,KAAK,0BAAA;AACtB,QAAI,UAAU;AACZ,aAAO,SAAS;AAAA,IAClB;AAEA,SAAK,kBAAkB,EAAE,qBAAqB,MAAA;AAC9C,SAAK,oBAAoB,IAAI,EAAE,QAAQ,SAAS,OAAO;AACvD,SAAK,2BAA2B,MAAA;AAChC,SAAK,kBAAkB,SAAS;AAChC,QAAI,KAAK,2BAA2B,MAAM;AACxC,mBAAa,KAAK,sBAAsB;AACxC,WAAK,yBAAyB;AAAA,IAChC;AACA,SAAK,kCAAkC,KAAK;AAC5C,SAAK,gBAAgB,KAAK;AAC1B,WAAO;AAAA,EACT;AAAA,EAEA,uBAAgC;AAC9B,WAAO,KAAK,qBAAqB;AAAA,EACnC;AAAA,EAEA,cACE,YACM;AACN,QAAI,KAAK,eAAe,YAAY;AAClC;AAAA,IACF;AAEA,SAAK,aAAa;AAClB,SAAK,8BAAA;AAAA,EACP;AAAA,EAEA,qBAAyD;AACvD,WAAO;AAAA,MACL,QAAQ,KAAK,YAAY,YAAY,UAAA;AAAA,MACrC,UAAU,KAAK,YAAY,YAAY,SAAS,KAAK,YAAY;AAAA,IAAA;AAAA,EAErE;AAAA,EAEQ,oBACN,MACA,UAAuC,KAAK,YAAY,SACtC;AAClB,QAAI,QAAQ,qBAAqB;AAC/B,aAAO,QAAQ,oBAAoB,IAAI;AAAA,IACzC;AACA,WAAO,QAAQ,QAAA,EAAU,KAAK,MAAM,KAAK,OAAO,CAAC;AAAA,EACnD;AAAA,EAEA,MAAM,gBAA+B;AACnC,SAAK,gBAAA;AACL,QAAI,KAAK,cAAc;AACrB,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,sBAAsB,KAAK;AACjC,UAAM,YAAY,KAAK;AACvB,SAAK,sBAAsB;AAC3B,QAAI;AACJ,QAAI;AACJ,SAAK,yBAAyB,IAAI,QAAc,CAAC,SAAS,WAAW;AACnE,+BAAyB;AACzB,8BAAwB;AAAA,IAC1B,CAAC;AACD,SAAK,KAAK,uBAAuB,MAAM,MAAM,MAAS;AAEtD,SAAK,gBAAgB,YAAY;AAC/B,YAAM,sBAAsB,OAC1B,YACG;AACH,YAAI,wBAAwB,KAAK,qBAAqB;AACpD,iCAAA;AACA,iBAAO;AAAA,QACT;AAEA,YAAI;AACF,gBAAM,KAAK,4BAA4B,qBAAqB,OAAO;AACnE,iBAAO,wBAAwB,KAAK;AAAA,QACtC,SAAS,OAAO;AACd,gCAAsB,KAAK;AAC3B,gBAAM;AAAA,QACR;AAAA,MACF;AAEA,UAAI;AAOJ,YAAM,8BACJ,KAAK,YAAY,QAAQ,wBAAwB,WAChD,CAAC,cACC,KAAK,YAAY,QAAQ,4BAAA,KAAiC;AAC/D,UAAI,6BAA6B;AAC/B,kBAAU,MAAM,KAAK,WAAW,IAAI,YAAY;AAC9C,gBAAM,SAAS,MAAM,KAAK,oBAAoB,OAAO,YAAY;AAC/D,gBAAI,CAAE,MAAM,oBAAoB,OAAO,EAAI,QAAO;AAClD,mBAAO,KAAK;AAAA,cACV;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAAA,UAEJ,CAAC;AACD,cAAI,wBAAwB,KAAK,qBAAqB;AACpD,kBAAM,KAAK,6BAAA;AAAA,UACb;AACA,iBAAO;AAAA,QACT,CAAC;AAAA,MACH,OAAO;AAGL,YAAI,MAAM,oBAAoB,KAAK,YAAY,OAAO,GAAG;AACvD,cAAI,KAAK,YAAY,QAAQ,4BAAA,GAA+B;AAC1D,sBAAU,MAAM,KAAK,WAAW,IAAI,YAAY;AAC9C,oBAAM,SAAS,MAAM,KAAK;AAAA,gBAAoB,CAAC,YAC7C,KAAK;AAAA,kBACH;AAAA,kBACA;AAAA,kBACA;AAAA,gBAAA;AAAA,cACF;AAEF,kBAAI,wBAAwB,KAAK,qBAAqB;AACpD,sBAAM,KAAK,6BAAA;AAAA,cACb;AACA,qBAAO;AAAA,YACT,CAAC;AAAA,UACH,OAAO;AACL,sBAAU,MAAM,KAAK;AAAA,cACnB;AAAA,cACA,KAAK,YAAY;AAAA,cACjB;AAAA,YAAA;AAEF,gBAAI,wBAAwB,KAAK,qBAAqB;AACpD,oBAAM,KAAK,6BAAA;AAAA,YACb;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,UACE,YAAY,UACZ,wBAAwB,KAAK,qBAC7B;AACA,cAAM,KAAK;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ;AAAA,QAAA;AAEV,YACE,QAAQ,kBAAkB,UAC1B,wBAAwB,KAAK,qBAC7B;AACA,gBAAM,KAAK,4BAA4B,QAAQ,aAAa;AAAA,QAC9D;AAAA,MACF;AACA,UAAI,wBAAwB,KAAK,qBAAqB;AACpD,aAAK,iBAAiB;AACtB,aAAK,oBAAoB,IAAI,EAAE,QAAQ,SAAS;AAAA,MAClD;AACA,6BAAA;AAAA,IACF,GAAA,EAAK,MAAM,CAAC,UAAU;AACpB,4BAAsB,KAAK;AAC3B,YAAM,KAAK,oBAAoB,OAAO,mBAAmB;AAAA,IAC3D,CAAC;AACD,SAAK,KAAK,aAAa,MAAM,MAAM,MAAS;AAC5C,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,+BAA8C;AAC5C,SAAK,gBAAA;AACL,QAAI,KAAK,uBAAuB;AAC9B,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,sBAAsB,KAAK;AACjC,SAAK,yBAAyB,YAAY;AACxC,YAAM,KAAK,cAAA;AACX,UAAI,wBAAwB,KAAK,oBAAqB;AACtD,UAAI,KAAK,aAAa,YAAa;AAEnC,YAAM,gBAAgB,MAAM,KAAK,WAAW,IAAI,YAAY;AAC1D,cAAM,SAAS,MAAM,KAAK;AAAA,UAAoB,CAAC,YAC7C,KAAK,gBAAgB,qBAAqB,OAAO;AAAA,QAAA;AAEnD,YAAI,wBAAwB,KAAK,qBAAqB;AACpD,gBAAM,KAAK,6BAAA;AAAA,QACb;AACA,eAAO;AAAA,MACT,CAAC;AACD,UACE,kBAAkB,UAClB,wBAAwB,KAAK,qBAC7B;AACA,cAAM,KAAK,4BAA4B,aAAa;AAAA,MACtD;AAAA,IACF,GAAA,EAAK,MAAM,CAAC,UAAU;AACpB,YAAM,KAAK,oBAAoB,OAAO,mBAAmB;AAAA,IAC3D,CAAC;AACD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,gCAA+C;AAC7C,QAAI,KAAK,4BAA4B;AACnC,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,sBAAsB,KAAK;AACjC,SAAK,8BAA8B,YAAY;AAC7C,YAAM,KAAK,cAAA;AACX,UAAI,wBAAwB,KAAK,oBAAqB;AAEtD,YAAM,WAAW,MAAM,KAAK,YAAY,QAAQ;AAAA,QAC9C,KAAK;AAAA,QACL;AAAA,UACE,yBAAyB,KAAK,2BAAA;AAAA,UAC9B,aAAa;AAAA,QAAA;AAAA,MACf;AAEF,UAAI,wBAAwB,KAAK,oBAAqB;AACtD,WAAK,2BAA2B,QAAQ;AAAA,IAC1C,GAAA;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,oBAAyD;AACvD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,2BAAmC;AACjC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,gBACZ,qBACA,SAC6B;AAC7B,QAAI,wBAAwB,KAAK,oBAAqB,QAAO;AAI7D,UAAM,WAAW,CAAA;AACjB,SAAK,cAAc,IAAI,KAAK,aAAa,QAAQ,GAAG,QAAQ;AAC5D,UAAM,gBAAgB,KAAK;AAC3B,UAAM,KAAK;AAAA,MACT;AAAA,MACA;AAAA,QACE,qBAAqB;AAAA,QACrB;AAAA,QACA,oBAAoB;AAAA,MAAA;AAAA,MAEtB;AAAA,IAAA;AAEF,WAAO,wBAAwB,KAAK,sBAChC,gBACA;AAAA,EACN;AAAA,EAEA,MAAM,8BAA6C;AACjD,SAAK,gBAAA;AACL,QAAI,KAAK,wBAAwB;AAC/B,aAAO,KAAK;AAAA,IACd;AAEA,SAAK,KAAK,cAAA;AACV,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,cACZ,qBACA,SACA,yBAQA;AACA,QAAI,wBAAwB,KAAK,oBAAqB,QAAO;AAE7D,UAAM,yBAAyB,KAAK,YAAY,iBAAA,KAAsB,CAAA;AACtE,SAAK,8BAAA;AACL,UAAM,gCAAgC,MAAM,KAAK;AAAA,MAC/C;AAAA,MACA;AAAA,IAAA;AAEF,QAAI,wBAAwB,KAAK,oBAAqB,QAAO;AAK7D,4BAAA;AACA,UAAM,gBACJ,KAAK,aAAa,cACd,MAAM,KAAK,gBAAgB,qBAAqB,OAAO,IACvD;AACN,WAAO,wBAAwB,KAAK,sBAChC;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,IAAA,IAEF;AAAA,EACN;AAAA,EAEA,MAAc,4BACZ,qBACA,SACe;AACf,UAAM,WAAW,MAAM,QAAQ,mBAAmB,KAAK,cAAc;AAAA,MACnE,aAAa;AAAA,IAAA,CACd;AACD,QAAI,wBAAwB,KAAK,oBAAqB;AACtD,SAAK,4BAA4B,KAAK,4BAA4B,QAAQ;AAC1E,SAAK,0BAA0B,SAAS;AACxC,SAAK;AAAA,MACH,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,IAAA;AAEX,UAAM,UAAU,KAAK;AAAA,MACnB,SAAS;AAAA,IAAA;AAEX,QAAI,YAAY,KAAM,OAAM;AAAA,EAC9B;AAAA,EAEA,MAAc,+BACZ,SACiD;AACjD,QAAI,CAAC,QAAQ,wBAAwB;AACnC,aAAO,CAAA;AAAA,IACT;AAEA,WAAO,QAAQ,uBAAuB,KAAK,YAAY;AAAA,EACzD;AAAA,EAEQ,kCACN,oBACoB;AACpB,QACE,CAAC,KAAK,aAAa,SACnB,CAAC,KAAK,aAAa,UACnB,CAAC,KAAK,aAAa,UACnB;AACA,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,IAAI;AAAA,MACvB,mBAAmB,IAAI,CAAC,EAAE,KAAK,YAAY,CAAC,KAAK,KAAK,CAAC;AAAA,IAAA;AAEzD,UAAM,cAAc,KAAK,aAAa,SAAS,WAC5C,KAAA,EACA,IAAI,CAAC,EAAE,IAAA,MAAU,GAAG;AAEvB,WAAO,KAAK,kBAAkB,MAAM;AAClC,WAAK,aAAa,QAAQ,EAAE,WAAW,MAAM;AAE7C,kBAAY,QAAQ,CAAC,QAAQ;AAC3B,YAAI,CAAC,aAAa,IAAI,GAAG,GAAG;AAC1B,eAAK,aAAa,UAAU,WAAW,OAAO,GAAG;AAAA,QACnD;AAAA,MACF,CAAC;AAED,mBAAa,QAAQ,CAAC,OAAO,QAAQ;AACnC,aAAK,aAAa,UAAU,WAAW,IAAI,KAAK,KAAK;AAAA,MACvD,CAAC;AAED,aAAO,KAAK,aAAa,SAAA,KAAc;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WACJ,SACA,oBACe;AACf,SAAK,gBAAA;AACL,UAAM,sBAAsB,KAAK;AACjC,UAAM,YAAY,KAAK,aAAa,OAAO;AAC3C,UAAM,qBAAqB,KAAK;AAChC,UAAM,mCACJ,KAAK,uCAAA;AACP,SAAK,cAAc,IAAI,WAAW,OAAO;AACzC,UAAM,gBAAgB,KAAK;AAC3B,QAAI;AACF,YAAM,KAAK,WAAW,IAAI,YAAY;AACpC,YAAI;AACF,gBAAM,KAAK;AAAA,YAAoB,CAAC,YAC9B,KAAK;AAAA,cACH;AAAA,cACA;AAAA,gBACE,qBACE,KAAK,SAAS,kBACd,CAAC;AAAA,gBACH;AAAA,gBACA,yBAAyB;AAAA,gBACzB,6BAA6B;AAAA,cAAA;AAAA,cAE/B;AAAA,YAAA;AAAA,UACF;AAAA,QAEJ,UAAA;AACE,cACE,wBAAwB,KAAK,uBAC7B,CAAC,KAAK,6BACN;AACA,kBAAM,KAAK,6BAAA;AAAA,UACb;AAAA,QACF;AAAA,MACF,CAAC;AACD,UAAI,wBAAwB,KAAK,oBAAqB;AACtD,YAAM,KAAK,4BAA4B,aAAa;AAAA,IACtD,SAAS,OAAO;AACd,UAAI,KAAK,cAAc,IAAI,SAAS,MAAM,SAAS;AACjD,aAAK,cAAc,OAAO,SAAS;AAAA,MACrC;AACA,YAAM;AAAA,IACR;AAEA,QACE,QAAQ,QAAQ,WAChB,KAAK,cAAc,IAAI,KAAK,aAAa,OAAO,CAAC,MAAM,SACvD;AACA;AAAA,IACF;AAEA,QAAI,KAAK,0CAA0C;AACjD,UAAI;AACF,cAAM,KAAK,YAAY,YAAY;AAAA,UACjC,KAAK;AAAA,UACL;AAAA,QAAA;AAAA,MAEJ,SAAS,OAAO;AACd,YACE,QAAQ,QAAQ,WACf,OAAO,UAAU,YAChB,UAAU,QACV,UAAU,SACV,MAAM,SAAS,cACjB;AACA,eAAK,2BAA2B,OAAO,KAAK,aAAa,OAAO,CAAC;AACjE,gBAAM;AAAA,QACR;AACA,aAAK,wBAAwB,OAAO;AACpC,cAAM;AAAA,MACR;AACA;AAAA,IACF;AAEA,QACE,uBAAuB,KAAK,4BAC5B,KAAK,cAAc,IAAI,SAAS,MAAM,SACtC;AACA,WAAK,gBAAgB,IAAIC,GAAAA,uBAAuB,OAAO,CAAC;AAAA,IAC1D;AAEA,QAAI,oBAAoB;AACtB,UAAI;AACF,cAAM,mBAAmB,OAAO;AAAA,MAClC,SAAS,OAAO;AACd,aAAK,wBAAwB,SAAS,KAAK;AAC3C,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,mBACE,SACA,oBACkC;AAClC,UAAM,UAAU,KAAK,0BAAA;AACrB,QAAI,QAAS,QAAO,QAAQ,OAAO,QAAQ,KAAK;AAChD,QACE,CAAC,KAAK,kBACN,KAAK,oBACL,KAAK,4CACL,QAAQ,YAAY,QACpB,CAAC,KAAK,gBAAgB,IAAIA,GAAAA,uBAAuB,OAAO,CAAC,GACzD;AACA;AAAA,IACF;AAEA,SAAK,cAAc,IAAI,KAAK,aAAa,OAAO,GAAG,OAAO;AAC1D,QAAI;AACJ,QAAI;AACF,eAAS,qBAAqB,OAAO,KAAK;AAAA,IAC5C,SAAS,OAAO;AACd,WAAK,wBAAwB,SAAS,KAAK;AAC3C,aAAO,QAAQ,OAAO,KAAK;AAAA,IAC7B;AACA,QAAI,WAAW,MAAM;AACnB,aAAO;AAAA,IACT;AAEA,WAAO,OAAO;AAAA,MACZ,MAAM;AACJ,aAAK,wBAAwB,OAAO;AAAA,MACtC;AAAA,MACA,CAAC,UAAmB;AAClB,aAAK,wBAAwB,SAAS,KAAK;AAC3C,cAAM;AAAA,MACR;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEQ,wBACN,SACA,OACM;AACN,QACE,QAAQ,QAAQ,WACf,OAAO,UAAU,YAChB,UAAU,QACV,UAAU,SACV,MAAM,SAAS,cACjB;AACA,WAAK,2BAA2B,OAAO,KAAK,aAAa,OAAO,CAAC;AACjE;AAAA,IACF;AACA,YAAQ,KAAK,yCAAyC,KAAK;AAC3D,SAAK,wBAAwB,OAAO;AAAA,EACtC;AAAA,EAEA,qBAA2B;AACzB,SAAK;AACL,SAAK,gBAAgB,MAAA;AAAA,EACvB;AAAA,EAEA,aACE,SACA,sBACM;AACN,UAAM,YAAY,KAAK,aAAa,OAAO;AAC3C,SAAK,cAAc,OAAO,SAAS;AACnC,SAAK,2BAA2B,OAAO,SAAS;AAChD,UAAM,YAAYA,GAAAA,uBAAuB,OAAO;AAChD,UAAM,cAAc,MAAM,KAAK,KAAK,cAAc,OAAA,CAAQ,EAAE;AAAA,MAC1D,CAAC,WAAWA,0BAAuB,MAAM,MAAM;AAAA,IAAA;AAEjD,QAAI,CAAC,YAAa,MAAK,gBAAgB,OAAO,SAAS;AACvD,QAAI,KAAK,SAAS,gBAAgB;AAChC,WAAK,KAAK,YAAY,YACnB,2BAA2B,KAAK,cAAc,OAAO,EACrD,MAAM,CAAC,UAAU;AAChB,aAAK,gBAAgB,KAAK;AAAA,MAC5B,CAAC;AAAA,IACL;AACA,QAAI,sBAAsB;AACxB,UAAI;AACF,cAAM,SACJ,qBAGA,OAAO;AACT,aAAK,QAAQ,QAAQ,MAAM,EAAE,MAAM,CAAC,UAAU;AAC5C,eAAK,gBAAgB,KAAK;AAAA,QAC5B,CAAC;AAAA,MACH,SAAS,OAAO;AACd,aAAK,gBAAgB,KAAK;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,kBAAkB,SAA2C;AACjE,SAAK,gBAAA;AACL,UAAM,sBAAsB,KAAK;AAEjC,UAAM,KAAK,WAAW,IAAI,YAAY;AACpC,YAAM,KAAK;AAAA,QAAoB,CAAC,YAC9B,KAAK;AAAA,UACH;AAAA,UACA;AAAA,YACE,qBAAqB;AAAA,YACrB;AAAA,YACA,6BAA6B;AAAA,UAAA;AAAA,UAE/B;AAAA,QAAA;AAAA,MACF;AAEF,UAAI,wBAAwB,KAAK,qBAAqB;AACpD,cAAM,KAAK,6BAAA;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,kCACE,aACM;AACN,UAAM,UAAU,KAAK,0BAAA;AACrB,QAAI,SAAS;AACX,kBAAY,gBAAgB,QAAQ,KAAK;AACzC;AAAA,IACF;AACA,SAAK,4BAA4B,KAAK,WAAW;AAAA,EACnD;AAAA,EAEA,kCACE,aACe;AACf,UAAM,UAAU,KAAK,0BAAA;AACrB,QAAI,QAAS,QAAO,QAAQ,OAAO,QAAQ,KAAK;AAChD,QACE,YAAY,cAAc,aAC1B,KAAK,6BAA6B,GAClC;AACA,aAAO,QAAQ;AAAA,QACb,IAAIZ,OAAAA;AAAAA,UACF;AAAA,QAAA;AAAA,MACF;AAAA,IAEJ;AACA,WAAO,KAAK,WAAW,IAAI,YAAY;AACrC,YAAM,KAAK,mCAAmC,WAAW;AAAA,IAC3D,CAAC;AAAA,EACH;AAAA,EAEA,0BACE,SACiC;AACjC,QAAI,CAAC,KAAK,YAAY;AACpB,YAAM,IAAIA,OAAAA;AAAAA,QACR;AAAA,MAAA;AAAA,IAEJ;AAEA,QAAI,SAAS,SAAS;AACpB,YAAMa,OAAM,QAAQ;AACpB,YAAM,gBAAgB,KAAK,WAAW,IAAIA,IAAG,KAAM,CAAA;AAEnD,aAAO;AAAA,QACL,WAAW;AAAA,UACT,MAAM;AAAA,UACN,KAAAA;AAAAA,UACA,OAAO;AAAA,QAAA;AAAA,MACT;AAAA,IAEJ;AAIA,QAAI,QAAQ,SAAS,UAAU;AAC7B,YAAMA,OAAM,KAAK,WAAW,eAAe,QAAQ,KAAK;AACxD,YAAM,gBAAgB,KAAK,WAAW,IAAIA,IAAG,KAAK,QAAQ;AAE1D,aAAO;AAAA,QACL,WAAW;AAAA,UACT,MAAM;AAAA,UACN,KAAAA;AAAAA,UACA,OAAO;AAAA,QAAA;AAAA,MACT;AAAA,IAEJ;AAEA,UAAM,MAAM,KAAK,WAAW,eAAe,QAAQ,KAAK;AACxD,WAAO;AAAA,MACL,WAAW;AAAA,QACT,MAAM;AAAA,QACN;AAAA,QACA,OAAO,QAAQ;AAAA,QACf,UAAU,QAAQ;AAAA,MAAA;AAAA,IACpB;AAAA,EAEJ;AAAA,EAEA,MAAM,qCACJ,WACA,sBAAsB,KAAK,qBACZ;AACf,SAAK,gBAAA;AACL,SAAK,yBAAyB,mBAAmB;AACjD,QAAI,UAAU,WAAW,GAAG;AAC1B;AAAA,IACF;AAEA,QAAI;AACF,YAAM,KAAK,WAAW,IAAI,YAAY;AAIpC,cAAM,KAAK,4BAAA;AACX,aAAK,yBAAyB,mBAAmB;AACjD,cAAM,sBAAsB,MAAM,KAAK;AAAA,UACrC;AAAA,UACA;AAAA,QAAA;AAEF,aAAK,yBAAyB,mBAAmB;AACjD,cAAM,wBAAwB,IAAI,IAAI,mBAAmB;AACzD,cAAM,oBAAoB,UAAU;AAAA,UAAO,CAAC,aAC1C,sBAAsB,IAAI,SAAS,UAAU;AAAA,QAAA;AAG/C,YAAI,kBAAkB,WAAW,UAAU,QAAQ;AACjD,gBAAM,IAAI;AAAA,YACR,oCAAoC,kBAAkB,MAAM,OAAO,UAAU,MAAM;AAAA,UAAA;AAAA,QAEvF;AAEA,YAAI;AACF,gBAAM,KAAK,2BAA2B,iBAAiB;AAAA,QACzD,SAAS,OAAO;AACd,gBAAM,KAAK,oBAAoB,OAAO,mBAAmB;AAAA,QAC3D;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UAAI,iBAAiBC,OAAAA,oCAAoC;AACvD,cAAM,KAAK,oBAAoB,OAAO,mBAAmB;AAAA,MAC3D;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,2BAA2B,aAEf;AAChB,SAAK,gBAAA;AACL,UAAM,sBAAsB,KAAK;AAAA,MAC/B,YAAY;AAAA,IAAA;AAGd,QAAI,oBAAoB,WAAW,GAAG;AACpC;AAAA,IACF;AAEA,UAAM,KAAK,qCAAqC,mBAAmB;AAAA,EACrE;AAAA,EAEA,UAAyB;AACvB,SAAK,iBAAA;AACL,UAAM,iBAAuC,CAAA;AAC7C,UAAM,WAA2B,CAAA;AACjC,UAAM,UAAU,CAAC,aAA+B;AAC9C,UAAI;AACF,iBAAA;AAAA,MACF,SAAS,OAAO;AACd,iBAAS,KAAK,KAAK;AAAA,MACrB;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,gBAAgB;AAChC,iBAAW,WAAW,KAAK,cAAc,OAAA,GAAU;AACjD,gBAAQ,MAAM;AACZ,yBAAe;AAAA,YACb,KAAK,YAAY,YACd,2BAA2B,KAAK,cAAc,OAAO,EACrD,MAAM,CAAC,UAAU;AAChB,mBAAK,gBAAgB,KAAK;AAAA,YAC5B,CAAC;AAAA,UAAA;AAAA,QAEP,CAAC;AAAA,MACH;AAAA,IACF;AAEA,YAAQ,MAAM,KAAK,0BAA0B;AAC7C,SAAK,yBAAyB;AAE9B,YAAQ,MAAM,KAAK,gCAAgC;AACnD,SAAK,+BAA+B;AAEpC,YAAQ,MAAM,KAAK,yBAAyB;AAC5C,SAAK,wBAAwB;AAE7B,YAAQ,MAAM,KAAK,2BAA2B;AAC9C,SAAK,0BAA0B;AAE/B,QAAI,KAAK,2BAA2B,MAAM;AACxC,mBAAa,KAAK,sBAAsB;AACxC,WAAK,yBAAyB;AAAA,IAChC;AAEA,SAAK,2BAA2B,MAAA;AAChC,SAAK,cAAc,MAAA;AACnB,SAAK,gBAAgB,MAAA;AACrB,eAAW,eAAe,KAAK,6BAA6B;AAC1D,kBAAY,gBAAgB,IAAIH,GAAAA,6BAA6B;AAAA,IAC/D;AACA,SAAK,4BAA4B,SAAS;AAC1C,SAAK,kBAAkB,SAAS;AAChC,SAAK,kBAAA;AACL,SAAK,aAAa;AAClB,WAAO,QAAQ,IAAI,cAAc,EAAE,KAAK,MAAM;AAC5C,UAAI,SAAS,WAAW,EAAG,OAAM,SAAS,CAAC;AAC3C,UAAI,SAAS,SAAS,GAAG;AACvB,cAAM,IAAI,eAAe,UAAU,8BAA8B;AAAA,UAC/D,OAAO,SAAS,CAAC;AAAA,QAAA,CAClB;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,mBAAyB;AAC/B,SAAK;AACL,SAAK,oBAAoB,IAAI,EAAE,QAAQ,WAAW;AAClD,SAAK,iBAAiB;AACtB,SAAK,gBAAgB,MAAA;AACrB,SAAK,yBAAyB;AAC9B,SAAK,eAAe;AACpB,SAAK,wBAAwB;AAC7B,SAAK,kBAAkB;AACvB,SAAK,6BAA6B;AAClC,SAAK,0BAA0B;AAC/B,SAAK,4BAA4B;AACjC,SAAK,+CAA+B,mCAAmC;AAAA,EACzE;AAAA,EAEQ,kBAA2B,MAA8B;AAC/D,SAAK;AACL,QAAI;AACF,aAAO,KAAA;AAAA,IACT,UAAA;AACE,WAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEQ,6BAAoD;AAC1D,QAAI,CAAC,KAAK,YAAY;AACpB,aAAO,CAAA;AAAA,IACT;AAEA,WAAO,KAAK,WACT,iBAAA,EACA,IAAI,CAAC,aAAa,SAAS,SAAS;AAAA,EACzC;AAAA,EAEQ,qBACN,SACA,SAC6D;AAC7D,WAAO,QAAQ,WAAW,KAAK,cAAc,SAAS;AAAA,MACpD,yBAAyB,KAAK,2BAAA;AAAA,IAA2B,CAC1D;AAAA,EACH;AAAA,EAEA,MAAc,wBACZ,SAC8C;AAC9C,QAAI,CAAC,KAAK,YAAY,QAAQ,UAAU;AACtC,aAAO,CAAA;AAAA,IACT;AAEA,WAAO,KAAK,YAAY,QAAQ;AAAA,MAC9B,KAAK;AAAA,MACL;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,MAAM,kBACJ,SAC8C;AAC9C,SAAK,gBAAA;AACL,WAAO,KAAK,WAAW,IAAI,MAAM,KAAK,wBAAwB,OAAO,CAAC;AAAA,EACxE;AAAA,EAEA,MAAc,oBACZ,SACA,QAOA,SACe;AACf,QAAI,aAAa;AACjB,QAAI;AACJ,UAAM,gBAAgB,KAAK;AAC3B,SAAK;AACL,UAAM,mBAAmB,EAAE,iBAAiB,oBAAI,MAAU;AAC1D,SAAK,yBAAyB;AAC9B,QAAI;AACF,WAAK,gBAAA;AACL,WAAK,sBAAsB,OAAO;AAClC,UAAI;AACF,YAAI;AACJ,YAAI,OAAO,oBAAoB;AAC7B,gBAAM,WAAW,MAAM,QAAQ,mBAAmB,KAAK,cAAc;AAAA,YACnE,yBAAyB,KAAK,2BAAA;AAAA,YAC9B,aAAa;AAAA,UAAA,CACd;AACD,iBAAO,SAAS;AAKhB,cAAI,OAAO,wBAAwB,KAAK,oBAAqB;AAC7D,cAAI,kBAAkB,KAAK,cAAe;AAC1C,eAAK,2BAA2B,QAAQ;AAAA,QAC1C,OAAO;AACL,iBAAO,MAAM,KAAK,qBAAqB,SAAS,OAAO;AAAA,QACzD;AACA,qBAAa;AACb,YAAI,OAAO,wBAAwB,KAAK,oBAAqB;AAC7D,YAAI,kBAAkB,KAAK,cAAe;AAE1C,YACE,CAAC,OAAO,sBACR,KAAK,yBAAyB,WAAW,gBACzC;AACA,qBAAW,OAAO,MAAM;AACtB,6BAAiB,gBAAgB,IAAI,IAAI,GAAG;AAAA,UAC9C;AACA,gBAAM,UAAU,KAAK,sBAAsB,IAAI;AAC/C,cAAI,YAAY,KAAM,OAAM;AAAA,QAC9B;AAAA,MACF,UAAA;AACE,YACE,KAAK,2BAA2B,oBAChC,KAAK,wBAAwB,OAAO,qBACpC;AACA,eAAK,sBAAsB;AAAA,QAC7B;AAAA,MACF;AAEA,UAAI,OAAO,wBAAwB,KAAK,oBAAqB;AAC7D,sBAAgB,MAAM,KAAK,uCAAuC,OAAO;AACzE,UAAI,OAAO,wBAAwB,KAAK,oBAAqB;AAE7D,UAAI,OAAO,uBAAuB,CAAC,eAAe;AAChD,aAAK,wBAAwB,OAAO;AAAA,MACtC;AAAA,IACF,SAAS,OAAO;AACd,UAAI,OAAO,2BAA2B,CAAC,YAAY;AAMjD,aAAK,sBAAsB,OAAO;AAClC,YAAI;AACF,gBAAM,KAAK;AAAA,YACT,OAAO;AAAA,YACP;AAAA,UAAA;AAAA,QAEJ,SAAS,eAAe;AACtB,gBAAM,gBAAgB,KAAK;AAAA,YACzB;AAAA,YACA,OAAO;AAAA,UAAA;AAET,gBAAM;AAAA,QACR,UAAA;AACE,cAAI,KAAK,wBAAwB,OAAO,qBAAqB;AAC3D,iBAAK,sBAAsB;AAAA,UAC7B;AAAA,QACF;AACA,cAAM;AAAA,MACR;AACA,YAAM,KAAK,oBAAoB,OAAO,OAAO,mBAAmB;AAAA,IAClE,UAAA;AACE,UAAI,KAAK,2BAA2B,kBAAkB;AACpD,aAAK,yBAAyB;AAAA,MAChC;AAAA,IACF;AACA,QAAI,iBAAiB,OAAO,6BAA6B;AACvD,YAAM,cAAc;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAc,uDACZ,qBACA,SACe;AACf,QAAI;AAIJ,UAAM,wCAAwB,IAAA;AAC9B,QAAI,gCAAgC;AAEpC,WAAO,KAAK,4BAA4B,SAAS,GAAG;AAClD,YAAM,cAAc,KAAK,4BAA4B,MAAA;AACrD,UAAI,CAAC,YAAa;AAElB,UAAI;AACF,aAAK,yBAAyB,mBAAmB;AACjD,cAAM,mCAAmB,IAAA;AAIzB,cAAM,0CAA0B,IAAA;AAChC,cAAM,gCAAgC,YAAY;AAClD,cAAM,cAAc,CAAC,QAAgC;AACnD,gBAAM,QAAQ,oBAAoB,IAAI,GAAG;AACzC,cAAI,UAAU,OAAW,QAAO;AAChC,cAAI,+BAA+B;AACjC,gCAAoB,IAAI,KAAK,QAAQ;AACrC,mBAAO;AAAA,UACT;AACA,gBAAM,YAAY,kBAAkB,IAAI,GAAG;AAC3C,cAAI,cAAc,QAAW;AAC3B,gCAAoB,IAAI,KAAK,SAAS;AACtC,mBAAO;AAAA,UACT;AACA,gBAAM,UACJ,KAAK,YAAY,gBAAgB,GAAG,MAAM,OACtC,YACA,gCACE,WACA;AACR,8BAAoB,IAAI,KAAK,OAAO;AACpC,iBAAO;AAAA,QACT;AAEA,YAAI,CAAC,YAAY,QAAQ,SAAS;AAChC,qBAAW,CAAC,OAAO,SAAS,KAAK,YAAY,WAAW,WAAW;AACjE,kBAAM,MAAM,UAAU;AACtB,gBACE,UAAU,SAAS,YACnB,YAAY,8BAA8B,IAAI,KAAK,KACnD,YAAY,GAAG,MAAM,WACrB;AACA,kBAAI,iBAAiB,QAAW;AAC9B,sBAAM,WAAW,MAAM,QAAQ;AAAA,kBAC7B,KAAK;AAAA,kBACL;AAAA,oBACE,yBAAyB,KAAK,2BAAA;AAAA,oBAC9B,aAAa;AAAA,kBAAA;AAAA,gBACf;AAEF,qBAAK,yBAAyB,mBAAmB;AACjD,oBAAI,YAAY,QAAQ,QAAS;AACjC,+BAAe,IAAI;AAAA,kBAEf,SAAS,KAKT,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,GAAG,CAAC;AAAA,gBAAA;AAAA,cAEjC;AACA,oBAAM,WAAW,aAAa,IAAI,GAAG;AACrC,kBAAI,aAAa,QAAW;AAC1B,oCAAoB,IAAI,KAAK,QAAQ;AAAA,cACvC,OAAO;AACL,6BAAa,IAAI,KAAK,QAAQ;AAC9B,oCAAoB,IAAI,KAAK,SAAS;AAAA,cACxC;AAAA,YACF;AAEA,gCAAoB;AAAA,cAClB;AAAA,cACA,UAAU,SAAS,WAAW,WAAW;AAAA,YAAA;AAAA,UAE7C;AAEA,cAAI,aAAa,OAAO,GAAG;AAIzB,gBAAI,CAAC,YAAY,QAAQ,SAAS;AAChC,0BAAY,qBAAqB,CAAC,GAAG,aAAa,OAAA,CAAQ,CAAC;AAAA,YAC7D;AAAA,UACF;AAAA,QACF;AAEA,cAAM,qBACJ,MAAM,KAAK,mCAAmC,aAAa,OAAO;AACpE,YAAI,mBAAmB,SAAS;AAC9B,cAAI,YAAY,UAAU;AACxB,4CAAgC;AAChC,8BAAkB,MAAA;AAAA,UACpB;AACA,qBAAW,aAAa,YAAY,YAAY;AAC9C,8BAAkB;AAAA,cAChB,UAAU;AAAA,cACV,UAAU,SAAS,WAAW,WAAW;AAAA,YAAA;AAAA,UAE7C;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,oBAAY,gBAAgB,KAAK;AACjC,mBAAW,aAAa,KAAK,6BAA6B;AACxD,oBAAU,gBAAgB,KAAK;AAAA,QACjC;AACA,aAAK,4BAA4B,SAAS;AAC1C,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,kCAAkC,OAAsB;AAC9D,eAAW,eAAe,KAAK,6BAA6B;AAC1D,kBAAY,gBAAgB,KAAK;AAAA,IACnC;AACA,SAAK,4BAA4B,SAAS;AAAA,EAC5C;AAAA,EAEQ,sBACN,MACoB;AACpB,QACE,CAAC,KAAK,aAAa,SACnB,CAAC,KAAK,aAAa,SACnB,CAAC,KAAK,aAAa,QACnB;AACA,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,kBAAkB,MAAM;AAClC,WAAK,aAAa,QAAQ,EAAE,WAAW,MAAM;AAE7C,iBAAW,OAAO,MAAM;AACtB,YAAI,KAAK,YAAY,gBAAgB,IAAI,GAAG,GAAG;AAC7C;AAAA,QACF;AACA,aAAK,aAAa,QAAQ;AAAA,UACxB,MAAM;AAAA,UACN,OAAO,IAAI;AAAA,UACX,UAAU,IAAI;AAAA,QAAA,CACf;AAAA,MACH;AAEA,aAAO,KAAK,aAAa,SAAA,KAAc;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEQ,4BAA4B,UAKN;AAC5B,WAAO;AAAA,MACL,YAAY,SAAS;AAAA,MACrB,WAAW,SAAS;AAAA,MACpB,kBAAkB,SAAS;AAAA,MAC3B,YAAY,SAAS;AAAA,IAAA;AAAA,EAEzB;AAAA,EAEQ,2BACN,YACS;AACT,UAAM,WAAW,KAAK;AACtB,WACE,aAAa,UACb,SAAS,eAAe,WAAW,cACnC,SAAS,cAAc,WAAW,aAClC,SAAS,qBAAqB,WAAW,oBACzC,SAAS,eAAe,WAAW;AAAA,EAEvC;AAAA,EAEQ,2BAA2B,UAM1B;AACP,UAAM,aAAa,KAAK,4BAA4B,QAAQ;AAC5D,UAAM,yBAAyB,KAAK,yBAAyB;AAO7D,UAAM,6BACH,KAAK,SAAS,kBACb,2BAA2B,gBAC3B,2BAA2B,kBAC5B,KAAK,SAAS,iBACb,2BAA2B,gBAC3B,SAAS,QAAQ,WAAW;AAChC,SAAK;AAAA,MACH,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,IAAA;AAEX,SAAK,0BACH,KAAK,2BAA2B,UAAU,KAAK,6BAC3C,SAAS,SACT,EAAE,QAAQ,eAAA;AAAA,EAClB;AAAA,EAEQ,0BACN,MACA,oBACoB;AACpB,QACE,CAAC,KAAK,aAAa,SACnB,CAAC,KAAK,aAAa,SACnB,CAAC,KAAK,aAAa,UACnB,CAAC,KAAK,aAAa,UACnB;AACA,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,IAAI;AAAA,MACvB,mBAAmB,IAAI,CAAC,EAAE,KAAK,YAAY,CAAC,KAAK,KAAK,CAAC;AAAA,IAAA;AAEzD,UAAM,cAAc,KAAK,aAAa,SAAS,WAC5C,KAAA,EACA,IAAI,CAAC,EAAE,IAAA,MAAU,GAAG;AAEvB,WAAO,KAAK,kBAAkB,MAAM;AAClC,WAAK,aAAa,QAAQ,EAAE,WAAW,MAAM;AAC7C,WAAK,aAAa,WAAA;AAElB,iBAAW,OAAO,MAAM;AACtB,aAAK,aAAa,QAAQ;AAAA,UACxB,MAAM;AAAA,UACN,OAAO,IAAI;AAAA,UACX,UAAU,IAAI;AAAA,QAAA,CACf;AAAA,MACH;AAEA,kBAAY,QAAQ,CAAC,QAAQ;AAC3B,YAAI,CAAC,aAAa,IAAI,GAAG,GAAG;AAC1B,eAAK,aAAa,UAAU,WAAW,OAAO,GAAG;AAAA,QACnD;AAAA,MACF,CAAC;AAED,mBAAa,QAAQ,CAAC,OAAO,QAAQ;AACnC,aAAK,aAAa,UAAU,WAAW,IAAI,KAAK,KAAK;AAAA,MACvD,CAAC;AAED,aAAO,KAAK,aAAa,SAAA,KAAc;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,uCACZ,SAC0C;AAC1C,QAAI;AACJ,WAAO,KAAK,4BAA4B,SAAS,GAAG;AAClD,YAAM,cAAc,KAAK,4BAA4B,MAAA;AACrD,UAAI,CAAC,aAAa;AAChB;AAAA,MACF;AACA,UAAI;AACF,cAAM,UAAU,MAAM,KAAK;AAAA,UACzB;AAAA,UACA;AAAA,QAAA;AAEF,6BAAqB,QAAQ;AAAA,MAC/B,SAAS,OAAO;AACd,oBAAY,gBAAgB,KAAK;AACjC,mBAAW,aAAa,KAAK,6BAA6B;AACxD,oBAAU,gBAAgB,KAAK;AAAA,QACjC;AACA,aAAK,4BAA4B,SAAS;AAC1C,cAAM;AAAA,MACR;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,mCACZ,aACA,eAIC;AACD,SAAK,gBAAA;AACL,SAAK,yBAAyB,YAAY,mBAAmB;AAC7D,UAAM,2BAA2B,YAAY,QAAQ,YAAY;AACjE,QAAI,2BAA2B;AAC/B,QAAI,sBAAsB;AAE1B,QAAI;AACF,YAAM,UAAU,YAAY,WACxB,KAAK,kBAAkB,YAAY,iBAAiB,IACpD,YAAY,kBAAA;AAChB,4BAAsB;AACtB,iCAA2B,YAAY,QAAQ,YAAY;AAC3D,UAAI,YAAY,MAAM;AACpB,aAAK;AACL,YAAI;AACF,gBAAM;AAAA,QACR,UAAA;AACE,eAAK;AAAA,QACP;AAAA,MACF;AACA,WAAK,yBAAyB,YAAY,mBAAmB;AAE7D,UAAI,CAAC,YAAY,UAAU;AACzB,cAAM,KAAK;AAAA,UACT;AAAA,UACA;AAAA,QAAA;AAAA,MAEJ;AACA,kBAAY,iBAAA;AACZ,aAAO,EAAE,SAAS,KAAA;AAAA,IACpB,SAAS,OAAO;AACd,UAAI,CAAC,qBAAqB;AACxB,mCAA2B,YAAY,QAAQ,YAAY;AAAA,MAC7D;AACA,YAAM,UACJ,YAAY,QAAQ,WACpB,iBAAiBA,GAAAA;AACnB,YAAM,iBACJ,WAAW,YAAY,wBAAA,MAA8B;AACvD,YAAM,gBAAgB,KAAK;AAAA,QACzB;AAAA,QACA;AAAA,MAAA;AAEF,kBAAY,gBAAgB,aAAa;AACzC,UAAI,WAAW,CAAC,kBAAkB,YAAY,eAAe;AAC3D,eAAO;AAAA,UACL,SAAS;AAAA,UACT,kBACE,CAAC,4BAA4B,2BACzB,EAAE,QAAQ,kBACV;AAAA,QAAA;AAAA,MAEV;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,mCACN,aACA,OACS;AACT,QAAI,iBAAiBG,OAAAA,oCAAoC;AACvD,aAAO,KAAK,oBAAoB,OAAO,YAAY,mBAAmB;AAAA,IACxE;AACA,UAAM,UACJ,YAAY,QAAQ,WACpB,iBAAiBH,GAAAA;AACnB,QAAI,WAAW,YAAY,wBAAA,MAA8B,MAAM;AAC7D,aAAO;AAAA,IACT;AACA,WAAO,KAAK,oBAAoB,OAAO,YAAY,mBAAmB;AAAA,EACxE;AAAA,EAEA,MAAc,iDACZ,aACA,eACe;AACf,QAAI,YAAY,UAAU;AACxB;AAAA,IACF;AAEA,SAAK,yBAAyB,YAAY,mBAAmB;AAC7D,QACE,CAAC,YAAY,YACb,YAAY,WAAW,WAAW,KAClC,YAAY,kBAAkB,SAAS,KACvC,YAAY,yBAAyB,SAAS,GAC9C;AACA;AAAA,IACF;AAEA,UAAM,iBAAiB,KAAK,wBAAA;AAC5B,UAAM,KAAK,KAAK,gCAAgC,aAAa,cAAc;AAC3E,UAAM,WAAW,MAAM,KAAK,YAAY,YAAY;AAAA,MAClD,KAAK;AAAA,MACL;AAAA;AAAA;AAAA;AAAA,MAIA;AAAA,IAAA;AAEF,QAAI,CAAC,SAAS,IAAI;AAChB,UAAI,SAAS,SAAS,qBAAqB;AACzC,cAAM,QAAQ,IAAIG,OAAAA;AAAAA,UAChB,yCAAyC,KAAK,YAAY,MAAM,SAAS,KAAK;AAAA,UAC9E;AAAA,YACE,OAAO;AAAA,YACP,MAAM,SAAS,cAAc,SAAS;AAAA,YACtC,MAAM,SAAS;AAAA,UAAA;AAAA,QACjB;AAEF,cAAM;AAAA,MACR;AACA,YAAM,IAAI;AAAA,QACR,kEAAkE,SAAS,KAAK;AAAA,MAAA;AAAA,IAEpF;AACA,QAAI,YAAY,wBAAwB,KAAK,oBAAqB;AAClE,SAAK;AAAA,MACH,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,IAAA;AAEX,QACE,YAAY,kCACV,KAAK,yBACP,KAAK,8BAA8B,QACnC;AACA,WAAK,4BAA4B;AAAA,QAC/B,GAAG,KAAK;AAAA,QACR,YAAY,SAAS;AAAA,QACrB,WAAW,SAAS;AAAA,QACpB,kBAAkB,SAAS;AAAA,MAAA;AAAA,IAE/B;AAAA,EACF;AAAA,EAEA,MAAc,iBACZ,IACA,qBACe;AACf,SAAK,gBAAA;AACL,SAAK,yBAAyB,mBAAmB;AACjD,QAAI;AACF,YAAM,KAAK,YAAY,QAAQ,iBAAiB,KAAK,cAAc,EAAE;AAAA,IACvE,SAAS,OAAO;AACd,YAAM,KAAK;AAAA,QACTP,4CAAqC,KAAK,cAAc,KAAK;AAAA,QAC7D;AAAA,MAAA;AAAA,IAEJ;AACA,SAAK,yBAAyB,mBAAmB;AAAA,EACnD;AAAA,EAEQ,gCACN,aACA,gBACa;AACb,WAAO;AAAA,MACL,MAAMN,GAAAA,eAAA;AAAA,MACN,MAAM,eAAe;AAAA,MACrB,KAAK,eAAe;AAAA,MACpB,YAAY,eAAe;AAAA,MAC3B,UAAU,YAAY;AAAA,MACtB,WAAW,YAAY,WAAW;AAAA,QAAI,CAAC,cACrC,UAAU,SAAS,WACf;AAAA,UACE,MAAM;AAAA,UACN,KAAK,UAAU;AAAA,UACf,OAAO,UAAU;AAAA,QAAA,IAEnB;AAAA,UACE,MAAM;AAAA,UACN,KAAK,UAAU;AAAA,UACf,OAAO,UAAU;AAAA,QAAA;AAAA,MACnB;AAAA,MAEN,sBAAsB,MAAM;AAAA,QAC1B,YAAY,kBAAkB,QAAA;AAAA,MAAQ,EACtC;AAAA,QAAI,CAAC,CAAC,KAAK,aAAa,MACxB,cAAc,SAAS,WACnB,EAAE,MAAM,UAAmB,IAAA,IAC3B;AAAA,UACE,MAAM;AAAA,UACN;AAAA,UACA,OAAO,cAAc;AAAA,QAAA;AAAA,MACvB;AAAA,MAEN,6BAA6B,MAAM;AAAA,QACjC,YAAY,yBAAyB,QAAA;AAAA,MAAQ,EAC7C;AAAA,QAAI,CAAC,CAAC,KAAK,aAAa,MACxB,cAAc,SAAS,WACnB,EAAE,MAAM,UAAU,IAAA,IAClB,EAAE,MAAM,OAAO,KAAK,OAAO,cAAc,MAAA;AAAA,MAAM;AAAA,IACrD;AAAA,EAEJ;AAAA,EAEQ,+BACN,WACA,gBACa;AACb,WAAO;AAAA,MACL,MAAMA,GAAAA,eAAA;AAAA,MACN,MAAM,eAAe;AAAA,MACrB,KAAK,eAAe;AAAA,MACpB,YAAY,eAAe;AAAA,MAC3B,WAAW,UAAU,IAAI,CAAC,aAAa;AACrC,YAAI,SAAS,SAAS,UAAU;AAC9B,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,KAAK,SAAS;AAAA,YACd,OAAO,SAAS;AAAA,UAAA;AAAA,QAEpB;AAEA,YAAI,SAAS,SAAS,UAAU;AAC9B,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,KAAK,SAAS;AAAA,YACd,OAAO,SAAS;AAAA,UAAA;AAAA,QAEpB;AAEA,eAAO;AAAA,UACL,MAAM;AAAA,UACN,KAAK,SAAS;AAAA,UACd,OAAO,SAAS;AAAA,QAAA;AAAA,MAEpB,CAAC;AAAA,IAAA;AAAA,EAEL;AAAA,EAEA,MAAc,2BACZ,WACe;AACf,QACE,CAAC,KAAK,aAAa,SACnB,CAAC,KAAK,aAAa,SACnB,CAAC,KAAK,aAAa,QACnB;AACA;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,kBAAkB,MAAM;AAC3C,WAAK,aAAa,QAAQ,EAAE,WAAW,MAAM;AAE7C,iBAAW,YAAY,WAAW;AAChC,YAAI,SAAS,SAAS,UAAU;AAC9B,eAAK,aAAa,QAAQ;AAAA,YACxB,MAAM;AAAA,YACN,KAAK,SAAS;AAAA,UAAA,CACf;AAAA,QACH,OAAO;AACL,eAAK,aAAa,QAAQ;AAAA,YACxB,MAAM;AAAA,YACN,OAAO,SAAS;AAAA,UAAA,CACjB;AAAA,QACH;AAAA,MACF;AAEA,aAAO,KAAK,aAAa,SAAA,KAAc;AAAA,IACzC,CAAC;AAED,QAAI,YAAY,MAAM;AACpB,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,6BACN,WAC2B;AAC3B,UAAM,aAAa,KAAK;AACxB,WAAO,UAAU,OAAO,CAAC,aAAa;AACpC,UAAI,YAAY;AACd,eAAO,SAAS,eAAe;AAAA,MACjC;AACA,aAAO,SAAS,WAAW,OAAO,KAAK;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,iCACZ,WACA,qBACwB;AACxB,SAAK,yBAAyB,mBAAmB;AAOjD,QAAI,KAAK,YAAY,YAAY,4BAA4B;AAC3D,YAAM,oBAAoB,UAAU;AAAA,QAAI,CAAC,aACvC;AAAA,UACE;AAAA,QAAA;AAAA,MACF;AAGF,YAAM,WACJ,MAAM,KAAK,YAAY,YAAY;AAAA,QACjC,KAAK;AAAA,QACL;AAAA,MAAA;AAGJ,WAAK,yBAAyB,mBAAmB;AAEjD,UAAI,CAAC,SAAS,IAAI;AAChB,YAAI,SAAS,SAAS,qBAAqB;AACzC,gBAAM,QAAQ,IAAIa,OAAAA;AAAAA,YAChB,yCAAyC,KAAK,YAAY,MAAM,SAAS,KAAK;AAAA,YAC9E;AAAA,cACE,OAAO;AAAA,cACP,MAAM,SAAS,cAAc,SAAS;AAAA,cACtC,MAAM,SAAS;AAAA,YAAA;AAAA,UACjB;AAEF,gBAAM;AAAA,QACR;AACA,cAAM,IAAI;AAAA,UACR,wDAAwD,SAAS,KAAK;AAAA,QAAA;AAAA,MAE1E;AAEA,WAAK;AAAA,QACH,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,MAAA;AAGX,YAAM,4BAA4B,MAAM;AAAA,QACtC,IAAI,IAAI,SAAS,mBAAmB;AAAA,MAAA;AAEtC,YAAM,uBAAuB,IAAI;AAAA,QAC/B,UAAU,IAAI,CAAC,aAAa,SAAS,UAAU;AAAA,MAAA;AAEjD,YAAM,+BAA+B,0BAA0B;AAAA,QAC7D,CAAC,eAAe,CAAC,qBAAqB,IAAI,UAAU;AAAA,MAAA;AAGtD,UAAI,8BAA8B;AAChC,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAAA,MAEJ;AAEA,aAAO;AAAA,IACT;AAIA,UAAM,iBAAiB,KAAK,wBAAA;AAC5B,UAAM,KAAK,KAAK,+BAA+B,WAAW,cAAc;AACxE,UAAM,KAAK,iBAAiB,IAAI,mBAAmB;AAEnD,SAAK,yBAAyB,mBAAmB;AAEjD,SAAK;AAAA,MACH,KAAK,yBAAyB;AAAA,QAC5B,MAAM,GAAG;AAAA,QACT,KAAK,GAAG;AAAA,QACR,MAAM,GAAG;AAAA,QACT,kBAAkB,GAAG;AAAA,QACrB,aAAa,UACV,OAAO,CAAC,aAAa,SAAS,SAAS,QAAQ,EAC/C,IAAI,CAAC,cAAc;AAAA,UAClB,KAAK,SAAS;AAAA,UACd,OAAO,SAAS;AAAA,QAAA,EAChB;AAAA,QACJ,aAAa,UACV,OAAO,CAAC,aAAa,SAAS,SAAS,QAAQ,EAC/C,IAAI,CAAC,aAAa,SAAS,GAAsB;AAAA,QACpD,sBAAsB,GAAG;AAAA,QACzB,6BAA6B,GAAG;AAAA,MAAA,CACjC;AAAA,IAAA;AAGH,WAAO,UAAU,IAAI,CAAC,aAAa,SAAS,UAAU;AAAA,EACxD;AAAA,EAEQ,yBAAyB,MAWjB;AACd,UAAM,uBAAuB,KAAK,wBAAwB,CAAA;AAC1D,UAAM,8BAA8B,KAAK,+BAA+B,CAAA;AACxE,UAAM,qBACJ,KAAK,uBAAuB,QAC5B,KAAK,YAAY,SACf,KAAK,YAAY,SACjB,qBAAqB,SACrB,4BAA4B,SAC5B;AAEJ,QAAI,oBAAoB;AACtB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,KAAK;AAAA,QACX,KAAK,KAAK;AAAA,QACV,MAAM,KAAK;AAAA,QACX,kBAAkB,KAAK;AAAA,QACvB,oBAAoB;AAAA,MAAA;AAAA,IAExB;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,KAAK;AAAA,MACX,KAAK,KAAK;AAAA,MACV,MAAM,KAAK;AAAA,MACX,kBAAkB,KAAK;AAAA,MACvB,oBAAoB;AAAA,MACpB,aAAa,KAAK;AAAA,MAClB,aAAa,KAAK;AAAA,MAClB;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEQ,wBAAwB,aAAgC;AAC9D,SAAK;AAAA,MACH,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,IAAA;AAGd,UAAM,WAA0C;AAAA,MAC9C,GAAG;AAAA,MACH,QAAQ,KAAK;AAAA,MACb,cAAc,KAAK;AAAA,MACnB,UAAU,KAAK,YAAY,YAAY,UAAA;AAAA,MACvC,IAAI,KAAK,IAAA;AAAA,MACT,SAAS;AAAA,IAAA;AAEX,SAAK,YAAY,YAAY,QAAQ,KAAK,cAAc,QAAQ;AAAA,EAClE;AAAA,EAEQ,sBACN,MACA,KACA,YACM;AACN,QACE,OAAO,KAAK,cACX,SAAS,KAAK,cAAc,MAAM,KAAK,WACxC;AACA,WAAK,aAAa;AAClB,WAAK,YAAY;AAAA,IACnB;AACA,QAAI,aAAa,KAAK,kBAAkB;AACtC,WAAK,mBAAmB;AAAA,IAC1B;AAEA,QAAI,OAAO,KAAK,WAAW;AACzB,WAAK,YAAY;AACjB,WAAK,WAAW;AAAA,IAClB,WAAW,SAAS,KAAK,aAAa,MAAM,KAAK,UAAU;AACzD,WAAK,WAAW;AAAA,IAClB;AACA,QAAI,aAAa,KAAK,iBAAiB;AACrC,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,0BAIN;AACA,SAAK,YAAY,KAAK,IAAI,KAAK,WAAW,KAAK,cAAc,CAAC;AAC9D,SAAK,WAAW,KAAK,IAAI,KAAK,UAAU,KAAK,SAAS,IAAI;AAC1D,SAAK,kBACH,KAAK,IAAI,KAAK,iBAAiB,KAAK,gBAAgB,IAAI;AAE1D,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,KAAK,KAAK;AAAA,MACV,YAAY,KAAK;AAAA,IAAA;AAAA,EAErB;AAAA,EAEQ,aAAa,SAAoC;AAGvD,QAAI,KAAK,KAAK,WAAW,IAAI,OAAO;AACpC,QAAI,OAAO,QAAW;AACpB,WAAK,WAAW,EAAE,KAAK,aAAa;AACpC,WAAK,WAAW,IAAI,SAAS,EAAE;AAAA,IACjC;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,yCAAkD;AACxD,QACE,KAAK,+BACL,KAAK,SAAS,kBACd,KAAK,YAAY,uBAAuB,0BACxC;AACA,aAAO;AAAA,IACT;AAIA,WACE,CAAC,KAAK,YAAY,YAAY,SAAS,KAAK,YAAY,KACxD,KAAK,iCAAiC;AAAA,EAE1C;AAAA,EAEQ,wBAAwB,SAAkC;AAChE,QACE,QAAQ,QAAQ,WAChB,CAAC,KAAK,uCAAA,KACN,KAAK,cAAc,IAAI,KAAK,aAAa,OAAO,CAAC,MAAM,SACvD;AACA;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,aAAa,OAAO;AAC3C,QAAI,KAAK,cAAc,IAAI,SAAS,MAAM,QAAS;AAEnD,SAAK,2BAA2B,IAAI,WAAW,OAAO;AACtD,SAAK,KAAK,gCAAA;AAAA,EACZ;AAAA,EAEQ,4BAAkC;AACxC,QACE,KAAK,+BACL,KAAK,SAAS,kBACd,KAAK,YAAY,uBAAuB,0BACxC;AACA;AAAA,IACF;AAEA,QACE,KAAK,2BAA2B,SAAS,KACzC,KAAK,2BAA2B,MAChC;AACA;AAAA,IACF;AAEA,SAAK,yBAAyB,WAAW,MAAM;AAC7C,WAAK,yBAAyB;AAC9B,WAAK,KAAK,gCAAA;AAAA,IACZ,GAAG,4BAA4B;AAAA,EACjC;AAAA,EAEA,MAAc,kCAAiD;AAC7D,QACE,KAAK,+BACL,KAAK,SAAS,kBACd,KAAK,YAAY,uBAAuB,0BACxC;AACA;AAAA,IACF;AAEA,QAAI,KAAK,2BAA2B,MAAM;AACxC,mBAAa,KAAK,sBAAsB;AACxC,WAAK,yBAAyB;AAAA,IAChC;AAEA,eAAW,CAAC,WAAW,OAAO,KAAK,KAAK,4BAA4B;AAClE,UACE,QAAQ,QAAQ,WAChB,KAAK,cAAc,IAAI,SAAS,MAAM,SACtC;AACA,aAAK,2BAA2B,OAAO,SAAS;AAChD;AAAA,MACF;AACA,UAAI;AACF,cAAM,KAAK,YAAY,YAAY;AAAA,UACjC,KAAK;AAAA,UACL;AAAA,QAAA;AAEF,aAAK,2BAA2B,OAAO,SAAS;AAAA,MAClD,SAAS,OAAO;AACd,YACE,QAAQ,QAAQ,WAChB,KAAK,cAAc,IAAI,SAAS,MAAM,SACtC;AACA,eAAK,2BAA2B,OAAO,SAAS;AAAA,QAClD,OAAO;AACL,kBAAQ,KAAK,mCAAmC,KAAK;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAEA,SAAK,0BAAA;AAAA,EACP;AAAA,EAEQ,gCAAsC;AAC5C,QAAI,KAAK,wBAAwB;AAC/B;AAAA,IACF;AAEA,SAAK,YAAY,YAAY;AAAA,MAC3B,KAAK;AAAA,MACL,KAAK,YAAY;AAAA,IAAA;AAEnB,SAAK,yBAAyB,KAAK,YAAY,YAAY;AAAA,MACzD,KAAK;AAAA,MACL,CAAC,YAAY;AACX,aAAK,qBAAqB,OAAO;AAAA,MACnC;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEQ,qBAAqB,SAA0C;AACrE,QAAI,QAAQ,iBAAiB,KAAK,cAAc;AAC9C;AAAA,IACF;AACA,QAAI,KAAK,6BAA6B;AACpC;AAAA,IACF;AAEA,UAAM,EAAE,YAAY;AACpB,UAAM,sBAAsB,KAAK;AACjC,UAAM,SAAS,QAAQ,aAAa,KAAK,YAAY,YAAY,UAAA;AAKjE,QAAI,qBAAqB,OAAO,GAAG;AACjC,UAAI,KAAK,kBAAkB;AACzB,aAAK,kBAAkB,KAAK;AAAA,UAC1B,aAAa;AAAA,UACb;AAAA,QAAA,CACD;AACD;AAAA,MACF;AAEA,WAAK,KAAK,WACP,IAAI,MAAM,KAAK,yBAAyB,SAAS,mBAAmB,CAAC,EACrE,MAAM,CAAC,UAAU;AAChB,aAAK,oBAAoB,OAAO,mBAAmB;AAAA,MACrD,CAAC;AACH;AAAA,IACF;AAGA,QAAI,QAAQ;AACV;AAAA,IACF;AAEA,QAAI,yBAAyB,OAAO,GAAG;AACrC,WAAK,KAAK,WACP,IAAI,YAAY;AACf,cAAM,KAAK;AAAA,UAAoB,CAAC,YAC9B,KAAK,wBAAwB,SAAS,mBAAmB;AAAA,QAAA;AAE3D,YAAI,wBAAwB,KAAK,qBAAqB;AACpD,gBAAM,KAAK,6BAAA;AAAA,QACb;AAAA,MACF,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,aAAK,oBAAoB,OAAO,mBAAmB;AAAA,MACrD,CAAC;AAAA,IACL;AAAA,EACF;AAAA,EAEA,MAAc,+BAA8C;AAC1D,WAAO,KAAK,kBAAkB,SAAS,GAAG;AACxC,YAAM,SAAS,KAAK,kBAAkB,MAAA;AACtC,UAAI,CAAC,QAAQ;AACX;AAAA,MACF;AACA,YAAM,KAAK;AAAA,QACT,OAAO;AAAA,QACP,OAAO;AAAA,MAAA;AAAA,IAEX;AAAA,EACF;AAAA,EAEA,MAAc,yBACZ,aACA,sBAAsB,KAAK,qBACZ;AACf,QAAI,wBAAwB,KAAK,oBAAqB;AACtD,QAAI,YAAY,OAAO,KAAK,YAAY;AACtC;AAAA,IACF;AAEA,QACE,YAAY,SAAS,KAAK,cAC1B,YAAY,OAAO,KAAK,WACxB;AACA;AAAA,IACF;AAEA,UAAM,sBACJ,YAAY,SAAS,KAAK,cAC1B,YAAY,MAAM,KAAK,YAAY;AACrC,UAAM,oBACJ,YAAY,OAAO,KAAK,cAAc,YAAY,MAAM;AAC1D,UAAM,SAAS,uBAAuB;AAEtC,QAAI,QAAQ;AACV,YAAM,KAAK,wBAAwB,mBAAmB;AACtD,UAAI,wBAAwB,KAAK,oBAAqB;AACtD,UACE,YAAY,OAAO,KAAK,cACvB,YAAY,SAAS,KAAK,cACzB,YAAY,OAAO,KAAK,WAC1B;AACA;AAAA,MACF;AAAA,IACF;AAEA,SAAK;AAAA,MACH,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,IAAA;AAGd,UAAM,KAAK;AAAA,MACT;AAAA,MACA,KAAK,YAAY;AAAA,IAAA;AAEnB,QAAI,wBAAwB,KAAK,qBAAqB;AACpD,YAAM,KAAK,6BAAA;AAAA,IACb;AAAA,EACF;AAAA,EAEA,MAAc,wBACZ,qBACe;AACf,QAAI,wBAAwB,KAAK,oBAAqB;AACtD,QAAI,KAAK,YAAY,YAAY,aAAa,KAAK,oBAAoB,GAAG;AACxE,UAAI;AACJ,UAAI;AACF,uBAAe,MAAM,KAAK,YAAY,YAAY;AAAA,UAChD,KAAK;AAAA,UACL,KAAK;AAAA,QAAA;AAAA,MAET,SAAS,OAAO;AACd,gBAAQ,KAAK,sCAAsC,KAAK;AAAA,MAC1D;AAEA,UAAI,cAAc;AAChB,YAAI,wBAAwB,KAAK,oBAAqB;AAEtD,YAAI,aAAa,IAAI;AACnB,eAAK;AAAA,YACH,aAAa;AAAA,YACb,aAAa;AAAA,YACb,aAAa;AAAA,UAAA;AAEf,cAAI,aAAa,oBAAoB;AACnC,kBAAM,KAAK;AAAA,cAAoB,CAAC,YAC9B,KAAK,0BAA0B,OAAO;AAAA,YAAA;AAExC;AAAA,UACF;AACA,gBAAM,SAAS,aAAa;AAC5B,cAAI,CAAC,QAAQ;AACX,kBAAM,KAAK;AAAA,cAAoB,CAAC,YAC9B,KAAK,0BAA0B,OAAO;AAAA,YAAA;AAExC;AAAA,UACF;AAEA,gBAAM,KAAK,oBAAoB,OAAO,YAAY;AAChD,uBAAW,SAAS,QAAQ;AAC1B,kBAAI,wBAAwB,KAAK,oBAAqB;AACtD,oBAAM,KAAK;AAAA,gBACT;AAAA,kBACE,MAAM;AAAA,kBACN,MAAM,aAAa;AAAA,kBACnB,KAAK,aAAa;AAAA,kBAClB,MAAM,MAAM;AAAA,kBACZ,kBAAkB,MAAM;AAAA,kBACxB,oBAAoB;AAAA,kBACpB,aAAa,MAAM;AAAA,kBACnB,aAAa,MAAM;AAAA,kBACnB,sBAAsB,MAAM;AAAA,kBAC5B,6BACE,MAAM;AAAA,gBAAA;AAAA,gBAEV;AAAA,cAAA;AAEF,kBAAI,wBAAwB,KAAK,oBAAqB;AAAA,YACxD;AAAA,UACF,CAAC;AACD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,wBAAwB,KAAK,oBAAqB;AACtD,UAAM,KAAK;AAAA,MAAoB,CAAC,YAC9B,KAAK,wBAAwB,SAAS,mBAAmB;AAAA,IAAA;AAG3D,QAAI,KAAK,SAAS,gBAAgB;AAChC,iBAAW,WAAW,KAAK,cAAc,OAAA,GAAU;AACjD,aAAK,wBAAwB,OAAO;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,wBACZ,SACA,sBAAsB,KAAK,qBACZ;AACf,QAAI,wBAAwB,KAAK,oBAAqB;AAEtD,SAAK,gBAAgB,MAAA;AACrB,SAAK;AACL,QAAI,KAAK,aAAa,SAAS,KAAK,aAAa,QAAQ;AACvD,YAAM,UAAU,KAAK,kBAAkB,MAAM;AAC3C,aAAK,aAAa,QAAQ,EAAE,WAAW,MAAM;AAC7C,aAAK,aAAa,WAAA;AAClB,eAAO,KAAK,aAAa,SAAA,KAAc;AAAA,MACzC,CAAC;AACD,UAAI,YAAY,KAAM,OAAM;AAAA,IAC9B;AAEA,QAAI,wBAAwB,KAAK,oBAAqB;AACtD,UAAM,KAAK,0BAA0B,OAAO;AAAA,EAC9C;AAAA,EAEA,MAAc,gCACZ,aACA,SACe;AACf,UAAM,sBAAsB,MAC1B,KAAK;AAAA,MACH,CAAC,kBAAkB,KAAK,0BAA0B,aAAa;AAAA,MAC/D;AAAA,IAAA;AAGJ,QAAI,YAAY,oBAAoB;AAClC,YAAM,oBAAA;AACN;AAAA,IACF;AAEA,UAAM,kBACJ,YAAY,YAAY,SAAS,YAAY,YAAY;AAC3D,QAAI,kBAAkB,iCAAiC;AACrD,YAAM,oBAAA;AACN;AAAA,IACF;AAEA,UAAM,qBAAqB,MAAM,KAAK,KAAK,cAAc,OAAA,CAAQ,EAAE;AAAA,MACjE,CAAC,QAAQ,IAAI,SAAS,QAAQ,IAAI,UAAU,QAAQ,IAAI,UAAU;AAAA,IAAA;AAGpE,QAAI,CAAC,sBAAsB,oBAAoB,GAAG;AAChD,YAAM,KAAK,gCAAgC,WAAW;AACtD;AAAA,IACF;AAIA,UAAM,oBAAA;AAAA,EACR;AAAA,EAEA,MAAc,gCACZ,aACe;AACf,UAAM,mBAAmB,MAAM,KAAK,KAAK,cAAc,OAAA,CAAQ,EAAE;AAAA,MAC/D,CAAC,QAAS,IAAI,QAAQC,GAAAA,2BAA2B,IAAI,KAAK,IAAI;AAAA,IAAA;AAGhE,UAAM,UAAU,KAAK,kBAAkB,MAAM;AAC3C,WAAK,aAAa,QAAQ,EAAE,WAAW,MAAM;AAE7C,iBAAW;AAAA,QACT,KAAK;AAAA,QACL,OAAO;AAAA,MAAA,KACJ,YAAY,aAAa;AAC5B,cAAM,mBAAmB,iBAAiB,KAAK,CAAC,cAAc;AAC5D,cAAI,CAAC,UAAW,QAAO;AACvB,iBAAOC,GAAAA,mBAAmB,UAAU,QAAQ,CAAmB;AAAA,QACjE,CAAC;AAED,YAAI,kBAAkB;AACpB,eAAK,aAAa,QAAQ,EAAE,MAAM,UAAU,OAAO,UAAe;AAAA,QACpE,WAAW,KAAK,YAAY,IAAI,UAAkB,MAAM,QAAW;AACjE,eAAK,aAAa,QAAQ,EAAE,MAAM,UAAU,KAAK,YAAoB;AAAA,QACvE;AAAA,MACF;AAEA,iBAAW,cAAc,YAAY,aAAa;AAChD,aAAK,aAAa,QAAQ,EAAE,MAAM,UAAU,KAAK,YAAoB;AAAA,MACvE;AAEA,kBAAY,sBAAsB,QAAQ,CAAC,aAAa;AACtD,YAAI,SAAS,SAAS,UAAU;AAC9B,eAAK,aAAa,UAAU,IAAI,OAAO,SAAS,GAAW;AAAA,QAC7D,OAAO;AACL,eAAK,aAAa,UAAU,IAAI;AAAA,YAC9B,SAAS;AAAA,YACT,SAAS;AAAA,UAAA;AAAA,QAEb;AAAA,MACF,CAAC;AAED,kBAAY,6BAA6B,QAAQ,CAAC,aAAa;AAC7D,YAAI,SAAS,SAAS,UAAU;AAC9B,eAAK,aAAa,UAAU,WAAW,OAAO,SAAS,GAAG;AAAA,QAC5D,OAAO;AACL,eAAK,aAAa,UAAU,WAAW;AAAA,YACrC,SAAS;AAAA,YACT,SAAS;AAAA,UAAA;AAAA,QAEb;AAAA,MACF,CAAC;AAED,aAAO,KAAK,aAAa,SAAA,KAAc;AAAA,IACzC,CAAC;AACD,QAAI,YAAY,KAAM,OAAM;AAAA,EAC9B;AAAA,EAEA,MAAc,0BACZ,SACe;AACf,UAAM,sBAAsB,KAAK;AACjC,UAAM,qBAAqB,KAAK;AAChC,UAAM,sBACJ,KAAK,cAAc,OAAO,IACtB,MAAM,KAAK,KAAK,cAAc,OAAA,CAAQ,IACtC,CAAC,CAAA,CAAE;AAET,SAAK,gBAAgB,MAAA;AACrB,SAAK;AACL,UAAM,mBAAmB,EAAE,iBAAiB,oBAAI,MAAU;AAC1D,SAAK,yBAAyB;AAC9B,SAAK,sBAAsB;AAC3B,QAAI;AACF,YAAM,iCAAiB,IAAA;AACvB,YAAM,qBACJ,MAAM,KAAK,+BAA+B,OAAO;AACnD,UAAI,wBAAwB,KAAK,oBAAqB;AACtD,iBAAW,WAAW,qBAAqB;AACzC,cAAM,aAAa,MAAM,KAAK,qBAAqB,SAAS,OAAO;AACnE,YAAI,wBAAwB,KAAK,oBAAqB;AACtD,mBAAW,OAAO,YAAY;AAC5B,qBAAW,IAAI,IAAI,KAAK;AAAA,YACtB,OAAO,IAAI;AAAA,YACX,UAAU,IAAI;AAAA,UAAA,CACf;AAAA,QACH;AAAA,MACF;AAEA,iBAAW,OAAO,WAAW,QAAQ;AACnC,yBAAiB,gBAAgB,IAAI,GAAG;AAAA,MAC1C;AAEA,YAAM,UAAU,KAAK;AAAA,QACnB,MAAM,KAAK,WAAW,QAAA,CAAS,EAAE,IAAI,CAAC,CAAC,KAAK,GAAG,OAAO;AAAA,UACpD;AAAA,UACA,OAAO,IAAI;AAAA,UACX,UAAU,IAAI;AAAA,QAAA,EACd;AAAA,QACF;AAAA,MAAA;AAEF,UAAI,YAAY,KAAM,OAAM;AAAA,IAC9B,UAAA;AACE,UACE,KAAK,2BAA2B,oBAChC,KAAK,wBAAwB,qBAC7B;AACA,aAAK,sBAAsB;AAAA,MAC7B;AACA,UAAI,KAAK,2BAA2B,kBAAkB;AACpD,aAAK,yBAAyB;AAAA,MAChC;AAAA,IACF;AACA,QAAI,wBAAwB,KAAK,qBAAqB;AACpD,YAAM,KAAK,uCAAuC,OAAO;AAIzD,UACE,uBAAuB,KAAK,4BAC5B,KAAK,kBAAkB,WAAW,GAClC;AACA,mBAAW,WAAW,qBAAqB;AACzC,cAAI,KAAK,cAAc,IAAI,KAAK,aAAa,OAAO,CAAC,MAAM,SAAS;AAClE,iBAAK,gBAAgB,IAAIJ,GAAAA,uBAAuB,OAAO,CAAC;AAAA,UAC1D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gCAAsC;AAC5C,QACE,CAAC,KAAK,cACN,KAAK,yBACL,KAAK,yBACL;AACA;AAAA,IACF;AAEA,SAAK,wBAAwB,KAAK,WAAW,GAAG,eAAe,CAAC,UAAU;AACxE,WAAK,KAAK,qBAAqB,MAAM,KAAK;AAAA,IAC5C,CAAC;AACD,SAAK,0BAA0B,KAAK,WAAW;AAAA,MAC7C;AAAA,MACA,CAAC,UAAU;AACT,aAAK,KAAK,iBAAiB,MAAM,KAAK;AAAA,MACxC;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,MAAc,0BACZ,uBACA,UAAuC,KAAK,YAAY,SAClC;AACtB,UAAM,aAAa,KAAK;AACxB,QAAI,CAAC,cAAc,CAAC,uBAAuB;AACzC,iCAAW,IAAA;AAAA,IACb;AAEA,UAAM,gBACJ,yBAAyB,YAAY,iBAAA,KAAsB,CAAA;AAC7D,UAAM,oDAAoC,IAAA;AAC1C,eAAW,YAAY,eAAe;AACpC,UAAI,MAAM,KAAK,0BAA0B,UAAU,OAAO,GAAG;AAC3D,sCAA8B,IAAI,SAAS,SAAS;AAAA,MACtD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,mCACZ,eACA,+BACe;AACf,eAAW,YAAY,eAAe;AACpC,YAAM,KAAK;AAAA,QACT;AAAA,QACA,8BAA8B,IAAI,SAAS,SAAS;AAAA,MAAA;AAAA,IAExD;AAAA,EACF;AAAA,EAEQ,wBACN,OACoB;AACpB,WAAO;AAAA,MACL,eAAe,CAAC,gBAAgB,MAAM,UAAU,CAAC;AAAA,MACjD,UAAU;AAAA,QACR,MAAM,MAAM,QAAQ;AAAA,QACpB,UAAU,qBAAqB,MAAM,QAAQ;AAAA,QAC7C,SAAS,qBAAqB,MAAM,OAAO;AAAA,MAAA;AAAA,IAC7C;AAAA,EAEJ;AAAA,EAEA,MAAc,qBACZ,eACA,UAAuC,KAAK,YAAY,SACzC;AACf,UAAM,mBAAmB,MAAM,KAAK;AAAA,MAClC;AAAA,MACA;AAAA,IAAA;AAEF,UAAM,KAAK,iCAAiC,eAAe,gBAAgB;AAAA,EAC7E;AAAA,EAEA,MAAc,0BACZ,eACA,SACkB;AAClB,UAAM,OAAO,KAAK,wBAAwB,aAAa;AAEvD,QAAI;AACF,YAAM,QAAQ;AAAA,QACZ,KAAK;AAAA,QACL,cAAc;AAAA,QACd;AAAA,MAAA;AAEF,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,KAAK,gDAAgD,KAAK;AAClE,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,iCACZ,eACA,kBACe;AACf,UAAM,OAAO,KAAK,wBAAwB,aAAa;AAEvD,QAAI;AACF,YAAM,KAAK,YAAY,YAAY;AAAA,QACjC,KAAK;AAAA,QACL,cAAc;AAAA,QACd;AAAA,QACA,mBAAmB,KAAK,YAAY,UAAU;AAAA,QAC9C;AAAA,MAAA;AAAA,IAEJ,SAAS,OAAO;AACd,cAAQ;AAAA,QACN;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAAA,EACF;AAAA,EAEA,MAAc,iBACZ,eACe;AACf,QAAI,CAAC,KAAK,YAAY,QAAQ,kBAAkB;AAC9C;AAAA,IACF;AAEA,QAAI;AACF,YAAM,KAAK,YAAY,QAAQ;AAAA,QAC7B,KAAK;AAAA,QACL,cAAc;AAAA,MAAA;AAAA,IAElB,SAAS,OAAO;AACd,cAAQ,KAAK,2CAA2C,KAAK;AAAA,IAC/D;AAAA,EACF;AACF;AAEA,SAAS,wBAIP,kBACA,SACA,oBACqB;AACrB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,CAAC,WAAW;AAChB,YAAM,mBAAwD,CAAA;AAC9D,YAAM,iCAEF,CAAA;AACJ,YAAM,qBAAqB,MACzB,iBAAiB,iBAAiB,SAAS,CAAC;AAC9C,YAAM,oCAAoC,CACxC,aACA,UACG;AACH,cAAM,UAAU,YAAY;AAC5B,oBAAY,8BAA8B;AAC1C,YAAI,CAAC,QAAS;AACd,mBAAW,UAAU,SAAS;AAC5B,cAAI,UAAU,OAAW,QAAO,QAAA;AAAA,cAC3B,QAAO,OAAO,KAAK;AAAA,QAC1B;AAAA,MACF;AACA,YAAM,yBAAyB,CAC7B,gBACG;AACH,YAAI,YAAY,YAAY,CAAC,QAAQ,iBAAkB;AACvD,cAAM,oBAAoB,QAAQ,qBAAA;AAClC,YACE,YAAY,sBAAsB,UAClC,YAAY,sBAAsB,mBAClC;AACA,gBAAM,IAAIZ,OAAAA;AAAAA,YACR;AAAA,UAAA;AAAA,QAEJ;AACA,oBAAY,yBAAyB;AACrC,oBAAY,oBAAoB;AAChC,oBAAY,mBAAmB,QAAQ,0BAAA;AAAA,MACzC;AACA,YAAM,iCAAiC,CACrC,gBACG;AACH,YACE,YAAY,sBAAsB,UAClC,YAAY,sBAAsB,QAAQ,wBAC1C;AACA,gBAAM,IAAIA,OAAAA;AAAAA,YACR;AAAA,UAAA;AAAA,QAEJ;AAAA,MACF;AACA,YAAM,gCAAgC,CACpC,gBACG;AACH,cAAM,kBAAkB,mBAAA;AACxB,YAAI,mBAAmB,CAAC,gBAAgB,UAAU;AAChD,sBAAY,wBAAwB;AAAA,QACtC;AAAA,MACF;AACA,YAAM,sCAAsC,CAC1C,gBACG;AACH,cAAM,QAAQ,+BAA+B,QAAQ,WAAW;AAChE,YAAI,UAAU,GAAI,gCAA+B,OAAO,OAAO,CAAC;AAAA,MAClE;AACA,YAAM,2BAA2B,CAC/B,gBACG;AACH,4CAAoC,WAAW;AAAA,MACjD;AACA,YAAM,2BAA2B,CAC/B,aACA,YACG;AACH,aAAK,QAAQ;AAAA,UACX,MAAM,yBAAyB,WAAW;AAAA,UAC1C,MAAM;AACJ,qCAAyB,WAAW;AAAA,UACtC;AAAA,QAAA;AAAA,MAEJ;AACA,YAAM,6BAA6B,CAAC,QAAc;AAChD,iBACM,QAAQ,+BAA+B,SAAS,GACpD,SAAS,GACT,SACA;AACA,gBAAM,cAAc,+BAA+B,KAAK;AACxD,gBAAM,QAAQ,YAAY,kBAAkB,IAAI,GAAG;AACnD,cAAI,OAAO;AACT,0CAA8B,WAAW;AACzC,mBAAO,EAAE,OAAO,MAAM,MAAA;AAAA,UACxB;AACA,cAAI,YAAY,UAAU;AACxB,0CAA8B,WAAW;AACzC,mBAAO;AAAA,cACL,OAAO;AAAA,cACP,OAAO,EAAE,MAAM,SAAA;AAAA,YAAkB;AAAA,UAErC;AAAA,QACF;AACA,eAAO,EAAE,OAAO,MAAA;AAAA,MAClB;AACA,YAAM,oCAAoC,CAAC,QAAgB;AACzD,iBACM,QAAQ,+BAA+B,SAAS,GACpD,SAAS,GACT,SACA;AACA,gBAAM,cAAc,+BAA+B,KAAK;AACxD,gBAAM,QAAQ,YAAY,yBAAyB,IAAI,GAAG;AAC1D,cAAI,OAAO;AACT,0CAA8B,WAAW;AACzC,mBAAO,EAAE,OAAO,MAAM,MAAA;AAAA,UACxB;AAAA,QACF;AACA,eAAO,EAAE,OAAO,MAAA;AAAA,MAClB;AACA,UAAI,mBAAyC;AAC7C,UAAI,sBAAqD;AACzD,UAAI;AACJ,YAAM,uBAAuB,IAAI,QAAc,CAAC,YAAY;AAC1D,sCAA8B;AAAA,MAChC,CAAC;AACD,YAAM,eAAe,EAAE,WAAW,MAAA;AAClC,YAAM,cAAc,MAAM,aAAa;AAKvC,YAAM,mCAAmB,IAAA;AACzB,YAAM,8BAA8B,CAClC,aACA,SACA,gBACkB;AAClB,YAAI,QAAQ,QAAQ,SAAS;AAC3B,iBAAO,QAAQ;AAAA,YACb,QAAQ,OAAO,UAAU,IAAIW,GAAAA,4BAAA;AAAA,UAA4B;AAAA,QAE7D;AACA,eAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,gBAAM,UACJ,YAAY,gCACX,YAAY,kDAAkC;AACjD,cAAI,UAAU;AACd,gBAAM,SAAS,CAAC,WAAuB;AACrC,gBAAI,QAAS;AACb,sBAAU;AACV,oBAAQ,OAAO,MAAM;AACrB,oBAAQ,QAAQ,oBAAoB,SAAS,KAAK;AAClD,wBAAY,sBAAsB;AAClC,mBAAA;AAAA,UACF;AACA,gBAAM,SAAS;AAAA,YACb,SAAS,MAAM,OAAO,OAAO;AAAA,YAC7B,QAAQ,CAAC,UAAmB,OAAO,MAAM,OAAO,KAAK,CAAC;AAAA,UAAA;AAExD,gBAAM,QAAQ,MACZ,OAAO;AAAA,YACL,QAAQ,QAAQ,UAAU,IAAIA,GAAAA,4BAAA;AAAA,UAA4B;AAE9D,kBAAQ,IAAI,MAAM;AAClB,kBAAQ,QAAQ,iBAAiB,SAAS,OAAO,EAAE,MAAM,MAAM;AAC/D,sBAAY,sBAAsB,OAAO;AAAA,QAC3C,CAAC;AAAA,MACH;AACA,YAAM,qBAAqB,MAAM,QAAQ,0BAAA;AACzC,YAAM,sBAAsB,CAAC,UAAmB;AAC9C,YAAI,oBAAoB,YAAA,EAAc,WAAW,WAAW;AAC1D,kBAAQ,gBAAgB,KAAK;AAC7B;AAAA,QACF;AAGA,cAAM,oBAAoB,QAAQ,cAAA,GAAiB;AAAA,UACjD,MAAM;AACJ,gBAAI,CAAC,YAAA,KAAiB,CAAC,sBAAsB;AAC3C,sBAAQ,gBAAgB,KAAK;AAAA,YAC/B;AAAA,UACF;AAAA,UACA,MAAM;AAAA,QAAA;AAAA,MAEV;AACA,YAAM,yBAAyB,CAAC,UAAmC;AACjE,cAAM,WAAW,QAAQ,OAAO,KAAK;AACrC,aAAK,SAAS,MAAM,MAAM,MAAS;AACnC,eAAO;AAAA,MACT;AACA,YAAM,+BAA+B,CACnC,aACA,WACuB;AACvB,YAAI,YAAY,uBAAuB,QAAW;AAChD,iBAAO,YAAY;AAAA,QACrB;AACA,YAAI;AACF,yCAA+B,WAAW;AAC1C,qBAAW,OAAO,YAAY,qCAAqC;AACjE,gBACE,CAAC,YAAY,kBAAkB,gBAAgB,IAAI,GAAG,KACtD,CAAC,YAAY,kBAAkB,IAAI,GAAG,GACtC;AACA,0BAAY,kBAAkB,IAAI,KAAK,EAAE,MAAM,UAAU;AAAA,YAC3D;AAAA,UACF;AACA,sBAAY,oCAAoC,MAAA;AAKhD,iBAAO;AAAA,YACL,YAAY,yBACR,EAAE,WAAW,KAAA,IACb,YAAY;AAAA,UAAA;AAElB,cAAI,YAAY,SAAU,QAAO,SAAA;AACjC,qBAAW,aAAa,YAAY,YAAY;AAC9C,gBAAI,UAAU,SAAS,UAAU;AAC/B,qBAAO,MAAM,EAAE,MAAM,UAAU,KAAK,UAAU,KAAK;AAAA,YACrD,OAAO;AACL,qBAAO,MAAM;AAAA,gBACX,MAAM;AAAA,gBACN,OAAO,UAAU;AAAA,gBACjB,UAAU,UAAU;AAAA,cAAA,CACrB;AAAA,YACH;AAAA,UACF;AACA,cAAI,OAAO,UAAU;AACnB,uBAAW,CAAC,KAAK,KAAK,KAAK,YAAY,mBAAmB;AACxD,kBAAI,MAAM,SAAS,iBAAiB,SAAS,IAAI,OAAO,GAAG;AAAA,0BAC/C,SAAS,IAAI,IAAI,KAAK,MAAM,KAAK;AAAA,YAC/C;AACA,uBAAW,CAAC,KAAK,KAAK,KAAK,YAAY,0BAA0B;AAC/D,kBAAI,MAAM,SAAS;AACjB,uBAAO,SAAS,WAAW,OAAO,GAAG;AAAA,0BAC3B,SAAS,WAAW,IAAI,KAAK,MAAM,KAAK;AAAA,YACtD;AAAA,UACF;AAEA,gBAAM,UAAU,OAAO,OAAO,MAAM;AACpC,sBAAY,qBAAqB;AACjC,cAAI,YAAY,MAAM;AACpB,gDAAoC,WAAW;AAAA,UACjD,OAAO;AACL,iBAAK,QAAQ;AAAA,cACX,MAAM,oCAAoC,WAAW;AAAA,cACrD,MAAM,oCAAoC,WAAW;AAAA,YAAA;AAAA,UAEzD;AACA,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,8CAAoC,WAAW;AAC/C,gBAAM;AAAA,QACR;AAAA,MACF;AACA,cAAQ,gBAAgB;AAAA,QACtB,OAAO,OAAO;AAAA,QACd,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,QACjB,UAAU,OAAO,YAAY;AAAA,QAC7B,WAAW,OAAO;AAAA,MAAA,CACnB;AACD,cAAQ;AAAA,QACN,OAAO;AAAA,MAAA;AAGT,YAAM,wBAA2D;AAAA,QAC/D,UAAUM,GAAAA;AAAAA,QACV,SAASC,GAAAA;AAAAA,QACT,iBAAiB,YAAY;AAC3B,cAAI,aAAa,UAAW;AAC5B,cAAI;AACF,kBAAM,QAAQ,6BAAA;AAAA,UAChB,SAAS,OAAO;AACd,kBAAM,QAAQ,gBAAgB,KAAK;AAAA,UACrC;AAAA,QACF;AAAA,QACA,mBAAmB,CAAC,YAClB,aAAa,YACT,QAAQ,QAAQ,EAAE,IAClB,QAAQ,kBAAkB,OAAO;AAAA,QACvC,gBAAgB;AAAA,UACd,SAAS,YAAY;AACnB,gBAAI,aAAa,UAAW;AAC5B,gBAAI;AACF,oBAAM,QAAQ,8BAAA;AAAA,YAChB,SAAS,OAAO;AACd,oBAAM,QAAQ,gBAAgB,KAAK;AAAA,YACrC;AAAA,UACF;AAAA,UACA,mBAAmB,MACjB,aAAa,YAAY,SAAY,QAAQ,kBAAA;AAAA,UAC/C,qBAAqB,MAAM;AACzB,gBAAI,aAAa,UAAW;AAC5B,kBAAM,kBAAkB,mBAAA;AACxB,gBAAI,CAAC,iBAAiB;AACpB,oBAAM,IAAIlB,OAAAA;AAAAA,gBACR;AAAA,cAAA;AAAA,YAEJ;AACA,4BAAgB,gCACd,QAAQ,yBAAA;AAAA,UACZ;AAAA,QAAA;AAAA,MACF;AAGF,YAAM,gBAAgB;AAAA,QACpB,GAAG;AAAA,QACH,WAAW;AAAA,QACX,WAAW,MAAM;AACf,cAAI,aAAa,aAAa,qBAAsB;AACpD,gBAAM,oBAAoB,QAAQ,cAAA,GAC/B,KAAK,YAAY;AAChB,gBAAI,YAAA,KAAiB,qBAAsB;AAC3C,kBAAM;AACN,gBAAI;AACF,oBAAM;AAAA,YACR,SAAS,OAAO;AACd,kCAAoB,KAAK;AACzB;AAAA,YACF;AACA,gBAAI,YAAA,KAAiB,qBAAsB;AAC3C,mBAAO,UAAA;AAAA,UACT,CAAC,EACA,MAAM,MAAM,MAAS;AAAA,QAC1B;AAAA,QACA,OAAO,CAAC,YAAsC;AAC5C,cAAI,aAAa,UAAW,QAAO;AACnC,gBAAM,kBAAkB,mBAAA;AACxB,gBAAM,WAAW,QAAQ,qBAAA;AACzB,gBAAM,cAA4C;AAAA,YAChD,YAAY,CAAA;AAAA,YACZ,mDAAmC,IAAA;AAAA,YACnC,uCAAuB,IAAA;AAAA,YACvB,8CAA8B,IAAA;AAAA,YAC9B,yDAAyC,IAAA;AAAA,YACzC,UAAU;AAAA,YACV;AAAA,YACA,qBAAqB,QAAQ,uBAAA;AAAA,YAC7B,cAAc;AAAA,YACd,mCAAmB,IAAA;AAAA,YACnB,uBAAuB;AAAA,YACvB,wBACE,oBAAoB,UACpB,CAAC,YACD,QAAQ,eAAA;AAAA,YACV,mBACE,oBAAoB,UAAa,CAAC,WAC9B,QAAQ,yBACR;AAAA,YACN,kBACE,oBAAoB,UACpB,CAAC,YACD,QAAQ,mBACJ,QAAQ,0BAAA,IACR;AAAA,YACN,GAAI,oBAAoB,SAAY,CAAA,IAAK,EAAE,gBAAA;AAAA,UAAgB;AAE7D,2BAAiB,KAAK,WAAW;AAAA,QACnC;AAAA,QACA,OAAO,CAAC,YAAsD;AAC5D,cAAI,aAAa,UAAW;AAC5B,gBAAM,kBAAkB,mBAAA;AACxB,gBAAM,kBACJ,iBAAiB,mBAAmB,mBAAA;AACtC,cAAI,iBAAiB;AACnB,gBAAI;AACF,8BAAgB,kBAAkB;AACpC;AAAA,UACF;AACA,cAAI,CAAC,iBAAiB;AACpB,kBAAM,IAAImB,GAAAA,mCAAA;AAAA,UACZ;AACA,iCAAuB,eAAe;AACtC,gBAAM,gBAAgB,QAAQ,0BAA0B,OAAO;AAE/D,cACE,QAAQ,SAAS,YACjB,iBAAiB,kBAAkB,QACnC;AACA,gBAAI,CAAC,gBAAgB,UAAU;AAC7B,8BAAgB,8BAA8B;AAAA,gBAC5C,gBAAgB,WAAW;AAAA,cAAA;AAAA,YAE/B;AACA,uBAAW,WAAW,gCAAgC;AACpD,kBACE,QAAQ,YACR,QAAQ,cAAc,IAAI,cAAc,UAAU,GAAG,GACrD;AACA,8CAA8B,OAAO;AAAA,cACvC;AAAA,YACF;AAAA,UACF;AAEA,0BAAgB,WAAW,KAAK,cAAc,SAAS;AACvD,0BAAgB,cAAc,IAAI,cAAc,UAAU,GAAG;AAC7D,cAAI,cAAc,UAAU,SAAS,UAAU;AAC7C,4BAAgB,kBAAkB,IAAI,cAAc,UAAU,KAAK;AAAA,cACjE,MAAM;AAAA,YAAA,CACP;AAAA,UACH,WACE,QAAQ,SAAS,YACjB,cAAc,UAAU,aAAa,QACrC;AAIA,gBAAI,gBAAgB,wBAAwB;AAC1C,8BAAgB,oCAAoC;AAAA,gBAClD,cAAc,UAAU;AAAA,cAAA;AAAA,YAE5B,WACE,CAAC,gBAAgB,kBAAkB;AAAA,cACjC,cAAc,UAAU;AAAA,YAAA,GAE1B;AACA,8BAAgB,kBAAkB;AAAA,gBAChC,cAAc,UAAU;AAAA,gBACxB;AAAA,kBACE,MAAM;AAAA,gBAAA;AAAA,cACR;AAAA,YAEJ;AAAA,UACF,WAAW,cAAc,UAAU,aAAa,QAAW;AACzD,4BAAgB,kBAAkB,IAAI,cAAc,UAAU,KAAK;AAAA,cACjE,MAAM;AAAA,cACN,OAAO,cAAc,UAAU;AAAA,YAAA,CAChC;AAAA,UACH;AAAA,QACF;AAAA,QACA,UAAU,OAAO,WACb;AAAA,UACE,aAAa;AAAA,UACb,KAAK;AAAA,YACH,KAAK,CAAC,QAAc;AAClB,kBAAI,aAAa,UAAW,QAAO;AACnC,oBAAM,kBAAkB,mBAAA;AACxB,oBAAM,eACJ,iBAAiB,kBAAkB,IAAI,GAAG;AAC5C,kBAAI,cAAc;AAChB,uBAAO,aAAa,SAAS,WACzB,SACA,aAAa;AAAA,cACnB;AACA,kBAAI,iBAAiB,UAAU;AAC7B,uBAAO;AAAA,cACT;AACA,oBAAM,UAAU,2BAA2B,GAAG;AAC9C,kBAAI,QAAQ,OAAO;AACjB,uBAAO,QAAQ,MAAM,SAAS,WAC1B,SACA,QAAQ,MAAM;AAAA,cACpB;AACA,qBAAO,OAAO,SAAU,IAAI,IAAI,GAAG;AAAA,YACrC;AAAA,YACA,KAAK,CAAC,KAAW,UAAmB;AAClC,kBAAI,aAAa,UAAW;AAC5B,oBAAM,kBAAkB,mBAAA;AACxB,kBAAI,iBAAiB,mBAAmB,mBAAA;AACtC;AACF,kBAAI,CAAC,iBAAiB;AACpB,sBAAM,IAAInB,OAAAA;AAAAA,kBACR;AAAA,gBAAA;AAAA,cAEJ;AACA,8BAAgB,kBAAkB,IAAI,KAAK;AAAA,gBACzC,MAAM;AAAA,gBACN;AAAA,cAAA,CACD;AAAA,YACH;AAAA,YACA,QAAQ,CAAC,QAAc;AACrB,kBAAI,aAAa,UAAW;AAC5B,oBAAM,kBAAkB,mBAAA;AACxB,kBAAI,iBAAiB,mBAAmB,mBAAA;AACtC;AACF,kBAAI,CAAC,iBAAiB;AACpB,sBAAM,IAAIA,OAAAA;AAAAA,kBACR;AAAA,gBAAA;AAAA,cAEJ;AACA,8BAAgB,kBAAkB,IAAI,KAAK;AAAA,gBACzC,MAAM;AAAA,cAAA,CACP;AAAA,YACH;AAAA,UAAA;AAAA,UAEF,YAAY;AAAA,YACV,KAAK,CAAC,QAAgB;AACpB,kBAAI,aAAa,UAAW,QAAO;AACnC,oBAAM,kBAAkB,mBAAA;AACxB,oBAAM,eACJ,iBAAiB,yBAAyB,IAAI,GAAG;AACnD,kBAAI,cAAc;AAChB,uBAAO,aAAa,SAAS,WACzB,SACA,aAAa;AAAA,cACnB;AACA,oBAAM,UAAU,kCAAkC,GAAG;AACrD,kBAAI,QAAQ,OAAO;AACjB,uBAAO,QAAQ,MAAM,SAAS,WAC1B,SACA,QAAQ,MAAM;AAAA,cACpB;AACA,qBAAO,OAAO,SAAU,WAAW,IAAI,GAAG;AAAA,YAC5C;AAAA,YACA,KAAK,CAAC,KAAa,UAAmB;AACpC,kBAAI,aAAa,UAAW;AAC5B,oBAAM,kBAAkB,mBAAA;AACxB,kBAAI,iBAAiB,mBAAmB,mBAAA;AACtC;AACF,kBAAI,CAAC,iBAAiB;AACpB,sBAAM,IAAIA,OAAAA;AAAAA,kBACR;AAAA,gBAAA;AAAA,cAEJ;AACA,8BAAgB,yBAAyB,IAAI,KAAK;AAAA,gBAChD,MAAM;AAAA,gBACN;AAAA,cAAA,CACD;AAAA,YACH;AAAA,YACA,QAAQ,CAAC,QAAgB;AACvB,kBAAI,aAAa,UAAW;AAC5B,oBAAM,kBAAkB,mBAAA;AACxB,kBAAI,iBAAiB,mBAAmB,mBAAA;AACtC;AACF,kBAAI,CAAC,iBAAiB;AACpB,sBAAM,IAAIA,OAAAA;AAAAA,kBACR;AAAA,gBAAA;AAAA,cAEJ;AACA,8BAAgB,yBAAyB,IAAI,KAAK;AAAA,gBAChD,MAAM;AAAA,cAAA,CACP;AAAA,YACH;AAAA,YACA,MAAM,CAAC,WAAoB;AACzB,kBAAI,aAAa,UAAW,QAAO,CAAA;AACnC,oBAAM,SAAS,IAAI;AAAA,gBACjB,OACG,SAAU,WAAW,KAAA,EACrB,IAAI,CAAC,EAAE,KAAK,MAAA,MAAY,CAAC,KAAK,KAAK,CAAC;AAAA,cAAA;AAEzC,oBAAM,oCAAoB,IAAA;AAI1B,yBAAW,eAAe,gCAAgC;AACxD,2BAAW;AAAA,kBACT;AAAA,kBACA;AAAA,gBAAA,KACG,YAAY,0BAA0B;AACzC,sBAAI,CAAC,UAAU,IAAI,WAAW,MAAM,GAAG;AACrC,kCAAc,IAAI,KAAK,WAAW;AAAA,kBACpC;AACA,sBAAI,cAAc,SAAS,UAAU;AACnC,2BAAO,OAAO,GAAG;AAAA,kBACnB,OAAO;AACL,2BAAO,IAAI,KAAK,cAAc,KAAK;AAAA,kBACrC;AAAA,gBACF;AAAA,cACF;AACA,yBAAW,SAAS,IAAI,IAAI,cAAc,OAAA,CAAQ,GAAG;AACnD,8CAA8B,KAAK;AAAA,cACrC;AACA,oBAAM,kBAAkB,mBAAA;AACxB,kBAAI,iBAAiB;AACnB,2BAAW;AAAA,kBACT;AAAA,kBACA;AAAA,gBAAA,KACG,gBAAgB,0BAA0B;AAC7C,sBAAI,cAAc,SAAS,UAAU;AACnC,2BAAO,OAAO,GAAG;AAAA,kBACnB,OAAO;AACL,2BAAO,IAAI,KAAK,cAAc,KAAK;AAAA,kBACrC;AAAA,gBACF;AAAA,cACF;AAEA,qBAAO,MAAM,KAAK,OAAO,QAAA,CAAS,EAC/B,OAAO,CAAC,CAAC,GAAG,MAAO,SAAS,IAAI,WAAW,MAAM,IAAI,IAAK,EAC1D,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO;AAAA,gBACtB;AAAA,gBACA;AAAA,cAAA,EACA;AAAA,YACN;AAAA,UAAA;AAAA,QACF,IAEF;AAAA,QACJ,UAAU,MAAM;AACd,cAAI,aAAa,UAAW;AAC5B,kBAAQ,mBAAA;AACR,gBAAM,kBAAkB,mBAAA;AACxB,cAAI,iBAAiB,mBAAmB,qBAAsB;AAC9D,cAAI,CAAC,iBAAiB;AACpB,kBAAM,IAAImB,GAAAA,mCAAA;AAAA,UACZ;AAEA,0BAAgB,aAAa,CAAA;AAC7B,0BAAgB,cAAc,MAAA;AAC9B,0BAAgB,8BAA8B,MAAA;AAC9C,0BAAgB,kBAAkB,MAAA;AAClC,0BAAgB,oCAAoC,MAAA;AAKpD,0BAAgB,WAAW;AAAA,QAC7B;AAAA,QACA,QAAQ,CAAC,WAAyB;AAChC,cAAI,aAAa,UAAW,QAAO;AACnC,gBAAM,kBAAkB,iBAAiB,IAAA;AACzC,gBAAM,kBACJ,iBAAiB,mBAAmB,mBAAA;AACtC,cAAI,iBAAiB;AACnB,gBAAI,iBAAiB;AACnB,uCAAyB,eAAe;AACxC;AAAA,gBACE;AAAA,gBACA,gBAAgB;AAAA,cAAA;AAAA,YAEpB;AACA,mBAAO,uBAAuB,gBAAgB,KAAK;AAAA,UACrD;AACA,cAAI,CAAC,iBAAiB;AACpB,kBAAM,IAAIC,GAAAA,oCAAA;AAAA,UACZ;AAEA,cAAI,gBAAgB,UAAU;AAC5B,mBAAO,6BAA6B,iBAAiB,MAAM;AAAA,UAC7D;AAEA,cAAI,QAAQ,SAAS;AACnB,qCAAyB,eAAe;AACxC,kBAAM,QAAQ,IAAIT,+BAAA;AAClB,8CAAkC,iBAAiB,KAAK;AACxD,mBAAO,uBAAuB,KAAK;AAAA,UACrC;AACA,cAAI;AACF,mCAAuB,eAAe;AACtC,2CAA+B,eAAe;AAAA,UAChD,SAAS,OAAO;AACd,8CAAkC,iBAAiB,KAAK;AACxD,kBAAM;AAAA,UACR;AACA,gBAAM,cAAc;AAAA,YAClB,YAAY,gBAAgB;AAAA,YAC5B,+BACE,gBAAgB;AAAA,YAClB,mBAAmB,gBAAgB;AAAA,YACnC,0BAA0B,gBAAgB;AAAA,YAC1C,qCACE,gBAAgB;AAAA,YAClB,kBAAkB,gBAAgB;AAAA,YAClC,mBAAmB,gBAAgB;AAAA,YACnC,UAAU,gBAAgB;AAAA,YAC1B,UAAU;AAAA,YACV,qBAAqB,gBAAgB;AAAA,YACrC,cAAc,gBAAgB;AAAA,YAC9B,+BACE,gBAAgB;AAAA,YAClB;AAAA,YACA,sBAAsB,CACpB,SACG;AACH,oBAAM,qBAEF,KAAK,IAAI,CAAC,EAAE,KAAK,OAAO,gBAAgB;AAAA,gBAC1C,MAAM;AAAA,gBACN;AAAA,gBACA;AAAA,gBACA;AAAA,cAAA,EACA;AACF,8BAAgB,aAAa,mBAAmB;AAAA,gBAC9C,gBAAgB;AAAA,cAAA;AAElB,yBAAW,EAAE,KAAK,SAAA,KAAc,MAAM;AACpC,oBACE,aAAa,UACb,CAAC,gBAAgB,kBAAkB,IAAI,GAAG,GAC1C;AACA,kCAAgB,kBAAkB,IAAI,KAAK;AAAA,oBACzC,MAAM;AAAA,oBACN,OAAO;AAAA,kBAAA,CACR;AAAA,gBACH;AAAA,cACF;AAAA,YACF;AAAA,YACA,mBAAmB,MACjB,6BAA6B,iBAAiB,MAAM;AAAA,YACtD,uBAAuB,MAAM,gBAAgB;AAAA,UAAA;AAE/C,0BAAgB,SAAS;AACzB,yCAA+B,KAAK,eAAe;AACnD,cACE,gBAAgB,0BAChB,QAAQ,eAAA,GACR;AACA,gBAAI;AACJ,gBAAI;AACJ,kBAAMU,WAAU,IAAI,QAAc,CAAC,SAAS,WAAW;AACrD,+BAAiB;AACjB,8BAAgB;AAAA,YAClB,CAAC;AACD,iBAAKA,SAAQ,MAAM,MAAM,MAAS;AAClC,oBAAQ,kCAAkC;AAAA,cACxC,GAAG;AAAA,cACH;AAAA,cACA;AAAA,YAAA,CACD;AACD,8CAAkC,eAAe;AACjD,qCAAyB,iBAAiBA,QAAO;AACjD,mBAAOA;AAAAA,UACT;AAEA,cAAI;AACJ,cAAI;AACF,sBAAU,QAAQ,kCAAkC,WAAW;AAAA,UACjE,SAAS,OAAO;AACd,8CAAkC,iBAAiB,KAAK;AACxD,kBAAM;AAAA,UACR;AACA,4CAAkC,eAAe;AACjD,mCAAyB,iBAAiB,OAAO;AACjD,iBAAO;AAAA,QACT;AAAA,MAAA;AAGF,UAAI,eAA8B,CAAA;AAClC,UAAI,sBAAsB;AAC1B,UAAI;AACJ,yBAAmB,QAAQ,cAAA;AAM3B,WAAK,iBAAiB,MAAM,MAAM,MAAS;AAC3C,6BAAuB,YAAY;AACjC,cAAM,QAAQ,4BAAA;AAEd,YAAI,aAAa,WAAW;AAC1B,gCAAsB;AACtB,iBAAO;AAAA,QACT;AAEA,YAAI;AACJ,gCAAwB,IAAI,QAAc,CAAC,YAAY;AACrD,kCAAwB;AAAA,QAC1B,CAAC;AACD,YAAI;AACF,yBAAe;AAAA,YACb,iBAAiB,KAAK,aAAa;AAAA,UAAA;AAAA,QAEvC,UAAA;AACE,kCAAwB;AACxB,gCAAA;AAAA,QACF;AAGA,YAAI,CAAC,aAAa,aAAa,aAAa,YAAY;AACtD,gBAAM,aAAa,OAAO,YAA0C;AAClE,gBAAI,aAAa,WAAW;AAC1B,oBAAM,IAAI,MAAM,2CAA2C;AAAA,YAC7D;AACA,kBAAM,aAAa;AAAA,cACjB;AAAA,YAAA;AAAA,UAEJ;AACA,kBAAQ;AAAA,YACN,OAAO,OAAO,YAAY;AAAA,cACxB,cAAc,CAAC,YACb,aAAa;AAAA,gBACX;AAAA,cAAA;AAAA,cAEJ,SAAS;AAAA,YAAA,CACV;AAAA,UAAA;AAAA,QAEL;AACA,8BAAsB;AACtB,eAAO;AAAA,MACT,GAAA;AACA,kCAAA;AACA,WAAK,oBAAoB,MAAM,CAAC,UAAU;AACxC,4BAAoB,KAAK;AAAA,MAC3B,CAAC;AAED,aAAO;AAAA,QACL,SAAS,YAAY;AACnB,uBAAa,YAAY;AAIzB,gBAAM,kBAAkB;AACxB,gBAAM,eAAe,IAAIV,+BAAA;AACzB,qBAAW,eAAe,aAAa,UAAU;AAC/C,wBAAY,sBAAA;AAAA,UACd;AACA,uBAAa,MAAA;AACb,yCAA+B,SAAS;AACxC,qBAAW,eAAe,kBAAkB;AAC1C,8CAAkC,aAAa,YAAY;AAAA,UAC7D;AACA,2BAAiB,SAAS;AAC1B,cAAI;AACJ,cAAI;AACF,4BAAgB,kBACZ,gBAAgB,KAAK,MAAM,aAAa,UAAA,CAAW,IACnD,QAAQ,QAAQ,aAAa,UAAA,CAAW;AAAA,UAC9C,SAAS,OAAO;AACd,4BAAgB,QAAQ,OAAO,KAAK;AAAA,UACtC;AACA,cAAI;AACJ,cAAI;AACF,6BAAiB,QAAQ,QAAA;AAAA,UAC3B,SAAS,OAAO;AACd,6BAAiB,QAAQ,OAAO,KAAK;AAAA,UACvC;AACA,gBAAM,CAAC,eAAe,cAAc,IAAI,MAAM,QAAQ,WAAW;AAAA,YAC/D;AAAA,YACA;AAAA,UAAA,CACD;AACD,cACE,cAAc,WAAW,cACzB,eAAe,WAAW,YAC1B;AACA,kBAAM,IAAI;AAAA,cACR,CAAC,cAAc,QAAQ,eAAe,MAAM;AAAA,cAC5C;AAAA,cACA,EAAE,OAAO,cAAc,OAAA;AAAA,YAAO;AAAA,UAElC;AACA,cAAI,cAAc,WAAW,WAAY,OAAM,cAAc;AAC7D,cAAI,eAAe,WAAW,WAAY,OAAM,eAAe;AAAA,QACjE;AAAA,QACA,YAAY,CAAC,YAAqD;AAChE,gBAAM,cAAc,EAAE,WAAW,MAAA;AACjC,uBAAa,IAAI,SAAS,WAAW;AACrC,gBAAM,kBAAkB,CACtB,sBACA,gBACyB;AAGzB,gBACE,aAAa,aACb,aAAa,IAAI,OAAO,MAAM,aAC9B;AACA,qBAAO;AAAA,YACT;AACA,gBAAI,CAAC,qBAAqB,WAAY,QAAO;AAC7C,wBAAY,YAAY;AACxB,gBAAI;AAGF,qBAAO,qBAAqB,WAAW,WAAW;AAAA,YACpD,SAAS,OAAO;AACd,0BAAY,YAAY;AACxB,oBAAM;AAAA,YACR;AAAA,UACF;AAEA,gBAAM,kBAAkB,mBAAA;AACxB,gBAAM,4BACJ,mBACA,CAAC,gBAAgB,YACjB,gBAAgB,cAAc;AAChC,gBAAM,WACJ,uBAAuB,CAAC,4BACpB,QAAQ;AAAA,YAAmB;AAAA,YAAS,CAAC,gBACnC,gBAAgB,cAAc,WAAW;AAAA,UAAA,IAE3C;AACN,cAAI,aAAa,QAAW;AAC1B,mBAAO;AAAA,UACT;AAEA,kBAAQ,YAAY;AAClB,kBAAM;AACN,kBAAM,uBAAuB,MAAM;AACnC,gBACE,aAAa,aACb,aAAa,IAAI,OAAO,MAAM,aAC9B;AACA;AAAA,YACF;AACA,kBAAM,qBAAqB,mBAAA;AAG3B,gBACE,sBACA,CAAC,mBAAmB,YACpB,mBAAmB,cAAc,WACjC;AACA,oBAAM;AAAA,gBACJ;AAAA,gBACA;AAAA,gBACA;AAAA,cAAA;AAAA,YAEJ;AACA,gBACE,QAAQ,QAAQ,WAChB,aAAa,IAAI,OAAO,MAAM,aAC9B;AACA;AAAA,YACF;AACA,mBAAO,QAAQ;AAAA,cAAW;AAAA,cAAS,CAAC,gBAClC,gBAAgB,sBAAsB,WAAW;AAAA,YAAA;AAAA,UAErD,GAAA;AAAA,QACF;AAAA,QACA,cAAc,CAAC,YAA+B;AAC5C,gBAAM,cAAc,aAAa,IAAI,OAAO;AAC5C,uBAAa,sBAAA;AACb,uBAAa,OAAO,OAAO;AAC3B,kBAAQ;AAAA,YACN;AAAA,YACA,aAAa,YAAY,aAAa,eAAe;AAAA,UAAA;AAAA,QAEzD;AAAA,MAAA;AAAA,IAEJ;AAAA,EAAA;AAEJ;AAEA,SAAS,yBAGP,SAAmE;AACnE,SAAO;AAAA,IACL,MAAM,CAAC,WAAW;AAChB,cAAQ,gBAAgB;AAAA,QACtB,OAAO,OAAO;AAAA,QACd,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,QACjB,UAAU,OAAO,YAAY;AAAA,QAC7B,WAAW,OAAO;AAAA,MAAA,CACnB;AACD,cAAQ;AAAA,QACN,OAAO;AAAA,MAAA;AAGT,WAAK,QACF,gBACA,KAAK,MAAM;AACV,YAAI,QAAQ,4BAA6B;AACzC,eAAO,UAAA;AAAA,MACT,CAAC,EACA,MAAM,MAAM,MAAS;AAExB,aAAO;AAAA,QACL,YAAY,CAAC,YACX,QAAQ,mBAAmB,OAAO,KAAK,QAAQ,WAAW,OAAO;AAAA,QACnE,SAAS,MAAM,QAAQ,QAAA;AAAA,QACvB,cAAc,CAAC,YACb,QAAQ,aAAa,OAAO;AAAA,MAAA;AAAA,IAElC;AAAA,IACA,iBAAiB,OAAO;AAAA,MACtB,QAAQ;AAAA,IAAA;AAAA,EACV;AAEJ;AAoEO,SAAS,2BAMd,SAK4D;AAC5D,MAAI,CAAC,SAAS,QAAQ,WAAW,GAAG;AAClC,UAAM,IAAIX,OAAAA;AAAAA,MACR;AAAA,IAAA;AAAA,EAEJ;AAEA,QAAM,mBAAmB,oBAAoB,QAAQ,aAAa;AAClE,MAAI,qBAAqB,UAAa,QAAQ,aAAa,aAAa;AACtE,UAAM,IAAIA,OAAAA;AAAAA,MACR;AAAA,IAAA;AAAA,EAEJ;AACA,QAAM,4BACJ,qBAAqB,SACjB,IAAI,0BAA0B,gBAAgB,IAC9C;AAEN,MAAI,cAAc,OAAO,GAAG;AAC1B,QAAI,CAAC,kBAAkB,QAAQ,IAAI,GAAG;AACpC,YAAM,IAAIsB,OAAAA;AAAAA,QACR;AAAA,MAAA;AAAA,IAEJ;AAEA,UAAM;AAAA,MACJ,eAAAC;AAAAA,MACA,eAAeC;AAAAA,MACf,GAAG;AAAA,IAAA,IACD;AACJ,UAAMC,gBACJ,YAAY,MAAM,wBAAwBxB,GAAAA,gBAAgB;AAC5D,UAAMyB,eAAc;AAAA,MAClB,YAAY;AAAA,MACZ;AAAA,QACE,cAAAD;AAAAA,QACA,MAAM;AAAA,QACN,eAAAF;AAAAA,MAAA;AAAA,IACF;AAGF,UAAMI,WAAU,IAAI;AAAA,MAClB;AAAA,MACAF;AAAAA,MACAC;AAAAA,MACA,YAAY,YAAY;AAAA,MACxBD;AAAAA,MACA;AAAA,IAAA;AAGF,UAAMG,UAAS;AAAA,MACb,GAAG;AAAA,MACH,IAAIH;AAAAA,MACJ,MAAM;AAAA,QACJ,YAAY;AAAA,QACZE;AAAAA,QACA;AAAA,MAAA;AAAA,MAEF,aAAAD;AAAAA,MACA,GAAI,4BACA,EAAE,CAACG,GAAAA,mBAAmB,GAAG,0BAAA,IACzB,CAAA;AAAA,IAAC;AAGP,WAAOC,GAAAA;AAAAA,MACLF;AAAAA,MACA,MACE,2BAA2B;AAAA,QACzB,GAAG;AAAA,QACH,IAAIH;AAAAA,MAAA,CACI;AAAA,IAAA;AAAA,EAEhB;AAEA,QAAM;AAAA,IACJ;AAAA,IACA,eAAe;AAAA,IACf,GAAG;AAAA,EAAA,IACD;AACJ,QAAM,eACJ,iBAAiB,MAAM,wBAAwBxB,GAAAA,gBAAgB;AACjE,QAAM,cAAc;AAAA,IAClB,iBAAiB;AAAA,IACjB;AAAA,MACE;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IAAA;AAAA,EACF;AAEF,QAAM,UAAU,IAAI;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB,YAAY;AAAA,IAC7B,iBAAiB,MAAM;AAAA,IACvB;AAAA,EAAA;AAGF,QAAM,kBAAkB,OACtB,WACG;AACH,UAAM,sBAAsB,QAAQ,uBAAA;AACpC,UAAM,gBAAgB,iBAAiB,WACnC,MAAM,iBAAiB;AAAA,MACrB;AAAA,IAAA,IAEF;AAEJ,UAAM,QAAQ;AAAA,MACZ,OAAO,YAAY;AAAA,MACnB;AAAA,IAAA;AAGF,WAAO,iBAAiB,CAAA;AAAA,EAC1B;AAEA,QAAM,kBAAkB,OACtB,WACG;AACH,UAAM,sBAAsB,QAAQ,uBAAA;AACpC,UAAM,gBAAgB,iBAAiB,WACnC,MAAM,iBAAiB;AAAA,MACrB;AAAA,IAAA,IAEF;AAEJ,UAAM,QAAQ;AAAA,MACZ,OAAO,YAAY;AAAA,MACnB;AAAA,IAAA;AAGF,WAAO,iBAAiB,CAAA;AAAA,EAC1B;AAEA,QAAM,kBAAkB,OACtB,WACG;AACH,UAAM,sBAAsB,QAAQ,uBAAA;AACpC,UAAM,gBAAgB,iBAAiB,WACnC,MAAM,iBAAiB;AAAA,MACrB;AAAA,IAAA,IAEF;AAEJ,UAAM,QAAQ;AAAA,MACZ,OAAO,YAAY;AAAA,MACnB;AAAA,IAAA;AAGF,WAAO,iBAAiB,CAAA;AAAA,EAC1B;AAEA,QAAM,kBAAkB,OAAO,gBAEzB;AACJ,UAAM,QAAQ,2BAA2B,WAAW;AAAA,EACtD;AAEA,QAAM,iBAA2C;AAAA,IAC/C;AAAA,IACA,oBAAoB,MAAM,QAAQ,mBAAA;AAAA,IAClC,mBAAmB,CAAC,kBAClB,QAAQ,kBAAkB,aAAa;AAAA,EAAA;AAG3C,QAAM,cAAc;AAAA,IAClB,GAAI,iBAAiB,SAAU,CAAA;AAAA,IAC/B,GAAG;AAAA,EAAA;AAGL,QAAM,SAAS;AAAA,IACb,GAAG;AAAA,IACH,IAAI;AAAA,IACJ;AAAA,IACA,GAAI,4BACA,EAAE,CAAC4B,sBAAmB,GAAG,0BAAA,IACzB,CAAA;AAAA,IACJ,MAAM,yBAAyB,OAAO;AAAA,IACtC,UAAU;AAAA,IACV,UAAU;AAAA,IACV,UAAU;AAAA,IACV,OAAO;AAAA,IACP,WAAW;AAAA,IACX,QAAQ,iBAAiB,UAAU;AAAA,EAAA;AAGrC,SAAOC,GAAAA;AAAAA,IACL;AAAA,IACA,MACE,2BAA2B;AAAA,MACzB,GAAG;AAAA,MACH,IAAI;AAAA,IAAA,CACI;AAAA,EAAA;AAEhB;AAEO,SAAS,0BAA0B,KAA8B;AACtE,MAAI,OAAO,QAAQ,UAAU;AAC3B,QAAI,CAAC,OAAO,SAAS,GAAG,GAAG;AACzB,YAAM,IAAIC,OAAAA,gCAAgC,GAAG;AAAA,IAC/C;AAEA,QAAI,OAAO,GAAG,KAAK,EAAE,GAAG;AACtB,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,GAAG;AAAA,EACjB;AAEA,SAAO,KAAK,GAAG;AACjB;AAEO,SAAS,0BAA0B,SAAkC;AAC1E,MAAI,YAAY,QAAQ;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,WAAW,IAAI,GAAG;AAC5B,WAAO,OAAO,QAAQ,MAAM,CAAC,CAAC;AAAA,EAChC;AAEA,MAAI,QAAQ,WAAW,IAAI,GAAG;AAC5B,WAAO,QAAQ,MAAM,CAAC;AAAA,EACxB;AAEA,QAAM,IAAIC,OAAAA,wCAAwC,OAAO;AAC3D;AAEA,MAAM,gCAAgC;AAEtC,SAAS,iBAAiB,cAA8B;AACtD,MAAI,OAAO;AAEX,WAAS,QAAQ,GAAG,QAAQ,aAAa,QAAQ,SAAS;AACxD,YAAQ,aAAa,WAAW,KAAK;AACrC,WAAO,KAAK,KAAK,MAAM,QAAU;AAAA,EACnC;AAEA,SAAO,SAAS;AAClB;AAEA,SAAS,SAAS,OAAuB;AACvC,MAAI,UAAU,GAAG;AACf,WAAO,8BAA8B,OAAO,CAAC;AAAA,EAC/C;AAEA,MAAI,QAAQ,UAAU;AACtB,MAAI,SAAS;AAEb,SAAO,QAAQ,GAAG;AAChB,aAAS,GAAG,8BAA8B,OAAO,QAAQ,EAAE,CAAC,GAAG,MAAM;AACrE,YAAQ,KAAK,MAAM,QAAQ,EAAE;AAAA,EAC/B;AAEA,SAAO;AACT;AAEO,SAAS,yBACd,cACA,SAAoB,KACZ;AACR,MAAI,CAAC,cAAc;AACjB,UAAM,IAAIhC,OAAAA;AAAAA,MACR;AAAA,IAAA;AAAA,EAEJ;AAEA,QAAM,WAAW,SAAS,iBAAiB,YAAY,CAAC;AACxD,QAAM,aAAa,aAAa,OAAO,SAAS,EAAE;AAElD,SAAO,GAAG,MAAM,IAAI,QAAQ,IAAI,UAAU;AAC5C;;;;;;;;;"}
|